Source code for feriennet.forms.bank_statement

from __future__ import annotations

from onegov.activity import BookingPeriod, BookingPeriodCollection
from onegov.feriennet import _
from onegov.form import Form
from onegov.form.fields import UploadField
from onegov.form.validators import WhitelistedMimeType, FileSizeLimit
from wtforms.fields import SelectField
from wtforms.validators import InputRequired, DataRequired, ValidationError


from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from wtforms.fields.choices import _Choice


[docs] class BankStatementImportForm(Form):
[docs] period = SelectField( label=_('Period'), validators=[ InputRequired() ], default='0xdeadbeef')
[docs] xml = UploadField( label=_('ISO 20022 XML'), validators=[ DataRequired(), WhitelistedMimeType({'text/plain', 'text/xml', 'application/xml'}), FileSizeLimit(10 * 1024 * 1024) ], render_kw={'force_simple': True} )
@property
[docs] def period_choices(self) -> list[_Choice]: periods = BookingPeriodCollection(self.request.session) q = periods.query() q = q.with_entities(BookingPeriod.id, BookingPeriod.title) q = q.order_by( BookingPeriod.active.desc(), BookingPeriod.prebooking_start.desc() ) return [(period_id.hex, title) for period_id, title in q]
[docs] def load_periods(self) -> None: self.period.choices = self.period_choices if self.period.data == '0xdeadbeef': self.period.data = self.period.choices[0][0]
[docs] def on_request(self) -> None: self.load_periods()
[docs] def validate_period(self, field: SelectField) -> None: periods = BookingPeriodCollection(self.request.session) period = periods.by_id(field.data) assert period is not None if not period.finalized: raise ValidationError( 'The billing of this period has not been finalized yet' )