summaryrefslogtreecommitdiff
path: root/app/forms.py
blob: 6c5782a594937d0cfb2250bb24b68bcc4b4a06af (plain)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- encoding: utf-8 -*-
import flask
from flask.ext.wtf import Form as _Form
from wtforms.fields import DateField, IntegerField, StringField, HiddenField, PasswordField
from wtforms import validators as v
from wtforms import fields, ValidationError

from wtforms.ext.sqlalchemy.fields import QuerySelectField
from wtforms.ext.i18n.form import Form as i18nForm

import datetime

from . import app
from . import login

today = datetime.date.today

@app.template_test('hidden')
def is_hidden_field(f):
    return isinstance(f, HiddenField)

class DecimalField(fields.DecimalField):
    def process_formdata(self, valuelist):
        if valuelist:
            value = valuelist[0].replace(',','.')
            super(DecimalField, self).process_formdata([value])

req = [v.input_required()]

class Form(_Form, i18nForm):
    # docs say LOCALES, code says LANGUAGES ... use both :)
    LANGUAGES = LOCALES = ['de_DE', 'de']

    def __init__ (self, *args, **kwargs):
        self._msg = kwargs.pop('flash', u"Fehler im Formular!")
        _Form.__init__(self, *args, **kwargs)

    def flash(self):
        flask.flash(self._msg, u'error')

    def flash_validate (self):
        if not self.validate():
            self.flash()
            return False

        return True

    def validate_on_submit (self):
        return self.is_submitted() and self.flash_validate()

    def _get_translations(self):
        # use WTForms builtin translation support instead of the flask-babael
        # stuff added by flask-wtf
        # FIXME: remove this, if flask-babel is used in the app
        return i18nForm._get_translations(self)

class ExpenseForm(Form):
    date = DateField(u'Datum', req,
            format="%d.%m.%Y",
            default=lambda: today())

    expense = DecimalField(u'Betrag', req,
            description=u'EUR',
            places=2)

    description = StringField(u'Beschreibung', req)

    category = QuerySelectField(u'Kategorie',
            get_label='name')

class ConstForm(Form):
    start = DateField(u'Beginn', req,
            format='%m.%Y',
            default=lambda: today())

    end = DateField(u'Ende', req,
            format='%m.%Y',
            default=lambda: today().replace(year = today().year + 1),
            description=u'(einschließlich)')

    months = IntegerField(u'Zahlungsrythmus', req,
            description='Monate')

    expense = DecimalField(u'Betrag', req,
            description=u'EUR',
            places=2)

    description = StringField(u'Beschreibung', req)

    category = QuerySelectField(u'Kategorie',
            get_label='name')

    prev = QuerySelectField(u'Vorgänger',
            get_label='description',
            allow_blank=True)

class LoginForm(Form):
    username = StringField(u'Username', req)
    pwd = PasswordField(u'Passwort', req)

    def __init__(self, *args, **kwargs):
        Form.__init__(self,*args, **kwargs)
        self.user = None

    def validate(self):
        rv = Form.validate(self)
        if not rv:
            return False

        user = login.User.get_by(name = self.username.data)
        if user is None or not user.check_password(self.pwd.data):
            return False

        self.user = user
        return True

class ChangePwdForm(Form):
    old = PasswordField(u'Passwort', req)
    new = PasswordField(u'Neues Passwort', req + [v.EqualTo('confirm', u'Passwörter stimmen nicht überein')])
    confirm = PasswordField(u'Wdh. neues Passwort', req)

    def validate_old(self, field):
        if not login.current_user.check_password(field.data):
            raise ValidationError(u"Falsches Passwort")

    @property
    def newpwd(self):
        return self.new.data