Esempio n. 1
0
def generate_offer_data(user, course):
    """
    Create a dictionary of information about the current discount offer.

    Used by serializers to pass onto frontends and by the LMS locally to generate HTML for template rendering.

    Returns a dictionary of data, or None if no offer is applicable.
    """
    if not user or not course or user.is_anonymous:
        return None

    ExperimentData.objects.get_or_create(
        user=user, experiment_id=REV1008_EXPERIMENT_ID, key=str(course),
        defaults={
            'value': datetime.now(tz=pytz.UTC).strftime('%Y-%m-%d %H:%M:%S%z'),
        },
    )

    expiration_date = get_discount_expiration_date(user, course)
    if not expiration_date:
        return None

    if not can_receive_discount(user, course, discount_expiration_date=expiration_date):
        return None

    original, discounted, percentage = _get_discount_prices(user, course, assume_discount=True)

    return {
        'code': 'BIENVENIDOAEDX' if get_language() == 'es-419' else 'EDXWELCOME',
        'expiration_date': expiration_date,
        'original_price': original,
        'discounted_price': discounted,
        'percentage': percentage,
        'upgrade_url': verified_upgrade_deadline_link(user, course=course),
    }
Esempio n. 2
0
def _get_discount_prices(user, course, assume_discount=False):
    """
    Return a tuple of (original, discounted, percentage)

    If assume_discount is True, we do not check if a discount applies and just go ahead with discount math anyway.

    Each returned price is a string with appropriate currency formatting added already.
    discounted and percentage will be returned as None if no discount is applicable.
    """
    base_price = get_course_prices(course, verified_only=True)[0]
    can_discount = assume_discount or can_receive_discount(user, course)

    if can_discount:
        percentage = discount_percentage(course)

        discounted_price = base_price * ((100.0 - percentage) / 100)
        if discounted_price:  # leave 0 prices alone, as format_course_price below will adjust to 'Free'
            if discounted_price == int(discounted_price):
                discounted_price = f'{discounted_price:0.0f}'
            else:
                discounted_price = f'{discounted_price:0.2f}'

        return format_course_price(base_price), format_course_price(
            discounted_price), percentage
    else:
        return format_course_price(base_price), None, None
Esempio n. 3
0
def get_first_purchase_offer_banner_fragment(user, course):
    """
    Return an HTML Fragment with First Purcahse Discount message,
    which has the discount_expiration_date, price,
    discount percentage and a link to upgrade.
    """
    if user and course:
        discount_expiration_date = get_discount_expiration_date(user, course)
        if (discount_expiration_date and
                can_receive_discount(user=user, course=course, discount_expiration_date=discount_expiration_date)):
            # Translator: xgettext:no-python-format
            offer_message = _(u'{banner_open} Upgrade by {discount_expiration_date} and save {percentage}% '
                              u'[{strikeout_price}]{span_close}{br}Discount will be automatically applied at checkout. '
                              u'{a_open}Upgrade Now{a_close}{div_close}')
            return Fragment(HTML(offer_message).format(
                a_open=HTML(u'<a href="{upgrade_link}">').format(
                    upgrade_link=verified_upgrade_deadline_link(user=user, course=course)
                ),
                a_close=HTML('</a>'),
                br=HTML('<br>'),
                banner_open=HTML(
                    '<div class="first-purchase-offer-banner"><span class="first-purchase-offer-banner-bold">'
                ),
                discount_expiration_date=discount_expiration_date.strftime(u'%B %d'),
                percentage=discount_percentage(course),
                span_close=HTML('</span>'),
                div_close=HTML('</div>'),
                strikeout_price=HTML(format_strikeout_price(user, course, check_for_discount=False)[0])
            ))
    return None
Esempio n. 4
0
def generate_offer_html(user, course):
    """
    Create the actual HTML object with the offer text in it.

    Returns a openedx.core.djangolib.markup.HTML object, or None if the user
    should not be shown an offer message.
    """
    if user and not user.is_anonymous and course:
        now = datetime.now(tz=pytz.UTC).strftime(u"%Y-%m-%d %H:%M:%S%z")
        saw_banner = ExperimentData.objects.filter(
            user=user, experiment_id=REV1008_EXPERIMENT_ID, key=str(course))
        if not saw_banner:
            ExperimentData.objects.create(user=user,
                                          experiment_id=REV1008_EXPERIMENT_ID,
                                          key=str(course),
                                          value=now)
        discount_expiration_date = get_discount_expiration_date(user, course)
        if (discount_expiration_date and can_receive_discount(
                user=user,
                course=course,
                discount_expiration_date=discount_expiration_date)):
            # Translator: xgettext:no-python-format
            offer_message = _(
                u'{banner_open} Upgrade by {discount_expiration_date} and save {percentage}% '
                u'[{strikeout_price}]{span_close}{br}Use code {b_open}{code}{b_close} at checkout! '
                u'{a_open}Upgrade Now{a_close}{div_close}')

            message_html = HTML(offer_message).format(
                a_open=HTML(u'<a id="welcome" href="{upgrade_link}">').format(
                    upgrade_link=verified_upgrade_deadline_link(
                        user=user, course=course)),
                a_close=HTML('</a>'),
                b_open=HTML('<b>'),
                code=Text('BIENVENIDOAEDX')
                if get_language() == 'es-419' else Text('EDXWELCOME'),
                b_close=HTML('</b>'),
                br=HTML('<br>'),
                banner_open=HTML(
                    '<div class="first-purchase-offer-banner" role="note">'
                    '<span class="first-purchase-offer-banner-bold"><b>'),
                discount_expiration_date=discount_expiration_date.strftime(
                    u'%B %d'),
                percentage=discount_percentage(course),
                span_close=HTML('</b></span>'),
                div_close=HTML('</div>'),
                strikeout_price=HTML(
                    format_strikeout_price(user,
                                           course,
                                           check_for_discount=False)[0]))
            return message_html
    return None
Esempio n. 5
0
def format_strikeout_price(user,
                           course,
                           base_price=None,
                           check_for_discount=True):
    """
    Return a formatted price, including a struck-out original price if a discount applies, and also
        whether a discount was applied, as the tuple (formatted_price, has_discount).
    """
    if base_price is None:
        base_price = get_course_prices(course, verified_only=True)[0]

    original_price = format_course_price(base_price)

    if not check_for_discount or can_receive_discount(user, course):
        discount_price = base_price * (
            (100.0 - discount_percentage(course)) / 100)
        if discount_price == int(discount_price):
            discount_price = format_course_price(
                "{:0.0f}".format(discount_price))
        else:
            discount_price = format_course_price(
                "{:0.2f}".format(discount_price))

        # Separate out this string because it has a lot of syntax but no actual information for
        # translators to translate
        formatted_discount_price = HTML(
            u"{s_dp}{discount_price}{e_p} {s_st}{s_op}{original_price}{e_p}{e_st}"
        ).format(
            original_price=original_price,
            discount_price=discount_price,
            s_op=HTML("<span class='price original'>"),
            s_dp=HTML("<span class='price discount'>"),
            s_st=HTML("<del aria-hidden='true'>"),
            e_p=HTML("</span>"),
            e_st=HTML("</del>"),
        )

        return (HTML(
            _(u"{s_sr}Original price: {s_op}{original_price}{e_p}, discount price: {e_sr}{formatted_discount_price}"
              )).format(
                  original_price=original_price,
                  formatted_discount_price=formatted_discount_price,
                  s_sr=HTML("<span class='sr-only'>"),
                  s_op=HTML("<span class='price original'>"),
                  e_p=HTML("</span>"),
                  e_sr=HTML("</span>"),
              ), True)
    else:
        return (HTML(u"<span class='price'>{}</span>").format(original_price),
                False)
Esempio n. 6
0
def get_first_purchase_offer_banner_fragment(user, course):
    if user and course and can_receive_discount(user=user, course=course):
        # Translator: xgettext:no-python-format
        offer_message = _(
            u'{banner_open}{percentage}% off your first upgrade.{span_close}'
            u' Discount automatically applied.{div_close}')
        return Fragment(
            HTML(offer_message).format(banner_open=HTML(
                '<div class="first-purchase-offer-banner"><span class="first-purchase-offer-banner-bold">'
            ),
                                       percentage=discount_percentage(),
                                       span_close=HTML('</span>'),
                                       div_close=HTML('</div>')))
    return None
Esempio n. 7
0
def get_first_purchase_offer_banner_fragment(user, course):
    """
    Return an HTML Fragment with First Purcahse Discount message,
    which has the discount_expiration_date, price,
    discount percentage and a link to upgrade.
    """
    if user and not user.is_anonymous and course:
        now = datetime.now(tz=pytz.UTC)
        stop_bucketing_into_discount_experiment = datetime(
            2019, 11, 22, 0, 0, 0, 0, pytz.UTC)
        saw_banner = ExperimentData.objects.filter(
            user=user, experiment_id=REV1008_EXPERIMENT_ID, key=str(course))
        if not saw_banner and not now > stop_bucketing_into_discount_experiment:
            ExperimentData.objects.create(
                user=user,
                experiment_id=REV1008_EXPERIMENT_ID,
                key=str(course),
                value=now.strftime(u"%Y-%m-%d %H:%M:%S%z"))
        discount_expiration_date = get_discount_expiration_date(user, course)
        if (discount_expiration_date and can_receive_discount(
                user=user,
                course=course,
                discount_expiration_date=discount_expiration_date)):
            # Translator: xgettext:no-python-format
            offer_message = _(
                u'{banner_open} Upgrade by {discount_expiration_date} and save {percentage}% '
                u'[{strikeout_price}]{span_close}{br}Discount will be automatically applied at checkout. '
                u'{a_open}Upgrade Now{a_close}{div_close}')
            return Fragment(
                HTML(offer_message).format(
                    a_open=HTML(u'<a href="{upgrade_link}">').format(
                        upgrade_link=verified_upgrade_deadline_link(
                            user=user, course=course)),
                    a_close=HTML('</a>'),
                    br=HTML('<br>'),
                    banner_open=HTML(
                        '<div class="first-purchase-offer-banner" role="note">'
                        '<span class="first-purchase-offer-banner-bold">'),
                    discount_expiration_date=discount_expiration_date.strftime(
                        u'%B %d'),
                    percentage=discount_percentage(course),
                    span_close=HTML('</span>'),
                    div_close=HTML('</div>'),
                    strikeout_price=HTML(
                        format_strikeout_price(user,
                                               course,
                                               check_for_discount=False)[0])))
    return None
Esempio n. 8
0
def get_first_purchase_offer_banner_fragment(user, course):
    if (FIRST_PURCHASE_OFFER_BANNER_DISPLAY.is_enabled() and
            user and
            course and
            can_receive_discount(user=user, course_key_string=unicode(course.id))):
        # Translator: xgettext:no-python-format
        offer_message = _(u'{banner_open}{percentage}% off your first upgrade.{span_close}'
                          u' Discount automatically applied.{div_close}')
        return Fragment(HTML(offer_message).format(
            banner_open=HTML(
                '<div class="first-purchase-offer-banner"><span class="first-purchase-offer-banner-bold">'
            ),
            percentage=discount_percentage(),
            span_close=HTML('</span>'),
            div_close=HTML('</div>')
        ))
Esempio n. 9
0
def get_first_purchase_offer_banner_fragment(user, course):
    if (FIRST_PURCHASE_OFFER_BANNER_DISPLAY.is_enabled() and
            user and
            course and
            can_receive_discount(user=user, course=course)):
        # Translator: xgettext:no-python-format
        offer_message = _(u'{banner_open}{percentage}% off your first upgrade.{span_close}'
                          u' Discount automatically applied.{div_close}')
        return Fragment(HTML(offer_message).format(
            banner_open=HTML(
                '<div class="first-purchase-offer-banner"><span class="first-purchase-offer-banner-bold">'
            ),
            percentage=discount_percentage(),
            span_close=HTML('</span>'),
            div_close=HTML('</div>')
        ))