Exemple #1
0
def main():
    cust1 = Customer()
    cust1.name = 'Heart of Gold'
    cust1.address = 'The Milky Way Galaxy'
    cust1.enterprise = False
    cust2 = Customer()
    cust2.name = 'Milliways Restaurant'
    cust2.address = 'Magrathea'
    cust2.enterprise = True

    ord1 = Order()
    ord1.orderid = 1
    ord1.customer = cust1
    ord1.expedited = False
    ord1.shipping_address = 'Infinitely Improbable'

    ord2 = (Order())
    ord2.orderid = 2
    ord2.customer = cust2
    ord2.expedited = True
    ord2.shipping_address = 'Magrathea'

    Order.orders = [ord1, ord2]
    for name in ord1.get_expedited_orders_customer_names(Order.orders):
        print(name)
    for address in ord1.get_expedited_orders_customer_addresses(Order.orders):
        print(address)
    for address in ord1.get_expedited_orders_shipping_addresses(Order.orders):
        print(address)

    Order.set_order_expedited(1, Order.orders)
    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}))