from functools import partial import itertools from flask.ext.wtf import Form from wtforms import Form as InsecureForm from wtforms import TextField, DateField, DecimalField, SelectField, SelectMultipleField, FieldList, FormField from wtforms.widgets import TextInput, ListWidget, html_params, HTMLString, CheckboxInput, Select from wtforms.validators import DataRequired, Optional, URL, Email, Length, NumberRange, ValidationError from flask.ext.babel import Babel, gettext as _ from .constants import STEPS from .models import ISP class InputListWidget(ListWidget): def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) html = ['<%s %s>' % (self.html_tag, html_params(**kwargs))] for subfield in field: html.append('
irc://irc.isp.net/#isp
or '+
'xmpp:isp@chat.isp.net?join
')])
covered_areas = FieldList(MyFormField(CoveredArea, widget=partial(InputListWidget(), class_='formfield')), min_entries=1, widget=InputListWidget(),
description=[None, _(u'Descriptive name of the covered areas and technologies deployed')])
latitude = DecimalField(_(u'latitude'), validators=[Optional()],
description=[None, _(u'Geographical coordinates of your registered office or usual meeting location.')])
longitude = DecimalField(_(u'longitude'), validators=[Optional()])
step = SelectField(_(u'step'), choices=[(k, u'%u - %s' % (k, STEPS[k])) for k in STEPS], coerce=int)
member_count = DecimalField(_(u'members'), validators=[Optional(), NumberRange(min=0)],
description=[None, _('Number of members')])
subscriber_count = DecimalField(_(u'subscribers'), validators=[Optional(), NumberRange(min=0)],
description=[None, _('Number of subscribers to an internet access')])
def to_json(self, json=None):
if json is None:
json={}
json['name'] = self.name.data
def optstr(k, v):
if k in json or v:
json[k]=v
def optlist(k, v):
if k in json or len(v):
json[k]=v
optstr('shortname', self.shortname.data)
optstr('description', self.description.data)
optstr('logoURL', self.logo_url.data)
optstr('website', self.website.data)
optstr('email', self.contact_email.data)
optstr('mainMailingList', self.main_ml.data)
optstr('creationDate', self.creation_date.data)
optstr('progressStatus', self.step.data)
optlist('chatrooms', filter(bool, self.chatrooms.data)) # remove empty strings
return json
@classmethod
def edit_json(cls, json):
obj=type('abject', (object,), {})
def set_attr(attr, itemk=None):
if itemk is None:
itemk=attr
if itemk in json:
setattr(obj, attr, json[itemk])
set_attr('name')
set_attr('shortname')
set_attr('description')
set_attr('logo_url', 'logoURL')
set_attr('website')
set_attr('contact_email', 'email')
set_attr('main_ml', 'mainMailingList')
set_attr('creation_date', 'creationDate')
set_attr('step', 'progressStatus')
return cls(obj=obj)
class ProjectJSONForm(Form):
url = TextField(_(u'link url'), validators=[Optional(), URL(require_tld=True)])