async def basket_add(product_id): product = db_session.query(Product).get(product_id) if not product: abort(404) product_id = str(product_id) if 'basket' not in session: session['basket'] = {product_id: 1} else: if session['basket']: first_product = db_session.query(Product).get( int(list(session['basket'].keys())[0])) if product.restaurant.id != first_product.restaurant.id: return 'not ok' if product_id in session['basket']: session['basket'][product_id] += 1 else: session['basket'][product_id] = 1 session.modified = True return redirect( request.referrer or url_for('restaurant', restaurant_id=product.restaurant.id))
async def courier_new(): restaurant_id = request.args.get('restaurant') if not restaurant_id: return redirect(url_for('home')) restaurant = db_session.query(Restaurant).get(restaurant_id) if request.method == 'POST': form = CourierRegisterForm(await request.form) if form.validate(): courier = Courier(vk_id=form.vk_id.data, restaurant=restaurant) db_session.add(courier) db_session.commit() return redirect(url_for('courier.courier_finish')) return await render_template('courier_new.html', title='Стать курьером', logged_in=logged_in(), basket_len=basket_len(), form=form, restaurant=restaurant) form = CourierRegisterForm() return await render_template('courier_new.html', title='Стать курьером', logged_in=logged_in(), basket_len=basket_len(), form=form, restaurant=restaurant)
async def orders(): if request.method == 'POST': form = OrdersReceiveForm(await request.form) if form.phone_number.data.startswith('8'): form.phone_number.data = '+7' + form.phone_number.data[1:] if form.validate(): customer = db_session.query(Customer).filter( Customer.phone_number == form.phone_number.data).first() if not customer: return await orders_template( message='По этому номеру не было сделано ни одного заказа', form=form) orders = customer.orders ready_orders = [ order for order in orders if order.state == 'Выполнен' ] not_ready_orders = [ order for order in orders if order.state != 'Выполнен' ] return await orders_template(form=form, ready_orders=ready_orders, not_ready_orders=not_ready_orders) form = OrdersReceiveForm() ready_orders = list() not_ready_orders = list() if 'phone_number' in session: form.phone_number.data = session['phone_number'] orders = db_session.query(Customer).filter( Customer.phone_number == form.phone_number.data).first().orders ready_orders = [order for order in orders if order.state == 'Выполнен'] not_ready_orders = [ order for order in orders if order.state != 'Выполнен' ] return await orders_template(form=form, ready_orders=ready_orders, not_ready_orders=not_ready_orders)
async def basket(): if 'basket' not in session: session['basket'] = dict() products = list() for product_id, count in session['basket'].items(): products.append((db_session.query(Product).get(product_id), count)) return await render_template('basket.html', title='Корзина', products=products, basket_len=basket_len(), logged_in=logged_in())
async def menu_remove(product_id): if not logged_in(): return redirect(url_for('login')) product = db_session.query(Product).get(product_id) if not product: abort(404) if product.restaurant.id != get_current_restaurant().id: abort(403) db_session.delete(product) db_session.commit() return redirect(url_for('restaurant', restaurant_id=product.restaurant.id))
async def order_handle(order_id, method): if not logged_in(): return redirect(url_for('login')) if method not in ('upgrade', 'downgrade'): return 'not ok' order = db_session.query(Order).get(order_id) if not order: return 'not ok' restaurant = get_current_restaurant() if order.restaurant.id != restaurant.id: return 'not ok' order_stages = { 'upgrade': { 'В обработке': 'Готовится', 'Готовится': 'Доставляется', 'Доставляется': 'Доставляется', }, 'downgrade': { 'Доставляется': 'Готовится', 'Готовится': 'В обработке', 'В обработке': 'В обработке' } } order.state = order_stages[method][order.state] db_session.merge(order) db_session.commit() return redirect(request.referrer or url_for('order.restaurant_orders'))
async def order_make(): if 'basket' not in session or not session['basket']: return redirect(url_for('home')) if request.method == 'POST': form = OrderForm(await request.form) if form.phone_number.data.startswith('8'): form.phone_number.data = '+7' + form.phone_number.data[1:] if form.validate(): first_product = db_session.query(Product).get( int(list(session['basket'].keys())[0])) restaurant = first_product.restaurant customer_future = asyncio.ensure_future( get_toponym(' '.join( (form.address_city.data, form.address_street.data, form.address_house.data)))) restaurant_future = asyncio.ensure_future( get_toponym(restaurant.address)) await asyncio.wait([customer_future, restaurant_future]) customer_toponym = customer_future.result() restaurant_toponym = restaurant_future.result() if not customer_toponym or not restaurant_toponym: return await make_order_template( form=form, message= 'Не удалось определить адрес заказчика или ресторана') if restaurant.serve_area < toponyms_distance( customer_toponym, restaurant_toponym): return await make_order_template( form=form, message='Вы находитесь вне зоны обслуживания ресторана') customer = db_session.query(Customer).filter( Customer.phone_number == form.phone_number.data).first() if not customer: customer = Customer(phone_number=form.phone_number.data) order = Order(customer=customer, destination=customer_toponym['metaDataProperty'] ['GeocoderMetaData']['text'] + ', кв {}'.format(form.address_apartment.data), restaurant=restaurant, description=form.description.data) for product_id in session['basket']: order_item = OrderItem(count=session['basket'][product_id], product_id=product_id, order=order) db_session.add(order_item) db_session.commit() asyncio.create_task(courier_finding(order.id)) session['basket'].clear() session['phone_number'] = form.phone_number.data session.modified = True return await make_order_template( form=form, success=True, message='Заказ отправлен на обработку.' + ' Наш оператор свяжется с вами для подтверждения заказа') return await make_order_template(form=form) form = OrderForm() return await make_order_template(form=form)