from student.models import CourseEnrollment from course_modes.models import ( get_cosmetic_verified_display_price ) from courseware.date_summary import ( verified_upgrade_deadline_link, verified_upgrade_link_is_valid ) def check_and_get_upgrade_link_and_date(user, enrollment=None, course=None): """ For an authenticated user, return a link to allow them to upgrade in the specified course. """ if enrollment is None and course is None: raise ValueError("Must specify either an enrollment or a course") if enrollment: if course is None: course = enrollment.course elif enrollment.course_id != course.id: raise ValueError("{} refers to a different course than {} which was supplied".format( enrollment, course )) if enrollment.user_id != user.id: raise ValueError("{} refers to a different user than {} which was supplied".format( enrollment, user )) if enrollment is None: enrollment = CourseEnrollment.get_enrollment(user, course.id) if user.is_authenticated() and verified_upgrade_link_is_valid(enrollment): return ( verified_upgrade_deadline_link(user, course), enrollment.upgrade_deadline ) return (None, None) def get_experiment_user_metadata_context(course, user): """ Return a context dictionary with the keys used by the user_metadata.html. """ enrollment_mode = None enrollment_time = None enrollment = None try: enrollment = CourseEnrollment.objects.select_related( 'course' ).get(user_id=user.id, course_id=course.id) if enrollment.is_active: enrollment_mode = enrollment.mode enrollment_time = enrollment.created except CourseEnrollment.DoesNotExist: pass # Not enrolled, used the default None values upgrade_link, upgrade_date = check_and_get_upgrade_link_and_date(user, enrollment, course) return { 'upgrade_link': upgrade_link, 'upgrade_price': unicode(get_cosmetic_verified_display_price(course)), 'enrollment_mode': enrollment_mode, 'enrollment_time': enrollment_time, 'pacing_type': 'self_paced' if course.self_paced else 'instructor_paced', 'upgrade_deadline': upgrade_date, 'course_key': course.id, 'course_start': course.start, 'course_end': course.end, }