summaryrefslogtreecommitdiff
path: root/chimere
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-12-13 16:08:19 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-12-13 16:08:19 +0100
commit51f788fd4e81186be2f7b7b4459d3d90a7b47bf2 (patch)
tree232659156f76ff7664139d963dac8d8c68e1d43f /chimere
parent70811d699e68c075ed3cae543cbb8b695d386730 (diff)
parent3aaae876d73a9c16d2961bea9ae2012ae0bc5b0e (diff)
downloadChimère-51f788fd4e81186be2f7b7b4459d3d90a7b47bf2.tar.bz2
Chimère-51f788fd4e81186be2f7b7b4459d3d90a7b47bf2.zip
Merge branch 'master' into saclay
Conflicts: chimere/admin.py chimere/locale/fr/LC_MESSAGES/django.po chimere/tests.py chimere/utils.py
Diffstat (limited to 'chimere')
-rw-r--r--chimere/admin.py66
-rw-r--r--chimere/forms.py4
-rw-r--r--chimere/locale/fr/LC_MESSAGES/django.po422
-rw-r--r--chimere/migrations/0040_remove_excluded_status.py242
-rw-r--r--chimere/migrations/0041_auto__add_field_importer_overwrite.py244
-rw-r--r--chimere/models.py17
-rw-r--r--chimere/static/chimere/js/importer_interface.js11
-rw-r--r--chimere/templates/admin/chimere/marker/change_form.html13
l---------chimere/templates/admin/chimere/route/change_form.html1
-rw-r--r--chimere/tests.py103
-rw-r--r--chimere/utils.py37
11 files changed, 899 insertions, 261 deletions
diff --git a/chimere/admin.py b/chimere/admin.py
index 833ba9d..3c24de0 100644
--- a/chimere/admin.py
+++ b/chimere/admin.py
@@ -95,39 +95,44 @@ def export_to_csv(modeladmin, request, queryset):
export_to_csv.short_description = _(u"Export to CSV")
def managed_modified(modeladmin, request, queryset):
+ # not very clean... There is must be a better way to do that
+ redirect_url = request.get_full_path().split('admin_modification')[0]
if queryset.count() != 1:
messages.error(request, _(u"Only one item can be managed at a "
u"time."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
item = queryset.all()[0]
- if not item.status == 'M':
+ if not item.ref_item or item.ref_item == item:
try:
- item = modeladmin.model.objects.get(ref_item=item, status='M')
+ item = modeladmin.model.objects.get(ref_item=item)
except ObjectDoesNotExist:
messages.error(request, _(u"No modified item associated "
u"to the selected item."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
item_ref = item.ref_item
if request.POST.get('rapprochement'):
couple = [(item, item_ref)]
if hasattr(item, 'associated_marker'):
couple.append((item.associated_marker.all()[0],
item_ref.associated_marker.all()[0]))
- updated_keys = dict(request.POST)
+ updated = dict(request.POST)
# clean
for k in ('action', 'rapprochement', 'index', '_selected_action'):
- if k in updated_keys:
- updated_keys.pop(k)
+ if k in updated:
+ updated.pop(k)
for idx, cpl in enumerate(couple):
it, it_ref = cpl
# don't copy geometry of associated items
if idx:
for k in ('route', 'point'):
- if k in updated_keys:
- updated_keys.pop(k)
+ if k in updated:
+ updated.pop(k)
+ updated_keys = updated.keys()
+ if it.status == 'I':
+ updated_keys.append('import_version')
for k in updated_keys:
- if not request.POST[k]:
+ if k != 'import_version' and not request.POST[k]:
continue
if hasattr(it_ref, k):
c_value = getattr(it_ref, k)
@@ -149,7 +154,7 @@ def managed_modified(modeladmin, request, queryset):
it.delete()
item.delete()
messages.success(request, _(u"Modified item traited."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
return render_to_response('admin/chimere/managed_modified.html',
{'item':item, 'item_ref':item_ref},
context_instance=RequestContext(request))
@@ -181,7 +186,7 @@ class MarkerAdmin(admin.ModelAdmin):
exclude = ['submiter_session_key', 'import_key', 'import_version',
'available_date', 'ref_item']
readonly_fields = ['submiter_email', 'submiter_comment', 'import_source',
- 'submiter_name', 'ref_item', 'modified_since_import']
+ 'submiter_name', 'ref_item', 'modified_since_import', 'route']
form = MarkerAdminForm
fieldsets = ((None, {
'fields': ['point', 'name', 'status', 'categories',
@@ -194,10 +199,10 @@ class MarkerAdmin(admin.ModelAdmin):
}),
(_(u"Import"), {
'classes':('collapse',),
- 'fields': ('modified_since_import', 'import_source',
- 'origin', 'license')
+ 'fields': ('not_for_osm', 'modified_since_import',
+ 'import_source', 'origin', 'license')
}),
- (_(u"Advanced options"), {
+ (_(u"Associated items"), {
'classes':('collapse',),
'fields': ('ref_item', 'route',)
}),
@@ -229,7 +234,24 @@ class MarkerAdmin(admin.ModelAdmin):
qs = qs.order_by(*ordering)
return qs.distinct()
-class RouteAdmin(admin.ModelAdmin):
+ def admin_modification(self, request, item_id):
+ '''
+ Redirect to the marker modification form
+ '''
+ return managed_modified(self, request,
+ Marker.objects.filter(pk=item_id))
+ def get_urls(self):
+ from django.conf.urls.defaults import *
+ urls = super(MarkerAdmin, self).get_urls()
+ my_urls = patterns('',
+ url(r'^admin_modification/(?P<item_id>\d+)/$',
+ self.admin_site.admin_view(self.admin_modification),
+ name='admin-modification'),
+ )
+ return my_urls + urls
+
+
+class RouteAdmin(MarkerAdmin):
"""
Specialized the Route field.
"""
@@ -238,7 +260,7 @@ class RouteAdmin(admin.ModelAdmin):
list_filter = ('status', 'categories')
exclude = ['height', 'width']
form = RouteAdminForm
- readonly_fields = ('associated_file',)
+ readonly_fields = ('associated_file', 'ref_item', 'has_associated_marker')
actions = [validate, disable, managed_modified, export_to_kml,
export_to_shapefile, export_to_csv]
fieldsets = ((None, {
@@ -255,12 +277,13 @@ class RouteAdmin(admin.ModelAdmin):
'fields': ('modified_since_import', 'import_source',
'origin', 'license')
}),
- (_(u"Advanced options"), {
+ (_(u"Associated items"), {
'classes':('collapse',),
'fields': ('ref_item', 'associated_file',
'has_associated_marker')
}),
)
+ inlines = []
def queryset(self, request):
qs = self.model._default_manager.get_query_set()
@@ -275,6 +298,13 @@ class RouteAdmin(admin.ModelAdmin):
qs = qs.order_by(*ordering)
return qs
+ def admin_modification(self, request, item_id):
+ '''
+ Redirect to the route modification form
+ '''
+ return managed_modified(self, request,
+ Route.objects.filter(pk=item_id))
+
class LayerInline(admin.TabularInline):
model = AreaLayers
extra = 1
diff --git a/chimere/forms.py b/chimere/forms.py
index 200d2f1..1d403c8 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -154,11 +154,11 @@ class ImporterAdminForm(forms.ModelForm):
if self.cleaned_data.get('importer_type') == 'OSM' and \
not self.cleaned_data.get('filtr'):
raise forms.ValidationError(_(u"For OSM import you must be "\
- u"provide a filter. Select an area and node/way filter."))
+ u"provide a filter. Select an area and node/way filter."))
if self.cleaned_data.get('importer_type') == 'OSM' and \
not RE_XAPI.match(self.cleaned_data.get('filtr')):
raise forms.ValidationError(_(u"For OSM import you must be "\
- u"provide a filter. Select an area and node/way filter."))
+ u"provide a filter. Select an area and node/way filter."))
if self.cleaned_data.get('importer_type') == 'SHP' and \
not self.cleaned_data.get('zipped'):
raise forms.ValidationError(_(u"Shapefiles must be provided in a "\
diff --git a/chimere/locale/fr/LC_MESSAGES/django.po b/chimere/locale/fr/LC_MESSAGES/django.po
index 77a7d19..d15aa9a 100644
--- a/chimere/locale/fr/LC_MESSAGES/django.po
+++ b/chimere/locale/fr/LC_MESSAGES/django.po
@@ -1,23 +1,24 @@
# Chimère
# Copyright (C) 2008-2012
# This file is distributed under the same license as the Chimère package.
-# Étienne Loks <etienne.loks@peacefrogs.net>, 2008-2012.
+# Étienne Loks <etienne.loks@peacefrogs.net>, 2008-2011.
#
msgid ""
msgstr ""
-"Project-Id-Version: 2.0\n"
+"Project-Id-Version: 0.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-11-26 19:26+0100\n"
+"POT-Creation-Date: 2012-12-13 15:52+0100\n"
+"PO-Revision-Date: 2010-03-20 20:00+0100\n"
"Last-Translator: Étienne Loks <etienne.loks@peacefrogs.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: __init__.py:8 models.py:763
+#: __init__.py:8 models.py:768
msgid "Multimedia files"
msgstr "Fichiers multimedias"
-#: __init__.py:9 models.py:835
+#: __init__.py:9 models.py:840
msgid "Picture files"
msgstr "Fichiers d'image"
@@ -45,95 +46,94 @@ msgstr "Flux RSS"
msgid "Contact us"
msgstr "Nous contacter"
-#: admin.py:59
+#: admin.py:54
msgid "Disable"
msgstr "Désactiver"
-#: admin.py:65 templates/admin/chimere/managed_modified.html:44
+#: admin.py:60 templates/admin/chimere/managed_modified.html:44
#: templates/chimere/feeds/rss.html:70
msgid "Validate"
msgstr "Valider"
-#: admin.py:76
+#: admin.py:71
msgid "Export to KML"
msgstr "Exporter en KML"
-#: admin.py:90
+#: admin.py:85
msgid "Export to Shapefile"
msgstr "Exporter en Shapefile"
-#: admin.py:100
+#: admin.py:95
msgid "Export to CSV"
msgstr "Exporter en CSV"
-#: admin.py:104
+#: admin.py:101
msgid "Only one item can be managed at a time."
msgstr "Seul un élément à la fois peut-être géré."
-#: admin.py:113
+#: admin.py:110
msgid "No modified item associated to the selected item."
msgstr "Pas d'élément modifié associé à l'élément sélectionné."
#: admin.py:156
msgid "Modified item traited."
-msgstr "Modifié depuis le dernier import"
+msgstr "Élément modifié traité."
#: admin.py:161
msgid "Managed modified items"
msgstr "Gérer les éléments modifiés"
-#: admin.py:195 admin.py:253
+#: admin.py:195 admin.py:270
msgid "Submitter"
msgstr "Demandeur"
-#: admin.py:200 admin.py:258 admin.py:301
+#: admin.py:200 admin.py:275 admin.py:326
msgid "Import"
msgstr "Import"
-#: admin.py:205 admin.py:263
-msgid "Advanced options"
-msgstr "Options avancées"
+#: admin.py:205 admin.py:280
+msgid "Associated items"
+msgstr "Éléments associés"
-#: admin.py:307
+#: admin.py:332
msgid "Cancel import"
msgstr "Annuler l'import"
-#: admin.py:313
+#: admin.py:338
msgid "Cancel export"
msgstr "Annuler l'export"
-#: admin.py:317
+#: admin.py:342
msgid "Can manage only one OSM export at a time."
msgstr "Ne peux gérer qu'un seul export OSM à la fois."
-#: admin.py:322
+#: admin.py:347
msgid ""
"You must treat all item with the status \"imported\" before exporting to OSM."
msgstr ""
"Vous devez traiter tous les éléments avec le status « importé » avant "
"d'exporter vers OSM."
-#: admin.py:326
+#: admin.py:351
msgid "Only OSM importer are managed for export."
msgstr "Seul les imports de type OSM peuvent être gérés pour les exports."
-#: admin.py:333
+#: admin.py:358
msgid "No point of interest are concerned by this export."
msgstr "Aucun point d'intérêt n'est concerné par cet export."
-#: admin.py:345
+#: admin.py:370
msgid "Export launched."
msgstr "Export lancé."
-#: admin.py:349
+#: admin.py:374
#, python-format
msgid ""
"%s point(s) of interest concerned by this export before bounding box filter."
msgstr ""
-"%s point(s) d'intérêt concerné par cet export (avant le filtre sur la "
-"zone)"
+"%s point(s) d'intérêt concerné par cet export (avant le filtre sur la zone)"
-#: admin.py:354
+#: admin.py:379
msgid "Export to osm"
msgstr "Exporter vers osm"
@@ -149,50 +149,50 @@ msgstr "Nouveaux points d'intérêt de "
msgid "Last points of interest by area"
msgstr "Nouveaux points d'intérêt par zone"
-#: forms.py:90
+#: forms.py:83
msgid "New submission for"
msgstr "Nouvelle proposition pour"
-#: forms.py:91
+#: forms.py:84
#, python-format
msgid "The new item \"%s\" has been submited in the category: "
msgstr "Le nouvel élément « %s » a été proposé dans la catégorie : "
-#: forms.py:93
+#: forms.py:86
msgid "To valid, precise or unvalid this item: "
msgstr "Pour valider, préciser ou rejeter cet élément : "
-#: forms.py:103
+#: forms.py:96
msgid "Email (optional)"
msgstr "Courriel (optionnel) "
-#: forms.py:104
+#: forms.py:97
msgid "Object"
msgstr "Objet"
-#: forms.py:125
+#: forms.py:117
msgid "OSM user"
msgstr "Utilisateur OSM"
-#: forms.py:126 models.py:1452
+#: forms.py:118 models.py:1457
msgid "Password"
msgstr "Mot de passe"
-#: forms.py:130
+#: forms.py:122
msgid "API"
msgstr "API"
-#: forms.py:133
+#: forms.py:125
#, python-format
msgid "Test API - %s"
msgstr "API de test - %s"
-#: forms.py:135
+#: forms.py:127
#, python-format
msgid "Main API - %s"
msgstr "API principale - %s"
-#: forms.py:165 forms.py:169
+#: forms.py:156 forms.py:160
msgid ""
"For OSM import you must be provide a filter. Select an area and node/way "
"filter."
@@ -200,73 +200,73 @@ msgstr ""
"Pour les imports OSM vous devez fournir un filtre. Sélectionnez une zone et "
"un filtre sur les nœuds/routes."
-#: forms.py:173
+#: forms.py:164
msgid "Shapefiles must be provided in a zipped archive."
msgstr ""
"Les fichiers Shapefiles doivent être fournis regroupés dans une archive zip."
-#: forms.py:177
+#: forms.py:168
msgid "You have to set \"source\" or \"source file\" but not both."
msgstr ""
"Vous devez spécifier le champ « Source » ou « Fichier source » mais pas les "
"deux."
-#: forms.py:182
+#: forms.py:173
msgid "You have to set \"source\" or \"source file\"."
msgstr "Vous devez spécifier le champ « Source » ou « Fichier source »."
-#: forms.py:243
+#: forms.py:234
msgid "End date has been set with no start date"
msgstr "Une date de fin a été donnée sans date de début"
-#: forms.py:247
+#: forms.py:238
msgid "End date can't be before start date"
msgstr "La date de fin ne peut pas être antérieure à la date de début"
-#: forms.py:257
+#: forms.py:248
msgid "This field is mandatory for the selected categories"
msgstr "Ce champ est obligatoire pour les catégories sélectionnées"
-#: forms.py:535
+#: forms.py:499
msgid "File"
msgstr "Fichier"
-#: forms.py:541
+#: forms.py:505
msgid "Bad file format: this must be a GPX or KML file"
msgstr "Mauvais format de fichier : KML et GPX sont supportés"
-#: forms.py:546 models.py:53 models.py:101 models.py:163 models.py:184
-#: models.py:197 models.py:212 models.py:362 models.py:697 models.py:753
-#: models.py:812 models.py:928 models.py:1257 models.py:1269 models.py:1442
-#: utils.py:465 templates/admin/chimere/managed_modified.html:23
+#: forms.py:510 models.py:53 models.py:101 models.py:163 models.py:184
+#: models.py:197 models.py:212 models.py:364 models.py:702 models.py:758
+#: models.py:817 models.py:933 models.py:1262 models.py:1274 models.py:1447
+#: utils.py:470 templates/admin/chimere/managed_modified.html:23
#: templates/chimere/edit.html:39 templates/chimere/edit_route.html:36
#: templates/chimere/blocks/alternate_multimedia.html:39
msgid "Name"
msgstr "Nom"
-#: forms.py:555 models.py:1306
+#: forms.py:519 models.py:1311
msgid "Area"
msgstr "Zone"
-#: forms.py:595
+#: forms.py:559
msgid "No area selected."
msgstr "Pas de zone sélectionnée."
-#: forms.py:602
+#: forms.py:566
#, python-format
msgid "The area \"%s\" has the same order, you need to choose another one."
msgstr ""
"La zone « %s » a le même numéro d'ordre, vous devez un choisir un autre."
-#: forms.py:647
+#: forms.py:611
msgid "Start"
msgstr "Départ"
-#: forms.py:648
+#: forms.py:612
msgid "Finish"
-msgstr "Arrivée :"
+msgstr "Arrivée"
-#: forms.py:649
+#: forms.py:613
msgid "Speed"
msgstr "Vitesse"
@@ -274,13 +274,13 @@ msgstr "Vitesse"
msgid "Mnemonic"
msgstr "Mnémonique"
-#: models.py:56 models.py:102 models.py:185 models.py:213 models.py:373
-#: models.py:701 models.py:1275 models.py:1444 models.py:1485
+#: models.py:56 models.py:102 models.py:185 models.py:213 models.py:375
+#: models.py:706 models.py:1280 models.py:1449 models.py:1490
msgid "Available"
msgstr "Disponible"
-#: models.py:57 models.py:173 models.py:186 models.py:230 models.py:755
-#: models.py:827 models.py:1274 models.py:1431 models.py:1443
+#: models.py:57 models.py:173 models.py:186 models.py:230 models.py:760
+#: models.py:832 models.py:1279 models.py:1436 models.py:1448
msgid "Order"
msgstr "Ordre"
@@ -292,15 +292,15 @@ msgstr "Chemin du patron"
msgid "Page"
msgstr "Page"
-#: models.py:103 models.py:456
+#: models.py:103 models.py:457
msgid "Is front page"
msgstr "Est en page principale"
-#: models.py:105 models.py:1453
+#: models.py:105 models.py:1458
msgid "Date"
msgstr "Date"
-#: models.py:107 models.py:754
+#: models.py:107 models.py:759
msgid "Url"
msgstr "Url"
@@ -337,16 +337,16 @@ msgstr "Couleur"
msgid "Category"
msgstr "Catégorie"
-#: models.py:198 models.py:693 models.py:813 models.py:994
+#: models.py:198 models.py:698 models.py:818 models.py:999
#: templates/chimere/blocks/alternate_multimedia.html:43
msgid "Image"
msgstr "Image"
-#: models.py:200 models.py:815 models.py:996
+#: models.py:200 models.py:820 models.py:1001
msgid "Height"
msgstr "Hauteur"
-#: models.py:201 models.py:816 models.py:997
+#: models.py:201 models.py:821 models.py:1002
msgid "Width"
msgstr "Largeur"
@@ -356,13 +356,13 @@ msgstr "Icône"
#: models.py:214
msgid "Available for submission"
-msgstr "Disponible pour proposition"
+msgstr "Disponible pour soumission"
#: models.py:216
msgid "Marker"
msgstr "Point d'intérêt"
-#: models.py:217 models.py:990 models.py:1007
+#: models.py:217 models.py:995 models.py:1012
#: templates/chimere/edit_route.html:27
msgid "Route"
msgstr "Trajet"
@@ -427,287 +427,287 @@ msgstr "SRID"
msgid "Zipped file"
msgstr "Fichier zippé"
-#: models.py:332 models.py:390
+#: models.py:332
+msgid "Overwrite existing data"
+msgstr "Écraser les données existantes"
+
+#: models.py:334 models.py:391
msgid "Origin"
msgstr "Origine"
-#: models.py:334 models.py:392
+#: models.py:336 models.py:393
msgid "License"
msgstr "Licence"
-#: models.py:337
+#: models.py:339
msgid "Associated subcategories"
msgstr "Sous-catégories associées"
-#: models.py:338 utils.py:469
+#: models.py:340 utils.py:474
msgid "State"
msgstr "État"
-#: models.py:340
+#: models.py:342
msgid "Automatically associate a marker to a way"
msgstr "Associer automatiquement un marqueur à une route"
-#: models.py:344
+#: models.py:346
msgid "Importer"
msgstr "Import"
-#: models.py:364
+#: models.py:366
msgid "Submitter session key"
msgstr "Clé de session du demandeur"
-#: models.py:366
+#: models.py:368
msgid "Submitter name or nickname"
msgstr "Nom ou pseudo du demandeur"
-#: models.py:368
+#: models.py:370
msgid "Submitter email"
msgstr "Courriel du demandeur"
-#: models.py:370
+#: models.py:372
msgid "Submitter comment"
msgstr "Commentaire du demandeur"
-#: models.py:372
+#: models.py:374
msgid "Submited"
msgstr "Soumis"
-#: models.py:374
+#: models.py:376
msgid "Modified"
msgstr "Modifié"
-#: models.py:375
+#: models.py:377
msgid "Disabled"
msgstr "Désactivé"
-#: models.py:376
+#: models.py:378
msgid "Imported"
msgstr "Importé"
-#: models.py:377
-msgid "Excluded"
-msgstr "Exclu"
-
-#: models.py:379
+#: models.py:380
msgid "Status"
msgstr "État"
-#: models.py:380
+#: models.py:381
msgid "Import key"
msgstr "Clé d'import"
-#: models.py:382
+#: models.py:383
msgid "Import version"
msgstr "Version de l'import"
-#: models.py:384
+#: models.py:385
msgid "Source"
msgstr "Source"
-#: models.py:386
+#: models.py:387
msgid "Modified since last import"
msgstr "Modifié depuis le dernier import"
-#: models.py:388
-msgid "Not to be imported inside OSM"
-msgstr "Ne pas importer dans OSM"
+#: models.py:389
+msgid "Not to be exported to OSM"
+msgstr "À ne pas exporter vers OSM"
-#: models.py:394 templates/chimere/edit.html:56
+#: models.py:395 templates/chimere/edit.html:56
#: templates/chimere/edit_route.html:52
msgid "Start date"
msgstr "Date de début"
-#: models.py:395
+#: models.py:396
msgid "Not mandatory. Set it for dated item such as event. Format YYYY-MM-DD"
msgstr ""
"Optionnel. Précisez ce champ pour les éléments datés comme un événement. "
"Format du champ : AAAA-MM-JJ"
-#: models.py:397 templates/chimere/edit.html:62
+#: models.py:398 templates/chimere/edit.html:62
#: templates/chimere/edit_route.html:58
msgid "End date"
msgstr "Date de fin"
-#: models.py:398
+#: models.py:399
msgid ""
"Not mandatory. Set it only if you have a multi-day event. Format YYYY-MM-DD"
msgstr ""
"Optionnel. Précisez ce champ seulement pour des événements durant plusieurs "
"jours. Format du champ : AAAA-MM-JJ"
-#: models.py:448
+#: models.py:449
msgid "Reference marker"
msgstr "Point d'intérêt de référence"
-#: models.py:449 utils.py:471
+#: models.py:450 utils.py:476
msgid "Localisation"
msgstr "Localisation"
-#: models.py:451
+#: models.py:452
msgid "Available Date"
msgstr "Date de mise en disponibilité"
-#: models.py:455 utils.py:470 templates/admin/chimere/managed_modified.html:31
+#: models.py:456 utils.py:475 templates/admin/chimere/managed_modified.html:31
#: templates/chimere/edit.html:49 templates/chimere/edit_route.html:46
msgid "Description"
msgstr "Description"
-#: models.py:523 models.py:1495
+#: models.py:524 models.py:1500
msgid "Point of interest"
msgstr "Point d'intérêt"
-#: models.py:691
+#: models.py:696
msgid "Audio"
msgstr "Audio"
-#: models.py:692
+#: models.py:697
msgid "Video"
msgstr "Vidéo"
-#: models.py:694
+#: models.py:699
msgid "Other"
msgstr "Autre"
-#: models.py:695
+#: models.py:700
msgid "Media type"
msgstr "Type de media"
-#: models.py:698
+#: models.py:703
msgid "Mime type"
msgstr "Type mime"
-#: models.py:700
+#: models.py:705
msgid "Inside an iframe"
msgstr "À l'intérieur d'un iframe"
-#: models.py:704
+#: models.py:709
msgid "Multimedia type"
msgstr "Type de multimedia"
-#: models.py:705
+#: models.py:710
msgid "Multimedia types"
msgstr "Types de multimedia"
-#: models.py:714
+#: models.py:719
msgid "Automatic recognition"
msgstr "Reconnaissance automatique"
-#: models.py:740
+#: models.py:745
msgid "Extension name"
msgstr "Nom de l'extension"
-#: models.py:742
+#: models.py:747
msgid "Associated multimedia type"
msgstr "Type de multimedia associé"
-#: models.py:746
+#: models.py:751
msgid "Multimedia extension"
-msgstr "Extension de fichier multimedia"
+msgstr "Extension multimedia"
-#: models.py:747
+#: models.py:752
msgid "Multimedia extensions"
-msgstr "Extensions de fichier multimedia"
+msgstr "Extensions multimedia"
-#: models.py:757 models.py:817
+#: models.py:762 models.py:822
msgid "Display inside the description?"
msgstr "Apparaît dans la description ?"
-#: models.py:762
+#: models.py:767
msgid "Multimedia file"
msgstr "Fichier multimedia"
-#: models.py:819
+#: models.py:824
msgid "Thumbnail"
msgstr "Miniature"
-#: models.py:823
+#: models.py:828
msgid "Thumbnail height"
msgstr "Hauteur de la miniature"
-#: models.py:825
+#: models.py:830
msgid "Thumbnail width"
msgstr "Largeur de la miniature"
-#: models.py:834
+#: models.py:839
msgid "Picture file"
msgstr "Fichier d'image"
-#: models.py:929
+#: models.py:934
msgid "Raw file (gpx or kml)"
msgstr "Fichier brut (gpx ou kml)"
-#: models.py:931
+#: models.py:936
msgid "Simplified file"
msgstr "Fichier simplifié"
-#: models.py:933
+#: models.py:938
msgid "KML"
msgstr "KML"
-#: models.py:933
+#: models.py:938
msgid "GPX"
msgstr "GPX"
-#: models.py:938
+#: models.py:943
msgid "Route file"
msgstr "Fichier de trajet"
-#: models.py:939
+#: models.py:944
msgid "Route files"
msgstr "Fichiers de trajet"
-#: models.py:989
+#: models.py:994
msgid "Reference route"
msgstr "Trajet de référence"
-#: models.py:993
+#: models.py:998
msgid "Associated file"
msgstr "Fichier associé"
-#: models.py:998
+#: models.py:1003
msgid "Has an associated marker"
msgstr "Dispose d'un marqueur associé"
-#: models.py:1258
+#: models.py:1263
msgid "Layer code"
msgstr "Code pour la couche"
-#: models.py:1264
+#: models.py:1269
msgid "Layer"
msgstr "Couche"
-#: models.py:1270
+#: models.py:1275
msgid "Area urn"
msgstr "Urn de la zone"
-#: models.py:1272 templates/chimere/blocks/welcome.html:3
+#: models.py:1277 templates/chimere/blocks/welcome.html:3
msgid "Welcome message"
msgstr "Message d'accueil"
-#: models.py:1276
+#: models.py:1281
msgid "Upper left corner"
msgstr "Coin en haut à gauche"
-#: models.py:1278
+#: models.py:1283
msgid "Lower right corner"
msgstr "Coin en bas à droite"
-#: models.py:1280
+#: models.py:1285
msgid "Default area"
msgstr "Zone par défaut"
-#: models.py:1281
+#: models.py:1286
msgid "Only one area is set by default"
msgstr "Seule une zone est définie par défaut"
-#: models.py:1285
+#: models.py:1290
msgid "Sub-categories checked by default"
msgstr "Sous-catégories cochées par défaut"
-#: models.py:1287
+#: models.py:1292
msgid "Sub-categories dynamicaly displayed"
msgstr "Sous-categories affichées dynamiquement"
-#: models.py:1288
+#: models.py:1293
msgid ""
"If checked, categories are only displayed in the menu if they are available "
"on the current extent."
@@ -715,72 +715,72 @@ msgstr ""
"Si coché, les catégories sont disponibles sur le menu seulement si elles "
"apparaissent sur la zone affichée."
-#: models.py:1292 models.py:1447
+#: models.py:1297 models.py:1452
msgid "Restricted to theses sub-categories"
msgstr "Restreindre à ces sous-categories"
-#: models.py:1293
+#: models.py:1298
msgid "If no sub-category is set all sub-categories are available"
msgstr ""
"Si aucune sous-catégorie n'est définie toutes les sous-catégories sont "
"disponibles"
-#: models.py:1295
+#: models.py:1300
msgid "Link to an external CSS"
msgstr "Lien vers une feuille de style externe"
-#: models.py:1297
+#: models.py:1302
msgid "Restrict to the area extent"
msgstr "Restreindre à l'étendue de la zone"
-#: models.py:1432 widgets.py:88
+#: models.py:1437 widgets.py:88
msgid "Default layer"
msgstr "Couche par défaut"
-#: models.py:1436 models.py:1437
+#: models.py:1441 models.py:1442
msgid "Layers"
msgstr "Couches"
-#: models.py:1445
+#: models.py:1450
msgid "Mandatory"
msgstr "Obligatoire"
-#: models.py:1448
+#: models.py:1453
msgid ""
"If no sub-category is set all the property applies to all sub-categories"
msgstr ""
"Si aucune sous-catégorie n'est précisée, cette propriété est disponible pour "
"toutes les sous-catégories"
-#: models.py:1450
+#: models.py:1455
msgid "Text"
msgstr "Texte"
-#: models.py:1451
+#: models.py:1456
msgid "Long text"
msgstr "Texte long"
-#: models.py:1454
+#: models.py:1459
msgid "Choices"
msgstr "Choix"
-#: models.py:1462
+#: models.py:1467
msgid "Type"
msgstr "Type"
-#: models.py:1467 models.py:1483 models.py:1497
+#: models.py:1472 models.py:1488 models.py:1502
msgid "Property model"
msgstr "Modèle de propriété"
-#: models.py:1484 models.py:1498
+#: models.py:1489 models.py:1503
msgid "Value"
msgstr "Valeur"
-#: models.py:1490
+#: models.py:1495
msgid "Model property choice"
msgstr "Choix pour les modèles de propriété"
-#: models.py:1509
+#: models.py:1514
msgid "Property"
msgstr "Propriété"
@@ -834,69 +834,69 @@ msgstr "Export échoué"
msgid "Export canceled"
msgstr "Export annulé"
-#: utils.py:130 utils.py:179
+#: utils.py:135 utils.py:184
msgid "Bad zip file"
msgstr "Mauvais fichier zip"
-#: utils.py:182
+#: utils.py:187
msgid "Missing file(s) inside the zip file"
msgstr "Fichier(s) manquant(s) dans l'archive zip"
-#: utils.py:223
+#: utils.py:228
msgid "Bad XML file"
msgstr "Mauvais fichier XML"
-#: utils.py:308
+#: utils.py:313
msgid "Error while reading the data source."
msgstr "Erreur lors de la lecture de la source."
-#: utils.py:326
+#: utils.py:331
#, python-format
msgid "SRID cannot be guessed. The default SRID (%s) has been used."
msgstr "Le SRID n'a pu être trouvé. Le SRID par défaut (%s) a été utilisé."
-#: utils.py:347
+#: utils.py:352
msgid "Type of geographic item of this shapefile is not managed by Chimère."
msgstr ""
"Les types des éléments géographiques de ce fichier Shapefile ne sont pas "
"gérés par Chimère."
-#: utils.py:367
+#: utils.py:372
msgid "Bad Shapefile"
msgstr "Mauvais fichier Shapefile"
-#: utils.py:409
+#: utils.py:414
msgid "Could not create file!"
msgstr "Ne peut pas créer le fichier !"
-#: utils.py:420
+#: utils.py:425
msgid "Failed to create field"
msgstr "Ne peut pas créer un champ"
-#: utils.py:466 templates/admin/chimere/managed_modified.html:25
+#: utils.py:471 templates/admin/chimere/managed_modified.html:25
#: templates/chimere/edit.html:44 templates/chimere/edit_route.html:41
#: templates/chimere/main_map.html:13
#: templates/chimere/main_map_simple.html:10
msgid "Categories"
msgstr "Catégories"
-#: utils.py:499
+#: utils.py:504
msgid "Invalid CSV format"
msgstr "Fichier CSV non valide"
-#: utils.py:574
+#: utils.py:579
msgid "RSS feed is not well formed"
msgstr "Flux RSS non valide"
-#: utils.py:649
+#: utils.py:654
msgid "Nothing to import"
msgstr "Rien à importer"
-#: utils.py:737
+#: utils.py:742
msgid "New items imported - validate them before exporting"
msgstr "Nouveaux éléments importés - valider ceux-ci avant d'exporter"
-#: utils.py:739
+#: utils.py:744
msgid ""
"There are items from a former import not yet validated - validate them "
"before exporting"
@@ -904,19 +904,19 @@ msgstr ""
"Il y a des éléments d'un import précédent pas encore validé - Validez les "
"avant d'exporter"
-#: utils.py:751
+#: utils.py:756
msgid "Bad params - programming error"
msgstr "Mauvais paramètres - erreur de programmation"
-#: utils.py:761
+#: utils.py:766
msgid "Bad param"
msgstr "Mauvais paramètre"
-#: utils.py:776
+#: utils.py:781
msgid "No non ambigious tag is defined in the XAPI request"
-msgstr "Aucun « tag » non ambigu n'est défini dans la requête XAPI"
+msgstr "Pas de tag non ambigü définis dans la requête XAPI"
-#: utils.py:778
+#: utils.py:783
msgid ""
"No bounding box is defined in the XAPI request.If you are sure to manage the "
"entire planet set the bounding box to -180,-90,180,90"
@@ -1190,8 +1190,8 @@ msgid ""
"of what you are doing: DON'T EXPORT TO OSM</strong>!"
msgstr ""
"Vérifiez que toutes les données à exporter vers OSM ont une licence "
-"compatible. Vous pouvez exclure certains points d'intérêt en cochant la "
-"case « Ne pas importer dans OSM » sur le formulaire de point d'intérêt. "
+"compatible. Vous pouvez exclure certains points d'intérêt en cochant la case "
+"« Ne pas importer dans OSM » sur le formulaire de point d'intérêt. "
"<strong>Si vous n'êtes pas sûr de ce que vous êtes entrain de faire : "
"N'IMPORTEZ PAS DANS OSM</strong> !"
@@ -1199,6 +1199,18 @@ msgstr ""
msgid "Export to OSM"
msgstr "Exporter vers OSM"
+#: templates/admin/chimere/marker/change_form.html:7
+#: templates/admin/chimere/route/change_form.html:7
+#, python-format
+msgid ""
+"\n"
+"This item has a reference item associated to it. You should treat it via the "
+"<a href='%(rapprochement_form)s'>rapprochement form</a>.\n"
+msgstr ""
+"\n"
+"Cet élément a un élément de référence associé. Vous devriez le traiter via "
+"le <a href='%(rapprochement_form)s'>formulaire de rapprochement</a>.\n"
+
#: templates/admin/chimere/propertymodel/change_form.html:5
msgid ""
"After add/modification of property models you'll have to reload the "
@@ -1249,7 +1261,7 @@ msgstr "Proposer une modification"
#: templates/chimere/detail.html:35
msgid "I would like to propose an amendment for this item:"
-msgstr "Je souhaiterai proposer une modification pour cet élément :"
+msgstr "Je souhaiterais proposer une modification pour cet élément :"
#: templates/chimere/edit.html:20
msgid "Error"
@@ -1298,7 +1310,7 @@ msgstr "Commentaires au sujet de votre proposition"
#: templates/chimere/edit.html:134
msgid "Upload in progress. Please wait..."
-msgstr "Traitement en cours. Veuillez patienter..."
+msgstr "Dépôt en cours. Veuillez patienter..."
#: templates/chimere/edit.html:152 templates/chimere/edit_route.html:77
msgid "Propose"
@@ -1332,7 +1344,7 @@ msgstr "Ajouter"
#: templates/chimere/blocks/alternate_multimedia.html:35
msgid "Add multimedia from your computer or a website"
-msgstr "Ajouter du multimedia depuis votre ordinateur ou un site web"
+msgstr "Ajoutez du multimedia depuis votre ordinateur ou un site web"
#: templates/chimere/blocks/alternate_multimedia.html:36
msgid ""
@@ -1350,7 +1362,7 @@ msgstr "Audio, vidéo, autre..."
#: templates/chimere/blocks/alternate_multimedia.html:47
msgid "Download"
-msgstr "Téléchargement"
+msgstr "Télécharger"
#: templates/chimere/blocks/alternate_multimedia.html:48
msgid "Or"
@@ -1358,19 +1370,19 @@ msgstr "Ou"
#: templates/chimere/blocks/alternate_multimedia.html:80
msgid "You must provide a name."
-msgstr "Vous devez donner un nom."
+msgstr "Vous devez renseigner le nom."
#: templates/chimere/blocks/alternate_multimedia.html:85
msgid "You must choose a media type."
-msgstr "Voux devez choisir un type de média."
+msgstr "Vous devez renseigner un type de fichier média."
#: templates/chimere/blocks/alternate_multimedia.html:91
msgid "You must provide a file or a web address."
-msgstr "Vous devez fournir un fichier ou une adresse web."
+msgstr "Vous devez renseigner un fichier ou une adresse web."
#: templates/chimere/blocks/alternate_multimedia.html:96
msgid "You must provide a web address."
-msgstr "Voux devez donner une adresse web."
+msgstr "Vous devez fournir une adresse web."
#: templates/chimere/blocks/areas.html:4
msgid "Areas:"
@@ -1575,8 +1587,32 @@ msgstr " :"
msgid "Welcome to the %s"
msgstr "Bienvenue sur %s"
+#~ msgid "Advanced options"
+#~ msgstr "Options avancées"
+
+#~ msgid "Excluded"
+#~ msgstr "Exclu"
+
#~ msgid "Topics"
#~ msgstr "Thèmes"
#~ msgid "Administration de Chimère"
#~ msgstr "Administration de Chimère"
+
+#~ msgid "Add/modify a site"
+#~ msgstr "Ajouter ou modifier un site"
+
+#~ msgid "Categorys"
+#~ msgstr "Catégories"
+
+#~ msgid "Theme"
+#~ msgstr "Thème"
+
+#~ msgid "Subtheme"
+#~ msgstr "Sous-thème"
+
+#~ msgid "Subthemes"
+#~ msgstr "Sous-thèmes"
+
+#~ msgid "Themes"
+#~ msgstr "Thèmes"
diff --git a/chimere/migrations/0040_remove_excluded_status.py b/chimere/migrations/0040_remove_excluded_status.py
new file mode 100644
index 0000000..3fda56b
--- /dev/null
+++ b/chimere/migrations/0040_remove_excluded_status.py
@@ -0,0 +1,242 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+class Migration(DataMigration):
+
+ def forwards(self, orm):
+ for marker in orm['chimere.Marker'].objects.filter(status='E'):
+ marker.status = 'D'
+ marker.save()
+ for route in orm['chimere.Route'].objects.filter(status='E'):
+ route.status = 'D'
+ route.save()
+
+ def backwards(self, orm):
+ "No backward change needed."
+
+ 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_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'}),
+ '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'}),
+ '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']
+ symmetrical = True
diff --git a/chimere/migrations/0041_auto__add_field_importer_overwrite.py b/chimere/migrations/0041_auto__add_field_importer_overwrite.py
new file mode 100644
index 0000000..9ae6b84
--- /dev/null
+++ b/chimere/migrations/0041_auto__add_field_importer_overwrite.py
@@ -0,0 +1,244 @@
+# -*- 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 'Importer.overwrite'
+ db.add_column('chimere_importer', 'overwrite',
+ self.gf('django.db.models.fields.BooleanField')(default=False),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Importer.overwrite'
+ db.delete_column('chimere_importer', 'overwrite')
+
+
+ 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_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'}),
+ '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/models.py b/chimere/models.py
index 9113cfe..c393cba 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -329,6 +329,8 @@ class Importer(models.Model):
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"),
+ default=False)
origin = models.CharField(_(u"Origin"), max_length=100,
blank=True, null=True)
license = models.CharField(_(u"License"), max_length=100,
@@ -373,8 +375,7 @@ class GeographicItem(models.Model):
('A', _(u'Available')),
('M', _(u'Modified')),
('D', _(u'Disabled')),
- ('I', _(u'Imported')),
- ('E', _(u"Excluded")))
+ ('I', _(u'Imported')))
STATUS_DCT = dict(STATUS)
status = models.CharField(_(u"Status"), max_length=1, choices=STATUS)
import_key = models.CharField(_(u"Import key"), max_length=200,
@@ -385,7 +386,7 @@ class GeographicItem(models.Model):
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 imported inside OSM"),
+ not_for_osm = models.BooleanField(_(u"Not to be exported to OSM"),
default=False)
origin = models.CharField(_(u"Origin"), max_length=100,
blank=True, null=True)
@@ -639,8 +640,8 @@ class Marker(GeographicItem):
PRE_ATTRS = {
- 'Marker':('name', 'geometry', 'import_version'),
- 'Route':('name', 'geometry', 'import_version'),
+ 'Marker':('name', 'geometry', 'import_version', 'modified_since_import'),
+ 'Route':('name', 'geometry', 'import_version', 'modified_since_import'),
'Area':('urn', 'name'),
}
def geometry_pre_save(cls, pre_save_geom_values):
@@ -669,7 +670,11 @@ def geometry_post_save(pre_save_geom_values):
or kwargs['instance'].pk not in pre_save_geom_values:
return
instance = kwargs['instance']
- name, geometry, import_version = pre_save_geom_values[instance.pk]
+ name, geometry, import_version, modified_since_import = \
+ pre_save_geom_values[instance.pk]
+ # force the reinit of modified_since_import
+ if modified_since_import != instance.modified_since_import:
+ return
if (instance.import_version != import_version
and instance.modified_since_import):
instance.modified_since_import = False
diff --git a/chimere/static/chimere/js/importer_interface.js b/chimere/static/chimere/js/importer_interface.js
index 9dc669f..aa332d4 100644
--- a/chimere/static/chimere/js/importer_interface.js
+++ b/chimere/static/chimere/js/importer_interface.js
@@ -1,18 +1,19 @@
django.jQuery(function($) {
var importer_form_filter = {
OSM:new Array('field-filtr', 'field-default_name', 'field-categories',
- 'field-source'),
+ 'field-source', 'field-overwrite'),
KML:new Array('field-source', 'field-source_file', 'field-default_name',
'field-filtr', 'field-zipped', 'field-origin',
- 'field-license', 'field-categories'),
+ 'field-license', 'field-categories', 'field-overwrite'),
SHP:new Array('field-source', 'field-source_file', 'field-default_name',
'field-zipped', 'field-origin', 'field-srid',
- 'field-license', 'field-categories'),
+ 'field-license', 'field-categories', 'field-overwrite'),
RSS:new Array('field-source', 'field-default_name', 'field-origin',
- 'field-srid', 'field-license', 'field-categories'),
+ 'field-srid', 'field-license', 'field-categories',
+ 'field-overwrite'),
CSV:new Array('field-source', 'field-source_file', 'field-default_name',
'field-origin', 'field-srid', 'field-license',
- 'field-categories')
+ 'field-categories', 'field-overwrite')
}
var map_initialized;
function refresh_importer_form(){
diff --git a/chimere/templates/admin/chimere/marker/change_form.html b/chimere/templates/admin/chimere/marker/change_form.html
new file mode 100644
index 0000000..64c48f9
--- /dev/null
+++ b/chimere/templates/admin/chimere/marker/change_form.html
@@ -0,0 +1,13 @@
+{% extends "admin/change_form.html" %}
+{% load i18n %}
+{% block field_sets %}
+{% if original.ref_item and original.ref_item != orginal %}
+<p class='errornote'>
+{% 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 %}
+</p>
+{% endif %}
+{{ block.super }}
+{% endblock %}
diff --git a/chimere/templates/admin/chimere/route/change_form.html b/chimere/templates/admin/chimere/route/change_form.html
new file mode 120000
index 0000000..21811b6
--- /dev/null
+++ b/chimere/templates/admin/chimere/route/change_form.html
@@ -0,0 +1 @@
+../marker/change_form.html \ No newline at end of file
diff --git a/chimere/tests.py b/chimere/tests.py
index 790eb55..af342c5 100644
--- a/chimere/tests.py
+++ b/chimere/tests.py
@@ -63,7 +63,21 @@ def subcategory_setup():
icon=icon,
order=1,
item_type='M',)
- return [subcategory_1, subcategory_2]
+
+ subcategory_3 = SubCategory.objects.create(category=category,
+ name='Subcategory 3',
+ available=True,
+ icon=icon,
+ order=1,
+ item_type='M',)
+
+ subcategory_4 = SubCategory.objects.create(category=category,
+ name='Subcategory 4',
+ available=True,
+ icon=icon,
+ order=1,
+ item_type='M',)
+ return [subcategory_1, subcategory_2, subcategory_3, subcategory_4]
def marker_setup(sub_categories=[]):
if not sub_categories:
@@ -124,50 +138,73 @@ class ImporterTest:
nb = max([Marker.objects.filter(categories__pk=cat.pk).count(),
Route.objects.filter(categories__pk=cat.pk).count()])
self.assertEqual(nb_by_cat[cat], nb)
-
# update
for importer, awaited_nb in self.marker_importers:
+ importer.overwrite = True
+ importer.save()
nb, nb_updated, res = importer.manager.get()
if awaited_nb == None:
continue
self.assertEqual(nb, 0)
+ # manage overwrite
+ for importer, awaited_nb in self.marker_importers:
+ if not awaited_nb:
+ continue
+ # mimic the modification of one item
+ for cls in (Marker, Route):
+ items = cls.objects.filter(
+ categories=importer.categories.all()[0]
+ ).order_by('-pk').all()
+ if items.count():
+ item = items.all()[0]
+ item.import_version = 99999 # fake version number
+ item.save()
+ # as when the import_version it is considered as an import
+ # modification force the modification flag
+ item.modified_since_import = True
+ item.save()
+ importer.overwrite = False
+ importer.save()
+ nb, nb_updated, res = importer.manager.get()
+ if awaited_nb == None:
+ continue
+ self.assertEqual(nb, 1)
class KMLImporterTest(TestCase, ImporterTest):
def setUp(self):
- subcategory_1, subcategory_2 = subcategory_setup()
+ subcategories = subcategory_setup()
importer1 = Importer.objects.create(importer_type='KML',
source=test_dir_path+'tests/sample.kml',
filtr="Category 1")
- importer1.categories.add(subcategory_1)
+ importer1.categories.add(subcategories[0])
importer2 = Importer.objects.create(importer_type='KML',
source=test_dir_path+'tests/sample.kml',
filtr="Subcategory 1", associate_marker_to_way=True)
- importer2.categories.add(subcategory_1)
- importer2.categories.add(subcategory_2)
+ importer2.categories.add(subcategories[1])
importer3 = Importer.objects.create(importer_type='KML',
source=test_path+'tests/sample.kml',
filtr="Subcategory 3")
- importer3.categories.add(subcategory_2)
+ importer3.categories.add(subcategories[2])
importer4 = Importer.objects.create(importer_type='KML',
source=test_dir_path+'tests/sample.kml.zip', zipped=True)
- importer4.categories.add(subcategory_1)
+ importer4.categories.add(subcategories[3])
self.marker_importers = [(importer1, 1), (importer2, 3), (importer3, 0),
(importer4, 4)]
class ShapefileImporterTest(TestCase, ImporterTest):
def setUp(self):
- self.subcategory_1, self.subcategory_2 = subcategory_setup()
+ self.subcategories = subcategory_setup()
importer = Importer.objects.create(importer_type='SHP',
source=test_dir_path+'tests/sample_nodes.shp.zip', zipped=True)
- importer.categories.add(self.subcategory_1)
+ importer.categories.add(self.subcategories[0])
importer2 = Importer.objects.create(importer_type='SHP',
source=test_dir_path+'tests/sample_ways.shp.zip',
zipped=True)
- importer2.categories.add(self.subcategory_2)
+ importer2.categories.add(self.subcategories[1])
self.marker_importers = [(importer, 29),
(importer2, 5),]
@@ -182,28 +219,30 @@ class ShapefileImporterTest(TestCase, ImporterTest):
importer.associate_marker_to_way = True
importer.save()
nb, nb_updated, res = importer.manager.get()
- nb = Marker.objects.filter(categories__pk=self.subcategory_2.pk).count()
+ nb = Marker.objects.filter(categories__pk=self.subcategories[1].pk
+ ).count()
self.assertEqual(nb, 5)
- Marker.objects.filter(categories__pk=self.subcategory_2.pk).delete()
- Route.objects.filter(categories__pk=self.subcategory_2.pk).delete()
+ Marker.objects.filter(categories__pk=self.subcategories[1].pk).delete()
+ Route.objects.filter(categories__pk=self.subcategories[1].pk).delete()
importer.associate_marker_to_way = False
importer.save()
nb, nb_updated, res = importer.manager.get()
- nb = Marker.objects.filter(categories__pk=self.subcategory_2.pk).count()
+ nb = Marker.objects.filter(categories__pk=self.subcategories[1].pk
+ ).count()
self.assertEqual(nb, 0)
class OSMImporterTest(TestCase, ImporterTest):
def setUp(self):
- subcategory_1, subcategory_2 = subcategory_setup()
+ subcategories = subcategory_setup()
markers = marker_setup()
importer1 = Importer.objects.create(importer_type='OSM',
source=test_dir_path+'tests/sample_nodes.osm')
- importer1.categories.add(subcategory_1)
+ importer1.categories.add(subcategories[0])
importer2 = Importer.objects.create(importer_type='OSM',
source=test_dir_path+'tests/sample_ways.osm')
- importer2.categories.add(subcategory_2)
+ importer2.categories.add(subcategories[1])
importer3 = Importer.objects.create(importer_type='OSM',
source='http://open.mapquestapi.com/xapi/api/0.6/way'\
'[highway=motorway]'\
@@ -215,13 +254,13 @@ class OSMImporterTest(TestCase, ImporterTest):
class GeoRSSImporterTest(TestCase, ImporterTest):
def setUp(self):
- subcategory_1, subcategory_2 = subcategory_setup()
+ subcategories = subcategory_setup()
importer1 = Importer.objects.create(importer_type='RSS',
source=test_dir_path+'tests/georss_simple.xml')
- importer1.categories.add(subcategory_1)
+ importer1.categories.add(subcategories[0])
importer2 = Importer.objects.create(importer_type='RSS',
source=test_dir_path+'tests/eqs7day-M5.xml')
- importer2.categories.add(subcategory_2)
+ importer2.categories.add(subcategories[1])
self.marker_importers = [(importer1, 1), (importer2, 32)]
@@ -405,6 +444,28 @@ class RapprochementTest(TestCase):
for k in new_vals:
self.assertEqual(getattr(ref_marker, k), new_vals[k])
+ def test_managed_modified_imported_markers(self):
+ ref_marker = self.markers[0]
+ new_vals = {'name':"Marker 1 - modified",
+ 'point':GEOSGeometry('SRID=4326;POINT(-4 48)')}
+ values = {'status':'I', 'ref_item':ref_marker, 'import_version':42}
+ values.update(new_vals)
+ modified_marker = Marker.objects.create(**values)
+ self.assertNotEqual(ref_marker.import_version,
+ modified_marker.import_version)
+ modified_marker.categories.add(ref_marker.categories.all()[0])
+ response = self.client.post('/admin/chimere/marker/',
+ data={'action':['managed_modified'],
+ 'index':0, 'rapprochement':1,
+ 'name':1, 'point':1,
+ '_selected_action':[unicode(ref_marker.pk)]
+ })
+ ref_marker = Marker.objects.get(pk=ref_marker.pk)
+ self.assertEqual(Marker.objects.filter(ref_item=ref_marker,
+ status='I').count(), 0)
+ for k in new_vals.keys() + ['import_version']:
+ self.assertEqual(getattr(ref_marker, k), values[k])
+
def test_managed_modified_routes(self):
ref_route = self.routes[0]
new_vals = {'name':"Route 1 - modified",
diff --git a/chimere/utils.py b/chimere/utils.py
index 4a12e37..0d97757 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -83,23 +83,28 @@ class ImportManager:
try:
item = None
if pk:
- try:
- item = cls.objects.get(pk=pk)
- except:
- pass
- if not item:
- item = cls.objects.get(**dct_import)
- if version and item.import_version == int(version):
+ ref_item = cls.objects.get(pk=pk)
+ else:
+ ref_item = cls.objects.get(**dct_import)
+ if version and ref_item.import_version == int(version):
# no update since the last import
- return item, None, None
- for k in values:
- setattr(item, k, values[k])
- try:
- item.save()
- except TypeError:
- # error on data source
- return None, False, False
- updated = True
+ return ref_item, None, None
+ if not self.importer_instance.overwrite \
+ and ref_item.modified_since_import:
+ dct_import['ref_item'] = ref_item
+ else:
+ item = ref_item
+ for k in values:
+ setattr(item, k, values[k])
+ try:
+ item.save()
+ # force the modified_since_import status
+ item.modified_since_import = False
+ item.save()
+ except TypeError:
+ # error on data source
+ return None, False, False
+ updated = True
except ObjectDoesNotExist:
pass
if not item: