Rev 702 | Rev 717 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 10-May-2010@author: ashish'''from elixir import *from shop2020.model.v1.user.impl.Dataservice import Cart, Line, Address, Userfrom shop2020.thriftpy.model.v1.user.ttypes import CartStatus, LineStatus, ShoppingCartExceptionimport datetimefrom shop2020.utils.Utils import to_py_date, to_java_datefrom shop2020.thriftpy.model.v1.order.ttypes import Transaction as TTransaction,\TransactionStatus as TTransactionStatus, Order as TOrder, LineItem as TLineItem, OrderStatusfrom shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItemfrom shop2020.thriftpy.logistics.ttypes import LogisticsInfo as TLogisticsInfofrom shop2020.clients.TransactionClient import TransactionClientfrom shop2020.clients.InventoryClient import InventoryClientfrom shop2020.clients.LogisticsClient import LogisticsClientfrom shop2020.model.v1 import userdef get_cart(user_id):query = Cart.query.filter_by(user_id=user_id)query = query.filter_by(cart_status = CartStatus.ACTIVE)try:cart = query.one()session.commit()except:return None# raise ShoppingCartException(101, "Cart does not exist")return cartdef get_cart_by_id(id):cart = Cart.get_by(id=id)return cartdef create_cart(user_id):cart = get_cart(user_id)if not cart:cart = Cart()cart.user_id = user_idcart.created_on = datetime.datetime.now()cart.updated_on = datetime.datetime.now()cart.cart_status = CartStatus.ACTIVEsession.commit()return cartdef get_cart_by_user_id_and_status(user_id, status):query = Cart.query.filter_by(user_id=user_id)if status:query = query.filter_by(cart_status=status)carts = query.all()return cartsdef get_carts_by_status(status):return Cart.query.filter_by(cart_status=status).all()def get_carts_between(start_time, end_time, status):init_time = to_py_date(start_time)finish_time = to_py_date(end_time)query = Cart.queryif status:query = query.filter(Cart.cart_status==status)if init_time:query = query.filter(Cart.created_on >= init_time)if finish_time:query = query.filter(Cart.created_on <= finish_time)carts = query.all()return cartsdef get_line(item_id, cart_id, status, single):#get cart firsttry:found_cart = Cart.get_by(id=cart_id)except:raise ShoppingCartException(101, "cart not found ")query = Line.query.filter_by(cart = found_cart, item_id = item_id)if status:query = query.filter_by(line_status = status)else:query = query.filter_by(line_status = LineStatus.LINE_ACTIVE)try:if single:return query.one()else:return query.all()except:return Nonedef change_cart_status(cart_id, status):cart = get_cart_by_id(id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")if not status:raise ShoppingCartException(101, "invalid status")cart.cart_status = statussession.commit()def add_item_to_cart(cart_id, item_id, quantity):if not item_id:raise ShoppingCartException(101, "item_id cannot be null")if not quantity:raise ShoppingCartException(101, "quantity cannot be null")cart = Cart.get_by(id = cart_id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")current_time = datetime.datetime.now()cart.updated_on = current_timeline = get_line(item_id, cart_id, None,True)if line:#change the quantity onlyline.quantity = quantityline.updated_on = current_timeelse:line = Line()line.cart = cartline.item_id = item_idline.quantity = quantityline.created_on = current_timeline.updated_on = current_timeline.line_status = LineStatus.LINE_ACTIVEsession.commit()def delete_item_from_cart(cart_id, item_id):if not item_id:raise ShoppingCartException(101, "item_id cannot be null")cart = Cart.get_by(id = cart_id)if not cart:raise ShoppingCartException(101, "no cart attached to this id")item = get_line(item_id, cart_id, None, True)item.delete()current_time = datetime.datetime.now()cart.updated_on = current_timesession.commit()def change_item_status(cart_id, item_id, status):if not status:raise ShoppingCartException(101, "Status cannot be made null")line = get_line(item_id, cart_id, None, True)if line:line.line_status = statuscurrent_time = datetime.datetime.now()line.updated_on = current_timeline.cart.updated_on = current_timesession.commit()else:raise ShoppingCartException(101, "Unable to probe the line you desired")def add_address_to_cart(cart_id, address_id):if not cart_id:raise ShoppingCartException(101, "cart id cannot be made null")if not address_id:raise ShoppingCartException(101, "address id cannot be made null")cart = get_cart_by_id(cart_id)if not cart:raise ShoppingCartException(101, "no cart for this id")address = Address.get_by(id=address_id)if not address:raise ShoppingCartException(101, "No address for this id")cart.address_id = address_idcurrent_time = datetime.datetime.now()#cart.updated_on = current_timesession.commit()def commit_cart(cart_id):cart = get_cart_by_id(cart_id)#now we have a cart. Need to create a transaction with ittxn = TTransaction()txn.shoppingCartid = cart_idtxn.customer_id = cart.user_idtxn.createdOn = to_java_date(datetime.datetime.now())txn.transactionStatus = TTransactionStatus.INITtxn.statusDescription = "New Order"txn.orders = create_orders(cart)transaction_client = TransactionClient().get_client()txn_id = transaction_client.createTransaction(txn)session.commit()#new_cart = create_cart(cart.user_id)#user = User.get_by(id=cart.user_id)#user.active_cart_id = new_cart.id#session.commit()return txn_iddef create_orders(cart):cart_lines = cart.linesorders = []for line in cart_lines:if line.line_status == LineStatus.LINE_ACTIVE:i = 0while i< line.quantity:t_line_item = create_line_item(line.item_id)t_order = create_order(cart.user_id, cart.address_id, t_line_item)orders.append(t_order)i += 1return ordersdef create_order(user_id, address_id, t_line_item):user = User.get_by(id=user_id)address = Address.get_by(id=address_id)t_order = TOrder()t_order.customer_id = user.idt_order.customer_name = user.namet_order.customer_email = user.emailt_order.customer_pincode = address.pint_order.customer_address = get_address_string(address)t_order.customer_city = address.cityt_order.customer_state = address.statet_order.customer_mobilenumber = address.phonet_order.total_amount = t_line_item.total_pricet_order.total_weight = t_line_item.total_weightt_order.lineitems = [t_line_item]t_order.status = OrderStatus.PAYMENT_PENDINGt_order.statusDescription = "Submitted to warehouse"t_order.created_timestamp = to_java_date(datetime.datetime.now())logistics_client = LogisticsClient().get_client()logistics_info = logistics_client.getLogisticsInfo(t_order.customer_pincode, t_line_item.item_id)t_order.logistics_provider_id = logistics_info.providerIdt_order.airwaybill_no = logistics_info.airway_billnot_order.tracking_id = t_order.airwaybill_not_order.expected_delivery_time = to_java_date(datetime.datetime.now()) + 60*60*1000*logistics_info.deliveryTimet_order.warehouse_id = logistics_info.warehouseIdreturn t_orderdef create_line_item(item_id):inventory_client = InventoryClient().get_client()item = inventory_client.getItem(item_id)t_line_item = TLineItem()t_line_item.model_name = item.modelNamet_line_item.model_number = item.modelNumberif item.color is None or item.color == "NA":t_line_item.color = ""else:t_line_item.color = item.colort_line_item.extra_info = item.featureDescriptiont_line_item.brand = item.manufacturerNamet_line_item.item_id = item.idt_line_item.quantity = 1t_line_item.unit_price = item.sellingPricet_line_item.unit_weight = item.weightt_line_item.total_price = item.sellingPricet_line_item.total_weight = item.weightreturn t_line_itemdef get_address_string(address):return address.line_1 + "\n" + address.line_2 + "\n Landmark: " + "\n"def validate_cart(cartId):inventory_client = InventoryClient().get_client()logistics_client = LogisticsClient().get_client()retval = True# No need to validate duplicate items since there are only two ways# to add items to a cart and both of them check whether the item being# added is a duplicate of an already existing item.cart = Cart.get_by(id=cartId)cart_lines = cart.linescustomer_pincode = ""current_time = datetime.datetime.now()if cart.address_id:address = Address.get_by(id=cart.address_id)customer_pincode = address.pinfor line in cart_lines:old_estimate = line.estimateitem_id = line.item_idif inventory_client.isActive(item_id):if customer_pincode:try:item_delivery_estimate = logistics_client.getLogisticsEstimation(item_id, customer_pincode).deliveryTimeexcept:item_delivery_estimate = 3if old_estimate != item_delivery_estimate:line.estimate = item_delivery_estimatecart.updated_on = current_timeretval = Falseelse:line.delete()retval = Falseif cart.checked_out_on is not None:if cart.updated_on > cart.checked_out_on:retval = Falsesession.commit()return retvaldef merge_cart(fromCartId, toCartId):fromCart = Cart.get_by(id=fromCartId)toCart = Cart.get_by(id=toCartId)old_lines = fromCart.linesnew_lines = toCart.linesfor line in old_lines:flag = Truefor new_line in new_lines:if line.item_id == new_line.item_id:flag = Falseif flag:toCart.lines.append(line)toCart.updatedOn = datetime.datetime.now()fromCart.expired_on = datetime.datetime.now()fromCart.cart_status = CartStatus.INACTIVEsession.commit()def check_out(cartId):if cartId is None:raise ShoppingCartException(101, "Cart id not specified")cart = Cart.get_by(id = cartId)if cart is None:raise ShoppingCartException(102, "The specified cart couldn't be found")cart.checked_out_on = datetime.datetime.now()session.commit()return Truedef reset_cart(cartId, items):if cartId is None:raise ShoppingCartException(101, "Cart id not specified")for item_id, quantity in items.iteritems():line = Line.query.filter_by(cart_id=cartId, item_id=item_id).one()if line is not None:line.quantity = line.quantity - quantityif line.quantity == 0:line.delete()cart = Cart.get_by(cartId)cart.updated_on = datetime.datetime.now()session.commit()return True