diff options
| author | Alexis Metaireau <alexis@notmyidea.org> | 2011-09-14 22:03:18 +0200 |
|---|---|---|
| committer | Alexis Metaireau <alexis@notmyidea.org> | 2011-09-14 22:03:18 +0200 |
| commit | 20ab40690d74befcd8fc75f24f301759840bf43a (patch) | |
| tree | d92319ad0f5cc6b6b506f8c918fd30549eb81b69 /budget | |
| parent | 5721be1d15ba02e47f98fb9a487248adb297a082 (diff) | |
| download | ihatemoney-mirror-20ab40690d74befcd8fc75f24f301759840bf43a.zip ihatemoney-mirror-20ab40690d74befcd8fc75f24f301759840bf43a.tar.gz ihatemoney-mirror-20ab40690d74befcd8fc75f24f301759840bf43a.tar.bz2 | |
Provide a way to edit a project. Fix #17
Diffstat (limited to 'budget')
| -rw-r--r-- | budget/forms.py | 22 | ||||
| -rw-r--r-- | budget/templates/create_project.html | 9 | ||||
| -rw-r--r-- | budget/templates/forms.html | 11 | ||||
| -rw-r--r-- | budget/templates/layout.html | 2 | ||||
| -rw-r--r-- | budget/tests.py | 28 | ||||
| -rw-r--r-- | budget/web.py | 20 |
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 |
