summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitc341b4c3952fe1cdb678fe878d82df49f8d83623 (patch)
tree1c3b1cf060abbd5cc0b0cceec4e178d778b46ad5
parentddb223e236be65cc4959b735f0396284ca4719f9 (diff)
downloadChimère-c341b4c3952fe1cdb678fe878d82df49f8d83623.tar.bz2
Chimère-c341b4c3952fe1cdb678fe878d82df49f8d83623.zip
Work on multimedia file forms - create, modify and remove.
-rw-r--r--chimere/forms.py48
-rw-r--r--chimere/models.py5
-rw-r--r--chimere/templates/chimere/blocks/inline_formset.html3
-rw-r--r--chimere/views.py26
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