diff options
Diffstat (limited to 'chimere/forms.py')
| -rw-r--r-- | chimere/forms.py | 90 | 
1 files changed, 75 insertions, 15 deletions
| diff --git a/chimere/forms.py b/chimere/forms.py index 0d4bba6..1d403c8 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -33,10 +33,11 @@ from django.core.mail import EmailMessage, BadHeaderError  from chimere.models import Marker, Route, PropertyModel, Property, Area,\     News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ -   PictureFile, Importer, IMPORTER_CHOICES, IFRAME_LINKS, MultimediaExtension +   PictureFile, Importer, PropertyModelChoice, IFRAME_LINKS, \ +   MultimediaExtension, Page, IMPORTER_CHOICES  from chimere.widgets import AreaField, PointField, TextareaWidget, \ -    ImportFiltrWidget, TextareaAdminWidget, DatePickerWidget, \ -    ImporterChoicesWidget, RE_XAPI +    FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget, \ +    TextareaAdminWidget, ImportFiltrWidget, ImporterChoicesWidget, RE_XAPI  from datetime import timedelta, datetime, tzinfo @@ -54,13 +55,18 @@ 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')] +  def notifyStaff(subject, body, sender=None):      if not settings.EMAIL_HOST:          return +    user_list = getStaffEmails() +    if not user_list: +        return      if settings.PROJECT_NAME:          subject = u'[%s] %s' % (settings.PROJECT_NAME, subject) -    user_list = [u.email for u in -          User.objects.filter(is_staff=True).exclude(email="").order_by('id')]      headers = {}      if sender:          headers['Reply-To'] = sender @@ -90,6 +96,20 @@ 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 @@ -163,6 +183,9 @@ class CategoryAdminForm(forms.ModelForm):          js = list(settings.JQUERY_JS_URLS) + [              '%schimere/js/menu-sort.js' % settings.STATIC_URL,          ] +        css = { +             'all': ('chimere/css/admin.css',) +        }      class Meta:          model = Category @@ -246,16 +269,32 @@ class MarkerAdminFormBase(forms.ModelForm):          return new_marker  # As we have dynamic fields, it's cleaner to make the class dynamic too -fields = {} -# declare properties -for prop in PropertyModel.objects.filter(available=True): -    key = "property_%d_%d" % (prop.order, prop.id) -    fields[key] = forms.CharField(label=prop.name, -                                 widget=PropertyModel.TYPE_WIDGET[prop.type], -                                 required=False) -MarkerAdminForm = type("MarkerAdminForm", (MarkerAdminFormBase,), fields) - -class MarkerForm(MarkerAdminForm): +def get_properties(queryset): +    fields = {} +    for prop in queryset: +        key = "property_%d_%d" % (prop.order, prop.id) +        if prop.type == 'C': +            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) +        else: +            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))) + +class MarkerForm(MarkerBaseForm):      """      Form for the edit page      """ @@ -562,3 +601,24 @@ class AreaForm(AreaAdminForm):      class Meta:          model = Area +CHIMERE_ROUTING_TRANSPORT = [(idx, _(lbl)) +                             for idx, lbl in settings.CHIMERE_ROUTING_TRANSPORT] + +class RoutingForm(forms.Form): +    transport = forms.ChoiceField(label='', widget=ButtonSelectWidget, +                               choices=CHIMERE_ROUTING_TRANSPORT, +                               initial=CHIMERE_ROUTING_TRANSPORT[0][0]) +    start = forms.CharField(label=_(u"Start"), widget=NominatimWidget) +    end = forms.CharField(label=_(u"Finish"), widget=NominatimWidget) +    speed = forms.ChoiceField(label=_(u"Speed"), choices=[], +                              required=False, widget=forms.RadioSelect) + +    def __init__(self, *args, **kwargs): +        super(RoutingForm, self).__init__(*args, **kwargs) +        if not settings.CHIMERE_ROUTING_SPEEDS: +            self.fields.pop('speed') +        self.fields['speed'].widget.choices = [] +        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))) | 
