Example #1
0
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))
Example #2
0
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)
Example #3
0
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)
Example #4
0
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())
Example #5
0
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))
Example #6
0
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'))
Example #7
0
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)