예제 #1
0
def cancel_order(order):
    """Cancel order."""
    order.status = OrderStateChoices.canceled.name
    db.session.commit()

    message = create_message(f"Отмена заказа №{order.id}", current_user.email)
    message.html = f"Вы самостоятельно отменили свой заказ №{order.id}.<br>"
    send_message(message)

    return make_response(redirect(url_for("list_orders") + "?type=canceled"))
예제 #2
0
def retrieve_password(user) -> None:
    """Change stored password by a random one and send a letter with a link for retrieve."""
    user.password = get_random_password_hash()
    db.session.commit()
    token = create_confirmation_token(
        (user.email, "retrieve_password", datetime.utcnow().timestamp()))
    link = url_for("retrieve", token=token, _external=True)
    message = create_message("Восстановление доступа на сайт WebShop",
                             user.email)
    message.html = (
        f"Ваш предыдущий пароль был сброшен.<br>"
        f"Для создания нового пароля перейдите по <a href={link}>ссылке</a>.<br><br>"
        f"Ссылка действительна в течение 5 минут.")
    send_message(message)
예제 #3
0
def create_order(items, request_):
    """Create an order from cart."""
    update_order(items, request_)
    if items:
        order = Order.query.filter_by(
            user=current_user.id,
            status=OrderStateChoices.awaiting.name).first()

        if not order:
            order = Order(
                user=current_user.id,
                status=OrderStateChoices.awaiting.name,
            )

        cart: Order = Order.query.get(items[0].order)
        order.delivery_id = cart.delivery_id
        order.delivery_sum = cart.delivery_sum

        cart.delivery_sum, cart.delivery_id = None, None

        db.session.add(order)
        db.session.commit()
        db.session.flush()
        db.session.refresh(order)

        for item in items:
            good = OrderItem.query.filter_by(order=item.order,
                                             shop=item.shop_id,
                                             product=item.product).first()
            if good:
                good.order = order.id
                db.session.commit()

        link = create_link((current_user.email, order.id, 600))
        message = create_message("Подтверждение заказа", current_user.email)
        message.html = (
            f"Для подтверждения вашего заказа на WebShop перейдите по ссылке: {link}"
        )
        send_message(message)
        return order
예제 #4
0
def confirm_order(order):
    """Confirm order."""
    goods: List[OrderItem] = OrderItem.query.filter_by(order=order.id).all()
    items, _, total_sum = get_items(goods, order)
    for item in items:
        good: ProductInfo = ProductInfo.query.filter_by(
            product=item.product, shop=item.shop_id).first()
        if not (good.quantity >= item.quantity
                and good.shop_rel.shop_manager.is_active):
            cart: Order = Order.query.filter_by(
                user=current_user.id,
                status=OrderStateChoices.cart.name).first()
            for good_ in goods:
                good_.order = cart.id
                good_.quantity = 0
                db.session.commit()

            db.session.delete(order)
            db.session.commit()

            message = create_message("Отмена заказа", current_user.email)
            message.html = (
                "Ваш последний заказ был отменён вследствие отсутствия некоторых из указанных вами товаров.<br>"
                "Все указанные вами позиции были перемещены в вашу корзину.<br>"
                "Пожалуйста, выберите подходящие для вас товары из имеющихся в наличии и сформируйте новый заказ."
            )
            send_message(message)

            flash(
                f"Во время ожидания подтверждения заказа №{order.id} у поставщиков произошли изменения."
            )
            flash("Заказ удалён, все товары из заказа перемещены в Корзину.")
            flash("Оформите новый заказ.")
            return make_response(redirect(url_for("show_cart")))

    flash(f"Заказ №{order.id} успешно подтверждён.")
    return items, total_sum
예제 #5
0
def register():
    """User registration route handler."""
    if current_user.is_authenticated:
        return make_response(redirect(url_for("index")))

    form = MyRegisterForm()

    if form.cancel.data:
        return make_response(redirect(url_for("index")))

    if form.validate_on_submit():
        user = User(
            email=form.email.data.lower(),
            first_name=form.first_name.data,
            last_name=form.last_name.data,
            password=form.password.data,
            user_type=getattr(UserTypeChoices, form.user_type.data).name,
        )
        db.session.add(user)
        db.session.commit()

        link = create_link(user.email)
        message = create_message("Подтверждение регистрации", user.email)
        message.html = (
            f"Для подтверждения учётной записи на WebShop перейдите по ссылке: {link}"
        )
        send_message(message)

        flash(
            "Регистрация прошла успешно! "
            "Проверьте вашу почту и подтвердите учётную запись в течение 1 минуты."
        )
        return make_response(redirect(url_for("index")))

    return make_response(
        render_template("register.html", title="Регистрация", form=form))
def sellers_orders():
    """View for orders' managing by sellers."""
    if not request.args.get("status"):
        return make_response(redirect(url_for("sellers_orders") + "?status=confirmed"))

    if request.form.get("order_current_status") and request.form.get(
        "order_current_status"
    ) != request.args.get("status"):
        status = request.form["order_current_status"]
        return make_response(redirect(url_for("sellers_orders") + f"?status={status}"))

    status = request.args["status"]

    form = SellersOrdersForm()
    shops = [shop.id for shop in Shop.query.filter_by(user_id=current_user.id).all()]
    order_ids = {
        item.order for item in OrderItem.query.filter(OrderItem.shop.in_(shops)).all()
    }
    orders: List[Order] = Order.query.filter(
        and_(Order.id.in_(order_ids), Order.status == status)
    ).all()
    items = list_items(request, shops)

    if request.method == "POST":
        statuses = {
            "Заказан": ItemOrderStateChoices.ordered.name,
            "Собран": ItemOrderStateChoices.assembled.name,
            "Отменен": ItemOrderStateChoices.canceled.name,
        }
        if items:
            for item in items:
                if request.form.get(f"{item.slug}_status_select"):
                    good: OrderItem = OrderItem.query.filter_by(
                        product=item.product, shop=item.shop_id, order=item.order
                    ).first()
                    good.status = statuses[request.form[f"{item.slug}_status_select"]]
                    db.session.commit()

            goods_statuses = [
                good.status.name
                for good in OrderItem.query.filter_by(order=items[0].order).all()
            ]

            if "ordered" not in goods_statuses:
                if all(s == "assembled" for s in goods_statuses):
                    order: Order = Order.query.get(items[0].order)
                    order.status = OrderStateChoices.assembled.name
                    db.session.commit()
                    db.session.flush()
                    db.session.refresh(order)
                    message = create_message(
                        f"Изменение статуса заказа №{order.id}", order.customer.email
                    )
                    message.html = f"Ваш заказ №{order.id} {order.status.value.lower()}."
                    send_message(message)
                elif all(s == "canceled" for s in goods_statuses):
                    order: Order = Order.query.get(items[0].order)
                    order.status = OrderStateChoices.canceled.name
                    db.session.commit()
                    db.session.flush()
                    db.session.refresh(order)
                    message = create_message(
                        f"Изменение статуса заказа №{order.id}", order.customer.email
                    )
                    message.html = (
                        f"Ваш заказ №{order.id} {order.status.value.lower()}. "
                        f"Все заказанные Вами товары отсутствуют в наличии."
                    )
                    send_message(message)
                else:
                    order: Order = Order.query.get(items[0].order)
                    order.status = OrderStateChoices.assembled.name
                    db.session.commit()
                    db.session.flush()
                    db.session.refresh(order)
                    message = create_message(
                        f"Изменение статуса заказа №{order.id}", order.customer.email
                    )
                    message.html = (
                        f"Ваш заказ №{order.id} {order.status.value.lower()}.<br>"
                        f"В ходе сборки некоторые позиции были исключены из заказа.<br>"
                        f"Сумма заказа была соразмерно уменьшена.<br><br>"
                        f"Заказ передан в службу доставки {order.delivery.title}.<br><br>"
                        f"С подробностями можно ознакомиться в личном кабинете в разделе 'Заказы'."
                    )
                    send_message(message)

                if order.status.name == "assembled":
                    if order.delivery_id != 1:
                        order = Order.query.get(order.id)
                        order.status = OrderStateChoices.sent.name
                        db.session.commit()
                        message = create_message(
                            f"Изменение статуса заказа №{order.id}", order.customer.email
                        )
                        message.html = (
                            f"Ваш заказ №{order.id} {order.status.value.lower()}.<br>"
                            f"Ожидайте доставку.<br>"
                        )
                        send_message(message)
                        # data = json.dumps(
                        #     {"delivery": order.delivery.title, "order_id": order.id}
                        # )
                        # headers = {"Content-Type": "application/json"}
                        # requests.session().post(
                        #     "http://127.0.0.1/delivery_tasks", headers=headers, data=data
                        # )
                        return make_response(redirect(request.path))
                    order = Order.query.get(order.id)
                    order.status = OrderStateChoices.ready.name
                    db.session.commit()
                    message = create_message(
                        f"Изменение статуса заказа №{order.id}", order.customer.email
                    )
                    message.html = (
                        f"Ваш заказ №{order.id} {order.status.value.lower()}.<br>"
                        f"Вы можете забрать его в пункте самовывоза.<br>"
                    )
                    send_message(message)
                    return make_response(redirect(request.path))

            return make_response(redirect(request.full_path))

    return make_response(
        render_template("manage_orders.html", form=form, orders=orders, items=items)
    )
예제 #7
0
 def test_body_message(self, email):
     message = create_message("", email)
     token = create_confirmation_token(email)
     link = url_for("confirm", token=token, _external=True)
     message.body = f"Link in body {link}"
     assert link in message.body
예제 #8
0
 def test_create_message(self, email):
     message = create_message(f"Test_email_{email}", email)
     assert isinstance(message, Message)
     assert email in message.subject
     assert message.recipients == [email]
예제 #9
0
def send_messages_on_order_confirmation(order, items, total_sum):
    """Send emails to customer and sellers after the order was confirmed by customer."""
    shop_emails = dict()
    customer_order = list()

    for item in items:
        good: ProductInfo = ProductInfo.query.filter_by(
            product=item.product, shop=item.shop_id).first()
        good.quantity -= item.quantity
        db.session.commit()

        email = good.shop_rel.shop_manager.email

        if email not in shop_emails:
            shop_emails[email] = []

        ordered_goods = dict(
            seller=item.shop_name,
            prod=good.name,
            price=item.price,
            qty=item.quantity,
            disc=item.discount,
            disc_price=item.discount_price,
            overall=item.agg_price,
        )
        shop_emails[email].append(ordered_goods)
        customer_order.append(ordered_goods)

    order.status = OrderStateChoices.confirmed.name
    order._last_change = datetime.utcnow()
    db.session.commit()

    customer_address: Contact = Contact.query.filter_by(
        user=current_user.id).first()

    for email in shop_emails:
        message = create_message(f"Заказ №{order.id}", email)
        message.html = ("<b>Заказанные позиции:</b><br>"
                        "<table border='1'>"
                        "<tr>"
                        "<th>Продавец</th>"
                        "<th>Товар</th>"
                        "<th>Цена за 1 ед.</th>"
                        "<th>Кол-во</th>"
                        "<th>Скидка</th>"
                        "<th>Цена со скидкой</th>"
                        "<th>Cтоимость</th>"
                        "</tr>")
        for item in shop_emails[email]:
            message.html += (f"<tr>"
                             f"<td>{item['seller']}</td>"
                             f"<td>{item['prod']}</td>"
                             f"<td>{item['price']}</td>"
                             f"<td>{item['qty']}</td>"
                             f"<td>{item['disc']}</td>"
                             f"<td>{item['disc_price']}</td>"
                             f"<td>{item['overall']}</td>"
                             f"</tr>")
        message.html += "</table><br>"
        message.html += (
            f"<b>Покупатель:</b> "
            f"{order.customer.last_name} {order.customer.first_name}<br>")

        if customer_address:
            message.html += (
                f"<br><b>Адрес доставки:</b>"
                f"<b>Индекс</b>: {customer_address.zip_code} <br>"
                f"<b>Город</b>: {customer_address.city} <br>"
                f"<b>Улица</b>: {customer_address.street} <br>"
                f"<b>Дом</b>: {customer_address.house} <br>"
                f"<b>Корпус</b>: {customer_address.structure} <br>"
                f"<b>Строение</b>: {customer_address.building} <br>"
                f"<b>Квартира</b>: {customer_address.apartment} <br>"
                f"<b>Телефон</b>: {customer_address.phone} <br>"
                f"<br>")
        else:
            message.html += f"<br><b>Адрес доставки:</b> {customer_address}"
        send_message(message)

    message = create_message(f"Заказ №{order.id}", current_user.email)
    message.html = ("<b>Заказанные позиции:</b><br>"
                    "<table border='1'>"
                    "<tr>"
                    "<th>Продавец</th>"
                    "<th>Товар</th>"
                    "<th>Цена за 1 ед.</th>"
                    "<th>Кол-во</th>"
                    "<th>Скидка</th>"
                    "<th>Цена со скидкой</th>"
                    "<th>Cтоимость</th>"
                    "</tr>")
    for item in customer_order:
        message.html += (f"<tr>"
                         f"<td>{item['seller']}</td>"
                         f"<td>{item['prod']}</td>"
                         f"<td>{item['price']}</td>"
                         f"<td>{item['qty']}</td>"
                         f"<td>{item['disc']}</td>"
                         f"<td>{item['disc_price']}</td>"
                         f"<td>{item['overall']}</td>"
                         f"</tr>")
    message.html += "</table><br>"
    message.html += (
        f"<br><b>Общая стоимость заказа:</b> {price_to_str(total_sum)} руб.<br>"
    )
    if customer_address:
        message.html += (f"<br><b>Адрес доставки:</b>"
                         f"<b>Индекс</b>: {customer_address.zip_code} <br>"
                         f"<b>Город</b>: {customer_address.city} <br>"
                         f"<b>Улица</b>: {customer_address.street} <br>"
                         f"<b>Дом</b>: {customer_address.house} <br>"
                         f"<b>Корпус</b>: {customer_address.structure} <br>"
                         f"<b>Строение</b>: {customer_address.building} <br>"
                         f"<b>Квартира</b>: {customer_address.apartment} <br>"
                         f"<b>Телефон</b>: {customer_address.phone} <br>"
                         f"<br>")
    else:
        message.html += f"<br><b>Адрес доставки:</b> {customer_address}"

    send_message(message)