update all references to instructor module
This commit is contained in:
@@ -32,8 +32,8 @@ from courseware import courses
|
|||||||
from ccx_keys.locator import CCXLocator
|
from ccx_keys.locator import CCXLocator
|
||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
from student.tests.factories import UserFactory
|
from student.tests.factories import UserFactory
|
||||||
from instructor.access import allow_access, list_with_level
|
from lms.djangoapps.instructor.access import allow_access, list_with_level
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ from ccx_keys.locator import CCXLocator
|
|||||||
from courseware import courses
|
from courseware import courses
|
||||||
from xmodule.modulestore.django import SignalHandler
|
from xmodule.modulestore.django import SignalHandler
|
||||||
from edx_rest_framework_extensions.authentication import JwtAuthentication
|
from edx_rest_framework_extensions.authentication import JwtAuthentication
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ from courseware.testutils import FieldOverrideTestMixin
|
|||||||
from django_comment_client.utils import has_forum_access
|
from django_comment_client.utils import has_forum_access
|
||||||
from django_comment_common.models import FORUM_ROLE_ADMINISTRATOR
|
from django_comment_common.models import FORUM_ROLE_ADMINISTRATOR
|
||||||
from django_comment_common.utils import are_permissions_roles_seeded
|
from django_comment_common.utils import are_permissions_roles_seeded
|
||||||
from instructor.access import (
|
from lms.djangoapps.instructor.access import (
|
||||||
allow_access,
|
allow_access,
|
||||||
list_with_level,
|
list_with_level,
|
||||||
)
|
)
|
||||||
@@ -1159,7 +1159,7 @@ class TestCCXGrades(FieldOverrideTestMixin, SharedModuleStoreTestCase, LoginEnro
|
|||||||
)
|
)
|
||||||
|
|
||||||
@patch('ccx.views.render_to_response', intercept_renderer)
|
@patch('ccx.views.render_to_response', intercept_renderer)
|
||||||
@patch('instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 1)
|
@patch('lms.djangoapps.instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 1)
|
||||||
def test_gradebook(self):
|
def test_gradebook(self):
|
||||||
self.course.enable_ccx = True
|
self.course.enable_ccx = True
|
||||||
RequestCache.clear_request_cache()
|
RequestCache.clear_request_cache()
|
||||||
|
|||||||
@@ -16,17 +16,17 @@ from django.core.urlresolvers import reverse
|
|||||||
from smtplib import SMTPException
|
from smtplib import SMTPException
|
||||||
|
|
||||||
from courseware.courses import get_course_by_id
|
from courseware.courses import get_course_by_id
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
unenroll_email,
|
unenroll_email,
|
||||||
)
|
)
|
||||||
from instructor.access import (
|
from lms.djangoapps.instructor.access import (
|
||||||
allow_access,
|
allow_access,
|
||||||
list_with_level,
|
list_with_level,
|
||||||
revoke_access,
|
revoke_access,
|
||||||
)
|
)
|
||||||
from instructor.views.tools import get_student_from_identifier
|
from lms.djangoapps.instructor.views.tools import get_student_from_identifier
|
||||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||||
from openedx.core.djangoapps.content.course_structures.models import CourseStructure
|
from openedx.core.djangoapps.content.course_structures.models import CourseStructure
|
||||||
from student.models import CourseEnrollment, CourseEnrollmentException
|
from student.models import CourseEnrollment, CourseEnrollmentException
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ from student.roles import CourseCcxCoachRole
|
|||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
from xmodule.modulestore.django import SignalHandler
|
from xmodule.modulestore.django import SignalHandler
|
||||||
|
|
||||||
from instructor.views.api import _split_input_list
|
from lms.djangoapps.instructor.views.api import _split_input_list
|
||||||
from instructor.views.gradebook_api import get_grade_book_page
|
from lms.djangoapps.instructor.views.gradebook_api import get_grade_book_page
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ from opaque_keys import InvalidKeyError
|
|||||||
from opaque_keys.edx.keys import CourseKey, UsageKey
|
from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from instructor.views.api import require_global_staff
|
from lms.djangoapps.instructor.views.api import require_global_staff
|
||||||
|
|
||||||
import shoppingcart
|
import shoppingcart
|
||||||
import survey.utils
|
import survey.utils
|
||||||
@@ -67,7 +67,7 @@ from courseware.models import StudentModule, BaseStudentModuleHistory
|
|||||||
from courseware.url_helpers import get_redirect_url, get_redirect_url_for_global_staff
|
from courseware.url_helpers import get_redirect_url, get_redirect_url_for_global_staff
|
||||||
from courseware.user_state_client import DjangoXBlockUserStateClient
|
from courseware.user_state_client import DjangoXBlockUserStateClient
|
||||||
from edxmako.shortcuts import render_to_response, render_to_string, marketing_link
|
from edxmako.shortcuts import render_to_response, render_to_string, marketing_link
|
||||||
from instructor.enrollment import uses_shib
|
from lms.djangoapps.instructor.enrollment import uses_shib
|
||||||
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
|
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
|
||||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||||
from openedx.core.djangoapps.coursetalk.helpers import inject_coursetalk_keys_into_context
|
from openedx.core.djangoapps.coursetalk.helpers import inject_coursetalk_keys_into_context
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ from student.roles import (
|
|||||||
CourseStaffRole,
|
CourseStaffRole,
|
||||||
)
|
)
|
||||||
|
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from django.http import Http404
|
|||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from courseware.courses import get_course_by_id
|
from courseware.courses import get_course_by_id
|
||||||
from instructor.offline_gradecalc import offline_grade_calculation
|
from lms.djangoapps.instructor.offline_gradecalc import offline_grade_calculation
|
||||||
from opaque_keys import InvalidKeyError
|
from opaque_keys import InvalidKeyError
|
||||||
from opaque_keys.edx.keys import CourseKey
|
from opaque_keys.edx.keys import CourseKey
|
||||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from unittest import TestCase
|
|||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
|
||||||
from instructor.offline_gradecalc import offline_grade_calculation # pylint: disable=unused-import
|
from lms.djangoapps.instructor.offline_gradecalc import offline_grade_calculation # pylint: disable=unused-import
|
||||||
from opaque_keys.edx.keys import CourseKey
|
from opaque_keys.edx.keys import CourseKey
|
||||||
from opaque_keys.edx.locator import CourseLocator
|
from opaque_keys.edx.locator import CourseLocator
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import collections
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from courseware.courses import get_course_by_id
|
from courseware.courses import get_course_by_id
|
||||||
from instructor.enrollment_report import BaseAbstractEnrollmentReportProvider
|
from lms.djangoapps.instructor.enrollment_report import BaseAbstractEnrollmentReportProvider
|
||||||
from shoppingcart.models import RegistrationCodeRedemption, PaidCourseRegistration, CouponRedemption, OrderItem, \
|
from shoppingcart.models import RegistrationCodeRedemption, PaidCourseRegistration, CouponRedemption, OrderItem, \
|
||||||
InvoiceTransaction
|
InvoiceTransaction
|
||||||
from student.models import CourseEnrollment, ManualEnrollmentAudit
|
from student.models import CourseEnrollment, ManualEnrollmentAudit
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ from opaque_keys import InvalidKeyError
|
|||||||
from opaque_keys.edx.keys import CourseKey, UsageKey
|
from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||||
from commerce.signals import create_zendesk_ticket
|
from commerce.signals import create_zendesk_ticket
|
||||||
from courseware.models import StudentModule
|
from courseware.models import StudentModule
|
||||||
from instructor.views.tools import get_student_from_identifier
|
from lms.djangoapps.instructor.views.tools import get_student_from_identifier
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
import instructor.enrollment as enrollment
|
import lms.djangoapps.instructor.enrollment as enrollment
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ from student.roles import CourseBetaTesterRole, CourseStaffRole, CourseCcxCoachR
|
|||||||
|
|
||||||
from django_comment_common.models import (Role,
|
from django_comment_common.models import (Role,
|
||||||
FORUM_ROLE_MODERATOR)
|
FORUM_ROLE_MODERATOR)
|
||||||
from instructor.access import (allow_access,
|
from lms.djangoapps.instructor.access import (allow_access, revoke_access, list_with_level, update_forum_role)
|
||||||
revoke_access,
|
|
||||||
list_with_level,
|
|
||||||
update_forum_role)
|
|
||||||
|
|
||||||
|
|
||||||
@attr(shard=1)
|
@attr(shard=1)
|
||||||
|
|||||||
@@ -59,10 +59,10 @@ from xmodule.fields import Date
|
|||||||
from courseware.models import StudentFieldOverride
|
from courseware.models import StudentFieldOverride
|
||||||
|
|
||||||
import instructor_task.api
|
import instructor_task.api
|
||||||
import instructor.views.api
|
import lms.djangoapps.instructor.views.api
|
||||||
from instructor.views.api import require_finance_admin
|
from lms.djangoapps.instructor.views.api import require_finance_admin
|
||||||
from instructor.tests.utils import FakeContentTask, FakeEmail, FakeEmailInfo
|
from lms.djangoapps.instructor.tests.utils import FakeContentTask, FakeEmail, FakeEmailInfo
|
||||||
from instructor.views.api import _split_input_list, common_exceptions_400, generate_unique_password
|
from lms.djangoapps.instructor.views.api import _split_input_list, common_exceptions_400, generate_unique_password
|
||||||
from instructor_task.api_helper import AlreadyRunningError
|
from instructor_task.api_helper import AlreadyRunningError
|
||||||
from certificates.tests.factories import GeneratedCertificateFactory
|
from certificates.tests.factories import GeneratedCertificateFactory
|
||||||
from certificates.models import CertificateStatuses
|
from certificates.models import CertificateStatuses
|
||||||
@@ -580,7 +580,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
last_name='Student'
|
last_name='Student'
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.views.api.log.info')
|
@patch('lms.djangoapps.instructor.views.api.log.info')
|
||||||
def test_account_creation_and_enrollment_with_csv(self, info_log):
|
def test_account_creation_and_enrollment_with_csv(self, info_log):
|
||||||
"""
|
"""
|
||||||
Happy path test to create a single new user
|
Happy path test to create a single new user
|
||||||
@@ -601,7 +601,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
# test the log for email that's send to new created user.
|
# test the log for email that's send to new created user.
|
||||||
info_log.assert_called_with('email sent to new created user at %s', 'test_student@example.com')
|
info_log.assert_called_with('email sent to new created user at %s', 'test_student@example.com')
|
||||||
|
|
||||||
@patch('instructor.views.api.log.info')
|
@patch('lms.djangoapps.instructor.views.api.log.info')
|
||||||
def test_account_creation_and_enrollment_with_csv_with_blank_lines(self, info_log):
|
def test_account_creation_and_enrollment_with_csv_with_blank_lines(self, info_log):
|
||||||
"""
|
"""
|
||||||
Happy path test to create a single new user
|
Happy path test to create a single new user
|
||||||
@@ -622,7 +622,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
# test the log for email that's send to new created user.
|
# test the log for email that's send to new created user.
|
||||||
info_log.assert_called_with('email sent to new created user at %s', 'test_student@example.com')
|
info_log.assert_called_with('email sent to new created user at %s', 'test_student@example.com')
|
||||||
|
|
||||||
@patch('instructor.views.api.log.info')
|
@patch('lms.djangoapps.instructor.views.api.log.info')
|
||||||
def test_email_and_username_already_exist(self, info_log):
|
def test_email_and_username_already_exist(self, info_log):
|
||||||
"""
|
"""
|
||||||
If the email address and username already exists
|
If the email address and username already exists
|
||||||
@@ -712,7 +712,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
manual_enrollments = ManualEnrollmentAudit.objects.all()
|
manual_enrollments = ManualEnrollmentAudit.objects.all()
|
||||||
self.assertEqual(manual_enrollments.count(), 0)
|
self.assertEqual(manual_enrollments.count(), 0)
|
||||||
|
|
||||||
@patch('instructor.views.api.log.info')
|
@patch('lms.djangoapps.instructor.views.api.log.info')
|
||||||
def test_csv_user_exist_and_not_enrolled(self, info_log):
|
def test_csv_user_exist_and_not_enrolled(self, info_log):
|
||||||
"""
|
"""
|
||||||
If the email address and username already exists
|
If the email address and username already exists
|
||||||
@@ -797,7 +797,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
"test_student2@example.com,test_student_1,tester2,US"
|
"test_student2@example.com,test_student_1,tester2,US"
|
||||||
|
|
||||||
uploaded_file = SimpleUploadedFile("temp.csv", csv_content)
|
uploaded_file = SimpleUploadedFile("temp.csv", csv_content)
|
||||||
with patch('instructor.views.api.create_manual_course_enrollment') as mock:
|
with patch('lms.djangoapps.instructor.views.api.create_manual_course_enrollment') as mock:
|
||||||
mock.side_effect = NonExistentCourseError()
|
mock.side_effect = NonExistentCourseError()
|
||||||
response = self.client.post(self.url, {'students_list': uploaded_file})
|
response = self.client.post(self.url, {'students_list': uploaded_file})
|
||||||
|
|
||||||
@@ -837,7 +837,7 @@ class TestInstructorAPIBulkAccountCreationAndEnrollment(SharedModuleStoreTestCas
|
|||||||
manual_enrollments = ManualEnrollmentAudit.objects.all()
|
manual_enrollments = ManualEnrollmentAudit.objects.all()
|
||||||
self.assertEqual(manual_enrollments.count(), 2)
|
self.assertEqual(manual_enrollments.count(), 2)
|
||||||
|
|
||||||
@patch.object(instructor.views.api, 'generate_random_string',
|
@patch.object(lms.djangoapps.instructor.views.api, 'generate_random_string',
|
||||||
Mock(side_effect=['first', 'first', 'second']))
|
Mock(side_effect=['first', 'first', 'second']))
|
||||||
def test_generate_unique_password_no_reuse(self):
|
def test_generate_unique_password_no_reuse(self):
|
||||||
"""
|
"""
|
||||||
@@ -1419,7 +1419,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
|
|||||||
)
|
)
|
||||||
|
|
||||||
@ddt.data('http', 'https')
|
@ddt.data('http', 'https')
|
||||||
@patch('instructor.enrollment.uses_shib')
|
@patch('lms.djangoapps.instructor.enrollment.uses_shib')
|
||||||
def test_enroll_with_email_not_registered_with_shib(self, protocol, mock_uses_shib):
|
def test_enroll_with_email_not_registered_with_shib(self, protocol, mock_uses_shib):
|
||||||
mock_uses_shib.return_value = True
|
mock_uses_shib.return_value = True
|
||||||
|
|
||||||
@@ -1446,7 +1446,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.enrollment.uses_shib')
|
@patch('lms.djangoapps.instructor.enrollment.uses_shib')
|
||||||
@patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True})
|
@patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True})
|
||||||
def test_enroll_email_not_registered_shib_mktgsite(self, mock_uses_shib):
|
def test_enroll_email_not_registered_shib_mktgsite(self, mock_uses_shib):
|
||||||
# Try with marketing site enabled and shib on
|
# Try with marketing site enabled and shib on
|
||||||
@@ -1468,7 +1468,7 @@ class TestInstructorAPIEnrollment(SharedModuleStoreTestCase, LoginEnrollmentTest
|
|||||||
)
|
)
|
||||||
|
|
||||||
@ddt.data('http', 'https')
|
@ddt.data('http', 'https')
|
||||||
@patch('instructor.enrollment.uses_shib')
|
@patch('lms.djangoapps.instructor.enrollment.uses_shib')
|
||||||
def test_enroll_with_email_not_registered_with_shib_autoenroll(self, protocol, mock_uses_shib):
|
def test_enroll_with_email_not_registered_with_shib_autoenroll(self, protocol, mock_uses_shib):
|
||||||
mock_uses_shib.return_value = True
|
mock_uses_shib.return_value = True
|
||||||
|
|
||||||
@@ -2954,8 +2954,8 @@ class TestInstructorAPILevelsDataDump(SharedModuleStoreTestCase, LoginEnrollment
|
|||||||
response = self.client.post(url, {})
|
response = self.client.post(url, {})
|
||||||
self.assertIn('The detailed enrollment report is being created.', response.content)
|
self.assertIn('The detailed enrollment report is being created.', response.content)
|
||||||
|
|
||||||
@patch.object(instructor.views.api, 'anonymous_id_for_user', Mock(return_value='42'))
|
@patch.object(lms.djangoapps.instructor.views.api, 'anonymous_id_for_user', Mock(return_value='42'))
|
||||||
@patch.object(instructor.views.api, 'unique_id_for_user', Mock(return_value='41'))
|
@patch.object(lms.djangoapps.instructor.views.api, 'unique_id_for_user', Mock(return_value='41'))
|
||||||
def test_get_anon_ids(self):
|
def test_get_anon_ids(self):
|
||||||
"""
|
"""
|
||||||
Test the CSV output for the anonymized user ids.
|
Test the CSV output for the anonymized user ids.
|
||||||
@@ -3734,7 +3734,9 @@ class TestInstructorAPITaskLists(SharedModuleStoreTestCase, LoginEnrollmentTestC
|
|||||||
act.return_value = self.tasks
|
act.return_value = self.tasks
|
||||||
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
mock_factory = MockCompletionInfo()
|
mock_factory = MockCompletionInfo()
|
||||||
with patch('instructor.views.instructor_task_helpers.get_task_completion_info') as mock_completion_info:
|
with patch(
|
||||||
|
'lms.djangoapps.instructor.views.instructor_task_helpers.get_task_completion_info'
|
||||||
|
) as mock_completion_info:
|
||||||
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
||||||
response = self.client.post(url, {})
|
response = self.client.post(url, {})
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -3753,7 +3755,9 @@ class TestInstructorAPITaskLists(SharedModuleStoreTestCase, LoginEnrollmentTestC
|
|||||||
act.return_value = self.tasks
|
act.return_value = self.tasks
|
||||||
url = reverse('list_background_email_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_background_email_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
mock_factory = MockCompletionInfo()
|
mock_factory = MockCompletionInfo()
|
||||||
with patch('instructor.views.instructor_task_helpers.get_task_completion_info') as mock_completion_info:
|
with patch(
|
||||||
|
'lms.djangoapps.instructor.views.instructor_task_helpers.get_task_completion_info'
|
||||||
|
) as mock_completion_info:
|
||||||
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
||||||
response = self.client.post(url, {})
|
response = self.client.post(url, {})
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -3772,7 +3776,9 @@ class TestInstructorAPITaskLists(SharedModuleStoreTestCase, LoginEnrollmentTestC
|
|||||||
act.return_value = self.tasks
|
act.return_value = self.tasks
|
||||||
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
mock_factory = MockCompletionInfo()
|
mock_factory = MockCompletionInfo()
|
||||||
with patch('instructor.views.instructor_task_helpers.get_task_completion_info') as mock_completion_info:
|
with patch(
|
||||||
|
'lms.djangoapps.instructor.views.instructor_task_helpers.get_task_completion_info'
|
||||||
|
) as mock_completion_info:
|
||||||
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
||||||
response = self.client.post(url, {
|
response = self.client.post(url, {
|
||||||
'problem_location_str': self.problem_urlname,
|
'problem_location_str': self.problem_urlname,
|
||||||
@@ -3793,7 +3799,9 @@ class TestInstructorAPITaskLists(SharedModuleStoreTestCase, LoginEnrollmentTestC
|
|||||||
act.return_value = self.tasks
|
act.return_value = self.tasks
|
||||||
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_instructor_tasks', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
mock_factory = MockCompletionInfo()
|
mock_factory = MockCompletionInfo()
|
||||||
with patch('instructor.views.instructor_task_helpers.get_task_completion_info') as mock_completion_info:
|
with patch(
|
||||||
|
'lms.djangoapps.instructor.views.instructor_task_helpers.get_task_completion_info'
|
||||||
|
) as mock_completion_info:
|
||||||
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
mock_completion_info.side_effect = mock_factory.mock_get_task_completion_info
|
||||||
response = self.client.post(url, {
|
response = self.client.post(url, {
|
||||||
'problem_location_str': self.problem_urlname,
|
'problem_location_str': self.problem_urlname,
|
||||||
@@ -3854,7 +3862,7 @@ class TestInstructorEmailContentList(SharedModuleStoreTestCase, LoginEnrollmentT
|
|||||||
self.setup_fake_email_info(num_emails, with_failures)
|
self.setup_fake_email_info(num_emails, with_failures)
|
||||||
task_history_request.return_value = self.tasks.values()
|
task_history_request.return_value = self.tasks.values()
|
||||||
url = reverse('list_email_content', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_email_content', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
with patch('instructor.views.api.CourseEmail.objects.get') as mock_email_info:
|
with patch('lms.djangoapps.instructor.views.api.CourseEmail.objects.get') as mock_email_info:
|
||||||
mock_email_info.side_effect = self.get_matching_mock_email
|
mock_email_info.side_effect = self.get_matching_mock_email
|
||||||
response = self.client.post(url, {})
|
response = self.client.post(url, {})
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -3931,7 +3939,7 @@ class TestInstructorEmailContentList(SharedModuleStoreTestCase, LoginEnrollmentT
|
|||||||
email_info = FakeEmailInfo(email, 0, 10)
|
email_info = FakeEmailInfo(email, 0, 10)
|
||||||
task_history_request.return_value = [task_info]
|
task_history_request.return_value = [task_info]
|
||||||
url = reverse('list_email_content', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
url = reverse('list_email_content', kwargs={'course_id': self.course.id.to_deprecated_string()})
|
||||||
with patch('instructor.views.api.CourseEmail.objects.get') as mock_email_info:
|
with patch('lms.djangoapps.instructor.views.api.CourseEmail.objects.get') as mock_email_info:
|
||||||
mock_email_info.return_value = email
|
mock_email_info.return_value = email
|
||||||
response = self.client.post(url, {})
|
response = self.client.post(url, {})
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -4556,7 +4564,7 @@ class TestCourseRegistrationCodes(SharedModuleStoreTestCase):
|
|||||||
and row_data[1].endswith('/shoppingcart/register/redeem/{0}/"'.format(code)))
|
and row_data[1].endswith('/shoppingcart/register/redeem/{0}/"'.format(code)))
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
@patch.object(instructor.views.api, 'random_code_generator',
|
@patch.object(lms.djangoapps.instructor.views.api, 'random_code_generator',
|
||||||
Mock(side_effect=['first', 'second', 'third', 'fourth']))
|
Mock(side_effect=['first', 'second', 'third', 'fourth']))
|
||||||
def test_generate_course_registration_codes_matching_existing_coupon_code(self):
|
def test_generate_course_registration_codes_matching_existing_coupon_code(self):
|
||||||
"""
|
"""
|
||||||
@@ -4582,7 +4590,7 @@ class TestCourseRegistrationCodes(SharedModuleStoreTestCase):
|
|||||||
self.assertTrue(body.startswith(EXPECTED_CSV_HEADER))
|
self.assertTrue(body.startswith(EXPECTED_CSV_HEADER))
|
||||||
self.assertEqual(len(body.split('\n')), 5) # 1 for headers, 1 for new line at the end and 3 for the actual data
|
self.assertEqual(len(body.split('\n')), 5) # 1 for headers, 1 for new line at the end and 3 for the actual data
|
||||||
|
|
||||||
@patch.object(instructor.views.api, 'random_code_generator',
|
@patch.object(lms.djangoapps.instructor.views.api, 'random_code_generator',
|
||||||
Mock(side_effect=['first', 'first', 'second', 'third']))
|
Mock(side_effect=['first', 'first', 'second', 'third']))
|
||||||
def test_generate_course_registration_codes_integrity_error(self):
|
def test_generate_course_registration_codes_integrity_error(self):
|
||||||
"""
|
"""
|
||||||
@@ -4946,8 +4954,8 @@ class TestBulkCohorting(SharedModuleStoreTestCase):
|
|||||||
response = self.call_add_users_to_cohorts('')
|
response = self.call_add_users_to_cohorts('')
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
@patch('instructor.views.api.instructor_task.api.submit_cohort_students')
|
@patch('lms.djangoapps.instructor.views.api.instructor_task.api.submit_cohort_students')
|
||||||
@patch('instructor.views.api.store_uploaded_file')
|
@patch('lms.djangoapps.instructor.views.api.store_uploaded_file')
|
||||||
def test_success_username(self, mock_store_upload, mock_cohort_task):
|
def test_success_username(self, mock_store_upload, mock_cohort_task):
|
||||||
"""
|
"""
|
||||||
Verify that we store the input CSV and call a background task when
|
Verify that we store the input CSV and call a background task when
|
||||||
@@ -4957,8 +4965,8 @@ class TestBulkCohorting(SharedModuleStoreTestCase):
|
|||||||
'username,cohort\nfoo_username,bar_cohort', mock_store_upload, mock_cohort_task
|
'username,cohort\nfoo_username,bar_cohort', mock_store_upload, mock_cohort_task
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.views.api.instructor_task.api.submit_cohort_students')
|
@patch('lms.djangoapps.instructor.views.api.instructor_task.api.submit_cohort_students')
|
||||||
@patch('instructor.views.api.store_uploaded_file')
|
@patch('lms.djangoapps.instructor.views.api.store_uploaded_file')
|
||||||
def test_success_email(self, mock_store_upload, mock_cohort_task):
|
def test_success_email(self, mock_store_upload, mock_cohort_task):
|
||||||
"""
|
"""
|
||||||
Verify that we store the input CSV and call the cohorting background
|
Verify that we store the input CSV and call the cohorting background
|
||||||
@@ -4968,8 +4976,8 @@ class TestBulkCohorting(SharedModuleStoreTestCase):
|
|||||||
'email,cohort\nfoo_email,bar_cohort', mock_store_upload, mock_cohort_task
|
'email,cohort\nfoo_email,bar_cohort', mock_store_upload, mock_cohort_task
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.views.api.instructor_task.api.submit_cohort_students')
|
@patch('lms.djangoapps.instructor.views.api.instructor_task.api.submit_cohort_students')
|
||||||
@patch('instructor.views.api.store_uploaded_file')
|
@patch('lms.djangoapps.instructor.views.api.store_uploaded_file')
|
||||||
def test_success_username_and_email(self, mock_store_upload, mock_cohort_task):
|
def test_success_username_and_email(self, mock_store_upload, mock_cohort_task):
|
||||||
"""
|
"""
|
||||||
Verify that we store the input CSV and call the cohorting background
|
Verify that we store the input CSV and call the cohorting background
|
||||||
@@ -4979,8 +4987,8 @@ class TestBulkCohorting(SharedModuleStoreTestCase):
|
|||||||
'username,email,cohort\nfoo_username,bar_email,baz_cohort', mock_store_upload, mock_cohort_task
|
'username,email,cohort\nfoo_username,bar_email,baz_cohort', mock_store_upload, mock_cohort_task
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.views.api.instructor_task.api.submit_cohort_students')
|
@patch('lms.djangoapps.instructor.views.api.instructor_task.api.submit_cohort_students')
|
||||||
@patch('instructor.views.api.store_uploaded_file')
|
@patch('lms.djangoapps.instructor.views.api.store_uploaded_file')
|
||||||
def test_success_carriage_return(self, mock_store_upload, mock_cohort_task):
|
def test_success_carriage_return(self, mock_store_upload, mock_cohort_task):
|
||||||
"""
|
"""
|
||||||
Verify that we store the input CSV and call the cohorting background
|
Verify that we store the input CSV and call the cohorting background
|
||||||
@@ -4990,8 +4998,8 @@ class TestBulkCohorting(SharedModuleStoreTestCase):
|
|||||||
'username,email,cohort\rfoo_username,bar_email,baz_cohort', mock_store_upload, mock_cohort_task
|
'username,email,cohort\rfoo_username,bar_email,baz_cohort', mock_store_upload, mock_cohort_task
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('instructor.views.api.instructor_task.api.submit_cohort_students')
|
@patch('lms.djangoapps.instructor.views.api.instructor_task.api.submit_cohort_students')
|
||||||
@patch('instructor.views.api.store_uploaded_file')
|
@patch('lms.djangoapps.instructor.views.api.store_uploaded_file')
|
||||||
def test_success_carriage_return_line_feed(self, mock_store_upload, mock_cohort_task):
|
def test_success_carriage_return_line_feed(self, mock_store_upload, mock_cohort_task):
|
||||||
"""
|
"""
|
||||||
Verify that we store the input CSV and call the cohorting background
|
Verify that we store the input CSV and call the cohorting background
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ class CertificatesInstructorDashTest(SharedModuleStoreTestCase):
|
|||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def _certificate_status(self, description, status):
|
def _certificate_status(self, description, status):
|
||||||
"""Configure the certificate status by mocking the certificates API. """
|
"""Configure the certificate status by mocking the certificates API. """
|
||||||
patched = 'instructor.views.instructor_dashboard.certs_api.example_certificates_status'
|
patched = 'lms.djangoapps.instructor.views.instructor_dashboard.certs_api.example_certificates_status'
|
||||||
with mock.patch(patched) as certs_api_status:
|
with mock.patch(patched) as certs_api_status:
|
||||||
cert_status = [{
|
cert_status = [{
|
||||||
'description': description,
|
'description': description,
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from student.roles import CourseCcxCoachRole
|
|||||||
from student.tests.factories import (
|
from student.tests.factories import (
|
||||||
AdminFactory
|
AdminFactory
|
||||||
)
|
)
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
EmailEnrollmentState,
|
EmailEnrollmentState,
|
||||||
enroll_email,
|
enroll_email,
|
||||||
get_email_params,
|
get_email_params,
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ Exercises tests on the base_store_provider file
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from instructor.enrollment_report import AbstractEnrollmentReportProvider
|
from lms.djangoapps.instructor.enrollment_report import AbstractEnrollmentReportProvider
|
||||||
from instructor.paidcourse_enrollment_report import PaidCourseEnrollmentReportProvider
|
from lms.djangoapps.instructor.paidcourse_enrollment_report import PaidCourseEnrollmentReportProvider
|
||||||
|
|
||||||
|
|
||||||
class BadImplementationAbstractEnrollmentReportProvider(AbstractEnrollmentReportProvider):
|
class BadImplementationAbstractEnrollmentReportProvider(AbstractEnrollmentReportProvider):
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import json
|
|||||||
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||||
from xmodule.modulestore.tests.factories import CourseFactory
|
from xmodule.modulestore.tests.factories import CourseFactory
|
||||||
from courseware.models import StudentModule
|
from courseware.models import StudentModule
|
||||||
from instructor.access import allow_access
|
from lms.djangoapps.instructor.access import allow_access
|
||||||
from instructor.services import InstructorService
|
from lms.djangoapps.instructor.services import InstructorService
|
||||||
from instructor.tests.test_tools import msk_from_problem_urlname
|
from lms.djangoapps.instructor.tests.test_tools import msk_from_problem_urlname
|
||||||
from nose.plugins.attrib import attr
|
from nose.plugins.attrib import attr
|
||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
from student.tests.factories import UserFactory
|
from student.tests.factories import UserFactory
|
||||||
@@ -154,7 +154,7 @@ class InstructorServiceTests(SharedModuleStoreTestCase):
|
|||||||
)
|
)
|
||||||
tags = ["proctoring"]
|
tags = ["proctoring"]
|
||||||
|
|
||||||
with mock.patch("instructor.services.create_zendesk_ticket") as mock_create_zendesk_ticket:
|
with mock.patch("lms.djangoapps.instructor.services.create_zendesk_ticket") as mock_create_zendesk_ticket:
|
||||||
self.service.send_support_notification(
|
self.service.send_support_notification(
|
||||||
course_id=unicode(self.course.id),
|
course_id=unicode(self.course.id),
|
||||||
exam_name="test_exam",
|
exam_name="test_exam",
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from edxmako.shortcuts import render_to_response
|
|||||||
from courseware.tabs import get_course_tab_list
|
from courseware.tabs import get_course_tab_list
|
||||||
from courseware.tests.factories import UserFactory, StudentModuleFactory
|
from courseware.tests.factories import UserFactory, StudentModuleFactory
|
||||||
from courseware.tests.helpers import LoginEnrollmentTestCase
|
from courseware.tests.helpers import LoginEnrollmentTestCase
|
||||||
from instructor.views.gradebook_api import calculate_page_info
|
from lms.djangoapps.instructor.views.gradebook_api import calculate_page_info
|
||||||
|
|
||||||
from common.test.utils import XssTestMixin
|
from common.test.utils import XssTestMixin
|
||||||
from student.tests.factories import AdminFactory, CourseEnrollmentFactory
|
from student.tests.factories import AdminFactory, CourseEnrollmentFactory
|
||||||
@@ -275,7 +275,7 @@ class TestInstructorDashboard(ModuleStoreTestCase, LoginEnrollmentTestCase, XssT
|
|||||||
response = self.client.get(self.url)
|
response = self.client.get(self.url)
|
||||||
self.assertIn('D: 0.5, C: 0.57, B: 0.63, A: 0.75', response.content)
|
self.assertIn('D: 0.5, C: 0.57, B: 0.63, A: 0.75', response.content)
|
||||||
|
|
||||||
@patch('instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 2)
|
@patch('lms.djangoapps.instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 2)
|
||||||
def test_calculate_page_info(self):
|
def test_calculate_page_info(self):
|
||||||
page = calculate_page_info(offset=0, total_students=2)
|
page = calculate_page_info(offset=0, total_students=2)
|
||||||
self.assertEqual(page["offset"], 0)
|
self.assertEqual(page["offset"], 0)
|
||||||
@@ -284,8 +284,8 @@ class TestInstructorDashboard(ModuleStoreTestCase, LoginEnrollmentTestCase, XssT
|
|||||||
self.assertEqual(page["previous_offset"], None)
|
self.assertEqual(page["previous_offset"], None)
|
||||||
self.assertEqual(page["total_pages"], 1)
|
self.assertEqual(page["total_pages"], 1)
|
||||||
|
|
||||||
@patch('instructor.views.gradebook_api.render_to_response', intercept_renderer)
|
@patch('lms.djangoapps.instructor.views.gradebook_api.render_to_response', intercept_renderer)
|
||||||
@patch('instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 1)
|
@patch('lms.djangoapps.instructor.views.gradebook_api.MAX_STUDENTS_PER_PAGE_GRADE_BOOK', 1)
|
||||||
def test_spoc_gradebook_pages(self):
|
def test_spoc_gradebook_pages(self):
|
||||||
for i in xrange(2):
|
for i in xrange(2):
|
||||||
username = "user_%d" % i
|
username = "user_%d" % i
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ from util.file import (
|
|||||||
)
|
)
|
||||||
from util.json_request import JsonResponse, JsonResponseBadRequest
|
from util.json_request import JsonResponse, JsonResponseBadRequest
|
||||||
from util.views import require_global_staff
|
from util.views import require_global_staff
|
||||||
from instructor.views.instructor_task_helpers import extract_email_features, extract_task_features
|
from lms.djangoapps.instructor.views.instructor_task_helpers import extract_email_features, extract_task_features
|
||||||
|
|
||||||
from courseware.access import has_access
|
from courseware.access import has_access
|
||||||
from courseware.courses import get_course_with_access, get_course_by_id
|
from courseware.courses import get_course_with_access, get_course_by_id
|
||||||
@@ -68,8 +68,8 @@ from student.models import (
|
|||||||
import instructor_task.api
|
import instructor_task.api
|
||||||
from instructor_task.api_helper import AlreadyRunningError
|
from instructor_task.api_helper import AlreadyRunningError
|
||||||
from instructor_task.models import ReportStore
|
from instructor_task.models import ReportStore
|
||||||
import instructor.enrollment as enrollment
|
import lms.djangoapps.instructor.enrollment as enrollment
|
||||||
from instructor.enrollment import (
|
from lms.djangoapps.instructor.enrollment import (
|
||||||
get_user_email_language,
|
get_user_email_language,
|
||||||
enroll_email,
|
enroll_email,
|
||||||
send_mail_to_student,
|
send_mail_to_student,
|
||||||
@@ -77,14 +77,14 @@ from instructor.enrollment import (
|
|||||||
send_beta_role_email,
|
send_beta_role_email,
|
||||||
unenroll_email,
|
unenroll_email,
|
||||||
)
|
)
|
||||||
from instructor.access import list_with_level, allow_access, revoke_access, ROLES, update_forum_role
|
from lms.djangoapps.instructor.access import list_with_level, allow_access, revoke_access, ROLES, update_forum_role
|
||||||
import instructor_analytics.basic
|
import instructor_analytics.basic
|
||||||
import instructor_analytics.distributions
|
import instructor_analytics.distributions
|
||||||
import instructor_analytics.csvs
|
import instructor_analytics.csvs
|
||||||
import csv
|
import csv
|
||||||
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, set_user_preference
|
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, set_user_preference
|
||||||
from openedx.core.djangolib.markup import HTML, Text
|
from openedx.core.djangolib.markup import HTML, Text
|
||||||
from instructor.views import INVOICE_KEY
|
from lms.djangoapps.instructor.views import INVOICE_KEY
|
||||||
|
|
||||||
from submissions import api as sub_api # installed from the edx-submissions repository
|
from submissions import api as sub_api # installed from the edx-submissions repository
|
||||||
|
|
||||||
|
|||||||
@@ -8,163 +8,163 @@ urlpatterns = patterns(
|
|||||||
'',
|
'',
|
||||||
|
|
||||||
url(r'^students_update_enrollment$',
|
url(r'^students_update_enrollment$',
|
||||||
'instructor.views.api.students_update_enrollment', name="students_update_enrollment"),
|
'lms.djangoapps.instructor.views.api.students_update_enrollment', name="students_update_enrollment"),
|
||||||
url(r'^register_and_enroll_students$',
|
url(r'^register_and_enroll_students$',
|
||||||
'instructor.views.api.register_and_enroll_students', name="register_and_enroll_students"),
|
'lms.djangoapps.instructor.views.api.register_and_enroll_students', name="register_and_enroll_students"),
|
||||||
url(r'^list_course_role_members$',
|
url(r'^list_course_role_members$',
|
||||||
'instructor.views.api.list_course_role_members', name="list_course_role_members"),
|
'lms.djangoapps.instructor.views.api.list_course_role_members', name="list_course_role_members"),
|
||||||
url(r'^modify_access$',
|
url(r'^modify_access$',
|
||||||
'instructor.views.api.modify_access', name="modify_access"),
|
'lms.djangoapps.instructor.views.api.modify_access', name="modify_access"),
|
||||||
url(r'^bulk_beta_modify_access$',
|
url(r'^bulk_beta_modify_access$',
|
||||||
'instructor.views.api.bulk_beta_modify_access', name="bulk_beta_modify_access"),
|
'lms.djangoapps.instructor.views.api.bulk_beta_modify_access', name="bulk_beta_modify_access"),
|
||||||
url(r'^get_problem_responses$',
|
url(r'^get_problem_responses$',
|
||||||
'instructor.views.api.get_problem_responses', name="get_problem_responses"),
|
'lms.djangoapps.instructor.views.api.get_problem_responses', name="get_problem_responses"),
|
||||||
url(r'^get_grading_config$',
|
url(r'^get_grading_config$',
|
||||||
'instructor.views.api.get_grading_config', name="get_grading_config"),
|
'lms.djangoapps.instructor.views.api.get_grading_config', name="get_grading_config"),
|
||||||
url(r'^get_students_features(?P<csv>/csv)?$',
|
url(r'^get_students_features(?P<csv>/csv)?$',
|
||||||
'instructor.views.api.get_students_features', name="get_students_features"),
|
'lms.djangoapps.instructor.views.api.get_students_features', name="get_students_features"),
|
||||||
url(r'^get_issued_certificates/$',
|
url(r'^get_issued_certificates/$',
|
||||||
'instructor.views.api.get_issued_certificates', name="get_issued_certificates"),
|
'lms.djangoapps.instructor.views.api.get_issued_certificates', name="get_issued_certificates"),
|
||||||
url(r'^get_students_who_may_enroll$',
|
url(r'^get_students_who_may_enroll$',
|
||||||
'instructor.views.api.get_students_who_may_enroll', name="get_students_who_may_enroll"),
|
'lms.djangoapps.instructor.views.api.get_students_who_may_enroll', name="get_students_who_may_enroll"),
|
||||||
url(r'^get_user_invoice_preference$',
|
url(r'^get_user_invoice_preference$',
|
||||||
'instructor.views.api.get_user_invoice_preference', name="get_user_invoice_preference"),
|
'lms.djangoapps.instructor.views.api.get_user_invoice_preference', name="get_user_invoice_preference"),
|
||||||
url(r'^get_sale_records(?P<csv>/csv)?$',
|
url(r'^get_sale_records(?P<csv>/csv)?$',
|
||||||
'instructor.views.api.get_sale_records', name="get_sale_records"),
|
'lms.djangoapps.instructor.views.api.get_sale_records', name="get_sale_records"),
|
||||||
url(r'^get_sale_order_records$',
|
url(r'^get_sale_order_records$',
|
||||||
'instructor.views.api.get_sale_order_records', name="get_sale_order_records"),
|
'lms.djangoapps.instructor.views.api.get_sale_order_records', name="get_sale_order_records"),
|
||||||
url(r'^sale_validation_url$',
|
url(r'^sale_validation_url$',
|
||||||
'instructor.views.api.sale_validation', name="sale_validation"),
|
'lms.djangoapps.instructor.views.api.sale_validation', name="sale_validation"),
|
||||||
url(r'^get_anon_ids$',
|
url(r'^get_anon_ids$',
|
||||||
'instructor.views.api.get_anon_ids', name="get_anon_ids"),
|
'lms.djangoapps.instructor.views.api.get_anon_ids', name="get_anon_ids"),
|
||||||
url(r'^get_student_progress_url$',
|
url(r'^get_student_progress_url$',
|
||||||
'instructor.views.api.get_student_progress_url', name="get_student_progress_url"),
|
'lms.djangoapps.instructor.views.api.get_student_progress_url', name="get_student_progress_url"),
|
||||||
url(r'^reset_student_attempts$',
|
url(r'^reset_student_attempts$',
|
||||||
'instructor.views.api.reset_student_attempts', name="reset_student_attempts"),
|
'lms.djangoapps.instructor.views.api.reset_student_attempts', name="reset_student_attempts"),
|
||||||
url(
|
url(
|
||||||
r'^rescore_problem$',
|
r'^rescore_problem$',
|
||||||
'instructor.views.api.rescore_problem',
|
'lms.djangoapps.instructor.views.api.rescore_problem',
|
||||||
name="rescore_problem"
|
name="rescore_problem"
|
||||||
), url(
|
), url(
|
||||||
r'^reset_student_attempts_for_entrance_exam$',
|
r'^reset_student_attempts_for_entrance_exam$',
|
||||||
'instructor.views.api.reset_student_attempts_for_entrance_exam',
|
'lms.djangoapps.instructor.views.api.reset_student_attempts_for_entrance_exam',
|
||||||
name="reset_student_attempts_for_entrance_exam"
|
name="reset_student_attempts_for_entrance_exam"
|
||||||
), url(
|
), url(
|
||||||
r'^rescore_entrance_exam$',
|
r'^rescore_entrance_exam$',
|
||||||
'instructor.views.api.rescore_entrance_exam',
|
'lms.djangoapps.instructor.views.api.rescore_entrance_exam',
|
||||||
name="rescore_entrance_exam"
|
name="rescore_entrance_exam"
|
||||||
), url(
|
), url(
|
||||||
r'^list_entrance_exam_instructor_tasks',
|
r'^list_entrance_exam_instructor_tasks',
|
||||||
'instructor.views.api.list_entrance_exam_instructor_tasks',
|
'lms.djangoapps.instructor.views.api.list_entrance_exam_instructor_tasks',
|
||||||
name="list_entrance_exam_instructor_tasks"
|
name="list_entrance_exam_instructor_tasks"
|
||||||
), url(
|
), url(
|
||||||
r'^mark_student_can_skip_entrance_exam',
|
r'^mark_student_can_skip_entrance_exam',
|
||||||
'instructor.views.api.mark_student_can_skip_entrance_exam',
|
'lms.djangoapps.instructor.views.api.mark_student_can_skip_entrance_exam',
|
||||||
name="mark_student_can_skip_entrance_exam"
|
name="mark_student_can_skip_entrance_exam"
|
||||||
),
|
),
|
||||||
|
|
||||||
url(r'^list_instructor_tasks$',
|
url(r'^list_instructor_tasks$',
|
||||||
'instructor.views.api.list_instructor_tasks', name="list_instructor_tasks"),
|
'lms.djangoapps.instructor.views.api.list_instructor_tasks', name="list_instructor_tasks"),
|
||||||
url(r'^list_background_email_tasks$',
|
url(r'^list_background_email_tasks$',
|
||||||
'instructor.views.api.list_background_email_tasks', name="list_background_email_tasks"),
|
'lms.djangoapps.instructor.views.api.list_background_email_tasks', name="list_background_email_tasks"),
|
||||||
url(r'^list_email_content$',
|
url(r'^list_email_content$',
|
||||||
'instructor.views.api.list_email_content', name="list_email_content"),
|
'lms.djangoapps.instructor.views.api.list_email_content', name="list_email_content"),
|
||||||
url(r'^list_forum_members$',
|
url(r'^list_forum_members$',
|
||||||
'instructor.views.api.list_forum_members', name="list_forum_members"),
|
'lms.djangoapps.instructor.views.api.list_forum_members', name="list_forum_members"),
|
||||||
url(r'^update_forum_role_membership$',
|
url(r'^update_forum_role_membership$',
|
||||||
'instructor.views.api.update_forum_role_membership', name="update_forum_role_membership"),
|
'lms.djangoapps.instructor.views.api.update_forum_role_membership', name="update_forum_role_membership"),
|
||||||
url(r'^send_email$',
|
url(r'^send_email$',
|
||||||
'instructor.views.api.send_email', name="send_email"),
|
'lms.djangoapps.instructor.views.api.send_email', name="send_email"),
|
||||||
url(r'^change_due_date$', 'instructor.views.api.change_due_date',
|
url(r'^change_due_date$', 'lms.djangoapps.instructor.views.api.change_due_date',
|
||||||
name='change_due_date'),
|
name='change_due_date'),
|
||||||
url(r'^reset_due_date$', 'instructor.views.api.reset_due_date',
|
url(r'^reset_due_date$', 'lms.djangoapps.instructor.views.api.reset_due_date',
|
||||||
name='reset_due_date'),
|
name='reset_due_date'),
|
||||||
url(r'^show_unit_extensions$', 'instructor.views.api.show_unit_extensions',
|
url(r'^show_unit_extensions$', 'lms.djangoapps.instructor.views.api.show_unit_extensions',
|
||||||
name='show_unit_extensions'),
|
name='show_unit_extensions'),
|
||||||
url(r'^show_student_extensions$', 'instructor.views.api.show_student_extensions',
|
url(r'^show_student_extensions$', 'lms.djangoapps.instructor.views.api.show_student_extensions',
|
||||||
name='show_student_extensions'),
|
name='show_student_extensions'),
|
||||||
|
|
||||||
# proctored exam downloads...
|
# proctored exam downloads...
|
||||||
url(r'^get_proctored_exam_results$',
|
url(r'^get_proctored_exam_results$',
|
||||||
'instructor.views.api.get_proctored_exam_results', name="get_proctored_exam_results"),
|
'lms.djangoapps.instructor.views.api.get_proctored_exam_results', name="get_proctored_exam_results"),
|
||||||
|
|
||||||
# Grade downloads...
|
# Grade downloads...
|
||||||
url(r'^list_report_downloads$',
|
url(r'^list_report_downloads$',
|
||||||
'instructor.views.api.list_report_downloads', name="list_report_downloads"),
|
'lms.djangoapps.instructor.views.api.list_report_downloads', name="list_report_downloads"),
|
||||||
url(r'calculate_grades_csv$',
|
url(r'calculate_grades_csv$',
|
||||||
'instructor.views.api.calculate_grades_csv', name="calculate_grades_csv"),
|
'lms.djangoapps.instructor.views.api.calculate_grades_csv', name="calculate_grades_csv"),
|
||||||
url(r'problem_grade_report$',
|
url(r'problem_grade_report$',
|
||||||
'instructor.views.api.problem_grade_report', name="problem_grade_report"),
|
'lms.djangoapps.instructor.views.api.problem_grade_report', name="problem_grade_report"),
|
||||||
|
|
||||||
# Financial Report downloads..
|
# Financial Report downloads..
|
||||||
url(r'^list_financial_report_downloads$',
|
url(r'^list_financial_report_downloads$',
|
||||||
'instructor.views.api.list_financial_report_downloads', name="list_financial_report_downloads"),
|
'lms.djangoapps.instructor.views.api.list_financial_report_downloads', name="list_financial_report_downloads"),
|
||||||
|
|
||||||
# Registration Codes..
|
# Registration Codes..
|
||||||
url(r'get_registration_codes$',
|
url(r'get_registration_codes$',
|
||||||
'instructor.views.api.get_registration_codes', name="get_registration_codes"),
|
'lms.djangoapps.instructor.views.api.get_registration_codes', name="get_registration_codes"),
|
||||||
url(r'generate_registration_codes$',
|
url(r'generate_registration_codes$',
|
||||||
'instructor.views.api.generate_registration_codes', name="generate_registration_codes"),
|
'lms.djangoapps.instructor.views.api.generate_registration_codes', name="generate_registration_codes"),
|
||||||
url(r'active_registration_codes$',
|
url(r'active_registration_codes$',
|
||||||
'instructor.views.api.active_registration_codes', name="active_registration_codes"),
|
'lms.djangoapps.instructor.views.api.active_registration_codes', name="active_registration_codes"),
|
||||||
url(r'spent_registration_codes$',
|
url(r'spent_registration_codes$',
|
||||||
'instructor.views.api.spent_registration_codes', name="spent_registration_codes"),
|
'lms.djangoapps.instructor.views.api.spent_registration_codes', name="spent_registration_codes"),
|
||||||
|
|
||||||
# Reports..
|
# Reports..
|
||||||
url(r'get_enrollment_report$',
|
url(r'get_enrollment_report$',
|
||||||
'instructor.views.api.get_enrollment_report', name="get_enrollment_report"),
|
'lms.djangoapps.instructor.views.api.get_enrollment_report', name="get_enrollment_report"),
|
||||||
url(r'get_exec_summary_report$',
|
url(r'get_exec_summary_report$',
|
||||||
'instructor.views.api.get_exec_summary_report', name="get_exec_summary_report"),
|
'lms.djangoapps.instructor.views.api.get_exec_summary_report', name="get_exec_summary_report"),
|
||||||
url(r'get_course_survey_results$',
|
url(r'get_course_survey_results$',
|
||||||
'instructor.views.api.get_course_survey_results', name="get_course_survey_results"),
|
'lms.djangoapps.instructor.views.api.get_course_survey_results', name="get_course_survey_results"),
|
||||||
url(r'export_ora2_data',
|
url(r'export_ora2_data',
|
||||||
'instructor.views.api.export_ora2_data', name="export_ora2_data"),
|
'lms.djangoapps.instructor.views.api.export_ora2_data', name="export_ora2_data"),
|
||||||
|
|
||||||
# Coupon Codes..
|
# Coupon Codes..
|
||||||
url(r'get_coupon_codes',
|
url(r'get_coupon_codes',
|
||||||
'instructor.views.api.get_coupon_codes', name="get_coupon_codes"),
|
'lms.djangoapps.instructor.views.api.get_coupon_codes', name="get_coupon_codes"),
|
||||||
|
|
||||||
# spoc gradebook
|
# spoc gradebook
|
||||||
url(r'^gradebook$',
|
url(r'^gradebook$',
|
||||||
'instructor.views.gradebook_api.spoc_gradebook', name='spoc_gradebook'),
|
'lms.djangoapps.instructor.views.gradebook_api.spoc_gradebook', name='spoc_gradebook'),
|
||||||
|
|
||||||
url(r'^gradebook/(?P<offset>[0-9]+)$',
|
url(r'^gradebook/(?P<offset>[0-9]+)$',
|
||||||
'instructor.views.gradebook_api.spoc_gradebook', name='spoc_gradebook'),
|
'lms.djangoapps.instructor.views.gradebook_api.spoc_gradebook', name='spoc_gradebook'),
|
||||||
|
|
||||||
# Cohort management
|
# Cohort management
|
||||||
url(r'add_users_to_cohorts$',
|
url(r'add_users_to_cohorts$',
|
||||||
'instructor.views.api.add_users_to_cohorts', name="add_users_to_cohorts"),
|
'lms.djangoapps.instructor.views.api.add_users_to_cohorts', name="add_users_to_cohorts"),
|
||||||
|
|
||||||
# Certificates
|
# Certificates
|
||||||
url(r'^generate_example_certificates$',
|
url(r'^generate_example_certificates$',
|
||||||
'instructor.views.api.generate_example_certificates',
|
'lms.djangoapps.instructor.views.api.generate_example_certificates',
|
||||||
name='generate_example_certificates'),
|
name='generate_example_certificates'),
|
||||||
|
|
||||||
url(r'^enable_certificate_generation$',
|
url(r'^enable_certificate_generation$',
|
||||||
'instructor.views.api.enable_certificate_generation',
|
'lms.djangoapps.instructor.views.api.enable_certificate_generation',
|
||||||
name='enable_certificate_generation'),
|
name='enable_certificate_generation'),
|
||||||
|
|
||||||
url(r'^start_certificate_generation',
|
url(r'^start_certificate_generation',
|
||||||
'instructor.views.api.start_certificate_generation',
|
'lms.djangoapps.instructor.views.api.start_certificate_generation',
|
||||||
name='start_certificate_generation'),
|
name='start_certificate_generation'),
|
||||||
|
|
||||||
url(r'^start_certificate_regeneration',
|
url(r'^start_certificate_regeneration',
|
||||||
'instructor.views.api.start_certificate_regeneration',
|
'lms.djangoapps.instructor.views.api.start_certificate_regeneration',
|
||||||
name='start_certificate_regeneration'),
|
name='start_certificate_regeneration'),
|
||||||
|
|
||||||
url(r'^certificate_exception_view/$',
|
url(r'^certificate_exception_view/$',
|
||||||
'instructor.views.api.certificate_exception_view',
|
'lms.djangoapps.instructor.views.api.certificate_exception_view',
|
||||||
name='certificate_exception_view'),
|
name='certificate_exception_view'),
|
||||||
|
|
||||||
url(r'^generate_certificate_exceptions/(?P<generate_for>[^/]*)',
|
url(r'^generate_certificate_exceptions/(?P<generate_for>[^/]*)',
|
||||||
'instructor.views.api.generate_certificate_exceptions',
|
'lms.djangoapps.instructor.views.api.generate_certificate_exceptions',
|
||||||
name='generate_certificate_exceptions'),
|
name='generate_certificate_exceptions'),
|
||||||
|
|
||||||
url(r'^generate_bulk_certificate_exceptions',
|
url(r'^generate_bulk_certificate_exceptions',
|
||||||
'instructor.views.api.generate_bulk_certificate_exceptions',
|
'lms.djangoapps.instructor.views.api.generate_bulk_certificate_exceptions',
|
||||||
name='generate_bulk_certificate_exceptions'),
|
name='generate_bulk_certificate_exceptions'),
|
||||||
|
|
||||||
url(r'^certificate_invalidation_view/$',
|
url(r'^certificate_invalidation_view/$',
|
||||||
'instructor.views.api.certificate_invalidation_view',
|
'lms.djangoapps.instructor.views.api.certificate_invalidation_view',
|
||||||
name='certificate_invalidation_view'),
|
name='certificate_invalidation_view'),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from opaque_keys.edx.keys import CourseKey
|
|||||||
|
|
||||||
from edxmako.shortcuts import render_to_response
|
from edxmako.shortcuts import render_to_response
|
||||||
from courseware.courses import get_course_with_access
|
from courseware.courses import get_course_with_access
|
||||||
from instructor.views.api import require_level
|
from lms.djangoapps.instructor.views.api import require_level
|
||||||
from lms.djangoapps.grades import course_grades
|
from lms.djangoapps.grades import course_grades
|
||||||
from xmodule.modulestore.django import modulestore
|
from xmodule.modulestore.django import modulestore
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ E-commerce Tab Instructor Dashboard Query Registration Code Status.
|
|||||||
"""
|
"""
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.views.decorators.http import require_GET, require_POST
|
from django.views.decorators.http import require_GET, require_POST
|
||||||
from instructor.enrollment import get_email_params, send_mail_to_student
|
from lms.djangoapps.instructor.enrollment import get_email_params, send_mail_to_student
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from courseware.courses import get_course_by_id
|
from courseware.courses import get_course_by_id
|
||||||
from instructor.views.api import require_level
|
from lms.djangoapps.instructor.views.api import require_level
|
||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
from util.json_request import JsonResponse
|
from util.json_request import JsonResponse
|
||||||
from shoppingcart.models import CourseRegistrationCode, RegistrationCodeRedemption
|
from shoppingcart.models import CourseRegistrationCode, RegistrationCodeRedemption
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import dogstats_wrapper as dog_stats_api
|
|||||||
from pytz import UTC
|
from pytz import UTC
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from edxmako.shortcuts import render_to_string
|
from edxmako.shortcuts import render_to_string
|
||||||
from instructor.paidcourse_enrollment_report import PaidCourseEnrollmentReportProvider
|
from lms.djangoapps.instructor.paidcourse_enrollment_report import PaidCourseEnrollmentReportProvider
|
||||||
from shoppingcart.models import (
|
from shoppingcart.models import (
|
||||||
PaidCourseRegistration, CourseRegCodeItem, InvoiceTransaction,
|
PaidCourseRegistration, CourseRegCodeItem, InvoiceTransaction,
|
||||||
Invoice, CouponRedemption, RegistrationCodeRedemption, CourseRegistrationCode
|
Invoice, CouponRedemption, RegistrationCodeRedemption, CourseRegistrationCode
|
||||||
|
|||||||
@@ -1792,7 +1792,7 @@ class CourseRegCodeItem(OrderItem):
|
|||||||
# we should ultimately refactor code to have save_registration_code in this models.py
|
# we should ultimately refactor code to have save_registration_code in this models.py
|
||||||
# file, but there's also a shared dependency on a random string generator which
|
# file, but there's also a shared dependency on a random string generator which
|
||||||
# is in another PR (for another feature)
|
# is in another PR (for another feature)
|
||||||
from instructor.views.api import save_registration_code
|
from lms.djangoapps.instructor.views.api import save_registration_code
|
||||||
for i in range(total_registration_codes): # pylint: disable=unused-variable
|
for i in range(total_registration_codes): # pylint: disable=unused-variable
|
||||||
save_registration_code(self.user, self.course_id, self.mode, order=self.order)
|
save_registration_code(self.user, self.course_id, self.mode, order=self.order)
|
||||||
|
|
||||||
|
|||||||
@@ -1924,7 +1924,7 @@ INSTALLED_APPS = (
|
|||||||
'util',
|
'util',
|
||||||
'certificates',
|
'certificates',
|
||||||
'dashboard',
|
'dashboard',
|
||||||
'instructor',
|
'lms.djangoapps.instructor',
|
||||||
'instructor_task',
|
'instructor_task',
|
||||||
'openedx.core.djangoapps.course_groups',
|
'openedx.core.djangoapps.course_groups',
|
||||||
'bulk_email',
|
'bulk_email',
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ def run():
|
|||||||
# Import these here to avoid circular dependencies of the form:
|
# Import these here to avoid circular dependencies of the form:
|
||||||
# edx-platform app --> DRF --> django translation --> edx-platform app
|
# edx-platform app --> DRF --> django translation --> edx-platform app
|
||||||
from edx_proctoring.runtime import set_runtime_service
|
from edx_proctoring.runtime import set_runtime_service
|
||||||
from instructor.services import InstructorService
|
from lms.djangoapps.instructor.services import InstructorService
|
||||||
from openedx.core.djangoapps.credit.services import CreditService
|
from openedx.core.djangoapps.credit.services import CreditService
|
||||||
set_runtime_service('credit', CreditService())
|
set_runtime_service('credit', CreditService())
|
||||||
|
|
||||||
|
|||||||
18
lms/urls.py
18
lms/urls.py
@@ -230,12 +230,12 @@ COURSE_URLS = patterns(
|
|||||||
'',
|
'',
|
||||||
url(
|
url(
|
||||||
r'^look_up_registration_code$',
|
r'^look_up_registration_code$',
|
||||||
'instructor.views.registration_codes.look_up_registration_code',
|
'lms.djangoapps.instructor.views.registration_codes.look_up_registration_code',
|
||||||
name='look_up_registration_code',
|
name='look_up_registration_code',
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^registration_code_details$',
|
r'^registration_code_details$',
|
||||||
'instructor.views.registration_codes.registration_code_details',
|
'lms.djangoapps.instructor.views.registration_codes.registration_code_details',
|
||||||
name='registration_code_details',
|
name='registration_code_details',
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -485,7 +485,7 @@ urlpatterns += (
|
|||||||
r'^courses/{}/instructor$'.format(
|
r'^courses/{}/instructor$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.instructor_dashboard.instructor_dashboard_2',
|
'lms.djangoapps.instructor.views.instructor_dashboard.instructor_dashboard_2',
|
||||||
name='instructor_dashboard',
|
name='instructor_dashboard',
|
||||||
),
|
),
|
||||||
|
|
||||||
@@ -494,40 +494,40 @@ urlpatterns += (
|
|||||||
r'^courses/{}/set_course_mode_price$'.format(
|
r'^courses/{}/set_course_mode_price$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.instructor_dashboard.set_course_mode_price',
|
'lms.djangoapps.instructor.views.instructor_dashboard.set_course_mode_price',
|
||||||
name='set_course_mode_price',
|
name='set_course_mode_price',
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^courses/{}/instructor/api/'.format(
|
r'^courses/{}/instructor/api/'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
include('instructor.views.api_urls')),
|
include('lms.djangoapps.instructor.views.api_urls')),
|
||||||
url(
|
url(
|
||||||
r'^courses/{}/remove_coupon$'.format(
|
r'^courses/{}/remove_coupon$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.coupons.remove_coupon',
|
'lms.djangoapps.instructor.views.coupons.remove_coupon',
|
||||||
name='remove_coupon',
|
name='remove_coupon',
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^courses/{}/add_coupon$'.format(
|
r'^courses/{}/add_coupon$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.coupons.add_coupon',
|
'lms.djangoapps.instructor.views.coupons.add_coupon',
|
||||||
name='add_coupon',
|
name='add_coupon',
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^courses/{}/update_coupon$'.format(
|
r'^courses/{}/update_coupon$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.coupons.update_coupon',
|
'lms.djangoapps.instructor.views.coupons.update_coupon',
|
||||||
name='update_coupon',
|
name='update_coupon',
|
||||||
),
|
),
|
||||||
url(
|
url(
|
||||||
r'^courses/{}/get_coupon_info$'.format(
|
r'^courses/{}/get_coupon_info$'.format(
|
||||||
settings.COURSE_ID_PATTERN,
|
settings.COURSE_ID_PATTERN,
|
||||||
),
|
),
|
||||||
'instructor.views.coupons.get_coupon_info',
|
'lms.djangoapps.instructor.views.coupons.get_coupon_info',
|
||||||
name='get_coupon_info',
|
name='get_coupon_info',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user