# -*- coding: utf-8 -*- from . import Blueprint, flash, db, \ current_user, login_required, \ assert_authorisation, templated, redirect, request, \ today from ..model import Category, ConstExpense from .. import forms as F from sqlalchemy import sql from functools import partial mod = Blueprint('consts', __name__) assert_authorisation = partial(assert_authorisation, ConstExpense.get) # # Form # class ConstForm(F.Form): start = F.DateField(u'Beginn', F.req, format='%m.%Y', default=lambda: today()) end = F.DateField(u'Ende', F.req, format='%m.%Y', default=lambda: today().replace(year = today().year + 1), description=u'(einschließlich)') months = F.IntegerField(u'Zahlungsrythmus', F.req, description='Monate') expense = F.DecimalField(u'Betrag', F.req, description=u'EUR', places=2) description = F.StringField(u'Beschreibung', F.req) category = F.QuerySelectField(u'Kategorie', get_label='name') prev = F.QuerySelectField(u'Vorgänger', get_label='description', allow_blank=True) def __init__(self, cur=None, obj=None): obj = cur if obj is None else obj super(ConstForm, self).__init__(obj=obj) self.category.query = Category.of(current_user).order_by(Category.name) # init prev_list CE = ConstExpense filter = (CE.next == None) if cur and cur.id is not None: # not empty filter = sql.or_(CE.next == cur, filter) filter = sql.and_(filter, CE.id != cur.id) self.prev.query = CE.of(current_user).filter(filter).order_by(CE.description) # # Views # @mod.route('/') @login_required @templated def list (): """List all constant expenses.""" d = today() expenses = ConstExpense.of(current_user).order_by(ConstExpense.description).all() current = [] old = [] future = [] for e in expenses: if e.start <= d: if e.end >= d: current.append(e) else: old.append(e) else: future.append(e) return { 'current': current, 'old': old, 'future': future } @mod.route('/') @login_required @assert_authorisation('id') @templated def show(id): """Show a specific constant expense.""" return { 'exp': ConstExpense.get(id) } @mod.route('/edit/', methods=('GET', 'POST')) @login_required @assert_authorisation('id') @templated def edit(id): """Edit a specific constant expense. This includes deletion.""" exp = ConstExpense.get(id) form = ConstForm(exp) if form.is_submitted(): if 'deleteB' in request.form: db.session.delete(exp) db.session.commit() return redirect('.list') elif form.flash_validate(): # change form.populate_obj(exp) db.session.commit() flash(u"Eintrag geändert.") return redirect('.show', id = id) return { 'form': form } @mod.route('/add/', methods=('GET', 'POST')) @login_required @templated def add(): """Add a new constant expense.""" exp = ConstExpense() form = ConstForm() if form.validate_on_submit(): form.populate_obj(exp) exp.user = current_user db.session.add(exp) db.session.commit() flash(u"Eintrag hinzugefügt.") return redirect('.show', id = exp.id) return { 'form': form } @mod.route('/add/from/') @login_required @assert_authorisation('other') @templated('.add') def add_from(other): """Copy `other` and create a new expense based on it.""" exp = ConstExpense() # needed to initialize 'CE.next' other = ConstExpense.get(other) # get form with data from other form = ConstForm(obj = other) # replace some fields to be more meaningful start = max(form.end.data, today()) form.start.data = start form.end.data = start.replace(year = start.year + 1) if not other.next: form.prev.data = other return { 'form': form }