summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d (patch)
treeb96309b8e181ee2ae5a20bc52f7162fe96712156
parent6d4cf0337e09e67bb454c2116cce13846aa0d22d (diff)
downloadChimère-556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d.tar.bz2
Chimère-556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d.zip
Allow modification of markers on the main interface
-rw-r--r--chimere/actions.py6
-rw-r--r--chimere/forms.py3
-rw-r--r--chimere/migrations/0003_auto__add_field_route_submiter_session_key__add_field_route_submiter_e.py189
-rw-r--r--chimere/models.py66
-rw-r--r--chimere/templates/chimere/detail.html33
-rw-r--r--chimere/templates/chimere/edit.html2
-rw-r--r--chimere/urls.py7
-rw-r--r--chimere/views.py87
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]