diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-04-06 21:08:39 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-04-06 21:09:26 +0200 |
commit | 1d03951916abe35062d16336f6cf80c989004493 (patch) | |
tree | fb18a55495f1bbf3cd181f912ec3bee6ce94ade4 /chimere | |
parent | 2f843cc211968c135bd33ffa8838f5cf2d2b3129 (diff) | |
download | Chimère-1d03951916abe35062d16336f6cf80c989004493.tar.bz2 Chimère-1d03951916abe35062d16336f6cf80c989004493.zip |
Add public polygon edition form - import public edition forms
Diffstat (limited to 'chimere')
-rw-r--r-- | chimere/actions.py | 3 | ||||
-rw-r--r-- | chimere/fixtures/initial_data.json | 2 | ||||
-rw-r--r-- | chimere/forms.py | 33 | ||||
-rw-r--r-- | chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py | 392 | ||||
-rw-r--r-- | chimere/models.py | 114 | ||||
-rw-r--r-- | chimere/static/chimere/css/forms.css | 23 | ||||
-rw-r--r-- | chimere/static/chimere/css/styles.css | 2 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/polygon_edit.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/edit.html | 26 | ||||
-rw-r--r-- | chimere/templates/chimere/edit_polygon.html | 12 | ||||
-rw-r--r-- | chimere/urls.py | 5 | ||||
-rw-r--r-- | chimere/views.py | 47 | ||||
-rw-r--r-- | chimere/widgets.py | 2 |
14 files changed, 577 insertions, 88 deletions
diff --git a/chimere/actions.py b/chimere/actions.py index 49f4a90..ac2bbaf 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -48,7 +48,8 @@ default_actions = [ (Action('view', 'chimere:index', _('View')), []), (Action('contribute', 'chimere:edit', _('Contribute')), (Action('edit', 'chimere:edit', _('Add a new point of interest')), - Action('edit-route', 'chimere:editroute', _('Add a new route'))), + Action('edit-route', 'chimere:editroute', _('Add a new route')), + Action('edit-polygon', 'chimere:editpolygon', _('Add a new polygon'))), )] if hasattr(settings, 'CHIMERE_DIRECTORY') and settings.CHIMERE_DIRECTORY: diff --git a/chimere/fixtures/initial_data.json b/chimere/fixtures/initial_data.json index bd13fa4..b93ee4a 100644 --- a/chimere/fixtures/initial_data.json +++ b/chimere/fixtures/initial_data.json @@ -194,7 +194,7 @@ "pk": 1, "model": "chimere.layer", "fields": { - "layer_code": "new ol.layer.Tile({\r\n source: new ol.source.OSM()\r\n}),", + "layer_code": "new ol.layer.Tile({\r\n source: new ol.source.OSM()\r\n})", "name": "OSM - Mapnik" } }, diff --git a/chimere/forms.py b/chimere/forms.py index 312512e..55bb57a 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -369,6 +369,11 @@ MarkerBaseForm = type( get_properties(PropertyModel.objects.filter(available=True))) +EXCLUDED_FIELDS = ['status'] +if not settings.CHIMERE_SEARCH_ENGINE: + EXCLUDED_FIELDS.append('keywords') + + class MarkerForm(MarkerBaseForm): """ Form for the edit page @@ -376,11 +381,12 @@ class MarkerForm(MarkerBaseForm): ref_pk = forms.IntegerField(label=u" ", widget=forms.HiddenInput(), required=False) description = forms.CharField(widget=TextareaWidget, required=False) - keywords = forms.CharField(max_length=200, required=False) + keywords = forms.CharField(widget=TextareaWidget, max_length=200, + required=False) class Meta: model = Marker - exclude = ('status',) + exclude = EXCLUDED_FIELDS widgets = { 'description': TextareaWidget(), } @@ -437,10 +443,12 @@ class RouteForm(RouteAdminForm): widget=forms.HiddenInput) associated_file_id = forms.CharField( label=" ", required=False, widget=forms.HiddenInput) + keywords = forms.CharField(widget=TextareaWidget, max_length=200, + required=False) class Meta: model = Route - exclude = ('status',) + exclude = EXCLUDED_FIELDS def __init__(self, *args, **kwargs): if kwargs.get('instance'): @@ -501,6 +509,17 @@ class PolygonAdminForm(RouteAdminForm): model = Polygon +class PolygonForm(PolygonAdminForm): + """ + Form for the edit page + """ + description = forms.CharField(widget=TextareaWidget, required=False) + + class Meta: + model = Polygon + exclude = EXCLUDED_FIELDS + + class BaseFileForm(forms.ModelForm): id = forms.IntegerField(label=u"", widget=forms.HiddenInput(), required=False) @@ -510,8 +529,9 @@ class BaseFileForm(forms.ModelForm): raise ImproperlyConfigured super(BaseFileForm, self).__init__(*args, **kwargs) self.fields.pop('marker') + self.fields.pop('polygon') - def save(self, associated_marker): + def save(self, associated_item): if not hasattr(self, 'cleaned_data') or not self.cleaned_data: return instance = None @@ -527,7 +547,10 @@ class BaseFileForm(forms.ModelForm): instance.delete() return self.cleaned_data.pop('DELETE') - self.cleaned_data['marker'] = associated_marker + if type(associated_item) == Marker: + self.cleaned_data['marker'] = associated_item + if type(associated_item) == Polygon: + self.cleaned_data['polygon'] = associated_item if instance: for k in self.cleaned_data: setattr(instance, k, self.cleaned_data[k]) diff --git a/chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py b/chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py new file mode 100644 index 0000000..7a83c9e --- /dev/null +++ b/chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py @@ -0,0 +1,392 @@ +# -*- coding: 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 'PictureFile.polygon' + db.add_column('chimere_picturefile', 'polygon', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='pictures', null=True, to=orm['chimere.Polygon']), + keep_default=False) + + + # Changing field 'PictureFile.marker' + db.alter_column('chimere_picturefile', 'marker_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['chimere.Marker'])) + # Adding field 'MultimediaFile.polygon' + db.add_column('chimere_multimediafile', 'polygon', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='multimedia_files', null=True, to=orm['chimere.Polygon']), + keep_default=False) + + + # Changing field 'MultimediaFile.marker' + db.alter_column('chimere_multimediafile', 'marker_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['chimere.Marker'])) + + def backwards(self, orm): + # Deleting field 'PictureFile.polygon' + db.delete_column('chimere_picturefile', 'polygon_id') + + + # User chose to not deal with backwards NULL issues for 'PictureFile.marker' + raise RuntimeError("Cannot reverse this migration. 'PictureFile.marker' and its values cannot be restored.") + # Deleting field 'MultimediaFile.polygon' + db.delete_column('chimere_multimediafile', 'polygon_id') + + + # User chose to not deal with backwards NULL issues for 'MultimediaFile.marker' + raise RuntimeError("Cannot reverse this migration. 'MultimediaFile.marker' and its values cannot be restored.") + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'chimere.aggregatedroute': { + 'Meta': {'object_name': 'AggregatedRoute', 'db_table': "'chimere_aggregated_routes'", 'managed': 'False'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'route': ('django.contrib.gis.db.models.fields.MultiLineStringField', [], {}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'subcategory': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.SubCategory']"}) + }, + 'chimere.area': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'}, + 'allow_point_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'allow_polygon_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'allow_route_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'default_subcategories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False', 'blank': 'True'}), + 'dynamic_categories': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'external_css': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layers': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'through': "orm['chimere.AreaLayers']", 'to': "orm['chimere.Layer']"}), + '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', [], {'unique': 'True'}), + 'restrict_to_extent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'db_table': "'chimere_subcategory_areas'", 'to': "orm['chimere.SubCategory']"}), + 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'urn': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'}), + 'welcome_message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.arealayers': { + 'Meta': {'ordering': "('order',)", 'object_name': 'AreaLayers'}, + 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Area']"}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Layer']"}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + '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': '200'}), + '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'}), + 'offset_x': ('django.db.models.fields.IntegerField', [], {'default': '10'}), + 'offset_y': ('django.db.models.fields.IntegerField', [], {'default': '20'}), + 'popup_offset_x': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'popup_offset_y': ('django.db.models.fields.IntegerField', [], {'default': '20'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.importer': { + 'Meta': {'object_name': 'Importer'}, + 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'automatic_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.SubCategory']", 'null': 'True', 'blank': 'True'}), + 'default_description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'default_localisation': ('chimere.widgets.PointField', [], {'null': 'True', 'blank': 'True'}), + 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'default_status': ('django.db.models.fields.CharField', [], {'default': "'I'", 'max_length': '1'}), + 'filtr': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'get_description': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'importer_type': ('django.db.models.fields.CharField', [], {'max_length': '4'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'source_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'source_file_alt': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'chimere.importerkeycategories': { + 'Meta': {'object_name': 'ImporterKeyCategories'}, + 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.SubCategory']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'importer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'key_categories'", 'to': "orm['chimere.Importer']"}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + 'chimere.layer': { + 'Meta': {'object_name': 'Layer'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_code': ('django.db.models.fields.TextField', [], {'max_length': '300'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + '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'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'keywords': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '1000', '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.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'multimedia_files'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']", 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'polygon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'multimedia_files'", 'null': 'True', 'to': "orm['chimere.Polygon']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'chimere.multimediatype': { + 'Meta': {'object_name': 'MultimediaType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.news': { + 'Meta': {'ordering': "['-date']", 'object_name': 'News'}, + 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'date': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'ordering': "['order']", 'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pictures'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'polygon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pictures'", 'null': 'True', 'to': "orm['chimere.Polygon']"}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.polygon': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Polygon'}, + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + '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'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'inner_color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'keywords': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'polygon': ('chimere.widgets.PolygonField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_polygon'", 'null': 'True', 'to': "orm['chimere.Polygon']"}), + '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.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', '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.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'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + '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'}), + 'color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'has_associated_marker': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'keywords': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.TextField', [], {}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), + '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.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', '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'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + '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'}), + 'keywords': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'routing_warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.subcategoryuserlimit': { + 'Meta': {'object_name': 'SubCategoryUserLimit'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'subcategory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'limited_for_user'", 'to': "orm['chimere.SubCategory']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategory_limit_to'", 'to': "orm['auth.User']"}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '500'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/models.py b/chimere/models.py index f27562b..5d0b93c 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -494,8 +494,8 @@ class ImporterKeyCategories(models.Model): class GeographicItem(models.Model): - name = models.TextField(_(u"Name")) categories = SelectMultipleField(SubCategory) + name = models.TextField(_(u"Name")) submiter_session_key = models.CharField( _(u"Submitter session key"), blank=True, null=True, max_length=40) submiter_name = models.CharField(_(u"Submitter name or nickname"), @@ -664,6 +664,16 @@ class GeographicItem(models.Model): def all_properties(cls): return [pm for pm in PropertyModel.objects.all()] + def get_init_multi(self): + multis = [forms.model_to_dict(multi) + for multi in self.multimedia_files.all()] + return multis + + def get_init_picture(self): + picts = [forms.model_to_dict(pict) + for pict in self.pictures.all()] + return picts + def property_setter(cls, propertymodel): def setter(self, value): @@ -697,16 +707,6 @@ class Marker(GeographicItem): ordering = ('status', 'name') verbose_name = _(u"Point of interest") - def get_init_multi(self): - multis = [forms.model_to_dict(multi) - for multi in self.multimedia_files.all()] - return multis - - def get_init_picture(self): - picts = [forms.model_to_dict(pict) - for pict in self.pictures.all()] - return picts - @property def multimedia_items(self): pict = list(self.pictures.filter(miniature=False).all()) @@ -864,6 +864,47 @@ def marker_post_save(sender, **kwargs): post_save.connect(marker_post_save, sender=Marker) +class Polygon(GeographicItem): + '''Polygon on the map + ''' + ref_item = models.ForeignKey( + "Polygon", blank=True, null=True, verbose_name=_(u"Reference polygon"), + related_name='submited_polygon') + polygon = PolygonField( + _(u"Polygon"), 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) + color = models.CharField( + _(u"Color"), max_length=200, help_text=_(u"HTML code/name"), + blank=True, null=True) + inner_color = models.CharField( + _(u"Inner color"), max_length=200, + help_text=_(u"HTML code/name"), blank=True, null=True) + objects = models.GeoManager() + + class Meta: + ordering = ('status', 'name') + verbose_name = _(u"Polygon") + + @property + def geom_attr(self): + return 'polygon' + + def getGeoJSON(self, color="#000", inner_color='#0F0'): + '''Return a GeoJSON string + ''' + attributes = {"type": "Feature", + "geometry": json.loads(self.polygon.geojson), + "properties": {"pk": self.id, "name": self.name, + 'key': "polygon-{}".format(self.pk), + "color": color, + "inner_color": inner_color}} + return json.dumps(attributes) + + class MultimediaType(models.Model): MEDIA_TYPES = (('A', _(u"Audio")), ('V', _(u"Video")), @@ -937,7 +978,10 @@ class MultimediaFile(models.Model): miniature = models.BooleanField( _(u"Display inside the description?"), default=settings.CHIMERE_MINIATURE_BY_DEFAULT) - marker = models.ForeignKey(Marker, related_name='multimedia_files') + marker = models.ForeignKey(Marker, related_name='multimedia_files', + blank=True, null=True) + polygon = models.ForeignKey(Polygon, related_name='multimedia_files', + blank=True, null=True) class Meta: verbose_name = _(u"Multimedia file") @@ -1011,7 +1055,10 @@ class PictureFile(models.Model): thumbnailfile_width = models.IntegerField(_(u"Thumbnail width"), blank=True, null=True) order = models.IntegerField(_(u"Order"), default=1) - marker = models.ForeignKey(Marker, related_name='pictures') + marker = models.ForeignKey(Marker, related_name='pictures', blank=True, + null=True) + polygon = models.ForeignKey(Polygon, related_name='pictures', blank=True, + null=True) def __unicode__(self): return self.name or u"" @@ -1352,47 +1399,6 @@ class AggregatedRoute(models.Model): return json.dumps(attributes) -class Polygon(GeographicItem): - '''Polygon on the map - ''' - ref_item = models.ForeignKey( - "Polygon", blank=True, null=True, verbose_name=_(u"Reference polygon"), - related_name='submited_polygon') - polygon = PolygonField( - _(u"Polygon"), 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) - color = models.CharField( - _(u"Color"), max_length=200, help_text=_(u"HTML code/name"), - blank=True, null=True) - inner_color = models.CharField( - _(u"Inner color"), max_length=200, - help_text=_(u"HTML code/name"), blank=True, null=True) - objects = models.GeoManager() - - class Meta: - ordering = ('status', 'name') - verbose_name = _(u"Polygon") - - @property - def geom_attr(self): - return 'polygon' - - def getGeoJSON(self, color="#000", inner_color='#0F0'): - '''Return a GeoJSON string - ''' - attributes = {"type": "Feature", - "geometry": json.loads(self.polygon.geojson), - "properties": {"pk": self.id, "name": self.name, - 'key': "polygon-{}".format(self.pk), - "color": color, - "inner_color": inner_color}} - return json.dumps(attributes) - - class SimplePoint: """ Point in the map (not in the database) diff --git a/chimere/static/chimere/css/forms.css b/chimere/static/chimere/css/forms.css index 2c852d7..99c522f 100644 --- a/chimere/static/chimere/css/forms.css +++ b/chimere/static/chimere/css/forms.css @@ -15,19 +15,17 @@ /**/ div.rightWrapper{ - width: 100%; - float:left; + /* width: 100%; + float:left;*/ } div.rightform{ - margin-left:400px; - height:400px; + /*margin-left:400px;*/ + height:450px; } div.leftform{ - float: left; - width: 400px; - margin-left: -100%; + /* width: 400px;*/ } div.bottomform{ @@ -35,11 +33,21 @@ div.bottomform{ width: 100%; } +.edit .fieldWrapper{ + display:inline-block; +} + +.fieldWrapper.full{ + width:100%; + display:block; +} + #map_edit, #map_edit_area{ margin:0; border: 1px solid black; width:100%; height:350px; + clear: both; } #map_edit #OpenLayers_Control_MaximizeDiv, @@ -69,7 +77,6 @@ div.bottomform{ #live_lonlat{ margin:1em; - float:left; } #live_lonlat p{ diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 9a0e4fb..645bfa5 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -173,7 +173,7 @@ fieldset{ } .edit label{ - display:block; + display:inline; } a:link[disabled], diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 79a9e37..f7f11cb 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -1952,7 +1952,7 @@ function transform(obj) { initFeature: function(wkt_geometry){ feature = settings.WKT.readFeature(wkt_geometry, { dataProjection: EPSG_DISPLAY_PROJECTION, - featureProjectsion: EPSG_PROJECTION}); + featureProjection: EPSG_PROJECTION}); if (settings.draw_activated){ settings.map.removeInteraction(settings.draw); settings.draw_activated = false; diff --git a/chimere/templates/chimere/blocks/polygon_edit.html b/chimere/templates/chimere/blocks/polygon_edit.html index 98d5f7f..be112d2 100644 --- a/chimere/templates/chimere/blocks/polygon_edit.html +++ b/chimere/templates/chimere/blocks/polygon_edit.html @@ -17,8 +17,6 @@ {% if default_area %} chimere_init_options['selected_map_layer'] = {{default_area}};{% endif %} </script> -</div> - <div id='popup'></div> <div id='map_edit'></div> <div class='help'>{% trans "To delete a vertice, hold the SHIFT key and click." %}</div> diff --git a/chimere/templates/chimere/edit.html b/chimere/templates/chimere/edit.html index 0e1b849..ff4e514 100644 --- a/chimere/templates/chimere/edit.html +++ b/chimere/templates/chimere/edit.html @@ -22,50 +22,52 @@ {% endif %}</fieldset> {% if is_modification and is_superuser %}<div class='warning'><p>{% trans "You are logged as an administrator. Your modifications will be taking into account immediately." %}</p></div>{% endif %} <fieldset class='edit'> - <legend>{% if is_modification %}{% trans "Modify a point of interest" %}{% else %}{% trans "Add a point of interest" %}{% endif %}</legend> + {% block legend %}<legend>{% if is_modification %}{% trans "Modify a point of interest" %}{% else %}{% trans "Add a point of interest" %}{% endif %}</legend>{% endblock %} <form enctype="multipart/form-data" method='post' action='.'> {% csrf_token %} <div class='rightWrapper'> <div class='rightform'> - <div class="fieldWrapper"> + <div class="fieldWrapper full"> + {% block geometry %} <label for="id_point">{% trans "Point"%} *</label> {%if form.point.errors %}<ul class="errorlist"><li>{% trans "Select a location for this new site" %}</li></ul>{%endif%} {{point_widget}} + {% endblock %} </div> </div> </div> <div class='leftform'> <p>* {% trans "indicates a mandatory field" %}</p> + <div class="fieldWrapper full"> + <label for="id_subcategory">{% trans "Categories" %} *</label> + {% if form.categories.errors %}<div class='errors'>{{ form.categories.errors }}</div>{% endif %} + {{ form.categories }} + </div> <div class="fieldWrapper"> <label for="id_name">{% trans "Name"%} *</label> {% if form.name.errors %}<div class='errors'>{{ form.name.errors }}</div>{% endif %} {{ form.name }} </div> <div class="fieldWrapper"> - <label for="id_subcategory">{% trans "Categories" %} *</label> - {% if form.categories.errors %}<div class='errors'>{{ form.categories.errors }}</div>{% endif %} - {{ form.categories }} - </div> - <div class="fieldWrapper"> <label for="id_description">{% trans "Description" %}</label> {{ form.description.errors }} {{ form.description }} <p class="help">{{ form.description.help_text }}</p> </div> - <div class="fieldWrapper"> + {% if form.keywords %}<div class="fieldWrapper"> <label for="id_keywords">{% trans "Keywords" %}</label> {{ form.keywords.errors }} {{ form.keywords }} <p class="help">{{ form.keywords.help_text }}</p> - </div> + </div>{% endif %} {% if dated %} - <div class="fieldWrapper"> + <div class="fieldWrapper full"> <label for="id_start_date">{% trans "Start date" %}</label> {{ form.start_date.errors }} {{ form.start_date }} <p class="help">{{ form.start_date.help_text }}</p> </div> - <div class="fieldWrapper"> + <div class="fieldWrapper full"> <label for="id_end_date">{% trans "End date" %}</label> {{ form.end_date.errors }} {{ form.end_date }} @@ -131,7 +133,7 @@ {% if form.submiter_email.errors %}<div class='errors'>{{ form.submiter_email.errors }}</div>{% endif %} {{ form.submiter_email }} </div> - <div class="fieldWrapper"> + <div class="fieldWrapper full"> <label for="id_submiter_comment">{% trans "Comments about your submission"%}</label> {% if form.submiter_comment.errors %}<div class='errors'>{{ form.submiter_comment.errors }}</div>{% endif %} {{ form.submiter_comment }} diff --git a/chimere/templates/chimere/edit_polygon.html b/chimere/templates/chimere/edit_polygon.html new file mode 100644 index 0000000..7bba0d0 --- /dev/null +++ b/chimere/templates/chimere/edit_polygon.html @@ -0,0 +1,12 @@ +{% extends "chimere/edit.html" %} +{% load i18n chimere_tags adminmedia inline_formset%} + +{% block legend %} +<legend>{% if is_modification %}{% trans "Modify a polygon" %}{% else %}{% trans "Add a polygon" %}{% endif %}</legend> +{% endblock %} + +{% block geometry %} +<label for="id_polygon">{% trans "Polygon"%} *</label> +{%if form.polygon.errors %}<ul class="errorlist"><li>{% trans "Draw the associated polygon" %}</li></ul>{%endif%} +{{polygon_widget}} +{% endblock %} diff --git a/chimere/urls.py b/chimere/urls.py index b8ac58b..5fd8002 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -106,6 +106,11 @@ urlpatterns += patterns( url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit-route/(?P<item_id>\w+)/' r'(?P<submited>\w+)?$', 'editRoute', name="editroute-item"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit-polygon/$', 'editPolygon', + name="editpolygon"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit-polygon/(?P<item_id>\w+)/' + r'(?P<submited>\w+)?$', + 'editPolygon', name="editpolygon-item"), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getDetail/' r'(?P<key>[a-zA-Z_-]*\d+)/?$', 'getDetail', name="get_detail"), diff --git a/chimere/views.py b/chimere/views.py index 7315ee1..9ecd240 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -49,10 +49,11 @@ from chimere.models import Category, SubCategory, PropertyModel, Page,\ Marker, Route, Polygon, SimpleArea, Area, Color, TinyUrl, RouteFile,\ AggregatedRoute -from chimere.widgets import PointChooserWidget, RouteChooserWidget, AreaWidget +from chimere.widgets import PointChooserWidget, RouteChooserWidget, AreaWidget,\ + PolygonChooserWidget from chimere.forms import MarkerForm, RouteForm, ContactForm, FileForm, \ FullFileForm, MultimediaFileFormSet, PictureFileFormSet, notifySubmission,\ - notifyStaff, AreaForm, RoutingForm + notifyStaff, AreaForm, RoutingForm, PolygonForm from chimere.route import router @@ -295,6 +296,7 @@ def get_edit_page(redirect_url, item_cls, item_form, marker = item if not isinstance(marker, Marker) \ + and hasattr(item, 'associated_marker') \ and item.associated_marker.count(): marker = item.associated_marker.all()[0] if marker: @@ -482,6 +484,47 @@ def editRoute(request, area_name="", item_id=None, submited=False): return render_to_response('chimere/edit_route.html', response_dct, context_instance=RequestContext(request)) +get_edit_polygon = get_edit_page('chimere:editpolygon', Polygon, PolygonForm) + + +def editPolygon(request, area_name="", item_id=None, submited=False): + """ + Polygon edition page + """ + response, values, sub_categories = get_edit_polygon(request, area_name, + item_id, ['R', 'B']) + if response: + return response + item_id, init_item, response_dct, form, formset_multi, formset_picture = \ + values + + # get the "manualy" declared_fields. Ie: properties + declared_fields = form.declared_fields.keys() + polygon_value = init_item.polygon if init_item else None + if request.POST and request.POST.get('polygon'): + polygon_value = request.POST.get('polygon') + response_dct.update({ + 'actions': actions(response_dct['area_name']), + 'action_selected': ('contribute', 'edit-polygon'), + 'error_message': '', + 'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER, + 'form': form, + 'formset_multi': formset_multi, + 'formset_picture': formset_picture, + 'dated': settings.CHIMERE_DAYS_BEFORE_EVENT, + 'extra_head': form.media, + 'sub_categories': sub_categories, + 'polygon_widget': PolygonChooserWidget().render( + 'polygon', polygon_value, area_name=response_dct['area_name'],), + 'properties': declared_fields, + 'submited': submited + }) + # manualy populate the custom widget + if 'subcategory' in form.data and form.data['subcategory']: + response_dct['current_category'] = int(form.data['subcategory']) + return render_to_response('chimere/edit_polygon.html', response_dct, + context_instance=RequestContext(request)) + def submited(request, area_name="", action=""): """ diff --git a/chimere/widgets.py b/chimere/widgets.py index d8c6de1..7fccca4 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -411,7 +411,7 @@ class RouteChooserWidget(forms.TextInput): chimere_init_options['edition'] = true; chimere_init_options['edition_type_is_route'] = true; chimere_init_options["checked_categories"] = []; - """ % (reverse("chimere:index"), settings.STATIC_URL, + """ % (reverse("chimere:index"), settings.CHIMERE_EPSG_DISPLAY_PROJECTION, settings.CHIMERE_EPSG_PROJECTION, settings.CHIMERE_DEFAULT_CENTER[0], |