diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-02-28 00:29:13 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-02-28 00:29:13 +0100 |
commit | 556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d (patch) | |
tree | b96309b8e181ee2ae5a20bc52f7162fe96712156 | |
parent | 6d4cf0337e09e67bb454c2116cce13846aa0d22d (diff) | |
download | Chimère-556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d.tar.bz2 Chimère-556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d.zip |
Allow modification of markers on the main interface
-rw-r--r-- | chimere/actions.py | 6 | ||||
-rw-r--r-- | chimere/forms.py | 3 | ||||
-rw-r--r-- | chimere/migrations/0003_auto__add_field_route_submiter_session_key__add_field_route_submiter_e.py | 189 | ||||
-rw-r--r-- | chimere/models.py | 66 | ||||
-rw-r--r-- | chimere/templates/chimere/detail.html | 33 | ||||
-rw-r--r-- | chimere/templates/chimere/edit.html | 2 | ||||
-rw-r--r-- | chimere/urls.py | 7 | ||||
-rw-r--r-- | chimere/views.py | 87 |
8 files changed, 315 insertions, 78 deletions
diff --git a/chimere/actions.py b/chimere/actions.py index ee57b28..61acaf4 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -29,9 +29,9 @@ class Action: self.id, self.path, self.label = id, path, label actions = [(Action('view', '', _('View')), []), - (Action('contribute', 'edit', _('Contribute')), - (Action('edit', 'edit', _('Add a new point of interest')), - Action('edit_route', 'edit_route', _('Add a new route'))), + (Action('contribute', 'edit/', _('Contribute')), + (Action('edit', 'edit/', _('Add a new point of interest')), + Action('edit_route', 'edit_route/', _('Add a new route'))), ),] if 'chimere_rss' in settings.INSTALLED_APPS: diff --git a/chimere/forms.py b/chimere/forms.py index c88b8df..dbc62c0 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -133,7 +133,6 @@ class MarkerAdminFormBase(forms.ModelForm): ''' if not settings.CHIMERE_DAYS_BEFORE_EVENT: return self.cleaned_data - print self.cleaned_data if self.cleaned_data['end_date'] and \ not self.cleaned_data['start_date']: msg = _(u"End date has been set with no start date") @@ -174,6 +173,8 @@ class MarkerForm(MarkerAdminForm): """ Form for the edit page """ + ref_pk = forms.IntegerField(label=u" ", widget=forms.HiddenInput(), + required=False) class Meta: model = Marker exclude = ('status',) diff --git a/chimere/migrations/0003_auto__add_field_route_submiter_session_key__add_field_route_submiter_e.py b/chimere/migrations/0003_auto__add_field_route_submiter_session_key__add_field_route_submiter_e.py new file mode 100644 index 0000000..11ce001 --- /dev/null +++ b/chimere/migrations/0003_auto__add_field_route_submiter_session_key__add_field_route_submiter_e.py @@ -0,0 +1,189 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Route.submiter_session_key' + db.add_column('chimere_route', 'submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True), keep_default=False) + + # Adding field 'Route.submiter_email' + db.add_column('chimere_route', 'submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True), keep_default=False) + + # Adding field 'Route.submiter_comment' + db.add_column('chimere_route', 'submiter_comment', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), keep_default=False) + + # Adding field 'Route.ref_item' + db.add_column('chimere_route', 'ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_route', null=True, to=orm['chimere.Route']), keep_default=False) + + # Adding field 'Marker.submiter_session_key' + db.add_column('chimere_marker', 'submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True), keep_default=False) + + # Adding field 'Marker.submiter_email' + db.add_column('chimere_marker', 'submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True), keep_default=False) + + # Adding field 'Marker.submiter_comment' + db.add_column('chimere_marker', 'submiter_comment', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), keep_default=False) + + # Adding field 'Marker.ref_item' + db.add_column('chimere_marker', 'ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_marker', null=True, to=orm['chimere.Marker']), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Route.submiter_session_key' + db.delete_column('chimere_route', 'submiter_session_key') + + # Deleting field 'Route.submiter_email' + db.delete_column('chimere_route', 'submiter_email') + + # Deleting field 'Route.submiter_comment' + db.delete_column('chimere_route', 'submiter_comment') + + # Deleting field 'Route.ref_item' + db.delete_column('chimere_route', 'ref_item_id') + + # Deleting field 'Marker.submiter_session_key' + db.delete_column('chimere_marker', 'submiter_session_key') + + # Deleting field 'Marker.submiter_email' + db.delete_column('chimere_marker', 'submiter_email') + + # Deleting field 'Marker.submiter_comment' + db.delete_column('chimere_marker', 'submiter_comment') + + # Deleting field 'Marker.ref_item' + db.delete_column('chimere_marker', 'ref_item_id') + + + models = { + 'chimere.area': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'urn': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'unique': 'True', 'max_length': '50', 'blank': 'True'}) + }, + 'chimere.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.color': { + 'Meta': {'ordering': "['order']", 'object_name': 'Color'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '6'}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.colortheme': { + 'Meta': {'object_name': 'ColorTheme'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.icon': { + 'Meta': {'object_name': 'Icon'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.marker': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Marker'}, + 'available_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.news': { + 'Meta': {'object_name': 'News'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_route'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'route': ('chimere.widgets.RouteField', [], {}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.routefile': { + 'Meta': {'ordering': "('name',)", 'object_name': 'RouteFile'}, + 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'raw_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'simplified_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.subcategory': { + 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'to': "orm['chimere.Area']"}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Category']"}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere'] diff --git a/chimere/models.py b/chimere/models.py index a3dc4b4..5c5a48d 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2008-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2008-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as @@ -188,19 +188,18 @@ class SubCategory(models.Model): return [(category, sub_cats) for category, sub_cats \ in sub_categories.items()] -class Marker(models.Model): - '''Marker for a POI - ''' +class GeographicItem(models.Model): name = models.CharField(_(u"Name"), max_length=150) categories = SelectMultipleField(SubCategory) - point = PointField(_(u"Localisation"), - srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) - picture = models.ImageField(_(u"Image"), upload_to='upload', blank=True, - null=True, height_field='height', width_field='width') - height = models.IntegerField(_(u"Height"), blank=True, null=True) - width = models.IntegerField(_(u"Width"), blank=True, null=True) + submiter_session_key = models.CharField(_(u"Submitter session key"), + blank=True, null=True, max_length=40) + submiter_email = models.EmailField(_(u"Submitter email"), blank=True, + null=True) + submiter_comment = models.CharField(_(u"Submitter comment"), max_length=200, + blank=True, null=True) STATUS = (('S', _(u'Submited')), ('A', _(u'Available')), + ('M', _(u'Modified')), ('D', _(u'Disabled')),) STATUS_DCT = {} for key, label in STATUS: @@ -209,15 +208,29 @@ class Marker(models.Model): if settings.CHIMERE_DAYS_BEFORE_EVENT: start_date = models.DateField(_(u"Start date"), blank=True, null=True, help_text=_(u"Not mandatory. Set it for dated item such as event. "\ - u"Format YYYY-MM-DD (2012-03-28 for 28 march 2012).")) + u"Format YYYY-MM-DD")) end_date = models.DateField(_(u"End date"), blank=True, null=True, help_text=_(u"Not mandatory. Set it only if you have a multi-day "\ - u"event. Format YYYY-MM-DD (2012-03-28 for 28 march 2012).")) + u"event. Format YYYY-MM-DD")) + class Meta: + abstract = True + +class Marker(GeographicItem): + '''Marker for a POI + ''' + ref_item = models.ForeignKey("Marker", blank=True, null=True, + verbose_name=_(u"Reference marker"), related_name='submited_marker') + point = PointField(_(u"Localisation"), + srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) if 'chimere_rss' in settings.INSTALLED_APPS: available_date = models.DateTimeField(_(u"Available Date"), blank=True, null=True) route = models.ForeignKey(u"Route", blank=True, null=True, related_name='associated_marker') + picture = models.ImageField(_(u"Image"), upload_to='upload', blank=True, + null=True, height_field='height', width_field='width') + height = models.IntegerField(_(u"Height"), blank=True, null=True) + width = models.IntegerField(_(u"Width"), blank=True, null=True) objects = BaseGeoManager() def __unicode__(self): @@ -320,6 +333,15 @@ class Marker(models.Model): self.default_category.pk) return settings.BASE_URL + 'ty/' + TinyUrl.getUrnByParameters(parameters) +""" +class PictureFile(models.Model): + name = models.CharField(_(u"Name"), max_length=150) + picture = models.ImageField(_(u"Image"), upload_to='upload', blank=True, + null=True, height_field='height', width_field='width') + height = models.IntegerField(_(u"Height"), blank=True, null=True) + width = models.IntegerField(_(u"Width"), blank=True, null=True) +""" + class RouteFile(models.Model): name = models.CharField(_(u"Name"), max_length=150) raw_file = models.FileField(_(u"Raw file (gpx or kml)"), upload_to='upload') @@ -375,11 +397,11 @@ class RouteFile(models.Model): return wkt_tpl % u','.join([u'%s %s' % (pt[0], pt[1]) \ for pt in pts]) -class Route(models.Model): +class Route(GeographicItem): '''Route on the map ''' - name = models.CharField(_(u"Name"), max_length=150) - categories = SelectMultipleField(SubCategory) + ref_item = models.ForeignKey("Route", blank=True, null=True, + verbose_name=_(u"Reference route"), related_name='submited_route') route = RouteField(_(u"Route"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) associated_file = models.ForeignKey(RouteFile, blank=True, null=True, @@ -388,20 +410,6 @@ class Route(models.Model): null=True, height_field='height', width_field='width') height = models.IntegerField(_(u"Height"), blank=True, null=True) width = models.IntegerField(_(u"Width"), blank=True, null=True) - STATUS = (('S', _(u'Submited')), - ('A', _(u'Available')), - ('D', _(u'Disabled')),) - STATUS_DCT = {} - for key, label in STATUS: - STATUS_DCT[key] = label - if settings.CHIMERE_DAYS_BEFORE_EVENT: - start_date = models.DateField(_(u"Start date"), blank=True, null=True, - help_text=_(u"Not mandatory. Set it for dated item such as event. "\ - u"Format YYYY-MM-DD")) - end_date = models.DateField(_(u"End date"), blank=True, null=True, - help_text=_(u"Not mandatory. Set it only if you have a multi-day "\ - u"event. Format YYYY-MM-DD")) - status = models.CharField(_(u"Status"), max_length=1, choices=STATUS) objects = BaseGeoManager() def __unicode__(self): diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html index f09a982..d333841 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -2,22 +2,23 @@ {% load sanitize %} <h2 class='ui-widget ui-state-default ui-corner-all ui-widget-header'>{{ marker.name }}</h2> <div id='detail_content'> - {% if marker.picture %}<img src='{{STATIC_URL}}{{marker.picture}}' alt='{{marker.name}}'/>{%endif%} + {% if marker.picture %}<img src='{{STATIC_URL}}{{marker.picture}}' alt='{{marker.name}}'/>{%endif%} <div> - {% if dated %} - <p id='detail_start_date'><label>{% trans "Date:" %}</label> <span>{{marker.start_date|date:"D d M Y"}} - {% if marker.end_date %} - {{marker.end_date|date:"D d M Y"}}</p>{% endif %}</span> - {% endif %} - {% for property in marker.getProperties %} - <p id='{{property.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4"|safe}}</p> - {% endfor %} - </div>{% if share_networks %} - {% if simple %}{% trans "Share on"%}{% for share_network in share_networks %} - <a href='{{share_network.1}}'>{{share_network.0}}</a> - {% endfor %}{%else%} - <ul id='share'> - <li>{% trans "Share"%}</li>{% for share_network in share_networks %} - <li><a href='{{share_network.1}}'><img src="{{share_network.2}}" alt="{{share_network.0}}"/></a></li> - {% endfor %}</ul>{% endif %} + {% if dated %} + <p id='detail_start_date'><label>{% trans "Date:" %}</label> <span>{{marker.start_date|date:"D d M Y"}} + {% if marker.end_date %} - {{marker.end_date|date:"D d M Y"}}</p>{% endif %}</span> + {% endif %} + {% for property in marker.getProperties %} + <p id='{{property.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4"|safe}}</p> + {% endfor %} + </div>{% if share_networks %} + {% if simple %}{% trans "Share on"%}{% for share_network in share_networks %} + <a href='{{share_network.1}}'>{{share_network.0}}</a> + {% endfor %}{%else%} + <ul id='share'> + <li>{% trans "Share"%}</li>{% for share_network in share_networks %} + <li><a href='{{share_network.1}}'><img src="{{share_network.2}}" alt="{{share_network.0}}"/></a></li> + {% endfor %}</ul>{% endif %} + <a href='{% url chimere:edit-marker area_name marker.pk %}'>{% trans "Submit a modification" %}</a> {% endif %} </div> diff --git a/chimere/templates/chimere/edit.html b/chimere/templates/chimere/edit.html index 4023a7e..d087f1a 100644 --- a/chimere/templates/chimere/edit.html +++ b/chimere/templates/chimere/edit.html @@ -18,7 +18,7 @@ <fieldset class='edit'> <legend>{% trans "Add a new site" %}</legend> <p>* {% trans "indicates a mandatory field" %}</p> - <form enctype="multipart/form-data" method='post' action='{{extra_url}}edit/'> + <form enctype="multipart/form-data" method='post' action='.'> {% csrf_token %} <div class="fieldWrapper"> <label for="id_name">{% trans "Site name"%} *</label> diff --git a/chimere/urls.py b/chimere/urls.py index f4f50d5..8a252f6 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -38,9 +38,11 @@ urlpatterns += patterns('chimere.views', url(r'^(?P<area_name>\w+)?/?contact/?$', 'contactus', name="contact"), url(r'^(?P<area_name>\w+)?/?submited/(?P<action>\w+)/?$', 'submited', name="submit"), - url(r'^(?P<area_name>\w+)?/?edit/?$', 'edit', + url(r'^(?P<area_name>\w+)?/?edit/$', 'edit', name="edit"), - url(r'^(?P<area_name>\w+)?/?edit_route/?$', 'editRoute', + url(r'^(?P<area_name>\w+)?/?edit/(?P<marker_id>\w+)/$', 'edit', + name="edit-marker"), + url(r'^(?P<area_name>\w+)?/?edit_route/$', 'editRoute', name="edit_route"), url(r'^(?P<area_name>\w+)?/?getDetail/(?P<marker_id>\d+)/?$', 'getDetail', name="get_detail"), @@ -57,7 +59,6 @@ urlpatterns += patterns('chimere.views', 'uploadFile', name='upload_file'), url(r'^(?P<area_name>\w+)?/?process_route_file/(?P<file_id>\d+)/$', 'processRouteFile', name='process_route_file'), - ) # At the end, because it catches large diff --git a/chimere/views.py b/chimere/views.py index ddf7874..e249d56 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -28,8 +28,9 @@ from django.conf import settings from django.core import serializers from django.core.urlresolvers import reverse from django.db.models import Q +from django.forms import model_to_dict from django.http import HttpResponseRedirect, HttpResponse -from django.shortcuts import render_to_response +from django.shortcuts import redirect, render_to_response from django.template import loader, RequestContext from django.utils import simplejson from django.utils.http import urlquote @@ -99,42 +100,77 @@ def index(request, area_name=None, default_area=None, simple=False): return render_to_response(tpl, response_dct, context_instance=RequestContext(request)) -def edit(request, area_name=""): +def edit(request, area_name="", marker_id=None): """ Edition page """ + response_dct = get_base_response(area_name) + + # if a marker_id is provided: modification + init_marker, ref_marker = None, None + if marker_id: + try: + init_marker = Marker.objects.get(pk=marker_id) + except: + return redirect('chimere:edit', area_name if area_name else '') + ref_marker = init_marker + modified_marker = Marker.objects.filter(ref_item=init_marker, + submiter_session_key=request.session.session_key) + if modified_marker.count(): + init_marker = modified_marker.all()[0] + # If the form has been submited if request.method == 'POST': - form = MarkerForm(request.POST, request.FILES) + inst = None + # allow to directly modify only if owner or superuser + if init_marker and (request.user.is_superuser or \ + init_marker.submiter_session_key == \ + request.session.session_key): + inst = init_marker + + form = MarkerForm(request.POST, request.FILES, instance=inst) # All validation rules pass if form.is_valid(): marker = form.save() - # set the submited status - marker.status = 'S' + # set the session key (to permit modifications) + marker.submiter_session_key = request.session.session_key + + # associate to the reference marker + if ref_marker: + marker.ref_item = ref_marker + if marker.pk != ref_marker.pk: + marker.status = 'M' + elif not marker.ref_item: + # initialisation + marker.ref_item = marker + + # just submited + if not marker.status: + marker.status = 'S' marker.save() notifySubmission(marker) response_dct = get_base_response(area_name) - return HttpResponseRedirect(response_dct['extra_url'] + \ - 'submited/edit') + return redirect('chimere:edit-marker', + area_name if area_name else '', marker.ref_item.pk) else: - # An unbound form - form = MarkerForm() - # get the « manualy » declared_fields. Ie: properties + form = MarkerForm(instance=init_marker) + # get the "manualy" declared_fields. Ie: properties declared_fields = form.declared_fields.keys() - response_dct = get_base_response(area_name) response_dct.update({'actions':actions, - 'action_selected':('contribute', 'edit'), - 'error_message':'', - 'map_layer':settings.CHIMERE_MAP_LAYER, - 'form':form, - 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT, - 'extra_head':form.media, - 'sub_categories':SubCategory.getAvailable(['M', 'B'], - area_name), - 'point_widget':PointChooserWidget().render('point', None, - area_name=area_name), - 'properties':declared_fields, - }) + 'action_selected':('contribute', 'edit'), + 'error_message':'', + 'map_layer':settings.CHIMERE_MAP_LAYER, + 'form':form, + 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT, + 'extra_head':form.media, + 'marker_id':marker_id, + 'sub_categories':SubCategory.getAvailable(['M', 'B'], + area_name), + 'point_widget':PointChooserWidget().render('point', + init_marker.point if init_marker else None, + area_name=area_name), + 'properties':declared_fields, + }) # manualy populate the custom widget if 'subcategory' in form.data and form.data['subcategory']: response_dct['current_category'] = int(form.data['subcategory']) @@ -310,7 +346,8 @@ def getDetail(request, area_name, marker_id): Get the detail for a marker ''' try: - marker = Marker.objects.filter(id=int(marker_id), status__in=['A', 'S'])[0] + marker = Marker.objects.filter(id=int(marker_id), + status__in=['A', 'S'])[0] except (ValueError, IndexError): return HttpResponse('no results') response_dct = get_base_response() @@ -388,7 +425,7 @@ def getGeoObjects(request, area_name, category_ids, status): idx += 1 try: q = checkDate(Q(status__in=status, categories__in=category_ids)) - query = Marker.objects.filter(q) + query = Marker.objects.filter(q).distinct('pk') except: return HttpResponse('no results') category_ids = [int(cat_id) for cat_id in category_ids] |