示例#1
0
def compute_discounts_data(order_settings, start_dt, end_dt, delta, user=None):
    """

    @param order_settings:
    @param start_dt:
    @param end_dt:
    @param delta:
    @param user:
    @return: a list of DiscountData objects
    """
    passenger = None
    user_email_domain = None
    if user:
        user_email_domain = user.email.split("@")[1]
        passenger = user.passenger

    logging.info("get discounts  @%s" % user_email_domain)

    discounts_data = []

    for discount_rule in DiscountRule.objects.filter(open_to_all=True):
        if discount_rule.email_domains and (
                user_email_domain not in discount_rule.email_domains):
            logging.info(
                u"skipping: %s - only for %s" %
                (discount_rule.name, ", ".join(discount_rule.email_domains)))
            continue

        active_dt = get_active_dt(discount_rule, order_settings, start_dt,
                                  end_dt, delta)
        if active_dt:
            discounts_data.append(DiscountData(active_dt, discount_rule))

    if passenger:
        promo_activations = PromoCodeActivation.objects.filter(
            passenger=passenger, consumed=False)
        seen_promo_discounts = []

        for promo_code in [
                activation.promo_code for activation in promo_activations
        ]:
            promotion = promo_code.promotion
            promo_discount_rule = promotion.discount_rule

            if promo_discount_rule in seen_promo_discounts:
                continue
            seen_promo_discounts.append(promo_discount_rule)

            if passenger and not promotion.applies_to(passenger):
                continue

            active_dt = get_active_dt(promo_discount_rule, order_settings,
                                      start_dt, end_dt, delta)
            if active_dt:
                discounts_data.append(
                    DiscountData(active_dt,
                                 promo_discount_rule,
                                 promotion=promotion,
                                 promo_code=promo_code))

    logging.info("active discounts: %s" % discounts_data)
    return discounts_data