diff options
Diffstat (limited to 'budget')
| -rw-r--r-- | budget/forms.py | 15 | ||||
| -rw-r--r-- | budget/models.py | 2 | ||||
| -rw-r--r-- | budget/templates/layout.html | 15 | ||||
| -rw-r--r-- | budget/templates/list_bills.html | 53 | ||||
| -rw-r--r-- | budget/web.py | 18 |
5 files changed, 66 insertions, 37 deletions
diff --git a/budget/forms.py b/budget/forms.py index d363ad5..367be94 100644 --- a/budget/forms.py +++ b/budget/forms.py @@ -1,5 +1,5 @@ from flaskext.wtf import * -from models import Project +from models import Project, Person # define forms class CreationForm(Form): @@ -33,3 +33,16 @@ class BillForm(Form): validators=[Required()]) submit = SubmitField("Add the bill") + +class MemberForm(Form): + def __init__(self, project, *args, **kwargs): + super(MemberForm, self).__init__(*args, **kwargs) + self.project = project + + name = TextField("Name", validators=[Required()]) + submit = SubmitField("Add a member") + + def validate_name(form, field): + if Person.query.filter( + Person.name == field.data and Person.project == self.project).all(): + raise ValidationError("This project already have this member") diff --git a/budget/models.py b/budget/models.py index 27e30b3..c0d6db2 100644 --- a/budget/models.py +++ b/budget/models.py @@ -22,7 +22,7 @@ class Person(db.Model): bills = db.relationship("Bill", backref="payer") name = db.Column(db.UnicodeText) - status = db.Column(db.Boolean) + # activated = db.Column(db.Boolean, default=True) def __repr__(self): return "<Person %s for project %s>" % (self.name, self.project.name) diff --git a/budget/templates/layout.html b/budget/templates/layout.html index 19c0e59..79240b3 100644 --- a/budget/templates/layout.html +++ b/budget/templates/layout.html @@ -16,16 +16,11 @@ </div> </div> <hr> - <div id="content" class="span-24"> - - {% for message in get_flashed_messages() %} - <div class=info>{{ message }}</div> - {% endfor %} - - {% block content %} - {% endblock %} - - </div> + {% for message in get_flashed_messages() %} + <div class=info>{{ message }}</div> + {% endfor %} + {% block content %} + {% endblock %} <div id="footer"></div> </div> </body> diff --git a/budget/templates/list_bills.html b/budget/templates/list_bills.html index d0f0c41..145f4f4 100644 --- a/budget/templates/list_bills.html +++ b/budget/templates/list_bills.html @@ -1,26 +1,37 @@ {% extends "layout.html" %} {% block content %} -{% if bills.count() > 0 %} -<table> - <thead><tr><th>When ?</th><th>Who paid?</th><th>for what ?</th><th>Owers</th><th>How much ?</th><th>Actions</th></tr></thead> -<tbody> -{% for bill in bills %} -<tr class="{{ loop.cycle("odd", "even") }}"> - <td>{{ bill.date }}</td> - <td>{{ bill.payer }}</td> - <td>{{ bill.what }}</td> - <td>{% for ower in bill.owers %}{{ ower.name }} {% endfor %}</td> - <td>{{ bill.amount }} ({{ bill.pay_each() }} each)</td> - <td><a href="{{ url_for("delete_bill", bill_id=bill.id, project_id=project.id) }}">delete</a></td> -</tr> -{% endfor %} -</tbody> -</table> +<div id="leftmenu" class="span-6"> + <ul> + {% for member in project.members %} + <li>{{ member.name }}</li> + {% endfor %} + </ul> + {% set form=member_form %} + {% include "member_form.html" %} +</div> +<div id="content" class="span-18 last"> + {% if bills.count() > 0 %} + <table> + <thead><tr><th>When ?</th><th>Who paid?</th><th>for what ?</th><th>Owers</th><th>How much ?</th><th>Actions</th></tr></thead> + <tbody> + {% for bill in bills %} + <tr class="{{ loop.cycle("odd", "even") }}"> + <td>{{ bill.date }}</td> + <td>{{ bill.payer }}</td> + <td>{{ bill.what }}</td> + <td>{% for ower in bill.owers %}{{ ower.name }} {% endfor %}</td> + <td>{{ bill.amount }} ({{ bill.pay_each() }} each)</td> + <td><a href="{{ url_for("delete_bill", bill_id=bill.id, project_id=project.id) }}">delete</a></td> + </tr> + {% endfor %} + </tbody> + </table> -<a class="awesome large green button fleft" href="{{ url_for("compute_bills", project_id=project.id) }}">Compute bills</a> -<p> Periodically (probably at the end of each month, you can compute the balance of each people, in order to reset all the debts. You can also let this "as-is" and try to find a good balance, that's up to you</p> + <a class="awesome large green button fleft" href="{{ url_for("compute_bills", project_id=project.id) }}">Compute bills</a> + <p> Periodically (probably at the end of each month, you can compute the balance of each people, in order to reset all the debts. You can also let this "as-is" and try to find a good balance, that's up to you</p> -{% else %} -<p>Nothing to list yet. You probably want to <a href="{{ url_for("add_bill", project_id=project.id) }}">add a bill</a> ?</p> -{% endif %} + {% else %} + <p>Nothing to list yet. You probably want to <a href="{{ url_for("add_bill", project_id=project.id) }}">add a bill</a> ?</p> + {% endif %} +</div> {% endblock %} diff --git a/budget/web.py b/budget/web.py index d49280c..ddf0b1e 100644 --- a/budget/web.py +++ b/budget/web.py @@ -2,7 +2,7 @@ from flask import Flask, session, request, redirect, url_for, render_template # local modules from models import db, Project, Person, Bill -from forms import CreationForm, AuthenticationForm, BillForm +from forms import CreationForm, AuthenticationForm, BillForm, MemberForm from utils import get_billform_for, requires_auth # create the application, initialize stuff @@ -26,7 +26,6 @@ def authenticate(project_id, redirect_url=None): else: session[project_id] = form.password.data session.update() - from ipdb import set_trace; set_trace() return redirect(redirect_url) return render_template("authenticate.html", form=form, project=project) @@ -38,7 +37,6 @@ def home(): @app.route("/create", methods=["GET", "POST"]) def create_project(): - from ipdb import set_trace; set_trace() form = CreationForm() if request.method == "GET" and 'project_id' in request.values: form.name.data = request.values['project_id'] @@ -71,7 +69,19 @@ def list_bills(project): # FIXME filter to only get the bills for this particular project bills = Bill.query.order_by(Bill.id.asc()) return render_template("list_bills.html", - bills=bills, project=project) + bills=bills, project=project, member_form=MemberForm(project)) + +@app.route("/<string:project_id>/members/add", methods=["GET", "POST"]) +@requires_auth +def add_member(project): + # FIXME manage form errors on the list_bills page + form = MemberForm(project) + if request.method == "POST": + if form.validate(): + db.session.add(Person(name=form.name.data, project=project)) + db.session.commit() + return redirect(url_for("list_bills", project_id=project.id)) + return render_template("add_member.html", form=form, project=project) @app.route("/<string:project_id>/add", methods=["GET", "POST"]) @requires_auth |
