1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/ihatemoney_ynh.git synced 2024-09-03 19:26:15 +02:00

Provide a way to edit a project. Fix #17

This commit is contained in:
Alexis Metaireau 2011-09-14 22:03:18 +02:00
parent 5721be1d15
commit 20ab40690d
6 changed files with 73 additions and 19 deletions

View file

@ -18,16 +18,11 @@ def select_multi_checkbox(field, ul_class='', **kwargs):
return u''.join(html) return u''.join(html)
class ProjectForm(Form): class EditProjectForm(Form):
name = TextField("Project name", validators=[Required()]) name = TextField("Project name", validators=[Required()])
id = TextField("Project identifier", validators=[Required()]) password = TextField("Password", validators=[Required()])
password = PasswordField("Password", validators=[Required()])
contact_email = TextField("Email", validators=[Required(), Email()]) contact_email = TextField("Email", validators=[Required(), Email()])
submit = SubmitField("Create the project") submit = SubmitField("Edit the project")
def validate_id(form, field):
if Project.query.get(field.data):
raise ValidationError("This project id is already used")
def save(self): def save(self):
"""Create a new project with the information given by this form. """Create a new project with the information given by this form.
@ -42,12 +37,21 @@ class ProjectForm(Form):
def update(self, project): def update(self, project):
"""Update the project with the information from the form""" """Update the project with the information from the form"""
project.name = self.name.data project.name = self.name.data
project.id = self.id.data
project.password = self.password.data project.password = self.password.data
project.contact_email = self.contact_email.data project.contact_email = self.contact_email.data
return project 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): class AuthenticationForm(Form):
id = TextField("Project identifier", validators=[Required()]) id = TextField("Project identifier", validators=[Required()])

View file

@ -2,10 +2,7 @@
{% block content %} {% block content %}
<h2>Create a new project</h2> <h2>Create a new project</h2>
<div class="uniForm"> <form method="post">
<form method="post" class="container span-24 add-bill">
{{ forms.create_project(form) }} {{ forms.create_project(form) }}
</form> </form>
</div>
{% endblock %} {% endblock %}

View file

@ -52,6 +52,17 @@
{% endmacro %} {% 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) %} {% macro add_bill(form, edit=False) %}
<fieldset> <fieldset>

View file

@ -52,7 +52,7 @@
<li class="menu"> <li class="menu">
<a href="#" class="menu"><strong>{{ g.project.name }}</strong> options</a> <a href="#" class="menu"><strong>{{ g.project.name }}</strong> options</a>
<ul class="menu-dropdown" style="display: none; "> <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> <li class="divider"></li>
{% for id, name in session['projects'] %} {% for id, name in session['projects'] %}
{% if id != g.project.id %} {% if id != g.project.id %}

View file

@ -30,9 +30,8 @@ class TestCase(unittest.TestCase):
def login(self, project, password=None, test_client=None): def login(self, project, password=None, test_client=None):
password = password or project 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) id=project, password=password), follow_redirects=True)
def post_project(self, name): def post_project(self, name):
@ -307,6 +306,31 @@ class BudgetTestCase(TestCase):
balance = models.Project.query.get("raclette").get_balance() balance = models.Project.query.get("raclette").get_balance()
self.assertEqual(set(balance.values()), set([19.0, -19.0])) 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__": if __name__ == "__main__":
unittest.main() unittest.main()

View file

@ -7,7 +7,7 @@ import werkzeug
# local modules # local modules
from models import db, Project, Person, Bill from models import db, Project, Person, Bill
from forms import (ProjectForm, AuthenticationForm, BillForm, MemberForm, from forms import (ProjectForm, AuthenticationForm, BillForm, MemberForm,
InviteForm, CreateArchiveForm) InviteForm, CreateArchiveForm, EditProjectForm)
from utils import get_billform_for, Redirect303 from utils import get_billform_for, Redirect303
""" """
@ -130,6 +130,24 @@ def create_project():
return render_template("create_project.html", form=form) 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") @main.route("/exit")
def exit(): def exit():
# delete the session # delete the session