summaryrefslogtreecommitdiff
path: root/chimere/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/forms.py')
-rw-r--r--chimere/forms.py204
1 files changed, 128 insertions, 76 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index c8d7d45..e1af9d1 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -23,30 +23,29 @@ Forms
from django import forms
from django.conf import settings
-from django.contrib.gis.db import models
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse
from django.forms.formsets import formset_factory
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Permission, ContentType
-from django.contrib.admin.widgets import AdminDateWidget
from django.core.mail import EmailMessage, BadHeaderError
-if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and settings.CHIMERE_SEARCH_ENGINE:
+if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and \
+ settings.CHIMERE_SEARCH_ENGINE:
from haystack.forms import SearchForm as HaystackSearchForm
-from chimere.models import Marker, Route, PropertyModel, Property, Area,\
- News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \
- PictureFile, Importer, PropertyModelChoice, IFRAME_LINKS, \
- MultimediaExtension, Page, IMPORTER_CHOICES
+from chimere.models import Marker, Route, PropertyModel, Area,\
+ News, Category, RouteFile, MultimediaFile, MultimediaType, \
+ PictureFile, Importer, PropertyModelChoice, Page, IMPORTER_CHOICES
from chimere.widgets import AreaField, PointField, TextareaWidget, \
- FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget, \
+ FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget,\
TextareaAdminWidget, ImportFiltrWidget, ImporterChoicesWidget, RE_XAPI
from datetime import timedelta, datetime, tzinfo
ZERO = timedelta(0)
+
class UTC(tzinfo):
"""UTC time zone"""
@@ -59,9 +58,11 @@ class UTC(tzinfo):
def dst(self, dt):
return ZERO
+
def getStaffEmails():
- return [u.email for u in
- User.objects.filter(is_staff=True).exclude(email="").order_by('id')]
+ return [u.email for u in User.objects.filter(
+ is_staff=True).exclude(email="").order_by('id')]
+
def notifyStaff(subject, body, sender=None):
if not settings.EMAIL_HOST:
@@ -82,17 +83,21 @@ def notifyStaff(subject, body, sender=None):
return False
return True
+
def notifySubmission(absolute_uri, geo_object):
- category = u" - ".join([unicode(cat) for cat in geo_object.categories.all()])
+ category = u" - ".join([unicode(cat)
+ for cat in geo_object.categories.all()])
subject = u'%s %s' % (_(u"New submission for"), category)
message = _(u'The new item "%s" has been submited in the category: ') % \
- geo_object.name + category
+ geo_object.name + category
message += "\n\n" + _(u"To valid, precise or unvalid this item: ")
- named_url = 'admin:chimere_%s_change'% geo_object.__class__.__name__.lower()
+ named_url = 'admin:chimere_%s_change' % \
+ geo_object.__class__.__name__.lower()
message += absolute_uri + reverse(named_url, args=(geo_object.pk,))
message += u"\n\n--\nChimère"
return notifyStaff(subject, message)
+
class ContactForm(forms.Form):
"""
Main form for categories
@@ -100,20 +105,24 @@ class ContactForm(forms.Form):
email = forms.EmailField(label=_("Email (optional)"), required=False)
content = forms.CharField(label=_("Object"), widget=forms.Textarea)
+
class SubCategoryAdminForm(forms.ModelForm):
'''
Add a tinyMCE widget to fill description
'''
description = forms.CharField(widget=FullTextareaWidget, required=False)
+
class PageAdminForm(forms.ModelForm):
"""
Main form for extra pages
"""
content = forms.CharField(widget=FullTextareaWidget)
+
class Meta:
model = Page
+
class OSMForm(forms.Form):
"""
OSM export form
@@ -123,28 +132,34 @@ class OSMForm(forms.Form):
widget=forms.PasswordInput(render_value=False))
# API URL are hardcoded: the day the API change Chimère will need
# adaptations not only on this portion...
- api = forms.ChoiceField(label=_(u"API"),
- choices=(('', '--'),
- ('api06.dev.openstreetmap.org',
- _(u"Test API - %s") % 'api06.dev.openstreetmap.org'),
- ('api.openstreetmap.org/api',
- _(u"Main API - %s") % 'api.openstreetmap.org/api'),
- ))
+ api = forms.ChoiceField(
+ label=_(u"API"),
+ choices=(('', '--'),
+ ('api06.dev.openstreetmap.org',
+ _(u"Test API - %s") % 'api06.dev.openstreetmap.org'),
+ ('api.openstreetmap.org/api',
+ _(u"Main API - %s") % 'api.openstreetmap.org/api'),
+ ))
+
class NewsAdminForm(forms.ModelForm):
"""
Main form for news
"""
content = forms.CharField(widget=TextareaAdminWidget)
+
class Meta:
model = News
+
class ImporterAdminForm(forms.ModelForm):
filtr = forms.CharField(widget=ImportFiltrWidget, required=False)
- importer_type = forms.ChoiceField(widget=ImporterChoicesWidget,
- choices=[('', '--')]+list(IMPORTER_CHOICES))
+ importer_type = forms.ChoiceField(
+ widget=ImporterChoicesWidget,
+ choices=[('', '--')] + list(IMPORTER_CHOICES))
default_description = forms.CharField(widget=TextareaAdminWidget,
required=False)
+
class Meta:
model = Importer
widgets = {
@@ -159,15 +174,17 @@ class ImporterAdminForm(forms.ModelForm):
'''
if self.cleaned_data.get('importer_type') == 'OSM' and \
not self.cleaned_data.get('filtr'):
- raise forms.ValidationError(_(u"For OSM import you must be "\
- u"provide a filter. Select an area and node/way filter."))
+ raise forms.ValidationError(
+ _(u"For OSM import you must be provide a filter. Select an "
+ u"area and node/way filter."))
if self.cleaned_data.get('importer_type') == 'OSM' and \
not RE_XAPI.match(self.cleaned_data.get('filtr')):
- raise forms.ValidationError(_(u"For OSM import you must be "\
- u"provide a filter. Select an area and node/way filter."))
+ raise forms.ValidationError(
+ _(u"For OSM import you must be provide a filter. Select an "
+ u"area and node/way filter."))
if self.cleaned_data.get('importer_type') == 'SHP' and \
not self.cleaned_data.get('zipped'):
- raise forms.ValidationError(_(u"Shapefiles must be provided in a "\
+ raise forms.ValidationError(_(u"Shapefiles must be provided in a "
u"zipped archive."))
if self.cleaned_data.get('importer_type') not in ('XSLT', 'XXLT') and \
self.cleaned_data.get('source') and \
@@ -181,26 +198,31 @@ class ImporterAdminForm(forms.ModelForm):
u"\"source file\"."))
return self.cleaned_data
+
class CategoryAdminForm(forms.ModelForm):
"""
Main form for categories
"""
description = forms.CharField(widget=TextareaAdminWidget, required=False)
+
class Media:
js = list(settings.JQUERY_JS_URLS) + [
'%schimere/js/menu-sort.js' % settings.STATIC_URL,
]
css = {
- 'all': ('chimere/css/admin.css',)
+ 'all': ('chimere/css/admin.css',)
}
+
class Meta:
model = Category
+
class MarkerAdminFormBase(forms.ModelForm):
"""
Main form for marker
"""
description = forms.CharField(widget=TextareaAdminWidget, required=False)
+
class Meta:
model = Marker
@@ -213,7 +235,7 @@ class MarkerAdminFormBase(forms.ModelForm):
instance = keys['instance']
property_dct = {}
for pm in self.pms:
- property = instance.getProperty(pm)
+ property = instance.getProperty(pm)
if property:
property_dct[pm.getNamedId()] = property.value
if 'initial' in keys:
@@ -221,7 +243,7 @@ class MarkerAdminFormBase(forms.ModelForm):
else:
keys['initial'] = property_dct
subcategories = keys.pop('subcategories') \
- if 'subcategories' in keys else []
+ if 'subcategories' in keys else []
super(MarkerAdminFormBase, self).__init__(*args, **keys)
if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = DatePickerWidget()
@@ -250,11 +272,12 @@ class MarkerAdminFormBase(forms.ModelForm):
continue
pm_cats = pm.subcategories.all()
if not pm_cats or \
- [submited_cat for submited_cat in self.cleaned_data['categories']
- if submited_cat in pm_cats]:
+ [submited_cat for submited_cat in
+ self.cleaned_data['categories']
+ if submited_cat in pm_cats]:
msg = _(u"This field is mandatory for the selected categories")
self._errors[pm.getNamedId()] = self.error_class([msg])
- #raise forms.ValidationError()
+ # raise forms.ValidationError()
return self.cleaned_data
def save(self, *args, **keys):
@@ -270,13 +293,15 @@ class MarkerAdminFormBase(forms.ModelForm):
tzinfo=tz)
new_marker.save()
# save properties
- properties = dict([(k.split('_')[-1], self.cleaned_data[k]) \
- for k in self.cleaned_data.keys() if k.startswith('property_')])
+ properties = dict(
+ [(k.split('_')[-1], self.cleaned_data[k])
+ for k in self.cleaned_data.keys() if k.startswith('property_')])
new_marker.saveProperties(properties)
return new_marker
-# As we have dynamic fields, it's cleaner to make the class dynamic too
+
def get_properties(queryset):
+ # As we have dynamic fields, it's cleaner to make the class dynamic too
fields = {}
for prop in queryset:
key = "property_%d_%d" % (prop.order, prop.id)
@@ -284,22 +309,24 @@ def get_properties(queryset):
choices = PropertyModelChoice.objects.filter(propertymodel=prop,
available=True
).order_by('value')
- fields[key] = forms.ChoiceField(label=prop.name,
- choices=[('', '--')] + \
- [(choice.pk, unicode(choice))
- for choice in choices],
- required=False)
+ fields[key] = forms.ChoiceField(
+ label=prop.name, choices=[('', '--')] +
+ [(choice.pk, unicode(choice)) for choice in choices],
+ required=False)
else:
- fields[key] = forms.CharField(label=prop.name,
- widget=PropertyModel.TYPE_WIDGET[prop.type],
- required=False)
+ fields[key] = forms.CharField(
+ label=prop.name, widget=PropertyModel.TYPE_WIDGET[prop.type],
+ required=False)
return fields
# in admin all fields are displayed
-MarkerAdminForm = type("MarkerAdminForm", (MarkerAdminFormBase,),
- get_properties(PropertyModel.objects.all()))
-MarkerBaseForm = type("MarkerBaseForm", (MarkerAdminFormBase,),
- get_properties(PropertyModel.objects.filter(available=True)))
+MarkerAdminForm = type(
+ "MarkerAdminForm", (MarkerAdminFormBase,),
+ get_properties(PropertyModel.objects.all()))
+MarkerBaseForm = type(
+ "MarkerBaseForm", (MarkerAdminFormBase,),
+ get_properties(PropertyModel.objects.filter(available=True)))
+
class MarkerForm(MarkerBaseForm):
"""
@@ -309,6 +336,7 @@ class MarkerForm(MarkerBaseForm):
required=False)
description = forms.CharField(widget=TextareaWidget, required=False)
keywords = forms.CharField(max_length=200, required=False)
+
class Meta:
model = Marker
exclude = ('status',)
@@ -316,6 +344,7 @@ class MarkerForm(MarkerBaseForm):
'description': TextareaWidget(),
}
+
class RouteAdminForm(forms.ModelForm):
"""
Main form for route
@@ -331,7 +360,7 @@ class RouteAdminForm(forms.ModelForm):
instance = keys['instance']
property_dct = {}
for pm in PropertyModel.objects.filter(available=True):
- property = instance.getProperty(pm)
+ property = instance.getProperty(pm)
if property:
property_dct[pm.getNamedId()] = property.value
if 'initial' in keys:
@@ -339,7 +368,7 @@ class RouteAdminForm(forms.ModelForm):
else:
keys['initial'] = property_dct
subcategories = keys.pop('subcategories') \
- if 'subcategories' in keys else []
+ if 'subcategories' in keys else []
super(RouteAdminForm, self).__init__(*args, **keys)
if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = DatePickerWidget()
@@ -357,14 +386,17 @@ class RouteAdminForm(forms.ModelForm):
new_route.save()
return new_route
+
class RouteForm(RouteAdminForm):
"""
Form for the edit page
"""
description = forms.CharField(widget=TextareaWidget, required=False)
- point = forms.CharField(label=" ", required=False, widget=forms.HiddenInput)
- associated_file_id = forms.CharField(label=" ", required=False,
- widget=forms.HiddenInput)
+ point = forms.CharField(label=" ", required=False,
+ widget=forms.HiddenInput)
+ associated_file_id = forms.CharField(
+ label=" ", required=False, widget=forms.HiddenInput)
+
class Meta:
model = Route
exclude = ('status',)
@@ -374,11 +406,11 @@ class RouteForm(RouteAdminForm):
try:
marker = Marker.objects.get(route=kwargs['instance'])
kwargs['initial'] = {
- 'point':marker.point,
- 'description':marker.description}
+ 'point': marker.point,
+ 'description': marker.description}
property_dct = {}
for pm in PropertyModel.objects.filter(available=True):
- property = marker.getProperty(pm)
+ property = marker.getProperty(pm)
if property:
property_dct[pm.getNamedId()] = property.value
if 'initial' in kwargs:
@@ -413,11 +445,13 @@ class RouteForm(RouteAdminForm):
new_marker.description = self.cleaned_data['description']
new_marker.save()
# save properties
- properties = dict([(k.split('_')[-1], self.cleaned_data[k]) \
- for k in self.cleaned_data.keys() if k.startswith('property_')])
+ properties = dict(
+ [(k.split('_')[-1], self.cleaned_data[k])
+ for k in self.cleaned_data.keys() if k.startswith('property_')])
new_marker.saveProperties(properties)
return new_route
+
class BaseFileForm(forms.ModelForm):
id = forms.IntegerField(label=u"", widget=forms.HiddenInput(),
required=False)
@@ -435,7 +469,7 @@ class BaseFileForm(forms.ModelForm):
if self.cleaned_data.get('id'):
try:
instance = self._meta.model.objects.get(
- pk=self.cleaned_data['id'])
+ pk=self.cleaned_data['id'])
except:
pass
self.cleaned_data.pop('id')
@@ -452,9 +486,11 @@ class BaseFileForm(forms.ModelForm):
else:
instance = self._meta.model.objects.create(**self.cleaned_data)
+
class MultimediaFileAdminForm(forms.ModelForm):
class Meta:
model = MultimediaFile
+
class Media:
js = list(settings.JQUERY_JS_URLS) + [
'%schimere/js/menu-sort.js' % settings.STATIC_URL,
@@ -463,13 +499,15 @@ class MultimediaFileAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MultimediaFileAdminForm, self).__init__(*args, **kwargs)
self.fields['multimedia_type'].widget.choices = \
- MultimediaType.get_tuples()
+ MultimediaType.get_tuples()
+
class MultimediaFileForm(BaseFileForm):
"""
Form for a multimedia file
"""
_related_name = 'multimedia_files'
+
class Meta:
model = MultimediaFile
exclude = ('order',)
@@ -477,25 +515,29 @@ class MultimediaFileForm(BaseFileForm):
def __init__(self, *args, **kwargs):
super(MultimediaFileForm, self).__init__(*args, **kwargs)
self.fields['multimedia_type'].widget.choices = \
- MultimediaType.get_tuples()
+ MultimediaType.get_tuples()
# this can be auto detect
self.fields['multimedia_type'].required = False
MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True)
+
class PictureFileAdminForm(forms.ModelForm):
class Meta:
model = PictureFile
+
class Media:
js = list(settings.JQUERY_JS_URLS) + [
'%schimere/js/menu-sort.js' % settings.STATIC_URL,
]
+
class PictureFileForm(BaseFileForm):
"""
Form for a picture file
"""
_related_name = 'pictures'
+
class Meta:
model = PictureFile
exclude = ('order', 'height', 'width', 'thumbnailfile',
@@ -503,23 +545,27 @@ class PictureFileForm(BaseFileForm):
PictureFileFormSet = formset_factory(PictureFileForm, can_delete=True)
+
class FileForm(forms.Form):
- raw_file = forms.FileField(label=_(u"File"))
+ raw_file = forms.FileField(label=_(u"File"))
def clean_raw_file(self):
data = self.cleaned_data['raw_file']
if '.' not in data.name or \
data.name.split('.')[-1].lower() not in ('kml', 'gpx'):
- raise forms.ValidationError(_(u"Bad file format: this must be a "\
+ raise forms.ValidationError(_(u"Bad file format: this must be a "
u"GPX or KML file"))
return data
+
class FullFileForm(FileForm):
name = forms.CharField(label=_(u"Name"), max_length=150)
+
def __init__(self, *args, **kwargs):
super(FullFileForm, self).__init__(*args, **kwargs)
self.fields.keyOrder = ['name', 'raw_file']
+
class AreaAdminForm(forms.ModelForm):
"""
Admin page to create an area
@@ -527,6 +573,7 @@ class AreaAdminForm(forms.ModelForm):
area = AreaField(label=_("Area"), fields=(PointField(), PointField()))
welcome_message = forms.CharField(widget=TextareaAdminWidget,
required=False)
+
class Meta:
model = Area
@@ -547,8 +594,8 @@ class AreaAdminForm(forms.ModelForm):
args[0][k] = None
if 'instance' in keys and keys['instance']:
instance = keys['instance']
- dct = {'area':(instance.upper_left_corner,
- instance.lower_right_corner)}
+ dct = {'area': (instance.upper_left_corner,
+ instance.lower_right_corner)}
if 'initial' in keys:
keys['initial'].update(dct)
else:
@@ -571,8 +618,8 @@ class AreaAdminForm(forms.ModelForm):
if self.instance:
q = q.exclude(pk=self.instance.pk)
if q.count():
- msg= _(u"The area \"%s\" has the same order, you need to "
- u" choose another one.") % unicode(q.all()[0])
+ msg = _(u"The area \"%s\" has the same order, you need to"
+ u" choose another one.") % unicode(q.all()[0])
raise forms.ValidationError(msg)
return self.cleaned_data
@@ -584,15 +631,16 @@ class AreaAdminForm(forms.ModelForm):
area = self.cleaned_data['area']
new_area.upper_left_corner = 'POINT(%s %s)' % (area[0][0], area[0][1])
new_area.lower_right_corner = 'POINT(%s %s)' % (area[1][0],
- area[1][1])
+ area[1][1])
content_type = ContentType.objects.get(app_label="chimere",
model="area")
if new_area.urn:
mnemo = 'change_area_' + new_area.urn
perm = Permission.objects.filter(codename=mnemo)
if not perm:
- perm = Permission(name='Can change ' + new_area.name,
- content_type_id=content_type.id, codename=mnemo)
+ perm = Permission(
+ name='Can change ' + new_area.name,
+ content_type_id=content_type.id, codename=mnemo)
perm.save()
else:
if 'urn' in self.initial:
@@ -602,6 +650,7 @@ class AreaAdminForm(forms.ModelForm):
perm[0].delete()
return new_area
+
class AreaForm(AreaAdminForm):
"""
Form for the edit page
@@ -612,16 +661,16 @@ class AreaForm(AreaAdminForm):
CHIMERE_ROUTING_TRANSPORT = []
ROUTING_INIT = None
if hasattr(settings, 'CHIMERE_ROUTING_TRANSPORT'):
- CHIMERE_ROUTING_TRANSPORT = [(idx, _(lbl))
- for idx, lbl in settings.CHIMERE_ROUTING_TRANSPORT]
+ CHIMERE_ROUTING_TRANSPORT = [
+ (idx, _(lbl)) for idx, lbl in settings.CHIMERE_ROUTING_TRANSPORT]
if CHIMERE_ROUTING_TRANSPORT:
ROUTING_INIT = CHIMERE_ROUTING_TRANSPORT[0][0]
class RoutingForm(forms.Form):
transport = forms.ChoiceField(label='', widget=ButtonSelectWidget,
- choices=CHIMERE_ROUTING_TRANSPORT,
- initial=ROUTING_INIT)
+ choices=CHIMERE_ROUTING_TRANSPORT,
+ initial=ROUTING_INIT)
start = forms.CharField(label=_(u"Start"), widget=NominatimWidget)
end = forms.CharField(label=_(u"Finish"), widget=NominatimWidget)
speed = forms.ChoiceField(label=_(u"Speed"), choices=[],
@@ -635,9 +684,12 @@ class RoutingForm(forms.Form):
for transport in settings.CHIMERE_ROUTING_SPEEDS:
for speed, lbl in settings.CHIMERE_ROUTING_SPEEDS[transport]:
self.fields['speed'].widget.choices.append(
- ("%s_%d" % (transport, speed), _(lbl)))
+ ("%s_%d" % (transport, speed), _(lbl)))
SearchForm = None
-if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and settings.CHIMERE_SEARCH_ENGINE:
+
+
+if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') \
+ and settings.CHIMERE_SEARCH_ENGINE:
class SearchForm(HaystackSearchForm):
pass