def get_base_experiment_metadata_context(course, user, enrollment, user_enrollments): """ Return a context dictionary with the keys used by dashboard_metadata.html and user_metadata.html """ enrollment_mode = None enrollment_time = None # TODO: clean up as part of REVEM-199 (START) program_key = get_program_context(course, user_enrollments) # TODO: clean up as part of REVEM-199 (END) schedule_start = None if enrollment and enrollment.is_active: enrollment_mode = enrollment.mode enrollment_time = enrollment.created try: schedule_start = enrollment.schedule.start_date except Schedule.DoesNotExist: pass # upgrade_link, dynamic_upgrade_deadline and course_upgrade_deadline should be None # if user has passed their dynamic pacing deadline. upgrade_link, dynamic_upgrade_deadline, course_upgrade_deadline = check_and_get_upgrade_link_and_date( user, enrollment, course) duration = get_user_course_duration(user, course) deadline = duration and get_user_course_expiration_date(user, course) return { 'upgrade_link': upgrade_link, 'upgrade_price': six.text_type(get_cosmetic_verified_display_price(course)), 'enrollment_mode': enrollment_mode, 'enrollment_time': enrollment_time, 'schedule_start': schedule_start, 'pacing_type': 'self_paced' if course.self_paced else 'instructor_paced', 'dynamic_upgrade_deadline': dynamic_upgrade_deadline, 'course_upgrade_deadline': course_upgrade_deadline, 'audit_access_deadline': deadline, 'course_duration': duration, 'course_key': course.id, 'course_display_name': course.display_name_with_default, 'course_start': course.start, 'course_end': course.end, # TODO: clean up as part of REVEM-199 (START) 'program_key_fields': program_key, # TODO: clean up as part of REVEM-199 (END) }
def register_alerts(self, request, course): """ Registers an alert if the verification deadline is approaching. """ upgrade_price = get_cosmetic_verified_display_price(course) if not UPGRADE_DEADLINE_MESSAGE.is_enabled( course.id) or not self.is_enabled or not upgrade_price: return days_left_to_upgrade = (self.date - self.current_time).days if self.date > self.current_time and days_left_to_upgrade <= settings.COURSE_MESSAGE_ALERT_DURATION_IN_DAYS: upgrade_message = _( u"Don't forget, you have {time_remaining_string} left to upgrade to a Verified Certificate." ).format(time_remaining_string=self.time_remaining_string) if self._dynamic_deadline() is not None: upgrade_message = _( u"Don't forget to upgrade to a verified certificate by {localized_date}." ).format(localized_date=date_format(self.date)) CourseHomeMessages.register_info_message( request, Text( _('In order to qualify for a certificate, you must meet all course grading ' 'requirements, upgrade before the course deadline, and successfully verify ' u'your identity on {platform_name} if you have not done so already.{button_panel}' ) ).format( platform_name=settings.PLATFORM_NAME, button_panel=HTML( '<div class="message-actions">' '<a id="certificate_upsell" class="btn btn-upgrade"' 'data-creative="original_message" data-position="course_message"' 'href="{upgrade_url}">{upgrade_label}</a>' '</div>').format( upgrade_url=self.link, upgrade_label=Text( _(u'Upgrade ({upgrade_price})')).format( upgrade_price=upgrade_price), )), title=Text(upgrade_message))
def get(self, request): """ Return the if the course should be upsold in the mobile app, if the user has appropriate permissions. """ if not MOBILE_UPSELL_FLAG.is_enabled(): return Response({ 'show_upsell': False, 'upsell_flag': False, }) course_id = request.GET.get('course_id') try: course_key = CourseKey.from_string(course_id) except InvalidKeyError: return HttpResponseBadRequest("Missing or invalid course_id") course = CourseOverview.get_from_id(course_key) if not course.has_started() or course.has_ended(): return Response({ 'show_upsell': False, 'upsell_flag': MOBILE_UPSELL_FLAG.is_enabled(), 'course_running': False, }) user = request.user try: enrollment = CourseEnrollment.objects.select_related('course').get( user_id=user.id, course_id=course.id) user_upsell = can_show_verified_upgrade(user, enrollment) except CourseEnrollment.DoesNotExist: user_upsell = True basket_url = EcommerceService().upgrade_url(user, course.id) upgrade_price = six.text_type( get_cosmetic_verified_display_price(course)) could_upsell = bool(user_upsell and basket_url) bucket = stable_bucketing_hash_group(MOBILE_UPSELL_EXPERIMENT, 2, user) if could_upsell and hasattr( request, 'session') and MOBILE_UPSELL_EXPERIMENT not in request.session: properties = { 'site': request.site.domain, 'app_label': 'experiments', 'bucket': bucket, 'experiment': 'REV-934', } segment.track( user_id=user.id, event_name='edx.bi.experiment.user.bucketed', properties=properties, ) # Mark that we've recorded this bucketing, so that we don't do it again this session request.session[MOBILE_UPSELL_EXPERIMENT] = True show_upsell = bool(bucket != 0 and could_upsell) if show_upsell: return Response({ 'show_upsell': show_upsell, 'price': upgrade_price, 'basket_url': basket_url, }) else: return Response({ 'show_upsell': show_upsell, 'upsell_flag': MOBILE_UPSELL_FLAG.is_enabled(), 'experiment_bucket': bucket, 'user_upsell': user_upsell, 'basket_url': basket_url, })