diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-01-24 00:16:02 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-01-24 00:16:02 +0100 |
commit | 8c0d2e689da75b1d783260cabb2f5d786a2a9dc0 (patch) | |
tree | 41dc18246965a91cfe6192afe38067097b611227 | |
parent | 924f470f4e137b1b178e852ec30bffce01aaad24 (diff) | |
download | Chimère-8c0d2e689da75b1d783260cabb2f5d786a2a9dc0.tar.bz2 Chimère-8c0d2e689da75b1d783260cabb2f5d786a2a9dc0.zip |
Flake8
-rw-r--r-- | chimere/forms.py | 204 |
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 |