示例#1
0
    def get_template_context(self, user, user_schedules):
        course_id_strs = []
        course_links = []
        first_valid_upsell_context = None
        first_schedule = None
        for schedule in user_schedules:
            upsell_context = _get_upsell_information_for_schedule(user, schedule)
            if not upsell_context['show_upsell']:
                continue

            if first_valid_upsell_context is None:
                first_schedule = schedule
                first_valid_upsell_context = upsell_context
            course_id_str = str(schedule.enrollment.course_id)
            course_id_strs.append(course_id_str)
            course_links.append({
                'url': absolute_url(self.site, reverse('course_root', args=[course_id_str])),
                'name': schedule.enrollment.course.display_name
            })

        if first_schedule is None:
            self.log_debug('No courses eligible for upgrade for user.')
            raise InvalidContextError()

        context = {
            'course_links': course_links,
            'first_course_name': first_schedule.enrollment.course.display_name,
            'cert_image': absolute_url(self.site, static('course_experience/images/verified-cert.png')),
            'course_ids': course_id_strs,
        }
        context.update(first_valid_upsell_context)
        return context
示例#2
0
def _recurring_nudge_schedules_for_hour(site, target_hour, org_list, exclude_orgs=False):
    beginning_of_day = target_hour.replace(hour=0, minute=0, second=0)
    users = User.objects.filter(
        courseenrollment__schedule__start__gte=beginning_of_day,
        courseenrollment__schedule__start__lt=beginning_of_day + datetime.timedelta(days=1),
        courseenrollment__is_active=True,
    ).annotate(
        first_schedule=Min('courseenrollment__schedule__start')
    ).filter(
        first_schedule__gte=target_hour,
        first_schedule__lt=target_hour + datetime.timedelta(minutes=60)
    )

    schedules = Schedule.objects.select_related(
        'enrollment__user__profile',
        'enrollment__course',
    ).filter(
        enrollment__user__in=users,
        start__gte=beginning_of_day,
        start__lt=beginning_of_day + datetime.timedelta(days=1),
        enrollment__is_active=True,
    ).order_by('enrollment__user__id')

    if org_list is not None:
        if exclude_orgs:
            schedules = schedules.exclude(enrollment__course__org__in=org_list)
        else:
            schedules = schedules.filter(enrollment__course__org__in=org_list)

    if "read_replica" in settings.DATABASES:
        schedules = schedules.using("read_replica")

    LOG.debug('Scheduled Nudge: Query = %r', schedules.query.sql_with_params())

    dashboard_relative_url = reverse('dashboard')

    for (user, user_schedules) in groupby(schedules, lambda s: s.enrollment.user):
        user_schedules = list(user_schedules)
        course_id_strs = [str(schedule.enrollment.course_id) for schedule in user_schedules]

        first_schedule = user_schedules[0]
        template_context = {
            'student_name': user.profile.name,

            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids': course_id_strs,

            # Platform information
            'homepage_url': encode_url(marketing_link('ROOT')),
            'dashboard_url': absolute_url(site, dashboard_relative_url),
            'template_revision': settings.EDX_PLATFORM_REVISION,
            'platform_name': settings.PLATFORM_NAME,
            'contact_mailing_address': settings.CONTACT_MAILING_ADDRESS,
            'social_media_urls': encode_urls_in_dict(getattr(settings, 'SOCIAL_MEDIA_FOOTER_URLS', {})),
            'mobile_store_urls': encode_urls_in_dict(getattr(settings, 'MOBILE_STORE_URLS', {})),
        }
        yield (user, first_schedule.enrollment.course.language, template_context)
示例#3
0
def _upgrade_reminder_schedules_for_bin(site,
                                        current_datetime,
                                        target_datetime,
                                        bin_num,
                                        org_list,
                                        exclude_orgs=False):
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='upgrade_deadline',
        current_datetime=current_datetime,
        target_datetime=target_datetime,
        bin_num=bin_num,
        num_bins=RECURRING_NUDGE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
    )

    for schedule in schedules:
        enrollment = schedule.enrollment
        user = enrollment.user

        course_id_str = str(enrollment.course_id)

        # TODO: group by schedule and user like recurring nudge
        course_id_strs = [course_id_str]
        first_schedule = schedule

        template_context = get_base_template_context(site)
        template_context.update({
            'student_name':
            user.profile.name,
            'user_personal_address':
            user.profile.name if user.profile.name else user.username,
            'course_name':
            first_schedule.enrollment.course.display_name,
            'course_url':
            absolute_url(
                site,
                reverse('course_root',
                        args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids':
            course_id_strs,
            'cert_image':
            absolute_url(site,
                         static('course_experience/images/verified-cert.png')),
        })

        _add_upsell_button_information_to_template_context(
            user, first_schedule, template_context)

        yield (user, first_schedule.enrollment.course.language,
               template_context)
示例#4
0
    def schedules_for_bin(self):
        week_num = abs(self.day_offset) / 7
        schedules = self.get_schedules_with_target_date_by_bin_and_orgs(
            order_by='enrollment__course', )

        template_context = get_base_template_context(self.site)
        for schedule in schedules:
            enrollment = schedule.enrollment
            try:
                week_highlights = get_week_highlights(enrollment.course_id,
                                                      week_num)
            except CourseUpdateDoesNotExist:
                continue

            user = enrollment.user
            course_id_str = str(enrollment.course_id)

            template_context.update({
                'course_name':
                schedule.enrollment.course.display_name,
                'course_url':
                absolute_url(self.site,
                             reverse('course_root', args=[course_id_str])),
                'week_num':
                week_num,
                'week_highlights':
                week_highlights,

                # This is used by the bulk email optout policy
                'course_ids': [course_id_str],
            })
            template_context.update(
                _get_upsell_information_for_schedule(user, schedule))

            yield (user, schedule.enrollment.course.language, template_context)
示例#5
0
def _recurring_nudge_schedules_for_bin(site, target_day, bin_num, org_list, exclude_orgs=False):
    beginning_of_day = target_day.replace(hour=0, minute=0, second=0)
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='start',
        target_date=beginning_of_day,
        bin_num=bin_num,
        num_bins=RECURRING_NUDGE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
    )

    LOG.debug('Recurring Nudge: Query = %r', schedules.query.sql_with_params())

    for (user, user_schedules) in groupby(schedules, lambda s: s.enrollment.user):
        user_schedules = list(user_schedules)
        course_id_strs = [str(schedule.enrollment.course_id) for schedule in user_schedules]

        first_schedule = user_schedules[0]
        template_context = get_base_template_context(site)
        template_context.update({
            'student_name': user.profile.name,

            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids': course_id_strs,
        })

        # Information for including upsell messaging in template.
        _add_upsell_button_information_to_template_context(user, first_schedule, template_context)

        yield (user, first_schedule.enrollment.course.language, template_context)
示例#6
0
def _recurring_nudge_schedules_for_bin(site, current_datetime, target_datetime, bin_num, org_list, exclude_orgs=False):
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='start',
        current_datetime=current_datetime,
        target_datetime=target_datetime,
        bin_num=bin_num,
        num_bins=RECURRING_NUDGE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
    )

    LOG.debug('Recurring Nudge: Query = %r', schedules.query.sql_with_params())

    for (user, user_schedules) in groupby(schedules, lambda s: s.enrollment.user):
        user_schedules = list(user_schedules)
        course_id_strs = [str(schedule.enrollment.course_id) for schedule in user_schedules]

        first_schedule = user_schedules[0]
        template_context = get_base_template_context(site)
        template_context.update({
            'student_name': user.profile.name,

            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids': course_id_strs,
        })

        # Information for including upsell messaging in template.
        _add_upsell_button_information_to_template_context(user, first_schedule, template_context)

        yield (user, first_schedule.enrollment.course.language, template_context)
示例#7
0
    def schedules_for_bin(self):
        week_num = abs(self.day_offset) / 7
        schedules = self.get_schedules_with_target_date_by_bin_and_orgs(
            order_by='enrollment__course',
        )

        template_context = get_base_template_context(self.site)
        for schedule in schedules:
            enrollment = schedule.enrollment
            try:
                week_highlights = get_week_highlights(enrollment.course_id, week_num)
            except CourseUpdateDoesNotExist:
                continue

            user = enrollment.user
            course_id_str = str(enrollment.course_id)

            template_context.update({
                'course_name': schedule.enrollment.course.display_name,
                'course_url': absolute_url(
                    self.site, reverse('course_root', args=[course_id_str])
                ),
                'week_num': week_num,
                'week_highlights': week_highlights,

                # This is used by the bulk email optout policy
                'course_ids': [course_id_str],
            })
            template_context.update(_get_upsell_information_for_schedule(user, schedule))

            yield (user, schedule.enrollment.course.language, template_context)
示例#8
0
def _upgrade_reminder_schedules_for_bin(site, target_day, bin_num, org_list, exclude_orgs=False):
    beginning_of_day = target_day.replace(hour=0, minute=0, second=0)

    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='upgrade_deadline',
        target_date=beginning_of_day,
        bin_num=bin_num,
        num_bins=RECURRING_NUDGE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
    )

    LOG.debug('Upgrade Reminder: Query = %r', schedules.query.sql_with_params())

    for schedule in schedules:
        enrollment = schedule.enrollment
        user = enrollment.user

        course_id_str = str(enrollment.course_id)

        # TODO: group by schedule and user like recurring nudge
        course_id_strs = [course_id_str]
        first_schedule = schedule

        template_context = get_base_template_context(site)
        template_context.update({
            'student_name': user.profile.name,
            'user_personal_address': user.profile.name if user.profile.name else user.username,
            'user_schedule_upgrade_deadline_time': dateformat.format(
                schedule.upgrade_deadline,
                get_format(
                    'DATE_FORMAT',
                    lang=first_schedule.enrollment.course.language,
                    use_l10n=True
                )
            ),

            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids': course_id_strs,
            'cert_image': absolute_url(site, static('course_experience/images/verified-cert.png')),
        })

        yield (user, first_schedule.enrollment.course.language, template_context)
示例#9
0
    def get_template_context(self, user, user_schedules):
        course_id_strs = []
        course_links = []
        first_valid_upsell_context = None
        first_schedule = None
        for schedule in user_schedules:
            upsell_context = _get_upsell_information_for_schedule(
                user, schedule)
            if not upsell_context['show_upsell']:
                continue

            if first_valid_upsell_context is None:
                first_schedule = schedule
                first_valid_upsell_context = upsell_context
            course_id_str = str(schedule.enrollment.course_id)
            course_id_strs.append(course_id_str)
            course_links.append({
                'url':
                absolute_url(self.site,
                             reverse('course_root', args=[course_id_str])),
                'name':
                schedule.enrollment.course.display_name
            })

        if first_schedule is None:
            self.log_debug('No courses eligible for upgrade for user.')
            raise InvalidContextError()

        context = {
            'course_links':
            course_links,
            'first_course_name':
            first_schedule.enrollment.course.display_name,
            'cert_image':
            absolute_url(self.site,
                         static('course_experience/images/verified-cert.png')),
            'course_ids':
            course_id_strs,
        }
        context.update(first_valid_upsell_context)
        return context
示例#10
0
def _course_update_schedules_for_bin(site,
                                     current_datetime,
                                     target_datetime,
                                     day_offset,
                                     bin_num,
                                     org_list,
                                     exclude_orgs=False):
    week_num = abs(day_offset) / 7
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='start',
        current_datetime=current_datetime,
        target_datetime=target_datetime,
        bin_num=bin_num,
        num_bins=COURSE_UPDATE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
        order_by='enrollment__course',
    )

    for schedule in schedules:
        enrollment = schedule.enrollment
        try:
            week_summary = get_course_week_summary(enrollment.course_id,
                                                   week_num)
        except CourseUpdateDoesNotExist:
            continue

        user = enrollment.user
        course_id_str = str(enrollment.course_id)

        template_context = get_base_template_context(site)
        template_context.update({
            'student_name':
            user.profile.name,
            'user_personal_address':
            user.profile.name if user.profile.name else user.username,
            'course_name':
            schedule.enrollment.course.display_name,
            'course_url':
            absolute_url(
                site,
                reverse('course_root',
                        args=[str(schedule.enrollment.course_id)])),
            'week_num':
            week_num,
            'week_summary':
            week_summary,

            # This is used by the bulk email optout policy
            'course_ids': [course_id_str],
        })

        yield (user, schedule.enrollment.course.language, template_context)
示例#11
0
def _upgrade_reminder_schedules_for_bin(site, current_datetime, target_datetime, bin_num, org_list, exclude_orgs=False):
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='upgrade_deadline',
        current_datetime=current_datetime,
        target_datetime=target_datetime,
        bin_num=bin_num,
        num_bins=RECURRING_NUDGE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
    )

    LOG.debug('Upgrade Reminder: Query = %r', schedules.query.sql_with_params())

    for schedule in schedules:
        enrollment = schedule.enrollment
        user = enrollment.user

        course_id_str = str(enrollment.course_id)

        # TODO: group by schedule and user like recurring nudge
        course_id_strs = [course_id_str]
        first_schedule = schedule

        template_context = get_base_template_context(site)
        template_context.update({
            'student_name': user.profile.name,
            'user_personal_address': user.profile.name if user.profile.name else user.username,

            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])),

            # This is used by the bulk email optout policy
            'course_ids': course_id_strs,
            'cert_image': absolute_url(site, static('course_experience/images/verified-cert.png')),
        })

        _add_upsell_button_information_to_template_context(user, first_schedule, template_context)

        yield (user, first_schedule.enrollment.course.language, template_context)
示例#12
0
    def get_template_context(self, user, user_schedules):
        first_schedule = user_schedules[0]
        context = {
            'course_name': first_schedule.enrollment.course.display_name,
            'course_url': absolute_url(
                self.site, reverse('course_root', args=[str(first_schedule.enrollment.course_id)])
            ),
        }

        # Information for including upsell messaging in template.
        context.update(_get_upsell_information_for_schedule(user, first_schedule))

        return context
示例#13
0
    def get_template_context(self, user, user_schedules):
        first_schedule = user_schedules[0]
        context = {
            'course_name':
            first_schedule.enrollment.course.display_name,
            'course_url':
            absolute_url(
                self.site,
                reverse('course_root',
                        args=[str(first_schedule.enrollment.course_id)])),
        }

        # Information for including upsell messaging in template.
        context.update(
            _get_upsell_information_for_schedule(user, first_schedule))

        return context
示例#14
0
def _course_update_schedules_for_bin(site, current_datetime, target_datetime, day_offset, bin_num, org_list,
                                     exclude_orgs=False):
    week_num = abs(day_offset) / 7
    schedules = get_schedules_with_target_date_by_bin_and_orgs(
        schedule_date_field='start',
        current_datetime=current_datetime,
        target_datetime=target_datetime,
        bin_num=bin_num,
        num_bins=COURSE_UPDATE_NUM_BINS,
        org_list=org_list,
        exclude_orgs=exclude_orgs,
        order_by='enrollment__course',
    )

    LOG.debug('Course Update: Query = %r', schedules.query.sql_with_params())

    for schedule in schedules:
        enrollment = schedule.enrollment
        try:
            week_summary = get_course_week_summary(enrollment.course_id, week_num)
        except CourseUpdateDoesNotExist:
            continue

        user = enrollment.user
        course_id_str = str(enrollment.course_id)

        template_context = get_base_template_context(site)
        template_context.update({
            'student_name': user.profile.name,
            'user_personal_address': user.profile.name if user.profile.name else user.username,
            'course_name': schedule.enrollment.course.display_name,
            'course_url': absolute_url(site, reverse('course_root', args=[str(schedule.enrollment.course_id)])),
            'week_num': week_num,
            'week_summary': week_summary,

            # This is used by the bulk email optout policy
            'course_ids': [course_id_str],
        })

        yield (user, schedule.enrollment.course.language, template_context)
示例#15
0
 def test_absolute_url_already_absolute(self):
     absolute = absolute_url(self.site, 'https://some-cdn.com/foo/bar')
     self.assertEqual(absolute, 'https://some-cdn.com/foo/bar')
示例#16
0
 def test_absolute_url_domain_lstrip(self):
     self.site.domain = 'example.com/'
     absolute = absolute_url(self.site, 'foo/bar')
     self.assertEqual(absolute, 'https://example.com/foo/bar')
示例#17
0
 def test_absolute_url(self):
     absolute = absolute_url(self.site, '/foo/bar')
     self.assertEqual(absolute, 'https://example.com/foo/bar')