Пример #1
0
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)
    }
Пример #2
0
 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))
Пример #3
0
    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,
            })