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