示例#1
0
def add_to_cart(id, amount):
    cart, _ = prepare()

    # Если требуемое количество неположительно, то выдать ошибку 404
    if amount <= 0:
        abort(404)

    # Выполнить поиск требуемого блюда в БД
    meal = db.session.query(Meal).get_or_404(id)

    # Добавить блюдо в корзину
    cart.append(
        dict(
            id=meal.id,
            title=meal.title,
            price=meal.price,
            amount=amount
        )
    )

    # Записать результат в сессию
    session['cart'] = cart

    # Переход на предыдущую страницу
    return redirect(request.referrer or url_for('main.index'))
示例#2
0
def render_account():
    _, kwargs = prepare()

    # Получить число заказов на странице
    per_page = current_app.config['ORDERS_PER_PAGE'] or 1

    # Получить число заказов на странице
    page = request.args.get(get_page_parameter(), type=int, default=1)
    offset = (page - 1) * per_page

    # Выбрать все заказы для текущего пользователя
    orders = db.session.query(Order).filter(
        Order.user_id == current_user.id
    ).order_by(Order.date.desc()).all()
    kwargs['orders'] = orders[offset:offset + per_page]

    # Создать пажинатор
    pagination = Pagination(
        page=page,
        total=len(orders),
        per_page=per_page,
        offset=offset,
        record_name='orders',
        bs_version=4
    )
    kwargs['pagination'] = pagination

    return render_template('account.html', **kwargs)
示例#3
0
def index():
    _, kwargs = prepare()

    # Построить словарь с разделением по категориям
    categorized = OrderedDict()

    categories = db.session.query(Category).order_by(Category.title).all()
    for category in categories:
        # Запросить 3 рандомных блюда по данной категории
        # и отсортировать их по имени
        meals = sorted(
            db.session.query(Meal).filter(
                Meal.category == category
            ).order_by(func.random()).limit(3),
            key=lambda item: item.title
        )
        # Добавить список выбранных блюд в словарь.
        categorized[
            CategoryKey(
                id=category.id,
                title=category.title
            )
        ] = meals

        kwargs['categorized'] = categorized

    return render_template('main.html', **kwargs)
示例#4
0
def render_category(id):
    _, kwargs = prepare()

    # Получить категорию по индексу
    kwargs['category'] = db.session.query(Category).get_or_404(id)

    # Получить отсортированный список блюд данной категории
    kwargs['meals'] = db.session.query(Meal).filter(
        Meal.category_id == id
    ).order_by(Meal.title)

    return render_template('category.html', **kwargs)
示例#5
0
def remove_from_cart(position):
    cart, _ = prepare()

    if position <= 0 or position > len(cart):
        abort(404)

    del cart[position - 1]
    session['cart'] = cart

    flash("Блюдо удалено из корзины", 'warning')

    return redirect(url_for('main.render_cart'))
示例#6
0
def register():
    _, kwargs = prepare()

    # Создать форму для регистрации
    form = RegistrationForm()
    if form.validate_on_submit():
        # Создать нового пользователя
        # noinspection PyArgumentList
        user = User(email=form.email.data)
        user.password = form.password.data

        db.session.add(user)
        db.session.commit()

        flash("Спасибо за регистрацию", 'info')
        return redirect(url_for('auth.login'))

    kwargs['form'] = form

    return render_template('register.html', **kwargs)
示例#7
0
def login():
    _, kwargs = prepare()

    # Создать форму для входа
    form = LoginForm()
    if form.validate_on_submit():
        # Найти пользователя с заданной электронной почтой
        user = db.session.query(User).filter(
            User.email == form.email.data
        ).first()
        # Если пользователь найден и проверен пароль, выполнить вход
        if user is not None and user.verify_password(form.password.data):
            login_user(user)
            # Получить адрес страницы для перехода
            next_url = session.get('next_url', url_for('main.index'))

            return redirect(request.args.get('next') or next_url)

        flash("Неверные электропочта или пароль", 'error')

    kwargs['form'] = form

    return render_template('login.html', **kwargs)
示例#8
0
def render_error(message, code):
    _, kwargs = prepare()

    kwargs['message'] = message
    return render_template('error.html', **kwargs), code
示例#9
0
def render_cart():
    cart, kwargs = prepare()

    form = OrderForm()
    kwargs['form'] = form

    if form.validate_on_submit():
        # Создать объект заказа
        order = Order(
            date=datetime.now(),
            total=float(form.order_total.data),
            name=form.name.data,
            address=form.address.data,
            email=form.email.data,
            phone=form.phone.data,
            user=current_user,
        )
        db.session.add(order)

        # Получить данные корзины из формы
        form_cart = json.loads(
            zlib.decompress(
                base64.b64decode(
                    form.order_cart.data.encode('utf-8')
                )
            ).decode('utf-8')
        )

        if not form_cart:
            db.session.rollback()
            abort(404)

        # Выбрать сведения о блюдах из базы данных
        meals = db.session.query(Meal).filter(
            Meal.id.in_(set(item[0] for item in form_cart))
        ).all()

        # Создать записи о позициях заказа
        for item in form_cart:
            meal = next(
                (m for m in meals if m.id == item[0]),
                None
            )

            if not meal:
                db.session.rollback()
                abort(404)

            position = OrderPosition(
                order=order,
                meal=meal,
                amount=item[1]
            )
            db.session.add(position)

        db.session.commit()
        session['cart'] = []

        return redirect(url_for('main.render_ordered'))

    return render_template('cart.html', **kwargs)