diff options
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | .gitlab-ci.yml | 11 | ||||
-rw-r--r-- | chimere/__init__.py | 7 | ||||
-rw-r--r-- | chimere/actions.py | 2 | ||||
-rw-r--r-- | chimere/admin.py | 74 | ||||
-rw-r--r-- | chimere/external_utils/OsmApi.py | 747 | ||||
-rw-r--r-- | chimere/forms.py | 24 | ||||
-rw-r--r-- | chimere/management/commands/chimere_import.py | 28 | ||||
-rw-r--r-- | chimere/migrations/0001_initial.py | 1227 | ||||
-rw-r--r-- | chimere/migrations/0039_auto__add_field_property_route.py | 395 | ||||
-rw-r--r-- | chimere/models.py | 646 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0001_initial.py | 628 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py (renamed from chimere/migrations/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0003_create_aggregate_route_view.py (renamed from chimere/migrations/0003_create_aggregate_route_view.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py (renamed from chimere/migrations/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0005_auto__add_field_importer_automatic_update.py (renamed from chimere/migrations/0005_auto__add_field_importer_automatic_update.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0006_auto__chg_field_news_date.py (renamed from chimere/migrations/0006_auto__chg_field_news_date.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0007_auto__add_importerkeycategories.py (renamed from chimere/migrations/0007_auto__add_importerkeycategories.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0008_auto__chg_field_importer_state.py (renamed from chimere/migrations/0008_auto__chg_field_importer_state.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0009_auto__add_field_marker_keywords__add_field_route_keywords.py (renamed from chimere/migrations/0009_auto__add_field_marker_keywords__add_field_route_keywords.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0010_auto__add_field_subcategory_keywords.py (renamed from chimere/migrations/0010_auto__add_field_subcategory_keywords.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0011_auto__add_field_importer_default_status.py (renamed from chimere/migrations/0011_auto__add_field_importer_default_status.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0012_auto__chg_field_importer_filtr.py (renamed from chimere/migrations/0012_auto__chg_field_importer_filtr.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0013_auto__chg_field_importer_origin__chg_field_importer_license.py (renamed from chimere/migrations/0013_auto__chg_field_importer_origin__chg_field_importer_license.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py (renamed from chimere/migrations/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py (renamed from chimere/migrations/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py (renamed from chimere/migrations/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0017_auto__add_subcategoryuserlimit.py (renamed from chimere/migrations/0017_auto__add_subcategoryuserlimit.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0018_auto__add_polygon.py (renamed from chimere/migrations/0018_auto__add_polygon.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0018_auto__add_polygon.py.sans_poly (renamed from chimere/migrations/0018_auto__add_polygon.py.sans_poly) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py (renamed from chimere/migrations/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0020_auto__add_unique_tinyurl_parameters.py (renamed from chimere/migrations/0020_auto__add_unique_tinyurl_parameters.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py (renamed from chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py (renamed from chimere/migrations/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py (renamed from chimere/migrations/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py (renamed from chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0025_auto__add_field_area_display_category_menu.py (renamed from chimere/migrations/0025_auto__add_field_area_display_category_menu.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0026_auto__add_field_propertymodel_slug.py (renamed from chimere/migrations/0026_auto__add_field_propertymodel_slug.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0027_auto__add_field_property_polygon__chg_field_property_marker.py (renamed from chimere/migrations/0027_auto__add_field_property_polygon__chg_field_property_marker.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0028_auto__add_field_area_extra_map_def.py (renamed from chimere/migrations/0028_auto__add_field_area_extra_map_def.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py (renamed from chimere/migrations/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0030_auto.py (renamed from chimere/migrations/0030_auto.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py (renamed from chimere/migrations/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0032_create_aggregate_polygon_view.py (renamed from chimere/migrations/0032_create_aggregate_polygon_view.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0033_auto__add_field_color_inner_code.py (renamed from chimere/migrations/0033_auto__add_field_color_inner_code.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0034_auto__add_field_subcategory_min_zoom.py (renamed from chimere/migrations/0034_auto__add_field_subcategory_min_zoom.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0035_auto__add_field_subcategory_simplify_tolerance.py (renamed from chimere/migrations/0035_auto__add_field_subcategory_simplify_tolerance.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py (renamed from chimere/migrations/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0037_recopy_marker_to_route.py (renamed from chimere/migrations/0037_recopy_marker_to_route.py) | 4 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py (renamed from chimere/migrations/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py) | 0 | ||||
-rw-r--r-- | chimere/old_migrations/v2.9/__init__.py (renamed from chimere/external_utils/__init__.py) | 0 | ||||
-rw-r--r-- | chimere/route.py | 4 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 7 | ||||
-rw-r--r-- | chimere/tasks.py | 18 | ||||
-rw-r--r-- | chimere/templates/admin/chimere/managed_modified.html | 2 | ||||
-rw-r--r-- | chimere/templates/admin/chimere/marker/change_form.html | 2 | ||||
-rw-r--r-- | chimere/templates/admin/chimere/osm_export.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/actions.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/head_chimere.html | 6 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/share_bar.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/category_item_detail.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/detail.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/edit.html | 4 | ||||
-rw-r--r-- | chimere/templates/chimere/edit_marker.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/upload_file.html | 2 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 4 | ||||
-rw-r--r-- | chimere/templatetags/sanitize.py | 9 | ||||
-rw-r--r-- | chimere/templatetags/unlocalize_point.py | 5 | ||||
-rw-r--r-- | chimere/tests.py | 18 | ||||
-rw-r--r-- | chimere/urls.py | 2 | ||||
-rw-r--r-- | chimere/utils.py | 99 | ||||
-rw-r--r-- | chimere/views.py | 40 | ||||
-rw-r--r-- | chimere/widgets.py | 242 | ||||
-rwxr-xr-x | chimere_example_project/manage.py | 17 | ||||
-rw-r--r-- | chimere_example_project/project_static/.project_static | 0 | ||||
-rw-r--r-- | chimere_example_project/static/chimere/css/form-compat.css (renamed from chimere_example_project/chimere_example_static/chimere/css/form-compat.css) | 0 | ||||
-rw-r--r-- | chimere_example_project/static/chimere/img/layer-switcher-maximize.png (renamed from chimere_example_project/chimere_example_static/chimere/img/layer-switcher-maximize.png) | bin | 1433 -> 1433 bytes | |||
-rw-r--r-- | chimere_example_project/static/chimere/img/logo.jpg (renamed from chimere_example_project/chimere_example_static/chimere/img/logo.jpg) | bin | 25981 -> 25981 bytes | |||
-rwxr-xr-x | chimere_example_project/static/chimere/img/minus.png (renamed from chimere_example_project/chimere_example_static/chimere/img/minus.png) | bin | 236 -> 236 bytes | |||
-rwxr-xr-x | chimere_example_project/static/chimere/img/plus.png (renamed from chimere_example_project/chimere_example_static/chimere/img/plus.png) | bin | 528 -> 528 bytes | |||
-rw-r--r-- | chimere_example_project/static/chimere/js/interface.js (renamed from chimere_example_project/chimere_example_static/chimere/js/interface.js) | 0 | ||||
-rw-r--r-- | chimere_example_project/static/fonts/glyphicons-halflings-regular.eot (renamed from chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.eot) | bin | 20335 -> 20335 bytes | |||
-rw-r--r-- | chimere_example_project/static/fonts/glyphicons-halflings-regular.svg (renamed from chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.svg) | 0 | ||||
-rw-r--r-- | chimere_example_project/static/fonts/glyphicons-halflings-regular.ttf (renamed from chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.ttf) | bin | 41280 -> 41280 bytes | |||
-rw-r--r-- | chimere_example_project/static/fonts/glyphicons-halflings-regular.woff (renamed from chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.woff) | bin | 23320 -> 23320 bytes | |||
-rw-r--r-- | chimere_example_project/urls.py | 2 | ||||
-rw-r--r-- | chimere_example_project/wsgi.py | 11 | ||||
-rw-r--r-- | local_settings.py.gitlab-ci (renamed from chimere_example_project/local_settings.py.gitlab-ci) | 2 | ||||
-rw-r--r-- | local_settings.py.pip.sample (renamed from chimere_example_project/local_settings.py.pip.sample) | 0 | ||||
-rw-r--r-- | local_settings.py.sample (renamed from chimere_example_project/local_settings.py.sample) | 3 | ||||
-rwxr-xr-x | manage.py | 12 | ||||
-rw-r--r-- | requirements.txt | 15 | ||||
-rw-r--r-- | requirements_searchengine.txt | 24 | ||||
-rw-r--r-- | settings.py (renamed from chimere_example_project/settings.py) | 56 | ||||
-rw-r--r-- | wsgi.py | 6 |
95 files changed, 1940 insertions, 2485 deletions
@@ -4,17 +4,13 @@ *.mo *.ignore Makefile -example_project/settings.py -example_project/static/icons/* -example_project/static/upload/* -example_project/media/* -example_project/local_settings.py +media/* +local_settings.py chimere_env/ docs/en/build/ docs/fr/build/ chimere_example_project chimere/static/leaflet/ -chimere/migrations/v2.0/ chimere/migrations_saclay/ chimere_saclay chimere_nef diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e28eaa9..b008e29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,8 @@ before_script: - apt-get update - - apt-get install -q -y locales-all python-pip libpq-dev python-dev libjpeg-dev zlib1g-dev libxml2-dev libxslt1-dev libgeos-dev python-pyexiv2 python-gdal + - apt-get install -q -y locales-all python-pip libpq-dev python-dev libjpeg-dev zlib1g-dev libxml2-dev libxslt1-dev libgeos-dev libexiv2-dev libgdal-dev + - export CPLUS_INCLUDE_PATH=/usr/include/gdal + - export C_INCLUDE_PATH=/usr/include/gdal - pip install -q -r requirements.txt - cp Makefile.example Makefile - cp chimere_example_project/local_settings.py.gitlab-ci chimere_example_project/local_settings.py @@ -11,11 +13,12 @@ variables: POSTGRES_PASSWORD: "gis" services: - - iggdrasil/postgis-1.5 + - postgres:9.4 master: script: "make test_gitlab" only: - - v2.9 + - master + - v3.0 tags: - - wheezy + - jessie diff --git a/chimere/__init__.py b/chimere/__init__.py index 19d78a9..0dce1db 100644 --- a/chimere/__init__.py +++ b/chimere/__init__.py @@ -1,10 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2012-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2012-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> + +VERSION = (3, 0, 0) -VERSION = (2, 0, 3) def get_version(): - return u'.'.join((unicode(num) for num in VERSION)) + return '.'.join((str(num) for num in VERSION)) __version__ = get_version() diff --git a/chimere/actions.py b/chimere/actions.py index ecbd07a..d7c25c9 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -24,7 +24,7 @@ from django.conf import settings from django.core.urlresolvers import reverse, NoReverseMatch from django.utils.translation import ugettext_lazy as _ -from models import Page, Area +from chimere.models import Page, Area class Action: diff --git a/chimere/admin.py b/chimere/admin.py index cdcd053..fda0dd7 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -26,7 +26,7 @@ from copy import deepcopy from django.conf import settings from django.contrib import admin, messages from django.contrib.admin import SimpleListFilter -from django.contrib.admin.util import flatten_fieldsets +from django.contrib.admin.utils import flatten_fieldsets from django.contrib.auth.admin import UserAdmin as VanillaUserAdmin from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist @@ -57,18 +57,18 @@ def disable(modeladmin, request, queryset): for item in queryset: item.status = 'D' item.save() -disable.short_description = _(u"Disable") +disable.short_description = _("Disable") def validate(modeladmin, request, queryset): for item in queryset: item.status = 'A' item.save() -validate.short_description = _(u"Validate") +validate.short_description = _("Validate") def export_to_kml(modeladmin, request, queryset): - u""" + """ Export data to KML """ filename, result = KMLManager.export(queryset) @@ -76,11 +76,11 @@ def export_to_kml(modeladmin, request, queryset): mimetype='application/vnd.google-earth.kml+xml') response['Content-Disposition'] = 'attachment; filename=%s' % filename return response -export_to_kml.short_description = _(u"Export to KML") +export_to_kml.short_description = _("Export to KML") def export_to_shapefile(modeladmin, request, queryset): - u""" + """ Export data to Shapefile """ filename, zip_stream = ShapefileManager.export(queryset) @@ -91,18 +91,18 @@ def export_to_shapefile(modeladmin, request, queryset): response['Content-Type'] = 'application/zip' response.write(zip_stream) return response -export_to_shapefile.short_description = _(u"Export to Shapefile") +export_to_shapefile.short_description = _("Export to Shapefile") def export_to_csv(modeladmin, request, queryset): - u""" + """ Export data to CSV """ filename, result = CSVManager.export(queryset) response = HttpResponse(result, mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=%s' % filename return response -export_to_csv.short_description = _(u"Export to CSV") +export_to_csv.short_description = _("Export to CSV") def managed_modified(modeladmin, request, queryset): @@ -110,8 +110,8 @@ def managed_modified(modeladmin, request, queryset): redirect_url = request.get_full_path().split('admin_modification')[0] if queryset.count() != 1 and len(set([i.ref_item or i for i in queryset.all()])) != 1: - messages.error(request, _(u"Only one item can be managed at a " - u"time.")) + messages.error(request, _("Only one item can be managed at a " + "time.")) return HttpResponseRedirect(redirect_url) item = queryset.all()[0] @@ -120,8 +120,8 @@ def managed_modified(modeladmin, request, queryset): item = modeladmin.model.objects.filter(ref_item=item)\ .exclude(pk=item.pk).all()[0] except IndexError: - messages.error(request, _(u"No modified item associated " - u"to the selected item.")) + messages.error(request, _("No modified item associated " + "to the selected item.")) return HttpResponseRedirect(redirect_url) item_ref = item.ref_item if request.POST.get('rapprochement'): @@ -155,12 +155,12 @@ def managed_modified(modeladmin, request, queryset): except (ValueError, ObjectDoesNotExist): pass item.delete() - messages.success(request, _(u"Modified item traited.")) + messages.success(request, _("Modified item traited.")) return HttpResponseRedirect(redirect_url) return render_to_response('admin/chimere/managed_modified.html', {'item': item, 'item_ref': item_ref}, context_instance=RequestContext(request)) -managed_modified.short_description = _(u"Managed modified items") +managed_modified.short_description = _("Managed modified items") class CatLimitInline(admin.TabularInline): @@ -252,10 +252,10 @@ class CategoriesListFilter(SimpleListFilter): def lookups(self, request, model_admin): if request.user.subcategory_limit_to.count(): q = request.user.subcategory_limit_to - return [(l.subcategory.pk, unicode(l.subcategory)) + return [(l.subcategory.pk, str(l.subcategory)) for l in q.all()] q = SubCategory.objects - return [(cat.pk, unicode(cat)) for cat in q.all()] + return [(cat.pk, str(cat)) for cat in q.all()] def queryset(self, request, queryset): if self.value(): @@ -285,16 +285,16 @@ MARKER_FIELDSETS = [ 'fields': ['point', 'name', 'status', 'categories', 'description', 'keywords', 'start_date', 'end_date'] }], - [_(u"Submitter"), { + [_("Submitter"), { 'classes': ('collapse',), 'fields': ('submiter_name', 'submiter_email', 'submiter_comment') }], - [_(u"Import"), { + [_("Import"), { 'classes': ('collapse',), 'fields': ('not_for_osm', 'modified_since_import', 'import_source', 'origin', 'license') }], - [_(u"Associated items"), { + [_("Associated items"), { 'classes': ('collapse',), 'fields': ['ref_item', ] }] @@ -363,7 +363,7 @@ class MarkerAdmin(admin.ModelAdmin): self, request, Marker.objects.filter(pk=item_id)) def get_urls(self): - from django.conf.urls.defaults import patterns, url + from django.conf.urls import patterns, url urls = super(MarkerAdmin, self).get_urls() my_urls = patterns( '', @@ -384,7 +384,7 @@ class MarkerAdmin(admin.ModelAdmin): return form form = type('MarkerAdminLimit', (form,), {'categories_choices': [ - (l.subcategory.pk, unicode(l.subcategory)) + (l.subcategory.pk, str(l.subcategory)) for l in q.all()]}) return form @@ -455,48 +455,48 @@ class AreaAdmin(admin.ModelAdmin): def importing(modeladmin, request, queryset): for importer in queryset: - importer.state = unicode(tasks.IMPORT_MESSAGES['import_pending'][0]) + importer.state = str(tasks.IMPORT_MESSAGES['import_pending'][0]) importer.save() tasks.importing(importer.pk) -importing.short_description = _(u"Import") +importing.short_description = _("Import") def cancel_import(modeladmin, request, queryset): for importer in queryset: importer.state = tasks.IMPORT_MESSAGES['import_cancel'][0] importer.save() -cancel_import.short_description = _(u"Cancel import") +cancel_import.short_description = _("Cancel import") def cancel_export(modeladmin, request, queryset): for importer in queryset: importer.state = tasks.IMPORT_MESSAGES['export_cancel'][0] importer.save() -cancel_export.short_description = _(u"Cancel export") +cancel_export.short_description = _("Cancel export") def export_to_osm(modeladmin, request, queryset): if queryset.count() > 1: messages.error(request, - _(u"Can manage only one OSM export at a time.")) + _("Can manage only one OSM export at a time.")) return HttpResponseRedirect(request.get_full_path()) importer = queryset.all()[0] if Marker.objects.filter(categories__in=importer.categories.all(), status='I').count(): - messages.error(request, _(u"You must treat all item with the status " - u"\"imported\" before exporting to OSM.")) + messages.error(request, _("You must treat all item with the status " + "\"imported\" before exporting to OSM.")) return HttpResponseRedirect(request.get_full_path()) if importer.importer_type != 'OSM': messages.error(request, - _(u"Only OSM importer are managed for export.")) + _("Only OSM importer are managed for export.")) return HttpResponseRedirect(request.get_full_path()) item_nb = Marker.objects.filter( status='A', categories=importer.categories.all(), not_for_osm=False, modified_since_import=True, route=None).count() if not item_nb: messages.error(request, - _(u"No point of interest are concerned by this " - u"export.")) + _("No point of interest are concerned by this " + "export.")) return HttpResponseRedirect(request.get_full_path()) form = None if request.method == 'POST' and ( @@ -504,21 +504,21 @@ def export_to_osm(modeladmin, request, queryset): or 'password' in request.POST): form = OSMForm(request.POST) if form.is_valid(): - importer.state = unicode( + importer.state = str( tasks.IMPORT_MESSAGES['export_pending'][0]) importer.save() tasks.exporting(importer.pk, form.cleaned_data) - messages.success(request, _(u"Export launched.")) + messages.success(request, _("Export launched.")) return HttpResponseRedirect(request.get_full_path()) else: form = OSMForm() - msg_item = _(u"%s point(s) of interest concerned by this export before " - u"bounding box filter.") % item_nb + msg_item = _("%s point(s) of interest concerned by this export before " + "bounding box filter.") % item_nb return render_to_response('admin/chimere/osm_export.html', {'item': importer, 'form': form, 'msg_item': msg_item}, context_instance=RequestContext(request)) -export_to_osm.short_description = _(u"Export to osm") +export_to_osm.short_description = _("Export to osm") class ImporterKeyInline(admin.TabularInline): diff --git a/chimere/external_utils/OsmApi.py b/chimere/external_utils/OsmApi.py deleted file mode 100644 index 3b1b9b1..0000000 --- a/chimere/external_utils/OsmApi.py +++ /dev/null @@ -1,747 +0,0 @@ -#-*- coding: utf-8 -*- - -########################################################################### -## ## -## Copyrights Etienne Chové <chove@crans.org> 2009-2010 ## -## ## -## This program is free software: you can redistribute it and/or modify ## -## it under the terms of the GNU General Public License as published by ## -## the Free Software Foundation, either version 3 of the License, or ## -## (at your option) any later version. ## -## ## -## This program is distributed in the hope that it will be useful, ## -## but WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## -## GNU General Public License for more details. ## -## ## -## You should have received a copy of the GNU General Public License ## -## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -## ## -########################################################################### - -## HomePage : http://wiki.openstreetmap.org/wiki/PythonOsmApi - -########################################################################### -## History ## -########################################################################### -## 0.2.19 2010-05-24 Add debug message on ApiError ## -## 0.2.18 2010-04-20 Fix ChangesetClose and _http_request ## -## 0.2.17 2010-01-02 Capabilities implementation ## -## 0.2.16 2010-01-02 ChangesetsGet by Alexander Rampp ## -## 0.2.15 2009-12-16 xml encoding error for < and > ## -## 0.2.14 2009-11-20 changesetautomulti parameter ## -## 0.2.13 2009-11-16 modify instead update for osc ## -## 0.2.12 2009-11-14 raise ApiError on 4xx errors -- Xoff ## -## 0.2.11 2009-10-14 unicode error on ChangesetUpload ## -## 0.2.10 2009-10-14 RelationFullRecur definition ## -## 0.2.9 2009-10-13 automatic changeset management ## -## ChangesetUpload implementation ## -## 0.2.8 2009-10-13 *(Create|Update|Delete) use not unique _do method ## -## 0.2.7 2009-10-09 implement all missing fonctions except ## -## ChangesetsGet and GetCapabilities ## -## 0.2.6 2009-10-09 encoding clean-up ## -## 0.2.5 2009-10-09 implements NodesGet, WaysGet, RelationsGet ## -## ParseOsm, ParseOsc ## -## 0.2.4 2009-10-06 clean-up ## -## 0.2.3 2009-09-09 keep http connection alive for multiple request ## -## (Node|Way|Relation)Get return None when object ## -## have been deleted (raising error before) ## -## 0.2.2 2009-07-13 can identify applications built on top of the lib ## -## 0.2.1 2009-05-05 some changes in constructor -- chove@crans.org ## -## 0.2 2009-05-01 initial import ## -########################################################################### - -__version__ = '0.2.19' - -import httplib, base64, xml.dom.minidom, time, sys, urllib - -class ApiError(Exception): - - def __init__(self, status, reason, payload): - self.status = status - self.reason = reason - self.payload = payload - - def __str__(self): - return "Request failed: " + str(self.status) + " - " + self.reason + " - " + self.payload - -########################################################################### -## Main class ## - -class OsmApi: - - def __init__(self, - username = None, - password = None, - passwordfile = None, - appid = "", - created_by = "PythonOsmApi/"+__version__, - api = "www.openstreetmap.org", - changesetauto = False, - changesetautotags = {}, - changesetautosize = 500, - changesetautomulti = 1, - debug = False - ): - - # debug - self._debug = debug - - # Get username - if username: - self._username = username - elif passwordfile: - self._username = open(passwordfile).readline().split(":")[0].strip() - - # Get password - if password: - self._password = password - elif passwordfile: - for l in open(passwordfile).readlines(): - l = l.strip().split(":") - if l[0] == self._username: - self._password = l[1] - - # Changest informations - self._changesetauto = changesetauto # auto create and close changesets - self._changesetautotags = changesetautotags # tags for automatic created changesets - self._changesetautosize = changesetautosize # change count for auto changeset - self._changesetautosize = changesetautosize # change count for auto changeset - self._changesetautomulti = changesetautomulti # close a changeset every # upload - self._changesetautocpt = 0 - self._changesetautodata = [] # data to upload for auto group - - # Get API - self._api = api - - # Get created_by - if not appid: - self._created_by = created_by - else: - self._created_by = appid + " (" + created_by + ")" - - # Initialisation - self._CurrentChangesetId = 0 - - # Http connection - self._conn = httplib.HTTPConnection(self._api, 80) - - def __del__(self): - if self._changesetauto: - self._changesetautoflush(True) - return None - - ####################################################################### - # Capabilities # - ####################################################################### - - def Capabilities(self): - """ Returns ApiCapabilities. """ - uri = "/api/capabilities" - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - print data.getElementsByTagName("osm") - data = data.getElementsByTagName("osm")[0].getElementsByTagName("api")[0] - result = {} - for elem in data.childNodes: - if elem.nodeType <> elem.ELEMENT_NODE: - continue - result[elem.nodeName] = {} - print elem.nodeName - for k, v in elem.attributes.items(): - try: - result[elem.nodeName][k] = float(v) - except: - result[elem.nodeName][k] = v - return result - - ####################################################################### - # Node # - ####################################################################### - - def NodeGet(self, NodeId, NodeVersion = -1): - """ Returns NodeData for node #NodeId. """ - uri = "/api/0.6/node/"+str(NodeId) - if NodeVersion <> -1: uri += "/"+str(NodeVersion) - data = self._get(uri) - if not data: return data - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0].getElementsByTagName("node")[0] - return self._DomParseNode(data) - - def NodeCreate(self, NodeData): - """ Creates a node. Returns updated NodeData (without timestamp). """ - return self._do("create", "node", NodeData) - - def NodeUpdate(self, NodeData): - """ Updates node with NodeData. Returns updated NodeData (without timestamp). """ - return self._do("modify", "node", NodeData) - - def NodeDelete(self, NodeData): - """ Delete node with NodeData. Returns updated NodeData (without timestamp). """ - return self._do("delete", "node", NodeData) - - def NodeHistory(self, NodeId): - """ Returns dict(NodeVerrsion: NodeData). """ - uri = "/api/0.6/node/"+str(NodeId)+"/history" - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("node"): - data = self._DomParseNode(data) - result[data[u"version"]] = data - return result - - def NodeWays(self, NodeId): - """ Returns [WayData, ... ] containing node #NodeId. """ - uri = "/api/0.6/node/%d/ways"%NodeId - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = [] - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): - data = self._DomParseRelation(data) - result.append(data) - return result - - def NodeRelations(self, NodeId): - """ Returns [RelationData, ... ] containing node #NodeId. """ - uri = "/api/0.6/node/%d/relations"%NodeId - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = [] - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): - data = self._DomParseRelation(data) - result.append(data) - return result - - def NodesGet(self, NodeIdList): - """ Returns dict(NodeId: NodeData) for each node in NodeIdList """ - uri = "/api/0.6/nodes?nodes=" + ",".join([str(x) for x in NodeIdList]) - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("node"): - data = self._DomParseNode(data) - result[data[u"id"]] = data - return result - - ####################################################################### - # Way # - ####################################################################### - - def WayGet(self, WayId, WayVersion = -1): - """ Returns WayData for way #WayId. """ - uri = "/api/0.6/way/"+str(WayId) - if WayVersion <> -1: uri += "/"+str(WayVersion) - data = self._get(uri) - if not data: return data - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0].getElementsByTagName("way")[0] - return self._DomParseWay(data) - - def WayCreate(self, WayData): - """ Creates a way. Returns updated WayData (without timestamp). """ - return self._do("create", "way", WayData) - - def WayUpdate(self, WayData): - """ Updates way with WayData. Returns updated WayData (without timestamp). """ - return self._do("modify", "way", WayData) - - def WayDelete(self, WayData): - """ Delete way with WayData. Returns updated WayData (without timestamp). """ - return self._do("delete", "way", WayData) - - def WayHistory(self, WayId): - """ Returns dict(WayVerrsion: WayData). """ - uri = "/api/0.6/way/"+str(WayId)+"/history" - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): - data = self._DomParseWay(data) - result[data[u"version"]] = data - return result - - def WayRelations(self, WayId): - """ Returns [RelationData, ...] containing way #WayId. """ - uri = "/api/0.6/way/%d/relations"%WayId - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = [] - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): - data = self._DomParseRelation(data) - result.append(data) - return result - - def WayFull(self, WayId): - """ Return full data for way WayId as list of {type: node|way|relation, data: {}}. """ - uri = "/api/0.6/way/"+str(WayId)+"/full" - data = self._get(uri) - return self.ParseOsm(data) - - def WaysGet(self, WayIdList): - """ Returns dict(WayId: WayData) for each way in WayIdList """ - uri = "/api/0.6/ways?ways=" + ",".join([str(x) for x in WayIdList]) - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): - data = self._DomParseWay(data) - result[data[u"id"]] = data - return result - - ####################################################################### - # Relation # - ####################################################################### - - def RelationGet(self, RelationId, RelationVersion = -1): - """ Returns RelationData for relation #RelationId. """ - uri = "/api/0.6/relation/"+str(RelationId) - if RelationVersion <> -1: uri += "/"+str(RelationVersion) - data = self._get(uri) - if not data: return data - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0].getElementsByTagName("relation")[0] - return self._DomParseRelation(data) - - def RelationCreate(self, RelationData): - """ Creates a relation. Returns updated RelationData (without timestamp). """ - return self._do("create", "relation", RelationData) - - def RelationUpdate(self, RelationData): - """ Updates relation with RelationData. Returns updated RelationData (without timestamp). """ - return self._do("modify", "relation", RelationData) - - def RelationDelete(self, RelationData): - """ Delete relation with RelationData. Returns updated RelationData (without timestamp). """ - return self._do("delete", "relation", RelationData) - - def RelationHistory(self, RelationId): - """ Returns dict(RelationVerrsion: RelationData). """ - uri = "/api/0.6/relation/"+str(RelationId)+"/history" - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): - data = self._DomParseRelation(data) - result[data[u"version"]] = data - return result - - def RelationRelations(self, RelationId): - """ Returns list of RelationData containing relation #RelationId. """ - uri = "/api/0.6/relation/%d/relations"%RelationId - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = [] - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): - data = self._DomParseRelation(data) - result.append(data) - return result - - def RelationFullRecur(self, RelationId): - """ Return full data for relation RelationId. Recurisve version relation of relations. """ - data = [] - todo = [RelationId] - done = [] - while todo: - rid = todo.pop(0) - done.append(rid) - temp = self.RelationFull(rid) - for item in temp: - if item["type"] <> "relation": - continue - if item["data"]["id"] in done: - continue - todo.append(item["data"]["id"]) - data += temp - return data - - def RelationFull(self, RelationId): - """ Return full data for relation RelationId as list of {type: node|way|relation, data: {}}. """ - uri = "/api/0.6/relation/"+str(RelationId)+"/full" - data = self._get(uri) - return self.ParseOsm(data) - - def RelationsGet(self, RelationIdList): - """ Returns dict(RelationId: RelationData) for each relation in RelationIdList """ - uri = "/api/0.6/relations?relations=" + ",".join([str(x) for x in RelationIdList]) - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - result = {} - for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): - data = self._DomParseRelation(data) - result[data[u"id"]] = data - return result - - ####################################################################### - # Changeset # - ####################################################################### - - def ChangesetGet(self, ChangesetId): - """ Returns ChangesetData for changeset #ChangesetId. """ - data = self._get("/api/0.6/changeset/"+str(ChangesetId)) - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0].getElementsByTagName("changeset")[0] - return self._DomParseChangeset(data) - - def ChangesetUpdate(self, ChangesetTags = {}): - """ Updates current changeset with ChangesetTags. """ - if self._CurrentChangesetId == -1: - raise Exception, "No changeset currently opened" - if u"created_by" not in ChangesetTags: - ChangesetTags[u"created_by"] = self._created_by - result = self._put("/api/0.6/changeset/"+str(self._CurrentChangesetId), self._XmlBuild("changeset", {u"tag": ChangesetTags})) - return self._CurrentChangesetId - - def ChangesetCreate(self, ChangesetTags = {}): - """ Opens a changeset. Returns #ChangesetId. """ - if self._CurrentChangesetId: - raise Exception, "Changeset alreadey opened" - if u"created_by" not in ChangesetTags: - ChangesetTags[u"created_by"] = self._created_by - result = self._put("/api/0.6/changeset/create", self._XmlBuild("changeset", {u"tag": ChangesetTags})) - self._CurrentChangesetId = int(result) - return self._CurrentChangesetId - - def ChangesetClose(self): - """ Closes current changeset. Returns #ChangesetId. """ - if not self._CurrentChangesetId: - raise Exception, "No changeset currently opened" - result = self._put("/api/0.6/changeset/"+str(self._CurrentChangesetId)+"/close", u"") - CurrentChangesetId = self._CurrentChangesetId - self._CurrentChangesetId = 0 - return CurrentChangesetId - - def ChangesetUpload(self, ChangesData): - """ Upload data. ChangesData is a list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. Returns list with updated ids. """ - data = "" - data += u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - data += u"<osmChange version=\"0.6\" generator=\"" + self._created_by + "\">\n" - for change in ChangesData: - data += u"<"+change["action"]+">\n" - change["data"]["changeset"] = self._CurrentChangesetId - data += self._XmlBuild(change["type"], change["data"], False).decode("utf-8") - data += u"</"+change["action"]+">\n" - data += u"</osmChange>" - data = self._http("POST", "/api/0.6/changeset/"+str(self._CurrentChangesetId)+"/upload", True, data.encode("utf-8")) - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("diffResult")[0] - data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE] - for i in range(len(ChangesData)): - if ChangesData[i]["action"] == "delete": - ChangesData[i]["data"].pop("version") - else: - ChangesData[i]["data"]["version"] = int(data[i].getAttribute("new_id")) - return ChangesData - - def ChangesetDownload(self, ChangesetId): - """ Download data from a changeset. Returns list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. """ - uri = "/api/0.6/changeset/"+str(ChangesetId)+"/download" - data = self._get(uri) - return self.ParseOsc(data) - - def ChangesetsGet(self, min_lon=None, min_lat=None, max_lon=None, max_lat=None, - userid=None, username=None, - closed_after=None, created_before=None, - only_open=False, only_closed=False): - """ Returns dict(ChangsetId: ChangesetData) matching all criteria. """ - - uri = "/api/0.6/changesets" - params = {} - if min_lon or min_lat or max_lon or max_lat: - params["bbox"] = ",".join([str(min_lon),str(min_lat),str(max_lon),str(max_lat)]) - if userid: - params["user"] = userid - if username: - params["display_name"] = username - if closed_after and not created_before: - params["time"] = closed_after - if created_before: - if not closed_after: - closed_after = "1970-01-01T00:00:00Z" - params["time"] = closed_after + "," + created_before - if only_open: - params["open"] = 1 - if only_closed: - params["closed"] = 1 - - if params: - uri += "?" + urllib.urlencode(params) - - data = self._get(uri) - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0].getElementsByTagName("changeset") - result = {} - for curChangeset in data: - tmpCS = self._DomParseChangeset(curChangeset) - result[tmpCS["id"]] = tmpCS - return result - - ####################################################################### - # Other # - ####################################################################### - - def Map(self, min_lon, min_lat, max_lon, max_lat): - """ Download data in bounding box. Returns list of dict {type: node|way|relation, data: {}}. """ - uri = "/api/0.6/map?bbox=%f,%f,%f,%f"%(min_lon, min_lat, max_lon, max_lat) - data = self._get(uri) - return self.ParseOsm(data) - - ####################################################################### - # Data parser # - ####################################################################### - - def ParseOsm(self, data): - """ Parse osm data. Returns list of dict {type: node|way|relation, data: {}}. """ - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osm")[0] - result = [] - for elem in data.childNodes: - if elem.nodeName == u"node": - result.append({u"type": elem.nodeName, u"data": self._DomParseNode(elem)}) - elif elem.nodeName == u"way": - result.append({u"type": elem.nodeName, u"data": self._DomParseWay(elem)}) - elif elem.nodeName == u"relation": - result.append({u"type": elem.nodeName, u"data": self._DomParseRelation(elem)}) - return result - - def ParseOsc(self, data): - """ Parse osc data. Returns list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. """ - data = xml.dom.minidom.parseString(data) - data = data.getElementsByTagName("osmChange")[0] - result = [] - for action in data.childNodes: - if action.nodeName == u"#text": continue - for elem in action.childNodes: - if elem.nodeName == u"node": - result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseNode(elem)}) - elif elem.nodeName == u"way": - result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseWay(elem)}) - elif elem.nodeName == u"relation": - result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseRelation(elem)}) - return result - - ####################################################################### - # Internal http function # - ####################################################################### - - def _do(self, action, OsmType, OsmData): - if self._changesetauto: - self._changesetautodata.append({"action":action, "type":OsmType, "data":OsmData}) - self._changesetautoflush() - return None - else: - return self._do_manu(action, OsmType, OsmData) - - def _do_manu(self, action, OsmType, OsmData): - if not self._CurrentChangesetId: - raise Exception, "You need to open a changeset before uploading data" - if u"timestamp" in OsmData: - OsmData.pop(u"timestamp") - OsmData[u"changeset"] = self._CurrentChangesetId - if action == "create": - if OsmData.get(u"id", -1) > 0: - raise Exception, "This "+OsmType+" already exists" - result = self._put("/api/0.6/"+OsmType+"/create", self._XmlBuild(OsmType, OsmData)) - OsmData[u"id"] = int(result.strip()) - OsmData[u"version"] = 1 - return OsmData - elif action == "modify": - result = self._put("/api/0.6/"+OsmType+"/"+str(OsmData[u"id"]), self._XmlBuild(OsmType, OsmData)) - OsmData[u"version"] = int(result.strip()) - return OsmData - elif action =="delete": - result = self._delete("/api/0.6/"+OsmType+"/"+str(OsmData[u"id"]), self._XmlBuild(OsmType, OsmData)) - OsmData[u"version"] = int(result.strip()) - OsmData[u"visible"] = False - return OsmData - - def flush(self): - return self._changesetautoflush(True) - - def _changesetautoflush(self, force = False): - while (len(self._changesetautodata) >= self._changesetautosize) or (force and self._changesetautodata): - if self._changesetautocpt == 0: - self.ChangesetCreate(self._changesetautotags) - self.ChangesetUpload(self._changesetautodata[:self._changesetautosize]) - self._changesetautodata = self._changesetautodata[self._changesetautosize:] - self._changesetautocpt += 1 - if self._changesetautocpt == self._changesetautomulti: - self.ChangesetClose() - self._changesetautocpt = 0 - if self._changesetautocpt and force: - self.ChangesetClose() - self._changesetautocpt = 0 - return None - - def _http_request(self, cmd, path, auth, send): - if self._debug: - path2 = path - if len(path2) > 50: - path2 = path2[:50]+"[...]" - print >>sys.stderr, "%s %s %s"%(time.strftime("%Y-%m-%d %H:%M:%S"),cmd,path2) - self._conn.putrequest(cmd, path) - self._conn.putheader('User-Agent', self._created_by) - if auth: - self._conn.putheader('Authorization', 'Basic ' + base64.encodestring(self._username + ':' + self._password).strip()) - if send <> None: - self._conn.putheader('Content-Length', len(send)) - self._conn.endheaders() - if send: - self._conn.send(send) - response = self._conn.getresponse() - if response.status <> 200: - payload = response.read().strip() - if response.status == 410: - return None - raise ApiError(response.status, response.reason, payload) - if self._debug: - print >>sys.stderr, "%s %s %s done"%(time.strftime("%Y-%m-%d %H:%M:%S"),cmd,path2) - return response.read() - - def _http(self, cmd, path, auth, send): - i = 0 - while True: - i += 1 - try: - return self._http_request(cmd, path, auth, send) - except ApiError, e: - if e.status >= 500: - if i == 5: raise - if i <> 1: time.sleep(5) - self._conn = httplib.HTTPConnection(self._api, 80) - else: raise - except Exception: - if i == 5: raise - if i <> 1: time.sleep(5) - self._conn = httplib.HTTPConnection(self._api, 80) - - def _get(self, path): - return self._http('GET', path, False, None) - - def _put(self, path, data): - return self._http('PUT', path, True, data) - - def _delete(self, path, data): - return self._http('DELETE', path, True, data) - - ####################################################################### - # Internal dom function # - ####################################################################### - - def _DomGetAttributes(self, DomElement): - """ Returns a formated dictionnary of attributes of a DomElement. """ - result = {} - for k, v in DomElement.attributes.items(): - if k == u"uid" : v = int(v) - elif k == u"changeset" : v = int(v) - elif k == u"version" : v = int(v) - elif k == u"id" : v = int(v) - elif k == u"lat" : v = float(v) - elif k == u"lon" : v = float(v) - elif k == u"open" : v = v=="true" - elif k == u"visible" : v = v=="true" - elif k == u"ref" : v = int(v) - result[k] = v - return result - - def _DomGetTag(self, DomElement): - """ Returns the dictionnary of tags of a DomElement. """ - result = {} - for t in DomElement.getElementsByTagName("tag"): - k = t.attributes["k"].value - v = t.attributes["v"].value - result[k] = v - return result - - def _DomGetNd(self, DomElement): - """ Returns the list of nodes of a DomElement. """ - result = [] - for t in DomElement.getElementsByTagName("nd"): - result.append(int(int(t.attributes["ref"].value))) - return result - - def _DomGetMember(self, DomElement): - """ Returns a list of relation members. """ - result = [] - for m in DomElement.getElementsByTagName("member"): - result.append(self._DomGetAttributes(m)) - return result - - def _DomParseNode(self, DomElement): - """ Returns NodeData for the node. """ - result = self._DomGetAttributes(DomElement) - result[u"tag"] = self._DomGetTag(DomElement) - return result - - def _DomParseWay(self, DomElement): - """ Returns WayData for the way. """ - result = self._DomGetAttributes(DomElement) - result[u"tag"] = self._DomGetTag(DomElement) - result[u"nd"] = self._DomGetNd(DomElement) - return result - - def _DomParseRelation(self, DomElement): - """ Returns RelationData for the relation. """ - result = self._DomGetAttributes(DomElement) - result[u"tag"] = self._DomGetTag(DomElement) - result[u"member"] = self._DomGetMember(DomElement) - return result - - def _DomParseChangeset(self, DomElement): - """ Returns ChangesetData for the changeset. """ - result = self._DomGetAttributes(DomElement) - result[u"tag"] = self._DomGetTag(DomElement) - return result - - ####################################################################### - # Internal xml builder # - ####################################################################### - - def _XmlBuild(self, ElementType, ElementData, WithHeaders = True): - - xml = u"" - if WithHeaders: - xml += u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - xml += u"<osm version=\"0.6\" generator=\"" + self._created_by + "\">\n" - - # <element attr="val"> - xml += u" <" + ElementType - if u"id" in ElementData: - xml += u" id=\"" + str(ElementData[u"id"]) + u"\"" - if u"lat" in ElementData: - xml += u" lat=\"" + str(ElementData[u"lat"]) + u"\"" - if u"lon" in ElementData: - xml += u" lon=\"" + str(ElementData[u"lon"]) + u"\"" - if u"version" in ElementData: - xml += u" version=\"" + str(ElementData[u"version"]) + u"\"" - xml += u" visible=\"" + str(ElementData.get(u"visible", True)).lower() + u"\"" - if ElementType in [u"node", u"way", u"relation"]: - xml += u" changeset=\"" + str(self._CurrentChangesetId) + u"\"" - xml += u">\n" - - # <tag... /> - for k, v in ElementData.get(u"tag", {}).items(): - xml += u" <tag k=\""+self._XmlEncode(k)+u"\" v=\""+self._XmlEncode(v)+u"\"/>\n" - - # <member... /> - for member in ElementData.get(u"member", []): - xml += u" <member type=\""+member[u"type"]+"\" ref=\""+str(member[u"ref"])+u"\" role=\""+self._XmlEncode(member[u"role"])+"\"/>\n" - - # <nd... /> - for ref in ElementData.get(u"nd", []): - xml += u" <nd ref=\""+str(ref)+u"\"/>\n" - - # </element> - xml += u" </" + ElementType + u">\n" - - if WithHeaders: - xml += u"</osm>\n" - - return xml.encode("utf8") - - def _XmlEncode(self, text): - return text.replace("&", "&").replace("\"", """).replace("<","<").replace(">",">") - -## End of main class ## -########################################################################### diff --git a/chimere/forms.py b/chimere/forms.py index 8691fa6..11fafc9 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -121,7 +121,7 @@ def notifyByEmail(subject, body, user_list, sender=None): def notifySubmission(absolute_uri, geo_object): - category = u" - ".join([unicode(cat) + category = u" - ".join([str(cat) for cat in geo_object.categories.all()]) subject = u'%s %s' % (_(u"New submission for"), category) message = _(u'The new item "%s" has been submited in the category: ') % \ @@ -151,6 +151,9 @@ class SubCategoryAdminForm(forms.ModelForm): ''' description = forms.CharField(widget=FullTextareaWidget, required=False) + class Meta: + exclude = [] + class PageAdminForm(forms.ModelForm): """ @@ -160,6 +163,7 @@ class PageAdminForm(forms.ModelForm): class Meta: model = Page + exclude = [] class OSMForm(forms.Form): @@ -189,6 +193,7 @@ class NewsAdminForm(forms.ModelForm): class Meta: model = News + exclude = [] class ImporterAdminForm(forms.ModelForm): @@ -205,6 +210,7 @@ class ImporterAdminForm(forms.ModelForm): 'source': forms.TextInput(attrs={'size': 80}), 'filtr': forms.Textarea(attrs={'size': 80}), } + exclude = [] def clean(self): ''' @@ -254,6 +260,7 @@ class CategoryAdminForm(forms.ModelForm): class Meta: model = Category + exclude = [] def get_properties(queryset): @@ -267,7 +274,7 @@ def get_properties(queryset): ).order_by('value') fields[key] = forms.ChoiceField( label=prop.name, choices=[('', '--')] + - [(choice.pk, unicode(choice)) for choice in choices], + [(choice.pk, str(choice)) for choice in choices], required=False) elif prop.type == 'A': widget = PropertyModel.TYPE_WIDGET[prop.type] @@ -287,12 +294,13 @@ class MarkerAdminFormBase(forms.ModelForm): Main form for marker """ is_admin = True - name = forms.CharField(_(u"Name"), required=True) + name = forms.CharField(label=_(u"Name"), required=True) description = forms.CharField(widget=TextareaAdminWidget, required=False) _PROPERTY_FILTERS = {} class Meta: model = Marker + exclude = [] @classmethod def _set_cls_fields(cls): @@ -459,10 +467,11 @@ class RouteAdminForm(forms.ModelForm): Main form for route """ is_admin = True - name = forms.CharField(_(u"Name"), required=True) + name = forms.CharField(label=_(u"Name"), required=True) class Meta: model = Route + exclude = [] def __init__(self, *args, **keys): """ @@ -576,6 +585,7 @@ class PolygonAdminForm(MarkerAdminForm): """ class Meta: model = Polygon + exclude = [] class PolygonForm(PolygonAdminForm): @@ -633,6 +643,7 @@ class BaseFileForm(forms.ModelForm): class MultimediaFileAdminForm(forms.ModelForm): class Meta: model = MultimediaFile + exclude = [] class Media: js = list(settings.JQUERY_JS_URLS) + [ @@ -668,6 +679,7 @@ MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True) class PictureFileAdminForm(forms.ModelForm): class Meta: model = PictureFile + exclude = [] class Media: js = list(settings.JQUERY_JS_URLS) + [ @@ -719,6 +731,7 @@ class AreaAdminForm(forms.ModelForm): class Meta: model = Area + exclude = [] def __init__(self, *args, **keys): """ @@ -762,7 +775,7 @@ class AreaAdminForm(forms.ModelForm): q = q.exclude(pk=self.instance.pk) if q.count(): msg = _(u"The area \"%s\" has the same order, you need to" - u" choose another one.") % unicode(q.all()[0]) + u" choose another one.") % str(q.all()[0]) raise forms.ValidationError(msg) return self.cleaned_data @@ -800,6 +813,7 @@ class AreaForm(AreaAdminForm): """ class Meta: model = Area + exclude = [] CHIMERE_ROUTING_TRANSPORT = [] ROUTING_INIT = None diff --git a/chimere/management/commands/chimere_import.py b/chimere/management/commands/chimere_import.py index faddd5e..2f15632 100644 --- a/chimere/management/commands/chimere_import.py +++ b/chimere/management/commands/chimere_import.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import csv -import datetime, time +import time from optparse import make_option from django.core.management.base import BaseCommand, CommandError @@ -11,18 +10,19 @@ from django.core.exceptions import ObjectDoesNotExist from chimere.models import Importer from chimere import tasks + class Command(BaseCommand): args = '<import_id>' help = "Launch import from an external source. Import configuration must "\ "be beforehand inserted in the database with the web admin." option_list = BaseCommand.option_list + ( - make_option('--all', + make_option( + '--all', action='store_true', dest='all', default=False, help='Update all imports set to be automatically updated'), - ) - + ) def handle(self, *args, **options): importers = [] @@ -32,26 +32,27 @@ class Command(BaseCommand): try: importers = [Importer.objects.get(pk=int(args[0]))] except (ValueError, ObjectDoesNotExist): - raise CommandError("Import with ID '%s' doesn't exist." % \ - args[0]) + raise CommandError( + "Import with ID '%s' doesn't exist." % args[0]) else: - imports = dict([(imp.pk, imp) - for imp in Importer.objects.order_by('pk').all()]) + imports = dict( + [(imp.pk, imp) + for imp in Importer.objects.order_by('pk').all()]) while not importers: self.stdout.write('* Choose the import: \n') for k in imports: - self.stdout.write(' %s\n' % unicode(imports[k]).encode( - 'ascii', 'ignore')) + self.stdout.write(' %s\n' % str(imports[k]).encode( + 'ascii', 'ignore')) self.stdout.flush() self.stdout.write('\nImport ID: ') v = raw_input() try: importers = [Importer.objects.get(pk=int(v))] except (ValueError, ObjectDoesNotExist): - self.stdout.write("Import with ID '%s' doesn't exist.\n\n" \ + self.stdout.write("Import with ID '%s' doesn't exist.\n\n" % v) for imprt in importers: - pending_state = unicode(tasks.IMPORT_MESSAGES['import_pending'][0]) + pending_state = str(tasks.IMPORT_MESSAGES['import_pending'][0]) imprt.state = pending_state imprt.save() tasks.importing(imprt.pk) @@ -62,4 +63,3 @@ class Command(BaseCommand): time.sleep(1) state = Importer.objects.get(pk=int(imprt.pk)).state self.stdout.write(state + '\n') - diff --git a/chimere/migrations/0001_initial.py b/chimere/migrations/0001_initial.py index c98ec01..2122912 100644 --- a/chimere/migrations/0001_initial.py +++ b/chimere/migrations/0001_initial.py @@ -1,628 +1,601 @@ # -*- 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 model 'News' - db.create_table('chimere_news', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('title', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('date', self.gf('django.db.models.fields.DateField')(auto_now_add=True, blank=True)), - ('content', self.gf('django.db.models.fields.TextField')()), - )) - db.send_create_signal('chimere', ['News']) - - # Adding M2M table for field areas on 'News' - db.create_table('chimere_news_areas', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('news', models.ForeignKey(orm['chimere.news'], null=False)), - ('area', models.ForeignKey(orm['chimere.area'], null=False)) - )) - db.create_unique('chimere_news_areas', ['news_id', 'area_id']) - - # Adding model 'TinyUrl' - db.create_table('chimere_tinyurl', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('parameters', self.gf('django.db.models.fields.CharField')(max_length=500)), - )) - db.send_create_signal('chimere', ['TinyUrl']) - - # Adding model 'ColorTheme' - db.create_table('chimere_colortheme', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - )) - db.send_create_signal('chimere', ['ColorTheme']) - - # Adding model 'Color' - db.create_table('chimere_color', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('code', self.gf('django.db.models.fields.CharField')(max_length=6)), - ('order', self.gf('django.db.models.fields.IntegerField')()), - ('color_theme', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.ColorTheme'])), - )) - db.send_create_signal('chimere', ['Color']) - - # Adding model 'Category' - db.create_table('chimere_category', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('order', self.gf('django.db.models.fields.IntegerField')()), - ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - )) - db.send_create_signal('chimere', ['Category']) - - # Adding model 'Icon' - db.create_table('chimere_icon', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), - ('height', self.gf('django.db.models.fields.IntegerField')()), - ('width', self.gf('django.db.models.fields.IntegerField')()), - )) - db.send_create_signal('chimere', ['Icon']) - - # Adding model 'SubCategory' - db.create_table('chimere_subcategory', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('category', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subcategories', to=orm['chimere.Category'])), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('submission', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('icon', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Icon'])), - ('color_theme', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.ColorTheme'], null=True, blank=True)), - ('order', self.gf('django.db.models.fields.IntegerField')(default=1000)), - ('item_type', self.gf('django.db.models.fields.CharField')(max_length=1)), - )) - db.send_create_signal('chimere', ['SubCategory']) - - # Adding model 'Importer' - db.create_table('chimere_importer', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('importer_type', self.gf('django.db.models.fields.CharField')(max_length=4)), - ('filtr', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('source_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)), - ('default_name', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('srid', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('zipped', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('get_description', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('default_description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('state', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('associate_marker_to_way', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal('chimere', ['Importer']) - - # Adding M2M table for field categories on 'Importer' - db.create_table('chimere_importer_categories', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('importer', models.ForeignKey(orm['chimere.importer'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_importer_categories', ['importer_id', 'subcategory_id']) - - # Adding model 'Marker' - db.create_table('chimere_marker', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), - ('submiter_name', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), - ('submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)), - ('submiter_comment', self.gf('django.db.models.fields.TextField')(max_length=200, null=True, blank=True)), - ('status', self.gf('django.db.models.fields.CharField')(max_length=1)), - ('import_key', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('import_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('import_source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('modified_since_import', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('not_for_osm', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), - ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), - ('ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_marker', null=True, to=orm['chimere.Marker'])), - ('point', self.gf('chimere.widgets.PointField')()), - ('available_date', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), - ('route', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='associated_marker', null=True, to=orm['chimere.Route'])), - ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - )) - db.send_create_signal('chimere', ['Marker']) - - # Adding M2M table for field categories on 'Marker' - db.create_table('chimere_marker_categories', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('marker', models.ForeignKey(orm['chimere.marker'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_marker_categories', ['marker_id', 'subcategory_id']) - - # Adding model 'MultimediaType' - db.create_table('chimere_multimediatype', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('media_type', self.gf('django.db.models.fields.CharField')(max_length=1)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)), - ('iframe', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), - )) - db.send_create_signal('chimere', ['MultimediaType']) - - # Adding model 'MultimediaExtension' - db.create_table('chimere_multimediaextension', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=6)), - ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='extensions', to=orm['chimere.MultimediaType'])), - )) - db.send_create_signal('chimere', ['MultimediaExtension']) - - # Adding model 'MultimediaFile' - db.create_table('chimere_multimediafile', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('url', self.gf('django.db.models.fields.URLField')(max_length=200)), - ('order', self.gf('django.db.models.fields.IntegerField')(default=1)), - ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.MultimediaType'], null=True, blank=True)), - ('miniature', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('marker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='multimedia_files', to=orm['chimere.Marker'])), - )) - db.send_create_signal('chimere', ['MultimediaFile']) - - # Adding model 'PictureFile' - db.create_table('chimere_picturefile', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('picture', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), - ('height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('miniature', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('thumbnailfile', self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True)), - ('thumbnailfile_height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('thumbnailfile_width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('order', self.gf('django.db.models.fields.IntegerField')(default=1)), - ('marker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='pictures', to=orm['chimere.Marker'])), - )) - db.send_create_signal('chimere', ['PictureFile']) - - # Adding model 'RouteFile' - db.create_table('chimere_routefile', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('raw_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)), - ('simplified_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)), - ('file_type', self.gf('django.db.models.fields.CharField')(max_length=1)), - )) - db.send_create_signal('chimere', ['RouteFile']) - - # Adding model 'Route' - db.create_table('chimere_route', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), - ('submiter_name', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), - ('submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)), - ('submiter_comment', self.gf('django.db.models.fields.TextField')(max_length=200, null=True, blank=True)), - ('status', self.gf('django.db.models.fields.CharField')(max_length=1)), - ('import_key', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('import_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('import_source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('modified_since_import', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('not_for_osm', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), - ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), - ('ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_route', null=True, to=orm['chimere.Route'])), - ('route', self.gf('chimere.widgets.RouteField')()), - ('associated_file', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.RouteFile'], null=True, blank=True)), - ('picture', self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True)), - ('height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('has_associated_marker', self.gf('django.db.models.fields.BooleanField')(default=True)), - )) - db.send_create_signal('chimere', ['Route']) - - # Adding M2M table for field categories on 'Route' - db.create_table('chimere_route_categories', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['chimere.route'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_route_categories', ['route_id', 'subcategory_id']) - - # Adding model 'Layer' - db.create_table('chimere_layer', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('layer_code', self.gf('django.db.models.fields.TextField')(max_length=300)), - )) - db.send_create_signal('chimere', ['Layer']) - - # Adding model 'Area' - db.create_table('chimere_area', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('urn', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50, blank=True)), - ('welcome_message', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - ('order', self.gf('django.db.models.fields.IntegerField')(unique=True)), - ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('upper_left_corner', self.gf('django.contrib.gis.db.models.fields.PointField')(default='POINT(0 0)')), - ('lower_right_corner', self.gf('django.contrib.gis.db.models.fields.PointField')(default='POINT(0 0)')), - ('default', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), - ('dynamic_categories', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), - ('external_css', self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True)), - ('restrict_to_extent', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal('chimere', ['Area']) - - # Adding M2M table for field default_subcategories on 'Area' - db.create_table('chimere_area_default_subcategories', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('area', models.ForeignKey(orm['chimere.area'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_area_default_subcategories', ['area_id', 'subcategory_id']) - - # Adding M2M table for field subcategories on 'Area' - db.create_table('chimere_subcategory_areas', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('area', models.ForeignKey(orm['chimere.area'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_subcategory_areas', ['area_id', 'subcategory_id']) - - # Adding model 'AreaLayers' - db.create_table('chimere_arealayers', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('area', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Area'])), - ('layer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Layer'])), - ('order', self.gf('django.db.models.fields.IntegerField')()), - ('default', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), - )) - db.send_create_signal('chimere', ['AreaLayers']) - - # Adding model 'PropertyModel' - db.create_table('chimere_propertymodel', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('order', self.gf('django.db.models.fields.IntegerField')()), - ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('mandatory', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('type', self.gf('django.db.models.fields.CharField')(max_length=1)), - )) - db.send_create_signal('chimere', ['PropertyModel']) - - # Adding M2M table for field subcategories on 'PropertyModel' - db.create_table('chimere_propertymodel_subcategories', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('propertymodel', models.ForeignKey(orm['chimere.propertymodel'], null=False)), - ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) - )) - db.create_unique('chimere_propertymodel_subcategories', ['propertymodel_id', 'subcategory_id']) - - # Adding model 'Property' - db.create_table('chimere_property', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('marker', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Marker'])), - ('propertymodel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.PropertyModel'])), - ('value', self.gf('django.db.models.fields.TextField')()), - )) - db.send_create_signal('chimere', ['Property']) - - - def backwards(self, orm): - # Deleting model 'News' - db.delete_table('chimere_news') - - # Removing M2M table for field areas on 'News' - db.delete_table('chimere_news_areas') - - # Deleting model 'TinyUrl' - db.delete_table('chimere_tinyurl') - - # Deleting model 'ColorTheme' - db.delete_table('chimere_colortheme') - - # Deleting model 'Color' - db.delete_table('chimere_color') - - # Deleting model 'Category' - db.delete_table('chimere_category') - - # Deleting model 'Icon' - db.delete_table('chimere_icon') - - # Deleting model 'SubCategory' - db.delete_table('chimere_subcategory') - - # Deleting model 'Importer' - db.delete_table('chimere_importer') - - # Removing M2M table for field categories on 'Importer' - db.delete_table('chimere_importer_categories') - - # Deleting model 'Marker' - db.delete_table('chimere_marker') - - # Removing M2M table for field categories on 'Marker' - db.delete_table('chimere_marker_categories') - - # Deleting model 'MultimediaType' - db.delete_table('chimere_multimediatype') - - # Deleting model 'MultimediaExtension' - db.delete_table('chimere_multimediaextension') - - # Deleting model 'MultimediaFile' - db.delete_table('chimere_multimediafile') - - # Deleting model 'PictureFile' - db.delete_table('chimere_picturefile') - - # Deleting model 'RouteFile' - db.delete_table('chimere_routefile') - - # Deleting model 'Route' - db.delete_table('chimere_route') - - # Removing M2M table for field categories on 'Route' - db.delete_table('chimere_route_categories') - - # Deleting model 'Layer' - db.delete_table('chimere_layer') - - # Deleting model 'Area' - db.delete_table('chimere_area') - - # Removing M2M table for field default_subcategories on 'Area' - db.delete_table('chimere_area_default_subcategories') - - # Removing M2M table for field subcategories on 'Area' - db.delete_table('chimere_subcategory_areas') - - # Deleting model 'AreaLayers' - db.delete_table('chimere_arealayers') - - # Deleting model 'PropertyModel' - db.delete_table('chimere_propertymodel') - - # Removing M2M table for field subcategories on 'PropertyModel' - db.delete_table('chimere_propertymodel_subcategories') - - # Deleting model 'Property' - db.delete_table('chimere_property') - - - models = { - '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': '6'}), - 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.colortheme': { - 'Meta': {'object_name': 'ColorTheme'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.icon': { - 'Meta': {'object_name': 'Icon'}, - 'height': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'width': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.importer': { - 'Meta': {'object_name': 'Importer'}, - 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), - 'default_description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'filtr': ('django.db.models.fields.CharField', [], {'max_length': '200', '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': '100', 'null': 'True', 'blank': 'True'}), - 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), - 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'state': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) - }, - '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'}), - 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'point': ('chimere.widgets.PointField', [], {}), - 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), - 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), - 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), - 'submiter_comment': ('django.db.models.fields.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': {'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', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.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.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.route': { - 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, - 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), - 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), - 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - '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'}), - 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}, - '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'}), - 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), - 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) - }, - 'chimere.tinyurl': { - 'Meta': {'object_name': 'TinyUrl'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) - } - } - - complete_apps = ['chimere']
\ No newline at end of file +from __future__ import unicode_literals + +from django.db import migrations, models +import chimere.models +import chimere.widgets +import django.contrib.gis.db.models.fields +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='AggregatedPolygon', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('polygon', django.contrib.gis.db.models.fields.MultiPolygonField(srid=4326)), + ('status', models.CharField(verbose_name='Status', max_length=1, choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')])), + ], + options={ + 'db_table': 'chimere_aggregated_polygons', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AggregatedRoute', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('route', django.contrib.gis.db.models.fields.MultiLineStringField(srid=4326)), + ('status', models.CharField(verbose_name='Status', max_length=1, choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')])), + ], + options={ + 'db_table': 'chimere_aggregated_routes', + 'managed': False, + }, + ), + migrations.CreateModel( + name='Area', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('urn', models.SlugField(verbose_name='Area urn', blank=True, unique=True)), + ('welcome_message', models.TextField(verbose_name='Welcome message', blank=True, null=True)), + ('order', models.IntegerField(verbose_name='Order', unique=True)), + ('available', models.BooleanField(verbose_name='Available')), + ('upper_left_corner', django.contrib.gis.db.models.fields.PointField(verbose_name='Upper left corner', default='POINT(0 0)', srid=4326)), + ('lower_right_corner', django.contrib.gis.db.models.fields.PointField(verbose_name='Lower right corner', default='POINT(0 0)', srid=4326)), + ('default', models.NullBooleanField(verbose_name='Default area', help_text='Only one area is set by default')), + ('dynamic_categories', models.NullBooleanField(verbose_name='Sub-categories dynamicaly displayed', help_text='If checked, categories are only displayed in the menu if they are available on the current extent.')), + ('display_category_menu', models.BooleanField(verbose_name='Display category menu', default=True, help_text='If set to False, category menu will be hide and all categories will be always displayed.')), + ('external_css', models.URLField(verbose_name='Link to an external CSS', blank=True, null=True)), + ('restrict_to_extent', models.BooleanField(verbose_name='Restrict to the area extent', default=False)), + ('allow_point_edition', models.BooleanField(verbose_name='Allow point edition', default=True)), + ('allow_route_edition', models.BooleanField(verbose_name='Allow route edition', default=True)), + ('allow_polygon_edition', models.BooleanField(verbose_name='Allow polygon edition', default=True)), + ('extra_map_def', models.TextField(verbose_name='Extra map definition', help_text='Extra javascript script loaded for this area. Carreful! To prevent breaking the map must be valid.', blank=True, null=True)), + ], + options={ + 'verbose_name': 'Area', + 'ordering': ('order', 'name'), + }, + bases=(models.Model, chimere.models.SimpleArea), + ), + migrations.CreateModel( + name='AreaLayers', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('order', models.IntegerField(verbose_name='Order')), + ('default', models.NullBooleanField(verbose_name='Default layer')), + ('area', models.ForeignKey(to='chimere.Area')), + ], + options={ + 'verbose_name': 'Layers', + 'verbose_name_plural': 'Layers', + 'ordering': ('order',), + }, + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('available', models.BooleanField(verbose_name='Available')), + ('order', models.IntegerField(verbose_name='Order')), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'Category', + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='Color', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('code', models.CharField(verbose_name='Code/name', max_length=200, help_text='HTML code/name')), + ('inner_code', models.CharField(verbose_name='Code/name (inner)', max_length=200, blank=True, null=True, help_text='HTML code/name')), + ('order', models.IntegerField(verbose_name='Order')), + ], + options={ + 'verbose_name': 'Color', + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='ColorTheme', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ], + options={ + 'verbose_name': 'Color theme', + }, + ), + migrations.CreateModel( + name='Icon', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('image', models.ImageField(verbose_name='Image', height_field='height', width_field='width', upload_to='icons')), + ('height', models.IntegerField(verbose_name='Height')), + ('width', models.IntegerField(verbose_name='Width')), + ('offset_x', models.IntegerField(verbose_name='Offset x', default=10, help_text='Common value is half the icon width')), + ('offset_y', models.IntegerField(verbose_name='Offset y', default=20, help_text='Common value is icon height')), + ('popup_offset_x', models.IntegerField(verbose_name='Popup offset x', default=0, help_text='Common value is 0')), + ('popup_offset_y', models.IntegerField(verbose_name='Popup offset y', default=20, help_text='Common value is icon height')), + ], + options={ + 'verbose_name': 'Icon', + }, + ), + migrations.CreateModel( + name='Importer', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('importer_type', models.CharField(verbose_name='Importer type', max_length=4, choices=[('KML', 'KML'), ('OSM', 'OSM'), ('SHP', 'Shapefile'), ('RSS', 'GeoRSS'), ('CSV', 'CSV'), ('JSON', 'JSON'), ('ICAL', 'ICAL'), ('XSLT', 'HTML-XSLT'), ('XXLT', 'XML-XSLT')])), + ('filtr', models.TextField(verbose_name='Filter', blank=True, null=True)), + ('source', models.CharField(verbose_name='Web address', max_length=200, blank=True, null=True, help_text="Don't forget the trailing slash")), + ('source_file', models.FileField(verbose_name='Source file', blank=True, null=True, upload_to='import_files')), + ('source_file_alt', models.FileField(verbose_name='Alt source file', blank=True, null=True, upload_to='import_files')), + ('default_name', models.CharField(verbose_name='Name by default', max_length=200, blank=True, null=True)), + ('srid', models.IntegerField(verbose_name='SRID', blank=True, null=True)), + ('zipped', models.BooleanField(verbose_name='Zipped file', default=False)), + ('overwrite', models.BooleanField(verbose_name='Overwrite existing data', default=False)), + ('get_description', models.BooleanField(verbose_name='Get description from source', default=False)), + ('default_description', models.TextField(verbose_name='Default description', blank=True, null=True)), + ('origin', models.CharField(verbose_name='Origin', max_length=1000, blank=True, null=True)), + ('license', models.CharField(verbose_name='License', max_length=1000, blank=True, null=True)), + ('state', models.TextField(verbose_name='State', blank=True, null=True)), + ('automatic_update', models.BooleanField(verbose_name='Automatically updated', default=False)), + ('default_status', models.CharField(verbose_name='Default status', default='I', choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')], max_length=1)), + ('default_localisation', chimere.widgets.PointField(verbose_name='Default localisation', blank=True, null=True, srid=4326)), + ], + options={ + 'verbose_name': 'Importer', + }, + ), + migrations.CreateModel( + name='ImporterKeyCategories', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('key', models.CharField(verbose_name='Import key', max_length=200)), + ], + options={ + 'verbose_name': 'Importer - Key categories', + }, + ), + migrations.CreateModel( + name='Layer', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('layer_code', models.TextField(verbose_name='Layer code')), + ('extra_js_code', models.TextField(verbose_name='Extra JS code', default='', blank=True, null=True, help_text='This code is loaded before the layer code.')), + ], + options={ + 'verbose_name': 'Layer', + }, + ), + migrations.CreateModel( + name='Marker', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.TextField(verbose_name='Name')), + ('submiter_session_key', models.CharField(verbose_name='Submitter session key', max_length=40, blank=True, null=True)), + ('submiter_name', models.CharField(verbose_name='Submitter name or nickname', max_length=40, blank=True, null=True)), + ('submiter_email', models.EmailField(verbose_name='Submitter email', max_length=254, blank=True, null=True)), + ('submiter_comment', models.TextField(verbose_name='Submitter comment', max_length=200, blank=True, null=True)), + ('status', models.CharField(verbose_name='Status', max_length=1, choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')])), + ('keywords', models.TextField(verbose_name='Keywords', max_length=200, blank=True, null=True)), + ('import_key', models.CharField(verbose_name='Import key', max_length=200, blank=True, null=True)), + ('import_version', models.IntegerField(verbose_name='Import version', blank=True, null=True)), + ('import_source', models.CharField(verbose_name='Source', max_length=200, blank=True, null=True)), + ('modified_since_import', models.BooleanField(verbose_name='Modified since last import', default=True)), + ('not_for_osm', models.BooleanField(verbose_name='Not to be exported to OSM', default=False)), + ('origin', models.CharField(verbose_name='Origin', max_length=1000, blank=True, null=True)), + ('license', models.CharField(verbose_name='License', max_length=1000, blank=True, null=True)), + ('start_date', models.DateField(verbose_name='Start date', help_text='Not mandatory. Set it for dated item such as event. Format YYYY-MM-DD', blank=True, null=True)), + ('end_date', models.DateField(verbose_name='End date', help_text='Not mandatory. Set it only if you have a multi-day event. Format YYYY-MM-DD', blank=True, null=True)), + ('weight', models.FloatField(verbose_name='Weight', help_text='Weight are used for heatmap and clustering. A formula must defined in the associated category.', blank=True, null=True)), + ('normalised_weight', models.FloatField(verbose_name='Normalised weight', help_text='The weight normalised to be between 0 and 1. Automatically recalculated.', blank=True, null=True)), + ('point', chimere.widgets.PointField(verbose_name='Localisation', srid=4326)), + ('available_date', models.DateTimeField(verbose_name='Available Date', blank=True, null=True)), + ('description', models.TextField(verbose_name='Description', blank=True, null=True)), + ('is_front_page', models.NullBooleanField(verbose_name='Is front page')), + ], + options={ + 'verbose_name': 'Point of interest', + 'ordering': ('status', 'name'), + }, + ), + migrations.CreateModel( + name='MultimediaExtension', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Extension name', max_length=6)), + ], + options={ + 'verbose_name': 'Multimedia extension', + 'verbose_name_plural': 'Multimedia extensions', + }, + ), + migrations.CreateModel( + name='MultimediaFile', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('url', models.URLField(verbose_name='Url')), + ('order', models.IntegerField(verbose_name='Order', default=1)), + ('miniature', models.BooleanField(verbose_name='Display inside the description?', default=False)), + ('marker', models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Marker')), + ], + options={ + 'verbose_name': 'Multimedia file', + 'verbose_name_plural': 'Multimedia files', + }, + ), + migrations.CreateModel( + name='MultimediaType', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('media_type', models.CharField(verbose_name='Media type', max_length=1, choices=[('A', 'Audio'), ('V', 'Video'), ('I', 'Image'), ('O', 'Other')])), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('mime_type', models.CharField(verbose_name='Mime type', max_length=50, blank=True, null=True)), + ('iframe', models.BooleanField(verbose_name='Inside an iframe', default=False)), + ('available', models.BooleanField(verbose_name='Available', default=True)), + ], + options={ + 'verbose_name': 'Multimedia type', + 'verbose_name_plural': 'Multimedia types', + }, + ), + migrations.CreateModel( + name='News', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('title', models.CharField(verbose_name='Name', max_length=150)), + ('available', models.BooleanField(verbose_name='Available')), + ('is_front_page', models.NullBooleanField(verbose_name='Is front page')), + ('date', models.DateField(verbose_name='Date')), + ('content', models.TextField()), + ('url', models.URLField(verbose_name='Url', blank=True, null=True)), + ('areas', chimere.widgets.SelectMultipleField(verbose_name='Associated areas', blank=True, to='chimere.Area')), + ], + options={ + 'verbose_name': 'News', + 'verbose_name_plural': 'News', + 'ordering': ['-date'], + }, + ), + migrations.CreateModel( + name='Page', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('title', models.CharField(verbose_name='Name', max_length=150)), + ('mnemonic', models.CharField(verbose_name='Mnemonic', max_length=10, blank=True, null=True)), + ('available', models.BooleanField(verbose_name='Available', default=True)), + ('order', models.IntegerField(verbose_name='Order', default=10, blank=True, null=True)), + ('template_path', models.CharField(verbose_name='Template path', max_length=150, blank=True, null=True)), + ('content', models.TextField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'Page', + 'verbose_name_plural': 'Page', + 'ordering': ['order'], + }, + ), + migrations.CreateModel( + name='PictureFile', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('picture', models.ImageField(verbose_name='Image', height_field='height', width_field='width', upload_to='pictures')), + ('height', models.IntegerField(verbose_name='Height', blank=True, null=True)), + ('width', models.IntegerField(verbose_name='Width', blank=True, null=True)), + ('miniature', models.BooleanField(verbose_name='Display inside the description?', default=False)), + ('thumbnailfile', models.ImageField(verbose_name='Thumbnail', height_field='thumbnailfile_height', blank=True, null=True, upload_to='pictures', width_field='thumbnailfile_width')), + ('thumbnailfile_height', models.IntegerField(verbose_name='Thumbnail height', blank=True, null=True)), + ('thumbnailfile_width', models.IntegerField(verbose_name='Thumbnail width', blank=True, null=True)), + ('order', models.IntegerField(verbose_name='Order', default=1)), + ('marker', models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Marker')), + ], + options={ + 'verbose_name': 'Picture file', + 'verbose_name_plural': 'Picture files', + }, + ), + migrations.CreateModel( + name='Polygon', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.TextField(verbose_name='Name')), + ('submiter_session_key', models.CharField(verbose_name='Submitter session key', max_length=40, blank=True, null=True)), + ('submiter_name', models.CharField(verbose_name='Submitter name or nickname', max_length=40, blank=True, null=True)), + ('submiter_email', models.EmailField(verbose_name='Submitter email', max_length=254, blank=True, null=True)), + ('submiter_comment', models.TextField(verbose_name='Submitter comment', max_length=200, blank=True, null=True)), + ('status', models.CharField(verbose_name='Status', max_length=1, choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')])), + ('keywords', models.TextField(verbose_name='Keywords', max_length=200, blank=True, null=True)), + ('import_key', models.CharField(verbose_name='Import key', max_length=200, blank=True, null=True)), + ('import_version', models.IntegerField(verbose_name='Import version', blank=True, null=True)), + ('import_source', models.CharField(verbose_name='Source', max_length=200, blank=True, null=True)), + ('modified_since_import', models.BooleanField(verbose_name='Modified since last import', default=True)), + ('not_for_osm', models.BooleanField(verbose_name='Not to be exported to OSM', default=False)), + ('origin', models.CharField(verbose_name='Origin', max_length=1000, blank=True, null=True)), + ('license', models.CharField(verbose_name='License', max_length=1000, blank=True, null=True)), + ('start_date', models.DateField(verbose_name='Start date', help_text='Not mandatory. Set it for dated item such as event. Format YYYY-MM-DD', blank=True, null=True)), + ('end_date', models.DateField(verbose_name='End date', help_text='Not mandatory. Set it only if you have a multi-day event. Format YYYY-MM-DD', blank=True, null=True)), + ('weight', models.FloatField(verbose_name='Weight', help_text='Weight are used for heatmap and clustering. A formula must defined in the associated category.', blank=True, null=True)), + ('normalised_weight', models.FloatField(verbose_name='Normalised weight', help_text='The weight normalised to be between 0 and 1. Automatically recalculated.', blank=True, null=True)), + ('polygon', chimere.widgets.PolygonField(verbose_name='Polygon', srid=4326)), + ('picture', models.ImageField(verbose_name='Image', height_field='height', blank=True, null=True, upload_to='upload', width_field='width')), + ('height', models.IntegerField(verbose_name='Height', blank=True, null=True)), + ('width', models.IntegerField(verbose_name='Width', blank=True, null=True)), + ('color', models.CharField(verbose_name='Color', max_length=200, blank=True, null=True, help_text='HTML code/name')), + ('inner_color', models.CharField(verbose_name='Inner color', max_length=200, blank=True, null=True, help_text='HTML code/name')), + ], + options={ + 'verbose_name': 'Polygon', + 'ordering': ('status', 'name'), + }, + ), + migrations.CreateModel( + name='Property', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('value', models.TextField(verbose_name='Value')), + ('marker', models.ForeignKey(verbose_name='Point of interest', blank=True, null=True, to='chimere.Marker')), + ('polygon', models.ForeignKey(verbose_name='Polygon', blank=True, null=True, to='chimere.Polygon')), + ], + options={ + 'verbose_name': 'Property', + }, + ), + migrations.CreateModel( + name='PropertyModel', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('slug', models.SlugField(verbose_name='Slug', blank=True, null=True)), + ('order', models.IntegerField(verbose_name='Order')), + ('available', models.BooleanField(verbose_name='Available')), + ('mandatory', models.BooleanField(verbose_name='Mandatory')), + ('type', models.CharField(verbose_name='Type', max_length=1, choices=[('T', 'Text'), ('L', 'Long text'), ('P', 'Password'), ('D', 'Date'), ('C', 'Choices'), ('A', 'Choices (autocomplete)'), ('B', 'Boolean')])), + ('areas', chimere.widgets.SelectMultipleField(verbose_name='Restrict to theses areas', help_text='If no area is set the property apply to all areas', blank=True, to='chimere.Area')), + ], + options={ + 'verbose_name': 'Property model', + 'ordering': ('order',), + }, + ), + migrations.CreateModel( + name='PropertyModelChoice', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('value', models.CharField(verbose_name='Value', max_length=150)), + ('available', models.BooleanField(verbose_name='Available', default=True)), + ('propertymodel', models.ForeignKey(verbose_name='Property model', related_name='choices', to='chimere.PropertyModel')), + ], + options={ + 'verbose_name': 'Model property choice', + }, + ), + migrations.CreateModel( + name='Route', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.TextField(verbose_name='Name')), + ('submiter_session_key', models.CharField(verbose_name='Submitter session key', max_length=40, blank=True, null=True)), + ('submiter_name', models.CharField(verbose_name='Submitter name or nickname', max_length=40, blank=True, null=True)), + ('submiter_email', models.EmailField(verbose_name='Submitter email', max_length=254, blank=True, null=True)), + ('submiter_comment', models.TextField(verbose_name='Submitter comment', max_length=200, blank=True, null=True)), + ('status', models.CharField(verbose_name='Status', max_length=1, choices=[('S', 'Submited'), ('A', 'Available'), ('M', 'Modified'), ('D', 'Disabled'), ('I', 'Imported')])), + ('keywords', models.TextField(verbose_name='Keywords', max_length=200, blank=True, null=True)), + ('import_key', models.CharField(verbose_name='Import key', max_length=200, blank=True, null=True)), + ('import_version', models.IntegerField(verbose_name='Import version', blank=True, null=True)), + ('import_source', models.CharField(verbose_name='Source', max_length=200, blank=True, null=True)), + ('modified_since_import', models.BooleanField(verbose_name='Modified since last import', default=True)), + ('not_for_osm', models.BooleanField(verbose_name='Not to be exported to OSM', default=False)), + ('origin', models.CharField(verbose_name='Origin', max_length=1000, blank=True, null=True)), + ('license', models.CharField(verbose_name='License', max_length=1000, blank=True, null=True)), + ('start_date', models.DateField(verbose_name='Start date', help_text='Not mandatory. Set it for dated item such as event. Format YYYY-MM-DD', blank=True, null=True)), + ('end_date', models.DateField(verbose_name='End date', help_text='Not mandatory. Set it only if you have a multi-day event. Format YYYY-MM-DD', blank=True, null=True)), + ('weight', models.FloatField(verbose_name='Weight', help_text='Weight are used for heatmap and clustering. A formula must defined in the associated category.', blank=True, null=True)), + ('normalised_weight', models.FloatField(verbose_name='Normalised weight', help_text='The weight normalised to be between 0 and 1. Automatically recalculated.', blank=True, null=True)), + ('route', chimere.widgets.RouteField(verbose_name='Route', srid=4326)), + ('picture', models.ImageField(verbose_name='Image', height_field='height', blank=True, null=True, upload_to='upload', width_field='width')), + ('height', models.IntegerField(verbose_name='Height', blank=True, null=True)), + ('width', models.IntegerField(verbose_name='Width', blank=True, null=True)), + ('color', models.CharField(verbose_name='Color', max_length=200, blank=True, null=True, help_text='HTML code/name')), + ], + options={ + 'verbose_name': 'Route', + 'ordering': ('status', 'name'), + }, + ), + migrations.CreateModel( + name='RouteFile', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('raw_file', models.FileField(verbose_name='Raw file (gpx or kml)', upload_to='route_files')), + ('simplified_file', models.FileField(verbose_name='Simplified file', blank=True, null=True, upload_to='route_files')), + ('file_type', models.CharField(max_length=1, choices=[('K', 'KML'), ('G', 'GPX')])), + ], + options={ + 'verbose_name': 'Route file', + 'verbose_name_plural': 'Route files', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='SubCategory', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('name', models.CharField(verbose_name='Name', max_length=150)), + ('available', models.BooleanField(verbose_name='Available', default=True)), + ('submission', models.BooleanField(verbose_name='Available for submission', default=True)), + ('item_type', models.CharField(verbose_name='Item type', max_length=1, choices=[('M', 'Marker'), ('R', 'Route'), ('P', 'Polygon'), ('B', 'Both')])), + ('dated', models.BooleanField(verbose_name='Is dated', default=False)), + ('description', models.TextField(blank=True, null=True)), + ('as_layer', models.BooleanField(verbose_name='Displayed in the layer menu', default=False)), + ('weight_formula', models.TextField(verbose_name='Weight formula', default='', blank=True, null=True)), + ('routing_warn', models.BooleanField(verbose_name='Routing warn', default=False)), + ('order', models.IntegerField(verbose_name='Order', default=1000)), + ('keywords', models.TextField(verbose_name='Keywords', max_length=200, blank=True, null=True)), + ('min_zoom', models.IntegerField(verbose_name='Minimum zoom for loading details', help_text='Optimization when too many data have to be displayed. Currently available only for route and polygon.', blank=True, null=True)), + ('simplify_tolerance', models.FloatField(verbose_name='Simplify tolerance for lower zoom', help_text='Only relevant when Minimum zoom is set. Use the Douglas-Peucker algorythm to simplify the geometry when details is not alvailable. Adjust to your data volume and your performance need. 0.0003 is a good starting point. Note: typology is not preserved.', blank=True, null=True)), + ('category', models.ForeignKey(verbose_name='Category', related_name='subcategories', to='chimere.Category')), + ('color_theme', models.ForeignKey(verbose_name='Color theme', related_name='subcategories', blank=True, null=True, to='chimere.ColorTheme')), + ('hover_icon', models.ForeignKey(verbose_name='Hover icon', related_name='subcat_hovered', blank=True, null=True, to='chimere.Icon')), + ('icon', models.ForeignKey(verbose_name='Icon', to='chimere.Icon')), + ], + options={ + 'verbose_name': 'Sub-category', + 'verbose_name_plural': 'Sub-categories', + 'ordering': ['category', 'order'], + }, + ), + migrations.CreateModel( + name='SubCategoryUserLimit', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('subcategory', models.ForeignKey(related_name='limited_for_user', to='chimere.SubCategory')), + ('user', models.ForeignKey(related_name='subcategory_limit_to', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Sub-category limit for user', + 'verbose_name_plural': 'Sub-category limits for users', + }, + ), + migrations.CreateModel( + name='TinyUrl', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)), + ('parameters', models.CharField(verbose_name='Parameters', max_length=500, unique=True)), + ], + options={ + 'verbose_name': 'TinyUrl', + }, + ), + migrations.AddField( + model_name='route', + name='associated_file', + field=models.ForeignKey(verbose_name='Associated file', blank=True, null=True, to='chimere.RouteFile'), + ), + migrations.AddField( + model_name='route', + name='categories', + field=chimere.widgets.SelectMultipleField(to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='route', + name='ref_item', + field=models.ForeignKey(verbose_name='Reference route', related_name='submited_route', blank=True, null=True, to='chimere.Route'), + ), + migrations.AddField( + model_name='propertymodel', + name='subcategories', + field=chimere.widgets.SelectMultipleField(verbose_name='Restricted to theses sub-categories', help_text='If no sub-category is set all the property applies to all sub-categories', blank=True, related_name='properties', to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='property', + name='propertymodel', + field=models.ForeignKey(verbose_name='Property model', to='chimere.PropertyModel'), + ), + migrations.AddField( + model_name='polygon', + name='categories', + field=chimere.widgets.SelectMultipleField(to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='polygon', + name='ref_item', + field=models.ForeignKey(verbose_name='Reference polygon', related_name='submited_polygon', blank=True, null=True, to='chimere.Polygon'), + ), + migrations.AddField( + model_name='picturefile', + name='polygon', + field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Polygon'), + ), + migrations.AddField( + model_name='picturefile', + name='route', + field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Route'), + ), + migrations.AddField( + model_name='multimediafile', + name='multimedia_type', + field=models.ForeignKey(blank=True, null=True, to='chimere.MultimediaType'), + ), + migrations.AddField( + model_name='multimediafile', + name='polygon', + field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Polygon'), + ), + migrations.AddField( + model_name='multimediafile', + name='route', + field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Route'), + ), + migrations.AddField( + model_name='multimediaextension', + name='multimedia_type', + field=models.ForeignKey(verbose_name='Associated multimedia type', related_name='extensions', to='chimere.MultimediaType'), + ), + migrations.AddField( + model_name='marker', + name='categories', + field=chimere.widgets.SelectMultipleField(to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='marker', + name='ref_item', + field=models.ForeignKey(verbose_name='Reference marker', related_name='submited_marker', blank=True, null=True, to='chimere.Marker'), + ), + migrations.AddField( + model_name='importerkeycategories', + name='category', + field=models.ForeignKey(verbose_name='Category', to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='importerkeycategories', + name='importer', + field=models.ForeignKey(verbose_name='Importer', related_name='key_categories', to='chimere.Importer'), + ), + migrations.AddField( + model_name='importer', + name='categories', + field=chimere.widgets.SelectMultipleField(verbose_name='Associated subcategories', blank=True, to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='color', + name='color_theme', + field=models.ForeignKey(verbose_name='Color theme', to='chimere.ColorTheme'), + ), + migrations.AddField( + model_name='arealayers', + name='layer', + field=models.ForeignKey(to='chimere.Layer'), + ), + migrations.AddField( + model_name='area', + name='default_subcategories', + field=chimere.widgets.SelectMultipleField(verbose_name='Sub-categories checked by default', blank=True, to='chimere.SubCategory'), + ), + migrations.AddField( + model_name='area', + name='layers', + field=chimere.widgets.SelectMultipleField(related_name='areas', through='chimere.AreaLayers', blank=True, to='chimere.Layer'), + ), + migrations.AddField( + model_name='area', + name='subcategories', + field=chimere.widgets.SelectMultipleField(verbose_name='Restricted to theses sub-categories', related_name='areas', blank=True, db_table='chimere_subcategory_areas', to='chimere.SubCategory'), + ), + ] diff --git a/chimere/migrations/0039_auto__add_field_property_route.py b/chimere/migrations/0039_auto__add_field_property_route.py deleted file mode 100644 index 6027374..0000000 --- a/chimere/migrations/0039_auto__add_field_property_route.py +++ /dev/null @@ -1,395 +0,0 @@ -# -*- 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 'Property.route' - db.add_column('chimere_property', 'route', - self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Route'], null=True, blank=True), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Property.route' - db.delete_column('chimere_property', 'route_id') - - - 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.aggregatedpolygon': { - 'Meta': {'object_name': 'AggregatedPolygon', 'db_table': "'chimere_aggregated_polygons'", 'managed': 'False'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'polygon': ('django.contrib.gis.db.models.fields.MultiPolygonField', [], {}), - 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), - 'subcategory': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.SubCategory']"}) - }, - 'chimere.aggregatedroute': { - 'Meta': {'object_name': 'AggregatedRoute', 'db_table': "'chimere_aggregated_routes'", 'managed': 'False'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'route': ('django.contrib.gis.db.models.fields.MultiLineStringField', [], {}), - 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), - 'subcategory': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.SubCategory']"}) - }, - 'chimere.area': { - 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'}, - 'allow_point_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'allow_polygon_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'allow_route_edition': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'default_subcategories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False', 'blank': 'True'}), - 'display_category_menu': ('django.db.models.fields.BooleanField', [], {'default': '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'}), - 'extra_map_def': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'layers': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'through': "orm['chimere.AreaLayers']", 'to': "orm['chimere.Layer']"}), - 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}), - 'restrict_to_extent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'db_table': "'chimere_subcategory_areas'", 'to': "orm['chimere.SubCategory']"}), - 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), - 'urn': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'}), - 'welcome_message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) - }, - 'chimere.arealayers': { - 'Meta': {'ordering': "('order',)", 'object_name': 'AreaLayers'}, - 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Area']"}), - 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Layer']"}), - 'order': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.category': { - 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.color': { - 'Meta': {'ordering': "['order']", 'object_name': 'Color'}, - 'code': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'inner_code': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.colortheme': { - 'Meta': {'object_name': 'ColorTheme'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.icon': { - 'Meta': {'object_name': 'Icon'}, - 'height': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'offset_x': ('django.db.models.fields.IntegerField', [], {'default': '10'}), - 'offset_y': ('django.db.models.fields.IntegerField', [], {'default': '20'}), - 'popup_offset_x': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'popup_offset_y': ('django.db.models.fields.IntegerField', [], {'default': '20'}), - 'width': ('django.db.models.fields.IntegerField', [], {}) - }, - 'chimere.importer': { - 'Meta': {'object_name': 'Importer'}, - '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'}, - 'extra_js_code': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'layer_code': ('django.db.models.fields.TextField', [], {}), - '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', [], {}), - 'normalised_weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - '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']"}), - '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'}), - 'weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}) - }, - 'chimere.multimediaextension': { - 'Meta': {'object_name': 'MultimediaExtension'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) - }, - 'chimere.multimediafile': { - 'Meta': {'object_name': 'MultimediaFile'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'marker': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'multimedia_files'", 'null': 'True', 'to': "orm['chimere.Marker']"}), - 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']", 'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), - 'polygon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'multimedia_files'", 'null': 'True', 'to': "orm['chimere.Polygon']"}), - 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'multimedia_files'", 'null': 'True', 'to': "orm['chimere.Route']"}), - 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) - }, - 'chimere.multimediatype': { - 'Meta': {'object_name': 'MultimediaType'}, - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), - 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.news': { - 'Meta': {'ordering': "['-date']", 'object_name': 'News'}, - 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'content': ('django.db.models.fields.TextField', [], {}), - 'date': ('django.db.models.fields.DateField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) - }, - 'chimere.page': { - 'Meta': {'ordering': "['order']", 'object_name': 'Page'}, - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), - 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.picturefile': { - 'Meta': {'object_name': 'PictureFile'}, - 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'marker': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pictures'", 'null': 'True', 'to': "orm['chimere.Marker']"}), - 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), - 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), - 'polygon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pictures'", 'null': 'True', 'to': "orm['chimere.Polygon']"}), - 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pictures'", 'null': 'True', 'to': "orm['chimere.Route']"}), - 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) - }, - 'chimere.polygon': { - 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Polygon'}, - 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), - 'color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'inner_color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'keywords': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'license': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}), - 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.TextField', [], {}), - 'normalised_weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - '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'}), - 'weight': ('django.db.models.fields.FloatField', [], {'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']", 'null': 'True', 'blank': 'True'}), - 'polygon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Polygon']", 'null': 'True', 'blank': 'True'}), - 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), - 'route': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Route']", 'null': 'True', 'blank': 'True'}), - 'value': ('django.db.models.fields.TextField', [], {}) - }, - 'chimere.propertymodel': { - 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, - 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), - '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', [], {}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), - 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) - }, - 'chimere.propertymodelchoice': { - 'Meta': {'object_name': 'PropertyModelChoice'}, - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'chimere.route': { - 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, - 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), - 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), - 'color': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - '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', [], {}), - 'normalised_weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - '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'}), - 'weight': ('django.db.models.fields.FloatField', [], {'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', [], {'blank': 'True', 'related_name': "'subcategories'", 'null': 'True', 'to': "orm['chimere.ColorTheme']"}), - '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'}), - 'min_zoom': ('django.db.models.fields.IntegerField', [], {'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'}), - 'simplify_tolerance': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'weight_formula': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': '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 9bf645d..7f362a5 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -20,16 +20,17 @@ """ Models description """ -import os +import copy import datetime +import json +import os import pyexiv2 import re -import copy -import simplejson as json + from lxml import etree from PIL import Image from subprocess import Popen, PIPE -from BeautifulSoup import BeautifulSoup +from bs4 import BeautifulSoup from django import forms from django.conf import settings @@ -54,21 +55,21 @@ from chimere.utils import KMLManager, OSMManager, ShapefileManager, \ class Page(models.Model): """Simple extra pages """ - title = models.CharField(_(u"Name"), max_length=150) - mnemonic = models.CharField(_(u"Mnemonic"), max_length=10, blank=True, + title = models.CharField(_("Name"), max_length=150) + mnemonic = models.CharField(_("Mnemonic"), max_length=10, blank=True, null=True) - available = models.BooleanField(_(u"Available"), default=True) - order = models.IntegerField(_(u"Order"), default=10, blank=True, null=True) - template_path = models.CharField(_(u"Template path"), max_length=150, + available = models.BooleanField(_("Available"), default=True) + order = models.IntegerField(_("Order"), default=10, blank=True, null=True) + template_path = models.CharField(_("Template path"), max_length=150, blank=True, null=True) content = models.TextField(blank=True, null=True) class Meta: ordering = ["order"] - verbose_name = _(u"Page") - verbose_name_plural = _(u"Page") + verbose_name = _("Page") + verbose_name_plural = _("Page") - def __unicode__(self): + def __str__(self): return self.title @@ -107,22 +108,22 @@ def shortify(text): class News(models.Model): """News of the site """ - title = models.CharField(_(u"Name"), max_length=150) - available = models.BooleanField(_(u"Available")) - is_front_page = models.NullBooleanField(_(u"Is front page"), blank=True, + title = models.CharField(_("Name"), max_length=150) + available = models.BooleanField(_("Available")) + is_front_page = models.NullBooleanField(_("Is front page"), blank=True, null=True) - date = models.DateField(_(u"Date")) + date = models.DateField(_("Date")) content = models.TextField() - url = models.URLField(_(u"Url"), max_length=200, blank=True, null=True) - areas = SelectMultipleField('Area', verbose_name=_(u"Associated areas"), - blank=True, null=True) + url = models.URLField(_("Url"), max_length=200, blank=True, null=True) + areas = SelectMultipleField('Area', verbose_name=_("Associated areas"), + blank=True) class Meta: ordering = ["-date"] - verbose_name = _(u"News") - verbose_name_plural = _(u"News") + verbose_name = _("News") + verbose_name_plural = _("News") - def __unicode__(self): + def __str__(self): return self.title @property @@ -133,15 +134,15 @@ class News(models.Model): class TinyUrl(models.Model): """Tinyfied version of permalink parameters """ - parameters = models.CharField(_(u"Parameters"), max_length=500, + parameters = models.CharField(_("Parameters"), max_length=500, unique=True) digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" base = len(digits) class Meta: - verbose_name = _(u"TinyUrl") + verbose_name = _("TinyUrl") - def __unicode__(self): + def __str__(self): return self.parameters @classmethod @@ -167,7 +168,7 @@ class TinyUrl(models.Model): while 1: idx = n % cls.base urn = cls.digits[idx] + urn - n = n / cls.base + n = int(n / cls.base) if n == 0: break return urn @@ -176,31 +177,31 @@ class TinyUrl(models.Model): class ColorTheme(models.Model): """Color theme """ - name = models.CharField(_(u"Name"), max_length=150) + name = models.CharField(_("Name"), max_length=150) class Meta: - verbose_name = _(u"Color theme") + verbose_name = _("Color theme") - def __unicode__(self): + def __str__(self): return self.name class Color(models.Model): """Color """ - code = models.CharField(_(u"Code/name"), max_length=200, - help_text=_(u"HTML code/name")) - inner_code = models.CharField(_(u"Code/name (inner)"), max_length=200, - help_text=_(u"HTML code/name"), + code = models.CharField(_("Code/name"), max_length=200, + help_text=_("HTML code/name")) + inner_code = models.CharField(_("Code/name (inner)"), max_length=200, + help_text=_("HTML code/name"), blank=True, null=True) - order = models.IntegerField(_(u"Order")) - color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme")) + order = models.IntegerField(_("Order")) + color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme")) class Meta: ordering = ["order"] - verbose_name = _(u"Color") + verbose_name = _("Color") - def __unicode__(self): + def __str__(self): return self.code @property @@ -215,96 +216,96 @@ class Color(models.Model): class Category(models.Model): """Category of Point Of Interest (POI) """ - name = models.CharField(_(u"Name"), max_length=150) - available = models.BooleanField(_(u"Available")) - order = models.IntegerField(_(u"Order")) + name = models.CharField(_("Name"), max_length=150) + available = models.BooleanField(_("Available")) + order = models.IntegerField(_("Order")) description = models.TextField(blank=True, null=True) class Meta: ordering = ["order"] - verbose_name = _(u"Category") + verbose_name = _("Category") - def __unicode__(self): + def __str__(self): return self.name class Icon(models.Model): '''Icon ''' - name = models.CharField(_(u"Name"), max_length=150) - image = models.ImageField(_(u"Image"), upload_to='icons', + name = models.CharField(_("Name"), max_length=150) + image = models.ImageField(_("Image"), upload_to='icons', height_field='height', width_field='width') - height = models.IntegerField(_(u"Height")) - width = models.IntegerField(_(u"Width")) + height = models.IntegerField(_("Height")) + width = models.IntegerField(_("Width")) offset_x = models.IntegerField( - _(u"Offset x"), default=10, - help_text=_(u"Common value is half the icon width")) + _("Offset x"), default=10, + help_text=_("Common value is half the icon width")) offset_y = models.IntegerField( - _(u"Offset y"), default=20, - help_text=_(u"Common value is icon height")) - popup_offset_x = models.IntegerField(_(u"Popup offset x"), default=0, - help_text=_(u"Common value is 0")) + _("Offset y"), default=20, + help_text=_("Common value is icon height")) + popup_offset_x = models.IntegerField(_("Popup offset x"), default=0, + help_text=_("Common value is 0")) popup_offset_y = models.IntegerField( - _(u"Popup offset y"), default=20, - help_text=_(u"Common value is icon height")) + _("Popup offset y"), default=20, + help_text=_("Common value is icon height")) - def __unicode__(self): + def __str__(self): return self.name class Meta: - verbose_name = _(u"Icon") + verbose_name = _("Icon") class SubCategory(models.Model): '''Sub-category ''' - category = models.ForeignKey(Category, verbose_name=_(u"Category"), + category = models.ForeignKey(Category, verbose_name=_("Category"), related_name='subcategories') - name = models.CharField(_(u"Name"), max_length=150) - available = models.BooleanField(_(u"Available"), default=True) - submission = models.BooleanField(_(u"Available for submission"), + name = models.CharField(_("Name"), max_length=150) + available = models.BooleanField(_("Available"), default=True) + submission = models.BooleanField(_("Available for submission"), default=True) - TYPE = (('M', _(u'Marker')), - ('R', _(u'Route')), - ('P', _(u'Polygon')), - ('B', _(u'Both')),) - item_type = models.CharField(_(u"Item type"), max_length=1, choices=TYPE) - dated = models.BooleanField(_(u"Is dated"), default=False) + TYPE = (('M', _('Marker')), + ('R', _('Route')), + ('P', _('Polygon')), + ('B', _('Both')),) + item_type = models.CharField(_("Item type"), max_length=1, choices=TYPE) + dated = models.BooleanField(_("Is dated"), default=False) description = models.TextField(blank=True, null=True) - icon = models.ForeignKey(Icon, verbose_name=_(u"Icon")) + icon = models.ForeignKey(Icon, verbose_name=_("Icon")) hover_icon = models.ForeignKey( - Icon, verbose_name=_(u"Hover icon"), blank=True, null=True, + Icon, verbose_name=_("Hover icon"), blank=True, null=True, related_name='subcat_hovered') - color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"), + color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"), blank=True, null=True, related_name='subcategories') - as_layer = models.BooleanField(_(u"Displayed in the layer menu"), + as_layer = models.BooleanField(_("Displayed in the layer menu"), default=False) - weight_formula = models.TextField(_(u"Weight formula"), default="", + weight_formula = models.TextField(_("Weight formula"), default="", blank=True, null=True) - routing_warn = models.BooleanField(_(u"Routing warn"), default=False) - order = models.IntegerField(_(u"Order"), default=1000) - keywords = models.TextField(_(u"Keywords"), max_length=200, + routing_warn = models.BooleanField(_("Routing warn"), default=False) + order = models.IntegerField(_("Order"), default=1000) + keywords = models.TextField(_("Keywords"), max_length=200, blank=True, null=True) min_zoom = models.IntegerField( - _(u"Minimum zoom for loading details"), blank=True, null=True, - help_text=_(u"Optimization when too many data have to be displayed. " - u"Currently available only for route and polygon.")) + _("Minimum zoom for loading details"), blank=True, null=True, + help_text=_("Optimization when too many data have to be displayed. " + "Currently available only for route and polygon.")) simplify_tolerance = models.FloatField( - _(u"Simplify tolerance for lower zoom"), blank=True, null=True, - help_text=_(u"Only relevant when Minimum zoom is set. Use the " - u"Douglas-Peucker algorythm to simplify the geometry when " - u"details is not alvailable. Adjust to your data volume " - u"and your performance need. 0.0003 is a good starting " - u"point. Note: typology is not preserved.")) + _("Simplify tolerance for lower zoom"), blank=True, null=True, + help_text=_("Only relevant when Minimum zoom is set. Use the " + "Douglas-Peucker algorythm to simplify the geometry when " + "details is not alvailable. Adjust to your data volume " + "and your performance need. 0.0003 is a good starting " + "point. Note: typology is not preserved.")) class Meta: ordering = ["category", "order"] - verbose_name = _(u"Sub-category") - verbose_name_plural = _(u"Sub-categories") + verbose_name = _("Sub-category") + verbose_name_plural = _("Sub-categories") - def __unicode__(self): - return u"%s / %s" % (self.category.name, self.name) + def __str__(self): + return "%s / %s" % (self.category.name, self.name) @classmethod def getAvailable(cls, item_types=None, area_name=None, public=False, @@ -351,7 +352,7 @@ class SubCategory(models.Model): cats = [] for cat, subcats in cls.getAvailable(item_types=item_types, area_name=area_name): - cats.append((unicode(cat), + cats.append((str(cat), [(subcat.pk, subcat.name) for subcat in subcats])) return cats @@ -402,19 +403,19 @@ class SubCategoryUserLimit(models.Model): SubCategory, related_name='limited_for_user') user = models.ForeignKey(User, related_name='subcategory_limit_to') - def __unicode__(self): - return u"{} / {}".format(self.user, self.subcategory) + def __str__(self): + return "{} / {}".format(self.user, self.subcategory) class Meta: - verbose_name = _(u"Sub-category limit for user") - verbose_name_plural = _(u"Sub-category limits for users") + verbose_name = _("Sub-category limit for user") + verbose_name_plural = _("Sub-category limits for users") -STATUS = (('S', _(u'Submited')), - ('A', _(u'Available')), - ('M', _(u'Modified')), - ('D', _(u'Disabled')), - ('I', _(u'Imported'))) +STATUS = (('S', _('Submited')), + ('A', _('Available')), + ('M', _('Modified')), + ('D', _('Disabled')), + ('I', _('Imported'))) STATUS_DCT = dict(STATUS) IMPORTERS = {'KML': KMLManager, @@ -446,60 +447,60 @@ class Importer(models.Model): ''' Data importer for a specific subcategory ''' - importer_type = models.CharField(_(u"Importer type"), max_length=4, + importer_type = models.CharField(_("Importer type"), max_length=4, choices=IMPORTER_CHOICES) - filtr = models.TextField(_(u"Filter"), blank=True, null=True) - source = models.CharField(_(u"Web address"), max_length=200, + filtr = models.TextField(_("Filter"), blank=True, null=True) + source = models.CharField(_("Web address"), max_length=200, blank=True, null=True, - help_text=_(u"Don't forget the trailing slash")) + help_text=_("Don't forget the trailing slash")) source_file = models.FileField( - _(u"Source file"), upload_to='import_files', blank=True, null=True) + _("Source file"), upload_to='import_files', blank=True, null=True) source_file_alt = models.FileField( - _(u"Alt source file"), upload_to='import_files', blank=True, null=True) - default_name = models.CharField(_(u"Name by default"), max_length=200, + _("Alt source file"), upload_to='import_files', blank=True, null=True) + default_name = models.CharField(_("Name by default"), max_length=200, blank=True, null=True) - srid = models.IntegerField(_(u"SRID"), blank=True, null=True) - zipped = models.BooleanField(_(u"Zipped file"), default=False) - overwrite = models.BooleanField(_(u"Overwrite existing data"), + srid = models.IntegerField(_("SRID"), blank=True, null=True) + zipped = models.BooleanField(_("Zipped file"), default=False) + overwrite = models.BooleanField(_("Overwrite existing data"), default=False) - get_description = models.BooleanField(_(u"Get description from source"), + get_description = models.BooleanField(_("Get description from source"), default=False) - default_description = models.TextField(_(u"Default description"), + default_description = models.TextField(_("Default description"), blank=True, null=True) - origin = models.CharField(_(u"Origin"), max_length=1000, + origin = models.CharField(_("Origin"), max_length=1000, blank=True, null=True) - license = models.CharField(_(u"License"), max_length=1000, + license = models.CharField(_("License"), max_length=1000, blank=True, null=True) categories = SelectMultipleField( - SubCategory, blank=True, null=True, - verbose_name=_(u"Associated subcategories")) - state = models.TextField(_(u"State"), blank=True, null=True) - automatic_update = models.BooleanField(_(u"Automatically updated"), + SubCategory, blank=True, + verbose_name=_("Associated subcategories")) + state = models.TextField(_("State"), blank=True, null=True) + automatic_update = models.BooleanField(_("Automatically updated"), default=False) - default_status = models.CharField(_(u"Default status"), max_length=1, + default_status = models.CharField(_("Default status"), max_length=1, choices=STATUS, default='I') default_localisation = PointField( - _(u"Default localisation"), + _("Default localisation"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION, blank=True, null=True, widget=HiddenPointChooserWidget) class Meta: - verbose_name = _(u"Importer") + verbose_name = _("Importer") - def __unicode__(self): + def __str__(self): vals = [IMPORTER_CHOICES_DICT[self.importer_type], self.source, self.source_file.name, - u", ".join([unicode(cat) for cat in self.categories.all()]), + ", ".join([str(cat) for cat in self.categories.all()]), self.default_name] - return u' %d: %s' % (self.pk, u" - ".join([unicode(v) - for v in vals if v])) + return ' %d: %s' % (self.pk, " - ".join([str(v) + for v in vals if v])) @property def manager(self): return IMPORTERS[self.importer_type](self) def display_categories(self): - return u"\n".join([cat.name for cat in self.categories.all()]) + return "\n".join([cat.name for cat in self.categories.all()]) def get_key_category_dict(self): dct = {} @@ -519,65 +520,65 @@ class ImporterKeyCategories(models.Model): """ Association between key and categories """ - importer = models.ForeignKey(Importer, verbose_name=_(u"Importer"), + importer = models.ForeignKey(Importer, verbose_name=_("Importer"), related_name='key_categories') - category = models.ForeignKey(SubCategory, verbose_name=_(u"Category")) - key = models.CharField(_(u"Import key"), max_length=200) + category = models.ForeignKey(SubCategory, verbose_name=_("Category")) + key = models.CharField(_("Import key"), max_length=200) class Meta: - verbose_name = _(u"Importer - Key categories") + verbose_name = _("Importer - Key categories") class GeographicItem(models.Model): categories = SelectMultipleField(SubCategory) - name = models.TextField(_(u"Name")) + name = models.TextField(_("Name")) submiter_session_key = models.CharField( - _(u"Submitter session key"), blank=True, null=True, max_length=40) - submiter_name = models.CharField(_(u"Submitter name or nickname"), + _("Submitter session key"), blank=True, null=True, max_length=40) + submiter_name = models.CharField(_("Submitter name or nickname"), blank=True, null=True, max_length=40) - submiter_email = models.EmailField(_(u"Submitter email"), blank=True, + submiter_email = models.EmailField(_("Submitter email"), blank=True, null=True) - submiter_comment = models.TextField(_(u"Submitter comment"), + submiter_comment = models.TextField(_("Submitter comment"), max_length=200, blank=True, null=True) - status = models.CharField(_(u"Status"), max_length=1, choices=STATUS) - keywords = models.TextField(_(u"Keywords"), max_length=200, blank=True, + status = models.CharField(_("Status"), max_length=1, choices=STATUS) + keywords = models.TextField(_("Keywords"), max_length=200, blank=True, null=True) - import_key = models.CharField(_(u"Import key"), max_length=200, + import_key = models.CharField(_("Import key"), max_length=200, blank=True, null=True) - import_version = models.IntegerField(_(u"Import version"), + import_version = models.IntegerField(_("Import version"), blank=True, null=True) - import_source = models.CharField(_(u"Source"), max_length=200, + import_source = models.CharField(_("Source"), max_length=200, blank=True, null=True) modified_since_import = models.BooleanField( - _(u"Modified since last import"), default=True) - not_for_osm = models.BooleanField(_(u"Not to be exported to OSM"), + _("Modified since last import"), default=True) + not_for_osm = models.BooleanField(_("Not to be exported to OSM"), default=False) - origin = models.CharField(_(u"Origin"), max_length=1000, + origin = models.CharField(_("Origin"), max_length=1000, blank=True, null=True) - license = models.CharField(_(u"License"), max_length=1000, + license = models.CharField(_("License"), max_length=1000, blank=True, null=True) start_date = models.DateField( - _(u"Start date"), blank=True, null=True, - help_text=_(u"Not mandatory. Set it for dated item such as event. " - u"Format YYYY-MM-DD")) + _("Start date"), blank=True, null=True, + help_text=_("Not mandatory. Set it for dated item such as event. " + "Format YYYY-MM-DD")) end_date = models.DateField( - _(u"End date"), blank=True, null=True, - help_text=_(u"Not mandatory. Set it only if you have a multi-day " - u"event. Format YYYY-MM-DD")) + _("End date"), blank=True, null=True, + help_text=_("Not mandatory. Set it only if you have a multi-day " + "event. Format YYYY-MM-DD")) weight = models.FloatField( - _(u"Weight"), blank=True, null=True, + _("Weight"), blank=True, null=True, help_text=_( - u"Weight are used for heatmap and clustering. A formula must " - u"defined in the associated category.")) + "Weight are used for heatmap and clustering. A formula must " + "defined in the associated category.")) normalised_weight = models.FloatField( - _(u"Normalised weight"), blank=True, null=True, - help_text=_(u"The weight normalised to be between 0 and 1. " - u"Automatically recalculated.")) + _("Normalised weight"), blank=True, null=True, + help_text=_("The weight normalised to be between 0 and 1. " + "Automatically recalculated.")) class Meta: abstract = True - def __unicode__(self): + def __str__(self): return self.name def __init__(self, *args, **kwargs): @@ -637,7 +638,7 @@ class GeographicItem(models.Model): return properties def setProperty(self, pm, value): - u""" + """ Set a property """ if not hasattr(pm, 'pk'): @@ -678,9 +679,9 @@ class GeographicItem(models.Model): Save properties """ for propertymodel in PropertyModel.objects.filter(available=True): - val = u"" - if unicode(propertymodel.id) in values: - val = values[unicode(propertymodel.id)] + val = "" + if str(propertymodel.id) in values: + val = values[str(propertymodel.id)] self.setProperty(propertymodel, val) def get_key(self, key): @@ -740,7 +741,7 @@ class GeographicItem(models.Model): dct = {} # get all property even the one not displayed for pm in PropertyModel.objects.all(): - dct[pm.slug] = unicode(self.getProperty(pm)) + dct[pm.slug] = str(self.getProperty(pm)) return dct def calculate_weight(self, formula): @@ -811,20 +812,20 @@ class Marker(GeographicItem): '''Marker for a POI ''' ref_item = models.ForeignKey( - "Marker", blank=True, null=True, verbose_name=_(u"Reference marker"), + "Marker", blank=True, null=True, verbose_name=_("Reference marker"), related_name='submited_marker') - point = PointField(_(u"Localisation"), + point = PointField(_("Localisation"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) - available_date = models.DateTimeField(_(u"Available Date"), blank=True, + available_date = models.DateTimeField(_("Available Date"), blank=True, null=True) # used by feeds - description = models.TextField(_(u"Description"), blank=True, null=True) - is_front_page = models.NullBooleanField(_(u"Is front page"), blank=True, + description = models.TextField(_("Description"), blank=True, null=True) + is_front_page = models.NullBooleanField(_("Is front page"), blank=True, null=True) objects = models.GeoManager() class Meta: ordering = ('status', 'name') - verbose_name = _(u"Point of interest") + verbose_name = _("Point of interest") @property def multimedia_items(self): @@ -885,8 +886,8 @@ class Marker(GeographicItem): '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) + 'icon_path': str(cat.icon.image), + 'icon_hover_path': str(cat.hover_icon.image) if cat.hover_icon else '', 'icon_offset_x': cat.icon.offset_x, 'icon_offset_y': cat.icon.offset_y, @@ -925,8 +926,8 @@ class Marker(GeographicItem): except SubCategory.DoesNotExist: continue cats[item['categories__pk']] = { - 'icon_path': unicode(cat.icon.image), - 'icon_hover_path': unicode(cat.hover_icon.image) + 'icon_path': str(cat.icon.image), + 'icon_hover_path': str(cat.hover_icon.image) if cat.hover_icon else '', 'icon_offset_x': cat.icon.offset_x, 'icon_offset_y': cat.icon.offset_y, @@ -1036,26 +1037,26 @@ class Polygon(GeographicItem): '''Polygon on the map ''' ref_item = models.ForeignKey( - "Polygon", blank=True, null=True, verbose_name=_(u"Reference polygon"), + "Polygon", blank=True, null=True, verbose_name=_("Reference polygon"), related_name='submited_polygon') polygon = PolygonField( - _(u"Polygon"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) + _("Polygon"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) picture = models.ImageField( - _(u"Image"), upload_to='upload', blank=True, null=True, + _("Image"), upload_to='upload', blank=True, null=True, height_field='height', width_field='width') - height = models.IntegerField(_(u"Height"), blank=True, null=True) - width = models.IntegerField(_(u"Width"), blank=True, null=True) + height = models.IntegerField(_("Height"), blank=True, null=True) + width = models.IntegerField(_("Width"), blank=True, null=True) color = models.CharField( - _(u"Color"), max_length=200, help_text=_(u"HTML code/name"), + _("Color"), max_length=200, help_text=_("HTML code/name"), blank=True, null=True) inner_color = models.CharField( - _(u"Inner color"), max_length=200, - help_text=_(u"HTML code/name"), blank=True, null=True) + _("Inner color"), max_length=200, + help_text=_("HTML code/name"), blank=True, null=True) objects = models.GeoManager() class Meta: ordering = ('status', 'name') - verbose_name = _(u"Polygon") + verbose_name = _("Polygon") @property def geom_attr(self): @@ -1142,7 +1143,7 @@ class AggregatedPolygon(models.Model): ''' polygon = models.MultiPolygonField() subcategory = models.ForeignKey(SubCategory) - status = models.CharField(_(u"Status"), max_length=1, choices=STATUS) + status = models.CharField(_("Status"), max_length=1, choices=STATUS) class Meta: managed = False @@ -1180,28 +1181,28 @@ class AggregatedPolygon(models.Model): 'color': color, 'inner_color': inner_color, 'key': "aggpoly-{}".format(self.pk), - "pk": self.id, "name": u'Aggregated polygon'}} + "pk": self.id, "name": 'Aggregated polygon'}} return json.dumps(attributes) class MultimediaType(models.Model): - MEDIA_TYPES = (('A', _(u"Audio")), - ('V', _(u"Video")), - ('I', _(u"Image")), - ('O', _(u"Other")),) - media_type = models.CharField(_(u"Media type"), max_length=1, + MEDIA_TYPES = (('A', _("Audio")), + ('V', _("Video")), + ('I', _("Image")), + ('O', _("Other")),) + media_type = models.CharField(_("Media type"), max_length=1, choices=MEDIA_TYPES) - name = models.CharField(_(u"Name"), max_length=150) - mime_type = models.CharField(_(u"Mime type"), max_length=50, blank=True, + name = models.CharField(_("Name"), max_length=150) + mime_type = models.CharField(_("Mime type"), max_length=50, blank=True, null=True) - iframe = models.BooleanField(_(u"Inside an iframe"), default=False) - available = models.BooleanField(_(u"Available"), default=True) + iframe = models.BooleanField(_("Inside an iframe"), default=False) + available = models.BooleanField(_("Available"), default=True) class Meta: - verbose_name = _(u"Multimedia type") - verbose_name_plural = _(u"Multimedia types") + verbose_name = _("Multimedia type") + verbose_name_plural = _("Multimedia types") - def __unicode__(self): + def __str__(self): return self.name @classmethod @@ -1236,26 +1237,26 @@ IFRAME_LINKS = { class MultimediaExtension(models.Model): - name = models.CharField(_(u"Extension name"), max_length=6) + name = models.CharField(_("Extension name"), max_length=6) multimedia_type = models.ForeignKey( - MultimediaType, verbose_name=_(u"Associated multimedia type"), + MultimediaType, verbose_name=_("Associated multimedia type"), related_name='extensions') class Meta: - verbose_name = _(u"Multimedia extension") - verbose_name_plural = _(u"Multimedia extensions") + verbose_name = _("Multimedia extension") + verbose_name_plural = _("Multimedia extensions") - def __unicode__(self): + def __str__(self): return self.name class MultimediaFile(models.Model): - name = models.CharField(_(u"Name"), max_length=150) - url = models.URLField(_(u"Url"), max_length=200) - order = models.IntegerField(_(u"Order"), default=1) + name = models.CharField(_("Name"), max_length=150) + url = models.URLField(_("Url"), max_length=200) + order = models.IntegerField(_("Order"), default=1) multimedia_type = models.ForeignKey(MultimediaType, blank=True, null=True) miniature = models.BooleanField( - _(u"Display inside the description?"), + _("Display inside the description?"), default=settings.CHIMERE_MINIATURE_BY_DEFAULT) marker = models.ForeignKey(Marker, related_name='multimedia_files', blank=True, null=True) @@ -1265,11 +1266,11 @@ class MultimediaFile(models.Model): blank=True, null=True) class Meta: - verbose_name = _(u"Multimedia file") - verbose_name_plural = _(u"Multimedia files") + verbose_name = _("Multimedia file") + verbose_name_plural = _("Multimedia files") - def __unicode__(self): - return self.name or u"" + def __str__(self): + return self.name or "" def multimediafile_post_save(sender, **kwargs): @@ -1320,22 +1321,22 @@ post_save.connect(multimediafile_post_save, sender=MultimediaFile) class PictureFile(models.Model): - name = models.CharField(_(u"Name"), max_length=150) - picture = models.ImageField(_(u"Image"), upload_to='pictures', + name = models.CharField(_("Name"), max_length=150) + picture = models.ImageField(_("Image"), upload_to='pictures', height_field='height', width_field='width') - height = models.IntegerField(_(u"Height"), blank=True, null=True) - width = models.IntegerField(_(u"Width"), blank=True, null=True) + height = models.IntegerField(_("Height"), blank=True, null=True) + width = models.IntegerField(_("Width"), blank=True, null=True) miniature = models.BooleanField( - _(u"Display inside the description?"), + _("Display inside the description?"), default=settings.CHIMERE_MINIATURE_BY_DEFAULT) thumbnailfile = models.ImageField( - _(u"Thumbnail"), upload_to='pictures', blank=True, null=True, + _("Thumbnail"), upload_to='pictures', blank=True, null=True, height_field='thumbnailfile_height', width_field='thumbnailfile_width') - thumbnailfile_height = models.IntegerField(_(u"Thumbnail height"), + thumbnailfile_height = models.IntegerField(_("Thumbnail height"), blank=True, null=True) - thumbnailfile_width = models.IntegerField(_(u"Thumbnail width"), + thumbnailfile_width = models.IntegerField(_("Thumbnail width"), blank=True, null=True) - order = models.IntegerField(_(u"Order"), default=1) + order = models.IntegerField(_("Order"), default=1) marker = models.ForeignKey(Marker, related_name='pictures', blank=True, null=True) route = models.ForeignKey('Route', related_name='pictures', @@ -1343,12 +1344,12 @@ class PictureFile(models.Model): polygon = models.ForeignKey(Polygon, related_name='pictures', blank=True, null=True) - def __unicode__(self): - return self.name or u"" + def __str__(self): + return self.name or "" class Meta: - verbose_name = _(u"Picture file") - verbose_name_plural = _(u"Picture files") + verbose_name = _("Picture file") + verbose_name_plural = _("Picture files") def scale_image(max_x, pair): @@ -1363,8 +1364,6 @@ IMAGE_EXIF_ORIENTATION_MAP = { 6: 4, } -PYEXIV2_OLD_API = not hasattr(pyexiv2, 'ImageMetadata') - def picturefile_post_save(sender, **kwargs): if not kwargs['instance']: @@ -1374,23 +1373,14 @@ def picturefile_post_save(sender, **kwargs): if kwargs['created']: filename = picturefile.picture.path metadata, orientation = None, None - if PYEXIV2_OLD_API: - metadata = pyexiv2.Image(filename) - metadata.readMetadata() - orientation = metadata['Exif.Image.Orientation'] \ - if 'Exif.Image.Orientation' in metadata.exifKeys() else None - else: - metadata = pyexiv2.ImageMetadata(filename) - metadata.read() - orientation = metadata['Exif.Image.Orientation'].value \ - if 'Exif.Image.Orientation' in metadata else None + metadata = pyexiv2.ImageMetadata(filename) + metadata.read() + orientation = metadata['Exif.Image.Orientation'].value \ + if 'Exif.Image.Orientation' in metadata else None if orientation and orientation in IMAGE_EXIF_ORIENTATION_MAP \ and orientation > 1: metadata['Exif.Image.Orientation'] = 1 - if PYEXIV2_OLD_API: - metadata.writeMetadata() - else: - metadata.write() + metadata.write() im = Image.open(filename) im = im.transpose(IMAGE_EXIF_ORIENTATION_MAP[orientation]) im.save(filename) @@ -1444,20 +1434,20 @@ post_save.connect(picturefile_post_save, sender=PictureFile) class RouteFile(models.Model): - name = models.CharField(_(u"Name"), max_length=150) - raw_file = models.FileField(_(u"Raw file (gpx or kml)"), + name = models.CharField(_("Name"), max_length=150) + raw_file = models.FileField(_("Raw file (gpx or kml)"), upload_to='route_files') simplified_file = models.FileField( - _(u"Simplified file"), upload_to='route_files', blank=True, null=True) - TYPE = (('K', _(u'KML')), ('G', _(u'GPX'))) + _("Simplified file"), upload_to='route_files', blank=True, null=True) + TYPE = (('K', _('KML')), ('G', _('GPX'))) file_type = models.CharField(max_length=1, choices=TYPE) class Meta: ordering = ('name',) - verbose_name = _(u"Route file") - verbose_name_plural = _(u"Route files") + verbose_name = _("Route file") + verbose_name_plural = _("Route files") - def __unicode__(self): + def __str__(self): return self.name def process(self): @@ -1476,7 +1466,7 @@ class RouteFile(models.Model): p = Popen(cli_args, stderr=PIPE) p.wait() if p.returncode: - print p.stderr.read() + print(p.stderr.read()) # logger.error(p.stderr.read()) else: self.simplified_file = File(open(output_name)) @@ -1495,34 +1485,34 @@ class RouteFile(models.Model): if not pt.tag.endswith('trkpt'): continue pts.append((pt.get("lon"), pt.get("lat"))) - wkt_tpl = u'LINESTRING(%s)' - return wkt_tpl % u','.join([u'%s %s' % (pt[0], pt[1]) - for pt in pts]) + wkt_tpl = 'LINESTRING(%s)' + return wkt_tpl % ','.join(['%s %s' % (pt[0], pt[1]) + for pt in pts]) class Route(GeographicItem): '''Route on the map ''' ref_item = models.ForeignKey( - "Route", blank=True, null=True, verbose_name=_(u"Reference route"), + "Route", blank=True, null=True, verbose_name=_("Reference route"), related_name='submited_route') - route = RouteField(_(u"Route"), + route = RouteField(_("Route"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) associated_file = models.ForeignKey(RouteFile, blank=True, null=True, - verbose_name=_(u"Associated file")) + verbose_name=_("Associated file")) picture = models.ImageField( - _(u"Image"), upload_to='upload', blank=True, null=True, + _("Image"), upload_to='upload', blank=True, null=True, height_field='height', width_field='width') - height = models.IntegerField(_(u"Height"), blank=True, null=True) - width = models.IntegerField(_(u"Width"), blank=True, null=True) + height = models.IntegerField(_("Height"), blank=True, null=True) + width = models.IntegerField(_("Width"), blank=True, null=True) color = models.CharField( - _(u"Color"), max_length=200, help_text=_(u"HTML code/name"), + _("Color"), max_length=200, help_text=_("HTML code/name"), blank=True, null=True) objects = models.GeoManager() class Meta: ordering = ('status', 'name') - verbose_name = _(u"Route") + verbose_name = _("Route") @property def geom_attr(self): @@ -1632,7 +1622,7 @@ class AggregatedRoute(models.Model): ''' route = models.MultiLineStringField() subcategory = models.ForeignKey(SubCategory) - status = models.CharField(_(u"Status"), max_length=1, choices=STATUS) + status = models.CharField(_("Status"), max_length=1, choices=STATUS) class Meta: managed = False @@ -1651,7 +1641,7 @@ class AggregatedRoute(models.Model): 'color': color, 'geometry': geom, 'type': "Feature", "properties": { 'key': "aggroute-{}".format(self.pk), - "pk": self.id, "name": u'Aggregated route'}} + "pk": self.id, "name": 'Aggregated route'}} return json.dumps(attributes) @@ -1667,14 +1657,17 @@ class SimpleArea: """ Rectangular area of a map (not in the database) """ - def __init__(self, area): + def __init__(self, area=None): """ - Defining upper left corner ans lower right corner from a tuple + Defining upper left corner and lower right corner from a tuple """ + if not area: + return super(SimpleArea, self).__init__() assert len(area) == 4 x1, y1, x2, y2 = area self.upper_left_corner = SimplePoint(x1, y1) self.lower_right_corner = SimplePoint(x2, y2) + return super(SimpleArea, self).__init__() def isIn(self, area): """ @@ -1696,7 +1689,7 @@ class SimpleArea: subcategory_pks = [] for cat, subcats in SubCategory.getAvailable(area_name=area_name): for subcat in subcats: - subcategory_pks.append(unicode(subcat.pk)) + subcategory_pks.append(str(subcat.pk)) if filter_available: wheres += ['subcat.available = TRUE', 'cat.available = TRUE'] wheres += ['subcat.id in (%s)' % ",".join(subcategory_pks)] @@ -1707,8 +1700,8 @@ class SimpleArea: equal_status = "='%s'" % status[0] elif status: equal_status = " in ('%s')" % "','".join(status) - area = u"ST_GeometryFromText('POLYGON((%f %f,%f %f,%f %f,%f %f, %f %f"\ - u"))', %d)" % ( + area = "ST_GeometryFromText('POLYGON((%f %f,%f %f,%f %f,%f %f, %f %f"\ + "))', %d)" % ( self.upper_left_corner.x, self.upper_left_corner.y, self.lower_right_corner.x, self.upper_left_corner.y, self.lower_right_corner.x, self.lower_right_corner.y, @@ -1767,20 +1760,20 @@ class SimpleArea: return subcats def getExtent(self): - return (unicode(self.upper_left_corner.x), - unicode(self.upper_left_corner.y), - unicode(self.lower_right_corner.x), - unicode(self.lower_right_corner.y)) + return (str(self.upper_left_corner.x), + str(self.upper_left_corner.y), + str(self.lower_right_corner.x), + str(self.lower_right_corner.y)) class Layer(models.Model): - name = models.CharField(_(u"Name"), max_length=150) - layer_code = models.TextField(_(u"Layer code")) + name = models.CharField(_("Name"), max_length=150) + layer_code = models.TextField(_("Layer code")) extra_js_code = models.TextField( - _(u"Extra JS code"), blank=True, null=True, default='', - help_text=_(u"This code is loaded before the layer code.")) + _("Extra JS code"), blank=True, null=True, default='', + help_text=_("This code is loaded before the layer code.")) - def __unicode__(self): + def __str__(self): return self.name class Meta: @@ -1790,57 +1783,57 @@ class Layer(models.Model): class Area(models.Model, SimpleArea): """Rectangular area of the map """ - name = models.CharField(_(u"Name"), max_length=150) - urn = models.SlugField(_(u"Area urn"), max_length=50, blank=True, + name = models.CharField(_("Name"), max_length=150) + urn = models.SlugField(_("Area urn"), max_length=50, blank=True, unique=True) - welcome_message = models.TextField(_(u"Welcome message"), blank=True, + welcome_message = models.TextField(_("Welcome message"), blank=True, null=True) - order = models.IntegerField(_(u"Order"), unique=True) - available = models.BooleanField(_(u"Available")) + order = models.IntegerField(_("Order"), unique=True) + available = models.BooleanField(_("Available")) upper_left_corner = models.PointField( - _(u"Upper left corner"), default='POINT(0 0)', + _("Upper left corner"), default='POINT(0 0)', srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) lower_right_corner = models.PointField( - _(u"Lower right corner"), default='POINT(0 0)', + _("Lower right corner"), default='POINT(0 0)', srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) default = models.NullBooleanField( - _(u"Default area"), help_text=_(u"Only one area is set by default")) + _("Default area"), help_text=_("Only one area is set by default")) layers = SelectMultipleField(Layer, related_name='areas', through='AreaLayers', blank=True) default_subcategories = SelectMultipleField( SubCategory, blank=True, - verbose_name=_(u"Sub-categories checked by default")) + verbose_name=_("Sub-categories checked by default")) dynamic_categories = models.NullBooleanField( - _(u"Sub-categories dynamicaly displayed"), - help_text=_(u"If checked, categories are only displayed in the menu " - u"if they are available on the current extent.")) + _("Sub-categories dynamicaly displayed"), + help_text=_("If checked, categories are only displayed in the menu " + "if they are available on the current extent.")) subcategories = SelectMultipleField( SubCategory, related_name='areas', blank=True, db_table='chimere_subcategory_areas', - verbose_name=_(u"Restricted to theses sub-categories"), - help_text=_(u"If no sub-category is set all sub-categories are " - u"available")) + verbose_name=_("Restricted to theses sub-categories"), + help_text=_("If no sub-category is set all sub-categories are " + "available")) display_category_menu = models.BooleanField( - _(u"Display category menu"), default=True, - help_text=_(u"If set to False, category menu will be hide and all " - u"categories will be always displayed.")) - external_css = models.URLField(_(u"Link to an external CSS"), blank=True, + _("Display category menu"), default=True, + help_text=_("If set to False, category menu will be hide and all " + "categories will be always displayed.")) + external_css = models.URLField(_("Link to an external CSS"), blank=True, null=True) - restrict_to_extent = models.BooleanField(_(u"Restrict to the area extent"), + restrict_to_extent = models.BooleanField(_("Restrict to the area extent"), default=False) - allow_point_edition = models.BooleanField(_(u"Allow point edition"), + allow_point_edition = models.BooleanField(_("Allow point edition"), default=True) - allow_route_edition = models.BooleanField(_(u"Allow route edition"), + allow_route_edition = models.BooleanField(_("Allow route edition"), default=True) - allow_polygon_edition = models.BooleanField(_(u"Allow polygon edition"), + allow_polygon_edition = models.BooleanField(_("Allow polygon edition"), default=True) extra_map_def = models.TextField( - _(u"Extra map definition"), blank=True, null=True, - help_text=_(u"Extra javascript script loaded for this area. " - u"Carreful! To prevent breaking the map must be valid.")) + _("Extra map definition"), blank=True, null=True, + help_text=_("Extra javascript script loaded for this area. " + "Carreful! To prevent breaking the map must be valid.")) objects = models.GeoManager() - def __unicode__(self): + def __str__(self): return self.name class Meta: @@ -1984,8 +1977,8 @@ def get_users_by_area(area): class AreaLayers(models.Model): area = models.ForeignKey(Area) layer = models.ForeignKey(Layer) - order = models.IntegerField(_(u"Order")) - default = models.NullBooleanField(_(u"Default layer")) + order = models.IntegerField(_("Order")) + default = models.NullBooleanField(_("Default layer")) class Meta: ordering = ('order',) @@ -1996,21 +1989,20 @@ class AreaLayers(models.Model): class PropertyModel(models.Model): '''Model for a property ''' - name = models.CharField(_(u"Name"), max_length=150) - slug = models.SlugField(_(u"Slug"), blank=True, null=True) - order = models.IntegerField(_(u"Order")) - available = models.BooleanField(_(u"Available")) - mandatory = models.BooleanField(_(u"Mandatory")) + name = models.CharField(_("Name"), max_length=150) + slug = models.SlugField(_("Slug"), blank=True, null=True) + order = models.IntegerField(_("Order")) + available = models.BooleanField(_("Available")) + mandatory = models.BooleanField(_("Mandatory")) subcategories = SelectMultipleField( SubCategory, related_name='properties', - blank=True, verbose_name=_(u"Restricted to theses sub-categories"), - help_text=_(u"If no sub-category is set all the property applies to " - u"all sub-categories")) + blank=True, verbose_name=_("Restricted to theses sub-categories"), + help_text=_("If no sub-category is set all the property applies to " + "all sub-categories")) areas = SelectMultipleField( - 'Area', verbose_name=_(u"Restrict to theses areas"), blank=True, - null=True, - help_text=_(u"If no area is set the property apply to " - u"all areas")) + 'Area', verbose_name=_("Restrict to theses areas"), blank=True, + help_text=_("If no area is set the property apply to " + "all areas")) TYPE = (('T', _('Text')), ('L', _('Long text')), ('P', _('Password')), @@ -2027,13 +2019,13 @@ class PropertyModel(models.Model): 'A': JQueryAutoComplete, 'B': forms.CheckboxInput, } - type = models.CharField(_(u"Type"), max_length=1, choices=TYPE) + type = models.CharField(_("Type"), max_length=1, choices=TYPE) class Meta: ordering = ('order',) verbose_name = _("Property model") - def __unicode__(self): + def __str__(self): return self.name def getAttrName(self): @@ -2064,43 +2056,43 @@ class PropertyModelChoice(models.Model): '''Choices for property model ''' propertymodel = models.ForeignKey(PropertyModel, related_name='choices', - verbose_name=_(u"Property model")) - value = models.CharField(_(u"Value"), max_length=150) - available = models.BooleanField(_(u"Available"), default=True) + verbose_name=_("Property model")) + value = models.CharField(_("Value"), max_length=150) + available = models.BooleanField(_("Available"), default=True) class Meta: - verbose_name = _(u"Model property choice") + verbose_name = _("Model property choice") - def __unicode__(self): - return unicode(self.value) + def __str__(self): + return str(self.value) class Property(models.Model): '''Property for a POI ''' marker = models.ForeignKey( - Marker, verbose_name=_(u"Point of interest"), blank=True, null=True) + Marker, verbose_name=_("Point of interest"), blank=True, null=True) route = models.ForeignKey( - Route, verbose_name=_(u"Route"), blank=True, null=True) + Route, verbose_name=_("Route"), blank=True, null=True) polygon = models.ForeignKey( - Polygon, verbose_name=_(u"Polygon"), blank=True, null=True) + Polygon, verbose_name=_("Polygon"), blank=True, null=True) propertymodel = models.ForeignKey(PropertyModel, - verbose_name=_(u"Property model")) - value = models.TextField(_(u"Value")) + verbose_name=_("Property model")) + value = models.TextField(_("Value")) - def __unicode__(self): + def __str__(self): if self.propertymodel.type == 'C': if not self.value: return '' try: - return unicode(PropertyModelChoice.objects.get( + return str(PropertyModelChoice.objects.get( pk=self.value).value) except (self.DoesNotExist, ValueError): return "" - return unicode(self.value) + return str(self.value) class Meta: - verbose_name = _(u"Property") + verbose_name = _("Property") @property def python_value(self): diff --git a/chimere/old_migrations/v2.9/0001_initial.py b/chimere/old_migrations/v2.9/0001_initial.py new file mode 100644 index 0000000..c98ec01 --- /dev/null +++ b/chimere/old_migrations/v2.9/0001_initial.py @@ -0,0 +1,628 @@ +# -*- 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 model 'News' + db.create_table('chimere_news', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('date', self.gf('django.db.models.fields.DateField')(auto_now_add=True, blank=True)), + ('content', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('chimere', ['News']) + + # Adding M2M table for field areas on 'News' + db.create_table('chimere_news_areas', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('news', models.ForeignKey(orm['chimere.news'], null=False)), + ('area', models.ForeignKey(orm['chimere.area'], null=False)) + )) + db.create_unique('chimere_news_areas', ['news_id', 'area_id']) + + # Adding model 'TinyUrl' + db.create_table('chimere_tinyurl', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('parameters', self.gf('django.db.models.fields.CharField')(max_length=500)), + )) + db.send_create_signal('chimere', ['TinyUrl']) + + # Adding model 'ColorTheme' + db.create_table('chimere_colortheme', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + )) + db.send_create_signal('chimere', ['ColorTheme']) + + # Adding model 'Color' + db.create_table('chimere_color', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('code', self.gf('django.db.models.fields.CharField')(max_length=6)), + ('order', self.gf('django.db.models.fields.IntegerField')()), + ('color_theme', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.ColorTheme'])), + )) + db.send_create_signal('chimere', ['Color']) + + # Adding model 'Category' + db.create_table('chimere_category', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('order', self.gf('django.db.models.fields.IntegerField')()), + ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + )) + db.send_create_signal('chimere', ['Category']) + + # Adding model 'Icon' + db.create_table('chimere_icon', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), + ('height', self.gf('django.db.models.fields.IntegerField')()), + ('width', self.gf('django.db.models.fields.IntegerField')()), + )) + db.send_create_signal('chimere', ['Icon']) + + # Adding model 'SubCategory' + db.create_table('chimere_subcategory', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('category', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subcategories', to=orm['chimere.Category'])), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('submission', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('icon', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Icon'])), + ('color_theme', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.ColorTheme'], null=True, blank=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=1000)), + ('item_type', self.gf('django.db.models.fields.CharField')(max_length=1)), + )) + db.send_create_signal('chimere', ['SubCategory']) + + # Adding model 'Importer' + db.create_table('chimere_importer', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('importer_type', self.gf('django.db.models.fields.CharField')(max_length=4)), + ('filtr', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('source_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)), + ('default_name', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('srid', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('zipped', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('overwrite', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('get_description', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('default_description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('state', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('associate_marker_to_way', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('chimere', ['Importer']) + + # Adding M2M table for field categories on 'Importer' + db.create_table('chimere_importer_categories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('importer', models.ForeignKey(orm['chimere.importer'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_importer_categories', ['importer_id', 'subcategory_id']) + + # Adding model 'Marker' + db.create_table('chimere_marker', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), + ('submiter_name', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), + ('submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)), + ('submiter_comment', self.gf('django.db.models.fields.TextField')(max_length=200, null=True, blank=True)), + ('status', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('import_key', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('import_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('import_source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('modified_since_import', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('not_for_osm', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), + ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), + ('ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_marker', null=True, to=orm['chimere.Marker'])), + ('point', self.gf('chimere.widgets.PointField')()), + ('available_date', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('route', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='associated_marker', null=True, to=orm['chimere.Route'])), + ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + )) + db.send_create_signal('chimere', ['Marker']) + + # Adding M2M table for field categories on 'Marker' + db.create_table('chimere_marker_categories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('marker', models.ForeignKey(orm['chimere.marker'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_marker_categories', ['marker_id', 'subcategory_id']) + + # Adding model 'MultimediaType' + db.create_table('chimere_multimediatype', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('media_type', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)), + ('iframe', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal('chimere', ['MultimediaType']) + + # Adding model 'MultimediaExtension' + db.create_table('chimere_multimediaextension', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=6)), + ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='extensions', to=orm['chimere.MultimediaType'])), + )) + db.send_create_signal('chimere', ['MultimediaExtension']) + + # Adding model 'MultimediaFile' + db.create_table('chimere_multimediafile', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('url', self.gf('django.db.models.fields.URLField')(max_length=200)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.MultimediaType'], null=True, blank=True)), + ('miniature', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('marker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='multimedia_files', to=orm['chimere.Marker'])), + )) + db.send_create_signal('chimere', ['MultimediaFile']) + + # Adding model 'PictureFile' + db.create_table('chimere_picturefile', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('picture', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), + ('height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('miniature', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('thumbnailfile', self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True)), + ('thumbnailfile_height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('thumbnailfile_width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('marker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='pictures', to=orm['chimere.Marker'])), + )) + db.send_create_signal('chimere', ['PictureFile']) + + # Adding model 'RouteFile' + db.create_table('chimere_routefile', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('raw_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)), + ('simplified_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)), + ('file_type', self.gf('django.db.models.fields.CharField')(max_length=1)), + )) + db.send_create_signal('chimere', ['RouteFile']) + + # Adding model 'Route' + db.create_table('chimere_route', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('submiter_session_key', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), + ('submiter_name', self.gf('django.db.models.fields.CharField')(max_length=40, null=True, blank=True)), + ('submiter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)), + ('submiter_comment', self.gf('django.db.models.fields.TextField')(max_length=200, null=True, blank=True)), + ('status', self.gf('django.db.models.fields.CharField')(max_length=1)), + ('import_key', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('import_version', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('import_source', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), + ('modified_since_import', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('not_for_osm', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('origin', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('license', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), + ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), + ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)), + ('ref_item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='submited_route', null=True, to=orm['chimere.Route'])), + ('route', self.gf('chimere.widgets.RouteField')()), + ('associated_file', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.RouteFile'], null=True, blank=True)), + ('picture', self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True)), + ('height', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('width', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('has_associated_marker', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal('chimere', ['Route']) + + # Adding M2M table for field categories on 'Route' + db.create_table('chimere_route_categories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['chimere.route'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_route_categories', ['route_id', 'subcategory_id']) + + # Adding model 'Layer' + db.create_table('chimere_layer', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('layer_code', self.gf('django.db.models.fields.TextField')(max_length=300)), + )) + db.send_create_signal('chimere', ['Layer']) + + # Adding model 'Area' + db.create_table('chimere_area', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('urn', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50, blank=True)), + ('welcome_message', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(unique=True)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('upper_left_corner', self.gf('django.contrib.gis.db.models.fields.PointField')(default='POINT(0 0)')), + ('lower_right_corner', self.gf('django.contrib.gis.db.models.fields.PointField')(default='POINT(0 0)')), + ('default', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), + ('dynamic_categories', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), + ('external_css', self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True)), + ('restrict_to_extent', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('chimere', ['Area']) + + # Adding M2M table for field default_subcategories on 'Area' + db.create_table('chimere_area_default_subcategories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('area', models.ForeignKey(orm['chimere.area'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_area_default_subcategories', ['area_id', 'subcategory_id']) + + # Adding M2M table for field subcategories on 'Area' + db.create_table('chimere_subcategory_areas', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('area', models.ForeignKey(orm['chimere.area'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_subcategory_areas', ['area_id', 'subcategory_id']) + + # Adding model 'AreaLayers' + db.create_table('chimere_arealayers', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('area', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Area'])), + ('layer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Layer'])), + ('order', self.gf('django.db.models.fields.IntegerField')()), + ('default', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)), + )) + db.send_create_signal('chimere', ['AreaLayers']) + + # Adding model 'PropertyModel' + db.create_table('chimere_propertymodel', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('order', self.gf('django.db.models.fields.IntegerField')()), + ('available', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('mandatory', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('type', self.gf('django.db.models.fields.CharField')(max_length=1)), + )) + db.send_create_signal('chimere', ['PropertyModel']) + + # Adding M2M table for field subcategories on 'PropertyModel' + db.create_table('chimere_propertymodel_subcategories', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('propertymodel', models.ForeignKey(orm['chimere.propertymodel'], null=False)), + ('subcategory', models.ForeignKey(orm['chimere.subcategory'], null=False)) + )) + db.create_unique('chimere_propertymodel_subcategories', ['propertymodel_id', 'subcategory_id']) + + # Adding model 'Property' + db.create_table('chimere_property', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('marker', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.Marker'])), + ('propertymodel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.PropertyModel'])), + ('value', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('chimere', ['Property']) + + + def backwards(self, orm): + # Deleting model 'News' + db.delete_table('chimere_news') + + # Removing M2M table for field areas on 'News' + db.delete_table('chimere_news_areas') + + # Deleting model 'TinyUrl' + db.delete_table('chimere_tinyurl') + + # Deleting model 'ColorTheme' + db.delete_table('chimere_colortheme') + + # Deleting model 'Color' + db.delete_table('chimere_color') + + # Deleting model 'Category' + db.delete_table('chimere_category') + + # Deleting model 'Icon' + db.delete_table('chimere_icon') + + # Deleting model 'SubCategory' + db.delete_table('chimere_subcategory') + + # Deleting model 'Importer' + db.delete_table('chimere_importer') + + # Removing M2M table for field categories on 'Importer' + db.delete_table('chimere_importer_categories') + + # Deleting model 'Marker' + db.delete_table('chimere_marker') + + # Removing M2M table for field categories on 'Marker' + db.delete_table('chimere_marker_categories') + + # Deleting model 'MultimediaType' + db.delete_table('chimere_multimediatype') + + # Deleting model 'MultimediaExtension' + db.delete_table('chimere_multimediaextension') + + # Deleting model 'MultimediaFile' + db.delete_table('chimere_multimediafile') + + # Deleting model 'PictureFile' + db.delete_table('chimere_picturefile') + + # Deleting model 'RouteFile' + db.delete_table('chimere_routefile') + + # Deleting model 'Route' + db.delete_table('chimere_route') + + # Removing M2M table for field categories on 'Route' + db.delete_table('chimere_route_categories') + + # Deleting model 'Layer' + db.delete_table('chimere_layer') + + # Deleting model 'Area' + db.delete_table('chimere_area') + + # Removing M2M table for field default_subcategories on 'Area' + db.delete_table('chimere_area_default_subcategories') + + # Removing M2M table for field subcategories on 'Area' + db.delete_table('chimere_subcategory_areas') + + # Deleting model 'AreaLayers' + db.delete_table('chimere_arealayers') + + # Deleting model 'PropertyModel' + db.delete_table('chimere_propertymodel') + + # Removing M2M table for field subcategories on 'PropertyModel' + db.delete_table('chimere_propertymodel_subcategories') + + # Deleting model 'Property' + db.delete_table('chimere_property') + + + models = { + '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': '6'}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.colortheme': { + 'Meta': {'object_name': 'ColorTheme'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.icon': { + 'Meta': {'object_name': 'Icon'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.importer': { + 'Meta': {'object_name': 'Importer'}, + 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'default_description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'filtr': ('django.db.models.fields.CharField', [], {'max_length': '200', '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': '100', 'null': 'True', 'blank': 'True'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), + 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + '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'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.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': {'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', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.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.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.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}, + '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'}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py b/chimere/old_migrations/v2.9/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py index e9dd34c..e9dd34c 100644 --- a/chimere/migrations/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py +++ b/chimere/old_migrations/v2.9/0002_auto__add_propertymodelchoice__add_page__add_field_subcategory_dated__.py diff --git a/chimere/migrations/0003_create_aggregate_route_view.py b/chimere/old_migrations/v2.9/0003_create_aggregate_route_view.py index ca32eb6..ca32eb6 100644 --- a/chimere/migrations/0003_create_aggregate_route_view.py +++ b/chimere/old_migrations/v2.9/0003_create_aggregate_route_view.py diff --git a/chimere/migrations/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py b/chimere/old_migrations/v2.9/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py index 85ef566..85ef566 100644 --- a/chimere/migrations/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py +++ b/chimere/old_migrations/v2.9/0004_auto__add_field_importer_source_file_alt__add_field_importer_default_l.py diff --git a/chimere/migrations/0005_auto__add_field_importer_automatic_update.py b/chimere/old_migrations/v2.9/0005_auto__add_field_importer_automatic_update.py index d7d25db..d7d25db 100644 --- a/chimere/migrations/0005_auto__add_field_importer_automatic_update.py +++ b/chimere/old_migrations/v2.9/0005_auto__add_field_importer_automatic_update.py diff --git a/chimere/migrations/0006_auto__chg_field_news_date.py b/chimere/old_migrations/v2.9/0006_auto__chg_field_news_date.py index 232668e..232668e 100644 --- a/chimere/migrations/0006_auto__chg_field_news_date.py +++ b/chimere/old_migrations/v2.9/0006_auto__chg_field_news_date.py diff --git a/chimere/migrations/0007_auto__add_importerkeycategories.py b/chimere/old_migrations/v2.9/0007_auto__add_importerkeycategories.py index 8a9e657..8a9e657 100644 --- a/chimere/migrations/0007_auto__add_importerkeycategories.py +++ b/chimere/old_migrations/v2.9/0007_auto__add_importerkeycategories.py diff --git a/chimere/migrations/0008_auto__chg_field_importer_state.py b/chimere/old_migrations/v2.9/0008_auto__chg_field_importer_state.py index 40f8612..40f8612 100644 --- a/chimere/migrations/0008_auto__chg_field_importer_state.py +++ b/chimere/old_migrations/v2.9/0008_auto__chg_field_importer_state.py diff --git a/chimere/migrations/0009_auto__add_field_marker_keywords__add_field_route_keywords.py b/chimere/old_migrations/v2.9/0009_auto__add_field_marker_keywords__add_field_route_keywords.py index daeb1be..daeb1be 100644 --- a/chimere/migrations/0009_auto__add_field_marker_keywords__add_field_route_keywords.py +++ b/chimere/old_migrations/v2.9/0009_auto__add_field_marker_keywords__add_field_route_keywords.py diff --git a/chimere/migrations/0010_auto__add_field_subcategory_keywords.py b/chimere/old_migrations/v2.9/0010_auto__add_field_subcategory_keywords.py index 3a05ac7..3a05ac7 100644 --- a/chimere/migrations/0010_auto__add_field_subcategory_keywords.py +++ b/chimere/old_migrations/v2.9/0010_auto__add_field_subcategory_keywords.py diff --git a/chimere/migrations/0011_auto__add_field_importer_default_status.py b/chimere/old_migrations/v2.9/0011_auto__add_field_importer_default_status.py index bb36e42..bb36e42 100644 --- a/chimere/migrations/0011_auto__add_field_importer_default_status.py +++ b/chimere/old_migrations/v2.9/0011_auto__add_field_importer_default_status.py diff --git a/chimere/migrations/0012_auto__chg_field_importer_filtr.py b/chimere/old_migrations/v2.9/0012_auto__chg_field_importer_filtr.py index 84e4c72..84e4c72 100644 --- a/chimere/migrations/0012_auto__chg_field_importer_filtr.py +++ b/chimere/old_migrations/v2.9/0012_auto__chg_field_importer_filtr.py diff --git a/chimere/migrations/0013_auto__chg_field_importer_origin__chg_field_importer_license.py b/chimere/old_migrations/v2.9/0013_auto__chg_field_importer_origin__chg_field_importer_license.py index cd91ae9..cd91ae9 100644 --- a/chimere/migrations/0013_auto__chg_field_importer_origin__chg_field_importer_license.py +++ b/chimere/old_migrations/v2.9/0013_auto__chg_field_importer_origin__chg_field_importer_license.py diff --git a/chimere/migrations/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py b/chimere/old_migrations/v2.9/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py index 4e31972..4e31972 100644 --- a/chimere/migrations/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py +++ b/chimere/old_migrations/v2.9/0014_auto__chg_field_marker_origin__chg_field_marker_license__chg_field_rou.py diff --git a/chimere/migrations/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py b/chimere/old_migrations/v2.9/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py index 8e8e794..8e8e794 100644 --- a/chimere/migrations/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py +++ b/chimere/old_migrations/v2.9/0015_auto__add_field_icon_offset_x__add_field_icon_offset_y.py diff --git a/chimere/migrations/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py b/chimere/old_migrations/v2.9/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py index 0374cfc..0374cfc 100644 --- a/chimere/migrations/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py +++ b/chimere/old_migrations/v2.9/0016_auto__add_field_icon_popup_offset_x__add_field_icon_popup_offset_y.py diff --git a/chimere/migrations/0017_auto__add_subcategoryuserlimit.py b/chimere/old_migrations/v2.9/0017_auto__add_subcategoryuserlimit.py index 9ae257c..9ae257c 100644 --- a/chimere/migrations/0017_auto__add_subcategoryuserlimit.py +++ b/chimere/old_migrations/v2.9/0017_auto__add_subcategoryuserlimit.py diff --git a/chimere/migrations/0018_auto__add_polygon.py b/chimere/old_migrations/v2.9/0018_auto__add_polygon.py index 7fed4f0..7fed4f0 100644 --- a/chimere/migrations/0018_auto__add_polygon.py +++ b/chimere/old_migrations/v2.9/0018_auto__add_polygon.py diff --git a/chimere/migrations/0018_auto__add_polygon.py.sans_poly b/chimere/old_migrations/v2.9/0018_auto__add_polygon.py.sans_poly index 2ef7ba1..2ef7ba1 100644 --- a/chimere/migrations/0018_auto__add_polygon.py.sans_poly +++ b/chimere/old_migrations/v2.9/0018_auto__add_polygon.py.sans_poly diff --git a/chimere/migrations/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py b/chimere/old_migrations/v2.9/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py index 67156d7..67156d7 100644 --- a/chimere/migrations/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py +++ b/chimere/old_migrations/v2.9/0019_auto__chg_field_marker_name__chg_field_polygon_name__chg_field_route_n.py diff --git a/chimere/migrations/0020_auto__add_unique_tinyurl_parameters.py b/chimere/old_migrations/v2.9/0020_auto__add_unique_tinyurl_parameters.py index 3c2d65a..3c2d65a 100644 --- a/chimere/migrations/0020_auto__add_unique_tinyurl_parameters.py +++ b/chimere/old_migrations/v2.9/0020_auto__add_unique_tinyurl_parameters.py diff --git a/chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py b/chimere/old_migrations/v2.9/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py index afc59fc..afc59fc 100644 --- a/chimere/migrations/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py +++ b/chimere/old_migrations/v2.9/0021_auto__add_field_polygon_color__add_field_polygon_inner_color__add_fiel.py diff --git a/chimere/migrations/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py b/chimere/old_migrations/v2.9/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py index 66fc6bb..66fc6bb 100644 --- a/chimere/migrations/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py +++ b/chimere/old_migrations/v2.9/0022_auto__chg_field_polygon_color__chg_field_polygon_inner_color__chg_fiel.py diff --git a/chimere/migrations/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py b/chimere/old_migrations/v2.9/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py index 7446f0c..7446f0c 100644 --- a/chimere/migrations/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py +++ b/chimere/old_migrations/v2.9/0023_auto__add_field_area_allow_point_edition__add_field_area_allow_route_e.py diff --git a/chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py b/chimere/old_migrations/v2.9/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py index 7a83c9e..7a83c9e 100644 --- a/chimere/migrations/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py +++ b/chimere/old_migrations/v2.9/0024_auto__add_field_picturefile_polygon__chg_field_picturefile_marker__add.py diff --git a/chimere/migrations/0025_auto__add_field_area_display_category_menu.py b/chimere/old_migrations/v2.9/0025_auto__add_field_area_display_category_menu.py index 6126fca..6126fca 100644 --- a/chimere/migrations/0025_auto__add_field_area_display_category_menu.py +++ b/chimere/old_migrations/v2.9/0025_auto__add_field_area_display_category_menu.py diff --git a/chimere/migrations/0026_auto__add_field_propertymodel_slug.py b/chimere/old_migrations/v2.9/0026_auto__add_field_propertymodel_slug.py index b20e5cb..b20e5cb 100644 --- a/chimere/migrations/0026_auto__add_field_propertymodel_slug.py +++ b/chimere/old_migrations/v2.9/0026_auto__add_field_propertymodel_slug.py diff --git a/chimere/migrations/0027_auto__add_field_property_polygon__chg_field_property_marker.py b/chimere/old_migrations/v2.9/0027_auto__add_field_property_polygon__chg_field_property_marker.py index 59d8983..59d8983 100644 --- a/chimere/migrations/0027_auto__add_field_property_polygon__chg_field_property_marker.py +++ b/chimere/old_migrations/v2.9/0027_auto__add_field_property_polygon__chg_field_property_marker.py diff --git a/chimere/migrations/0028_auto__add_field_area_extra_map_def.py b/chimere/old_migrations/v2.9/0028_auto__add_field_area_extra_map_def.py index 64a5ae7..64a5ae7 100644 --- a/chimere/migrations/0028_auto__add_field_area_extra_map_def.py +++ b/chimere/old_migrations/v2.9/0028_auto__add_field_area_extra_map_def.py diff --git a/chimere/migrations/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py b/chimere/old_migrations/v2.9/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py index 36c48fc..36c48fc 100644 --- a/chimere/migrations/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py +++ b/chimere/old_migrations/v2.9/0029_auto__add_field_layer_extra_js_code__chg_field_layer_layer_code.py diff --git a/chimere/migrations/0030_auto.py b/chimere/old_migrations/v2.9/0030_auto.py index 19291e8..19291e8 100644 --- a/chimere/migrations/0030_auto.py +++ b/chimere/old_migrations/v2.9/0030_auto.py diff --git a/chimere/migrations/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py b/chimere/old_migrations/v2.9/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py index 39e21ce..39e21ce 100644 --- a/chimere/migrations/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py +++ b/chimere/old_migrations/v2.9/0031_auto__add_field_marker_weight__add_field_marker_normalised_weight__add.py diff --git a/chimere/migrations/0032_create_aggregate_polygon_view.py b/chimere/old_migrations/v2.9/0032_create_aggregate_polygon_view.py index 51eacd5..51eacd5 100644 --- a/chimere/migrations/0032_create_aggregate_polygon_view.py +++ b/chimere/old_migrations/v2.9/0032_create_aggregate_polygon_view.py diff --git a/chimere/migrations/0033_auto__add_field_color_inner_code.py b/chimere/old_migrations/v2.9/0033_auto__add_field_color_inner_code.py index bc7748b..bc7748b 100644 --- a/chimere/migrations/0033_auto__add_field_color_inner_code.py +++ b/chimere/old_migrations/v2.9/0033_auto__add_field_color_inner_code.py diff --git a/chimere/migrations/0034_auto__add_field_subcategory_min_zoom.py b/chimere/old_migrations/v2.9/0034_auto__add_field_subcategory_min_zoom.py index 97ab39b..97ab39b 100644 --- a/chimere/migrations/0034_auto__add_field_subcategory_min_zoom.py +++ b/chimere/old_migrations/v2.9/0034_auto__add_field_subcategory_min_zoom.py diff --git a/chimere/migrations/0035_auto__add_field_subcategory_simplify_tolerance.py b/chimere/old_migrations/v2.9/0035_auto__add_field_subcategory_simplify_tolerance.py index 69f1ff2..69f1ff2 100644 --- a/chimere/migrations/0035_auto__add_field_subcategory_simplify_tolerance.py +++ b/chimere/old_migrations/v2.9/0035_auto__add_field_subcategory_simplify_tolerance.py diff --git a/chimere/migrations/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py b/chimere/old_migrations/v2.9/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py index 27b59d9..27b59d9 100644 --- a/chimere/migrations/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py +++ b/chimere/old_migrations/v2.9/0036_auto__add_field_picturefile_route__add_field_multimediafile_route.py diff --git a/chimere/migrations/0037_recopy_marker_to_route.py b/chimere/old_migrations/v2.9/0037_recopy_marker_to_route.py index 82dbc9d..8d2c8b0 100644 --- a/chimere/migrations/0037_recopy_marker_to_route.py +++ b/chimere/old_migrations/v2.9/0037_recopy_marker_to_route.py @@ -18,8 +18,8 @@ class Migration(SchemaMigration): val = getattr(m, attr) if getattr(route, attr) == val: continue - modified.append(u" ".join([m.name, attr, unicode(val), - unicode(getattr(route, attr))])) + modified.append(u" ".join([m.name, attr, str(val), + str(getattr(route, attr))])) setattr(route, attr, val) for picture in orm['chimere.PictureFile'].objects.filter( marker=m).all(): diff --git a/chimere/migrations/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py b/chimere/old_migrations/v2.9/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py index 8a2bb05..8a2bb05 100644 --- a/chimere/migrations/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py +++ b/chimere/old_migrations/v2.9/0038_auto__del_field_marker_route__del_field_route_has_associated_marker__d.py diff --git a/chimere/external_utils/__init__.py b/chimere/old_migrations/v2.9/__init__.py index e69de29..e69de29 100644 --- a/chimere/external_utils/__init__.py +++ b/chimere/old_migrations/v2.9/__init__.py diff --git a/chimere/route.py b/chimere/route.py index 31cf4f0..406d7d9 100644 --- a/chimere/route.py +++ b/chimere/route.py @@ -26,7 +26,7 @@ import os import re import shutil import tempfile -from BeautifulSoup import BeautifulSoup +from bs4 import BeautifulSoup from subprocess import Popen, PIPE from django.contrib.gis.gdal import DataSource from django.contrib.gis.gdal.error import OGRException @@ -64,7 +64,7 @@ class RoutinoRouter(Router): ] if speed: args += [ - "--speed-%s=%s" % (highway, unicode(speed)) + "--speed-%s=%s" % (highway, str(speed)) for highway in ( 'motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'unclassified', 'residential', 'service', 'track', diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 0ffb14f..ac2c623 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -1030,7 +1030,7 @@ function transform(obj) { } // no more cluster feature here: stop zooming return feature; - }, duration); + }, duration + 200); }, displayClusterDetail: function(feature){ var feats = feature.getProperties()['features']; @@ -1064,7 +1064,7 @@ function transform(obj) { var radius = Math.max(8, Math.min(size*0.75, 20)); var offset_x = 0.1; var offset_y = -(radius + radius / 2); - var geom = feature.getGeometry(); + var geom = feat.getGeometry(); methods.openPopup(feat, offset_x, offset_y, geom.getCoordinates()); e.stopPropagation(); return false; @@ -1826,6 +1826,8 @@ function transform(obj) { }, // add json layer addJSON: function(json_url){ + // TODO ol3 : json + /* var jsonStyle = new OpenLayers.Style({ 'strokeWidth':1, 'fillColor':'#BBBBBB', @@ -1845,6 +1847,7 @@ function transform(obj) { settings.map.addLayer(settings.layerJson); settings.map.setLayerIndex(settings.layerJson, 0); settings.layerJson.setOpacity(0.4); + */ }, // Put a route on the map addRoute: function(feature) { diff --git a/chimere/tasks.py b/chimere/tasks.py index 9eff7f5..01ee113 100644 --- a/chimere/tasks.py +++ b/chimere/tasks.py @@ -85,13 +85,13 @@ def importing(importer_pk): if importer.state != IMPORT_MESSAGES['import_pending'][0]: # import canceled or done return - importer.state = unicode(IMPORT_MESSAGES['import_process'][0]) + importer.state = str(IMPORT_MESSAGES['import_process'][0]) importer.save() new_item, updated_item, error = importer.manager.get() importer.state = error + '\n' if error else '' - importer.state += unicode(IMPORT_MESSAGES['import_done'][0]) + importer.state += str(IMPORT_MESSAGES['import_done'][0]) importer.state += \ - u" - " + unicode(IMPORT_MESSAGES['import_done'][1]) % { + u" - " + str(IMPORT_MESSAGES['import_done'][1]) % { 'new': new_item, 'updated': updated_item} importer.state = importer.state importer.save() @@ -109,20 +109,20 @@ def exporting(importer_pk, extra_args=[]): if importer.state != IMPORT_MESSAGES['export_pending'][0]: # import canceled or done return - importer.state = unicode(IMPORT_MESSAGES['export_process'][0]) + importer.state = str(IMPORT_MESSAGES['export_process'][0]) importer.save() error = None try: updated_item, error = importer.manager.put(extra_args) - except OsmApi.ApiError, error: + except OsmApi.ApiError as error: pass if error: - importer.state = unicode(IMPORT_MESSAGES['export_failed'][0]) \ - + u" - " + unicode(IMPORT_MESSAGES['export_failed'][1]) % error + importer.state = str(IMPORT_MESSAGES['export_failed'][0]) \ + + u" - " + str(IMPORT_MESSAGES['export_failed'][1]) % error importer.save() return - importer.state = unicode(IMPORT_MESSAGES['export_done'][0]) + u" - " \ - + unicode(IMPORT_MESSAGES['export_done'][1]) % { + importer.state = str(IMPORT_MESSAGES['export_done'][0]) + u" - " \ + + str(IMPORT_MESSAGES['export_done'][1]) % { 'updated': updated_item} importer.save() return True diff --git a/chimere/templates/admin/chimere/managed_modified.html b/chimere/templates/admin/chimere/managed_modified.html index c55650d..6933abb 100644 --- a/chimere/templates/admin/chimere/managed_modified.html +++ b/chimere/templates/admin/chimere/managed_modified.html @@ -40,7 +40,7 @@ </table> </fieldset> <div class='submit-row'> -<p class='deletelink-box'><a href="{% if item.point %}{% url admin:chimere_marker_changelist %}{%else%}{% url admin:chimere_route_changelist %}{%endif%}">{% trans "Back to list" %}</a></p> +<p class='deletelink-box'><a href="{% if item.point %}{% url 'admin:chimere_marker_changelist' %}{%else%}{% url 'admin:chimere_route_changelist' %}{%endif%}">{% trans "Back to list" %}</a></p> <input class='default' type='submit' value='{% trans "Validate" %}'/> </div> </form> diff --git a/chimere/templates/admin/chimere/marker/change_form.html b/chimere/templates/admin/chimere/marker/change_form.html index 3b3d238..808d3f8 100644 --- a/chimere/templates/admin/chimere/marker/change_form.html +++ b/chimere/templates/admin/chimere/marker/change_form.html @@ -3,7 +3,7 @@ {% block field_sets %} {% if original.has_modified %} <p class='errornote'> -{% url admin:admin-modification object_id as rapprochement_form %} +{% url 'admin:admin-modification' object_id as rapprochement_form %} {% blocktrans %} This item has a reference item associated to it. You should treat it via the <a href='{{ rapprochement_form }}'>rapprochement form</a>. {% endblocktrans %} diff --git a/chimere/templates/admin/chimere/osm_export.html b/chimere/templates/admin/chimere/osm_export.html index dab123e..c6615b6 100644 --- a/chimere/templates/admin/chimere/osm_export.html +++ b/chimere/templates/admin/chimere/osm_export.html @@ -24,7 +24,7 @@ </ul> <p class='errornote'>{% blocktrans %}Ensure that all the data exported to OSM have an appropriate license. You can exclude some points of interest by checking the checkbox "Not to be imported in OSM" in the point of interest form. <strong>If you are not sure of what you are doing: DON'T EXPORT TO OSM</strong>!{% endblocktrans %}</p> <div class='submit-row'> -<p class='deletelink-box'><a href="{% if item.point %}{% url admin:chimere_marker_changelist %}{%else%}{% url admin:chimere_route_changelist %}{%endif%}">{% trans "Back to list" %}</a></p> +<p class='deletelink-box'><a href="{% if item.point %}{% url 'admin:chimere_marker_changelist' %}{%else%}{% url 'admin:chimere_route_changelist' %}{%endif%}">{% trans "Back to list" %}</a></p> <input class='default' type='submit' value='{% trans "Export to OSM" %}'/> </div> </form> diff --git a/chimere/templates/chimere/blocks/actions.html b/chimere/templates/chimere/blocks/actions.html index e31e1cc..54accc4 100644 --- a/chimere/templates/chimere/blocks/actions.html +++ b/chimere/templates/chimere/blocks/actions.html @@ -33,7 +33,7 @@ <li id='news-lnk'> <a data-toggle='modal' data-target="#news" href='#' id='news_button'><span class='fa fa-chimere-action fa-newspaper-o'></span><span class='lbl'>{% trans "News"%}</span></a> </li> - <!-- <li id="simple_button-lnk"><a id='simple_button' href='{% url chimere:simple_index area_name_slash %}'><span class='fa fa-chimere-action fa-simplybuilt'></span><span class='lbl'> {% trans "Simple map" %}</span></a></li> --> + <!-- <li id="simple_button-lnk"><a id='simple_button' href='{% url 'chimere:simple_index' area_name_slash %}'><span class='fa fa-chimere-action fa-simplybuilt'></span><span class='lbl'> {% trans "Simple map" %}</span></a></li> --> <li class='selection-sep'> </li> {% endif %} </ul> diff --git a/chimere/templates/chimere/blocks/head_chimere.html b/chimere/templates/chimere/blocks/head_chimere.html index dbb7053..2621d54 100644 --- a/chimere/templates/chimere/blocks/head_chimere.html +++ b/chimere/templates/chimere/blocks/head_chimere.html @@ -1,6 +1,9 @@ +{% if not is_edit %} <link rel="stylesheet" href="{{ STATIC_URL }}ol3/ol.css" /> <link rel="stylesheet" href="{{ STATIC_URL }}ol3-contextmenu/ol3-contextmenu.min.css" /> <script src="{{ STATIC_URL }}ol3/ol.js" type="text/javascript"></script> +{% endif %} +<script src="{{ STATIC_URL }}ol3-contextmenu/ol3-contextmenu.min.js" type="text/javascript"></script> <script type="text/javascript"> /* Global variables */ var STATIC_URL = static_url = "{{ STATIC_URL }}"; @@ -14,10 +17,9 @@ EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION); var restricted_extent; {% if area_name %}var area_name = '{{ area_name }}';{% endif %} - var get_share_url = '{% url chimere:get-share-url %}'; + var get_share_url = '{% url 'chimere:get-share-url' %}'; var language = "{{LANGUAGE}}"; </script> -<script src="{{ STATIC_URL }}ol3-contextmenu/ol3-contextmenu.min.js" type="text/javascript"></script> {% if routing %}<script src="{{ STATIC_URL }}chimere/js/routing-widget.js" type="text/javascript"></script>{% endif %} <script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js" type="text/javascript"></script> <script src="{{ STATIC_URL }}chimere/js/utils.js" type="text/javascript"></script> diff --git a/chimere/templates/chimere/blocks/share_bar.html b/chimere/templates/chimere/blocks/share_bar.html index 5367628..9e91a3a 100644 --- a/chimere/templates/chimere/blocks/share_bar.html +++ b/chimere/templates/chimere/blocks/share_bar.html @@ -11,7 +11,7 @@ $(function(){ $('.share_link').click(function(){ var href = $(this).attr('href'); - var url = '{% url chimere:get-share-url %}'; + var url = '{% url 'chimere:get-share-url' %}'; var classes = $(this).attr('class').split(' '); prefix = 'share_id_'; var share_id; diff --git a/chimere/templates/chimere/category_item_detail.html b/chimere/templates/chimere/category_item_detail.html index 284dfd0..2984a47 100644 --- a/chimere/templates/chimere/category_item_detail.html +++ b/chimere/templates/chimere/category_item_detail.html @@ -27,7 +27,7 @@ {% if marker.license %}<p class='detail_license'><strong>{% trans "License:" %}</strong> <span>{{marker.license}}</span></p>{% endif %} {% share_bar marker.name %} <a href="{% get_tinyfied_url marker area_name %}">{% trans "See on the map" %}</a> - <p class='detail_amendment'><a href='{% if marker.route %}{% url chimere:editroute-item area_name_slash|default_if_none:"" marker.route.pk "" %}{%else%}{% url chimere:editmarker-item area_name_slash|default_if_none:"" marker.pk "" %}{%endif%}'> + <p class='detail_amendment'><a href='{% if marker.route %}{% url 'chimere:editroute-item' area_name_slash|default_if_none:"" marker.route.pk "" %}{%else%}{% url 'chimere:editmarker-item' area_name_slash|default_if_none:"" marker.pk "" %}{%endif%}'> {% trans "Submit an amendment" %} </a> {% if moderator_emails %} diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html index 41a4ba3..54c9a99 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -33,7 +33,7 @@ </p>{% endif %} </div> {% share_bar marker.name %} - <p class='detail_amendment'><a href='{% if marker.polygon %}{% url chimere:editpolygon-item area_name_slash|default_if_none:"" marker.pk "" %}{% else %}{% if marker.route %}{% url chimere:editroute-item area_name_slash|default_if_none:"" marker.pk "" %}{% else %}{% url chimere:editmarker-item area_name_slash|default_if_none:"" marker.pk "" %}{% endif %}{% endif %}'> + <p class='detail_amendment'><a href='{% if marker.polygon %}{% url 'chimere:editpolygon-item' area_name_slash|default_if_none:"" marker.pk "" %}{% else %}{% if marker.route %}{% url 'chimere:editroute-item' area_name_slash|default_if_none:"" marker.pk "" %}{% else %}{% url 'chimere:editmarker-item' area_name_slash|default_if_none:"" marker.pk "" %}{% endif %}{% endif %}'> {% trans "Submit an amendment" %} </a> {% if moderator_emails %} diff --git a/chimere/templates/chimere/edit.html b/chimere/templates/chimere/edit.html index 869510a..e416458 100644 --- a/chimere/templates/chimere/edit.html +++ b/chimere/templates/chimere/edit.html @@ -1,5 +1,5 @@ {% extends "chimere/base.html" %} -{% load i18n chimere_tags adminmedia inline_formset%} +{% load i18n chimere_tags inline_formset staticfiles %} {% block extra_head %} {{ form.media }} {{ block.super }} @@ -8,7 +8,7 @@ <!--script type="text/javascript" src="{{extra_url}}media/js/core.js"></script--> <script type="text/javascript" src="{{ STATIC_URL }}chimere/js/utils.js"></script> <script type="text/javascript"> - window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}"; + window.__admin_media_prefix__ = "{% filter escapejs %}{% static 'admin' %}{% endfilter %}"; </script> {% endif %} {% endblock %} diff --git a/chimere/templates/chimere/edit_marker.html b/chimere/templates/chimere/edit_marker.html index c3e4fa2..04dc06c 100644 --- a/chimere/templates/chimere/edit_marker.html +++ b/chimere/templates/chimere/edit_marker.html @@ -1,5 +1,5 @@ {% extends "chimere/edit.html" %} -{% load i18n chimere_tags adminmedia inline_formset%} +{% load i18n chimere_tags inline_formset%} {% block legend %}<legend>{% if is_modification %}{% trans "Modify a point of interest" %}{% else %}{% trans "Add a point of interest" %}{% endif %}</legend>{% endblock %} diff --git a/chimere/templates/chimere/upload_file.html b/chimere/templates/chimere/upload_file.html index 91a1444..638d4a1 100644 --- a/chimere/templates/chimere/upload_file.html +++ b/chimere/templates/chimere/upload_file.html @@ -23,7 +23,7 @@ {% if gpx_id %} <script type="text/javascript"><!-- jQuery(document).ready(function() { - jQuery.get("{% url chimere:process_route_file gpx_id %}", function(data) { + jQuery.get("{% url 'chimere:process_route_file' gpx_id %}", function(data) { var data = eval(data); var main_page = opener.document; jQuery(main_page).find("#id_route").val(data.wkt); diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index e0dc32b..1adeade 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -282,8 +282,8 @@ def map(context, map_id='map'): if not context_data['checked_categories']: cat = '' if SubCategory.objects.filter(available=True).count(): - cat = unicode(SubCategory.objects.filter(available=True - ).all()[0].pk) + cat = str(SubCategory.objects.filter( + available=True).all()[0].pk) context_data['checked_categories'] = cat context_data['dynamic_categories'] = \ 'true' if area and area.dynamic_categories else 'false' diff --git a/chimere/templatetags/sanitize.py b/chimere/templatetags/sanitize.py index ccb936c..75df318 100644 --- a/chimere/templatetags/sanitize.py +++ b/chimere/templatetags/sanitize.py @@ -2,11 +2,12 @@ # -*- coding: utf-8 -*- from django import template -from BeautifulSoup import BeautifulSoup, Comment +from bs4 import BeautifulSoup, Comment import re register = template.Library() + def sanitize(value, allowed_tags): """Argument should be in form 'tag2:attr1:attr2 tag2:attr1 tag3', where tags are allowed HTML tags, and attrs are the allowed attributes for that tag. @@ -23,9 +24,9 @@ def sanitize(value, allowed_tags): if tag.name not in allowed_tags: tag.hidden = True else: - tag.attrs = [(attr, js_regex.sub('', val)) for attr, val in tag.attrs - if attr in allowed_tags[tag.name]] + tag.attrs = { + attr: js_regex.sub('', tag.attrs[attr]) for attr in tag.attrs + if attr in allowed_tags[tag.name]} return soup.renderContents().decode('utf8') register.filter(sanitize) - diff --git a/chimere/templatetags/unlocalize_point.py b/chimere/templatetags/unlocalize_point.py index f52a90a..bbcd722 100644 --- a/chimere/templatetags/unlocalize_point.py +++ b/chimere/templatetags/unlocalize_point.py @@ -2,15 +2,14 @@ # -*- coding: utf-8 -*- from django import template -import re register = template.Library() + def unlocalize_point(value): """ Basic unlocalize filter for django 1.2 """ - return unicode(value).replace(',', '.') + return str(value).replace(',', '.') register.filter(unlocalize_point) - diff --git a/chimere/tests.py b/chimere/tests.py index 71fa12b..90e6143 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -137,7 +137,7 @@ class ImporterTest: self.assertEqual( nb, awaited_nb, msg=u"{}: get test failed - got {} when {} was awaited - {}" - .format(unicode(self.__class__), nb, awaited_nb, res)) + .format(str(self.__class__), nb, awaited_nb, res)) self.assertEqual(nb_updated, 0) for cat in importer.categories.all(): if cat not in nb_by_cat: @@ -150,7 +150,7 @@ class ImporterTest: self.assertEqual( nb_by_cat[cat], nb, msg=u"{} - category association test failed: {}/{}".format( - unicode(cat), nb, nb_by_cat[cat])) + str(cat), nb, nb_by_cat[cat])) # update for importer, awaited_nb in self.marker_importers: importer.overwrite = True @@ -161,7 +161,7 @@ class ImporterTest: self.assertEqual( nb, 0, msg=u"{}: update test failed - new items have been add" - .format(unicode(self.__class__))) + .format(str(self.__class__))) # TODO: v3 - retablir overwrite """ # manage overwrite @@ -188,7 +188,7 @@ class ImporterTest: continue self.assertEqual( nb, 1, msg=u"%s: overwrite test failed" % - unicode(self.__class__))""" + str(self.__class__))""" class KMLImporterTest(TestCase, ImporterTest): @@ -410,14 +410,14 @@ class AdminTest(AdministratorsTest): self.client.post( '/admin/chimere/marker/', data={'action': ['disable'], - '_selected_action': [unicode(m.pk) for m in self.markers], + '_selected_action': [str(m.pk) for m in self.markers], }) self.assertEqual(q_markers.count(), q_markers.filter(status='D').count()) # validate self.client.post('/admin/chimere/marker/', data={'action': ['validate'], - '_selected_action': [unicode(m.pk) + '_selected_action': [str(m.pk) for m in self.markers] }) self.assertEqual(q_markers.count(), @@ -613,7 +613,7 @@ class RapprochementTest(TestCase): '/admin/chimere/marker/', data={'action': ['managed_modified'], 'index': 0, 'rapprochement': 1, 'name': 1, 'point': 1, - '_selected_action': [unicode(ref_marker.pk)]}) + '_selected_action': [str(ref_marker.pk)]}) ref_marker = Marker.objects.get(pk=ref_marker.pk) self.assertEqual(Marker.objects.filter(ref_item=ref_marker, status='M').count(), 0) @@ -634,7 +634,7 @@ class RapprochementTest(TestCase): data={'action': ['managed_modified'], 'index': 0, 'rapprochement': 1, 'name': 1, 'point': 1, - '_selected_action': [unicode(ref_marker.pk)] + '_selected_action': [str(ref_marker.pk)] }) ref_marker = Marker.objects.get(pk=ref_marker.pk) self.assertEqual(Marker.objects.filter(ref_item=ref_marker, @@ -654,7 +654,7 @@ class RapprochementTest(TestCase): data={'action': ['managed_modified'], 'index': 0, 'rapprochement': 1, 'name': 1, 'route': 1, 'categories': 1, - '_selected_action': [unicode(ref_route.pk)] + '_selected_action': [str(ref_route.pk)] }) ref_route = Route.objects.get(pk=ref_route.pk) self.assertEqual(Route.objects.filter(ref_item=ref_route, diff --git a/chimere/urls.py b/chimere/urls.py index 824c7ed..d5a31c0 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -18,7 +18,7 @@ # See the file COPYING for details. from django.conf import settings -from django.conf.urls.defaults import * +from django.conf.urls import patterns, url from django.contrib import admin from django.core.exceptions import ImproperlyConfigured admin.autodiscover() diff --git a/chimere/utils.py b/chimere/utils.py index bd09b9e..37c580f 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -25,16 +25,17 @@ import csv import collections import datetime import feedparser +import io import json import os import re -import StringIO import tempfile -import urllib2 +import urllib import unicodedata import zipfile from osgeo import ogr, osr +from osmapi import OsmApi from lxml import etree from django.conf import settings @@ -45,12 +46,9 @@ from django.shortcuts import render_to_response from django.utils.translation import ugettext_lazy as _ from chimere import get_version -from external_utils import OsmApi def unicode_normalize(string): - if type(string) == str: - string = unicode(string.decode('utf-8')) return ''.join( (c for c in unicodedata.normalize('NFD', string) if unicodedata.category(c) not in ('Mn', 'Sm', 'Sc'))) @@ -82,7 +80,7 @@ class ImportManager(object): key='', pk=None, category=None): from models import PropertyModel updated, created, item = False, False, None - import_key = unicode(import_key).replace(':', '^') + import_key = str(import_key).replace(':', '^') if not values.get('name'): values['name'] = self.default_name if not key: @@ -199,16 +197,16 @@ class ImportManager(object): url = source if extra_url: url += extra_url - remotehandle = urllib2.urlopen(url) - source = StringIO.StringIO(remotehandle.read()) + remotehandle = urllib.request.urlopen(url) + source = io.StringIO(remotehandle.read()) remotehandle.close() except ValueError: # assume it is a local file try: source = open(source) - except IOError, msg: + except IOError as msg: return (None, msg) - except (urllib2.URLError, AttributeError) as error: + except (urllib.error.URLError, AttributeError) as error: return (None, error.message) if self.importer_instance.zipped: try: @@ -256,7 +254,7 @@ class KMLManager(ImportManager): for idx, line in enumerate(splitted): if line.strip(): break - doc = StringIO.StringIO("\n".join(splitted[idx:])) + doc = io.StringIO("\n".join(splitted[idx:])) try: tree = etree.parse(doc) except: @@ -319,7 +317,7 @@ class KMLManager(ImportManager): def export(cls, queryset): dct = { 'name': settings.PROJECT_NAME, - 'description': unicode(datetime.date.today()), + 'description': str(datetime.date.today()), 'locations': queryset.all() } filename = unicode_normalize(settings.PROJECT_NAME + dct['description'] @@ -444,10 +442,10 @@ class ShapefileManager(ImportManager): for k in filtr: val = feat.get(k) try: - val = unicode(val) + val = str(val) except UnicodeDecodeError: try: - val = unicode( + val = str( val.decode(settings.CHIMERE_SHAPEFILE_ENCODING)) except: continue @@ -482,7 +480,7 @@ class ShapefileManager(ImportManager): @classmethod def export(cls, queryset): - date = unicode(datetime.date.today()) + date = str(datetime.date.today()) tmp = tempfile.NamedTemporaryFile(suffix='.shp', mode='w+b') tmp.close() @@ -496,7 +494,7 @@ class ShapefileManager(ImportManager): dr = ogr.GetDriverByName('ESRI Shapefile') ds = dr.CreateDataSource(tmp_name) if ds is None: - raise Exception(_(u'Could not create file!')) + raise Exception(_('Could not create file!')) ogr_type = OGRGeomType(geo_field.geom_type).num srs = osr.SpatialReference() srs.ImportFromEPSG(geo_field.srid) @@ -507,7 +505,7 @@ class ShapefileManager(ImportManager): field_defn = ogr.FieldDefn(str(field_name), ogr.OFTString) field_defn.SetWidth(255) if layer.CreateField(field_defn) != 0: - raise Exception(_(u'Failed to create field')) + raise Exception(_('Failed to create field')) feature_def = layer.GetLayerDefn() @@ -536,7 +534,7 @@ class ShapefileManager(ImportManager): # writing to a zip file filename = unicode_normalize(settings.PROJECT_NAME) + '-' + date - buff = StringIO.StringIO() + buff = io.StringIO() zip_file = zipfile.ZipFile(buff, 'w', zipfile.ZIP_DEFLATED) suffixes = ['shp', 'shx', 'prj', 'dbf'] for suffix in suffixes: @@ -632,7 +630,7 @@ class CSVManager(ImportManager): @classmethod def export(cls, queryset): - dct = {'description': unicode(datetime.date.today()), 'data': []} + dct = {'description': str(datetime.date.today()), 'data': []} # cls_name = queryset.model.__name__.lower() cols = list(cls.COLS) for pm in queryset.model.all_properties(): @@ -714,7 +712,7 @@ class GeoRSSManager(ImportManager): points = item['georss_line'].split(' ') reordered_points = [] # lat, lon -> x, y - for idx in xrange(len(points) / 2): + for idx in range(len(points) / 2): reordered_points.append("%s %s" % (points[idx * 2 + 1], points[idx * 2])) dct['route'] = 'SRID=4326;LINESTRING(%s)' % \ @@ -829,7 +827,7 @@ class JsonManager(ImportManager): dct[key] += filtr[k] cls = Marker pl_id = (dct.pop('id') if 'id' in dct else dct['name']) \ - + "-" + unicode(self.importer_instance.pk) + + "-" + str(self.importer_instance.pk) it, updated, created = self.create_or_update_item(cls, dct, pl_id) if updated: updated_item += 1 @@ -901,9 +899,9 @@ class OSMManager(ImportManager): dct = {'route': wkt, 'name': name, 'origin': self.importer_instance.origin - or u'OpenStreetMap.org', + or 'OpenStreetMap.org', 'license': self.importer_instance.license - or u'ODbL', + or 'ODbL', 'import_version': version} item, updated, created = self.create_or_update_item( Route, dct, node_id, version) @@ -932,9 +930,9 @@ class OSMManager(ImportManager): dct = {'point': point, 'name': name, 'origin': self.importer_instance.origin - or u'OpenStreetMap.org', + or 'OpenStreetMap.org', 'license': self.importer_instance.license - or u'ODbL', + or 'ODbL', 'import_version': version} item, updated, created = self.create_or_update_item( Marker, dct, node_id, version) @@ -1022,7 +1020,7 @@ class OSMManager(ImportManager): dct['version'] = item.import_version node = api.NodeUpdate(dct) updated = True - except OsmApi.ApiError, error: + except OsmApi.ApiError as error: if error.status == 404: dct.pop('id') dct.pop('version') @@ -1039,8 +1037,8 @@ class OSMManager(ImportManager): import chardet -import HTMLParser -from BeautifulSoup import BeautifulSoup +from html.parser import HTMLParser +from bs4 import BeautifulSoup RE_CLEANS = ((re.compile('(\n)*|^( )*(\n)*( )*|( )*(\n)*( )*$'), ''), @@ -1049,25 +1047,18 @@ RE_CLEANS = ((re.compile('(\n)*|^( )*(\n)*( )*|( )*(\n)*( )*$'), ''), '<a href="%(base_url)s\\1"'), ) -from calendar import TimeEncoding, month_name +from calendar import month_name, different_locale def get_month_name(month_no, locale): - with TimeEncoding(locale) as encoding: - s = month_name[month_no] - if encoding is not None: - s = s.decode(encoding) - return s + with different_locale(locale): + return month_name[month_no] MONTH_NAMES = {locale: [get_month_name(no_month, locale + '.UTF-8') - for no_month in xrange(1, 13)] for locale in ['fr_FR']} + for no_month in range(1, 13)] for locale in ['fr_FR']} -try: - UNI_MONTH_NAMES = {locale: [m.decode('utf-8') for m in MONTH_NAMES[locale]] - for locale in MONTH_NAMES} -except UnicodeEncodeError: - UNI_MONTH_NAMES = {locale: [m for m in MONTH_NAMES[locale]] - for locale in MONTH_NAMES} +UNI_MONTH_NAMES = {locale: [m for m in MONTH_NAMES[locale]] + for locale in MONTH_NAMES} DATE_PARSINGS = { 'fr_FR': [ @@ -1127,9 +1118,9 @@ class HtmlXsltManager(ImportManager): from models import Marker self.marker_cls = Marker try: - main_page = urllib2.urlopen(self.importer_instance.source) + main_page = urllib.request.urlopen(self.importer_instance.source) assert main_page.getcode() == 200 - except (urllib2.URLError, AssertionError): + except (urllib.error.URLError, AssertionError): return (0, 0, _(u"Source page is unreachable.")) data = main_page.read() encoding = chardet.detect(data) @@ -1159,7 +1150,7 @@ class HtmlXsltManager(ImportManager): except (etree.XSLTParseError, etree.XMLSyntaxError, TypeError): return (0, 0, _(u"The alt source file is not a valid XSLT file.")) - base_url = u"/".join(self.importer_instance.source.split(u'/')[:-1]) + base_url = u"/".join(self.importer_instance.source.split('/')[:-1]) base_url += u"/" for item in newdom.getroot(): c_item = {child.tag: clean_field(child.text) @@ -1171,9 +1162,9 @@ class HtmlXsltManager(ImportManager): not c_item['link'].startswith('https://'): c_item['link'] = base_url + c_item['link'] try: - child_page = urllib2.urlopen(c_item['link']) + child_page = urllib.request.urlopen(c_item['link']) assert child_page.getcode() == 200 - except (urllib2.URLError, AssertionError): + except (urllib.error.URLError, AssertionError): # don't stop the export for a bad link items.append(c_item) continue @@ -1188,7 +1179,7 @@ class HtmlXsltManager(ImportManager): for extra in extra_keys[0].getchildren()}) items.append(c_item) # change relative link to full link, simplify, unescape HTML entities - html_unescape = HTMLParser.HTMLParser().unescape + html_unescape = HTMLParser().unescape for item in items: for k in item: val = item[k] @@ -1205,7 +1196,7 @@ class HtmlXsltManager(ImportManager): msg = _( u"Names \"%s\" doesn't match existing categories. " u"Modify the import to match theses names with categories.") %\ - (u'", "'.join(self.missing_cats)) + ('", "'.join(self.missing_cats)) return (self.new_item, self.updated_item, msg) @classmethod @@ -1338,17 +1329,17 @@ class IcalManager(ImportManager): dct = default_dct.copy() dct['name'] = event.get('SUMMARY', '') if dct['name']: - dct['name'] = unicode(dct['name']) + dct['name'] = str(dct['name']) dct['description'] = event.get('DESCRIPTION', '') if dct['description']: - dct['description'] = unicode(dct['description']) + dct['description'] = str(dct['description']) loc = event.get('LOCATION', None) if loc: - dct['description'] += u"<br/>{}".format(unicode(loc)) + dct['description'] += u"<br/>{}".format(str(loc)) url = event.get('URL', None) if url: dct['description'] += u"<br/><a href='{}'>{}</a>".format( - unicode(url), unicode(_(u'Link'))) + str(url), unicode(_('Link'))) dct['start_date'] = event.get('DTSTART', None) if dct['start_date']: dct['start_date'] = event.decoded('DTSTART') @@ -1366,8 +1357,8 @@ class IcalManager(ImportManager): cls = Marker pl_id = event.get('UID', None) if not pl_id: - pl_id = dct['name'] + "-" + unicode(self.importer_instance.pk) - pl_id += "-" + unicode(self.importer_instance.pk) + pl_id = dct['name'] + "-" + str(self.importer_instance.pk) + pl_id += "-" + str(self.importer_instance.pk) it, updated, created = self.create_or_update_item(cls, dct, pl_id) if updated: updated_item += 1 diff --git a/chimere/views.py b/chimere/views.py index 8d32270..eab700e 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -23,20 +23,20 @@ Views of the project import datetime from itertools import groupby +import json import re from django.conf import settings from django.contrib.gis.geos import GEOSGeometry, Polygon as GEOSPolygon from django.contrib.gis.gdal.error import OGRException from django.contrib.gis.measure import D -from django.contrib.sites.models import get_current_site +from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.shortcuts import get_object_or_404, redirect, render_to_response from django.template import RequestContext, defaultfilters -from django.utils import simplejson as json from django.utils.http import urlquote from django.utils.translation import ugettext as _ from django.views.generic import TemplateView, ListView @@ -134,8 +134,8 @@ def getShareNetwork(request, area_name='', marker=None): """ parameters = "" if marker: - parameters = u'current_feature=%d' % marker.pk - parameters += u"&checked_categories=%s" % "_".join( + parameters = 'current_feature=%d' % marker.pk + parameters += "&checked_categories=%s" % "_".join( [str(m.id) for m in marker.categories.all()]) net_dct = getTinyfiedUrl(request, parameters, area_name) share_networks = [] @@ -237,7 +237,7 @@ def get_edit_page(redirect_url, item_cls, item_form, if subcategories: for cat, subcats in subcategories: listed_subcats.append( - (unicode(cat), + (str(cat), [(subcat.pk, subcat.name) for subcat in subcats])) # if an item_id is provided: modification init_item, ref_item = None, None @@ -319,8 +319,8 @@ def get_edit_page(redirect_url, item_cls, item_form, item.ref_item.pk, 'submited'), None, subcategories else: response_dct['error_message'] = _( - u"There are missing field(s)" - u" and/or errors in the submited form.") + "There are missing field(s)" + " and/or errors in the submited form.") else: form = item_form(instance=init_item, subcategories=listed_subcats, area_name=area_name) @@ -360,7 +360,7 @@ def uploadFile(request, category_id='', area_name=''): if category_id: try: category = SubCategory.objects.get(pk=category_id) - response_dct['category'] = unicode(category) + response_dct['category'] = str(category) except: pass # If the form has been submited @@ -382,7 +382,7 @@ def uploadFile(request, category_id='', area_name=''): routefile.process() if not routefile.route: response_dct['errors'] = _( - u"Bad file. Please check it with an external software.") + "Bad file. Please check it with an external software.") response_dct.update({'form': form}) return render_to_response( 'chimere/upload_file.html', response_dct, @@ -528,14 +528,14 @@ def contactus(request, area_name=""): # All validation rules pass if form.is_valid(): response = notifyStaff( - _(u"Comments/request on the map"), + _("Comments/request on the map"), form.cleaned_data['content'], form.cleaned_data['email']) if response: - msg = _(u"Thank you for your contribution. It will be taken " - u"into account. If you have left your email you may " - u"be contacted soon for more details.") + msg = _("Thank you for your contribution. It will be taken " + "into account. If you have left your email you may " + "be contacted soon for more details.") else: - msg = _(u"Temporary error. Renew your message later.") + msg = _("Temporary error. Renew your message later.") else: form = ContactForm() response_dct, redir = get_base_response(request, area_name) @@ -784,7 +784,7 @@ def getGeoObjects(request, area_name, category_ids, status): if not status: status = 'A' status = status.split('_') - category_ids = unicode(category_ids).split('_') + category_ids = str(category_ids).split('_') bounding_box = [] for attr in ['min_lon', 'min_lat', 'max_lon', 'max_lat']: @@ -919,7 +919,7 @@ def getTinyfiedUrl(request, parameters, area_name=''): for item in parameters.split('&'): if 'current_feature' in item: try: - text = unicode(Marker.objects.get(id=item.split('=')[1])) + text = str(Marker.objects.get(id=item.split('=')[1])) except (IndexError, Marker.DoesNotExist): pass data["urn"] = urlquote(urn) @@ -995,7 +995,7 @@ class CategoryView(TemplateView): raise Http404(_("Category does not exist")) items, zoom_need_reload = _getGeoObjects( - self.area_name, [unicode(self.category.pk)], getjson=False, + self.area_name, [str(self.category.pk)], getjson=False, item_types=('Marker',)) return items @@ -1033,9 +1033,9 @@ def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, if transport not in dict(settings.CHIMERE_ROUTING_TRANSPORT): transport = settings.CHIMERE_ROUTING_TRANSPORT[0][0] if speed: - speed = unicode(speed) + speed = str(speed) available_speed = [ - unicode(sp) + str(sp) for sp, lbl in settings.CHIMERE_ROUTING_SPEEDS[transport]] if speed not in available_speed: speed = None @@ -1054,7 +1054,7 @@ def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, try: route = GEOSGeometry(jsons[0]) except OGRException: - return HttpResponse(_(u"Bad geometry"), status=500) + return HttpResponse(_("Bad geometry"), status=500) cats = SubCategory.objects.filter(routing_warn=True) message = '' if cats.count(): diff --git a/chimere/widgets.py b/chimere/widgets.py index 465ec7f..8464d47 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2008-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -28,8 +28,7 @@ from django.conf import settings from django.contrib.gis.db import models from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.forms.widgets import RadioInput, RadioFieldRenderer, flatatt -from django.utils.encoding import force_unicode, smart_unicode +from django.forms.widgets import RadioSelect, RadioFieldRenderer, flatatt from django.utils.html import conditional_escape, escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -58,22 +57,22 @@ def getMapJS(area_name=''): '''Variable initialization for drawing the map ''' # projection, center and bounds definitions - js = u"var epsg_display_projection = 'EPSG:%d';\n" \ + js = "var epsg_display_projection = 'EPSG:%d';\n" \ % settings.CHIMERE_EPSG_DISPLAY_PROJECTION - js += u"var epsg_projection = 'EPSG:%d';\n" % \ + js += "var epsg_projection = 'EPSG:%d';\n" % \ settings.CHIMERE_EPSG_PROJECTION - js += u"var centerLonLat = ol.proj.transform("\ - u"[%f, %f], epsg_display_projection, epsg_projection);\n" % \ + js += "var centerLonLat = ol.proj.transform("\ + "[%f, %f], epsg_display_projection, epsg_projection);\n" % \ settings.CHIMERE_DEFAULT_CENTER - js += u"var media_path = '%s';\n" % settings.MEDIA_URL - js += u"var static_path = '%s';\n" % settings.STATIC_URL - js += u"var map_layer = %s;\n" % settings.CHIMERE_DEFAULT_MAP_LAYER - js += u"var restricted_extent;\n" + js += "var media_path = '%s';\n" % settings.MEDIA_URL + js += "var static_path = '%s';\n" % settings.STATIC_URL + js += "var map_layer = %s;\n" % settings.CHIMERE_DEFAULT_MAP_LAYER + js += "var restricted_extent;\n" if area_name: - js += u"var area_name='%s';\n" % area_name - js = u"<script type='text/javascript'><!--\n"\ - u"%s// !--></script>\n" % js + js += "var area_name='%s';\n" % area_name + js = "<script type='text/javascript'><!--\n"\ + "%s// !--></script>\n" % js return js @@ -105,10 +104,10 @@ def get_map_layers(area_name='', get_area_zoom=False): else: map_layers[0][2] = True elif settings.CHIMERE_DEFAULT_MAP_LAYER: - map_layers = [(_(u"Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, + map_layers = [(_("Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, True, '')] else: - map_layers = [(u"OSM", """new ol.layer.Tile({ + map_layers = [("OSM", """new ol.layer.Tile({ style: 'Road', source: new ol.source.OSM() })""", True, '')] @@ -136,9 +135,9 @@ class ChosenSelectWidget(forms.Select): kwargs['attrs'] = {} kwargs['attrs'].update({'class': 'chzn-select'}) rendered = super(ChosenSelectWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $('#%s').chosen();\n"\ - u"</script>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $('#%s').chosen();\n"\ + "</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) """ @@ -146,28 +145,35 @@ JQuery UI button select widget. """ -class ButtonRadioInput(RadioInput): - def render(self, name=None, value=None, attrs=None, choices=()): - name = name or self.name - value = value or self.value +class ButtonRadioInput(RadioSelect): + def tag(self, name, value): + selected = str(value) == str(self.choices[0][0]) + return '<input type="radio" name="{}" value="{}"{}>'.format( + name, self.choices[0][0], + ' selected="selected"' if selected else '') + + def render(self, name=None, value=None, attrs=None, choices=(), + index=0): attrs = attrs or self.attrs if 'id' in self.attrs: - label_for = ' for="%s_%s"' % (self.attrs['id'], self.index) + label_for = ' for="%s_%s"' % (self.attrs['id'], index) else: label_for = '' - choice_label = conditional_escape(force_unicode(self.choice_label)) - return mark_safe(u'%s <label%s>%s</label>' % (self.tag(), label_for, - choice_label)) + choice_label = conditional_escape(str(self.choices[0][1])) + return mark_safe('%s <label%s>%s</label>' % (self.tag(name, value), + label_for, + choice_label)) class ButtonRadioFieldRenderer(RadioFieldRenderer): def __iter__(self): for i, choice in enumerate(self.choices): - yield ButtonRadioInput(self.name, self.value, self.attrs.copy(), - choice, i) + yield ButtonRadioInput(self.attrs.copy(), [choice]) def render(self): - return mark_safe(u'\n'.join([force_unicode(w) for w in self])) + return mark_safe('\n'.join([ + w.render(self.name, self.value, index=idx) + for idx, w in enumerate(self)])) class ButtonSelectWidget(forms.RadioSelect): @@ -178,9 +184,9 @@ class ButtonSelectWidget(forms.RadioSelect): def render(self, *args, **kwargs): rendered = "<div id='%s'>\n" % kwargs['attrs']['id'] rendered += super(ButtonSelectWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $('#%s').buttonset();\n"\ - u"</script>\n</div>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $('#%s').buttonset();\n"\ + "</script>\n</div>\n" % kwargs['attrs']['id'] return mark_safe(rendered) @@ -240,7 +246,7 @@ class FullTextareaWidget(TextareaWidgetBase): kwargs['attrs']['class'] += ' ' kwargs['attrs']['class'] += 'mceEditor' rendered = super(FullTextareaWidget, self).render(*args, **kwargs) - rendered += u"""<script type='text/javascript'> + rendered += """<script type='text/javascript'> tinyMCE.init({ mode : "textareas", theme : "advanced", @@ -273,10 +279,10 @@ class DatePickerWidget(forms.TextInput): """ def render(self, *args, **kwargs): rendered = super(DatePickerWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $(function() {$('#%s').datepicker("\ - u"{ dateFormat: 'yy-mm-dd' });});\n"\ - u"</script>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $(function() {$('#%s').datepicker("\ + "{ dateFormat: 'yy-mm-dd' });});\n"\ + "</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) @@ -307,14 +313,14 @@ class JQueryAutoComplete(forms.TextInput): selected_value, rendered_value = "", "" if value: - val = escape(smart_unicode(value)) + val = escape(str(value)) attrs_hidden['value'] = val attrs_select['value'] = val selected_value = val if val: from chimere.models import PropertyModelChoice try: - attrs_select['value'] = unicode( + attrs_select['value'] = str( PropertyModelChoice.objects.get( pk=value, propertymodel__slug=self.slug)) rendered_value = attrs_select['value'] @@ -346,9 +352,9 @@ class NominatimWidget(forms.TextInput): def render(self, name, value, attrs=None, area_name=''): dct = {'id': name, 'nominatim_url': settings.NOMINATIM_URL, - 'label': _(u"Street, City, Country")} + 'label': _("Street, City, Country")} - tpl = u""" + tpl = """ <input type='hidden' name='nominatim_%(id)s_lat' id='nominatim_%(id)s_lat'/> <input type='hidden' name='nominatim_%(id)s_lon' id='nominatim_%(id)s_lon'/> <input type='text' class='nominatim-widget' name='nominatim_%(id)s' @@ -384,7 +390,7 @@ class PointChooserWidget(forms.TextInput): val = str(value) if hasattr(value, 'x') and hasattr(value, 'y'): value_x, value_y = value.x, value.y - elif isinstance(value, unicode) and value.startswith('POINT('): + elif isinstance(value, str) and value.startswith('POINT('): try: value_x, value_y = value.split('(')[1][:-1].split(' ') value_x, value_y = float(value_x), float(value_y) @@ -487,8 +493,8 @@ class RouteChooserWidget(forms.TextInput): center=list(settings.CHIMERE_DEFAULT_CENTER), zoom=zoom, edition_type="route", - map_layers=u", ".join(map_layers), - extra_js=u"\n".join(extra_js), + map_layers=", ".join(map_layers), + extra_js="\n".join(extra_js), )) @@ -549,32 +555,32 @@ class AreaWidget(forms.TextInput): upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon = \ self.get_bounding_box_from_value(value) tpl = getMapJS() - tpl += u"</div>\n"\ - u"<input type='hidden' name='upper_left_lat' id='upper_left_lat' "\ - u"value='%f'/>\n"\ - u"<input type='hidden' name='upper_left_lon' id='upper_left_lon' "\ - u"value='%f'/>\n"\ - u"<input type='hidden' name='lower_right_lat' id='lower_right_lat'"\ - u" value='%f'/>\n"\ - u"<input type='hidden' name='lower_right_lon' id='lower_right_lon'"\ - u" value='%f'/>\n" % ( + tpl += "</div>\n"\ + "<input type='hidden' name='upper_left_lat' id='upper_left_lat' "\ + "value='%f'/>\n"\ + "<input type='hidden' name='upper_left_lon' id='upper_left_lon' "\ + "value='%f'/>\n"\ + "<input type='hidden' name='lower_right_lat' id='lower_right_lat'"\ + " value='%f'/>\n"\ + "<input type='hidden' name='lower_right_lon' id='lower_right_lon'"\ + " value='%f'/>\n" % ( upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon) - help_msg = _(u"Hold CTRL, click and drag to select area on the map") - tpl += u"<p class='help-osm'>%s</p>\n" % help_msg - tpl += u"<script type='text/javascript'>\n" - tpl += u"function init_map_form (){\ninit('map_edit_area');\n" + help_msg = _("Hold CTRL, click and drag to select area on the map") + tpl += "<p class='help-osm'>%s</p>\n" % help_msg + tpl += "<script type='text/javascript'>\n" + tpl += "function init_map_form (){\ninit('map_edit_area');\n" if value: - tpl += u"extent = ol.proj.transformExtent([%f, %f, %f, %f], "\ - u"epsg_display_projection, epsg_projection);\n"\ - u"initArea(extent);\n" % ( + tpl += "extent = ol.proj.transformExtent([%f, %f, %f, %f], "\ + "epsg_display_projection, epsg_projection);\n"\ + "initArea(extent);\n" % ( upper_left_lon, upper_left_lat, lower_right_lon, lower_right_lat) - tpl += u"}\n" + tpl += "}\n" if initialized: - tpl += u"$(document).ready(function($) {init_map_form()});\n" - tpl += u"</script>\n" - tpl += u"<div id='map_edit_area'>\n" + tpl += "$(document).ready(function($) {init_map_form()});\n" + tpl += "</script>\n" + tpl += "<div id='map_edit_area'>\n" return mark_safe(tpl) def value_from_datadict(self, data, files, name): @@ -627,8 +633,8 @@ class PolygonChooserWidget(forms.TextInput): center=list(settings.CHIMERE_DEFAULT_CENTER), zoom=zoom, edition_type="polygon", - map_layers=u", ".join(map_layers), - extra_js=u"\n".join(extra_js), + map_layers=", ".join(map_layers), + extra_js="\n".join(extra_js), )) @@ -660,50 +666,50 @@ class ImportFiltrWidget(AreaWidget): """ tpl = super(ImportFiltrWidget, self).render(name, value, attrs, initialized=False) - tpl += u"</div><hr class='spacer'/>" - vals = {'lbl': _(u"Type:"), 'name': name, 'node': _(u"Node"), - 'way': _(u"Way")} + tpl += "</div><hr class='spacer'/>" + vals = {'lbl': _("Type:"), 'name': name, 'node': _("Node"), + 'way': _("Way")} vals['way_selected'] = ' checked="checked"'\ if self.xapi_type == 'way' else '' vals['node_selected'] = ' checked="checked"'\ if self.xapi_type == 'node' else '' - tpl += u"<div class='input-osm'><label>%(lbl)s</label>"\ - u"<input type='radio' name='id_%(name)s_type' "\ - u"id='id_%(name)s_node' value='node'%(node_selected)s/> "\ - u"<label for='id_%(name)s_node'>"\ - u"%(node)s</label> <input type='radio' name='id_%(name)s_type' "\ - u"id='id_%(name)s_way' value='way'%(way_selected)s/> <label "\ - u"for='id_%(name)s_way'>%(way)s</label></div>" % vals + tpl += "<div class='input-osm'><label>%(lbl)s</label>"\ + "<input type='radio' name='id_%(name)s_type' "\ + "id='id_%(name)s_node' value='node'%(node_selected)s/> "\ + "<label for='id_%(name)s_node'>"\ + "%(node)s</label> <input type='radio' name='id_%(name)s_type' "\ + "id='id_%(name)s_way' value='way'%(way_selected)s/> <label "\ + "for='id_%(name)s_way'>%(way)s</label></div>" % vals help_msg = _( - u"Enter an OSM \"tag=value\" string such as " - u"\"amenity=pub\". A list of common tag is available " - u"<a href='https://wiki.openstreetmap.org/wiki/Map_Features' " - u" target='_blank'>here</a>.") - tpl += u"<p class='help-osm'>%s</p>\n" % help_msg - tpl += u"<div class='input-osm'><label for='id_%s_tag'>%s</label>"\ - u"<input type='text' id='id_%s_tag' value=\"%s\"/></div>" % ( - name, _(u"Tag:"), name, self.xapi_tag) - tpl += u"<script type='text/javascript'>\n" - tpl += u"var default_xapi='%s';" % settings.CHIMERE_XAPI_URL - tpl += u'var msg_missing_area = "%s";' % \ - _(u"You have to select an area.") - tpl += u'var msg_missing_type = "%s";' % \ - _(u"You have to select a type.") - tpl += u'var msg_missing_filtr = "%s";' % \ - _(u"You have to insert a filter tag.") - tpl += u"</script>\n" - help_msg = _(u"If you change the above form don't forget to refresh " - u"before submit!") - tpl += u"<p class='help-osm errornote'>%s</p>\n" % help_msg - help_msg = _(u"You can put a Folder name of the KML file to filter on " - u"it.") - tpl += u"<p class='help-kml'>%s</p>\n" % help_msg + "Enter an OSM \"tag=value\" string such as " + "\"amenity=pub\". A list of common tag is available " + "<a href='https://wiki.openstreetmap.org/wiki/Map_Features' " + " target='_blank'>here</a>.") + tpl += "<p class='help-osm'>%s</p>\n" % help_msg + tpl += "<div class='input-osm'><label for='id_%s_tag'>%s</label>"\ + "<input type='text' id='id_%s_tag' value=\"%s\"/></div>" % ( + name, _("Tag:"), name, self.xapi_tag) + tpl += "<script type='text/javascript'>\n" + tpl += "var default_xapi='%s';" % settings.CHIMERE_XAPI_URL + tpl += 'var msg_missing_area = "%s";' % \ + _("You have to select an area.") + tpl += 'var msg_missing_type = "%s";' % \ + _("You have to select a type.") + tpl += 'var msg_missing_filtr = "%s";' % \ + _("You have to insert a filter tag.") + tpl += "</script>\n" + help_msg = _("If you change the above form don't forget to refresh " + "before submit!") + tpl += "<p class='help-osm errornote'>%s</p>\n" % help_msg + help_msg = _("You can put a Folder name of the KML file to filter on " + "it.") + tpl += "<p class='help-kml'>%s</p>\n" % help_msg if not value: value = '' - tpl += u"<div><textarea id='id_%s' name='id_%s' "\ - u">%s</textarea> <input type='button' id='id_refresh_%s' "\ - u"value='%s' class='input-osm'/>" % (name, name, value, name, - _(u"Refresh")) + tpl += "<div><textarea id='id_%s' name='id_%s' "\ + ">%s</textarea> <input type='button' id='id_refresh_%s' "\ + "value='%s' class='input-osm'/>" % (name, name, value, name, + _("Refresh")) return mark_safe(tpl) def value_from_datadict(self, data, files, name): @@ -762,17 +768,17 @@ class MultiSelectWidget(forms.SelectMultiple): def render(self, name, value, attrs=None): rendered = super(MultiSelectWidget, self).render(name, value, attrs) - rendered += u"<hr class='spacer'/><script type='text/javascript'>\n"\ - u"$.bsmSelect.conf['title'] = \"%(title)s\";\n"\ - u"$(\"#id_%(name)s\").bsmSelect({\n"\ - u" removeLabel: '<strong>X</strong>',\n"\ - u" containerClass: 'bsmContainer',\n"\ - u" listClass: 'bsmList-custom',\n"\ - u" listItemClass: 'bsmListItem-custom',\n"\ - u" listItemLabelClass: 'bsmListItemLabel-custom',\n"\ - u" removeClass: 'bsmListItemRemove-custom'\n"\ - u"});\n"\ - u"</script>\n" % {'name': name, 'title': _("Select...")} + rendered += "<hr class='spacer'/><script type='text/javascript'>\n"\ + "$.bsmSelect.conf['title'] = \"%(title)s\";\n"\ + "$(\"#id_%(name)s\").bsmSelect({\n"\ + " removeLabel: '<strong>X</strong>',\n"\ + " containerClass: 'bsmContainer',\n"\ + " listClass: 'bsmList-custom',\n"\ + " listItemClass: 'bsmListItem-custom',\n"\ + " listItemLabelClass: 'bsmListItemLabel-custom',\n"\ + " removeClass: 'bsmListItemRemove-custom'\n"\ + "});\n"\ + "</script>\n" % {'name': name, 'title': _("Select...")} return mark_safe(rendered) @@ -785,9 +791,3 @@ class SelectMultipleField(models.ManyToManyField): defaults = {'widget': MultiSelectWidget} keys.update(defaults) return super(SelectMultipleField, self).formfield(**keys) - -from south.modelsinspector import add_introspection_rules -add_introspection_rules([], ["^chimere\.widgets\.PointField"]) -add_introspection_rules([], ["^chimere\.widgets\.SelectMultipleField"]) -add_introspection_rules([], ["^chimere\.widgets\.RouteField"]) -add_introspection_rules([], ["^chimere\.widgets\.PolygonField"]) diff --git a/chimere_example_project/manage.py b/chimere_example_project/manage.py deleted file mode 100755 index 20f85bc..0000000 --- a/chimere_example_project/manage.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -import os, sys -from django.core.management import execute_manager -sys.path.insert(0, os.path.abspath('./..')) - -try: - import settings # Assumed to be in the same directory. - if settings.DEBUG: - sys.path.insert(0, os.path.abspath('./../chimere')) - sys.path.insert(0, os.path.abspath('./../../geo-django-fla/')) -except ImportError: - import sys - sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) - sys.exit(1) - -if __name__ == "__main__": - execute_manager(settings) diff --git a/chimere_example_project/project_static/.project_static b/chimere_example_project/project_static/.project_static deleted file mode 100644 index e69de29..0000000 --- a/chimere_example_project/project_static/.project_static +++ /dev/null diff --git a/chimere_example_project/chimere_example_static/chimere/css/form-compat.css b/chimere_example_project/static/chimere/css/form-compat.css index f83672f..f83672f 100644 --- a/chimere_example_project/chimere_example_static/chimere/css/form-compat.css +++ b/chimere_example_project/static/chimere/css/form-compat.css diff --git a/chimere_example_project/chimere_example_static/chimere/img/layer-switcher-maximize.png b/chimere_example_project/static/chimere/img/layer-switcher-maximize.png Binary files differindex 326f243..326f243 100644 --- a/chimere_example_project/chimere_example_static/chimere/img/layer-switcher-maximize.png +++ b/chimere_example_project/static/chimere/img/layer-switcher-maximize.png diff --git a/chimere_example_project/chimere_example_static/chimere/img/logo.jpg b/chimere_example_project/static/chimere/img/logo.jpg Binary files differindex cc2ff36..cc2ff36 100644 --- a/chimere_example_project/chimere_example_static/chimere/img/logo.jpg +++ b/chimere_example_project/static/chimere/img/logo.jpg diff --git a/chimere_example_project/chimere_example_static/chimere/img/minus.png b/chimere_example_project/static/chimere/img/minus.png Binary files differindex e8ebf51..e8ebf51 100755 --- a/chimere_example_project/chimere_example_static/chimere/img/minus.png +++ b/chimere_example_project/static/chimere/img/minus.png diff --git a/chimere_example_project/chimere_example_static/chimere/img/plus.png b/chimere_example_project/static/chimere/img/plus.png Binary files differindex b26a6f9..b26a6f9 100755 --- a/chimere_example_project/chimere_example_static/chimere/img/plus.png +++ b/chimere_example_project/static/chimere/img/plus.png diff --git a/chimere_example_project/chimere_example_static/chimere/js/interface.js b/chimere_example_project/static/chimere/js/interface.js index c0c00bf..c0c00bf 100644 --- a/chimere_example_project/chimere_example_static/chimere/js/interface.js +++ b/chimere_example_project/static/chimere/js/interface.js diff --git a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.eot b/chimere_example_project/static/fonts/glyphicons-halflings-regular.eot Binary files differindex 4a4ca86..4a4ca86 100644 --- a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.eot +++ b/chimere_example_project/static/fonts/glyphicons-halflings-regular.eot diff --git a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.svg b/chimere_example_project/static/fonts/glyphicons-halflings-regular.svg index 89d2909..89d2909 100644 --- a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.svg +++ b/chimere_example_project/static/fonts/glyphicons-halflings-regular.svg diff --git a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.ttf b/chimere_example_project/static/fonts/glyphicons-halflings-regular.ttf Binary files differindex 67fa00b..67fa00b 100644 --- a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.ttf +++ b/chimere_example_project/static/fonts/glyphicons-halflings-regular.ttf diff --git a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.woff b/chimere_example_project/static/fonts/glyphicons-halflings-regular.woff Binary files differindex 8c54182..8c54182 100644 --- a/chimere_example_project/chimere_example_static/fonts/glyphicons-halflings-regular.woff +++ b/chimere_example_project/static/fonts/glyphicons-halflings-regular.woff diff --git a/chimere_example_project/urls.py b/chimere_example_project/urls.py index 22d9111..df2822f 100644 --- a/chimere_example_project/urls.py +++ b/chimere_example_project/urls.py @@ -18,7 +18,7 @@ # See the file COPYING for details. from django.conf import settings -from django.conf.urls.defaults import * +from django.conf.urls import patterns, url, include from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns diff --git a/chimere_example_project/wsgi.py b/chimere_example_project/wsgi.py deleted file mode 100644 index 093cc8a..0000000 --- a/chimere_example_project/wsgi.py +++ /dev/null @@ -1,11 +0,0 @@ -import os, sys - -MAIN_PATH = os.path.realpath(os.path.dirname(__file__)) + "/.." -sys.path.append(MAIN_PATH) -if not "DJANGO_SETTINGS_MODULE" in os.environ or \ - not os.environ['DJANGO_SETTINGS_MODULE']: - # change with your project name - os.environ['DJANGO_SETTINGS_MODULE'] = 'mychimere_project.settings' -import django.core.handlers.wsgi -application = django.core.handlers.wsgi.WSGIHandler() - diff --git a/chimere_example_project/local_settings.py.gitlab-ci b/local_settings.py.gitlab-ci index 9ad355a..5abd801 100644 --- a/chimere_example_project/local_settings.py.gitlab-ci +++ b/local_settings.py.gitlab-ci @@ -1,6 +1,8 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +SECRET_KEY = "Not so secret..." + DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', diff --git a/chimere_example_project/local_settings.py.pip.sample b/local_settings.py.pip.sample index 747427f..747427f 100644 --- a/chimere_example_project/local_settings.py.pip.sample +++ b/local_settings.py.pip.sample diff --git a/chimere_example_project/local_settings.py.sample b/local_settings.py.sample index 33a4989..385a774 100644 --- a/chimere_example_project/local_settings.py.sample +++ b/local_settings.py.sample @@ -3,9 +3,6 @@ # rename this file to local_settings.py and overload settings in this file - -ROOT_URLCONF = 'chimere_example_project.urls' - STATIC_URL = '/static/' CHIMERE_OSM_API_URL = 'api06.dev.openstreetmap.org' # test URL diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..75c7cb7 --- /dev/null +++ b/manage.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import os +import sys + + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/requirements.txt b/requirements.txt index 9b5ca45..4c314f4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,12 @@ -django>=1.4,<1.4.99 -beautifulsoup +django>=1.8,<1.8.99 +beautifulsoup4==4.3.2 psycopg2 -Pillow -lxml -south>=0.7.3,<0.7.99 -simplejson +Pillow==3.3 +lxml==3.4 feedparser==5.2.1 -django-tinymce +django-tinymce==1.5.3 icalendar==3.8 chardet==2.3 +py3exiv2==0.2.1 +gdal==1.10 +osmapi==0.6.2 diff --git a/requirements_searchengine.txt b/requirements_searchengine.txt index 3383004..4d17bf8 100644 --- a/requirements_searchengine.txt +++ b/requirements_searchengine.txt @@ -1,13 +1,15 @@ -django>=1.4,<1.4.99 -beautifulsoup +django>=1.8,<1.8.99 +beautifulsoup4==4.3.2 psycopg2 -pil -lxml -south>=0.7.3,<0.7.99 -simplejson -feedparser -django-tinymce -django-haystack==2.1 -geopy -pysolr +Pillow==3.3 +lxml==3.4 +feedparser==5.2.1 +django-tinymce==1.5.3 +django-haystack==2.3 +geopy==1.3 +pysolr==3.2 icalendar==3.8 +chardet==2.3 +py3exiv2==0.2.1 +gdal==1.10 +osmapi==0.6.2 diff --git a/chimere_example_project/settings.py b/settings.py index 260905a..39e7ceb 100644 --- a/chimere_example_project/settings.py +++ b/settings.py @@ -5,7 +5,6 @@ # overload all theses settings in your local_settings.py file import os -import sys _ = lambda s: s DEBUG = False @@ -24,10 +23,6 @@ CONTACT_EMAIL = '' STATIC_URL = '/static/' STATIC_ROOT = ROOT_PATH + 'static/' -STATICFILES_DIRS = ( - os.path.join(ROOT_PATH, "chimere_example_static"), -) - TINYMCE_URL = '' JQUERY_JS_URLS = ('/javascript/jquery/jquery.js', '/javascript/jquery-ui/jquery-ui.js',) @@ -161,9 +156,9 @@ CHIMERE_MODIF_EMAIL = _(u"Hello, I would like to propose you a modification " u"about this item: ") CHIMERE_ROUTING_WARN_MESSAGE = "<h3 class='warn'>Attention</h3>"\ - "<p>Cet itineraire comporte des passages dangereux, nous vous conseillons"\ + "<p>Cet itinéraire comporte des passages dangereux, nous vous conseillons"\ " de modifier votre recherche, en ajoutant par exemple un ou des points "\ - "d'etape à votre parcours pour eviter les zones de danger.</p>" + "d'étape à votre parcours pour éviter les zones de danger.</p>" CHIMERE_CSV_ENCODING = 'ISO-8859-1' @@ -228,12 +223,10 @@ MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.middleware.doc.XViewMiddleware', + 'django.contrib.admindocs.middleware.XViewMiddleware', 'django.contrib.messages.middleware.MessageMiddleware' ] -ROOT_URLCONF = 'chimere_example_project.urls' - TEMPLATE_DIRS = [ ROOT_PATH + 'templates', ] @@ -270,21 +263,27 @@ except ImportError: pass INSTALLED_APPS += [ - 'south', 'chimere', ] LOG_PATH = '/var/log/django/' MOBILE_DOMAINS = [] # if you have specific domains for mobile access +PROJECT_APP = 'chimere_example_project' +LOGFILE_NAME = "" try: from local_settings import * -except ImportError, e: - print 'Unable to load local_settings.py:', e +except ImportError as e: + print('Unable to load local_settings.py:', e) + + +ROOT_URLCONF = PROJECT_APP + '.urls' + +INSTALLED_APPS.insert(INSTALLED_APPS.index('chimere'), PROJECT_APP) if CHIMERE_SEARCH_ENGINE: - INSTALLED_APPS.insert(INSTALLED_APPS.index('south'), 'haystack') + INSTALLED_APPS.append('haystack') if 'LOGGING' not in globals(): global LOGGING @@ -329,6 +328,8 @@ if 'LOGGING' not in globals(): }, } +if LOGFILE_NAME: + LOGGING['handlers']['logfile']['filename'] = LOGFILE_NAME if 'CHIMERE_SHARE_NETWORKS' not in globals(): # after the locals to get the right STATIC_URL @@ -352,23 +353,24 @@ if 'OSM_MOBILE_JS_URLS' not in globals(): "http://www.openstreetmap.org/openlayers/OpenStreetMap.js"] if DEBUG_TOOLBAR: - if '..' not in sys.path: - sys.path.insert(0, '..') global DEBUG_TOOLBAR_PANELS global DEBUG_TOOLBAR_CONFIG MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware'] INSTALLED_APPS += ['debug_toolbar'] - DEBUG_TOOLBAR_PANELS = ( - 'debug_toolbar.panels.version.VersionDebugPanel', - 'debug_toolbar.panels.timer.TimerDebugPanel', - 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel', - 'debug_toolbar.panels.headers.HeaderDebugPanel', - 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel', - 'debug_toolbar.panels.template.TemplateDebugPanel', - 'debug_toolbar.panels.sql.SQLDebugPanel', - 'debug_toolbar.panels.signals.SignalDebugPanel', - 'debug_toolbar.panels.logger.LoggingPanel', - ) + DEBUG_TOOLBAR_PANELS = [ + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', + ] DEBUG_TOOLBAR_CONFIG = {'INTERCEPT_REDIRECTS': False} @@ -0,0 +1,6 @@ +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() |