mirror of
https://github.com/YunoHost-Apps/ihatemoney_ynh.git
synced 2024-09-03 19:26:15 +02:00
88cd2f8675
- Do not display anymore the identifier field in home. - Let the user enter the id if the slug generated from project name already exists as a project id. - Moved get_billform_for from 'utils' to 'forms', to avoid issue (was 'from forms import ...' into utils, and 'from utils import ...' into forms, which causeed an error).
134 lines
5.1 KiB
Python
134 lines
5.1 KiB
Python
from flaskext.wtf import *
|
|
from wtforms.widgets import html_params
|
|
from models import Project, Person, Bill
|
|
from datetime import datetime
|
|
from jinja2 import Markup
|
|
from utils import slugify
|
|
|
|
|
|
def select_multi_checkbox(field, ul_class='', **kwargs):
|
|
kwargs.setdefault('type', 'checkbox')
|
|
field_id = kwargs.pop('id', field.id)
|
|
html = [u'<ul %s>' % html_params(id=field_id, class_="inputs-list")]
|
|
for value, label, checked in field.iter_choices():
|
|
choice_id = u'%s-%s' % (field_id, value)
|
|
options = dict(kwargs, name=field.name, value=value, id=choice_id)
|
|
if checked:
|
|
options['checked'] = 'checked'
|
|
html.append(u'<li><label for="%s">%s<span>%s</span></label></li>' % (choice_id, '<input %s /> ' % html_params(**options), label))
|
|
html.append(u'</ul>')
|
|
return u''.join(html)
|
|
|
|
|
|
def get_billform_for(request, project, set_default=True):
|
|
"""Return an instance of BillForm configured for a particular project.
|
|
|
|
:set_default: if set to True, on GET methods (usually when we want to
|
|
display the default form, it will call set_default on it.
|
|
|
|
"""
|
|
form = BillForm()
|
|
form.payed_for.choices = form.payer.choices = [(str(m.id), m.name) for m in project.active_members]
|
|
form.payed_for.default = [str(m.id) for m in project.active_members]
|
|
|
|
if set_default and request.method == "GET":
|
|
form.set_default()
|
|
return form
|
|
|
|
|
|
class ProjectForm(Form):
|
|
name = TextField("Project name", validators=[Required()])
|
|
id = TextField("Project identifier", validators=[Required()])
|
|
password = PasswordField("Private code", validators=[Required()])
|
|
contact_email = TextField("Email", validators=[Required(), Email()])
|
|
submit = SubmitField("Create the project")
|
|
|
|
def validate_id(form, field):
|
|
form.id.data = slugify(field.data)
|
|
if Project.query.get(form.id.data):
|
|
raise ValidationError(Markup("""The project identifier is used
|
|
to log in and for the URL of the project.
|
|
<br />
|
|
We tried to generate an identifier for you but
|
|
a projet with this identifier already exists.
|
|
<br />
|
|
Please create a new identifier you will be able
|
|
to remember.
|
|
"""))
|
|
|
|
def save(self):
|
|
"""Create a new project with the information given by this form.
|
|
|
|
Returns the created instance
|
|
"""
|
|
project = Project(name=self.name.data, id=self.id.data,
|
|
password=self.password.data,
|
|
contact_email=self.contact_email.data)
|
|
return project
|
|
|
|
|
|
class AuthenticationForm(Form):
|
|
id = TextField("Project identifier", validators=[Required()])
|
|
password = PasswordField("Private code", validators=[Required()])
|
|
submit = SubmitField("Get in")
|
|
|
|
|
|
class BillForm(Form):
|
|
date = DateField("Date", validators=[Required()], default=datetime.now)
|
|
what = TextField("What?", validators=[Required()])
|
|
payer = SelectField("Payer", validators=[Required()])
|
|
amount = DecimalField("Amount payed", validators=[Required()])
|
|
payed_for = SelectMultipleField("Who has to pay for this?",
|
|
validators=[Required()], widget=select_multi_checkbox)
|
|
submit = SubmitField("Send the bill")
|
|
|
|
def save(self, bill):
|
|
bill.payer_id=self.payer.data
|
|
bill.amount=self.amount.data
|
|
bill.what=self.what.data
|
|
bill.date=self.date.data
|
|
bill.owers = [Person.query.get(ower) for ower in self.payed_for.data]
|
|
|
|
return bill
|
|
|
|
def fill(self, bill):
|
|
self.payer.data = bill.payer_id
|
|
self.amount.data = bill.amount
|
|
self.what.data = bill.what
|
|
self.date.data = bill.date
|
|
self.payed_for.data = [str(ower.id) for ower in bill.owers]
|
|
|
|
def set_default(self):
|
|
self.payed_for.data = self.payed_for.default
|
|
|
|
|
|
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)\
|
|
.filter(Person.project == form.project)\
|
|
.filter(Person.activated == True).all():
|
|
raise ValidationError("This project already have this member")
|
|
|
|
|
|
class InviteForm(Form):
|
|
emails = TextAreaField("People to notify")
|
|
submit = SubmitField("Send invites")
|
|
|
|
def validate_emails(form, field):
|
|
validator = Email()
|
|
for email in [email.strip() for email in form.emails.data.split(",")]:
|
|
if not validator.regex.match(email):
|
|
raise ValidationError("The email %s is not valid" % email)
|
|
|
|
|
|
class CreateArchiveForm(Form):
|
|
start_date = DateField("Start date", validators=[Required(),])
|
|
end_date = DateField("End date", validators=[Required(),])
|
|
name = TextField("Name for this archive (optional)")
|