diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-03-07 21:29:55 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-03-07 21:29:55 +0100 | 
| commit | c341b4c3952fe1cdb678fe878d82df49f8d83623 (patch) | |
| tree | 1c3b1cf060abbd5cc0b0cceec4e178d778b46ad5 | |
| parent | ddb223e236be65cc4959b735f0396284ca4719f9 (diff) | |
| download | Chimère-c341b4c3952fe1cdb678fe878d82df49f8d83623.tar.bz2 Chimère-c341b4c3952fe1cdb678fe878d82df49f8d83623.zip | |
Work on multimedia file forms - create, modify and remove.
| -rw-r--r-- | chimere/forms.py | 48 | ||||
| -rw-r--r-- | chimere/models.py | 5 | ||||
| -rw-r--r-- | chimere/templates/chimere/blocks/inline_formset.html | 3 | ||||
| -rw-r--r-- | chimere/views.py | 26 | 
4 files changed, 66 insertions, 16 deletions
| diff --git a/chimere/forms.py b/chimere/forms.py index d534b53..4933c3a 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -23,6 +23,7 @@ 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.forms.formsets import formset_factory  from django.utils.translation import ugettext as _  from django.contrib.auth.models import User, Permission, ContentType @@ -270,24 +271,59 @@ class RouteForm(RouteAdminForm):          new_marker.saveProperties(properties)          return new_route -class MultimediaFileForm(forms.ModelForm): + +class BaseFileForm(forms.ModelForm): +    id = forms.IntegerField(label=u"", widget=forms.HiddenInput(), +                            required=False) + +    def __init__(self, *args, **kwargs): +        if not hasattr(self, '_related_name') or not self._related_name: +            raise ImproperlyConfigured +        super(BaseFileForm, self).__init__(*args, **kwargs) + +    def save(self, associated_marker): +        if not hasattr(self, 'cleaned_data') or not self.cleaned_data: +            return +        instance = None +        if self.cleaned_data.get('id'): +            try: +                # marker must be equal to none because the link has just be +                # removed - this condition is necessary to prevent modification +                # of already validated items by a forged request +                instance = self._meta.model.objects.get( +                           pk=self.cleaned_data['id'], marker=None) +            except: +                pass +            self.cleaned_data.pop('id') +        if self.cleaned_data.get('DELETE'): +            if instance: +                instance.delete() +            return +        self.cleaned_data.pop('DELETE') +        if instance: +            for k in self.cleaned_data: +                setattr(instance, k, self.cleaned_data[k]) +            instance.save() +        else: +            instance = self._meta.model.objects.create(**self.cleaned_data) +        getattr(associated_marker, self._related_name).add(instance) + +class MultimediaFileForm(BaseFileForm):      """      Form for a multimedia file      """ -    pk = forms.IntegerField(label=u"", widget=forms.HiddenInput(), -                            required=False) +    _related_name = 'multimedia_files'      class Meta:          model = MultimediaFile          exclude = ('order',)  MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True) -class PictureFileForm(forms.ModelForm): +class PictureFileForm(BaseFileForm):      """      Form for a picture file      """ -    pk = forms.IntegerField(label=u"", widget=forms.HiddenInput(), -                            required=False) +    _related_name = 'pictures'      class Meta:          model = PictureFile          exclude = ('order', 'height', 'width') diff --git a/chimere/models.py b/chimere/models.py index 458fa31..6ca2771 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -229,9 +229,10 @@ class Marker(GeographicItem):      route = models.ForeignKey(u"Route", blank=True, null=True,                                related_name='associated_marker')      pictures = models.ManyToManyField(u"PictureFile", verbose_name='Pictures', -                                      blank=True, null=True) +               blank=True, null=True, related_name='marker')      multimedia_files = models.ManyToManyField(u"MultimediaFile", -                         verbose_name='Multimedia files', blank=True, null=True) +                       verbose_name='Multimedia files', blank=True, null=True, +                       related_name='marker')      objects = BaseGeoManager()      def __unicode__(self): diff --git a/chimere/templates/chimere/blocks/inline_formset.html b/chimere/templates/chimere/blocks/inline_formset.html index d6c45b8..e9e68eb 100644 --- a/chimere/templates/chimere/blocks/inline_formset.html +++ b/chimere/templates/chimere/blocks/inline_formset.html @@ -1,11 +1,12 @@  {% load i18n %} +    {{ formset.management_form }}      <table class='inline-table'>      <caption>{% trans caption %}</caption>      {% for frm in formset%}{%ifequal forloop.counter 1 %}      <tr>{% for field in frm%}{% if field.label %}          <th>{{field.label}}</th>{% endif %}{%endfor%}      </tr>{%endifequal%} -    <tr>{% for field in frm%}{%if not field.is_hidden%} +    <tr>{% for field in frm%}{%if field.is_hidden%}{{field}}{% else %}          <td>{{field}}</td>{%endif%}{%endfor%}      </tr>{%endfor%}      </table> diff --git a/chimere/views.py b/chimere/views.py index c76f5b8..0785998 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -121,10 +121,10 @@ def get_edit_page(redirect_url, item_cls, item_form):              if modified_item.count():                  init_item = modified_item.all()[0] +        init_multi = init_item.get_init_multi() if init_item else None +        init_picture = init_item.get_init_picture() if init_item else None          # If the form has been submited          if request.method == 'POST': -            formset_multi = MultimediaFileFormSet() -            formset_picture = PictureFileFormSet()              inst = None              # allow to directly modify only if owner or superuser              if init_item and (request.user.is_superuser or \ @@ -133,8 +133,13 @@ def get_edit_page(redirect_url, item_cls, item_form):                  inst = init_item              form = item_form(request.POST, request.FILES, instance=inst) +            formset_multi = MultimediaFileFormSet(request.POST, request.FILES, +                                        initial=init_multi, prefix='multimedia') +            formset_picture = PictureFileFormSet(request.POST, request.FILES, +                                        initial=init_picture, prefix='picture')              # All validation rules pass -            if form.is_valid(): +            if form.is_valid() and formset_multi.is_valid() and \ +               formset_picture.is_valid():                  item = form.save()                  # set the session key (to permit modifications)                  item.submiter_session_key = request.session.session_key @@ -152,6 +157,13 @@ def get_edit_page(redirect_url, item_cls, item_form):                  if not item.status:                      item.status = 'S'                  item.save() + +                for f in formset_multi: +                    f.save(item) + +                for f in formset_picture: +                    f.save(item) +                  notifySubmission(item)                  response_dct = get_base_response(area_name)                  return redirect(redirect_url + '-item', @@ -160,10 +172,10 @@ def get_edit_page(redirect_url, item_cls, item_form):                         None          else:              form = item_form(instance=init_item) -            init_multi = init_item.get_init_multi() if init_item else None -            formset_multi = MultimediaFileFormSet(initial=init_multi) -            init_picture = init_item.get_init_picture() if init_item else None -            formset_picture = PictureFileFormSet(initial=init_picture) +            formset_multi = MultimediaFileFormSet(initial=init_multi, +                                                  prefix='multimedia') +            formset_picture = PictureFileFormSet(initial=init_picture, +                                                 prefix='picture')          return None, (item_id, init_item, response_dct, form, formset_multi,                        formset_picture)      return func | 
