diff options
| -rw-r--r-- | chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py | 389 | ||||
| -rw-r--r-- | chimere/models.py | 24 | ||||
| -rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 122 | ||||
| -rw-r--r-- | chimere/urls.py | 5 | ||||
| -rw-r--r-- | chimere/views.py | 102 |
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) |
