diff options
| -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 |
