aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--budget/forms.py15
-rw-r--r--budget/models.py2
-rw-r--r--budget/templates/layout.html15
-rw-r--r--budget/templates/list_bills.html53
-rw-r--r--budget/web.py18
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