aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--budget/forms.py22
-rw-r--r--budget/templates/create_project.html9
-rw-r--r--budget/templates/forms.html11
-rw-r--r--budget/templates/layout.html2
-rw-r--r--budget/tests.py28
-rw-r--r--budget/web.py20
6 files changed, 73 insertions, 19 deletions
diff --git a/budget/forms.py b/budget/forms.py
index cfd5788..ceda0e7 100644
--- a/budget/forms.py
+++ b/budget/forms.py
@@ -18,16 +18,11 @@ def select_multi_checkbox(field, ul_class='', **kwargs):
return u''.join(html)
-class ProjectForm(Form):
+class EditProjectForm(Form):
name = TextField("Project name", validators=[Required()])
- id = TextField("Project identifier", validators=[Required()])
- password = PasswordField("Password", validators=[Required()])
+ password = TextField("Password", validators=[Required()])
contact_email = TextField("Email", validators=[Required(), Email()])
- submit = SubmitField("Create the project")
-
- def validate_id(form, field):
- if Project.query.get(field.data):
- raise ValidationError("This project id is already used")
+ submit = SubmitField("Edit the project")
def save(self):
"""Create a new project with the information given by this form.
@@ -42,12 +37,21 @@ class ProjectForm(Form):
def update(self, project):
"""Update the project with the information from the form"""
project.name = self.name.data
- project.id = self.id.data
project.password = self.password.data
project.contact_email = self.contact_email.data
return project
+class ProjectForm(EditProjectForm):
+ id = TextField("Project identifier", validators=[Required()])
+ password = PasswordField("Password", validators=[Required()])
+ submit = SubmitField("Create the project")
+
+ def validate_id(form, field):
+ if Project.query.get(field.data):
+ raise ValidationError("This project id is already used")
+
+
class AuthenticationForm(Form):
id = TextField("Project identifier", validators=[Required()])
diff --git a/budget/templates/create_project.html b/budget/templates/create_project.html
index 6593822..41b8fd0 100644
--- a/budget/templates/create_project.html
+++ b/budget/templates/create_project.html
@@ -2,10 +2,7 @@
{% block content %}
<h2>Create a new project</h2>
-<div class="uniForm">
- <form method="post" class="container span-24 add-bill">
- {{ forms.create_project(form) }}
- </form>
-</div>
+<form method="post">
+ {{ forms.create_project(form) }}
+</form>
{% endblock %}
-
diff --git a/budget/templates/forms.html b/budget/templates/forms.html
index b027763..f32e9fd 100644
--- a/budget/templates/forms.html
+++ b/budget/templates/forms.html
@@ -52,6 +52,17 @@
{% endmacro %}
+{% macro edit_project(form) %}
+
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {{ input(form.name) }}
+ {{ input(form.password) }}
+ {{ input(form.contact_email) }}
+ {{ submit(form.submit) }}
+
+{% endmacro %}
+
{% macro add_bill(form, edit=False) %}
<fieldset>
diff --git a/budget/templates/layout.html b/budget/templates/layout.html
index d79c39f..8858150 100644
--- a/budget/templates/layout.html
+++ b/budget/templates/layout.html
@@ -52,7 +52,7 @@
<li class="menu">
<a href="#" class="menu"><strong>{{ g.project.name }}</strong> options</a>
<ul class="menu-dropdown" style="display: none; ">
- <li><a href="">Project settings</a></li>
+ <li><a href="{{ url_for(".edit_project") }}">Project settings</a></li>
<li class="divider"></li>
{% for id, name in session['projects'] %}
{% if id != g.project.id %}
diff --git a/budget/tests.py b/budget/tests.py
index 96ed042..7296803 100644
--- a/budget/tests.py
+++ b/budget/tests.py
@@ -30,9 +30,8 @@ class TestCase(unittest.TestCase):
def login(self, project, password=None, test_client=None):
password = password or project
- test_client = test_client or self.app
- return test_client.post('/authenticate', data=dict(
+ return self.app.post('/authenticate', data=dict(
id=project, password=password), follow_redirects=True)
def post_project(self, name):
@@ -307,6 +306,31 @@ class BudgetTestCase(TestCase):
balance = models.Project.query.get("raclette").get_balance()
self.assertEqual(set(balance.values()), set([19.0, -19.0]))
+ def test_edit_project(self):
+ # A project should be editable
+
+ self.post_project("raclette")
+ new_data = {
+ 'name': 'Super raclette party!',
+ 'contact_email': 'alexis@notmyidea.org',
+ 'password': 'didoudida'
+ }
+
+ resp = self.app.post("/raclette/edit", data=new_data,
+ follow_redirects=True)
+ self.assertEqual(resp.status_code, 200)
+ project = models.Project.query.get("raclette")
+
+ for key, value in new_data.items():
+ self.assertEqual(getattr(project, key), value, key)
+
+ # Editing a project with a wrong email address should fail
+ new_data['contact_email'] = 'wrong_email'
+
+ resp = self.app.post("/raclette/edit", data=new_data,
+ follow_redirects=True)
+ self.assertIn("Invalid email address", resp.data)
+
if __name__ == "__main__":
unittest.main()
diff --git a/budget/web.py b/budget/web.py
index 7376135..250359d 100644
--- a/budget/web.py
+++ b/budget/web.py
@@ -7,7 +7,7 @@ import werkzeug
# local modules
from models import db, Project, Person, Bill
from forms import (ProjectForm, AuthenticationForm, BillForm, MemberForm,
- InviteForm, CreateArchiveForm)
+ InviteForm, CreateArchiveForm, EditProjectForm)
from utils import get_billform_for, Redirect303
"""
@@ -130,6 +130,24 @@ def create_project():
return render_template("create_project.html", form=form)
+@main.route("/<project_id>/edit", methods=["GET", "POST"])
+def edit_project():
+ form = EditProjectForm()
+ if request.method == "POST":
+ if form.validate():
+ project = form.update(g.project)
+ db.session.commit()
+ session[project.id] = project.password
+
+ return redirect(url_for(".list_bills"))
+ else:
+ form.name.data = g.project.name
+ form.password.data = g.project.password
+ form.contact_email.data = g.project.contact_email
+
+ return render_template("edit_project.html", form=form)
+
+
@main.route("/exit")
def exit():
# delete the session