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
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
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)
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
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)
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
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
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)
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}]