Esempio n. 1
0
def get_all_valid(order_obj, ship_to=None):
    """
    Get all shipping rules that are valid for a specific order
    """
    all_shipping_rules = get_all()
    valid_shipping_rules = []
    total_weight = _order_weight(order_obj)

    for s in all_shipping_rules:
        # location requirements
        fail_requirements = False
        if s.to_location is not None and ship_to is not None and s.to_location.lower() != ship_to.lower():
            continue
        if s.from_location is not None:
            for i in order_obj.items:
                item = items.get(i["obj_id"])
                if hasattr(item, "location") and getattr(item, "location") != s.from_location:
                    fail_requirements = True
                    break
        if fail_requirements:
            continue

        # weight requirements
        if float(s.min_unit_vol_weight) > total_weight:
            # continue
            pass
        if float(s.max_unit_vol_weight) < total_weight:
            continue

        # add it
        valid_shipping_rules += [s]

    return valid_shipping_rules
Esempio n. 2
0
def _order_weight(order_obj):
    total_weight = 0
    for i in order_obj.items:
        item_obj = items.get(i["obj_id"])
        if hasattr(item_obj, "weight") and item_obj.weight is not None:
            try:
                total_weight += float(item_obj.weight) * float(i["quantity"])
            except ValueError:
                pass
    return total_weight
Esempio n. 3
0
def _item_discount(coupon, order_obj):
    all_items = order_obj.items  # {obj_id: None, coll_name: None, quantity:None}
    for i in all_items:
        if i["obj_id"] == coupon.obj_id:
            item = items.get(i["obj_id"])
            total_price = item.price * i["quantity"]
            if total_price >= coupon.coupon_value:
                return Decimal(coupon.coupon_value)
            else:
                return Decimal(total_price)
Esempio n. 4
0
def total_price(order_obj, discount=True):
    """
    Calculates the total price of all the items before any credit/debit filters
    """
    price = 0
    for i in order_obj.items:
        item = items.get(i["obj_id"])
        if discount:
            find_item_discount(item)
        price += float(item.price) * i["quantity"]
    return price
Esempio n. 5
0
def _container_discount(coupon, order_obj):
    all_items = order_obj.items  # {obj_id: None, coll_name: None, quantity:None}
    total_price = 0
    coupon_container = items.get_container(coupon.obj_id)
    for i in all_items:
        item = items.get(i["obj_id"])
        item_container = items.item_container(item)
        if item_container._id == coupon.obj_id or items.parent_container(coupon_container, item_container):
            total_price += item.price * i["quantity"]

    if total_price >= coupon.coupon_value:
        return Decimal(coupon.coupon_value)
    else:
        return Decimal(total_price)
Esempio n. 6
0
def is_valid(coupon, order_obj):
    """
    Checks if a coupon is valid on an order
    """
    user_obj = users.get(order_obj.user_id)
    user_groups = user_obj.groups
    utc_now = datetime.datetime.utcnow()
    order_price = orders.total_price(order_obj)
    if coupon.user_scope == CouponUserScope.GROUP:
        if coupon.user_group not in user_groups:
            return False
    if coupon.user_scope == CouponUserScope.SPECIFIC:
        if coupon.user_id != user_obj._id:
            return False
    if coupon.valid_times <= 0:
        return False
    if coupon.coupon_lifetime_type == CouponLifetime.LIMITED:
        if utc_now > coupon.expire_utc_datetime:
            return False
        if utc_now < coupon.begins_utc_datetime:
            return False
    if coupon.order_minimum_spending < order_price:
        return False

    all_items = order_obj.items  # {obj_id: None, coll_name: None, quantity:None}

    flag = False
    for i in all_items:
        i["obj"] = items.get(i["obj_id"])
        i["container"] = items.item_container(i["obj"])

        if coupon.coupon_scope == CouponScope.CONTAINER_WIDE:
            container_obj = items.get_container(coupon.obj_id)
            if items.is_parent_container(container_obj, i["container"]) or i["container"]._id == coupon.obj_id:
                flag = True
                break

        if coupon.coupon_scope == CouponScope.ITEM_ONLY:
            if i["obj_id"] == coupon.obj_id:
                flag = True
                break
    if not flag:
        return False

    return True
Esempio n. 7
0
def apply_discounts(order_obj):
    """
    Given an order, updates the order with prevailing discount rules
    onto the order's debit attribute
    """
    all_dedits = order_obj.debits
    other_debit = filter(lambda x: x["coll_name"] != discounts.Discount.coll_name(), all_dedits)
    all_discounts = discounts.get_all()
    valid_discounts = []
    for item_dic in order_obj.items:
        for d in all_discounts:
            item_obj = items.get(coerce_bson_id(item_dic["obj_id"]))
            if item_obj is None: continue
            if discounts.valid_on_item(d, item_obj):
                valid_discounts += [{
                                        "obj_id": d._id,
                                        "coll_name": discounts.Discount.coll_name(),
                                        "amount": discounts.discounted_value(item_obj.price, d),
                                    }]
                break
    order_obj.debits = other_debit + valid_discounts
    return valid_discounts
Esempio n. 8
0
def update_item(custom_attr, custom_media, custom_tags, description, file_media_map, name, obj_id, price, quantity):
    item_obj = items.get(obj_id)
    item_obj.name = name
    item_obj.description = description
    item_obj.price = price
    item_obj.quantity = quantity
    item_obj.custom_attr_lis = custom_attr
    item_obj.custom_media_lis = custom_media

    item_obj.media_id = file_media_map["media_file"].obj_id() if request.form.get("media_file", None) is not None else item_obj.media_id
    for k, v in file_media_map.items():
        if k == "media_file": continue
        if v is not None:
            setattr(item_obj, k, v.obj_id())

    for k in custom_attr:
        setattr(item_obj, k, request.form.get(k, None))
    items.save(item_obj)
    #remove all tags
    tags.clear(item_obj)
    #tag it
    for tag_name in custom_tags:
        tags.tag(item_obj, tag_name)
Esempio n. 9
0
def dic_to_order(cart_dic, o):
    o.items = []
    for k, v in cart_dic.items():
        if items.get(k) is not None:
            o.items += [{"obj_id": k, "quantity": v}]