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
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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
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
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)
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')
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')
def test_absolute_url(self): absolute = absolute_url(self.site, '/foo/bar') self.assertEqual(absolute, 'https://example.com/foo/bar')