This repository has been archived by the owner on Nov 4, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 254
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into fix-same-title-to-master
- Loading branch information
Showing
11 changed files
with
248 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
ecommerce/core/management/commands/tests/test_unenroll_refunded_android_users.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
""" | ||
Tests for Django management command to un-enroll refunded android users. | ||
""" | ||
from django.core.management import call_command | ||
from mock import patch | ||
from testfixtures import LogCapture | ||
|
||
from ecommerce.tests.testcases import TestCase | ||
|
||
|
||
class TestUnenrollRefundedAndroidUsersCommand(TestCase): | ||
|
||
LOGGER_NAME = 'ecommerce.core.management.commands.unenroll_refunded_android_users' | ||
|
||
@patch('requests.get') | ||
def test_handle_pass(self, mock_response): | ||
""" Test using mock response from setup, using threshold it will clear""" | ||
|
||
mock_response.return_value.status_code = 200 | ||
|
||
with LogCapture(self.LOGGER_NAME) as log: | ||
call_command('unenroll_refunded_android_users') | ||
|
||
log.check( | ||
( | ||
self.LOGGER_NAME, | ||
'INFO', | ||
'Sending request to un-enroll refunded android users' | ||
) | ||
) | ||
|
||
@patch('requests.get') | ||
def test_handle_fail(self, mock_response): | ||
""" Test using mock response from setup, using threshold it will clear""" | ||
|
||
mock_response.return_value.status_code = 400 | ||
|
||
with LogCapture(self.LOGGER_NAME) as log: | ||
call_command('unenroll_refunded_android_users') | ||
|
||
log.check( | ||
( | ||
self.LOGGER_NAME, | ||
'INFO', | ||
'Sending request to un-enroll refunded android users' | ||
), | ||
( | ||
self.LOGGER_NAME, | ||
'ERROR', | ||
'Failed to refund android users with status code 400' | ||
) | ||
) |
27 changes: 27 additions & 0 deletions
27
ecommerce/core/management/commands/unenroll_refunded_android_users.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
""" | ||
Django management command to un-enroll refunded android users. | ||
Command is run by Jenkins job daily. | ||
""" | ||
import logging | ||
|
||
import requests | ||
from django.core.management.base import BaseCommand | ||
from rest_framework import status | ||
|
||
from ecommerce.core.models import SiteConfiguration | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class Command(BaseCommand): | ||
help = 'Management command to un-enroll refunded android users.' | ||
|
||
def handle(self, *args, **options): | ||
site = SiteConfiguration.objects.first() | ||
refund_api_url = '{}/api/iap/v1/android/refund/'.format(site.build_ecommerce_url()) | ||
logger.info("Sending request to un-enroll refunded android users") | ||
response = requests.get(refund_api_url) | ||
|
||
if response.status_code != status.HTTP_200_OK: | ||
logger.error("Failed to refund android users with status code %s", response.status_code) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# .. toggle_name: mail_mobile_team_for_change_in_course | ||
# .. toggle_type: waffle_switch | ||
# .. toggle_default: False | ||
# .. toggle_description: Alert mobile team for a change in a course having mobile seats. | ||
# .. toggle_use_cases: open_edx | ||
# .. toggle_creation_date: 2023-07-25 | ||
# .. toggle_tickets: LEARNER-9377 | ||
# .. toggle_status: supported | ||
MAIL_MOBILE_TEAM_FOR_CHANGE_IN_COURSE = 'mail_mobile_team_for_change_in_course' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import mock | ||
from testfixtures import LogCapture | ||
|
||
from ecommerce.courses.tests.factories import CourseFactory | ||
from ecommerce.extensions.api.utils import send_mail_to_mobile_team_for_change_in_course | ||
from ecommerce.extensions.iap.models import IAPProcessorConfiguration | ||
from ecommerce.tests.testcases import TestCase | ||
|
||
|
||
class UtilTests(TestCase): | ||
def setUp(self): | ||
super(UtilTests, self).setUp() | ||
self.course = CourseFactory(id='test/course/123', name='Test Course 123') | ||
seat = self.course.create_or_update_seat('verified', True, 60) | ||
second_seat = self.course.create_or_update_seat('verified', True, 70) | ||
self.mock_mobile_team_mail = '[email protected]' | ||
self.mock_email_body = { | ||
'subject': 'Course Change Alert for Test Course 123', | ||
'body': 'Course: Test Course 123, Sku: {}, Price: 70.00\n' | ||
'Course: Test Course 123, Sku: {}, Price: 60.00'.format( | ||
second_seat.stockrecords.all()[0].partner_sku, | ||
seat.stockrecords.all()[0].partner_sku | ||
) | ||
} | ||
|
||
def test_send_mail_to_mobile_team_with_no_email_specified(self): | ||
logger_name = 'ecommerce.extensions.api.utils' | ||
email_sender = 'ecommerce.extensions.communication.utils.Dispatcher.dispatch_direct_messages' | ||
msg_t = "Couldn't mail mobile team for change in {}. No email was specified for mobile team in configurations" | ||
msg = msg_t.format(self.course.name) | ||
with LogCapture(logger_name) as utils_logger,\ | ||
mock.patch(email_sender) as mock_send_email: | ||
|
||
send_mail_to_mobile_team_for_change_in_course(self.course, self.course.seat_products.all()) | ||
utils_logger.check_present( | ||
( | ||
logger_name, | ||
'INFO', | ||
msg | ||
) | ||
) | ||
assert mock_send_email.call_count == 0 | ||
|
||
def test_send_mail_to_mobile_team(self): | ||
logger_name = 'ecommerce.extensions.api.utils' | ||
email_sender = 'ecommerce.extensions.communication.utils.Dispatcher.dispatch_direct_messages' | ||
iap_configs = IAPProcessorConfiguration.get_solo() | ||
iap_configs.mobile_team_email = self.mock_mobile_team_mail | ||
iap_configs.save() | ||
with LogCapture(logger_name) as utils_logger,\ | ||
mock.patch(email_sender) as mock_send_email: | ||
|
||
send_mail_to_mobile_team_for_change_in_course(self.course, self.course.seat_products.all()) | ||
utils_logger.check_present( | ||
( | ||
logger_name, | ||
'INFO', | ||
"Sent change in {} email to mobile team.".format(self.course.name) | ||
) | ||
) | ||
assert mock_send_email.call_count == 1 | ||
mock_send_email.assert_called_with(self.mock_mobile_team_mail, self.mock_email_body) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import logging | ||
|
||
from oscar.core.loading import get_class | ||
|
||
from ecommerce.extensions.iap.models import IAPProcessorConfiguration | ||
|
||
Dispatcher = get_class('communication.utils', 'Dispatcher') | ||
logger = logging.getLogger(__name__) | ||
|
||
|
||
def send_mail_to_mobile_team_for_change_in_course(course, seats): | ||
recipient = IAPProcessorConfiguration.get_solo().mobile_team_email | ||
if not recipient: | ||
msg = "Couldn't mail mobile team for change in %s. No email was specified for mobile team in configurations" | ||
logger.info(msg, course.name) | ||
return | ||
|
||
def format_seat(seat): | ||
seat_template = "Course: {}, Sku: {}, Price: {}" | ||
stock_record = seat.stockrecords.all()[0] | ||
result = seat_template.format( | ||
course.name, | ||
stock_record.partner_sku, | ||
stock_record.price_excl_tax, | ||
) | ||
return result | ||
|
||
formatted_seats = [format_seat(seat) for seat in seats if seat.stockrecords.all()] | ||
|
||
messages = { | ||
'subject': 'Course Change Alert for {}'.format(course.name), | ||
'body': "\n".join(formatted_seats) | ||
} | ||
|
||
Dispatcher().dispatch_direct_messages(recipient, messages) | ||
logger.info("Sent change in %s email to mobile team.", course.name) |
18 changes: 18 additions & 0 deletions
18
ecommerce/extensions/iap/migrations/0006_iapprocessorconfiguration_mobile_team_email.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Generated by Django 3.2.19 on 2023-08-02 08:00 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('iap', '0005_paymentprocessorresponseextension_meta_data'), | ||
] | ||
|
||
operations = [ | ||
migrations.AddField( | ||
model_name='iapprocessorconfiguration', | ||
name='mobile_team_email', | ||
field=models.EmailField(default='', max_length=254, verbose_name='mobile team email'), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters