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('&'): |
