diff options
Diffstat (limited to 'chimere/forms.py')
| -rw-r--r-- | chimere/forms.py | 123 | 
1 files changed, 105 insertions, 18 deletions
| diff --git a/chimere/forms.py b/chimere/forms.py index e465a8f..5cf2c63 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -32,10 +32,11 @@ from django.contrib.admin.widgets import AdminDateWidget  from django.core.mail import EmailMessage, BadHeaderError  from chimere.models import Marker, Route, PropertyModel, Property, Area,\ -     News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ -     PictureFile, Importer +   News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ +   PictureFile, Importer, PropertyModelChoice, IFRAME_LINKS, \ +   MultimediaExtension, Page  from chimere.widgets import AreaField, PointField, TextareaWidget, \ -                            DatePickerWidget +    FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget  from datetime import timedelta, datetime, tzinfo @@ -53,13 +54,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 @@ -89,11 +95,25 @@ 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 NewsAdminForm(forms.ModelForm):      """      Main form for news      """ -    content = forms.CharField(widget=TextareaWidget) +    content = forms.CharField(widget=FullTextareaWidget)      class Meta:          model = News @@ -191,16 +211,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      """ @@ -302,6 +338,10 @@ class RouteForm(RouteAdminForm):                                                      if k in marker_fields])          marker_dct['status'] = new_route.status          categories = [] +        if not marker_dct['point']: +            first_point = new_route.route.coords[0] +            marker_dct['point'] = 'POINT(%f %f)' % (first_point[0], +                                                    first_point[1])          new_marker, created = Marker.objects.get_or_create(route=new_route,                                                             defaults=marker_dct)          if not created: @@ -365,7 +405,33 @@ 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 + +    def clean(self): +        if not self.cleaned_data.get('url'): +            return self.cleaned_data +        if self.cleaned_data.get('multimedia_type') and \ +           self.cleaned_data['multimedia_type'].name != 'auto': +            return self.cleaned_data +        url = self.cleaned_data['url'] +        for mm_type in IFRAME_LINKS: +            res, embeded_url = IFRAME_LINKS[mm_type] +            if [r for r in res if r.search(url)]: +                multimedia_type = MultimediaType.objects.get( +                                    name__iexact=mm_type) +                self.cleaned_data['multimedia_type'] = multimedia_type +                return self.cleaned_data +        ext = url.split(".")[-1] +        q = MultimediaExtension.objects.filter(name__iendswith=ext) +        if q.count(): +            self.cleaned_data['multimedia_type'] = q.all()[0].multimedia_type +        else: +            # default to an iframe +            self.cleaned_data['multimedia_type'] = \ +                MultimediaType.objects.filter(name__iexact='iframe').all()[0] +        return self.cleaned_data  MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True) @@ -403,7 +469,7 @@ class AreaAdminForm(forms.ModelForm):      Admin page to create an area      """      area = AreaField(label=_("Area"), fields=(PointField(), PointField())) -    welcome_message = forms.CharField(widget=TextareaWidget) +    welcome_message = forms.CharField(widget=TextareaWidget, required=False)      class Meta:          model = Area @@ -454,3 +520,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) + +    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))) | 
