summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py389
-rw-r--r--chimere/models.py24
-rw-r--r--chimere/static/chimere/js/jquery.chimere.js122
-rw-r--r--chimere/urls.py5
-rw-r--r--chimere/views.py102
5 files changed, 570 insertions, 72 deletions
diff --git a/chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py b/chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py
new file mode 100644
index 0000000..afc59fc
--- /dev/null
+++ b/chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py
@@ -0,0 +1,389 @@
+# -*- 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 'Polygon.color'
+ db.add_column('chimere_polygon', 'color',
+ self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Polygon.inner_color'
+ db.add_column('chimere_polygon', 'inner_color',
+ self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Route.color'
+ db.add_column('chimere_route', 'color',
+ self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True),
+ keep_default=False)
+
+
+ # Changing field 'Color.code'
+ db.alter_column('chimere_color', 'code', self.gf('django.db.models.fields.CharField')(max_length=20))
+
+ def backwards(self, orm):
+ # Deleting field 'Polygon.color'
+ db.delete_column('chimere_polygon', 'color')
+
+ # Deleting field 'Polygon.inner_color'
+ db.delete_column('chimere_polygon', 'inner_color')
+
+ # Deleting field 'Route.color'
+ db.delete_column('chimere_route', 'color')
+
+
+ # Changing field 'Color.code'
+ db.alter_column('chimere_color', 'code', self.gf('django.db.models.fields.CharField')(max_length=6))
+
+ 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'},
+ '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': '20'}),
+ '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': '5'}),
+ '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', [], {'related_name': "'multimedia_files'", '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'}),
+ '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', [], {'related_name': "'pictures'", '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'}),
+ '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': '20', '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': '20', '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': '20', '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 f605e08..62be67a 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -187,7 +187,8 @@ class ColorTheme(models.Model):
class Color(models.Model):
"""Color
"""
- code = models.CharField(_(u"Code"), max_length=6)
+ code = models.CharField(_(u"Code/name"), max_length=20,
+ help_text=_(u"HTML code/name"))
order = models.IntegerField(_(u"Order"))
color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"))
@@ -753,6 +754,7 @@ class Marker(GeographicItem):
items['geometry'] = json.loads(self.point.geojson)
items['properties'].update({
'pk': self.id,
+ 'key': "marker-{}".format(self.id),
'name': self.name,
'icon_path': unicode(cat.icon.image),
'icon_hover_path': unicode(cat.hover_icon.image)
@@ -1178,6 +1180,9 @@ class Route(GeographicItem):
width = models.IntegerField(_(u"Width"), blank=True, null=True)
has_associated_marker = models.BooleanField(_(u"Has an associated marker"),
default=True)
+ color = models.CharField(
+ _(u"Color"), max_length=20, help_text=_(u"HTML code/name"),
+ blank=True, null=True)
objects = models.GeoManager()
class Meta:
@@ -1229,11 +1234,10 @@ class Route(GeographicItem):
def getGeoJSON(self, color="#000"):
'''Return a GeoJSON string
'''
- if '#' not in color:
- color = '#' + color
attributes = {"type": "Feature",
"geometry": json.loads(self.route.geojson),
"properties": {"pk": self.id, "name": self.name,
+ 'key': "route-{}".format(self.pk),
"color": color}}
return json.dumps(attributes)
@@ -1336,6 +1340,7 @@ class AggregatedRoute(models.Model):
attributes = {
'color': color, 'geometry': json.loads(self.route.geojson),
'type': "Feature", "properties": {
+ 'key': "aggroute-{}".format(self.pk),
"pk": self.id, "name": u'Aggregated route'}}
return json.dumps(attributes)
@@ -1353,6 +1358,12 @@ class Polygon(GeographicItem):
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=20, help_text=_(u"HTML code/name"),
+ blank=True, null=True)
+ inner_color = models.CharField(
+ _(u"Inner color"), max_length=20,
+ help_text=_(u"HTML code/name"), blank=True, null=True)
objects = models.GeoManager()
class Meta:
@@ -1366,13 +1377,10 @@ class Polygon(GeographicItem):
def getGeoJSON(self, color="#000", inner_color='#0F0'):
'''Return a GeoJSON string
'''
- if '#' not in color:
- color = '#' + color
- if '#' not in inner_color:
- color = '#' + inner_color
attributes = {"type": "Feature",
- "geometry": json.loads(self.route.geojson),
+ "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)
diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js
index 057854a..565598f 100644
--- a/chimere/static/chimere/js/jquery.chimere.js
+++ b/chimere/static/chimere/js/jquery.chimere.js
@@ -325,16 +325,16 @@ function transform(obj) {
/* marker layer */
settings.iconStyles = new Object();
- settings.markers = new ol.Collection();
+ settings.dbFeatures = new ol.Collection();
- settings.sourceMarkers = new ol.source.Vector({
- features: settings.markers
+ settings.sourceDbFeatures = new ol.source.Vector({
+ features: settings.dbFeatures
});
- settings.layerMarkers = new ol.layer.Vector({
- source: settings.sourceMarkers
+ settings.layerDbFeatures = new ol.layer.Vector({
+ source: settings.sourceDbFeatures
});
- settings.map.addLayer(settings.layerMarkers);
+ settings.map.addLayer(settings.layerDbFeatures);
// popup management
settings.popup_item = document.getElementById('popup');
@@ -357,17 +357,28 @@ function transform(obj) {
if (!settings.edition){
if (feature) {
$(settings.popup_item).popover('destroy');
- var coords = feature.getGeometry().getCoordinates();
- settings.popup.setPosition(coords);
- settings.popup.setOffset([feature.get('popup_offset_x'),
- -feature.get('popup_offset_y')]);
+ var geom = feature.getGeometry();
+ if (geom.getType() == 'Point'){
+ settings.popup.setPosition(geom.getCoordinates());
+ settings.popup.setOffset([feature.get('popup_offset_x'),
+ -feature.get('popup_offset_y')]);
+ } else if (geom.getType() == 'Polygon'){
+ settings.popup.setPosition(geom.getInteriorPoint().getCoordinates());
+ settings.popup.setOffset([0, 0]);
+ } else if (geom.getType() == 'LineString'){
+ settings.popup.setPosition(geom.getCoordinatesAt(0.5));
+ settings.popup.setOffset([0, 0]);
+ } else if (geom.getType() == 'MultipleLineString'){
+ settings.popup.setPosition(geom.getLineString(0).getCoordinatesAt(0.5));
+ settings.popup.setOffset([0, 0]);
+ }
$(settings.popup_item).popover({
'placement': 'top',
'html': true,
'content': feature.get('name')
});
$(settings.popup_item).popover('show');
- methods.display_feature_detail(feature.get('pk'));
+ methods.display_feature_detail(feature.get('key'));
} else {
$(settings.popup_item).popover('destroy');
}
@@ -386,7 +397,15 @@ function transform(obj) {
settings.WKT = new ol.format.WKT();
/* Vectors layer */
- settings.layerVectors = new ol.layer.Vector();
+ settings.vectors = new ol.Collection();
+
+ settings.sourceVectors = new ol.source.Vector({
+ features: settings.vectors
+ });
+
+ settings.layerVectors = new ol.layer.Vector({
+ source: settings.sourceVectors
+ });
settings.map.addLayer(settings.layerVectors);
if (settings.edition && (settings.edition_type == 'polygon'
|| settings.edition_type == 'route')){
@@ -554,11 +573,11 @@ function transform(obj) {
settings.layerIcons = new ol.source.Vector({
features: settings.icons
});
- settings.layerMarkers = new ol.layer.Vector({
+ settings.layerDbFeatures = new ol.layer.Vector({
source: settings.layerIcons
});
- settings.map.addLayer(settings.layerMarkers);
+ settings.map.addLayer(settings.layerDbFeatures);
/* OL3-deprecated
if (settings.dynamic_categories){
@@ -640,8 +659,8 @@ function transform(obj) {
if (settings.display_feature){
/// OL3-TODO
var is_displayed = false;
- for(j=0; j<settings.layerMarkers.markers.length;j++){
- var c_marker = settings.layerMarkers.markers[j];
+ for(j=0; j<settings.layerDbFeatures.markers.length;j++){
+ var c_marker = settings.layerDbFeatures.markers[j];
if(c_marker.pk == settings.display_feature){
is_displayed = true;
}
@@ -834,7 +853,8 @@ function transform(obj) {
$.ajax({url: uri,
dataType: "json",
success: function (data) {
- settings.markers.clear();
+ settings.dbFeatures.clear();
+ settings.vectors.clear();
/// OL3-TODO
// settings.layerVectors.removeAllFeatures();
if (settings.enable_clustering){
@@ -846,6 +866,8 @@ function transform(obj) {
var feature = data.features[i];
if (feature.geometry.type == 'Point'){
methods.addMarker(feature);
+ } else if (feature.geometry.type == 'Polygon') {
+ methods.addPolygon(feature);
} else if (feature.geometry.type == 'LineString') {
//OL3 methods.addRoute(feature);
} else if (feature.geometry.type == 'MultiLineString') {
@@ -860,7 +882,8 @@ function transform(obj) {
// settings.map.resetLayersZIndex();
},
error: function (data, textStatus, errorThrown) {
- settings.markers.clear();
+ settings.dbFeatures.clear();
+ settings.vectors.clear();
/// OL3-TODO
//settings.layerVectors.removeAllFeatures();
//if (settings.enable_clustering){
@@ -876,8 +899,8 @@ function transform(obj) {
razMap: function() {
methods.hidePopup();
methods.uncheckCategories();
- settings.markers.clear();
- settings.layerVectors.removeAllFeatures();
+ settings.dbFeatures.clear();
+ settings.vectors.clear();
if (settings.enable_clustering){
settings.layerCluster.removeAllFeatures();
settings.cluster_array = [];
@@ -1056,11 +1079,11 @@ function transform(obj) {
}
}
}
- for(j=0; j<settings.layerMarkers.markers.length;j++){
- if(hidden_feature_idx.indexOf(settings.layerMarkers.markers[j].pk) > -1){
- settings.layerMarkers.markers[j].display(false);
+ for(j=0; j<settings.layerDbFeatures.markers.length;j++){
+ if(hidden_feature_idx.indexOf(settings.layerDbFeatures.markers[j].pk) > -1){
+ settings.layerDbFeatures.markers[j].display(false);
} else {
- settings.layerMarkers.markers[j].display(true);
+ settings.layerDbFeatures.markers[j].display(true);
}
}
},
@@ -1095,6 +1118,7 @@ function transform(obj) {
geometry: transform(new ol.geom.Point([lon, lat])),
name: mark.properties.name,
pk: mark.properties.pk,
+ key: mark.properties.key,
popup_offset_x: mark.properties.icon_popup_offset_x,
popup_offset_y: mark.properties.icon_popup_offset_y
});
@@ -1123,7 +1147,7 @@ function transform(obj) {
}
iconFeature.setStyle(iconStyle);
- settings.markers.push(iconFeature);
+ settings.dbFeatures.push(iconFeature);
return;
@@ -1133,7 +1157,6 @@ function transform(obj) {
if (mark.properties.icon_hover_path){
var icon_hover_url = MEDIA_URL + mark.properties.icon_hover_path;
}
- */
feature.pk = mark.properties.pk;
feature.popupClass = settings.popupClass;
@@ -1149,12 +1172,12 @@ function transform(obj) {
marker.icon_url = icon_url;
marker.icon_hover_url = icon_hover_url;
marker.category_name = mark.properties.category_name;
- /* manage markers events */
+ // manage markers events
var _popup = function() {
if (!feature.pk){
return;
}
- /* show the popup */
+ // show the popup
if (settings.current_popup != null) {
settings.current_popup.hide();
}
@@ -1165,7 +1188,7 @@ function transform(obj) {
feature.popup.toggle();
}
settings.current_popup = feature.popup;
- /* hide on click on the cloud */
+ // hide on click on the cloud
if (!settings.explicit_popup_hide){
settings.current_popup.groupDiv.onclick = methods.hidePopup;
}
@@ -1173,7 +1196,7 @@ function transform(obj) {
methods.update_permalink_activation();
}
var _repan_popup = function(){
- /* re-pan manually */
+ // re-pan manually
// no clean way to detect if all the element are ready
// lack of better...
@@ -1272,8 +1295,8 @@ function transform(obj) {
marker.events.register('touchstart', feature, markerClick);
marker.events.register('mouseover', feature, markerOver);
marker.events.register('mouseout', feature, markerOut);
- settings.layerMarkers.addMarker(marker);
- /* show the item when designed in the permalink */
+ settings.layerDbFeatures.addMarker(marker);
+ // show the item when designed in the permalink
if (settings.display_feature == feature.pk){
settings.current_feature = feature;
_popup(feature);
@@ -1299,6 +1322,7 @@ function transform(obj) {
}
return feature;
+ */
},
cleanRoute: function(){
settings.layerVectors.removeAllFeatures();
@@ -1367,6 +1391,24 @@ function transform(obj) {
settings.map.getProjectionObject());
settings.layerVectors.addFeatures(feats);
},
+ // Put a polygon on the map
+ addPolygon: function(feature) {
+ settings.dbFeatures.extend(
+ new ol.format.GeoJSON().readFeatures(feature));
+
+ return
+ var gformat = new OpenLayers.Format.GeoJSON();
+ var feats = gformat.read(feature);
+ var style = OpenLayers.Util.extend({},
+ OpenLayers.Feature.Vector.style['default']);
+ style.strokeColor = feature.properties.color;
+ style.strokeWidth = 2;
+ feats[0].style = style;
+ feats[0].geometry = feats[0].geometry.transform(
+ EPSG_DISPLAY_PROJECTION,
+ settings.map.getProjectionObject());
+ settings.layerVectors.addFeatures(feats);
+ },
routingInputChange: function(nominatim_id){
$('#map_menu_clear').show();
switch(nominatim_id){
@@ -1655,13 +1697,13 @@ function transform(obj) {
settings.layerRoute.addFeatures([current_route]);
return current_route;
},
- display_feature_detail: function (pk) {
+ display_feature_detail: function (key) {
/*
* update current detail panel with an AJAX request
*/
var uri = extra_url
if (settings.area_id) uri += settings.area_id + "/"
- uri += "getDetail/" + pk;
+ uri += "getDetail/" + key;
var params = {}
if (settings.simple) { params["simple"] = 1; }
$.ajax({url: uri,
@@ -1801,7 +1843,7 @@ function transform(obj) {
},
zoomToMarkerExtent: function(){
settings.map.zoomToExtent(
- settings.layerMarkers.getDataExtent());
+ settings.layerDbFeatures.getDataExtent());
},
// methods for edition
setMarker: function (event){
@@ -1812,7 +1854,7 @@ function transform(obj) {
},
cleanMarker: function(){
if (settings.current_edit_feature) {
- settings.layerMarkers.removeMarker(settings.current_edit_feature);
+ settings.layerDbFeatures.removeMarker(settings.current_edit_feature);
}
},
/* put the marker on the map and update latitude and longitude fields */
@@ -1820,11 +1862,11 @@ function transform(obj) {
methods.cleanMarker();
settings.current_edit_feature = new OpenLayers.Marker(lonlat.clone(),
settings.default_icon);
- settings.layerMarkers.addMarker(settings.current_edit_feature);
+ settings.layerDbFeatures.addMarker(settings.current_edit_feature);
methods.updateMarkerInput();
/* zoom to the point */
if (zoom){
- var bounds = settings.layerMarkers.getDataExtent();
+ var bounds = settings.layerDbFeatures.getDataExtent();
if (bounds) settings.map.zoomToExtent(bounds);
}
return;
@@ -1939,8 +1981,8 @@ function transform(obj) {
if (bounds) settings.map.zoomToExtent(bounds);
},
showPopup: function (feature_pk) {
- for(j=0; j<settings.layerMarkers.markers.length;j++){
- var c_marker = settings.layerMarkers.markers[j];
+ for(j=0; j<settings.layerDbFeatures.markers.length;j++){
+ var c_marker = settings.layerDbFeatures.markers[j];
if(c_marker.pk == feature_pk){
c_marker.events.triggerEvent('click');
return true
diff --git a/chimere/urls.py b/chimere/urls.py
index 0335d96..b8ac58b 100644
--- a/chimere/urls.py
+++ b/chimere/urls.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-2016 É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
@@ -106,7 +106,8 @@ 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_-]+/)?getDetail/(?P<marker_id>\d+)/?$',
+ url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getDetail/'
+ r'(?P<key>[a-zA-Z_-]*\d+)/?$',
'getDetail', name="get_detail"),
url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getDescriptionDetail/'
r'?(?P<category_id>\d+)/?$', 'getDescriptionDetail',
diff --git a/chimere/views.py b/chimere/views.py
index 6cf16aa..7315ee1 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
#
# RSS : Copyright (C) 2010 Pierre Clarenc <pierre.crc_AT_gmailDOTcom>,
# Samuel Renard <renard.samuel_AT_gmailDOTcom>,
@@ -46,7 +46,7 @@ from django.views.generic import TemplateView, ListView
from chimere.actions import actions
from chimere.models import Category, SubCategory, PropertyModel, Page,\
- Marker, Route, SimpleArea, Area, Color, TinyUrl, RouteFile,\
+ Marker, Route, Polygon, SimpleArea, Area, Color, TinyUrl, RouteFile,\
AggregatedRoute
from chimere.widgets import PointChooserWidget, RouteChooserWidget, AreaWidget
@@ -565,13 +565,23 @@ def extraPage(request, area_name="", page_id=""):
context_instance=RequestContext(request))
-def getDetail(request, area_name, marker_id):
+def getDetail(request, area_name, key):
'''
- Get the detail for a marker
+ Get the detail of a geographic item
'''
+ cls = Marker
+ pk = key
+ if '-' in key:
+ geo_type, pk = key.split('-')
+ if geo_type == 'route':
+ cls = Route
+ elif geo_type == 'aggroute':
+ cls = AggregatedRoute
+ elif geo_type == 'polygon':
+ cls = Polygon
try:
- marker = Marker.objects.filter(id=int(marker_id),
- status__in=['A', 'S'])[0]
+ marker = cls.objects.filter(id=int(pk),
+ status__in=['A', 'S'])[0]
except (ValueError, IndexError):
return HttpResponse('no results')
response_dct, redir = get_base_response(request, area_name)
@@ -630,12 +640,11 @@ def checkDate(q):
def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
- item_types=('Marker', 'Route')):
+ item_types=('Marker', 'Route', 'Polygon')):
'''
- Get markers and routes
+ Get geo objects
'''
items = []
- current_cat, colors, idx = None, None, 0
empty = [] if not getjson else {}
# marker
@@ -653,26 +662,75 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
else:
items += list(query)
+ # polygon
+ if 'Polygon' in item_types:
+ try:
+ q = checkDate(Q(status__in=status, categories__in=category_ids))
+ query = Polygon.objects.filter(q).distinct('pk').order_by('-pk')
+ except:
+ return empty
+
+ category_ids = [int(cat_id) for cat_id in category_ids]
+ if getjson:
+ current_cat, colors, idx = None, None, 0
+ for polygon in query.all():
+ color, inner_color = "", ""
+ if polygon.inner_color:
+ inner_color = polygon.inner_color
+ if polygon.color:
+ color = polygon.color
+ else:
+ c_cat = None
+ for cat in polygon.categories.all():
+ if cat.id in category_ids:
+ c_cat = cat
+ break
+ if c_cat and not current_cat or current_cat != c_cat:
+ idx = 0
+ current_cat = c_cat
+ colors = list(Color.objects.filter(
+ color_theme=c_cat.color_theme))
+ if colors:
+ color = colors[idx % len(colors)].code
+ idx += 1
+ else:
+ color = "#000"
+ if not inner_color:
+ inner_color = "rgba(180, 180, 180, 0.3)"
+ items.append(json.loads(polygon.getGeoJSON(
+ color=color, inner_color=inner_color)))
+ else:
+ items += list(query)
+
# routes
if 'Route' in item_types:
query = AggregatedRoute.objects.filter(
status__in=status, subcategory__in=category_ids).order_by(
'subcategory', '-pk')
if getjson:
+ current_cat, colors, idx = None, None, 0
for route in query.all():
- c_cat = route.subcategory
- if not current_cat or current_cat != c_cat:
- idx = 0
- current_cat = c_cat
- colors = list(Color.objects.filter(
- color_theme=c_cat.color_theme))
- if colors:
- items.append(json.loads(
- route.getGeoJSON(color=colors[idx % len(colors)].code))
- )
- else:
- items.append(json.loads(route.getGeoJSON(color='000')))
- idx += 1
+ color = ""
+ # aggregated view has no color and no categories
+ if hasattr(route, 'color') and route.color:
+ color = route.color
+ elif hasattr(route, 'categories'):
+ c_cat = None
+ for cat in route.categories.all():
+ if cat.id in category_ids:
+ c_cat = cat
+ break
+ if c_cat and not current_cat or current_cat != c_cat:
+ idx = 0
+ current_cat = c_cat
+ colors = list(Color.objects.filter(
+ color_theme=c_cat.color_theme))
+ if colors:
+ color = colors[idx % len(colors)].code
+ idx += 1
+ else:
+ color = "#000"
+ items.append(json.loads(route.getGeoJSON(color=color)))
else:
items += list(query)