def analytics(request): analytics_data = prepare_analytics_data( request.user, request.site.siteconfiguration.segment_key) return { 'analytics_data': analytics_data, }
def get_context_data(self, **kwargs): context = super(Checkout, self).get_context_data(**kwargs) course = get_object_or_404(Course, id=kwargs.get('course_id')) context['course'] = course deadline = self._check_credit_eligibility(self.request.user, kwargs.get('course_id')) if not deadline: context.update({ 'error': _('An error has occurred. We could not confirm that you are eligible for course credit. ' 'Try the transaction again.') }) return context partner = get_partner_for_site(self.request) strategy = self.request.strategy # Audit seats do not have a `certificate_type` attribute, so # we use getattr to avoid an exception. credit_seats = [] for seat in course.seat_products: if getattr(seat.attr, 'certificate_type', None) != self.CREDIT_MODE: continue purchase_info = strategy.fetch_for_product(seat) if purchase_info.availability.is_available_to_buy and seat.stockrecords.filter(partner=partner).exists(): credit_seats.append(seat) if not credit_seats: msg = _( 'Credit is not currently available for "{course_name}". If you are currently enrolled in the ' 'course, please try again after all grading is complete. If you need additional assistance, ' 'please contact the {site_name} Support Team.' ).format( course_name=course.name, site_name=self.request.site.name ) context.update({'error': msg}) return context providers = self._get_providers_detail(credit_seats) if not providers: context.update({ 'error': _('An error has occurred. We could not confirm that the institution you selected offers this ' 'course credit. Try the transaction again.') }) return context context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, ), 'course': course, 'deadline': deadline, 'providers': providers, }) return context
def _add_to_context_data(self, context): formset = context.get('formset', []) lines = context.get('line_list', []) site_configuration = self.request.site.siteconfiguration context_updates, lines_data = self.process_basket_lines(lines) context.update(context_updates) context.update(self.process_totals(context)) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, site_configuration.segment_key, ), 'enable_client_side_checkout': False, 'sdn_check': site_configuration.enable_sdn_check }) payment_processors = site_configuration.get_payment_processors() if ( site_configuration.client_side_payment_processor and waffle.flag_is_active(self.request, CLIENT_SIDE_CHECKOUT_FLAG_NAME) ): payment_processors_data = self._get_payment_processors_data(payment_processors) context.update(payment_processors_data) context.update({ 'formset_lines_data': list(zip(formset, lines_data)), 'homepage_url': get_lms_url(''), 'min_seat_quantity': 1, 'max_seat_quantity': 100, 'payment_processors': payment_processors, 'lms_url_root': site_configuration.lms_url_root, }) return context
def test_anon_prepare_analytics_data(self): """ Verify the function returns correct analytics data for an anonymous user.""" user = AnonymousUser() data = prepare_analytics_data(user, self.site.siteconfiguration.segment_key) self.assertDictEqual(json.loads(data), { 'tracking': {'segmentApplicationId': self.site.siteconfiguration.segment_key}, 'user': '******' })
def test_anon_prepare_analytics_data(self): """ Verify the function returns correct analytics data for an anonymous user.""" user = AnonymousUser() data = prepare_analytics_data(user, self.site.siteconfiguration.segment_key, 'a/b/c') self.assertDictEqual(json.loads(data), { 'course': {'courseId': 'a/b/c'}, 'tracking': {'segmentApplicationId': self.site.siteconfiguration.segment_key}, 'user': '******' })
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) site_configuration = self.request.site.siteconfiguration failed_enterprise_consent_code = self.request.GET.get(CONSENT_FAILED_PARAM) if failed_enterprise_consent_code: messages.error( self.request, _("Could not apply the code '{code}'; it requires data sharing consent.").format( code=failed_enterprise_consent_code ) ) context_updates, lines_data = self._process_basket_lines(lines) context.update(context_updates) user = self.request.user context.update({ 'analytics_data': prepare_analytics_data( user, site_configuration.segment_key, ), 'enable_client_side_checkout': False, 'sdn_check': site_configuration.enable_sdn_check }) payment_processors = site_configuration.get_payment_processors() if site_configuration.client_side_payment_processor \ and waffle.flag_is_active(self.request, CLIENT_SIDE_CHECKOUT_FLAG_NAME): payment_processors_data = self._get_payment_processors_data(payment_processors) context.update(payment_processors_data) # Total benefit displayed in price summary. # Currently only one voucher per basket is supported. try: applied_voucher = self.request.basket.vouchers.first() total_benefit = ( format_benefit_value(applied_voucher.best_offer.benefit) if applied_voucher else None ) except ValueError: total_benefit = None num_of_items = self.request.basket.num_items context.update({ 'formset_lines_data': zip(formset, lines_data), 'free_basket': context['order_total'].incl_tax == 0, 'homepage_url': get_lms_url(''), 'min_seat_quantity': 1, 'max_seat_quantity': 100, 'payment_processors': payment_processors, 'total_benefit': total_benefit, 'enable_alipay_wechatpay': settings.ENABLE_ALIPAY_WECHATPAY, 'line_price': (self.request.basket.total_incl_tax_excl_discounts / num_of_items) if num_of_items > 0 else 0 }) return context
def test_analytics(self): request = RequestFactory().get('/') request.user = self.create_user() request.site = self.site analytics_data = prepare_analytics_data( request.user, request.site.siteconfiguration.segment_key) self.assertDictEqual(analytics(request), { 'analytics_data': analytics_data, })
def test_analytics(self): request = RequestFactory().get('/') request.user = self.create_user() request.site = self.site analytics_data = prepare_analytics_data(request.user, request.site.siteconfiguration.segment_key) self.assertDictEqual( analytics(request), { 'analytics_data': analytics_data, } )
def test_prepare_analytics_data(self): """ Verify the function returns correct analytics data for a logged in user.""" user = self.create_user( first_name='John', last_name='Doe', email='*****@*****.**', tracking_context={'lms_user_id': '1235123'} ) data = prepare_analytics_data(user, self.site.siteconfiguration.segment_key) self.assertDictEqual(json.loads(data), { 'tracking': {'segmentApplicationId': self.site.siteconfiguration.segment_key}, 'user': {'user_tracking_id': '1235123', 'name': 'John Doe', 'email': '*****@*****.**'} })
def test_prepare_analytics_data(self): """ Verify the function returns correct analytics data for a logged in user.""" user = self.create_user( first_name='John', last_name='Doe', email='*****@*****.**', tracking_context={'lms_user_id': '1235123'} ) data = prepare_analytics_data(user, self.site.siteconfiguration.segment_key, 'a/b/c') self.assertDictEqual(json.loads(data), { 'course': {'courseId': 'a/b/c'}, 'tracking': {'segmentApplicationId': self.site.siteconfiguration.segment_key}, 'user': {'user_tracking_id': '1235123', 'name': 'John Doe', 'email': '*****@*****.**'} })
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) site_configuration = self.request.site.siteconfiguration context_updates, lines_data = self._process_basket_lines(lines) context.update(context_updates) course_key = lines_data[0].get('course_key') if len( lines) == 1 else None user = self.request.user context.update({ 'analytics_data': prepare_analytics_data(user, site_configuration.segment_key, unicode(course_key)), 'enable_client_side_checkout': False, 'sdn_check': site_configuration.enable_sdn_check }) payment_processors = site_configuration.get_payment_processors() if site_configuration.client_side_payment_processor \ and waffle.flag_is_active(self.request, CLIENT_SIDE_CHECKOUT_FLAG_NAME): payment_processors_data = self._get_payment_processors_data( payment_processors) context.update(payment_processors_data) # Total benefit displayed in price summary. # Currently only one voucher per basket is supported. try: applied_voucher = self.request.basket.vouchers.first() total_benefit = (format_benefit_value( applied_voucher.offers.first().benefit) if applied_voucher else None) except ValueError: total_benefit = None context.update({ 'course_key': course_key, 'formset_lines_data': zip(formset, lines_data), 'free_basket': context['order_total'].incl_tax == 0, 'homepage_url': get_lms_url(''), 'min_seat_quantity': 1, 'payment_processors': payment_processors, 'total_benefit': total_benefit }) return context
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) site_configuration = self.request.site.siteconfiguration context_updates, lines_data = self._process_basket_lines(lines) context.update(context_updates) course_key = lines_data[0].get('course_key') if len(lines) == 1 else None user = self.request.user context.update({ 'analytics_data': prepare_analytics_data( user, site_configuration.segment_key, unicode(course_key) ), 'enable_client_side_checkout': False, 'sdn_check': site_configuration.enable_sdn_check }) payment_processors = site_configuration.get_payment_processors() if site_configuration.client_side_payment_processor \ and waffle.flag_is_active(self.request, CLIENT_SIDE_CHECKOUT_FLAG_NAME): payment_processors_data = self._get_payment_processors_data(payment_processors) context.update(payment_processors_data) # Total benefit displayed in price summary. # Currently only one voucher per basket is supported. try: applied_voucher = self.request.basket.vouchers.first() total_benefit = ( format_benefit_value(applied_voucher.offers.first().benefit) if applied_voucher else None ) except ValueError: total_benefit = None context.update({ 'course_key': course_key, 'formset_lines_data': zip(formset, lines_data), 'free_basket': context['order_total'].incl_tax == 0, 'homepage_url': get_lms_url(''), 'min_seat_quantity': 1, 'payment_processors': payment_processors, 'total_benefit': total_benefit }) return context
def test_prepare_analytics_data(self): """ Verify the function returns correct analytics data for a logged in user.""" user = self.create_user(username='******', first_name='John', last_name='Doe', email='*****@*****.**') data = prepare_analytics_data(user, self.site.siteconfiguration.segment_key, 'a/b/c') self.assertDictEqual( json.loads(data), { 'course': { 'courseId': 'a/b/c' }, 'tracking': { 'segmentApplicationId': self.site.siteconfiguration.segment_key }, 'user': { 'username': '******', 'name': 'John Doe', 'email': '*****@*****.**' } })
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) lines_data = [] api = EdxRestApiClient(get_lms_url('api/courses/v1/')) is_verification_required = False for line in lines: course_key = CourseKey.from_string(line.product.attr.course_key) cache_key = 'courses_api_detail_{}'.format(course_key) cache_hash = hashlib.md5(cache_key).hexdigest() course_name = None image_url = None short_description = None try: course = cache.get(cache_hash) if not course: course = api.courses(course_key).get() cache.set(cache_hash, course, settings.COURSES_API_CACHE_TIMEOUT) image_url = get_lms_url(course['media']['course_image']['uri']) short_description = course['short_description'] course_name = course['name'] except (ConnectionError, SlumberBaseException, Timeout): logger.exception('Failed to retrieve data from Course API for course [%s].', course_key) if line.has_discount: benefit = self.request.basket.applied_offers().values()[0].benefit benefit_value = format_benefit_value(benefit) else: benefit_value = None lines_data.append({ 'seat_type': self._determine_seat_type(line.product), 'course_name': course_name, 'course_key': course_key, 'image_url': image_url, 'course_short_description': short_description, 'benefit_value': benefit_value, 'enrollment_code': line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME, 'line': line, }) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, unicode(course_key) ), }) # Check product attributes to determine if ID verification is required for this basket try: is_verification_required = is_verification_required or line.product.attr.id_verification_required except AttributeError: pass context.update({ 'free_basket': context['order_total'].incl_tax == 0, 'payment_processors': self.request.site.siteconfiguration.get_payment_processors(), 'homepage_url': get_lms_url(''), 'formset_lines_data': zip(formset, lines_data), 'is_verification_required': is_verification_required, }) return context
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) lines_data = [] is_verification_required = is_bulk_purchase = False switch_link_text = partner_sku = '' for line in lines: course_key = CourseKey.from_string(line.product.attr.course_key) course_name = None image_url = None short_description = None try: course = get_course_info_from_lms(course_key) image_url = get_lms_url(course['media']['course_image']['uri']) short_description = course['short_description'] course_name = course['name'] except (ConnectionError, SlumberBaseException, Timeout): logger.exception('Failed to retrieve data from Course API for course [%s].', course_key) # Set to true if any course in basket has bulk purchase scenario if line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME: is_bulk_purchase = True # Iterate on message storage so all messages are marked as read list(messages.get_messages(self.request)) # Get variables for alternative basket view switch_link_text, partner_sku = get_basket_switch_data(line.product) if line.has_discount: benefit = self.request.basket.applied_offers().values()[0].benefit benefit_value = format_benefit_value(benefit) else: benefit_value = None lines_data.append({ 'seat_type': self._determine_seat_type(line.product), 'course_name': course_name, 'course_key': course_key, 'image_url': image_url, 'course_short_description': short_description, 'benefit_value': benefit_value, 'enrollment_code': line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME, 'line': line, }) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, unicode(course_key) ), }) # Check product attributes to determine if ID verification is required for this basket try: is_verification_required = is_verification_required or line.product.attr.id_verification_required except AttributeError: pass context.update({ 'free_basket': context['order_total'].incl_tax == 0, 'payment_processors': self.request.site.siteconfiguration.get_payment_processors(), 'homepage_url': get_lms_url(''), 'formset_lines_data': zip(formset, lines_data), 'is_verification_required': is_verification_required, 'min_seat_quantity': 1, 'is_bulk_purchase': is_bulk_purchase, 'switch_link_text': switch_link_text, 'partner_sku': partner_sku, }) return context
def analytics(request): analytics_data = prepare_analytics_data(request.user, request.site.siteconfiguration.segment_key) return { 'analytics_data': analytics_data, }
def get_context_data(self, **kwargs): context = super(CouponOfferView, self).get_context_data(**kwargs) footer = get_lms_footer() code = self.request.GET.get('code', None) if code is not None: try: voucher, product = get_voucher_from_code(code=code) except Voucher.DoesNotExist: return { 'error': _('Coupon does not exist'), 'footer': footer, } except exceptions.ProductNotFoundError: return { 'error': _('The voucher is not applicable to your current basket.'), 'footer': footer, } valid_voucher, msg = voucher_is_valid(voucher, product, self.request) if valid_voucher: api = EdxRestApiClient( get_lms_url('api/courses/v1/'), ) try: course = api.courses(product.course_id).get() except SlumberHttpBaseException as e: logger.exception('Could not get course information. [%s]', e) return { 'error': _('Could not get course information. [{error}]'.format(error=e)), 'footer': footer } course['image_url'] = get_lms_url(course['media']['course_image']['uri']) benefit = voucher.offers.first().benefit stock_record = benefit.range.catalog.stock_records.first() price = stock_record.price_excl_tax benefit_value = format_benefit_value(benefit) if benefit.type == 'Percentage': new_price = price - (price * (benefit.value / 100)) else: new_price = price - benefit.value if new_price < 0: new_price = Decimal(0) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, product.course_id ), 'benefit_value': benefit_value, 'course': course, 'code': code, 'is_discount_value_percentage': benefit.type == 'Percentage', 'is_enrollment_code': benefit.type == Benefit.PERCENTAGE and benefit.value == 100.00, 'discount_value': "%.2f" % (price - new_price), 'price': price, 'new_price': "%.2f" % new_price, 'verified': (product.attr.certificate_type == 'verified'), 'verification_deadline': product.course.verification_deadline, 'footer': footer }) return context return { 'error': msg, 'footer': footer } return { 'error': _('This coupon code is invalid.'), 'footer': footer }
def get_context_data(self, **kwargs): context = super(Checkout, self).get_context_data(**kwargs) course = get_object_or_404(Course, id=kwargs.get('course_id')) context['course'] = course deadline = self._check_credit_eligibility(self.request.user, kwargs.get('course_id')) if not deadline: context.update({ 'error': _('An error has occurred. We could not confirm that you are eligible for course credit. ' 'Try the transaction again.') }) return context partner = get_partner_for_site(self.request) strategy = self.request.strategy # Audit seats do not have a `certificate_type` attribute, so # we use getattr to avoid an exception. credit_seats = [] for seat in course.seat_products: if getattr(seat.attr, 'certificate_type', None) != self.CREDIT_MODE: continue purchase_info = strategy.fetch_for_product(seat) if purchase_info.availability.is_available_to_buy and seat.stockrecords.filter(partner=partner).exists(): credit_seats.append(seat) if not credit_seats: msg = _( 'Credit is not currently available for "{course_name}". If you are currently enrolled in the ' 'course, please try again after all grading is complete. If you need additional assistance, ' 'please contact the {site_name} Support Team.' ).format( course_name=course.name, site_name=self.request.site.name ) context.update({'error': msg}) return context providers = self._get_providers_detail(credit_seats) if not providers: context.update({ 'error': _('An error has occurred. We could not confirm that the institution you selected offers this ' 'course credit. Try the transaction again.') }) return context # Make button text for each processor which will be shown to user. processors_dict = OrderedDict() for path in settings.PAYMENT_PROCESSORS: processor_class = get_processor_class(path) if not processor_class.is_enabled(): continue processor = processor_class.NAME.lower() if processor == 'cybersource': processors_dict[processor] = 'Checkout' elif processor == 'paypal': processors_dict[processor] = 'Checkout with PayPal' else: processors_dict[processor] = 'Checkout with {}'.format(processor) if len(processors_dict) == 0: context.update({ 'error': _( 'All payment options are currently unavailable. Try the transaction again in a few minutes.' ) }) context.update({ 'course': course, 'payment_processors': processors_dict, 'deadline': deadline, 'providers': providers, 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, course.id ), }) return context
def get_context_data(self, **kwargs): context = super(Checkout, self).get_context_data(**kwargs) course = get_object_or_404(Course, id=kwargs.get('course_id')) context['course'] = course deadline = self._check_credit_eligibility(self.request.user, kwargs.get('course_id')) if not deadline: context.update({ 'error': _('An error has occurred. We could not confirm that you are eligible for course credit. ' 'Try the transaction again.') }) return context partner = get_partner_for_site(self.request) strategy = self.request.strategy # Audit seats do not have a `certificate_type` attribute, so # we use getattr to avoid an exception. credit_seats = [] for seat in course.seat_products: if getattr(seat.attr, 'certificate_type', None) != self.CREDIT_MODE: continue purchase_info = strategy.fetch_for_product(seat) if purchase_info.availability.is_available_to_buy and seat.stockrecords.filter( partner=partner).exists(): credit_seats.append(seat) if not credit_seats: msg = _( 'Credit is not currently available for "{course_name}". If you are currently enrolled in the ' 'course, please try again after all grading is complete. If you need additional assistance, ' 'please contact the {site_name} Support Team.').format( course_name=course.name, site_name=self.request.site.name) context.update({'error': msg}) return context providers = self._get_providers_detail(credit_seats) if not providers: context.update({ 'error': _('An error has occurred. We could not confirm that the institution you selected offers this ' 'course credit. Try the transaction again.') }) return context # Make button text for each processor which will be shown to user. processors_dict = OrderedDict() for path in settings.PAYMENT_PROCESSORS: processor_class = get_processor_class(path) if not processor_class.is_enabled(): continue processor = processor_class.NAME.lower() if processor == 'cybersource': processors_dict[processor] = 'Checkout' elif processor == 'paypal': processors_dict[processor] = 'Checkout with PayPal' else: processors_dict[processor] = 'Checkout with {}'.format( processor) if len(processors_dict) == 0: context.update({ 'error': _('All payment options are currently unavailable. Try the transaction again in a few minutes.' ) }) context.update({ 'course': course, 'payment_processors': processors_dict, 'deadline': deadline, 'providers': providers, 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, course.id), }) return context
def get_context_data(self, **kwargs): context = super(CouponOfferView, self).get_context_data(**kwargs) code = self.request.GET.get('code', None) if code is not None: try: voucher, product = get_voucher_from_code(code=code) except Voucher.DoesNotExist: return { 'error': _('Coupon does not exist'), } except exceptions.ProductNotFoundError: return { 'error': _('The voucher is not applicable to your current basket.'), } valid_voucher, msg = voucher_is_valid(voucher, product, self.request) if valid_voucher: api = EdxRestApiClient(get_lms_url('api/courses/v1/'), ) try: course = api.courses(product.course_id).get() except SlumberHttpBaseException as e: logger.exception('Could not get course information. [%s]', e) return { 'error': _('Could not get course information. [{error}]'.format( error=e)), } course['image_url'] = get_lms_url( course['media']['course_image']['uri']) benefit = voucher.offers.first().benefit # Note (multi-courses): fix this to work for all stock records / courses. if benefit.range.catalog: stock_record = benefit.range.catalog.stock_records.first() else: stock_record = StockRecord.objects.get( product=benefit.range.included_products.first()) price = stock_record.price_excl_tax benefit_value = format_benefit_value(benefit) if benefit.type == 'Percentage': new_price = price - (price * (benefit.value / 100)) else: new_price = price - benefit.value if new_price < 0: new_price = Decimal(0) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, product.course_id), 'benefit_value': benefit_value, 'course': course, 'code': code, 'is_discount_value_percentage': benefit.type == 'Percentage', 'is_enrollment_code': benefit.type == Benefit.PERCENTAGE and benefit.value == 100.00, 'discount_value': "%.2f" % (price - new_price), 'price': price, 'new_price': "%.2f" % new_price, 'verified': (product.attr.certificate_type == 'verified'), 'verification_deadline': product.course.verification_deadline, }) return context return { 'error': msg, } return { 'error': _('This coupon code is invalid.'), }
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) lines_data = [] is_verification_required = is_bulk_purchase = False switch_link_text = partner_sku = '' basket = self.request.basket site = self.request.site site_configuration = site.siteconfiguration for line in lines: course_key = CourseKey.from_string(line.product.attr.course_key) course_name = None image_url = None short_description = None try: course = get_course_info_from_catalog(self.request.site, course_key) try: image_url = course['image']['src'] except (KeyError, TypeError): image_url = '' short_description = course.get('short_description', '') course_name = course.get('title', '') except (ConnectionError, SlumberBaseException, Timeout): logger.exception('Failed to retrieve data from Catalog Service for course [%s].', course_key) if self.request.site.siteconfiguration.enable_enrollment_codes: # Get variables for the switch link that toggles from enrollment codes and seat. switch_link_text, partner_sku = get_basket_switch_data(line.product) if line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME: is_bulk_purchase = True # Iterate on message storage so all messages are marked as read. # This will hide the success messages when a user updates the quantity # for an item in the basket. list(messages.get_messages(self.request)) if line.has_discount: benefit = basket.applied_offers().values()[0].benefit benefit_value = format_benefit_value(benefit) else: benefit_value = None lines_data.append({ 'seat_type': self._determine_seat_type(line.product), 'course_name': course_name, 'course_key': course_key, 'image_url': image_url, 'course_short_description': short_description, 'benefit_value': benefit_value, 'enrollment_code': line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME, 'line': line, }) user = self.request.user context.update({ 'analytics_data': prepare_analytics_data( user, self.request.site.siteconfiguration.segment_key, unicode(course_key) ), 'enable_client_side_checkout': False, }) if site_configuration.client_side_payment_processor \ and waffle.flag_is_active(self.request, CLIENT_SIDE_CHECKOUT_FLAG_NAME): payment_processor_class = site_configuration.get_client_side_payment_processor_class() if payment_processor_class: payment_processor = payment_processor_class(site) context.update({ 'enable_client_side_checkout': True, 'payment_form': PaymentForm(user=user, initial={'basket': basket}, label_suffix=''), 'payment_url': payment_processor.client_side_payment_url, }) else: msg = 'Unable to load client-side payment processor [{processor}] for ' \ 'site configuration [{sc}]'.format(processor=site_configuration.client_side_payment_processor, sc=site_configuration.id) raise SiteConfigurationError(msg) # Check product attributes to determine if ID verification is required for this basket try: is_verification_required = line.product.attr.id_verification_required \ and line.product.attr.certificate_type != 'credit' except AttributeError: pass context.update({ 'free_basket': context['order_total'].incl_tax == 0, 'payment_processors': site_configuration.get_payment_processors(), 'homepage_url': get_lms_url(''), 'formset_lines_data': zip(formset, lines_data), 'is_verification_required': is_verification_required, 'min_seat_quantity': 1, 'is_bulk_purchase': is_bulk_purchase, 'switch_link_text': switch_link_text, 'partner_sku': partner_sku, }) return context
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) formset = context.get('formset', []) lines = context.get('line_list', []) lines_data = [] api = EdxRestApiClient(get_lms_url('api/courses/v1/')) is_verification_required = False for line in lines: course_key = CourseKey.from_string(line.product.attr.course_key) cache_key = 'courses_api_detail_{}'.format(course_key) cache_hash = hashlib.md5(cache_key).hexdigest() course_name = None image_url = None short_description = None try: course = cache.get(cache_hash) if not course: course = api.courses(course_key).get() cache.set(cache_hash, course, settings.COURSES_API_CACHE_TIMEOUT) image_url = get_lms_url(course['media']['course_image']['uri']) short_description = course['short_description'] course_name = course['name'] except (ConnectionError, SlumberBaseException, Timeout): logger.exception('Failed to retrieve data from Course API for course [%s].', course_key) if line.has_discount: benefit = self.request.basket.applied_offers().values()[0].benefit benefit_value = format_benefit_value(benefit) else: benefit_value = None lines_data.append({ 'seat_type': self._determine_seat_type(line.product), 'course_name': course_name, 'course_key': course_key, 'image_url': image_url, 'course_short_description': short_description, 'benefit_value': benefit_value, 'enrollment_code': line.product.get_product_class().name == ENROLLMENT_CODE_PRODUCT_CLASS_NAME, 'line': line, }) context.update({ 'analytics_data': prepare_analytics_data( self.request.user, self.request.site.siteconfiguration.segment_key, unicode(course_key) ), }) # Check product attributes to determine if ID verification is required for this basket try: is_verification_required = is_verification_required or line.product.attr.id_verification_required except AttributeError: pass context.update({ 'free_basket': context['order_total'].incl_tax == 0, 'payment_processors': self.request.site.siteconfiguration.get_payment_processors(), 'homepage_url': get_lms_url(''), 'formset_lines_data': zip(formset, lines_data), 'is_verification_required': is_verification_required, }) return context