diff options
| -rw-r--r-- | chimere/admin.py | 2 | ||||
| -rw-r--r-- | chimere/locale/fr/LC_MESSAGES/django.po | 396 | ||||
| -rw-r--r-- | chimere/migrations/0032_auto__add_field_subcategory_submission.py | 227 | ||||
| -rw-r--r-- | chimere/models.py | 51 | ||||
| -rw-r--r-- | chimere/static/chimere/css/styles.css | 18 | ||||
| -rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 4 | ||||
| -rw-r--r-- | chimere/static/chimere/js/textareas.js | 2 | ||||
| -rw-r--r-- | chimere/tasks.py | 7 | ||||
| -rw-r--r-- | chimere/templates/chimere/blocks/map.html (renamed from chimere/templates/chimere/blocks/map_params.html) | 10 | ||||
| -rw-r--r-- | chimere/templates/chimere/blocks/welcome.html | 4 | ||||
| -rw-r--r-- | chimere/templates/chimere/detail.html | 4 | ||||
| -rw-r--r-- | chimere/templates/chimere/feeds/rss_descr.html | 4 | ||||
| -rw-r--r-- | chimere/templates/chimere/main_map.html | 2 | ||||
| -rw-r--r-- | chimere/templatetags/chimere_tags.py | 8 | ||||
| -rw-r--r-- | chimere/utils.py | 6 | ||||
| -rw-r--r-- | chimere/views.py | 6 | 
16 files changed, 550 insertions, 201 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 977a9b4..ae6fbc4 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -117,7 +117,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'] +                       'submiter_name', 'ref_item', 'modified_since_import']      form = MarkerAdminForm      inlines = [MultimediaInline, PictureInline] diff --git a/chimere/locale/fr/LC_MESSAGES/django.po b/chimere/locale/fr/LC_MESSAGES/django.po index 9a3c975..9973efb 100644 --- a/chimere/locale/fr/LC_MESSAGES/django.po +++ b/chimere/locale/fr/LC_MESSAGES/django.po @@ -7,17 +7,17 @@ msgid ""  msgstr ""  "Project-Id-Version: 2.0\n"  "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-09-05 19:08+0200\n" +"POT-Creation-Date: 2012-10-02 19:08+0200\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:586 +#: __init__.py:8 models.py:677  msgid "Multimedia files"  msgstr "Fichiers multimedias" -#: __init__.py:9 models.py:643 +#: __init__.py:9 models.py:733  msgid "Picture files"  msgstr "Fichiers d'image" @@ -45,31 +45,35 @@ msgstr "Flux RSS"  msgid "Contact us"  msgstr "Nous contacter" -#: admin.py:62 templates/chimere/feeds/rss.html:69 +#: admin.py:64 templates/chimere/feeds/rss.html:69  msgid "Validate"  msgstr "Valider" -#: admin.py:73 +#: admin.py:75  msgid "Export to KML"  msgstr "Exporter en KML" -#: admin.py:87 +#: admin.py:89  msgid "Export to Shapefile"  msgstr "Exporter en Shapefile" -#: admin.py:173 +#: admin.py:99 +msgid "Export to CSV" +msgstr "Exporter en CSV" + +#: admin.py:182  msgid "Import"  msgstr "Import" -#: admin.py:179 +#: admin.py:188  msgid "Cancel import"  msgstr "Annuler l'import" -#: admin.py:185 +#: admin.py:194  msgid "Cancel export"  msgstr "Annuler l'export" -#: admin.py:193 +#: admin.py:202  msgid "Export to osm"  msgstr "Exporter vers osm" @@ -106,43 +110,44 @@ msgstr "Courriel (optionnel) "  msgid "Object"  msgstr "Objet" -#: forms.py:173 +#: forms.py:183  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:184 +#: forms.py:194  msgid "This field is mandatory for the selected categories"  msgstr "Ce champ est obligatoire pour les catégories sélectionnées" -#: forms.py:445 +#: forms.py:441  msgid "File"  msgstr "Fichier" -#: forms.py:451 +#: forms.py:447  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:456 models.py:50 models.py:98 models.py:158 models.py:179 -#: models.py:192 models.py:206 models.py:298 models.py:520 models.py:576 -#: models.py:620 models.py:737 models.py:975 models.py:987 models.py:1072 -#: templates/chimere/edit.html:39 templates/chimere/edit_route.html:36 +#: forms.py:452 models.py:50 models.py:98 models.py:158 models.py:179 +#: models.py:192 models.py:206 models.py:324 models.py:611 models.py:667 +#: models.py:710 models.py:826 models.py:1119 models.py:1131 models.py:1216 +#: utils.py:444 templates/chimere/edit.html:39 +#: templates/chimere/edit_route.html:36  #: templates/chimere/blocks/alternate_multimedia.html:39  msgid "Name"  msgstr "Nom" -#: forms.py:465 models.py:1024 +#: forms.py:461 models.py:1168  msgid "Area"  msgstr "Zone" -#: forms.py:524 +#: forms.py:520  msgid "Start"  msgstr "Départ" -#: forms.py:525 +#: forms.py:521  msgid "Finish"  msgstr "Arrivée :" -#: forms.py:526 +#: forms.py:522  msgid "Speed"  msgstr "Vitesse" @@ -150,13 +155,13 @@ msgstr "Vitesse"  msgid "Mnemonic"  msgstr "Mnémonique" -#: models.py:53 models.py:99 models.py:180 models.py:207 models.py:309 -#: models.py:524 models.py:993 models.py:1074 models.py:1110 +#: models.py:53 models.py:99 models.py:180 models.py:207 models.py:335 +#: models.py:615 models.py:1137 models.py:1218 models.py:1259  msgid "Available"  msgstr "Disponible" -#: models.py:54 models.py:168 models.py:181 models.py:211 models.py:578 -#: models.py:635 models.py:992 models.py:1061 models.py:1073 +#: models.py:54 models.py:168 models.py:181 models.py:215 models.py:669 +#: models.py:725 models.py:1136 models.py:1205 models.py:1217  msgid "Order"  msgstr "Ordre" @@ -168,15 +173,15 @@ msgstr "Chemin du patron"  msgid "Page"  msgstr "Page" -#: models.py:100 models.py:367 +#: models.py:100 models.py:401  msgid "Is front page"  msgstr "Est en page principale" -#: models.py:102 models.py:1083 +#: models.py:102 models.py:1227  msgid "Date"  msgstr "Date" -#: models.py:104 models.py:577 +#: models.py:104 models.py:668  msgid "Url"  msgstr "Url" @@ -193,7 +198,7 @@ msgstr "Paramètres"  msgid "TinyUrl"  msgstr "Mini-url" -#: models.py:162 models.py:169 models.py:209 +#: models.py:162 models.py:169 models.py:213  msgid "Color theme"  msgstr "Thème de couleur" @@ -209,321 +214,341 @@ msgstr "Couleur"  msgid "Category"  msgstr "Catégorie" -#: models.py:193 models.py:516 models.py:621 models.py:802 +#: models.py:193 models.py:607 models.py:711 models.py:891  #: templates/chimere/blocks/alternate_multimedia.html:43  msgid "Image"  msgstr "Image" -#: models.py:195 models.py:623 models.py:804 +#: models.py:195 models.py:713 models.py:893  msgid "Height"  msgstr "Hauteur" -#: models.py:196 models.py:624 models.py:805 +#: models.py:196 models.py:714 models.py:894  msgid "Width"  msgstr "Largeur" -#: models.py:200 models.py:208 +#: models.py:200 models.py:210  msgid "Icon"  msgstr "Icône" -#: models.py:212 +#: models.py:208 +msgid "Available for submission" +msgstr "Disponible pour soumission" + +#: models.py:211 +msgid "Hover icon" +msgstr "Icône en survol" + +#: models.py:216  msgid "Is dated"  msgstr "Est daté" -#: models.py:213 +#: models.py:217  msgid "Marker"  msgstr "Point d'intérêt" -#: models.py:214 models.py:798 models.py:813 +#: models.py:218 models.py:887 models.py:902  #: templates/chimere/edit_route.html:27  msgid "Route"  msgstr "Trajet" -#: models.py:215 +#: models.py:219  msgid "Both"  msgstr "Mixte" -#: models.py:216 +#: models.py:220  msgid "Item type"  msgstr "Type d'élément" -#: models.py:221 +#: models.py:226  msgid "Sub-category"  msgstr "Sous-catégorie" -#: models.py:222 +#: models.py:227  msgid "Sub-categories"  msgstr "Sous-catégories" -#: models.py:276 +#: models.py:297  msgid "Importer type"  msgstr "Type d'import" -#: models.py:279 models.py:320 +#: models.py:300 models.py:346  msgid "Source"  msgstr "Source" -#: models.py:281 +#: models.py:302  msgid "Filter"  msgstr "Filtre" -#: models.py:284 +#: models.py:304 +msgid "Name by default" +msgstr "Nom par défaut" + +#: models.py:307  msgid "Associated subcategories"  msgstr "Sous-catégories associées" -#: models.py:285 +#: models.py:308 utils.py:447  msgid "State"  msgstr "État" -#: models.py:287 +#: models.py:310  msgid "SRID"  msgstr "SRID" -#: models.py:288 +#: models.py:311  msgid "Zipped file"  msgstr "Fichier zippé" -#: models.py:291 +#: models.py:314  msgid "Importer"  msgstr "Import" -#: models.py:300 +#: models.py:326  msgid "Submitter session key"  msgstr "Clé de session du demandeur" -#: models.py:302 +#: models.py:328  msgid "Submitter name or nickname"  msgstr "Nom ou pseudo du demandeur" -#: models.py:304 +#: models.py:330  msgid "Submitter email"  msgstr "Courriel du demandeur" -#: models.py:306 +#: models.py:332  msgid "Submitter comment"  msgstr "Commentaire du demandeur" -#: models.py:308 +#: models.py:334  msgid "Submited"  msgstr "Soumis" -#: models.py:310 +#: models.py:336  msgid "Modified"  msgstr "Modifié" -#: models.py:311 +#: models.py:337  msgid "Disabled"  msgstr "Désactivé" -#: models.py:312 +#: models.py:338  msgid "Imported"  msgstr "Importé" -#: models.py:313 +#: models.py:339  msgid "Excluded"  msgstr "Exclu" -#: models.py:315 +#: models.py:341  msgid "Status"  msgstr "État" -#: models.py:316 +#: models.py:342  msgid "Import key"  msgstr "Clé d'import" -#: models.py:318 +#: models.py:344  msgid "Import version"  msgstr "Version de l'import" -#: models.py:323 templates/chimere/edit.html:56 +#: models.py:348 +msgid "Modified since last import" +msgstr "Modifié depuis le dernier import" + +#: models.py:350 +msgid "Not to be imported inside OSM" +msgstr "Ne pas importer dans OSM" + +#: models.py:353 templates/chimere/edit.html:56  #: templates/chimere/edit_route.html:52  msgid "Start date"  msgstr "Date de début" -#: models.py:324 +#: models.py:354  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:326 templates/chimere/edit.html:62 +#: models.py:356 templates/chimere/edit.html:62  #: templates/chimere/edit_route.html:58  msgid "End date"  msgstr "Date de fin" -#: models.py:327 +#: models.py:357  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:359 +#: models.py:393  msgid "Reference marker"  msgstr "Point d'intérêt de référence" -#: models.py:360 +#: models.py:394 utils.py:449 utils.py:450  msgid "Localisation"  msgstr "Localisation" -#: models.py:362 +#: models.py:396  msgid "Available Date"  msgstr "Date de mise en disponibilité" -#: models.py:366 templates/chimere/edit.html:49 +#: models.py:400 utils.py:448 templates/chimere/edit.html:49  #: templates/chimere/edit_route.html:46  msgid "Description"  msgstr "Description" -#: models.py:420 models.py:1120 +#: models.py:461 models.py:1269  msgid "Point of interest"  msgstr "Point d'intérêt" -#: models.py:514 +#: models.py:605  msgid "Audio"  msgstr "Audio" -#: models.py:515 +#: models.py:606  msgid "Video"  msgstr "Vidéo" -#: models.py:517 +#: models.py:608  msgid "Other"  msgstr "Autre" -#: models.py:518 +#: models.py:609  msgid "Media type"  msgstr "Type de media" -#: models.py:521 +#: models.py:612  msgid "Mime type"  msgstr "Type mime" -#: models.py:523 +#: models.py:614  msgid "Inside an iframe"  msgstr "À l'intérieur d'un iframe" -#: models.py:527 +#: models.py:618  msgid "Multimedia type"  msgstr "Type de multimedia" -#: models.py:528 +#: models.py:619  msgid "Multimedia types"  msgstr "Types de multimedia" -#: models.py:563 +#: models.py:654  msgid "Extension name"  msgstr "Nom de l'extension" -#: models.py:565 +#: models.py:656  msgid "Associated multimedia type"  msgstr "Type de multimedia associé" -#: models.py:569 +#: models.py:660  msgid "Multimedia extension"  msgstr "Extension de fichier multimedia" -#: models.py:570 +#: models.py:661  msgid "Multimedia extensions"  msgstr "Extensions de fichier multimedia" -#: models.py:580 models.py:625 +#: models.py:671 models.py:715  msgid "Display inside the description?"  msgstr "Apparaît dans la description ?" -#: models.py:585 +#: models.py:676  msgid "Multimedia file"  msgstr "Fichier multimedia" -#: models.py:627 +#: models.py:717  msgid "Thumbnail"  msgstr "Miniature" -#: models.py:631 +#: models.py:721  msgid "Thumbnail height"  msgstr "Hauteur de la miniature" -#: models.py:633 +#: models.py:723  msgid "Thumbnail width"  msgstr "Largeur de la miniature" -#: models.py:642 +#: models.py:732  msgid "Picture file"  msgstr "Fichier d'image" -#: models.py:738 +#: models.py:827  msgid "Raw file (gpx or kml)"  msgstr "Fichier brut (gpx ou kml)" -#: models.py:739 +#: models.py:828  msgid "Simplified file"  msgstr "Fichier simplifié" -#: models.py:741 +#: models.py:830  msgid "KML"  msgstr "KML" -#: models.py:741 +#: models.py:830  msgid "GPX"  msgstr "GPX" -#: models.py:746 +#: models.py:835  msgid "Route file"  msgstr "Fichier de trajet" -#: models.py:747 +#: models.py:836  msgid "Route files"  msgstr "Fichiers de trajet" -#: models.py:797 +#: models.py:886  msgid "Reference route"  msgstr "Trajet de référence" -#: models.py:801 +#: models.py:890  msgid "Associated file"  msgstr "Fichier associé" -#: models.py:976 +#: models.py:1120  msgid "Layer code"  msgstr "Code pour la couche" -#: models.py:982 +#: models.py:1126  msgid "Layer"  msgstr "Couche" -#: models.py:988 +#: models.py:1132  msgid "Area urn"  msgstr "Urn de la zone" -#: models.py:990 templates/chimere/blocks/welcome.html:3 +#: models.py:1134 templates/chimere/blocks/welcome.html:3  msgid "Welcome message"  msgstr "Message d'accueil" -#: models.py:994 +#: models.py:1138  msgid "Upper left corner"  msgstr "Coin en haut à gauche" -#: models.py:996 +#: models.py:1140  msgid "Lower right corner"  msgstr "Coin en bas à droite" -#: models.py:998 +#: models.py:1142  msgid "Default area"  msgstr "Zone par défaut" -#: models.py:999 +#: models.py:1143  msgid "Only one area is set by default"  msgstr "Seule une zone est définie par défaut" -#: models.py:1003 +#: models.py:1147  msgid "Sub-categories checked by default"  msgstr "Sous-catégories cochées par défaut" -#: models.py:1005 +#: models.py:1149  msgid "Sub-categories dynamicaly displayed"  msgstr "Sous-categories affichées dynamiquement" -#: models.py:1006 +#: models.py:1150  msgid ""  "If checked, categories are only displayed in the menu if they are available "  "on the current extent." @@ -531,164 +556,169 @@ msgstr ""  "Si coché, les catégories sont disponibles sur le menu seulement si elles "  "apparaissent sur la zone affichée." -#: models.py:1010 models.py:1077 +#: models.py:1154 models.py:1221  msgid "Restricted to theses sub-categories"  msgstr "Restreindre à ces sous-categories" -#: models.py:1011 +#: models.py:1155  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:1013 +#: models.py:1157  msgid "Link to an external CSS"  msgstr "Lien vers une feuille de style externe" -#: models.py:1015 +#: models.py:1159  msgid "Restrict to the area extent"  msgstr "Restreindre à l'étendue de la zone" -#: models.py:1062 +#: models.py:1206  msgid "Default layer"  msgstr "Couche par défaut" -#: models.py:1066 models.py:1067 +#: models.py:1210 models.py:1211  msgid "Layers"  msgstr "Couches" -#: models.py:1075 +#: models.py:1219  msgid "Mandatory"  msgstr "Obligatoire" -#: models.py:1078 +#: models.py:1222  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:1080 +#: models.py:1224  msgid "Text"  msgstr "Texte" -#: models.py:1081 +#: models.py:1225  msgid "Long text"  msgstr "Texte long" -#: models.py:1082 +#: models.py:1226  msgid "Password"  msgstr "Mot de passe" -#: models.py:1084 +#: models.py:1228  msgid "Choices"  msgstr "Choix" -#: models.py:1092 +#: models.py:1236  msgid "Type"  msgstr "Type" -#: models.py:1097 models.py:1108 models.py:1122 +#: models.py:1241 models.py:1257 models.py:1271  msgid "Property model"  msgstr "Modèle de propriété" -#: models.py:1109 models.py:1123 +#: models.py:1258 models.py:1272  msgid "Value"  msgstr "Valeur" -#: models.py:1115 +#: models.py:1264  msgid "Model property choice"  msgstr "Choix pour les modèles de propriété" -#: models.py:1134 +#: models.py:1283  msgid "Property"  msgstr "Propriété" -#: tasks.py:61 +#: tasks.py:63  msgid "Import pending"  msgstr "Import en attente" -#: tasks.py:62 +#: tasks.py:64  msgid "Import processing"  msgstr "Import en cours" -#: tasks.py:63 +#: tasks.py:65  msgid "Import successfuly done"  msgstr "Import fait avec succès" -#: tasks.py:64 +#: tasks.py:66  #, python-format  msgid " %(new)d new item(s), %(updated)d updated item(s)"  msgstr " %(new)d nouveau(x) élément(s), %(updated)d élément(s) mis à jour" -#: tasks.py:65 +#: tasks.py:67  msgid "Import failed"  msgstr "Import échoué" -#: tasks.py:66 +#: tasks.py:68  msgid "Import canceled"  msgstr "Import annulé" -#: tasks.py:67 +#: tasks.py:69  msgid "Export pending"  msgstr "Export en attente" -#: tasks.py:68 +#: tasks.py:70  msgid "Export processing"  msgstr "Export en cours" -#: tasks.py:69 +#: tasks.py:71  msgid "Export successfuly done"  msgstr "Export réalisé avec succès" -#: tasks.py:70 +#: tasks.py:72  #, python-format  msgid " %(updated)d updated item(s)"  msgstr " %(updated)d éléments mis à jour" -#: tasks.py:71 +#: tasks.py:73  msgid "Export failed"  msgstr "Export échoué" -#: tasks.py:72 +#: tasks.py:74  msgid "Export canceled"  msgstr "Export annulé" -#: utils.py:113 utils.py:161 +#: utils.py:118 utils.py:166  msgid "Bad zip file"  msgstr "Mauvais fichier zip" -#: utils.py:164 +#: utils.py:169  msgid "Missing file(s) inside the zip file"  msgstr "Fichier(s) manquant(s) dans l'archive zip" -#: utils.py:293 +#: utils.py:301  msgid "Error while reading the data source."  msgstr "Erreur lors de la lecture de la source." -#: utils.py:328 +#: utils.py:336  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:385 +#: utils.py:393  msgid "Could not create file!"  msgstr "Ne peut pas créer le fichier !" -#: utils.py:396 +#: utils.py:404  msgid "Failed to create field"  msgstr "Ne peut pas créer un champ" -#: utils.py:467 +#: utils.py:445 templates/chimere/edit.html:44 +#: templates/chimere/edit_route.html:41 +msgid "Categories" +msgstr "Catégories" + +#: utils.py:509  msgid "Nothing to import"  msgstr "Rien à importer" -#: utils.py:547 +#: utils.py:589  msgid "New items imported - validate them before exporting"  msgstr "Nouveaux éléments importés - valider ceux-ci avant d'exporter" -#: utils.py:549 +#: utils.py:591  msgid ""  "There are items from a former import not yet validated - validate them "  "before exporting" @@ -696,23 +726,36 @@ msgstr ""  "Il y a des éléments d'un import précédent pas encore validé - Validez les "  "avant d'exporter" -#: utils.py:559 +#: utils.py:601  msgid "Bad param"  msgstr "Mauvais paramètre" -#: views.py:241 +#: utils.py:616 +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" + +#: utils.py:618 +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" +msgstr "" +"Aucune « bounding box » définie dans la requête XAPI. Si vous êtes sûr de " +"vouloir lancer la requête sur la planète entière fixez la « bounding  box » " +"à -180,-90,180,90" + +#: views.py:268  msgid "There are missing field(s) and/or errors in the submited form."  msgstr "Il y a des champs manquants ou des erreurs dans ce formulaire." -#: views.py:323 +#: views.py:350  msgid "Bad file. Please check it with an external software."  msgstr "Fichier incohérent. Merci de le vérifier avec un logiciel externe." -#: views.py:455 +#: views.py:482  msgid "Comments/request on the map"  msgstr "Commentaires/requètes sur la carte" -#: views.py:458 +#: views.py:485  msgid ""  "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." @@ -721,15 +764,15 @@ msgstr ""  "laissé votre courriel vous serez peut-être contacté bientôt pour plus de "  "détails." -#: views.py:462 +#: views.py:489  msgid "Temporary error. Renew your message later."  msgstr "Erreur temporaire. Réenvoyez votre message plus tard." -#: views.py:620 +#: views.py:641  msgid "No category available in this area."  msgstr "Pas de catégorie disponible sur cette zone." -#: views.py:753 +#: views.py:785  msgid "Incorrect choice in the list"  msgstr "Choix incorrect dans la liste" @@ -851,7 +894,7 @@ msgstr "Erreur interne du serveur"  msgid "Administration de Chimère"  msgstr "Administration de Chimère" -#: templates/chimere/base.html:18 +#: templates/chimere/base.html:19  msgid "You must enable JavaScript in your browser to display Chimère."  msgstr ""  "Vous devez activer le JavaScript dans votre navigateur pour afficher Chimère." @@ -875,15 +918,7 @@ msgstr "Date :"  msgid "Show multimedia gallery"  msgstr "Montrer la galerie multimedia" -#: templates/chimere/detail.html:29 -msgid "Share on" -msgstr "Partager sur" - -#: templates/chimere/detail.html:33 -msgid "Share" -msgstr "Partager" - -#: templates/chimere/detail.html:36 +#: templates/chimere/detail.html:30  msgid "Propose a modification"  msgstr "Proposer une modification" @@ -907,10 +942,6 @@ msgstr "Choisissez une localisation pour ce nouveau site"  msgid "indicates a mandatory field"  msgstr "indique un champ obligatoire" -#: templates/chimere/edit.html:44 templates/chimere/edit_route.html:41 -msgid "Categories" -msgstr "Catégories" -  #: templates/chimere/edit.html:113  msgid "Personal information"  msgstr "Informations personnelles" @@ -1043,6 +1074,14 @@ msgstr "Ce site utilise Chimère"  msgid "Map"  msgstr "Carte" +#: templates/chimere/blocks/map.html:9 +msgid "Loading of the map in progress" +msgstr "Chargement de la carte en cours" + +#: templates/chimere/blocks/map.html:18 +msgid "Permalink" +msgstr "Lien permanent" +  #: templates/chimere/blocks/map_menu.html:5  msgctxt "routing"  msgid "From" @@ -1075,10 +1114,6 @@ msgstr "Zoomer en arrière"  msgid "Center the map here"  msgstr "Centrer la carte ici" -#: templates/chimere/blocks/map_params.html:8 -msgid "Permalink" -msgstr "Lien permanent" -  #: templates/chimere/blocks/multimedia_file.html:19  msgid "Please use a modern browser or install the non free Flash-Plugin."  msgstr "" @@ -1122,6 +1157,14 @@ msgstr "Arrivée :"  msgid "Step"  msgstr "Étape" +#: templates/chimere/blocks/share_bar.html:3 +msgid "Share on" +msgstr "Partager sur" + +#: templates/chimere/blocks/share_bar.html:7 +msgid "Share" +msgstr "Partager" +  #: templates/chimere/blocks/submited.html:3  msgid ""  "Your new proposition/modification has been submited. A moderator will treat " @@ -1182,6 +1225,15 @@ msgstr "Choisir une zone pré-définie"  msgid "Or select the area by zooming and panning this map"  msgstr "Ou sélectionner une zone en zoomant et en se déplaçant sur cette carte" -#: templatetags/chimere_tags.py:64 +#: templates/chimere/feeds/rss_descr.html:6 +msgid "Description:" +msgstr "Description :" + +#: templates/chimere/feeds/rss_descr.html:8 +msgid ":" +msgstr " :" + +#: templatetags/chimere_tags.py:65 +#, python-format  msgid "Welcome to the %s"  msgstr "Bienvenue sur %s" diff --git a/chimere/migrations/0032_auto__add_field_subcategory_submission.py b/chimere/migrations/0032_auto__add_field_subcategory_submission.py new file mode 100644 index 0000000..d96e5bb --- /dev/null +++ b/chimere/migrations/0032_auto__add_field_subcategory_submission.py @@ -0,0 +1,227 @@ +# -*- 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 'SubCategory.submission' +        db.add_column('chimere_subcategory', 'submission', +                      self.gf('django.db.models.fields.BooleanField')(default=True), +                      keep_default=False) + + +    def backwards(self, orm): +        # Deleting field 'SubCategory.submission' +        db.delete_column('chimere_subcategory', 'submission') + + +    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', [], {}), +            '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'}, +            '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'}), +            'source': ('django.db.models.fields.CharField', [], {'max_length': '200', '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'}), +            'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), +            'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            '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.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']"}), +            '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'}, +            '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'}), +            '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'}), +            'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), +            'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            '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', [], {'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 c11a115..e44b43c 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -204,7 +204,9 @@ class SubCategory(models.Model):      '''      category = models.ForeignKey(Category, verbose_name=_(u"Category"))      name = models.CharField(_(u"Name"), max_length=150) -    available = models.BooleanField(_(u"Available")) +    available = models.BooleanField(_(u"Available"), default=True) +    submission = models.BooleanField(_(u"Available for submission"), +                                     default=True)      icon = models.ForeignKey(Icon, verbose_name=_(u"Icon"))      hover_icon = models.ForeignKey(Icon, verbose_name=_(u"Hover icon"),                            blank=True, null=True, related_name='subcat_hovered') @@ -225,7 +227,7 @@ class SubCategory(models.Model):          verbose_name_plural = _(u"Sub-categories")      @classmethod -    def getAvailable(cls, item_types=None, area_name=None): +    def getAvailable(cls, item_types=None, area_name=None, public=False):          '''Get list of tuples with first the category and second the associated          subcategories          ''' @@ -235,6 +237,8 @@ class SubCategory(models.Model):              subcategories = subcategories.filter(available=True)          else:              subcategories = subcategories.filter(item_type__in=item_types) +        if public: +            subcategories = subcategories.filter(submission=True)          selected_cats = []          if area_name:              area = Area.objects.get(urn=area_name) @@ -448,6 +452,10 @@ class Marker(GeographicItem):      def short_desc(self):          return shortify(self.description) +    @property +    def geometry(self): +        return self.point.wkt +      class Meta:          ordering = ('status', 'name')          verbose_name = _(u"Point of interest") @@ -549,21 +557,33 @@ class Marker(GeographicItem):          url = reverse('chimere:tiny', args=[area_name, urn])          return url +def geometry_pre_save(cls, pre_save_geom_values): +    def geom_pre_save(sender, **kwargs): +        if not kwargs['instance'] or not kwargs['instance'].pk: +            return +        instance = kwargs['instance'] +        try: +            instance = cls.objects.get(pk=instance.pk) +            pre_save_geom_values[instance.pk] = (instance.name, +                              instance.geometry, instance.import_version) +        except ObjectDoesNotExist: +            pass +    return geom_pre_save +  pre_save_marker_values = {}  def marker_pre_save(sender, **kwargs):      if not kwargs['instance']:          return -    instance = kwargs['instance'] -    pre_save_marker_values[instance.pk] = (instance.name, instance.point, -                                           instance.import_version) +    geometry_pre_save(Marker, pre_save_marker_values)(sender, **kwargs)  pre_save.connect(marker_pre_save, sender=Marker)  def geometry_post_save(pre_save_geom_values):      def geom_post_save(sender, **kwargs): -        if not kwargs['instance']: +        if not kwargs['instance'] \ +           or kwargs['instance'].pk not in pre_save_geom_values:              return          instance = kwargs['instance'] -        name, geometry, import_version = pre_save_geom_values[instance] +        name, geometry, import_version = pre_save_geom_values[instance.pk]          if (instance.import_version != import_version             and instance.modified_since_import):              instance.modified_since_import = False @@ -573,8 +593,13 @@ def geometry_post_save(pre_save_geom_values):              return          if instance.name != name or instance.geometry != geometry:              instance.modified_since_import = True +            instance.save()      return geom_post_save -post_save.connect(geometry_post_save(pre_save_marker_values), sender=Marker) +def marker_post_save(sender, **kwargs): +    if not kwargs['instance']: +        return +    geometry_post_save(pre_save_marker_values)(sender, **kwargs) +post_save.connect(marker_post_save, sender=Marker)  class MultimediaType(models.Model):      MEDIA_TYPES = (('A', _(u"Audio")), @@ -876,6 +901,10 @@ class Route(GeographicItem):          ordering = ('status', 'name')          verbose_name = _(u"Route") +    @property +    def geometry(self): +        return self.point.wkt +      def get_init_multi(self):          if not self.associated_marker.count():              return [] @@ -933,15 +962,13 @@ pre_save_route_values = {}  def route_pre_save(sender, **kwargs):      if not kwargs['instance']:          return -    instance = kwargs['instance'] -    pre_save_route_values[instance.pk] = (instance.name, instance.route, -                                          instance.import_version) +    geometry_pre_save(Route, pre_save_route_values)(sender, **kwargs)  pre_save.connect(route_pre_save, sender=Route)  def route_post_save(sender, **kwargs):      if not kwargs['instance']:          return -    geometry_post_save(pre_save_route_values) +    geometry_post_save(pre_save_route_values)(sender, **kwargs)      instance = kwargs['instance']      marker_fields = [f.attname for f in Marker._meta.fields]      route_fields = [f.attname for f in Route._meta.fields] diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 630818f..c8825d4 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -739,6 +739,24 @@ ul#multimedia_list_content li.multimedia{      background-repeat:no-repeat;  } +#waiting{ /* Fixed position to provide the vertical offset */ +    position:fixed; +    top:40%; +    width:100%; +    z-index:40002; +    display:none; +} + +#waiting-content { +    width:95px; +    position:relative; +    margin:0 auto; +    background-color:white; +    padding:10px 5px 0 5px; +    border:1px solid black; +    text-align:center; +} +  /* openlayer customisation */  .olControlPermalink {      display: block; diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 4c899bb..28da31e 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -499,6 +499,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {          * Load markers and route from DB          */          loadGeoObjects: function () { +            if($('#waiting').length){$('#waiting').show();}              helpers.retrieve_checked_categories();              var ids = settings.checked_categories.join('_');              if (!ids) ids = '0'; @@ -529,6 +530,9 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {                      error: function (data) {                          settings.layerMarkers.clearMarkers();                          settings.layerVectors.removeAllFeatures(); +                    }, +                    complete: function () { +                        if($('#waiting').length){$('#waiting').hide();}                      }                  });          }, diff --git a/chimere/static/chimere/js/textareas.js b/chimere/static/chimere/js/textareas.js index 048718d..e15e7f2 100644 --- a/chimere/static/chimere/js/textareas.js +++ b/chimere/static/chimere/js/textareas.js @@ -22,7 +22,7 @@ tinyMCE.init({      theme : "advanced",      editor_selector : "mceEditor",      relative_urls : false, -    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,bullist,numlist,separator,hr,separator,link", +    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,bullist,numlist,separator,hr,separator,link,image",      theme_advanced_buttons2 : "",      theme_advanced_buttons3 : ""  }); diff --git a/chimere/tasks.py b/chimere/tasks.py index 2d55bfd..d457f6a 100644 --- a/chimere/tasks.py +++ b/chimere/tasks.py @@ -27,6 +27,7 @@ from django.core.exceptions import ObjectDoesNotExist  from django.utils.translation import ugettext_lazy as _  from chimere.models import Importer +from external_utils import OsmApi  def single_instance_task(timeout): @@ -110,7 +111,11 @@ def exporting(importer_pk):          return      importer.state = unicode(IMPORT_MESSAGES['export_process'][0])      importer.save() -    updated_item, error = importer.manager.put() +    error = None +    try: +        updated_item, error = importer.manager.put() +    except OsmApi.ApiError, error: +        pass      if error:          importer.state = unicode(IMPORT_MESSAGES['export_failed'][0]) \                + u" - " + unicode(IMPORT_MESSAGES['export_failed'][1]) % error diff --git a/chimere/templates/chimere/blocks/map_params.html b/chimere/templates/chimere/blocks/map.html index 7608180..f41d9d7 100644 --- a/chimere/templates/chimere/blocks/map_params.html +++ b/chimere/templates/chimere/blocks/map.html @@ -1,4 +1,14 @@  {% load i18n %} +<div id='{{map_id}}'></div> +<script type="text/javascript"> +   $("#{{map_id}}").show(); +</script> +<div id="waiting"> +    <div id="waiting-content"> +        <img src='{{STATIC_URL}}chimere/img/ajax-loader.gif'/> +        <p>{% trans "Loading of the map in progress" %}</p> +    </div> +</div>  <script type="text/javascript">      {% if single_category %}      $(function() {$('#panel').hide()});{% endif %} diff --git a/chimere/templates/chimere/blocks/welcome.html b/chimere/templates/chimere/blocks/welcome.html index 95ad1ac..72d37b3 100644 --- a/chimere/templates/chimere/blocks/welcome.html +++ b/chimere/templates/chimere/blocks/welcome.html @@ -39,10 +39,10 @@ $(function(){                              </div>                              {%endif%}                              {% if news.description %} -                                <p class='description'>{{news.description|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4 table td th tr"|safe}}</p> +                                <p class='description'>{{news.description|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4 table td th tr"|safe}}</p>                              {% endif %}                              {% for property in news.getProperties %} -                                <p class='{{news.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4 table td th tr"|safe }}</p> +                                <p class='{{news.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4 table td th tr"|safe }}</p>                              {% endfor %}                              <p class='marker_link'><a href='{% get_tinyfied_url news area_name %}'>{% trans "See it on the map"%}</a></p>                          {% endif %} diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html index 94270cb..b03dcf2 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -17,10 +17,10 @@      {% if marker.end_date %} - {{marker.end_date|date:"D d M Y"}}</p>{% endif %}</span>      {% endif %}      {% if marker.description %} -    <p class='description'>{{ marker.description|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4 table td tr th"|safe}}</p> +    <p class='description'>{{ marker.description|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4 table td tr th"|safe}}</p>      {% endif %}      {% for property in marker.getProperties %} -    <p id='{{property.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4 table td tr th"|safe}}</p> +    <p id='{{property.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4 table td tr th"|safe}}</p>      {% endfor %}      {% if marker.multimedia_items %}      <a href='#' id='show_gallery_link'>{% trans "Show multimedia gallery" %}</a> diff --git a/chimere/templates/chimere/feeds/rss_descr.html b/chimere/templates/chimere/feeds/rss_descr.html index 48f72df..b157c56 100644 --- a/chimere/templates/chimere/feeds/rss_descr.html +++ b/chimere/templates/chimere/feeds/rss_descr.html @@ -3,9 +3,9 @@  <div id='detail_content'>  {% for picture in obj.pictures.all %}<a href='{{picture.picture.url}}'><img src='{{picture.thumbnailfile.url}}' alt="{{picture.name}}"/></a>{% endfor %}  <ul> -{% if obj.description %}<li class='description'><strong>{% trans "Description:" %}</strong> {{ obj.description|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4"|safe }}</li>{% endif %} +{% if obj.description %}<li class='description'><strong>{% trans "Description:" %}</strong> {{ obj.description|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4"|safe }}</li>{% endif %}  {% for property in obj.getProperties %} -{% if property.value %}<li id='{{property.propertymodel.getNamedId}}'><strong>{{property.propertymodel.name}}{% trans ":"%}</strong> {{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4"|safe }}</li>{% endif %} +{% if property.value %}<li id='{{property.propertymodel.getNamedId}}'><strong>{{property.propertymodel.name}}{% trans ":"%}</strong> {{ property.value|sanitize:"p b i br hr strong em img:src:alt span:style a:href:target ul li ol h1 h2 h3 h4"|safe }}</li>{% endif %}  {% endfor %}  </ul>  </div> diff --git a/chimere/templates/chimere/main_map.html b/chimere/templates/chimere/main_map.html index a0ecffc..70e8850 100644 --- a/chimere/templates/chimere/main_map.html +++ b/chimere/templates/chimere/main_map.html @@ -42,7 +42,7 @@     $("#main-map").show();  </script>      {% map_menu %} -    {% map_params %} +    {% map 'main-map' %}  {% endblock %}  {% block footer %}      <p class='map-footer'>{% include "chimere/blocks/footer.html" %}</p> diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index f2221b2..dce4c4d 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -153,10 +153,10 @@ def routing(context):      context_data['STATIC_URL'] = settings.STATIC_URL      return context_data -@register.inclusion_tag('chimere/blocks/map_params.html', takes_context=True) -def map_params(context): -    context_data =  {} -    context_data['STATIC_URL'] = settings.STATIC_URL +@register.inclusion_tag('chimere/blocks/map.html', takes_context=True) +def map(context, map_id='map'): +    context_data =  {'map_id':map_id, +                     "STATIC_URL": settings.STATIC_URL}      context_data['icon_offset_x'] = settings.CHIMERE_ICON_OFFSET_X      context_data['icon_offset_y'] = settings.CHIMERE_ICON_OFFSET_Y      context_data['icon_width'] = settings.CHIMERE_ICON_WIDTH diff --git a/chimere/utils.py b/chimere/utils.py index 423ea85..4cd6f45 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -222,6 +222,9 @@ class KMLManager(ImportManager):              for item in placemark:                  if item.tag == ns + 'name':                      name = item.text +                    if not pl_id: +                        # if no ID is provided assume that name is a key +                        pl_id = name                  elif item.tag == ns + 'description':                      description = item.text                  elif item.tag == ns + 'Point': @@ -621,7 +624,8 @@ class OSMManager(ImportManager):          for idx, item in enumerate(Marker.objects.filter(status='A',                  point__contained=bbox,                  categories=self.importer_instance.categories.all(), -                not_for_osm=False, modified_since_import=True).all()): +                not_for_osm=False, modified_since_import=True, +                route=None).all()):              dct = default_dct.copy()              dct.update({'lon':item.point.x,                          'lat':item.point.y}) diff --git a/chimere/views.py b/chimere/views.py index fd8f927..7c983a3 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -26,7 +26,7 @@ Views of the project  import datetime  from itertools import groupby -import simplejson +import re  from django.conf import settings  from django.core import serializers @@ -182,7 +182,8 @@ def get_edit_page(redirect_url, item_cls, item_form,              return redir, None, None          if 'area_name' in response_dct:              area_name = response_dct['area_name'] -        subcategories = SubCategory.getAvailable(cat_type, area_name) +        subcategories = SubCategory.getAvailable(cat_type, area_name, +                                                 public=True)          listed_subcats = []          if subcategories:              for cat, subcats in subcategories: @@ -688,6 +689,7 @@ def getTinyfiedUrl(request, parameters, area_name=''):                           if response_dct['area_name'] else '') + '/', urn])      if not url.startswith('http'):          url = get_base_uri(request) + url +    url = re.sub("([^:])\/\/", "\g<1>/", url)      text = settings.PROJECT_NAME      if 'current_feature' in parameters:          for item in parameters.split('&'):  | 
