aboutsummaryrefslogtreecommitdiffstats
path: root/src/expense/tracker/create.py
blob: c6f83080000bcfa2a6de721644b892532b7c4a30 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from datetime import date
from flask import (
    redirect,
    render_template,
    url_for,
)
from flask_login import login_required, current_user

from .. import db

from flask_wtf import FlaskForm
from wtforms import (
    DateField,
    TextAreaField,
    DecimalField,
    SubmitField,
    SelectField,
)
from wtforms.widgets import NumberInput
from wtforms.validators import InputRequired

from ..model import Category, Expense
from .blueprint import tracker


class CreateForm(FlaskForm):
    """
    The Form to create a entry
    """
    description = TextAreaField()
    date = DateField(
        validators=[InputRequired()], format="%Y-%m-%d", default=date.today
    )
    amount = DecimalField(places=2, validators=[InputRequired()], widget=NumberInput(), default=0)  # type: ignore
    category = SelectField(coerce=int)  # type: ignore
    submit = SubmitField()

    def __init__(self, **kwargs) -> None:
        super().__init__(**kwargs)
        self.category.choices = [(cat.id, cat.name) for cat in current_user.categories]  # type: ignore


@tracker.route("/create", methods=["GET", "POST"])
@login_required
def create():
    """The view to handle new entry"""
    form = CreateForm()
    if form.validate_on_submit():
        cat = db.session.scalars(
            db.select(Category).where(Category.id == form.category.data)
        ).one()
        expense = Expense(
            description=form.description.data,
            date=form.date.data,
            amount=form.amount.data,
            category=cat,
        )  # type: ignore
        current_user.expenses.append(expense)  # type: ignore
        db.session.commit()
        return redirect(url_for("index"))
    return render_template("tracker/create.html", form=form)