def post(self): # Check user user = users.get_current_user() url_linktext, greeting, user_class = check.check_user(user, self.request.uri) # check user are shoping or not shop = self.request.get("shop") # check client requesting service client = self.request.get("client") if user_class not in ["manager", "employee"] and not shop and client != "mobile": # render template_values = { "greeting": greeting, "user_class": user_class, "url_linktext": url_linktext, "detail": "Limited Access!", } path = os.path.join(os.path.dirname(__file__), "error.html") self.response.out.write(template.render(path, template_values)) return # Get var from request and pass to data model object code = self.request.get("code") # shoping user cant mofify order if shop and code: # render template_values = { "greeting": greeting, "user_class": user_class, "url_linktext": url_linktext, "detail": "Limited Access!", } path = os.path.join(os.path.dirname(__file__), "error.html") self.response.out.write(template.render(path, template_values)) return # Query # query = db.Query(Product, keys_only=False); # query.filter("code =", code); # data = query.fetch(1); try: order = db.get(db.Key.from_path("Order", int(code))) except: order = None status = "" if order: status = "Sửa thông tin thành công!" else: status = "Tạo Đơn Hàng thành công!" order = Order() order.created = datetime.datetime.now() order.who_created = user # save order to get auto generated code order.put() order.code = str(order.key().id()) order.modified = datetime.datetime.now() order.who_modified = user # get customer of order try: customer = db.get(db.Key.from_path("Customer", order.customer)) except: customer = None # freely to change if confirm is false if not order.confirm: try: order.confirm = bool(self.request.get("confirm")) except: pass # get list_item and list_quantity, list_chosen (and make changes to database if confirm = true for i in range(15): # save last item code prev_item_code = order.list_item[i] # get new item code order.list_item[i] = self.request.get("item" + str(i)) try: order.list_price[i] = float(self.request.get("price" + str(i))) except: pass # get price if item code change try: item = db.get(db.Key.from_path("Product", order.list_item[i])) except: item = None # clear price when no product code if not item: order.list_price[i] = 0.0 # update quantity and spec chosen try: order.list_quantity[i] = int(self.request.get("quantity" + str(i))) except: order.list_quantity[i] = 0 order.list_chosen[i] = self.request.get("chosen" + str(i)) # clear spec_chosen when phoduct code change (except for the case shop , client mobile) or product code = '' if not shop and client != "mobile" and prev_item_code != order.list_item[i] or order.list_item[i] == "": order.list_chosen[i] = "" # only update price when product code changes if item and prev_item_code != order.list_item[i]: # price = item.sell_price*(1-item.on_sale% or customer.private_sale%) sale_off = 0 if customer: sale_off = customer.private_sale if item.on_sale: sale_off = item.on_sale if sale_off > 100: sale_off = 100 order.list_price[i] = item.sell_price * (1 - float(sale_off) / 100) # also make quantity = 1 if quantity=0 if not order.list_quantity[i]: order.list_quantity[i] = 1 # check for remove quantity and spec_choice from database when confirm change from false to true. If cant remove, confirm order = false. if item and order.confirm: if (item.quantity < order.list_quantity[i]) or ( item.spec_choices and order.list_chosen[i] not in item.spec_choices ): status = "Đơn hàng này ko xác nhận được! Kiểm tra lại các thông tin sản phẩm!" order.confirm = False # get var from request try: order.hidden = bool(self.request.get("hidden")) except: order.hidden = False # actually remove quantity and spec_choice from database if order.confirm: for i in range(15): try: item = db.get(db.Key.from_path("Product", order.list_item[i])) except: continue if not item: continue # save root_price at the time product being sold order.list_root_price[i] = item.root_price # change and save item item.quantity -= order.list_quantity[i] for iter0 in range(order.list_quantity[i]): try: item.spec_choices.remove(order.list_chosen[i]) except: pass item.put() # make hidden = False ( confirmed order cant be hidden) order.hidden = False # get var from request order.customer = self.request.get("customer") try: order.note = db.Text(self.request.get("note")) except: order.note = "" # order is confirmed, cant change but only unconfirmed. if order.confirm: try: order.confirm = bool(self.request.get("confirm")) except: pass if order.confirm: status = "Đơn hàng này đã được xác nhận! Thông tin sẽ ko thể thay đổi cho tới khi hủy xác nhận!" else: # unconfirming order # undo the changes from database and get list_item and list_quantity, list_chosen for i in range(15): # save last item code prev_item_code = order.list_item[i] # get new item code order.list_item[i] = self.request.get("item" + str(i)) try: item = db.get(db.Key.from_path("Product", order.list_item[i])) except: item = None # undo the changes from database when confirm change from true to false. # find prev item if prev_item_code == order.list_item[i]: prev_item = item elif prev_item_code: prev_item = db.get(db.Key.from_path("Product", prev_item_code)) if prev_item: # undo changes and save prev_item.quantity += order.list_quantity[i] for iter0 in range(order.list_quantity[i]): prev_item.spec_choices += [order.list_chosen[i]] prev_item.put() # Get price try: order.list_price[i] = float(self.request.get("price" + str(i))) except: pass # only update price when product code changes if item and prev_item_code != order.list_item[i]: # price = item.sell_price*(1-item.on_sale% or customer.private_sale%) sale_off = 0 if customer: sale_off = customer.private_sale if item.on_sale: sale_off = item.on_sale if sale_off > 100: sale_off = 100 order.list_price[i] = item.sell_price * (1 - float(sale_off) / 100) # update quantity and spec chosen try: order.list_quantity[i] = int(self.request.get("quantity" + str(i))) except: order.list_quantity[i] = 0 order.list_chosen[i] = self.request.get("chosen" + str(i)) order.customer = self.request.get("customer") try: order.note = db.Text(self.request.get("note")) except: order.note = "" try: order.hidden = bool(self.request.get("hidden")) except: order.hidden = False order.put() # save data model object to data base # create account at first time user send an order if shop and order.customer and not customer: customer = Customer(key_name=order.customer) customer.created = datetime.datetime.now() customer.who_created = user customer.code = order.customer customer.email = db.Email(order.customer) customer.modified = datetime.datetime.now() customer.who_modified = user m = re.search(r"Ten KH:\s*(.+)", self.request.get("note")) if m: customer.name = m.group(1) m = re.search(r"Dia Chi:\s*(.+)\nSo DT:", self.request.get("note"), re.DOTALL) if m: customer.address = db.Text(m.group(1)) m = re.search(r"So DT:\s*(.+)", self.request.get("note")) if m: customer.phone = m.group(1) m = re.search(r"Ngay Sinh Nhat:\s*(\d+)\s*/\s*(\d+)\s*", self.request.get("note")) if m: customer.birth_day = int(m.group(1)) customer.birth_month = int(m.group(2)) customer.put() # response and redirect self.response.out.write(status) if shop: if user: self.redirect("/user/?" + urllib.urlencode({"code": order.code, "status": status})) else: self.redirect("/") else: self.redirect("/order/?" + urllib.urlencode({"code": order.code, "status": status, "client": client}))