added registration-codes generation functionality
rebased and resolve conficts with cdoge/registration_codes feature enhancement request: added transaction group name text field to the download buttons as an extra optional query paramerter
This commit is contained in:
committed by
Chris Dodge
parent
08ff030521
commit
4333e53997
@@ -6,6 +6,7 @@ Serve miscellaneous course and student data
|
||||
from shoppingcart.models import PaidCourseRegistration, CouponRedemption
|
||||
from django.contrib.auth.models import User
|
||||
import xmodule.graders as xmgraders
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
|
||||
|
||||
STUDENT_FEATURES = ('id', 'username', 'first_name', 'last_name', 'is_staff', 'email')
|
||||
@@ -15,6 +16,7 @@ ORDER_ITEM_FEATURES = ('list_price', 'unit_cost', 'order_id')
|
||||
ORDER_FEATURES = ('purchase_time',)
|
||||
|
||||
AVAILABLE_FEATURES = STUDENT_FEATURES + PROFILE_FEATURES
|
||||
COURSE_REGISTRATION_FEATURES = ('code', 'course_id', 'transaction_group_name', 'created_by')
|
||||
|
||||
|
||||
def purchase_transactions(course_id, features):
|
||||
@@ -98,6 +100,42 @@ def enrolled_students_features(course_id, features):
|
||||
return [extract_student(student, features) for student in students]
|
||||
|
||||
|
||||
def course_registration_features(features, registration_codes, csv_type):
|
||||
"""
|
||||
Return list of Course Registration Codes as dictionaries.
|
||||
|
||||
course_registration_features
|
||||
would return [
|
||||
{'code': 'code1', 'course_id': 'edX/Open_DemoX/edx_demo_course, ..... }
|
||||
{'code': 'code2', 'course_id': 'edX/Open_DemoX/edx_demo_course, ..... }
|
||||
]
|
||||
"""
|
||||
|
||||
def extract_course_registration(registration_code, features, csv_type):
|
||||
""" convert registration_code to dictionary
|
||||
:param registration_code:
|
||||
:param features:
|
||||
:param csv_type:
|
||||
"""
|
||||
registration_features = [x for x in COURSE_REGISTRATION_FEATURES if x in features]
|
||||
|
||||
course_registration_dict = dict((feature, getattr(registration_code, feature)) for feature in registration_features)
|
||||
course_registration_dict['redeemed_by'] = None
|
||||
|
||||
# we have to capture the redeemed_by value in the case of the downloading and spent registration
|
||||
# codes csv. In the case of active and generated registration codes the redeemed_by value will be None.
|
||||
# They have not been redeemed yet
|
||||
if csv_type is not None:
|
||||
try:
|
||||
course_registration_dict['redeemed_by'] = getattr(registration_code.registrationcoderedemption_set.get(registration_code=registration_code), 'redeemed_by')
|
||||
except ObjectDoesNotExist:
|
||||
pass
|
||||
|
||||
course_registration_dict['course_id'] = course_registration_dict['course_id'].to_deprecated_string()
|
||||
return course_registration_dict
|
||||
return [extract_course_registration(code, features, csv_type) for code in registration_codes]
|
||||
|
||||
|
||||
def dump_grading_context(course):
|
||||
"""
|
||||
Render information about course grading context
|
||||
|
||||
@@ -6,8 +6,9 @@ from django.test import TestCase
|
||||
from student.models import CourseEnrollment
|
||||
from student.tests.factories import UserFactory
|
||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||
from shoppingcart.models import CourseRegistrationCode, RegistrationCodeRedemption, Order
|
||||
|
||||
from instructor_analytics.basic import enrolled_students_features, AVAILABLE_FEATURES, STUDENT_FEATURES, PROFILE_FEATURES
|
||||
from instructor_analytics.basic import enrolled_students_features, course_registration_features, AVAILABLE_FEATURES, STUDENT_FEATURES, PROFILE_FEATURES
|
||||
|
||||
|
||||
class TestAnalyticsBasic(TestCase):
|
||||
@@ -42,3 +43,34 @@ class TestAnalyticsBasic(TestCase):
|
||||
def test_available_features(self):
|
||||
self.assertEqual(len(AVAILABLE_FEATURES), len(STUDENT_FEATURES + PROFILE_FEATURES))
|
||||
self.assertEqual(set(AVAILABLE_FEATURES), set(STUDENT_FEATURES + PROFILE_FEATURES))
|
||||
|
||||
def test_course_registration_features(self):
|
||||
query_features = ['code', 'course_id', 'transaction_group_name', 'created_by', 'redeemed_by']
|
||||
for i in range(5):
|
||||
course_code = CourseRegistrationCode(
|
||||
code="test_code{}".format(i), course_id=self.course_key.to_deprecated_string(),
|
||||
transaction_group_name='TestName', created_by=self.users[0]
|
||||
)
|
||||
course_code.save()
|
||||
|
||||
order = Order(user=self.users[0], status='purchased')
|
||||
order.save()
|
||||
|
||||
registration_code_redemption = RegistrationCodeRedemption(
|
||||
order=order, registration_code_id=1, redeemed_by=self.users[0]
|
||||
)
|
||||
registration_code_redemption.save()
|
||||
registration_codes = CourseRegistrationCode.objects.all()
|
||||
course_registration_list = course_registration_features(query_features, registration_codes, csv_type='download')
|
||||
self.assertEqual(len(course_registration_list), len(registration_codes))
|
||||
for course_registration in course_registration_list:
|
||||
self.assertEqual(set(course_registration.keys()), set(query_features))
|
||||
self.assertIn(course_registration['code'], [registration_code.code for registration_code in registration_codes])
|
||||
self.assertIn(
|
||||
course_registration['course_id'],
|
||||
[registration_code.course_id.to_deprecated_string() for registration_code in registration_codes]
|
||||
)
|
||||
self.assertIn(
|
||||
course_registration['transaction_group_name'],
|
||||
[registration_code.transaction_group_name for registration_code in registration_codes]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user