diff options
77 files changed, 6082 insertions, 592 deletions
diff --git a/chimere/actions.py b/chimere/actions.py index 0363d54..8ef5338 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -22,21 +22,44 @@ Actions available in the main interface """ from django.conf import settings from django.contrib.auth import models +from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ +from models import Page + class Action: - def __init__(self, id, path, label): + def __init__(self, id, path, label, extra_url_args=[]): self.id, self.path, self.label = id, path, label + self.extra_url_args, self.url = extra_url_args, None + + def update_url(self, area_name): + self.url = reverse(self.path, + args=[area_name + '/' if area_name else ''] + self.extra_url_args) -actions = [(Action('view', '', _('View')), []), - (Action('contribute', 'edit/', _('Contribute')), - (Action('edit', 'edit/', _('Add a new point of interest')), - Action('edit-route', 'edit-route/', _('Add a new route'))), - ),] +default_actions = [(Action('view', 'chimere:index', _('View')), []), + (Action('contribute', 'chimere:edit', _('Contribute')), + (Action('edit', 'chimere:edit', _('Add a new point of interest')), + Action('edit-route', 'chimere:editroute', _('Add a new route'))), + ),] if settings.CHIMERE_FEEDS: - actions.append((Action('rss', 'feeds', _('RSS feeds')), [])) + default_actions.append((Action('rss', 'chimere:feeds-form', + _('RSS feeds')), [])) if settings.EMAIL_HOST: - actions.append((Action('contact', 'contact', _('Contact us')), []),) + default_actions.append((Action('contact', 'chimere:contact', + _('Contact us')), []),) + +def actions(area_name=''): + acts = default_actions[:] + for act, childs in default_actions: + act.update_url(area_name) + for child_act in childs: + child_act.update_url(area_name) + for page in Page.objects.filter(available=True).order_by('order'): + act = Action(page.mnemonic, 'chimere:extra_page', page.title, + [page.mnemonic]) + act.update_url(area_name) + acts.append((act, [])) + return acts diff --git a/chimere/admin.py b/chimere/admin.py index 0f17d30..3c24de0 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -37,15 +37,15 @@ except ImportError: pass from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\ - NewsAdminForm, CategoryAdminForm, ImporterAdminForm, \ - PictureFileAdminForm, MultimediaFileAdminForm, OSMForm + NewsAdminForm, CategoryAdminForm, ImporterAdminForm, OSMForm, \ + PageAdminForm, PictureFileAdminForm, MultimediaFileAdminForm from chimere.models import Category, Icon, SubCategory, Marker, \ PropertyModel, News, Route, Area, ColorTheme, Color, \ MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ + PropertyModelChoice, MultimediaExtension, Page,\ get_areas_for_user, get_users_by_area from chimere.utils import unicode_normalize, ShapefileManager, KMLManager,\ CSVManager -from chimere.widgets import TextareaWidget def disable(modeladmin, request, queryset): for item in queryset: @@ -184,9 +184,9 @@ class MarkerAdmin(admin.ModelAdmin): actions = [validate, disable, managed_modified, export_to_kml, export_to_shapefile, export_to_csv] exclude = ['submiter_session_key', 'import_key', 'import_version', - 'available_date'] + 'available_date', 'ref_item'] readonly_fields = ['submiter_email', 'submiter_comment', 'import_source', - 'ref_item', 'modified_since_import', 'route'] + 'submiter_name', 'ref_item', 'modified_since_import', 'route'] form = MarkerAdminForm fieldsets = ((None, { 'fields': ['point', 'name', 'status', 'categories', @@ -382,11 +382,17 @@ class ImporterAdmin(admin.ModelAdmin): form = ImporterAdminForm list_display = ('display_categories', 'default_name', 'importer_type', 'source', 'state', 'filtr') - list_filter = ('importer_type',) + list_filter = ('importer_type', 'categories') readonly_fields = ('state',) actions = [importing, cancel_import, export_to_osm, cancel_export] admin.site.register(Importer, ImporterAdmin) +class PageAdmin(admin.ModelAdmin): + """ + Use the TinyMCE widget for the page content + """ + form = PageAdminForm + class PropertyModelAdmin(admin.ModelAdmin): list_display = ('name', 'order', 'available') @@ -416,8 +422,16 @@ class ColorThemeAdmin(admin.ModelAdmin): class IconAdmin(admin.ModelAdmin): exclude = ['height', 'width'] + list_display = ['name'] + +class PropertyModelChoiceInline(admin.TabularInline): + model = PropertyModelChoice + extra = 1 +class PropertyModelAdmin(admin.ModelAdmin): + inlines = [PropertyModelChoiceInline] # register of differents database fields +admin.site.register(Page, PageAdmin) admin.site.register(News, NewsAdmin) admin.site.register(Category, CategoryAdmin) admin.site.register(Icon, IconAdmin) diff --git a/chimere/forms.py b/chimere/forms.py index 0d4bba6..1d403c8 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -33,10 +33,11 @@ from django.core.mail import EmailMessage, BadHeaderError from chimere.models import Marker, Route, PropertyModel, Property, Area,\ News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ - PictureFile, Importer, IMPORTER_CHOICES, IFRAME_LINKS, MultimediaExtension + PictureFile, Importer, PropertyModelChoice, IFRAME_LINKS, \ + MultimediaExtension, Page, IMPORTER_CHOICES from chimere.widgets import AreaField, PointField, TextareaWidget, \ - ImportFiltrWidget, TextareaAdminWidget, DatePickerWidget, \ - ImporterChoicesWidget, RE_XAPI + FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget, \ + TextareaAdminWidget, ImportFiltrWidget, ImporterChoicesWidget, RE_XAPI from datetime import timedelta, datetime, tzinfo @@ -54,13 +55,18 @@ class UTC(tzinfo): def dst(self, dt): return ZERO +def getStaffEmails(): + return [u.email for u in + User.objects.filter(is_staff=True).exclude(email="").order_by('id')] + def notifyStaff(subject, body, sender=None): if not settings.EMAIL_HOST: return + user_list = getStaffEmails() + if not user_list: + return if settings.PROJECT_NAME: subject = u'[%s] %s' % (settings.PROJECT_NAME, subject) - user_list = [u.email for u in - User.objects.filter(is_staff=True).exclude(email="").order_by('id')] headers = {} if sender: headers['Reply-To'] = sender @@ -90,6 +96,20 @@ class ContactForm(forms.Form): email = forms.EmailField(label=_("Email (optional)"), required=False) content = forms.CharField(label=_("Object"), widget=forms.Textarea) +class SubCategoryAdminForm(forms.ModelForm): + ''' + Add a tinyMCE widget to fill description + ''' + description = forms.CharField(widget=FullTextareaWidget, required=False) + +class PageAdminForm(forms.ModelForm): + """ + Main form for extra pages + """ + content = forms.CharField(widget=FullTextareaWidget) + class Meta: + model = Page + class OSMForm(forms.Form): """ OSM export form @@ -163,6 +183,9 @@ class CategoryAdminForm(forms.ModelForm): js = list(settings.JQUERY_JS_URLS) + [ '%schimere/js/menu-sort.js' % settings.STATIC_URL, ] + css = { + 'all': ('chimere/css/admin.css',) + } class Meta: model = Category @@ -246,16 +269,32 @@ class MarkerAdminFormBase(forms.ModelForm): return new_marker # As we have dynamic fields, it's cleaner to make the class dynamic too -fields = {} -# declare properties -for prop in PropertyModel.objects.filter(available=True): - key = "property_%d_%d" % (prop.order, prop.id) - fields[key] = forms.CharField(label=prop.name, - widget=PropertyModel.TYPE_WIDGET[prop.type], - required=False) -MarkerAdminForm = type("MarkerAdminForm", (MarkerAdminFormBase,), fields) - -class MarkerForm(MarkerAdminForm): +def get_properties(queryset): + fields = {} + for prop in queryset: + key = "property_%d_%d" % (prop.order, prop.id) + if prop.type == 'C': + choices = PropertyModelChoice.objects.filter(propertymodel=prop, + available=True + ).order_by('value') + fields[key] = forms.ChoiceField(label=prop.name, + choices=[('', '--')] + \ + [(choice.pk, unicode(choice)) + for choice in choices], + required=False) + else: + fields[key] = forms.CharField(label=prop.name, + widget=PropertyModel.TYPE_WIDGET[prop.type], + required=False) + return fields + +# in admin all fields are displayed +MarkerAdminForm = type("MarkerAdminForm", (MarkerAdminFormBase,), + get_properties(PropertyModel.objects.all())) +MarkerBaseForm = type("MarkerBaseForm", (MarkerAdminFormBase,), + get_properties(PropertyModel.objects.filter(available=True))) + +class MarkerForm(MarkerBaseForm): """ Form for the edit page """ @@ -562,3 +601,24 @@ class AreaForm(AreaAdminForm): class Meta: model = Area +CHIMERE_ROUTING_TRANSPORT = [(idx, _(lbl)) + for idx, lbl in settings.CHIMERE_ROUTING_TRANSPORT] + +class RoutingForm(forms.Form): + transport = forms.ChoiceField(label='', widget=ButtonSelectWidget, + choices=CHIMERE_ROUTING_TRANSPORT, + initial=CHIMERE_ROUTING_TRANSPORT[0][0]) + start = forms.CharField(label=_(u"Start"), widget=NominatimWidget) + end = forms.CharField(label=_(u"Finish"), widget=NominatimWidget) + speed = forms.ChoiceField(label=_(u"Speed"), choices=[], + required=False, widget=forms.RadioSelect) + + def __init__(self, *args, **kwargs): + super(RoutingForm, self).__init__(*args, **kwargs) + if not settings.CHIMERE_ROUTING_SPEEDS: + self.fields.pop('speed') + self.fields['speed'].widget.choices = [] + for transport in settings.CHIMERE_ROUTING_SPEEDS: + for speed, lbl in settings.CHIMERE_ROUTING_SPEEDS[transport]: + self.fields['speed'].widget.choices.append( + ("%s_%d" % (transport, speed), _(lbl))) diff --git a/chimere/locale/fr/LC_MESSAGES/django.po b/chimere/locale/fr/LC_MESSAGES/django.po index 64ed511..d15aa9a 100644 --- a/chimere/locale/fr/LC_MESSAGES/django.po +++ b/chimere/locale/fr/LC_MESSAGES/django.po @@ -7,42 +7,42 @@ msgid "" msgstr "" "Project-Id-Version: 0.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-08 00:17+0100\n" +"POT-Creation-Date: 2012-12-13 15:52+0100\n" "PO-Revision-Date: 2010-03-20 20:00+0100\n" "Last-Translator: Étienne Loks <etienne.loks@peacefrogs.net>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: __init__.py:8 models.py:649 +#: __init__.py:8 models.py:768 msgid "Multimedia files" msgstr "Fichiers multimedias" -#: __init__.py:9 models.py:721 +#: __init__.py:9 models.py:840 msgid "Picture files" msgstr "Fichiers d'image" -#: actions.py:31 +#: actions.py:39 msgid "View" msgstr "Voir" -#: actions.py:32 +#: actions.py:40 msgid "Contribute" msgstr "Participer" -#: actions.py:33 +#: actions.py:41 msgid "Add a new point of interest" msgstr "Ajout d'un point remarquable" -#: actions.py:34 +#: actions.py:42 msgid "Add a new route" msgstr "Ajout d'un nouveau trajet" -#: actions.py:38 +#: actions.py:47 msgid "RSS feeds" msgstr "Flux RSS" -#: actions.py:41 +#: actions.py:51 msgid "Contact us" msgstr "Nous contacter" @@ -149,50 +149,50 @@ msgstr "Nouveaux points d'intérêt de " msgid "Last points of interest by area" msgstr "Nouveaux points d'intérêt par zone" -#: forms.py:77 +#: forms.py:83 msgid "New submission for" msgstr "Nouvelle proposition pour" -#: forms.py:78 +#: forms.py:84 #, python-format msgid "The new item \"%s\" has been submited in the category: " msgstr "Le nouvel élément « %s » a été proposé dans la catégorie : " -#: forms.py:80 +#: forms.py:86 msgid "To valid, precise or unvalid this item: " msgstr "Pour valider, préciser ou rejeter cet élément : " -#: forms.py:90 +#: forms.py:96 msgid "Email (optional)" msgstr "Courriel (optionnel) " -#: forms.py:91 +#: forms.py:97 msgid "Object" msgstr "Objet" -#: forms.py:97 +#: forms.py:117 msgid "OSM user" msgstr "Utilisateur OSM" -#: forms.py:98 models.py:1338 +#: forms.py:118 models.py:1457 msgid "Password" msgstr "Mot de passe" -#: forms.py:102 +#: forms.py:122 msgid "API" msgstr "API" -#: forms.py:105 +#: forms.py:125 #, python-format msgid "Test API - %s" msgstr "API de test - %s" -#: forms.py:107 +#: forms.py:127 #, python-format msgid "Main API - %s" msgstr "API principale - %s" -#: forms.py:136 forms.py:140 +#: forms.py:156 forms.py:160 msgid "" "For OSM import you must be provide a filter. Select an area and node/way " "filter." @@ -200,469 +200,514 @@ msgstr "" "Pour les imports OSM vous devez fournir un filtre. Sélectionnez une zone et " "un filtre sur les nœuds/routes." -#: forms.py:144 +#: forms.py:164 msgid "Shapefiles must be provided in a zipped archive." msgstr "" "Les fichiers Shapefiles doivent être fournis regroupés dans une archive zip." -#: forms.py:148 +#: forms.py:168 msgid "You have to set \"source\" or \"source file\" but not both." msgstr "" "Vous devez spécifier le champ « Source » ou « Fichier source » mais pas les " "deux." -#: forms.py:153 +#: forms.py:173 msgid "You have to set \"source\" or \"source file\"." msgstr "Vous devez spécifier le champ « Source » ou « Fichier source »." -#: forms.py:211 +#: forms.py:234 msgid "End date has been set with no start date" msgstr "Une date de fin a été donnée sans date de début" -#: forms.py:215 +#: forms.py:238 msgid "End date can't be before start date" msgstr "La date de fin ne peut pas être antérieure à la date de début" -#: forms.py:225 +#: forms.py:248 msgid "This field is mandatory for the selected categories" msgstr "Ce champ est obligatoire pour les catégories sélectionnées" -#: forms.py:460 +#: forms.py:499 msgid "File" msgstr "Fichier" -#: forms.py:466 +#: forms.py:505 msgid "Bad file format: this must be a GPX or KML file" msgstr "Mauvais format de fichier : KML et GPX sont supportés" -#: forms.py:471 models.py:51 models.py:106 models.py:127 models.py:140 -#: models.py:155 models.py:273 models.py:583 models.py:639 models.py:698 -#: models.py:814 models.py:1143 models.py:1155 models.py:1328 utils.py:469 -#: templates/admin/chimere/managed_modified.html:23 +#: forms.py:510 models.py:53 models.py:101 models.py:163 models.py:184 +#: models.py:197 models.py:212 models.py:364 models.py:702 models.py:758 +#: models.py:817 models.py:933 models.py:1262 models.py:1274 models.py:1447 +#: utils.py:470 templates/admin/chimere/managed_modified.html:23 #: templates/chimere/edit.html:39 templates/chimere/edit_route.html:36 -#: templates/chimere/blocks/alternate_multimedia.html:38 +#: templates/chimere/blocks/alternate_multimedia.html:39 msgid "Name" msgstr "Nom" -#: forms.py:480 models.py:1192 +#: forms.py:519 models.py:1311 msgid "Area" msgstr "Zone" -#: forms.py:520 +#: forms.py:559 msgid "No area selected." msgstr "Pas de zone sélectionnée." -#: forms.py:527 +#: forms.py:566 #, python-format msgid "The area \"%s\" has the same order, you need to choose another one." msgstr "" "La zone « %s » a le même numéro d'ordre, vous devez un choisir un autre." -#: models.py:52 models.py:128 models.py:156 models.py:284 models.py:587 -#: models.py:1161 models.py:1330 +#: forms.py:611 +msgid "Start" +msgstr "Départ" + +#: forms.py:612 +msgid "Finish" +msgstr "Arrivée" + +#: forms.py:613 +msgid "Speed" +msgstr "Vitesse" + +#: models.py:54 +msgid "Mnemonic" +msgstr "Mnémonique" + +#: models.py:56 models.py:102 models.py:185 models.py:213 models.py:375 +#: models.py:706 models.py:1280 models.py:1449 models.py:1490 msgid "Available" msgstr "Disponible" -#: models.py:53 models.py:1339 +#: models.py:57 models.py:173 models.py:186 models.py:230 models.py:760 +#: models.py:832 models.py:1279 models.py:1436 models.py:1448 +msgid "Order" +msgstr "Ordre" + +#: models.py:58 +msgid "Template path" +msgstr "Chemin du patron" + +#: models.py:65 models.py:66 +msgid "Page" +msgstr "Page" + +#: models.py:103 models.py:457 +msgid "Is front page" +msgstr "Est en page principale" + +#: models.py:105 models.py:1458 msgid "Date" msgstr "Date" -#: models.py:55 +#: models.py:107 models.py:759 +msgid "Url" +msgstr "Url" + +#: models.py:108 msgid "Associated areas" msgstr "Zones associées" -#: models.py:61 models.py:62 +#: models.py:114 models.py:115 templates/chimere/blocks/news.html:3 +#: templates/chimere/blocks/news.html:5 msgid "News" msgstr "Nouvelle" -#: models.py:67 +#: models.py:124 msgid "Parameters" msgstr "Paramètres" -#: models.py:71 +#: models.py:128 msgid "TinyUrl" msgstr "Mini-url" -#: models.py:110 models.py:117 models.py:160 +#: models.py:167 models.py:174 models.py:225 msgid "Color theme" msgstr "Thème de couleur" -#: models.py:115 +#: models.py:172 msgid "Code" msgstr "Code" -#: models.py:116 models.py:129 models.py:162 models.py:641 models.py:713 -#: models.py:1160 models.py:1317 models.py:1329 -msgid "Order" -msgstr "Ordre" - -#: models.py:122 +#: models.py:179 msgid "Color" msgstr "Couleur" -#: models.py:135 models.py:153 +#: models.py:192 models.py:210 msgid "Category" msgstr "Catégorie" -#: models.py:141 models.py:579 models.py:699 models.py:880 -#: templates/chimere/blocks/alternate_multimedia.html:42 +#: models.py:198 models.py:698 models.py:818 models.py:999 +#: templates/chimere/blocks/alternate_multimedia.html:43 msgid "Image" msgstr "Image" -#: models.py:143 models.py:701 models.py:882 +#: models.py:200 models.py:820 models.py:1001 msgid "Height" msgstr "Hauteur" -#: models.py:144 models.py:702 models.py:883 +#: models.py:201 models.py:821 models.py:1002 msgid "Width" msgstr "Largeur" -#: models.py:148 models.py:159 +#: models.py:205 models.py:222 msgid "Icon" msgstr "Icône" -#: models.py:157 +#: models.py:214 msgid "Available for submission" msgstr "Disponible pour soumission" -#: models.py:163 +#: models.py:216 msgid "Marker" msgstr "Point d'intérêt" -#: models.py:164 models.py:876 models.py:893 +#: models.py:217 models.py:995 models.py:1012 #: templates/chimere/edit_route.html:27 msgid "Route" msgstr "Trajet" -#: models.py:165 +#: models.py:218 msgid "Both" msgstr "Mixte" -#: models.py:166 +#: models.py:219 msgid "Item type" msgstr "Type d'élément" -#: models.py:171 +#: models.py:220 +msgid "Is dated" +msgstr "Est daté" + +#: models.py:223 +msgid "Hover icon" +msgstr "Icône en survol" + +#: models.py:227 +msgid "Displayed in the layer menu" +msgstr "Apparaît dans le menu des couches ?" + +#: models.py:229 +msgid "Routing warn" +msgstr "Avertissement sur les itinéraires" + +#: models.py:235 msgid "Sub-category" msgstr "Sous-catégorie" -#: models.py:172 +#: models.py:236 msgid "Sub-categories" msgstr "Sous-catégories" -#: models.py:230 +#: models.py:320 msgid "Importer type" msgstr "Type d'import" -#: models.py:232 +#: models.py:322 msgid "Filter" msgstr "Filtre" -#: models.py:234 templates/chimere/blocks/alternate_multimedia.html:48 +#: models.py:324 templates/chimere/blocks/alternate_multimedia.html:49 msgid "Web address" msgstr "Adresse web" -#: models.py:236 +#: models.py:326 msgid "Source file" msgstr "Fichier source" -#: models.py:238 +#: models.py:328 msgid "Name by default" msgstr "Nom par défaut" -#: models.py:240 +#: models.py:330 msgid "SRID" msgstr "SRID" -#: models.py:241 +#: models.py:331 msgid "Zipped file" msgstr "Fichier zippé" -#: models.py:242 +#: models.py:332 msgid "Overwrite existing data" msgstr "Écraser les données existantes" -#: models.py:243 models.py:300 +#: models.py:334 models.py:391 msgid "Origin" msgstr "Origine" -#: models.py:245 models.py:302 +#: models.py:336 models.py:393 msgid "License" msgstr "Licence" -#: models.py:248 +#: models.py:339 msgid "Associated subcategories" msgstr "Sous-catégories associées" -#: models.py:249 utils.py:473 +#: models.py:340 utils.py:474 msgid "State" msgstr "État" -#: models.py:251 +#: models.py:342 msgid "Automatically associate a marker to a way" msgstr "Associer automatiquement un marqueur à une route" -#: models.py:255 +#: models.py:346 msgid "Importer" msgstr "Import" -#: models.py:275 +#: models.py:366 msgid "Submitter session key" msgstr "Clé de session du demandeur" -#: models.py:277 +#: models.py:368 msgid "Submitter name or nickname" msgstr "Nom ou pseudo du demandeur" -#: models.py:279 +#: models.py:370 msgid "Submitter email" msgstr "Courriel du demandeur" -#: models.py:281 +#: models.py:372 msgid "Submitter comment" msgstr "Commentaire du demandeur" -#: models.py:283 +#: models.py:374 msgid "Submited" msgstr "Soumis" -#: models.py:285 +#: models.py:376 msgid "Modified" msgstr "Modifié" -#: models.py:286 +#: models.py:377 msgid "Disabled" msgstr "Désactivé" -#: models.py:287 +#: models.py:378 msgid "Imported" msgstr "Importé" -#: models.py:289 +#: models.py:380 msgid "Status" msgstr "État" -#: models.py:290 +#: models.py:381 msgid "Import key" msgstr "Clé d'import" -#: models.py:292 +#: models.py:383 msgid "Import version" msgstr "Version de l'import" -#: models.py:294 +#: models.py:385 msgid "Source" msgstr "Source" -#: models.py:296 +#: models.py:387 msgid "Modified since last import" msgstr "Modifié depuis le dernier import" -#: models.py:298 +#: models.py:389 msgid "Not to be exported to OSM" msgstr "À ne pas exporter vers OSM" -#: models.py:304 templates/chimere/edit.html:56 +#: models.py:395 templates/chimere/edit.html:56 #: templates/chimere/edit_route.html:52 msgid "Start date" msgstr "Date de début" -#: models.py:305 +#: models.py:396 msgid "Not mandatory. Set it for dated item such as event. Format YYYY-MM-DD" msgstr "" "Optionnel. Précisez ce champ pour les éléments datés comme un événement. " "Format du champ : AAAA-MM-JJ" -#: models.py:307 templates/chimere/edit.html:62 +#: models.py:398 templates/chimere/edit.html:62 #: templates/chimere/edit_route.html:58 msgid "End date" msgstr "Date de fin" -#: models.py:308 +#: models.py:399 msgid "" "Not mandatory. Set it only if you have a multi-day event. Format YYYY-MM-DD" msgstr "" "Optionnel. Précisez ce champ seulement pour des événements durant plusieurs " "jours. Format du champ : AAAA-MM-JJ" -#: models.py:354 +#: models.py:449 msgid "Reference marker" msgstr "Point d'intérêt de référence" -#: models.py:355 utils.py:475 +#: models.py:450 utils.py:476 msgid "Localisation" msgstr "Localisation" -#: models.py:357 +#: models.py:452 msgid "Available Date" msgstr "Date de mise en disponibilité" -#: models.py:361 utils.py:474 templates/admin/chimere/managed_modified.html:31 +#: models.py:456 utils.py:475 templates/admin/chimere/managed_modified.html:31 #: templates/chimere/edit.html:49 templates/chimere/edit_route.html:46 msgid "Description" msgstr "Description" -#: models.py:423 models.py:1364 +#: models.py:524 models.py:1500 msgid "Point of interest" msgstr "Point d'intérêt" -#: models.py:577 +#: models.py:696 msgid "Audio" msgstr "Audio" -#: models.py:578 +#: models.py:697 msgid "Video" msgstr "Vidéo" -#: models.py:580 +#: models.py:699 msgid "Other" msgstr "Autre" -#: models.py:581 +#: models.py:700 msgid "Media type" msgstr "Type de media" -#: models.py:584 +#: models.py:703 msgid "Mime type" msgstr "Type mime" -#: models.py:586 +#: models.py:705 msgid "Inside an iframe" msgstr "À l'intérieur d'un iframe" -#: models.py:590 +#: models.py:709 msgid "Multimedia type" msgstr "Type de multimedia" -#: models.py:591 +#: models.py:710 msgid "Multimedia types" msgstr "Types de multimedia" -#: models.py:600 +#: models.py:719 msgid "Automatic recognition" msgstr "Reconnaissance automatique" -#: models.py:626 +#: models.py:745 msgid "Extension name" msgstr "Nom de l'extension" -#: models.py:628 +#: models.py:747 msgid "Associated multimedia type" msgstr "Type de multimedia associé" -#: models.py:632 +#: models.py:751 msgid "Multimedia extension" msgstr "Extension multimedia" -#: models.py:633 +#: models.py:752 msgid "Multimedia extensions" msgstr "Extensions multimedia" -#: models.py:640 -msgid "Url" -msgstr "Url" - -#: models.py:643 models.py:703 +#: models.py:762 models.py:822 msgid "Display inside the description?" msgstr "Apparaît dans la description ?" -#: models.py:648 +#: models.py:767 msgid "Multimedia file" msgstr "Fichier multimedia" -#: models.py:705 +#: models.py:824 msgid "Thumbnail" msgstr "Miniature" -#: models.py:709 +#: models.py:828 msgid "Thumbnail height" msgstr "Hauteur de la miniature" -#: models.py:711 +#: models.py:830 msgid "Thumbnail width" msgstr "Largeur de la miniature" -#: models.py:720 +#: models.py:839 msgid "Picture file" msgstr "Fichier d'image" -#: models.py:815 +#: models.py:934 msgid "Raw file (gpx or kml)" msgstr "Fichier brut (gpx ou kml)" -#: models.py:817 +#: models.py:936 msgid "Simplified file" msgstr "Fichier simplifié" -#: models.py:819 +#: models.py:938 msgid "KML" msgstr "KML" -#: models.py:819 +#: models.py:938 msgid "GPX" msgstr "GPX" -#: models.py:824 +#: models.py:943 msgid "Route file" msgstr "Fichier de trajet" -#: models.py:825 +#: models.py:944 msgid "Route files" msgstr "Fichiers de trajet" -#: models.py:875 +#: models.py:994 msgid "Reference route" msgstr "Trajet de référence" -#: models.py:879 +#: models.py:998 msgid "Associated file" msgstr "Fichier associé" -#: models.py:884 +#: models.py:1003 msgid "Has an associated marker" msgstr "Dispose d'un marqueur associé" -#: models.py:1144 +#: models.py:1263 msgid "Layer code" msgstr "Code pour la couche" -#: models.py:1150 +#: models.py:1269 msgid "Layer" msgstr "Couche" -#: models.py:1156 +#: models.py:1275 msgid "Area urn" msgstr "Urn de la zone" -#: models.py:1158 templates/chimere/blocks/welcome.html:3 +#: models.py:1277 templates/chimere/blocks/welcome.html:3 msgid "Welcome message" msgstr "Message d'accueil" -#: models.py:1162 +#: models.py:1281 msgid "Upper left corner" msgstr "Coin en haut à gauche" -#: models.py:1164 +#: models.py:1283 msgid "Lower right corner" msgstr "Coin en bas à droite" -#: models.py:1166 +#: models.py:1285 msgid "Default area" msgstr "Zone par défaut" -#: models.py:1167 +#: models.py:1286 msgid "Only one area is set by default" msgstr "Seule une zone est définie par défaut" -#: models.py:1171 +#: models.py:1290 msgid "Sub-categories checked by default" msgstr "Sous-catégories cochées par défaut" -#: models.py:1173 +#: models.py:1292 msgid "Sub-categories dynamicaly displayed" msgstr "Sous-categories affichées dynamiquement" -#: models.py:1174 +#: models.py:1293 msgid "" "If checked, categories are only displayed in the menu if they are available " "on the current extent." @@ -670,64 +715,72 @@ msgstr "" "Si coché, les catégories sont disponibles sur le menu seulement si elles " "apparaissent sur la zone affichée." -#: models.py:1178 models.py:1333 +#: models.py:1297 models.py:1452 msgid "Restricted to theses sub-categories" msgstr "Restreindre à ces sous-categories" -#: models.py:1179 +#: models.py:1298 msgid "If no sub-category is set all sub-categories are available" msgstr "" "Si aucune sous-catégorie n'est définie toutes les sous-catégories sont " "disponibles" -#: models.py:1181 +#: models.py:1300 msgid "Link to an external CSS" msgstr "Lien vers une feuille de style externe" -#: models.py:1183 +#: models.py:1302 msgid "Restrict to the area extent" msgstr "Restreindre à l'étendue de la zone" -#: models.py:1318 +#: models.py:1437 widgets.py:88 msgid "Default layer" msgstr "Couche par défaut" -#: models.py:1322 models.py:1323 +#: models.py:1441 models.py:1442 msgid "Layers" msgstr "Couches" -#: models.py:1331 +#: models.py:1450 msgid "Mandatory" msgstr "Obligatoire" -#: models.py:1334 +#: models.py:1453 msgid "" "If no sub-category is set all the property applies to all sub-categories" msgstr "" "Si aucune sous-catégorie n'est précisée, cette propriété est disponible pour " "toutes les sous-catégories" -#: models.py:1336 +#: models.py:1455 msgid "Text" msgstr "Texte" -#: models.py:1337 +#: models.py:1456 msgid "Long text" msgstr "Texte long" -#: models.py:1344 +#: models.py:1459 +msgid "Choices" +msgstr "Choix" + +#: models.py:1467 msgid "Type" msgstr "Type" -#: models.py:1349 models.py:1366 +#: models.py:1472 models.py:1488 models.py:1502 msgid "Property model" msgstr "Modèle de propriété" -#: models.py:1367 +#: models.py:1489 models.py:1503 msgid "Value" msgstr "Valeur" -#: models.py:1371 +#: models.py:1495 +msgid "Model property choice" +msgstr "Choix pour les modèles de propriété" + +#: models.py:1514 msgid "Property" msgstr "Propriété" @@ -781,69 +834,69 @@ msgstr "Export échoué" msgid "Export canceled" msgstr "Export annulé" -#: utils.py:134 utils.py:183 +#: utils.py:135 utils.py:184 msgid "Bad zip file" msgstr "Mauvais fichier zip" -#: utils.py:186 +#: utils.py:187 msgid "Missing file(s) inside the zip file" msgstr "Fichier(s) manquant(s) dans l'archive zip" -#: utils.py:227 +#: utils.py:228 msgid "Bad XML file" msgstr "Mauvais fichier XML" -#: utils.py:312 +#: utils.py:313 msgid "Error while reading the data source." msgstr "Erreur lors de la lecture de la source." -#: utils.py:330 +#: utils.py:331 #, python-format msgid "SRID cannot be guessed. The default SRID (%s) has been used." msgstr "Le SRID n'a pu être trouvé. Le SRID par défaut (%s) a été utilisé." -#: utils.py:351 +#: utils.py:352 msgid "Type of geographic item of this shapefile is not managed by Chimère." msgstr "" "Les types des éléments géographiques de ce fichier Shapefile ne sont pas " "gérés par Chimère." -#: utils.py:371 +#: utils.py:372 msgid "Bad Shapefile" msgstr "Mauvais fichier Shapefile" -#: utils.py:413 +#: utils.py:414 msgid "Could not create file!" msgstr "Ne peut pas créer le fichier !" -#: utils.py:424 +#: utils.py:425 msgid "Failed to create field" msgstr "Ne peut pas créer un champ" -#: utils.py:470 templates/admin/chimere/managed_modified.html:25 +#: utils.py:471 templates/admin/chimere/managed_modified.html:25 #: templates/chimere/edit.html:44 templates/chimere/edit_route.html:41 #: templates/chimere/main_map.html:13 #: templates/chimere/main_map_simple.html:10 msgid "Categories" msgstr "Catégories" -#: utils.py:503 +#: utils.py:504 msgid "Invalid CSV format" msgstr "Fichier CSV non valide" -#: utils.py:578 +#: utils.py:579 msgid "RSS feed is not well formed" msgstr "Flux RSS non valide" -#: utils.py:653 +#: utils.py:654 msgid "Nothing to import" msgstr "Rien à importer" -#: utils.py:741 +#: utils.py:742 msgid "New items imported - validate them before exporting" msgstr "Nouveaux éléments importés - valider ceux-ci avant d'exporter" -#: utils.py:743 +#: utils.py:744 msgid "" "There are items from a former import not yet validated - validate them " "before exporting" @@ -851,19 +904,19 @@ msgstr "" "Il y a des éléments d'un import précédent pas encore validé - Validez les " "avant d'exporter" -#: utils.py:755 +#: utils.py:756 msgid "Bad params - programming error" msgstr "Mauvais paramètres - erreur de programmation" -#: utils.py:765 +#: utils.py:766 msgid "Bad param" msgstr "Mauvais paramètre" -#: utils.py:780 +#: utils.py:781 msgid "No non ambigious tag is defined in the XAPI request" msgstr "Pas de tag non ambigü définis dans la requête XAPI" -#: utils.py:782 +#: utils.py:783 msgid "" "No bounding box is defined in the XAPI request.If you are sure to manage the " "entire planet set the bounding box to -180,-90,180,90" @@ -872,19 +925,19 @@ msgstr "" "vouloir lancer la requête sur la planète entière fixez la « bounding box » " "à -180,-90,180,90" -#: views.py:238 +#: views.py:278 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:363 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:433 +#: views.py:475 msgid "Comments/request on the map" msgstr "Commentaires/requètes sur la carte" -#: views.py:436 +#: views.py:478 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." @@ -893,48 +946,56 @@ msgstr "" "laissé votre courriel vous serez peut-être contacté bientôt pour plus de " "détails." -#: views.py:440 +#: views.py:482 msgid "Temporary error. Renew your message later." msgstr "Erreur temporaire. Réenvoyez votre message plus tard." -#: views.py:576 +#: views.py:656 msgid "No category available in this area." msgstr "Pas de catégorie disponible sur cette zone." -#: views.py:684 +#: views.py:756 +msgid "Bad geometry" +msgstr "Géométrie incorrecte" + +#: views.py:841 msgid "Incorrect choice in the list" msgstr "Choix incorrect dans la liste" -#: widgets.py:216 +#: widgets.py:242 +msgid "Street, City, Country" +msgstr "Rue, Commune, Pays" + +#: widgets.py:311 msgid "Latitude" msgstr "Latitude" -#: widgets.py:216 +#: widgets.py:311 msgid "Longitude" msgstr "Longitude" -#: widgets.py:240 +#: widgets.py:335 msgid "Invalid point" msgstr "Point invalide" -#: widgets.py:292 +#: widgets.py:391 msgid "Creation mode" msgstr "Mode création" -#: widgets.py:293 +#: widgets.py:392 msgid "To start drawing the route click on the toggle button: \"Draw\"." msgstr "" "Pour commencer le dessin cliquez sur le bouton : « Tracer »." -#: widgets.py:295 +#: widgets.py:394 msgid "Then click on the map to begin the drawing." msgstr "Puis cliquez sur la carte pour commencer le dessin." -#: widgets.py:296 +#: widgets.py:395 msgid "You can add points by clicking again." msgstr "Vous pouvez ajouter des points en cliquant de nouveau." -#: widgets.py:297 +#: widgets.py:396 msgid "" "To finish the drawing double click. When the drawing is finished you can " "edit it." @@ -942,7 +1003,7 @@ msgstr "" "Pour finir le tracé double-cliquez. Quand le tracé est fini vous pouvez " "toujours l'éditer." -#: widgets.py:299 +#: widgets.py:398 msgid "" "While creating to undo a drawing click again on the toggle button \"Stop " "drawing\"." @@ -950,17 +1011,17 @@ msgstr "" "En mode création vous pouvez annuler un tracé en appuyant sur le bouton " "« Arrêter le tracé »." -#: widgets.py:304 +#: widgets.py:403 msgid "Modification mode" msgstr "Mode modification" -#: widgets.py:305 +#: widgets.py:404 msgid "To move a point click on it and drag it to the desired position." msgstr "" "Pour bouger un point, cliquez dessus, maintenez le click pour le déposer à " "la position désirée." -#: widgets.py:306 +#: widgets.py:405 msgid "" "To delete a point move the mouse cursor over it and press the \"d\" or \"Del" "\" key." @@ -968,7 +1029,7 @@ msgstr "" "Pour supprimer un point, mettez le curseur de la souris sur celui-ci et " "appuyez sur le touche « d » ou « Suppr »." -#: widgets.py:308 +#: widgets.py:407 msgid "" "To add a point click in the middle of a segment and drag the new point to " "the desired position" @@ -977,51 +1038,51 @@ msgstr "" "maintenez le bouton appuyé et déplacez le nouveau point à la position " "désirée." -#: widgets.py:315 +#: widgets.py:414 msgid "Give a name and set category before uploading a file." msgstr "" "Renseignez le nom et choisissez au moins une catégorie avant de déposer un " "fichier." -#: widgets.py:318 +#: widgets.py:417 msgid "Upload a route file (GPX or KML)" msgstr "Déposer un trajet (fichier GPX ou KML)" -#: widgets.py:319 +#: widgets.py:418 msgid "or" msgstr "ou" -#: widgets.py:324 +#: widgets.py:423 msgid "Start \"hand\" drawing" msgstr "Commencer le tracé manuellement" -#: widgets.py:347 +#: widgets.py:446 msgid "Move on the map" msgstr "Se déplacer" -#: widgets.py:347 +#: widgets.py:446 msgid "Draw" msgstr "Tracer" -#: widgets.py:437 +#: widgets.py:536 msgid "Hold CTRL, click and drag to select area on the map" msgstr "" "Maintenir la touche Control, cliquez puis glissez pour sélectionner une zone " "sur la carte" -#: widgets.py:494 +#: widgets.py:593 msgid "Type:" msgstr "Type :" -#: widgets.py:494 +#: widgets.py:593 msgid "Node" msgstr "Nœud" -#: widgets.py:495 +#: widgets.py:594 msgid "Way" msgstr "Route" -#: widgets.py:506 +#: widgets.py:605 msgid "" "Enter an OSM \"tag=value\" string such as \"amenity=pub\". A list of common " "tag is available <a href='https://wiki.openstreetmap.org/wiki/Map_Features' " @@ -1031,39 +1092,39 @@ msgstr "" "liste des clés est disponible <a href='https://wiki.openstreetmap.org/wiki/" "FR:Map_Features' target='_blank'>ici</a>." -#: widgets.py:513 +#: widgets.py:612 msgid "Tag:" msgstr "Clé/valeur :" -#: widgets.py:517 +#: widgets.py:616 msgid "You have to select an area." msgstr "Vous devez sélectionner une zone." -#: widgets.py:519 +#: widgets.py:618 msgid "You have to select a type." msgstr "Vous devez sélectionner un type." -#: widgets.py:521 +#: widgets.py:620 msgid "You have to insert a filter tag." msgstr "Vous devez saisir une clé=valeur." -#: widgets.py:523 +#: widgets.py:622 msgid "If you change the above form don't forget to refresh before submit!" msgstr "" "Si vous modifiez le formulaire ci-dessus n'oubliez pas de rafraîchir avant " "de valider !" -#: widgets.py:526 +#: widgets.py:625 msgid "You can put a Folder name of the KML file to filter on it." msgstr "" "Vous pouvez saisir le nom d'un « Folder » du fichier KML pour filter sur " "celui-ci." -#: widgets.py:534 +#: widgets.py:633 msgid "Refresh" msgstr "Rafraîchir" -#: widgets.py:600 +#: widgets.py:699 msgid "Select..." msgstr "Sélectionner..." @@ -1147,8 +1208,8 @@ msgid "" "<a href='%(rapprochement_form)s'>rapprochement form</a>.\n" msgstr "" "\n" -"Cet élément a un élément de référence associé. Vous devriez le traiter via le " -"<a href='%(rapprochement_form)s'>formulaire de rapprochement</a>.\n" +"Cet élément a un élément de référence associé. Vous devriez le traiter via " +"le <a href='%(rapprochement_form)s'>formulaire de rapprochement</a>.\n" #: templates/admin/chimere/propertymodel/change_form.html:5 msgid "" @@ -1158,7 +1219,7 @@ msgstr "" "Après ajout/modification de modèle de propriété vous aurez à recharger le " "serveur web." -#: templates/chimere/base.html:11 +#: templates/chimere/base.html:12 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." @@ -1202,14 +1263,6 @@ msgstr "Proposer une modification" msgid "I would like to propose an amendment for this item:" msgstr "Je souhaiterais proposer une modification pour cet élément :" -#: templates/chimere/detail.html:39 -msgid "Share on" -msgstr "Partager sur" - -#: templates/chimere/detail.html:43 -msgid "Share" -msgstr "Partager" - #: templates/chimere/edit.html:20 msgid "Error" msgstr "Erreur" @@ -1259,7 +1312,7 @@ msgstr "Commentaires au sujet de votre proposition" msgid "Upload in progress. Please wait..." msgstr "Dépôt en cours. Veuillez patienter..." -#: templates/chimere/edit.html:151 templates/chimere/edit_route.html:77 +#: templates/chimere/edit.html:152 templates/chimere/edit_route.html:77 msgid "Propose" msgstr "Proposez" @@ -1267,7 +1320,7 @@ msgstr "Proposez" msgid "Add/modify a route" msgstr "Ajout ou modifier un trajet" -#: templates/chimere/main_map.html:27 +#: templates/chimere/main_map.html:35 msgid "Simple map" msgstr "Carte simple" @@ -1283,17 +1336,17 @@ msgstr "Déposer un fichier" msgid "Upload" msgstr "Déposer" -#: templates/chimere/blocks/alternate_multimedia.html:32 -#: templates/chimere/blocks/alternate_multimedia.html:50 +#: templates/chimere/blocks/alternate_multimedia.html:33 +#: templates/chimere/blocks/alternate_multimedia.html:51 #: templates/chimere/blocks/inline_formset.html:22 msgid "Add" msgstr "Ajouter" -#: templates/chimere/blocks/alternate_multimedia.html:34 -msgid "Add multimedia from your computer or a site" +#: templates/chimere/blocks/alternate_multimedia.html:35 +msgid "Add multimedia from your computer or a website" msgstr "Ajoutez du multimedia depuis votre ordinateur ou un site web" -#: templates/chimere/blocks/alternate_multimedia.html:35 +#: templates/chimere/blocks/alternate_multimedia.html:36 msgid "" "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu luctus " "ipsum. Donec vel urna a turpis consectetur consectetur. Vestibulum ut enim " @@ -1303,31 +1356,31 @@ msgstr "" "ipsum. Donec vel urna a turpis consectetur consectetur. Vestibulum ut enim " "vel odio porta vulputate." -#: templates/chimere/blocks/alternate_multimedia.html:43 +#: templates/chimere/blocks/alternate_multimedia.html:44 msgid "Audio, video, other..." msgstr "Audio, vidéo, autre..." -#: templates/chimere/blocks/alternate_multimedia.html:46 +#: templates/chimere/blocks/alternate_multimedia.html:47 msgid "Download" msgstr "Télécharger" -#: templates/chimere/blocks/alternate_multimedia.html:47 +#: templates/chimere/blocks/alternate_multimedia.html:48 msgid "Or" msgstr "Ou" -#: templates/chimere/blocks/alternate_multimedia.html:76 +#: templates/chimere/blocks/alternate_multimedia.html:80 msgid "You must provide a name." msgstr "Vous devez renseigner le nom." -#: templates/chimere/blocks/alternate_multimedia.html:81 +#: templates/chimere/blocks/alternate_multimedia.html:85 msgid "You must choose a media type." msgstr "Vous devez renseigner un type de fichier média." -#: templates/chimere/blocks/alternate_multimedia.html:87 +#: templates/chimere/blocks/alternate_multimedia.html:91 msgid "You must provide a file or a web address." msgstr "Vous devez renseigner un fichier ou une adresse web." -#: templates/chimere/blocks/alternate_multimedia.html:92 +#: templates/chimere/blocks/alternate_multimedia.html:96 msgid "You must provide a web address." msgstr "Vous devez fournir une adresse web." @@ -1366,16 +1419,101 @@ msgstr "Carte" msgid "Loading of the map in progress" msgstr "Chargement de la carte en cours" -#: templates/chimere/blocks/map.html:18 +#: templates/chimere/blocks/map.html:13 +msgid "Display options" +msgstr "Options d'affichage" + +#: templates/chimere/blocks/map.html:15 +msgid "Map type" +msgstr "Type de carte" + +#: templates/chimere/blocks/map.html:24 msgid "Permalink" msgstr "Lien permanent" +#: templates/chimere/blocks/map_menu.html:5 +msgctxt "routing" +msgid "From" +msgstr "En partir" + +#: templates/chimere/blocks/map_menu.html:6 +msgctxt "routing" +msgid "Add a step" +msgstr "Ajout d'une étape" + +#: templates/chimere/blocks/map_menu.html:7 +msgctxt "routing" +msgid "To" +msgstr "Y aller" + +#: templates/chimere/blocks/map_menu.html:8 +msgctxt "routing" +msgid "Clear the itinerary" +msgstr "Effacer l'itinéraire" + +#: templates/chimere/blocks/map_menu.html:10 +msgid "Zoom in" +msgstr "Zoomer en avant" + +#: templates/chimere/blocks/map_menu.html:11 +msgid "Zoom out" +msgstr "Zoomer en arrière" + +#: templates/chimere/blocks/map_menu.html:12 +msgid "Center the map here" +msgstr "Centrer la carte ici" + #: templates/chimere/blocks/multimedia_file.html:19 msgid "Please use a modern browser or install the non free Flash-Plugin." msgstr "" "Utilisez un navigateur internet plus récent ou installez le greffon non " "libre Flash." +#: templates/chimere/blocks/news.html:42 +#: templates/chimere/blocks/welcome.html:52 +msgid "See it on the map" +msgstr "Voir sur la carte" + +#: templates/chimere/blocks/routing.html:5 +msgid "Itinerary" +msgstr "Itinéraire" + +#: templates/chimere/blocks/routing.html:16 +msgid "Add a step" +msgstr "Ajouter une étape" + +#: templates/chimere/blocks/routing.html:17 +msgid "Search" +msgstr "Rechercher" + +#: templates/chimere/blocks/routing.html:23 +msgid "Modify" +msgstr "Modifier" + +#: templates/chimere/blocks/routing.html:26 +msgid "New search" +msgstr "Nouvelle recherche" + +#: templates/chimere/blocks/routing.html:34 +msgid "Start:" +msgstr "Départ :" + +#: templates/chimere/blocks/routing.html:38 +msgid "Finish:" +msgstr "Arrivée :" + +#: templates/chimere/blocks/routing.html:44 +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 " @@ -1404,10 +1542,6 @@ msgstr "Retourner à la carte" msgid "Welcome" msgstr "Accueil" -#: templates/chimere/blocks/welcome.html:52 -msgid "See it on the map" -msgstr "Voir sur la carte" - #: templates/chimere/feeds/rss.html:13 msgid "Subscribe to RSS feed" msgstr "Souscrire à un flux RSS" @@ -1448,6 +1582,11 @@ msgstr "Description :" msgid ":" msgstr " :" +#: templatetags/chimere_tags.py:80 +#, python-format +msgid "Welcome to the %s" +msgstr "Bienvenue sur %s" + #~ msgid "Advanced options" #~ msgstr "Options avancées" diff --git a/chimere/migrations/0030_auto__add_field_importer_default_name.py b/chimere/migrations/0029_auto__add_propertymodelchoice.py index b43d44c..b80129f 100644 --- a/chimere/migrations/0030_auto__add_field_importer_default_name.py +++ b/chimere/migrations/0029_auto__add_propertymodelchoice.py @@ -8,15 +8,19 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding field 'Importer.default_name' - db.add_column('chimere_importer', 'default_name', - self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), - keep_default=False) + # Adding model 'PropertyModelChoice' + db.create_table('chimere_propertymodelchoice', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('propertymodel', self.gf('django.db.models.fields.related.ForeignKey')(related_name='choices', to=orm['chimere.PropertyModel'])), + ('value', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal('chimere', ['PropertyModelChoice']) def backwards(self, orm): - # Deleting field 'Importer.default_name' - db.delete_column('chimere_importer', 'default_name') + # Deleting model 'PropertyModelChoice' + db.delete_table('chimere_propertymodelchoice') models = { @@ -77,7 +81,6 @@ class Migration(SchemaMigration): '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'}), @@ -102,9 +105,7 @@ class Migration(SchemaMigration): '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']"}), @@ -173,6 +174,13 @@ class Migration(SchemaMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), @@ -183,9 +191,7 @@ class Migration(SchemaMigration): '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', [], {}), diff --git a/chimere/migrations/0029_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py b/chimere/migrations/0030_auto__add_multimediaextension.py index 72d718c..47888c4 100644 --- a/chimere/migrations/0029_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py +++ b/chimere/migrations/0030_auto__add_multimediaextension.py @@ -8,39 +8,18 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding field 'Marker.modified_since_import' - db.add_column('chimere_marker', 'modified_since_import', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - # Adding field 'Marker.not_for_osm' - db.add_column('chimere_marker', 'not_for_osm', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - # Adding field 'Route.modified_since_import' - db.add_column('chimere_route', 'modified_since_import', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - # Adding field 'Route.not_for_osm' - db.add_column('chimere_route', 'not_for_osm', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) + # Adding model 'MultimediaExtension' + db.create_table('chimere_multimediaextension', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=6)), + ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='extensions', to=orm['chimere.MultimediaType'])), + )) + db.send_create_signal('chimere', ['MultimediaExtension']) def backwards(self, orm): - # Deleting field 'Marker.modified_since_import' - db.delete_column('chimere_marker', 'modified_since_import') - - # Deleting field 'Marker.not_for_osm' - db.delete_column('chimere_marker', 'not_for_osm') - - # Deleting field 'Route.modified_since_import' - db.delete_column('chimere_route', 'modified_since_import') - - # Deleting field 'Route.not_for_osm' - db.delete_column('chimere_route', 'not_for_osm') + # Deleting model 'MultimediaExtension' + db.delete_table('chimere_multimediaextension') models = { @@ -125,9 +104,7 @@ class Migration(SchemaMigration): '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']"}), @@ -138,6 +115,12 @@ class Migration(SchemaMigration): 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, 'chimere.multimediafile': { 'Meta': {'object_name': 'MultimediaFile'}, 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -196,6 +179,13 @@ class Migration(SchemaMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), @@ -206,9 +196,7 @@ class Migration(SchemaMigration): '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', [], {}), diff --git a/chimere/migrations/0032_auto__add_field_subcategory_submission.py b/chimere/migrations/0031_auto__add_field_subcategory_dated.py index d96e5bb..5ebbecf 100644 --- a/chimere/migrations/0032_auto__add_field_subcategory_submission.py +++ b/chimere/migrations/0031_auto__add_field_subcategory_dated.py @@ -8,15 +8,15 @@ 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), + # Adding field 'SubCategory.dated' + db.add_column('chimere_subcategory', 'dated', + self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False) def backwards(self, orm): - # Deleting field 'SubCategory.submission' - db.delete_column('chimere_subcategory', 'submission') + # Deleting field 'SubCategory.dated' + db.delete_column('chimere_subcategory', 'dated') models = { @@ -77,7 +77,6 @@ class Migration(SchemaMigration): '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'}), @@ -102,9 +101,7 @@ class Migration(SchemaMigration): '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']"}), @@ -115,6 +112,12 @@ class Migration(SchemaMigration): 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, 'chimere.multimediafile': { 'Meta': {'object_name': 'MultimediaFile'}, 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -144,7 +147,7 @@ class Migration(SchemaMigration): }, 'chimere.picturefile': { 'Meta': {'object_name': 'PictureFile'}, - 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), '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'}), @@ -154,7 +157,7 @@ class Migration(SchemaMigration): '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'}) + 'width': ('django.db.models.fields.IntegerField', [], {}) }, 'chimere.property': { 'Meta': {'object_name': 'Property'}, @@ -173,6 +176,13 @@ class Migration(SchemaMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), @@ -183,9 +193,7 @@ class Migration(SchemaMigration): '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', [], {}), @@ -207,15 +215,15 @@ class Migration(SchemaMigration): }, 'chimere.subcategory': { 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, - 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), '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'}) + 'order': ('django.db.models.fields.IntegerField', [], {}) }, 'chimere.tinyurl': { 'Meta': {'object_name': 'TinyUrl'}, diff --git a/chimere/migrations/0032_auto__add_page.py b/chimere/migrations/0032_auto__add_page.py new file mode 100644 index 0000000..e39c4a8 --- /dev/null +++ b/chimere/migrations/0032_auto__add_page.py @@ -0,0 +1,252 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Page' + db.create_table('chimere_page', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('mnemonic', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=10, null=True, blank=True)), + ('template_path', self.gf('django.db.models.fields.CharField')(max_length=150, null=True, blank=True)), + ('content', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + )) + db.send_create_signal('chimere', ['Page']) + + + def backwards(self, orm): + # Deleting model 'Page' + db.delete_table('chimere_page') + + + 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'}), + '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'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0033_auto__add_field_marker_is_front_page__add_field_news_is_front_page__ad.py b/chimere/migrations/0033_auto__add_field_marker_is_front_page__add_field_news_is_front_page__ad.py new file mode 100644 index 0000000..9f37064 --- /dev/null +++ b/chimere/migrations/0033_auto__add_field_marker_is_front_page__add_field_news_is_front_page__ad.py @@ -0,0 +1,264 @@ +# -*- 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 'Marker.is_front_page' + db.add_column('chimere_marker', 'is_front_page', + self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True), + keep_default=False) + + # Adding field 'News.is_front_page' + db.add_column('chimere_news', 'is_front_page', + self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True), + keep_default=False) + + # Adding field 'News.url' + db.add_column('chimere_news', 'url', + self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Marker.is_front_page' + db.delete_column('chimere_marker', 'is_front_page') + + # Deleting field 'News.is_front_page' + db.delete_column('chimere_news', 'is_front_page') + + # Deleting field 'News.url' + db.delete_column('chimere_news', 'url') + + + 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'}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0034_auto__add_field_subcategory_description.py b/chimere/migrations/0034_auto__add_field_subcategory_description.py new file mode 100644 index 0000000..c77ab1d --- /dev/null +++ b/chimere/migrations/0034_auto__add_field_subcategory_description.py @@ -0,0 +1,249 @@ +# -*- 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.description' + db.add_column('chimere_subcategory', 'description', + self.gf('django.db.models.fields.TextField')(null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'SubCategory.description' + db.delete_column('chimere_subcategory', 'description') + + + 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'}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'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', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0035_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py b/chimere/migrations/0035_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py new file mode 100644 index 0000000..568d369 --- /dev/null +++ b/chimere/migrations/0035_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py @@ -0,0 +1,277 @@ +# -*- 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 'Marker.modified_since_import' + db.add_column('chimere_marker', 'modified_since_import', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Marker.not_for_osm' + db.add_column('chimere_marker', 'not_for_osm', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Route.modified_since_import' + db.add_column('chimere_route', 'modified_since_import', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'Route.not_for_osm' + db.add_column('chimere_route', 'not_for_osm', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Marker.modified_since_import' + db.delete_column('chimere_marker', 'modified_since_import') + + # Deleting field 'Marker.not_for_osm' + db.delete_column('chimere_marker', 'not_for_osm') + + # Deleting field 'Route.modified_since_import' + db.delete_column('chimere_route', 'modified_since_import') + + # Deleting field 'Route.not_for_osm' + db.delete_column('chimere_route', 'not_for_osm') + + + 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'}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'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.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'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', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0036_auto__add_field_importer_default_name.py b/chimere/migrations/0036_auto__add_field_importer_default_name.py new file mode 100644 index 0000000..5920a6d --- /dev/null +++ b/chimere/migrations/0036_auto__add_field_importer_default_name.py @@ -0,0 +1,254 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Importer.default_name' + db.add_column('chimere_importer', 'default_name', + self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Importer.default_name' + db.delete_column('chimere_importer', 'default_name') + + + 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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'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.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'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', [], {}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0037_auto__add_field_subcategory_hover_icon.py b/chimere/migrations/0037_auto__add_field_subcategory_hover_icon.py new file mode 100644 index 0000000..973730f --- /dev/null +++ b/chimere/migrations/0037_auto__add_field_subcategory_hover_icon.py @@ -0,0 +1,255 @@ +# -*- 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.hover_icon' + db.add_column('chimere_subcategory', 'hover_icon', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='subcat_hovered', null=True, to=orm['chimere.Icon']), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'SubCategory.hover_icon' + db.delete_column('chimere_subcategory', 'hover_icon_id') + + + 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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'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.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + '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', [], {}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}) + }, + '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'] diff --git a/chimere/migrations/0031_auto__chg_field_picturefile_width__chg_field_picturefile_height.py b/chimere/migrations/0038_auto__chg_field_picturefile_width__chg_field_picturefile_height.py index dac7145..dac7145 100644 --- a/chimere/migrations/0031_auto__chg_field_picturefile_width__chg_field_picturefile_height.py +++ b/chimere/migrations/0038_auto__chg_field_picturefile_width__chg_field_picturefile_height.py diff --git a/chimere/migrations/0039_auto__add_field_subcategory_submission.py b/chimere/migrations/0039_auto__add_field_subcategory_submission.py new file mode 100644 index 0000000..9511827 --- /dev/null +++ b/chimere/migrations/0039_auto__add_field_subcategory_submission.py @@ -0,0 +1,254 @@ +# -*- 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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'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.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pictures'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + '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'] diff --git a/chimere/migrations/0040_auto__add_field_subcategory_as_layer.py b/chimere/migrations/0040_auto__add_field_subcategory_as_layer.py new file mode 100644 index 0000000..8cc8997 --- /dev/null +++ b/chimere/migrations/0040_auto__add_field_subcategory_as_layer.py @@ -0,0 +1,257 @@ +# -*- 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.as_layer' + db.add_column('chimere_subcategory', 'as_layer', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'SubCategory.as_layer' + db.delete_column('chimere_subcategory', 'as_layer') + + + 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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'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.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pictures'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0033_auto__add_field_importer_source_file.py b/chimere/migrations/0041_auto__add_field_importer_source_file.py index 788d12c..788d12c 100644 --- a/chimere/migrations/0033_auto__add_field_importer_source_file.py +++ b/chimere/migrations/0041_auto__add_field_importer_source_file.py diff --git a/chimere/migrations/0034_auto__add_field_importer_origin__add_field_importer_license__add_field.py b/chimere/migrations/0042_auto__add_field_importer_origin__add_field_importer_license__add_field.py index 757deab..757deab 100644 --- a/chimere/migrations/0034_auto__add_field_importer_origin__add_field_importer_license__add_field.py +++ b/chimere/migrations/0042_auto__add_field_importer_origin__add_field_importer_license__add_field.py diff --git a/chimere/migrations/0035_area_permissions.py b/chimere/migrations/0043_area_permissions.py index d396050..d396050 100644 --- a/chimere/migrations/0035_area_permissions.py +++ b/chimere/migrations/0043_area_permissions.py diff --git a/chimere/migrations/0036_auto.py b/chimere/migrations/0044_auto.py index bb93496..e536b3f 100644 --- a/chimere/migrations/0036_auto.py +++ b/chimere/migrations/0044_auto.py @@ -108,6 +108,7 @@ class Migration(SchemaMigration): 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), @@ -123,6 +124,12 @@ class Migration(SchemaMigration): 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, 'chimere.multimediafile': { 'Meta': {'object_name': 'MultimediaFile'}, 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -149,6 +156,18 @@ class Migration(SchemaMigration): '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) }, 'chimere.picturefile': { @@ -182,6 +201,13 @@ class Migration(SchemaMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), @@ -218,9 +244,13 @@ class Migration(SchemaMigration): }, 'chimere.subcategory': { 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), diff --git a/chimere/migrations/0045_auto__add_field_subcategory_routing_warn__add_field_subcategory_routin.py b/chimere/migrations/0045_auto__add_field_subcategory_routing_warn__add_field_subcategory_routin.py new file mode 100644 index 0000000..e43c50c --- /dev/null +++ b/chimere/migrations/0045_auto__add_field_subcategory_routing_warn__add_field_subcategory_routin.py @@ -0,0 +1,275 @@ +# -*- 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.routing_warn' + db.add_column('chimere_subcategory', 'routing_warn', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'SubCategory.routing_available' + db.add_column('chimere_subcategory', 'routing_available', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'SubCategory.routing_warn' + db.delete_column('chimere_subcategory', 'routing_warn') + + # Deleting field 'SubCategory.routing_available' + db.delete_column('chimere_subcategory', 'routing_available') + + + 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'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'source_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'chimere.layer': { + 'Meta': {'object_name': 'Layer'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_code': ('django.db.models.fields.TextField', [], {'max_length': '300'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.marker': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Marker'}, + 'available_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'chimere.multimediatype': { + 'Meta': {'object_name': 'MultimediaType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.news': { + 'Meta': {'object_name': 'News'}, + 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pictures'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + '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'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_route'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'route': ('chimere.widgets.RouteField', [], {}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.routefile': { + 'Meta': {'ordering': "('name',)", 'object_name': 'RouteFile'}, + 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'raw_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'simplified_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.subcategory': { + 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'routing_available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'routing_warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0038_osm_import_filtr.py b/chimere/migrations/0046_auto__del_field_subcategory_routing_available.py index 2b8666b..c682e0e 100644 --- a/chimere/migrations/0038_osm_import_filtr.py +++ b/chimere/migrations/0046_auto__del_field_subcategory_routing_available.py @@ -1,24 +1,23 @@ # -*- coding: utf-8 -*- import datetime from south.db import db -from south.v2 import DataMigration +from south.v2 import SchemaMigration from django.db import models -class Migration(DataMigration): + +class Migration(SchemaMigration): def forwards(self, orm): - for importer in orm['chimere.Importer'].objects.filter( - importer_type='OSM').all(): - if importer.filtr: - continue - splited_url = importer.source.split('/') - importer.filtr = splited_url[-1] - importer.source = "/".join(splited_url[:-1])+"/" - importer.save() + # Deleting field 'SubCategory.routing_available' + db.delete_column('chimere_subcategory', 'routing_available') + def backwards(self, orm): - # no backward necessary - pass + # Adding field 'SubCategory.routing_available' + db.add_column('chimere_subcategory', 'routing_available', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + models = { 'chimere.area': { @@ -32,7 +31,7 @@ class Migration(DataMigration): 'layers': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'through': "orm['chimere.AreaLayers']", 'to': "orm['chimere.Layer']"}), 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'order': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}), + '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)'"}), @@ -77,7 +76,6 @@ class Migration(DataMigration): }, 'chimere.importer': { 'Meta': {'object_name': 'Importer'}, - 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'filtr': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), @@ -107,6 +105,7 @@ class Migration(DataMigration): 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), @@ -122,6 +121,12 @@ class Migration(DataMigration): 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, 'chimere.multimediafile': { 'Meta': {'object_name': 'MultimediaFile'}, 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -148,6 +153,18 @@ class Migration(DataMigration): '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) }, 'chimere.picturefile': { @@ -181,12 +198,18 @@ class Migration(DataMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'has_associated_marker': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), @@ -218,14 +241,19 @@ class Migration(DataMigration): }, 'chimere.subcategory': { 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'routing_warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) }, 'chimere.tinyurl': { @@ -235,5 +263,4 @@ class Migration(DataMigration): } } - complete_apps = ['chimere'] - symmetrical = True + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0037_auto__add_unique_area_order__add_field_importer_associate_marker_to_wa.py b/chimere/migrations/0047_auto__add_unique_area_order__add_field_importer_associate_marker_to_wa.py index 5269e8b..4b40fb9 100644 --- a/chimere/migrations/0037_auto__add_unique_area_order__add_field_importer_associate_marker_to_wa.py +++ b/chimere/migrations/0047_auto__add_unique_area_order__add_field_importer_associate_marker_to_wa.py @@ -8,10 +8,6 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - for idx, area in enumerate(orm['chimere.Area'].objects.order_by('order' - ).all()): - area.order = (idx + 1)*5 - area.save() # Adding unique constraint on 'Area', fields ['order'] db.create_unique('chimere_area', ['order']) @@ -252,4 +248,4 @@ class Migration(SchemaMigration): } } - complete_apps = ['chimere'] + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/migrations/0048_auto__add_propertymodelchoice__add_multimediaextension__add_page__chg_.py b/chimere/migrations/0048_auto__add_propertymodelchoice__add_multimediaextension__add_page__chg_.py new file mode 100644 index 0000000..acc2fce --- /dev/null +++ b/chimere/migrations/0048_auto__add_propertymodelchoice__add_multimediaextension__add_page__chg_.py @@ -0,0 +1,368 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'PropertyModelChoice' + db.create_table('chimere_propertymodelchoice', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('propertymodel', self.gf('django.db.models.fields.related.ForeignKey')(related_name='choices', to=orm['chimere.PropertyModel'])), + ('value', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal('chimere', ['PropertyModelChoice']) + + # Adding model 'MultimediaExtension' + db.create_table('chimere_multimediaextension', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=6)), + ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='extensions', to=orm['chimere.MultimediaType'])), + )) + db.send_create_signal('chimere', ['MultimediaExtension']) + + # Adding model 'Page' + db.create_table('chimere_page', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=150)), + ('mnemonic', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)), + ('available', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=10, null=True, blank=True)), + ('template_path', self.gf('django.db.models.fields.CharField')(max_length=150, null=True, blank=True)), + ('content', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + )) + db.send_create_signal('chimere', ['Page']) + + + # Changing field 'MultimediaFile.multimedia_type' + db.alter_column('chimere_multimediafile', 'multimedia_type_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.MultimediaType'])) + # Adding field 'SubCategory.dated' + db.add_column('chimere_subcategory', 'dated', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'SubCategory.description' + db.add_column('chimere_subcategory', 'description', + self.gf('django.db.models.fields.TextField')(null=True, blank=True), + keep_default=False) + + # Adding field 'SubCategory.hover_icon' + db.add_column('chimere_subcategory', 'hover_icon', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='subcat_hovered', null=True, to=orm['chimere.Icon']), + keep_default=False) + + # Adding field 'SubCategory.as_layer' + db.add_column('chimere_subcategory', 'as_layer', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'SubCategory.routing_warn' + db.add_column('chimere_subcategory', 'routing_warn', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'News.is_front_page' + db.add_column('chimere_news', 'is_front_page', + self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True), + keep_default=False) + + # Adding field 'News.url' + db.add_column('chimere_news', 'url', + self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True), + keep_default=False) + + # Adding field 'Marker.is_front_page' + db.add_column('chimere_marker', 'is_front_page', + self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting model 'PropertyModelChoice' + db.delete_table('chimere_propertymodelchoice') + + # Deleting model 'MultimediaExtension' + db.delete_table('chimere_multimediaextension') + + # Deleting model 'Page' + db.delete_table('chimere_page') + + + # User chose to not deal with backwards NULL issues for 'MultimediaFile.multimedia_type' + raise RuntimeError("Cannot reverse this migration. 'MultimediaFile.multimedia_type' and its values cannot be restored.") + # Deleting field 'SubCategory.dated' + db.delete_column('chimere_subcategory', 'dated') + + # Deleting field 'SubCategory.description' + db.delete_column('chimere_subcategory', 'description') + + # Deleting field 'SubCategory.hover_icon' + db.delete_column('chimere_subcategory', 'hover_icon_id') + + # Deleting field 'SubCategory.as_layer' + db.delete_column('chimere_subcategory', 'as_layer') + + # Deleting field 'SubCategory.routing_warn' + db.delete_column('chimere_subcategory', 'routing_warn') + + # Deleting field 'News.is_front_page' + db.delete_column('chimere_news', 'is_front_page') + + # Deleting field 'News.url' + db.delete_column('chimere_news', 'url') + + # Deleting field 'Marker.is_front_page' + db.delete_column('chimere_marker', 'is_front_page') + + + models = { + 'chimere.area': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'default_subcategories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False', 'blank': 'True'}), + 'dynamic_categories': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'external_css': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layers': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'through': "orm['chimere.AreaLayers']", 'to': "orm['chimere.Layer']"}), + 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}), + 'restrict_to_extent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'db_table': "'chimere_subcategory_areas'", 'to': "orm['chimere.SubCategory']"}), + 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'urn': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'}), + 'welcome_message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.arealayers': { + 'Meta': {'ordering': "('order',)", 'object_name': 'AreaLayers'}, + 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Area']"}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Layer']"}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.color': { + 'Meta': {'ordering': "['order']", 'object_name': 'Color'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '6'}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.colortheme': { + 'Meta': {'object_name': 'ColorTheme'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.icon': { + 'Meta': {'object_name': 'Icon'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.importer': { + 'Meta': {'object_name': 'Importer'}, + 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'filtr': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'importer_type': ('django.db.models.fields.CharField', [], {'max_length': '4'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'source_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'chimere.layer': { + 'Meta': {'object_name': 'Layer'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_code': ('django.db.models.fields.TextField', [], {'max_length': '300'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.marker': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Marker'}, + 'available_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'chimere.multimediatype': { + 'Meta': {'object_name': 'MultimediaType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.news': { + 'Meta': {'object_name': 'News'}, + 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pictures'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'has_associated_marker': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_route'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'route': ('chimere.widgets.RouteField', [], {}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.routefile': { + 'Meta': {'ordering': "('name',)", 'object_name': 'RouteFile'}, + 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'raw_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'simplified_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.subcategory': { + 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'routing_warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.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'] diff --git a/chimere/migrations/0039_auto__add_multimediaextension__chg_field_multimediafile_multimedia_typ.py b/chimere/migrations/0049_auto__chg_field_multimediafile_multimedia_type.py index 0b26a27..4e34d0b 100644 --- a/chimere/migrations/0039_auto__add_multimediaextension__chg_field_multimediafile_multimedia_typ.py +++ b/chimere/migrations/0049_auto__chg_field_multimediafile_multimedia_type.py @@ -8,22 +8,11 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding model 'MultimediaExtension' - db.create_table('chimere_multimediaextension', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=6)), - ('multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='extensions', to=orm['chimere.MultimediaType'])), - )) - db.send_create_signal('chimere', ['MultimediaExtension']) - # Changing field 'MultimediaFile.multimedia_type' db.alter_column('chimere_multimediafile', 'multimedia_type_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.MultimediaType'], null=True)) def backwards(self, orm): - # Deleting model 'MultimediaExtension' - db.delete_table('chimere_multimediaextension') - # User chose to not deal with backwards NULL issues for 'MultimediaFile.multimedia_type' raise RuntimeError("Cannot reverse this migration. 'MultimediaFile.multimedia_type' and its values cannot be restored.") @@ -115,6 +104,7 @@ class Migration(SchemaMigration): 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), @@ -162,6 +152,18 @@ class Migration(SchemaMigration): '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'}), + 'is_front_page': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.page': { + 'Meta': {'object_name': 'Page'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mnemonic': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '10', 'null': 'True', 'blank': 'True'}), + 'template_path': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}), 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) }, 'chimere.picturefile': { @@ -195,6 +197,13 @@ class Migration(SchemaMigration): 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) }, + 'chimere.propertymodelchoice': { + 'Meta': {'object_name': 'PropertyModelChoice'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, 'chimere.route': { 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), @@ -232,14 +241,19 @@ class Migration(SchemaMigration): }, 'chimere.subcategory': { 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'as_layer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'dated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'hover_icon': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'subcat_hovered'", 'null': 'True', 'to': "orm['chimere.Icon']"}), 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'routing_warn': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) }, 'chimere.tinyurl': { diff --git a/chimere/models.py b/chimere/models.py index 827a0e7..c393cba 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -25,6 +25,8 @@ import simplejson as json from lxml import etree from PIL import Image from subprocess import Popen, PIPE +from BeautifulSoup import BeautifulSoup + from django import forms from django.conf import settings from django.contrib import admin @@ -45,13 +47,64 @@ from chimere.managers import BaseGeoManager from chimere.utils import KMLManager, OSMManager, ShapefileManager, \ GeoRSSManager, CSVManager +class Page(models.Model): + """Simple extra pages + """ + title = models.CharField(_(u"Name"), max_length=150) + mnemonic = models.CharField(_(u"Mnemonic"), max_length=10, blank=True, + null=True) + available = models.BooleanField(_(u"Available"), default=True) + order = models.IntegerField(_(u"Order"), default=10, blank=True, null=True) + template_path = models.CharField(_(u"Template path"), max_length=150, + blank=True, null=True) + content = models.TextField(blank=True, null=True) + def __unicode__(self): + ordering = ["order"] + return self.title + class Meta: + verbose_name = _(u"Page") + verbose_name_plural = _(u"Page") + +def page_post_save(sender, **kwargs): + if not kwargs['instance']: + return + page = kwargs['instance'] + if not page.mnemonic: + page.mnemonic = defaultfilters.slugify(page.title) + page.save() +post_save.connect(page_post_save, sender=Page) + +def shortify(text): + if not text: + return '' + if len(text) <= settings.CHIMERE_SHORT_DESC_LENGTH: + return text + desc = text[:settings.CHIMERE_SHORT_DESC_LENGTH] + short_desc = "" + # find a correct opportunity to cut + for idx, c in enumerate(reversed(desc)): + if c == '>': + break + if c == '<': + short_desc = desc[:-(idx+1)] + break + if not short_desc: + for idx, c in enumerate(reversed(desc)): + if c == ' ' or c == '\n': + short_desc = desc[:-(idx+1)] + break + return BeautifulSoup(short_desc).prettify() + class News(models.Model): """News of the site """ title = models.CharField(_(u"Name"), max_length=150) available = models.BooleanField(_(u"Available")) + is_front_page = models.NullBooleanField(_(u"Is front page"), blank=True, + null=True) date = models.DateField(_(u"Date"), auto_now_add=True) content = models.TextField() + url = models.URLField(_(u"Url"), max_length=200, blank=True, null=True) areas = SelectMultipleField('Area', verbose_name=_(u"Associated areas"), blank=True, null=True) def __unicode__(self): @@ -61,6 +114,10 @@ class News(models.Model): verbose_name = _(u"News") verbose_name_plural = _(u"News") + @property + def short_desc(self): + return shortify(self.content) + class TinyUrl(models.Model): """Tinyfied version of permalink parameters """ @@ -156,14 +213,21 @@ class SubCategory(models.Model): available = models.BooleanField(_(u"Available"), default=True) submission = models.BooleanField(_(u"Available for submission"), default=True) - icon = models.ForeignKey(Icon, verbose_name=_(u"Icon")) - color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"), - blank=True, null=True) - order = models.IntegerField(_(u"Order"), default=1000) TYPE = (('M', _(u'Marker')), ('R', _(u'Route')), ('B', _(u'Both')),) item_type = models.CharField(_(u"Item type"), max_length=1, choices=TYPE) + dated = models.BooleanField(_(u"Is dated"), default=False) + description = models.TextField(blank=True, null=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') + color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"), + blank=True, null=True) + as_layer = models.BooleanField(_(u"Displayed in the layer menu"), + default=False) + routing_warn = models.BooleanField(_(u"Routing warn"), default=False) + order = models.IntegerField(_(u"Order"), default=1000) def __unicode__(self): return u"%s / %s" % (self.category.name, self.name) class Meta: @@ -207,6 +271,32 @@ class SubCategory(models.Model): subcategories = sorted(subcategories, key=get_cat_order) return subcategories + @classmethod + def getAvailableTuples(cls, area_name=None): + cats = [] + for cat, subcats in cls.getAvailable(area_name=area_name): + cats.append((unicode(cat), + [(subcat.pk, subcat.name) for subcat in subcats])) + return cats + + def getJSONDict(self): + items = {'id':self.pk, 'name':self.name, + 'description':self.description if self.description\ + else '', + 'icon':{'url':self.icon.image.url, + 'width':self.icon.image.width, + 'height':self.icon.image.height} + } + if self.hover_icon: + items['icon_hover'] = {'url':self.hover_icon.image.url} + return items + + def getJSON(self, categories_id=[]): + '''Return a JSON string - mainly used to get description + ''' + json_string = json.dumps(self.getJSONDict()) + return json_string + IMPORTERS = {'KML':KMLManager, 'OSM':OSMManager, 'SHP':ShapefileManager, @@ -338,6 +428,10 @@ class GeographicItem(models.Model): def properties(cls): return [pm for pm in PropertyModel.objects.filter(available=True)] + @classmethod + def all_properties(cls): + return [pm for pm in PropertyModel.objects.all()] + def property_setter(cls, propertymodel): def setter(self, value): marker = self @@ -360,6 +454,8 @@ class Marker(GeographicItem): route = models.ForeignKey(u"Route", blank=True, null=True, related_name='associated_marker') description = models.TextField(_(u"Description"), blank=True, null=True) + is_front_page = models.NullBooleanField(_(u"Is front page"), blank=True, + null=True) objects = models.GeoManager() def __unicode__(self): @@ -368,7 +464,7 @@ class Marker(GeographicItem): def __init__(self, *args, **kwargs): super(Marker, self).__init__(*args, **kwargs) # add read attributes for properties - for pm in self.properties(): + for pm in self.all_properties(): attr_name = pm.getAttrName() if not hasattr(self, attr_name): val = '' @@ -412,6 +508,10 @@ class Marker(GeographicItem): return self.start_date @property + def short_desc(self): + return shortify(self.description) + + @property def geometry(self): return self.point.wkt @@ -467,6 +567,18 @@ class Marker(GeographicItem): if len(properties) > 1: for property in properties[1:]: property.delete() + if pm.type == 'C' and value: + try: + value = str(int(value)) + except ValueError: + choice = PropertyModelChoice.objects.filter(propertymodel=pm, + value=value) + if choice.count(): + value = choice.all()[0].pk + else: + choice = PropertyModelChoice.objects.create(value=value, + propertymodel=pm) + value = choice.pk # new property if not properties: new_property = Property.objects.create(marker=self, @@ -498,12 +610,18 @@ class Marker(GeographicItem): items = {'id':self.id, 'name':json.dumps(self.name), 'geometry':self.point.geojson, 'icon_path':cat.icon.image, + 'icon_hover_path':cat.hover_icon.image \ + if cat.hover_icon else '', 'icon_width':cat.icon.image.width, - 'icon_height':cat.icon.image.height,} + 'icon_height':cat.icon.image.height, + 'category_name':json.dumps(cat.name)} jsons.append(u'{"type":"Feature", "geometry":%(geometry)s, '\ u'"properties":{"pk": %(id)d, "name": %(name)s, '\ - u'"icon_path":"%(icon_path)s", "icon_width":%(icon_width)d, '\ - u'"icon_height":%(icon_height)d}}' % items) + u'"icon_path":"%(icon_path)s", '\ + u'"icon_hover_path":"%(icon_hover_path)s", '\ + u'"icon_width":%(icon_width)d, '\ + u'"icon_height":%(icon_height)d, '\ + u'"category_name":%(category_name)s}}' % items) return ",".join(jsons) @property @@ -1337,11 +1455,15 @@ class PropertyModel(models.Model): TYPE = (('T', _('Text')), ('L', _('Long text')), ('P', _('Password')), - ('D', _("Date"))) + ('D', _("Date")), + ('C', _("Choices")), + ) TYPE_WIDGET = {'T':forms.TextInput, 'L':TextareaWidget, 'P':forms.PasswordInput, - 'D':DatePickerWidget} + 'D':DatePickerWidget, + 'C':forms.Select + } type = models.CharField(_(u"Type"), max_length=1, choices=TYPE) def __unicode__(self): return self.name @@ -1359,6 +1481,19 @@ class PropertyModel(models.Model): ''' return 'property_%d_%d' % (self.order, self.id) +class PropertyModelChoice(models.Model): + '''Choices for property model + ''' + propertymodel = models.ForeignKey(PropertyModel, related_name='choices', + verbose_name=_(u"Property model")) + value = models.CharField(_(u"Value"), max_length=150) + available = models.BooleanField(_(u"Available"), default=True) + def __unicode__(self): + return unicode(self.value) + + class Meta: + verbose_name = _(u"Model property choice") + class Property(models.Model): '''Property for a POI ''' @@ -1367,7 +1502,14 @@ class Property(models.Model): verbose_name=_(u"Property model")) value = models.TextField(_(u"Value")) def __unicode__(self): - return "%s : %s" % (str(self.propertymodel), self.value) + if self.propertymodel.type == 'C': + try: + return unicode(PropertyModelChoice.objects.get( + pk=self.value).value) + except self.DoesNotExist: + return "" + return unicode(self.value) + class Meta: verbose_name = _(u"Property") @@ -1378,6 +1520,11 @@ class Property(models.Model): return datetime.date(*[int(val) for val in self.value.split('-')]) except: return "" + if self.propertymodel.type == 'C' and self.value: + try: + return PropertyModelChoice.objects.get(pk=self.value) + except self.DoesNotExist: + return None else: return self.value diff --git a/chimere/route.py b/chimere/route.py new file mode 100644 index 0000000..eaa762a --- /dev/null +++ b/chimere/route.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# See the file COPYING for details. + +""" +Routing management +""" + +import os, re, shutil, tempfile +from BeautifulSoup import BeautifulSoup +from subprocess import Popen, PIPE +from django.contrib.gis.gdal import DataSource +from django.contrib.gis.gdal.error import OGRException + +from django.conf import settings + +class Router: + def route(self, lon1, lat1, lon2, lat2, transport='foot'): + ''' + Get a list of geojson polylines + ''' + return [] + +class RoutinoRouter(Router): + re_desc = [re.compile("<tr class='n'>"), re.compile("<tr class='s'>"), + re.compile("<tr class='t'>")] + def route(self, lon1, lat1, lon2, lat2, steps=[], transport='foot', + speed=None): + ''' + Get a list of geojson polylines and route description + ''' + language = settings.LANGUAGE_CODE.split('-')[0] + args = [settings.CHIMERE_ROUTING_ENGINE['PATH'], + "--dir=%s" % settings.CHIMERE_ROUTING_ENGINE['DB_PATH'], + "--transport=%s" % transport, + "--language=%s" % language, + "--shortest", + "--output-html", + "--output-gpx-track", + "--lat1=%0.15f" % lat1, + "--lon1=%0.15f" % lon1, + ] + if speed: + args += ["--speed-%s=%s" % (highway, unicode(speed)) + for highway in ('motorway', 'trunk', 'primary', 'secondary', + 'tertiary', 'unclassified', 'residential', 'service', + 'track','cycleway','path','steps')] + lonlat_index = 1 + for lon, lat in steps: + lonlat_index += 1 + args += ["--lat%d=%0.15f" % (lonlat_index, lat), + "--lon%d=%0.15f" % (lonlat_index, lon)] + lonlat_index += 1 + args += ["--lat%d=%0.15f" % (lonlat_index, lat2), + "--lon%d=%0.15f" % (lonlat_index, lon2)] + tmp_dir = tempfile.mkdtemp(prefix='chimere_') + os.sep + p = Popen(args, stdout=PIPE, cwd=tmp_dir) + p.communicate() + try: + ds = DataSource(tmp_dir + 'shortest-track.gpx') + except OGRException: + return [], None, None + if not ds: + return [], None, None + layer = ds[0] + trk_layer = None + for layer in ds: + if layer.name == 'tracks': + trk_layer = layer + break + multilines = trk_layer.get_geoms() + res = [] + for multiline in multilines: + res += [geom.geojson for geom in multiline] + desc = [] + # only keeping interessant lines of the desc + for line in open(tmp_dir + 'shortest.html').readlines(): + if [True for r in self.re_desc if r.match(line)]: + desc.append(BeautifulSoup(line).prettify()) + total = self.webify(desc[-1]) + desc = desc[1:-2] + # very fragile piece of code but only break the numerotation + number_tpl = '<tr class="n"><span class="number">%d.</span>' + desc = [re.sub('<tr class="n">', number_tpl % (idx/2+1), d) + if idx % 2 else d + for idx, d in enumerate(desc)] + desc = self.webify(BeautifulSoup('\n'.join(desc)).prettify()) + desc = re.sub(" \[", "", desc) + desc = re.sub(" \]", "", desc) + shutil.rmtree(tmp_dir) + return res, desc, total + + @staticmethod + def webify(lbl): + lbl = re.sub("<td", "<span", lbl) + lbl = re.sub("</td>", "</span>", lbl) + lbl = re.sub("</tr>", "</div>", lbl) + lbl = re.sub("<tr", "<div", lbl) + return lbl + +router = None +if settings.CHIMERE_ROUTING_ENGINE['ENGINE'] == 'routino': + router = RoutinoRouter() + diff --git a/chimere/static/chimere/css/admin.css b/chimere/static/chimere/css/admin.css new file mode 100644 index 0000000..931d139 --- /dev/null +++ b/chimere/static/chimere/css/admin.css @@ -0,0 +1,6 @@ +.vTextField{ + width:150px; +} +.vLargeTextField{ + width:200px; +} diff --git a/chimere/static/chimere/css/print.css b/chimere/static/chimere/css/print.css new file mode 100644 index 0000000..8dda0b8 --- /dev/null +++ b/chimere/static/chimere/css/print.css @@ -0,0 +1,40 @@ +#topbar, .no-titlebar-simple.ui-dialog, +#zoombar, #zoomin, #zoomout, #slidebar, +#pandown, #panup, #panright, #panleft, +div#footer p.map-footer{ + display:none; +} + +#main-map{ + z-index:10; + top:0; + bottom:0; + height:605pt; + max-height:605pt; + width:1200pt; + right:50%; + border:none; +} + +#panel #chimere_itinerary_panel{ + width:870pt; + bottom:auto; + left:auto; + right:auto; + top:605pt; + position:absolute; + z-index:1000; +} + +#sidebar div#panel{ + width:900pt; + border:none; + overflow:visible; +} + +#chimere_start_label, +#chimere_end_label{ + width:auto; + overflow:auto; +} + diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 3b835af..67a28a4 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -15,7 +15,8 @@ a, a:link, a:visited, legend, h2, h3, th, .action li, .action li a, .action li li a, #no-js-message, -#footer a, #footer a:link, #footer a:visited, .ui-widget-header{ +#footer a, #footer a:link, #footer a:visited, .ui-widget-header, +#chimere_itinerary td.l{ color:#fff; } @@ -25,11 +26,23 @@ h2, h3, th, .action li, .action li a, color:#333; } +.nominatim-widget, .disabled{ + color:#aaa; +} + +#chimere_total_label td.l{ + color:#000; +} + /* background-color definition */ body, h2, h3, th, .ui-widget-header, -.action li.selected, #no-js-message{ +#layer_selection h4, +.action li.selected, #no-js-message, +#content .olControlLayerSwitcher .layersDiv, +#content .olControlLayerSwitcher span, +#chimere_itinerary td.l{ background-color:#449506; } @@ -38,10 +51,12 @@ body, h2, h3, th, } fieldset, .action li, #content, -#map-footer, #panel, #areas, +#layer_selection #layer_list, +#map-footer, #panel, #chimere_itinerary_panel, #areas, #welcome, #detail, .detail_footer a, #content .olControlLayerSwitcher .layersDiv, #content .olControlLayerSwitcher span, +#chimere_total_label td.l, #main-map, .window{ background-color:#FFF; } @@ -58,12 +73,14 @@ div.warning, .errorlist{ border:1px solid #54c200; } +#layer_selection h4, +#layer_selection #layer_list, #areas, #detail, #main-map, div.warning, #content, .action li.selected, #content .olControlLayerSwitcher .layersDiv, -#panel, #map-footer, +#panel, #map-footer, #chimere_itinerary_panel, #utils-div{ border:1px solid #327e04; } @@ -79,7 +96,7 @@ div.warning, opacity:0.9; } -#panel, #areas, #detail, #category_detail{ +#panel, #areas, #detail, #category_description, #chimere_itinerary_panel{ opacity:0.8; } @@ -102,7 +119,7 @@ h2, #action li, .detail_footer{ fieldset, #content, #panel, #areas, #welcome, #detail, -#category_detail, div.warning{ +#category_description, div.warning{ -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; @@ -153,7 +170,6 @@ h3{ h4, caption{ font-weight:normal; - font-style:italic; margin:0; text-align:left; } @@ -174,6 +190,10 @@ fieldset{ margin-top:8px; } +.hidden{ + display:none; +} + .ui-dialog-buttonset{ text-align:center; } @@ -192,7 +212,7 @@ fieldset{ } #topbar{ - z-index:0; + z-index:10; } ul.action{ @@ -324,6 +344,7 @@ ul.share{ list-style-type:none; margin:0; padding:0; + display:inline; } ul.share li{ @@ -342,6 +363,10 @@ ul.share li{ height:22px; } +.share .share-icon img{ + width:74px; +} + .detail_footer{ text-align:center; position:absolute; @@ -366,8 +391,6 @@ ul.share li{ #main-map{ position:absolute; - margin:0px; - padding:0px; height:93%; margin:0; padding:0; @@ -398,6 +421,45 @@ ul.share li{ z-index:0; } +#layer_selection{ + position:absolute; + z-index:100; + top:80px; + left:200px; +} + +#layer_selection h4, +#layer_selection #layer_list li{ + padding:2px 5px; +} + +#layer_selection h4{ + font-weight:normal; + border-width:1px; + border-style:solid; + width:140px; + text-align:center; +} + +#layer_selection h4:hover{ + cursor:pointer; +} + +#layer_selection ul{ + display:block; +} + +#layer_selection ul#layer_list{ + width:150px; + display:none; + list-style:none; + margin:0; + padding:0; + border-width:1px; + border-style:solid; + border-top:none; +} + .news h3{ padding:0px; margin:0; @@ -420,12 +482,110 @@ ul.share li{ top:50px; right:18px; width:300px; - bottom:44px; + max-height:300px; overflow:auto; padding:0.5em; padding-top:0; } +#chimere_itinerary_panel, +#chimere_itinerary{ + display:none; +} + +#chimere_itinerary_panel label{ + color:#000; +} + +#chimere_itinerary_panel p +{ + margin:0.5em; +} + +#total_label_div{ + margin:5px 0; +} + +.itinerary_label{ + font-size:0.9em; + padding-top:0.5em; + font-style:italic; +} + +.itinerary_label .label{ + font-style:normal; + font-weight:bold; + padding:3px 8px; +} + + +#chimere_itinerary_content{ + overflow:auto; + height:190px; + margin-top:10px; +} + +#chimere_itinerary_content span.l{ + padding:5px; + width:60px; +} + +#chimere_itinerary_content span.j{ + font-style:italic; +} + +#chimere_itinerary_content .number{ + font-weight:bold; +} + +#chimere_itinerary_content span.t, +#chimere_itinerary_content span.b +{ + text-transform: lowercase; +} + +#chimere_map_menu{ + z-index:4; + display:none; + position:absolute; + padding:0.5em; + background-color:#fff; + border:1px solid #bbb; + -webkit-border-radius: 0 8px 8px 8px; + -moz-border-radius: 0 8px 8px 8px; + border-radius: 0 8px 8px 8px; +} + +#map_menu_clear{ + display:none; +} + +#map_menu_zoomin{ + border-top:1px solid #999; +} + +#chimere_map_menu ul, #chimere_map_menu li{ + padding:0.2em; + margin:0; + list-style:none; +} + +#chimere_map_menu li:hover{ + cursor:pointer; + background-color:#ccc; +} + +.nominatim-label{ + display:block; + font-size:0.9em; + font-weight:bold; + height:2.8em; +} + +.nominatim-widget{ + font-style:italic; +} + .simple #panel{ top:5px; bottom:auto; @@ -504,6 +664,11 @@ ul.subcategories label img{ height:20px; } +li.main_category > span:hover, +li.main_category label:hover{ + cursor:pointer; +} + #categories li#display_submited{ font-variant:normal; } @@ -556,11 +721,10 @@ p.warning{ } -#welcome_button, -#simple_button, +a#welcome_button, +a#routing_button, #permalink{ display: block; - text-align:center; margin:0.3em; padding:0.2em; width:100%; @@ -615,6 +779,40 @@ table.inline-table td input[type=file]{ margin-right: auto; } +.alert-box .ui-dialog-titlebar { + display:none; +} + +ul#multimedia_list_content{ + padding:0; + margin:0; + list-style-type:none; +} + +ul#multimedia_list_content li{ + padding:0.5em 5px 0.5em 35px; + margin:0; + display:block; + list-style-type:none; + border-bottom:1px solid; +} + +ul#multimedia_list_content li img{ + display:block; + float:right; +} + +ul#multimedia_list_content li.picture{ + background-image:url("../img/img_logo.png"); + background-position:4px center; + background-repeat:no-repeat; +} + +ul#multimedia_list_content li.multimedia{ + background-image:url("../img/film_logo.png"); + background-position:6px center; + background-repeat:no-repeat; +} #waiting{ /* Fixed position to provide the vertical offset */ position:fixed; @@ -813,6 +1011,26 @@ div.pp_default .pp_expand{ SimplePanZoom */ +#main_map.olMap{ + z-index:0; +} + +#marker_hover{ + display:none; + position:absolute; + z-index:5; + background-image: url('../img/bottom-arrow.png'); + background-repeat: no-repeat; + background-position: center bottom; +} + +#marker_hover_content{ + margin-bottom:6px; + background-color:#fff; + border:1px solid #000; + padding:0.1em 0.5em; +} + .olControlSimplePanZoom { top: 10px; right: 10px; diff --git a/chimere/static/chimere/img/bottom-arrow.png b/chimere/static/chimere/img/bottom-arrow.png Binary files differnew file mode 100644 index 0000000..7393ffe --- /dev/null +++ b/chimere/static/chimere/img/bottom-arrow.png diff --git a/chimere/static/chimere/img/close.png b/chimere/static/chimere/img/close.png Binary files differnew file mode 100644 index 0000000..f9e8d04 --- /dev/null +++ b/chimere/static/chimere/img/close.png diff --git a/chimere/static/chimere/img/empty.png b/chimere/static/chimere/img/empty.png Binary files differnew file mode 100644 index 0000000..1ad1e19 --- /dev/null +++ b/chimere/static/chimere/img/empty.png diff --git a/chimere/static/chimere/img/feed.png b/chimere/static/chimere/img/feed.png Binary files differnew file mode 100644 index 0000000..19d2246 --- /dev/null +++ b/chimere/static/chimere/img/feed.png diff --git a/chimere/static/chimere/img/film_logo.png b/chimere/static/chimere/img/film_logo.png Binary files differnew file mode 100644 index 0000000..1ccdc2e --- /dev/null +++ b/chimere/static/chimere/img/film_logo.png diff --git a/chimere/static/chimere/img/flag-finish.png b/chimere/static/chimere/img/flag-finish.png Binary files differnew file mode 100644 index 0000000..04bfa1d --- /dev/null +++ b/chimere/static/chimere/img/flag-finish.png diff --git a/chimere/static/chimere/img/flag-start.png b/chimere/static/chimere/img/flag-start.png Binary files differnew file mode 100644 index 0000000..c93f2a3 --- /dev/null +++ b/chimere/static/chimere/img/flag-start.png diff --git a/chimere/static/chimere/img/flag-step.png b/chimere/static/chimere/img/flag-step.png Binary files differnew file mode 100644 index 0000000..5556c94 --- /dev/null +++ b/chimere/static/chimere/img/flag-step.png diff --git a/chimere/static/chimere/img/images_licences b/chimere/static/chimere/img/images_licences index 0e732fc..d6d2773 100644 --- a/chimere/static/chimere/img/images_licences +++ b/chimere/static/chimere/img/images_licences @@ -1,5 +1,5 @@ -* Upload image credit +* Upload image credit (upload.png) * Farm-Fresh layer gps.png in Farm-Fresh Web Icons Author: FatCow Web Hosting @@ -16,17 +16,26 @@ Author: The Tango! Desktop Project Licence: Public domain Url: http://commons.wikimedia.org/wiki/File:Internet-web-browser.svg -* Drawing image credit +* Drawing image credit (drawing.png) * Icons from the Tango! project set. Author: The Tango! Desktop Project Licence: Public domain Url: http://commons.wikimedia.org/wiki/File:Edit-find-replace.svg -Url 2: http://commons.wikimedia.org/wiki/File:Internet-web-browser.svg + http://commons.wikimedia.org/wiki/File:Internet-web-browser.svg + https://commons.wikimedia.org/wiki/File:Document-print.svg -* Quaver image credit +* Quaver image credit (8thNote.png) * An 8th-note. Author: Sbrools Licence: Public domain Url: https://commons.wikimedia.org/wiki/File:8thNote.svg + +* Flags image credit (flag-start.png, flag-step.png, flag-finish.png) + +Author: FatCow Web Hosting +Licence: Creative Commons Attribution 3.0 United States license +Url: https://upload.wikimedia.org/wikipedia/commons/c/cb/Farm-Fresh_flag_1.png + https://upload.wikimedia.org/wikipedia/commons/8/81/Farm-Fresh_flag_blue.png + https://upload.wikimedia.org/wikipedia/commons/6/64/Farm-Fresh_flag_finish.png diff --git a/chimere/static/chimere/img/img_logo.png b/chimere/static/chimere/img/img_logo.png Binary files differnew file mode 100644 index 0000000..b487506 --- /dev/null +++ b/chimere/static/chimere/img/img_logo.png diff --git a/chimere/static/chimere/img/marker-cluster.png b/chimere/static/chimere/img/marker-cluster.png Binary files differnew file mode 100644 index 0000000..73b4146 --- /dev/null +++ b/chimere/static/chimere/img/marker-cluster.png diff --git a/chimere/static/chimere/img/printer.png b/chimere/static/chimere/img/printer.png Binary files differnew file mode 100644 index 0000000..5a5dbaf --- /dev/null +++ b/chimere/static/chimere/img/printer.png diff --git a/chimere/static/chimere/img/share-icon.png b/chimere/static/chimere/img/share-icon.png Binary files differnew file mode 100644 index 0000000..f21b76e --- /dev/null +++ b/chimere/static/chimere/img/share-icon.png diff --git a/chimere/static/chimere/img/share-icon.xcf b/chimere/static/chimere/img/share-icon.xcf Binary files differnew file mode 100644 index 0000000..d149768 --- /dev/null +++ b/chimere/static/chimere/img/share-icon.xcf diff --git a/chimere/static/chimere/js/base.js b/chimere/static/chimere/js/base.js index e76fe76..ba2ffc2 100644 --- a/chimere/static/chimere/js/base.js +++ b/chimere/static/chimere/js/base.js @@ -107,3 +107,36 @@ function zoomToCurrentExtent(map){ map.zoomToExtent(extent, true); return true; } + +/* interface */ +function share_link_update(){ + $('.share_link').click(function(){ + if (this.share_initialized){ + return false; + } + this.share_initialized = true; + var href = $(this).attr('href'); + var url = get_share_url; + var classes = $(this).attr('class').split(' '); + prefix = 'share_id_'; + var share_id; + for (idx=0;idx<classes.length;idx++){ + if(classes[idx].substring(0, prefix.length) == prefix){ + var share_id = classes[idx].substring(prefix.length); + } + } + var params = $('#permalink a').attr('href').split('/'); + url += share_id + params[params.length-1]; + $.ajax({url: url, + dataType: "html", + success: function (url) { + window.open(url); + return false; + }, + error: function(){ + return false; + } + }); + return false; + }); +} diff --git a/chimere/static/chimere/js/clustering.js b/chimere/static/chimere/js/clustering.js new file mode 100644 index 0000000..b3a142c --- /dev/null +++ b/chimere/static/chimere/js/clustering.js @@ -0,0 +1,278 @@ +/* + Add a recluster to Cluster class. + probably part of OpenLayers 2.13 +*/ + + +OpenLayers.Strategy.Cluster = OpenLayers.Class(OpenLayers.Strategy, { + + /** + * APIProperty: distance + * {Integer} Pixel distance between features that should be considered a + * single cluster. Default is 20 pixels. + */ + distance: 20, + + /** + * APIProperty: threshold + * {Integer} Optional threshold below which original features will be + * added to the layer instead of clusters. For example, a threshold + * of 3 would mean that any time there are 2 or fewer features in + * a cluster, those features will be added directly to the layer instead + * of a cluster representing those features. Default is null (which is + * equivalent to 1 - meaning that clusters may contain just one feature). + */ + threshold: null, + + /** + * Property: features + * {Array(<OpenLayers.Feature.Vector>)} Cached features. + */ + features: null, + + /** + * Property: clusters + * {Array(<OpenLayers.Feature.Vector>)} Calculated clusters. + */ + clusters: null, + + /** + * Property: clustering + * {Boolean} The strategy is currently clustering features. + */ + clustering: false, + + /** + * Property: resolution + * {Float} The resolution (map units per pixel) of the current cluster set. + */ + resolution: null, + + /** + * Constructor: OpenLayers.Strategy.Cluster + * Create a new clustering strategy. + * + * Parameters: + * options - {Object} Optional object whose properties will be set on the + * instance. + */ + + /** + * APIMethod: activate + * Activate the strategy. Register any listeners, do appropriate setup. + * + * Returns: + * {Boolean} The strategy was successfully activated. + */ + activate: function() { + var activated = OpenLayers.Strategy.prototype.activate.call(this); + if(activated) { + this.layer.events.on({ + "beforefeaturesadded": this.cacheFeatures, + "moveend": this.cluster, + scope: this + }); + } + return activated; + }, + + /** + * APIMethod: deactivate + * Deactivate the strategy. Unregister any listeners, do appropriate + * tear-down. + * + * Returns: + * {Boolean} The strategy was successfully deactivated. + */ + deactivate: function() { + var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this); + if(deactivated) { + this.clearCache(); + this.layer.events.un({ + "beforefeaturesadded": this.cacheFeatures, + "moveend": this.cluster, + scope: this + }); + } + return deactivated; + }, + + /** + * Method: cacheFeatures + * Cache features before they are added to the layer. + * + * Parameters: + * event - {Object} The event that this was listening for. This will come + * with a batch of features to be clustered. + * + * Returns: + * {Boolean} False to stop features from being added to the layer. + */ + cacheFeatures: function(event) { + var propagate = true; + if(!this.clustering) { + this.clearCache(); + this.features = event.features; + this.cluster(); + propagate = false; + } + return propagate; + }, + + /** + * Method: clearCache + * Clear out the cached features. + */ + clearCache: function() { + this.features = null; + }, + + /** + * Method: cluster + * Cluster features based on some threshold distance. + * + * Parameters: + * event - {Object} The event received when cluster is called as a + * result of a moveend event. + */ + cluster: function(event) { + if((!event || event.zoomChanged || (event && event.recluster)) && this.features) { + var resolution = this.layer.map.getResolution(); + if(resolution != this.resolution || !this.clustersExist() || (event && event.recluster)) { + this.resolution = resolution; + var clusters = []; + var feature, clustered, cluster; + for(var i=0; i<this.features.length; ++i) { + feature = this.features[i]; + if(feature.geometry) { + clustered = false; + for(var j=clusters.length-1; j>=0; --j) { + cluster = clusters[j]; + if(this.shouldCluster(cluster, feature)) { + this.addToCluster(cluster, feature); + clustered = true; + break; + } + } + if(!clustered) { + clusters.push(this.createCluster(this.features[i])); + } + } + } + this.layer.removeAllFeatures(); + if(clusters.length > 0) { + if(this.threshold > 1) { + var clone = clusters.slice(); + clusters = []; + var candidate; + for(var i=0, len=clone.length; i<len; ++i) { + candidate = clone[i]; + if(candidate.attributes.count < this.threshold) { + Array.prototype.push.apply(clusters, candidate.cluster); + } else { + clusters.push(candidate); + } + } + } + this.clustering = true; + // A legitimate feature addition could occur during this + // addFeatures call. For clustering to behave well, features + // should be removed from a layer before requesting a new batch. + this.layer.addFeatures(clusters); + this.clustering = false; + } + this.clusters = clusters; + } + } + }, + + /** + * Method: recluster + * User-callable function to recluster features + * Useful for instances where a clustering attribute (distance, threshold, ...) + * has changed + */ + recluster: function(){ + var event={"recluster":true}; + this.cluster(event); + }, + + /** + * Method: clustersExist + * Determine whether calculated clusters are already on the layer. + * + * Returns: + * {Boolean} The calculated clusters are already on the layer. + */ + clustersExist: function() { + var exist = false; + if(this.clusters && this.clusters.length > 0 && + this.clusters.length == this.layer.features.length) { + exist = true; + for(var i=0; i<this.clusters.length; ++i) { + if(this.clusters[i] != this.layer.features[i]) { + exist = false; + break; + } + } + } + return exist; + }, + + /** + * Method: shouldCluster + * Determine whether to include a feature in a given cluster. + * + * Parameters: + * cluster - {<OpenLayers.Feature.Vector>} A cluster. + * feature - {<OpenLayers.Feature.Vector>} A feature. + * + * Returns: + * {Boolean} The feature should be included in the cluster. + */ + shouldCluster: function(cluster, feature) { + var cc = cluster.geometry.getBounds().getCenterLonLat(); + var fc = feature.geometry.getBounds().getCenterLonLat(); + var distance = ( + Math.sqrt( + Math.pow((cc.lon - fc.lon), 2) + Math.pow((cc.lat - fc.lat), 2) + ) / this.resolution + ); + return (distance <= this.distance); + }, + + /** + * Method: addToCluster + * Add a feature to a cluster. + * + * Parameters: + * cluster - {<OpenLayers.Feature.Vector>} A cluster. + * feature - {<OpenLayers.Feature.Vector>} A feature. + */ + addToCluster: function(cluster, feature) { + cluster.cluster.push(feature); + cluster.attributes.count += 1; + }, + + /** + * Method: createCluster + * Given a feature, create a cluster. + * + * Parameters: + * feature - {<OpenLayers.Feature.Vector>} + * + * Returns: + * {<OpenLayers.Feature.Vector>} A cluster. + */ + createCluster: function(feature) { + var center = feature.geometry.getBounds().getCenterLonLat(); + var cluster = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point(center.lon, center.lat), + {count: 1} + ); + cluster.cluster = [feature]; + return cluster; + }, + + CLASS_NAME: "OpenLayers.Strategy.Cluster" +}); diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 3168c24..7dd9f4d 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -67,6 +67,11 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { lat: null, lon: null, simple: false, + routing_start_lat: null, + routing_start_lon: null, + routing_end_lat: null, + routing_end_lon: null, + routing_steps_lonlat: null, // Provide this function to make a custom click event on the marker on_marker_click: null, // Provide this function to override the feature detail display @@ -74,24 +79,44 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { // Provide this function for overriding the getSubcategories default get_subcategories_fx: null, hide_popup_fx: null, + // if leave to false every click on the map hide the pop-up + explicit_popup_hide: false, controls:[new OpenLayers.Control.Navigation(), - new OpenLayers.Control.SimplePanZoom(), + new OpenLayers.Control.PanPanel(), + new OpenLayers.Control.ZoomPanel(), new OpenLayers.Control.ScaleLine()], + popupClass: OpenLayers.Popup.FramedCloud, + popupContentFull: false, // if true the detail is inside the popup + category_accordion: true, // category opening behave like an accordion maxResolution: 156543.0399, units: 'm', projection: new OpenLayers.Projection('EPSG:4326'), - theme:null, + theme: null, + enable_clustering: true, + routing: false, // enable routing management + routing_panel_open: function(){ + $('#chimere_itinerary_panel').dialog('open'); + }, current_feature: null, // To store the active POI current_control: null, // To store the current control current_popup: null, // To store the current POI popup displayed current_category: null, // To store the current category clicked in list + current_route_feature: null, // To store the current route find by routing + itinerary_step_number:0, // current step number icon_offset: new OpenLayers.Pixel(0, 0), edition: false, // edition mode edition_type_is_route: false, // route or POI edition default_icon: new OpenLayers.Icon( 'http://www.openlayers.org/dev/img/marker-green.png', new OpenLayers.Size(21, 25), - new OpenLayers.Pixel(-(21/2), -25)) + new OpenLayers.Pixel(-(21/2), -25)), + cluster_icon: null, + marker_hover_id:'marker_hover', + marker_hover_content_id:'marker_hover_content', + marker_hover_offset: null, + icon_start: null, + icon_step: null, + icon_end: null }; var settings = {}; /* @@ -103,6 +128,31 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { */ init: function ( options ) { /* Manage parameters */ + // not staticaly in default because of STATIC_URL init + if (defaults.cluster_icon == null && typeof STATIC_URL != 'undefined'){ + defaults.cluster_icon = new OpenLayers.Icon( + STATIC_URL+'chimere/img/marker-cluster.png', + new OpenLayers.Size(36, 39), + new OpenLayers.Pixel(-(36/2), -(39/2))); + } + if (defaults.icon_start == null && typeof STATIC_URL != 'undefined'){ + defaults.icon_start = new OpenLayers.Icon( + STATIC_URL + "chimere/img/flag-start.png", + new OpenLayers.Size(32, 32), + new OpenLayers.Pixel(0, -32)); + } + if (defaults.icon_step == null && typeof STATIC_URL != 'undefined'){ + defaults.icon_step = new OpenLayers.Icon( + STATIC_URL + "chimere/img/flag-step.png", + new OpenLayers.Size(32, 32), + new OpenLayers.Pixel(0, -32)); + } + if (defaults.icon_end == null && typeof STATIC_URL != 'undefined'){ + defaults.icon_end = new OpenLayers.Icon( + STATIC_URL + "chimere/img/flag-finish.png", + new OpenLayers.Size(32, 32), + new OpenLayers.Pixel(0, -32)); + } settings = $.extend({}, defaults); if ( options ) $.extend(settings, options); var map_element = $(this).get(0); @@ -119,6 +169,8 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { map_options['restrictedExtent'] = settings.restricted_extent; } + settings.current_position = null; + /* Create map object */ settings.map = map = new OpenLayers.Map(map_element, map_options); @@ -142,8 +194,29 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { // Make specific params params.checked_categories = settings.checked_categories; params.display_submited = settings.display_submited; - if(settings.current_feature){ + if(settings.current_feature) params.current_feature = settings.current_feature.pk; + if (settings.routing_start){ + lonlat = settings.routing_start.lonlat.clone().transform( + EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION); + params.routing_start_lon = lonlat.lon; + params.routing_start_lat = lonlat.lat; + } + if (settings.routing_end){ + lonlat = settings.routing_end.lonlat.clone().transform( + EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION); + params.routing_end_lon = lonlat.lon; + params.routing_end_lat = lonlat.lat; + } + if (settings.routing_steps){ + var steps = []; + for (var i = 0; i < settings.routing_steps.length; i++){ + lonlat = settings.routing_steps[i].lonlat.clone( + ).transform(EPSG_PROJECTION, + EPSG_DISPLAY_PROJECTION); + steps.push([lonlat.lon, lonlat.lat]); + } + params.routing_steps = steps; } return params; } @@ -168,6 +241,26 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } settings.map.setBaseLayer( settings.map_layers[settings.selected_map_layer]); + + /* manage the context menu */ + $('#map_menu_zoomin').bind("click", methods.zoomIn); + $('#map_menu_zoomout').bind("click", methods.zoomOut); + $('#map_menu_center').bind("click", methods.mapCenter); + /* manage the routing */ + if (settings.routing){ + settings.routing_start = null; + settings.routing_steps = new Array(); + settings.routing_end = null; + $('#map_menu_from').bind("click", methods.routingFrom); + $('#map_menu_step').bind("click", methods.routingAddStep); + $('#map_menu_to').bind("click", methods.routingTo); + $('#map_menu_clear').bind("click", methods.routingClear); + settings.layerRoute = new OpenLayers.Layer.Vector("Route Layer"); + settings.map.addLayer(settings.layerRoute); + settings.layerRouteMarker = new OpenLayers.Layer.Markers( + 'Route markers'); + settings.map.addLayer(settings.layerRouteMarker); + } /* Vectors layer */ settings.layerVectors = new OpenLayers.Layer.Vector("Vector Layer"); settings.map.addLayer(settings.layerVectors); @@ -178,10 +271,94 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { settings.map.addControl(new OpenLayers.Control.ModifyFeature( settings.layerVectors, {clickout:false, toggle:false})); } + + if (settings.enable_clustering){ + var style = new OpenLayers.Style({ + graphicTitle: "${name}", + externalGraphic: "${icon}", + graphicWidth: "${width}", + graphicHeight: "${height}", + graphicXOffset: "${offsetx}", + graphicYOffset: "${offsety}", + graphicOpacity: 1, + label: "${label}", + labelYOffset: "2", + fontSize:'1.3em' + }, { + context: { + name: function(feature) { + if(feature.cluster) { + feature.attributes.width = settings.cluster_icon.size.w; + feature.attributes.height = settings.cluster_icon.size.h; + feature.attributes.offsetx = settings.cluster_icon.offset.x; + feature.attributes.offsety = settings.cluster_icon.offset.y; + } else{ + var marker = feature.attributes.marker + feature.attributes.width = marker.icon.size.w; + feature.attributes.height = marker.icon.size.h; + feature.attributes.offsetx = settings.icon_offset.x; + feature.attributes.offsety = settings.icon_offset.y; + } + return feature.attributes.name; + }, + label: function(feature) { + // clustered features count or blank if feature is not a cluster + return feature.cluster ? feature.cluster.length : ""; + }, + icon: function(feature) { + if (feature.cluster){ + return settings.cluster_icon.url; + } else { + return STATIC_URL + 'chimere/img/empty.png'; + } + }, + width: function(feature) { return feature.attributes.width; }, + height: function(feature) { return feature.attributes.height; }, + offsetx: function(feature) { return feature.attributes.offsetx; }, + offsety: function(feature) { return feature.attributes.offsety; } + }}); + + + /* Cluster layer */ + settings.clustering = new OpenLayers.Strategy.Cluster({ + distance: 10, + threshold: 2}); + settings.layerCluster = new OpenLayers.Layer.Vector("Cluster layer", + {styleMap: new OpenLayers.StyleMap({'default': style}), + strategies: [settings.clustering]}); + settings.map.addLayer(settings.layerCluster); + + var highlightCtrl = new OpenLayers.Control.SelectFeature( + settings.layerCluster, { + hover: true, + highlightOnly: true, + eventListeners: { + featurehighlighted: function(e) { + if(e.feature.attributes.marker) + e.feature.attributes.marker.events.triggerEvent('mouseover'); + }, + featureunhighlighted: function(e) { + if(e.feature.attributes.marker) + e.feature.attributes.marker.events.triggerEvent('mouseout'); + } + } + }); + + var selectCtrl = new OpenLayers.Control.SelectFeature( + settings.layerCluster,{ + onSelect: methods.zoomOnCluster + }); + + settings.map.addControl(highlightCtrl); + settings.map.addControl(selectCtrl); + + highlightCtrl.activate(); + selectCtrl.activate(); + } + /* Markers layer */ settings.layerMarkers = new OpenLayers.Layer.Markers('POIs'); settings.map.addLayer(settings.layerMarkers); - settings.layerMarkers.setOpacity(0.8); if (settings.dynamic_categories){ settings.map.events.register('moveend', settings.map, @@ -207,15 +384,16 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } if (!settings.edition){ + if (settings.enable_clustering){ + settings.map.events.register('zoomend', null, + methods.cleanCluster); + } methods.loadCategories(); methods.loadGeoObjects(); - // Hide popUp when clicking on map - settings.map.events.register('click', settings.map, - methods.hidePopup); + methods.activateContextMenu() } else { if (!settings.edition_type_is_route){ - map.events.register('click', settings.map, - methods.setMarker); + methods.activateMarkerEdit(); } else { settings.layerVectors.events.register('featuremodified', settings.layerVectors, helpers.updateRouteForm); @@ -223,8 +401,137 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { settings.layerVectors, helpers.featureRouteCreated); } } + if (settings.routing_start_lon && settings.routing_start_lat){ + settings.current_position = new OpenLayers.LonLat( + settings.routing_start_lon, settings.routing_start_lat + ).transform(EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION); + methods.routingFrom(); + } + if (settings.routing_end_lon && settings.routing_end_lat){ + settings.current_position = new OpenLayers.LonLat( + settings.routing_end_lon, settings.routing_end_lat + ).transform(EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION); + methods.routingTo(); + } + if (settings.routing_steps_lonlat){ + for (var i = 0; i < settings.routing_steps_lonlat.length/2; i++) { + lon = settings.routing_steps_lonlat[i*2]; + lat = settings.routing_steps_lonlat[i*2+1]; + settings.current_position = new OpenLayers.LonLat(lon, lat + ).transform(EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION); + methods.routingAddStep(); + } + } + methods.preload_images(); }, // end of init + /* Preload icons */ + preload_images: function(){ + if (typeof extra_url == 'undefined') return; + var uri = extra_url + "getAllCategories/"; + $.ajax({url: uri, + dataType: "json", + success: function (data) { + if (!data.categories){return} + for(var idx=0; idx<data.categories.length; idx++){ + new Image().src = data.categories[idx].icon.url; + if(data.categories[idx].icon_hover){ + new Image().src = data.categories[idx].icon_hover.url; + } + } + }, + error: function (data) { + // fail silently + } + }); + }, + + activateContextMenu: function(){ + settings.edition_type_is_route = false; + settings.map.events.unregister('click', settings.map, + methods.setMarker); + settings.map.events.register('click', settings.map, + methods.displayMapMenu); + }, + + activateRouteEdit: function(){ + settings.edition_type_is_route = true; + settings.map.events.unregister('click', settings.map, + methods.setMarker); + settings.map.events.register('click', settings.map, + methods.displayMapMenu); + }, + + activateMarkerEdit: function(){ + settings.edition_type_is_route = false; + if ($('#chimere_map_menu').length){ + $('#chimere_map_menu').hide(); + } + if (settings.current_popup != null) { + settings.current_popup.hide(); + } + settings.map.events.unregister('click', settings.map, + methods.displayMapMenu); + settings.map.events.register('click', settings.map, + methods.setMarker); + }, + // change map_layer + changeMapLayer: function(map_idx){ + settings.map.setBaseLayer(settings.map_layers[map_idx]); + }, + + // init the context menu + zoomIn: function(){ + methods.mapCenter(); + settings.map.zoomIn(); + }, + + // zoom out from the map menu + zoomOut: function(){ + methods.mapCenter(); + settings.map.zoomOut(); + }, + // center from the map menu + mapCenter: function(){ + $('#chimere_map_menu').hide(); + settings.map.setCenter(settings.current_position); + }, + + // set current position + setCurrentPosition: function(lonlat){ + settings.current_position = lonlat; + }, + zoomOnCluster: function(feature){ + if(!feature.cluster) // if not cluster + { + feature.attributes.marker.events.triggerEvent('click'); + feature.attributes.marker.events.triggerEvent('mouseover'); + feature.attributes.marker.events.triggerEvent('mouseout'); + } else { + methods.zoomIn(); + settings.map.setCenter( + feature.geometry.getBounds().getCenterLonLat()); + } + }, + + /* + * Display menu on the map + */ + displayMapMenu: function(e) { + if (methods.hidePopup(e)) return; + if ($('#chimere_map_menu').is(":visible")){ + $('#chimere_map_menu').hide(); + } else{ + methods.setCurrentPosition( + settings.map.getLonLatFromViewPortPx(e.xy)); + var offsetX = e.pageX; + var offsetY = e.pageY; + $('#chimere_map_menu').show('fast'); + $('#chimere_map_menu').css('display', 'block'); + $('#chimere_map_menu').css('top', offsetY); + $('#chimere_map_menu').css('left', offsetX); + } + }, /* * Load markers and route from DB */ @@ -240,6 +547,10 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { success: function (data) { settings.layerMarkers.clearMarkers(); settings.layerVectors.removeAllFeatures(); + if (settings.enable_clustering){ + settings.cluster_array = []; + settings.layerCluster.removeAllFeatures(); + } for (var i = 0; i < data.features.length; i++) { var feature = data.features[i]; if (feature.geometry.type == 'Point'){ @@ -248,17 +559,25 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { methods.addRoute(feature); } } + if (settings.enable_clustering){ + settings.layerCluster.addFeatures( + settings.cluster_array); + methods.cleanCluster(); + } + settings.map.resetLayersZIndex(); }, error: function (data) { settings.layerMarkers.clearMarkers(); settings.layerVectors.removeAllFeatures(); + if (settings.enable_clustering){ + settings.layerCluster.removeAllFeatures(); + } }, complete: function () { if($('#waiting').length){$('#waiting').hide();} } }); }, - /* * Update the categories div in ajax */ @@ -276,7 +595,9 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { if (settings.display_submited) params["status"] = "A_S"; $.ajax({url: uri, data: params, + cache: false, success: function (data) { + $('#categories').empty(); $('#categories').html(data); _init_categories(); _reCheckCategories(); @@ -293,7 +614,13 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { category_element.parent().find("li input").attr("checked", val); } var _toggle_categories = function (subcategory_element) { - var parent = subcategory_element.parent().parent().parent(); + var parent = subcategory_element.closest('ul'); + var parent_label = parent.parent().find("> span"); + if (parent.find('input[type=checkbox]:checked').length){ + parent_label.addClass('category-selected'); + } else { + parent_label.removeClass('category-selected'); + } var master_check = parent.find("> input"); if (parent.find('.subcategories input[type=checkbox]').length == parent.find('.subcategories input[type=checkbox]:checked').length){ @@ -301,32 +628,66 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } else { master_check.removeAttr('checked'); } + + if($('#action-categories').length){ + if ($('#categories input[type=checkbox]:checked').length){ + $('#action-categories').addClass('category-selected'); + } else { + $('#action-categories').removeClass('category-selected'); + } + } return master_check; }; var _init_categories = function () { /* * Add event listener in categories DOM elements */ - $('#categories #ul_categories > li > input').bind("click", function () { - methods.hidePopup(); + $('#categories #ul_categories > li > input').bind("click", + function (e) { + methods.hidePopup(e); _toggle_subcategories($(this)); methods.loadGeoObjects(); settings.permalink.updateLink(); }); - $('.subcategories li input').bind("click", function () { - methods.hidePopup(); + $('.subcategories li input').bind("click", function (e) { + var c_name = $(this).attr('name'); + c_name = c_name.substr(c_name.lastIndexOf("_")+1); + if($(this).is(':checked')){ + methods.subcategory_detail(c_name); + } + var par = $(this).parent(); + if ($(this).attr('checked')){ + par.addClass('selected'); + } else { + par.removeClass('selected'); + } + methods.hidePopup(e); methods.loadGeoObjects(); _toggle_categories($(this)); settings.permalink.updateLink(); + if ($('#layer_cat_'+c_name).length){ + $('#layer_cat_'+c_name).prop("checked", + this.checked); + } }); $('#display_submited_check').bind("click", function () { methods.loadGeoObjects(); settings.permalink.updateLink(); }); // Zoom to category - $(".zoom_to_category").bind("click", function (e) {var id = this.id.substr(this.id.lastIndexOf("_")+1); helpers.zoom_to_category(id);}); - $(".zoom_to_subcategory").bind("click", function (e) {var id = this.id.substr(this.id.lastIndexOf("_")+1); helpers.zoom_to_subcategories([id]);}); - $(".toggle_category").bind("click", function (e) {var id = this.id.substr(this.id.lastIndexOf("_")+1); methods.toggle_category(id); }); + $(".zoom_to_category").bind("click", function (e) { + var id = this.id.substr(this.id.lastIndexOf("_")+1); + helpers.zoom_to_category(id); + }); + $(".zoom_to_subcategory").bind("click", function (e) { + var id = this.id.substr(this.id.lastIndexOf("_")+1); + helpers.zoom_to_subcategories([id]); + }); + $(".toggle_category").parent().bind("click", function (e) { + var item = $(this).children('.toggle_category'); + var id = item.attr('id').substr(item.attr('id').lastIndexOf("_")+1); + methods.toggle_category(id); + }); } var _reCheckCategories = function (){ /* recheck categories on init or when a redraw occurs */ @@ -349,6 +710,37 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } }, /* + * Hide clusterized markers + */ + cleanCluster: function (){ + if (settings.map.getZoom() === 18) { + // Don't cluster at this level. No matter what. + settings.clustering.threshold = 1000; + } else { + settings.clustering.threshold = 2; + } + //settings.layerCluster.refresh({force:true}); + settings.clustering.recluster(); + var hidden_feature_idx = []; + if (settings.map.getZoom() != 18) { + for(var idx=0; idx<settings.layerCluster.features.length; idx++){ + if(settings.layerCluster.features[idx].cluster){ + for(var c=0;c < settings.layerCluster.features[idx].cluster.length; c++) { + hidden_feature_idx.push( + settings.layerCluster.features[idx].cluster[c].attributes.pk); + } + } + } + } + for(j=0; j<settings.layerMarkers.markers.length;j++){ + if(hidden_feature_idx.indexOf(settings.layerMarkers.markers[j].pk) > -1){ + settings.layerMarkers.markers[j].display(false); + } else { + settings.layerMarkers.markers[j].display(true); + } + } + }, + /* * Put a marker on the map */ addMarker: function (mark) { @@ -360,24 +752,37 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { var lon = mark.geometry.coordinates[0]; var size = new OpenLayers.Size(mark.properties.icon_width, mark.properties.icon_height); - var iconclone = new OpenLayers.Icon(MEDIA_URL + mark.properties.icon_path, - size, settings.icon_offset); + var icon_url = MEDIA_URL + mark.properties.icon_path; + var icon_hover_url = ''; + if (mark.properties.icon_hover_path){ + var icon_hover_url = MEDIA_URL + mark.properties.icon_hover_path; + } + var iconclone = new OpenLayers.Icon(icon_url, size, + settings.icon_offset); + var feature = new OpenLayers.Feature(settings.layerMarkers, - new OpenLayers.LonLat(lon, lat).transform(EPSG_DISPLAY_PROJECTION, - EPSG_PROJECTION), + new OpenLayers.LonLat(lon, lat).transform( + EPSG_DISPLAY_PROJECTION, + EPSG_PROJECTION), {icon:iconclone}); feature.pk = mark.properties.pk; - feature.popupClass = OpenLayers.Popup.FramedCloud; + feature.popupClass = settings.popupClass; feature.data.popupContentHTML = "<div class='cloud'>"; - feature.data.popupContentHTML += mark.properties.name; + if (!settings.popupContentFull) { + feature.data.popupContentHTML += mark.properties.name; + } feature.data.popupContentHTML += "</div>"; feature.data.overflow = 'hidden'; var marker = feature.createMarker(); + marker.pk = feature.pk; + marker.icon_url = icon_url; + marker.icon_hover_url = icon_hover_url; + marker.category_name = mark.properties.category_name; /* manage markers events */ var _popup = function() { /* show the popup */ if (settings.current_popup != null) { - settings.current_popup.hide(); + settings.current_popup.hide(); } if (feature.popup == null) { feature.popup = feature.createPopup(); @@ -387,42 +792,101 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } settings.current_popup = feature.popup; /* hide on click on the cloud */ - settings.current_popup.groupDiv.onclick = methods.hidePopup; + if (!settings.explicit_popup_hide){ + settings.current_popup.groupDiv.onclick = methods.hidePopup; + } settings.permalink.updateLink(); } + var _repan_popup = function(){ + /* re-pan manually */ + + // no clean way to detect if all the element are ready + // lack of better... + setTimeout( + function(){ + settings.current_popup.panIntoView(); + }, 1000); + } + var markerClick = function (evt) { settings.current_feature = feature; + methods.setCurrentPosition(feature.lonlat); if ( settings.on_marker_click ) { settings.on_marker_click(evt, mark, settings); } else { + methods.center_on_feature(); + $('#chimere_map_menu').hide(); // Default popup if (feature.popup && feature.popup.visible()) { if (settings.current_popup == feature.popup) { feature.popup.hide(); if (!settings.simple){ - $('#panel').removeClass('panel-minified'); $('#detail').hide(); } } else { settings.current_popup.hide(); _popup(); methods.display_feature_detail(feature.pk); + _repan_popup(); } } else { _popup(); methods.display_feature_detail(feature.pk); + _repan_popup(); } } OpenLayers.Event.stop(evt); }; var markerOver = function (evt) { document.body.style.cursor='pointer'; + if (settings.current_feature && settings.current_feature.popup + && settings.current_feature.popup.visible()) return; + var marker = evt.object; + if (marker.icon_hover_url){ + marker.setUrl(marker.icon_hover_url); + } + px = settings.map.getPixelFromLonLat(marker.lonlat); + marker_hover = $('#'+settings.marker_hover_id); + marker_hover_content = $('#'+settings.marker_hover_content_id); + marker_hover_content.html(marker.category_name); + var map_position = $(settings.map.div).offset(); + + var width = marker_hover.width(); + width += parseInt(marker_hover.css("padding-left"), 10) + + parseInt(marker_hover.css("padding-right"), 10) + + parseInt(marker_hover.css("margin-left"), 10) + + parseInt(marker_hover.css("margin-right"), 10) + + parseInt(marker_hover.css("borderLeftWidth"), 10) + + parseInt(marker_hover.css("borderRightWidth"), 10); + var pos_x = px.x + map_position.left + - width/2 + 1; + if (settings.marker_hover_offset) + pos_x += settings.marker_hover_offset.x; + $('#'+settings.marker_hover_id).css('left', pos_x); + var height = marker_hover.height(); + height += parseInt(marker_hover.css("padding-top"), 10) + + parseInt(marker_hover.css("padding-bottom"), 10) + + parseInt(marker_hover.css("margin-top"), 10) + + parseInt(marker_hover.css("margin-bottom"), 10) + + parseInt(marker_hover.css("borderBottomWidth"), 10) + + parseInt(marker_hover.css("borderTopWidth"), 10); + var pos_y = px.y + map_position.top + - height - marker.icon.size.h; + if (settings.marker_hover_offset) + pos_y += settings.marker_hover_offset.y; + $('#'+settings.marker_hover_id).css('top', pos_y); + $('#'+settings.marker_hover_id).show(); OpenLayers.Event.stop(evt); }; var markerOut = function (evt) { document.body.style.cursor='auto'; + var marker = evt.object; + if (marker.icon_hover_url){ + marker.setUrl(marker.icon_url); + } + $('#'+settings.marker_hover_id).hide(); OpenLayers.Event.stop(evt); }; marker.events.register('click', feature, markerClick); @@ -431,11 +895,26 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { settings.layerMarkers.addMarker(marker); /* show the item when designed in the permalink */ if (settings.display_feature == feature.pk){ + settings.current_feature = feature; _popup(feature); methods.display_feature_detail(feature.pk); - settings.map.setCenter(feature.lonlat, 16); - methods.loadCategories(); + _repan_popup(); + settings.display_feature = null; + //methods.loadCategories(); + } + + if (settings.enable_clustering){ + // manage cluster layer + var point = new OpenLayers.Geometry.Point(lon, lat).transform( + EPSG_DISPLAY_PROJECTION, + EPSG_PROJECTION); + var feat = new OpenLayers.Feature.Vector(point); + feat.attributes = { icon: MEDIA_URL + mark.properties.icon_path, + name: "", label:"", pk:mark.properties.pk, + marker:marker}; + settings.cluster_array.push(feat); } + return feature; }, @@ -462,6 +941,291 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { settings.current_feature.geometry = linestring; settings.layerVectors.addFeatures([settings.current_feature]); }, + routingInputChange: function(nominatim_id){ + $('#map_menu_clear').show(); + switch(nominatim_id){ + case 'nominatim_start': + settings.routing_start = new OpenLayers.Marker( + new OpenLayers.LonLat( + $('#'+nominatim_id+'_lon').val(), + $('#'+nominatim_id+'_lat').val() + ).transform(EPSG_DISPLAY_PROJECTION, + settings.map.getProjectionObject()), + settings.icon_start); + settings.layerRouteMarker.addMarker(settings.routing_start); + break; + case 'nominatim_end': + settings.routing_end = new OpenLayers.Marker( + new OpenLayers.LonLat( + $('#'+nominatim_id+'_lon').val(), + $('#'+nominatim_id+'_lat').val() + ).transform(EPSG_DISPLAY_PROJECTION, + settings.map.getProjectionObject()), + settings.icon_end); + settings.layerRouteMarker.addMarker(settings.routing_end); + break; + default: + settings.routing_steps.push(new OpenLayers.Marker( + new OpenLayers.LonLat( + $('#'+nominatim_id+'_lon').val(), + $('#'+nominatim_id+'_lat').val() + ).transform(EPSG_DISPLAY_PROJECTION, + settings.map.getProjectionObject()), + settings.icon_step.clone())); + settings.layerRouteMarker.addMarker( + settings.routing_steps[settings.routing_steps.length-1]); + break; + } + if (settings.routing_end && settings.routing_start + && $('#search_routing').length) { + $('#search_routing').button('enable'); + } + }, + + redrawRoutingIcons: function(){ + settings.layerRouteMarker.clearMarkers(); + settings.layerRouteMarker.addMarker(settings.routing_start); + settings.layerRouteMarker.addMarker(settings.routing_end); + for (var k=0;k<settings.routing_steps.length;k++){ + settings.layerRouteMarker.addMarker(settings.routing_steps[k]); + } + }, + + // set the start point for routing + routingFrom: function(){ + $('#chimere_map_menu').hide(); + settings.routing_panel_open(); + $('#map_menu_clear').show(); + settings.routing_start = new OpenLayers.Marker( + settings.current_position.clone(), + settings.icon_start); + settings.layerRouteMarker.addMarker(settings.routing_start); + if (nominatim_url){ + helpers.updateNominatimName(settings.current_position.clone() + .transform(settings.map.getProjectionObject(), + EPSG_DISPLAY_PROJECTION), + 'start_label'); + } + if (settings.routing_end) methods.route(); + }, + // add a step point for routing + routingAddStep: function(){ + $('#chimere_map_menu').hide(); + settings.routing_panel_open(); + $('#map_menu_clear').show(); + settings.routing_steps.push(new OpenLayers.Marker( + settings.current_position.clone(), + settings.icon_step.clone())); + settings.layerRouteMarker.addMarker( + settings.routing_steps[settings.routing_steps.length-1]); + + if (nominatim_url){ + var current_itinerary_number = methods.add_step_fx(); + helpers.updateNominatimName(settings.current_position.clone() + .transform(settings.map.getProjectionObject(), + EPSG_DISPLAY_PROJECTION), + 'step_'+current_itinerary_number+'_label'); + } + if (settings.routing_end && settings.routing_start) methods.route(); + }, + + // add a step on the interface + add_step_fx: function (){ + settings.itinerary_step_number += 1; + var cloned = $("#id_start_div").clone(); + var c_id = 'step_' + settings.itinerary_step_number; + cloned.attr('id', 'id_'+c_id+'_div'); + cloned.children('label').html(step_label).addClass('step_label'); + cloned.children("#nominatim_start_label").attr('id', c_id+'_label' + ).html(''); + cloned.children('label.nominatim-label').attr('for', "" + ).removeClass('step_label'); + var id_suffixes = ['_lat', '_lon', '']; + for (idx=0;idx < id_suffixes.length;idx+=1){ + var suffix = id_suffixes[idx]; + val = c_id + suffix; + cloned.children("#nominatim_start"+suffix).attr('id', val + ).attr('name', val); + } + if (settings.itinerary_step_number == 1){ + $("#nominatim_end_label").after(cloned); + } else { + $("#step_"+(settings.itinerary_step_number-1)+"_label" + ).after(cloned); + } + $('#' + c_id).val(default_nominatim_lbl); + $('#' + c_id).click(function(){ + $('#'+c_id).val(''); + }); + $(".nominatim-widget").autocomplete(nominatim_widget_options); + return settings.itinerary_step_number; + }, + + // set the finish point for routing + routingTo: function(){ + $('#chimere_map_menu').hide(); + settings.routing_panel_open(); + $('#map_menu_clear').show(); + settings.routing_end = new OpenLayers.Marker( + settings.current_position.clone(), + settings.icon_end); + settings.layerRouteMarker.addMarker(settings.routing_end); + if (nominatim_url){ + helpers.updateNominatimName(settings.current_position.clone() + .transform(settings.map.getProjectionObject(), + EPSG_DISPLAY_PROJECTION), + 'end_label'); + } + if (settings.routing_start) methods.route(); + }, + + // clear the current itinerary + routingClear: function(){ + $('#nominatim_start_lon').val(''); + $('#nominatim_start_lat').val(''); + $('#nominatim_start_label').html(''); + $('#chimere_start_label').html(''); + $('#nominatim_end_lon').val(''); + $('#nominatim_end_lat').val(''); + $('#nominatim_end_label').html(''); + $('#chimere_end_label').html(''); + $('.nominatim-widget').val(default_nominatim_lbl); + $('#chimere_map_menu').hide(); + $('#map_menu_clear').hide(); + $('#chimere_itinerary').hide(); + $('#chimere_itinerary_form').show(); + $('div[id^="id_step_"]').remove(); + if($('#search_routing').length) $('#search_routing').button('disable'); + settings.layerRoute.removeAllFeatures(); + settings.layerRouteMarker.clearMarkers(); + settings.routing_start = null; + settings.routing_end = null; + settings.routing_steps = new Array(); + settings.current_itinerary_number = 0; + settings.current_route_feature = null; + settings.permalink.updateLink(); + }, + // display a route + route: function(){ + if($('#search_routing').length) $('#search_routing').button('enable'); + if (!settings.routing_start || !settings.routing_end){ + return; + } + var steps = [settings.routing_start.lonlat.clone()] + for (var i = 0; i < settings.routing_steps.length; i++) { + steps.push(settings.routing_steps[i].lonlat.clone()); + } + steps.push(settings.routing_end.lonlat.clone()); + // create the appropriate URL + var uri = extra_url + "route/" + var transport = $('input[name=transport]:checked').val(); + if(transport){ + uri += transport + "/" + } + var speed = $('#id_speed option:selected').val(); + if(!speed){ + var speed = $('input[name=speed]:checked').val(); + } + if(speed){ + uri += speed.split('_')[1] + "/" + } + for (var i = 0; i < steps.length; i++) { + var step = steps[i].transform( + settings.map.getProjectionObject(), + EPSG_DISPLAY_PROJECTION); + if (i > 0){ + uri += '_'; + } + uri += step.lon + '_' + step.lat; + } + settings.permalink.updateLink(); + $.ajax({url: uri, + dataType: "json", + success: function (data) { + settings.layerRoute.removeAllFeatures(); + methods.redrawRoutingIcons(); + methods.hideMessage(); + if (!data.features.length){ + methods.displayMessage(routing_fail_message); + return; + } + for (var i = 0; i < data.features.length; i++) { + var feat = data.features[i]; + if(feat.type == 'LineString'){ + settings.current_route_feature = + methods.putRoute(feat); + } else { + var lonlat = new OpenLayers.LonLat( + feat.geometry.coordinates[0], + feat.geometry.coordinates[1]); + lonlat.transform(EPSG_DISPLAY_PROJECTION, + settings.map.getProjectionObject()); + var icon_height = feat.properties.icon_height; + var icon_width = feat.properties.icon_width; + var marker = new OpenLayers.Marker(lonlat, + new OpenLayers.Icon( + feat.properties.icon_path, + new OpenLayers.Size(icon_width, + icon_height), + new OpenLayers.Pixel( + -(icon_width/2), + -icon_height)) + ); + settings.layerRouteMarker.addMarker(marker); + } + } + if (data.message) methods.displayMessage(data.message); + settings.map.zoomToExtent( + settings.layerRoute.getDataExtent()); + settings.map.zoomOut(); + $('#id_transport_it').find('span' + ).removeClass('selected'); + $('#id_transport_it_'+data.properties.transport + ).addClass('selected'); + $('#chimere_total_label').html( + data.properties.total); + $('#chimere_itinerary_content').html( + data.properties.description); + $('#chimere_itinerary').show(); + if(!settings.edition_type_is_route){ + $('#chimere_itinerary_form').hide(); + settings.routing_panel_open(); + } else { + methods.updateRoutingInput(); + } + }, + error: function (jqXHR, textStatus, errorThrown) { + methods.redrawRoutingIcons(); + methods.hideMessage(); + console.log(errorThrown); + console.log(textStatus); + settings.layerRoute.removeAllFeatures(); + methods.displayMessage(routing_fail_message); + } + }); + + }, + /* + Put a route on the map + */ + putRoute: function(polyline) { + var point_array = new Array(); + for (i=0; i<polyline.coordinates.length; i++){ + var point = new OpenLayers.Geometry.Point(polyline.coordinates[i][0], + polyline.coordinates[i][1]); + point_array.push(point); + } + var linestring = new OpenLayers.Geometry.LineString(point_array); + linestring.transform(EPSG_DISPLAY_PROJECTION, settings.map.getProjectionObject()); + current_route = new OpenLayers.Feature.Vector(); + var style = OpenLayers.Util.extend({}, + OpenLayers.Feature.Vector.style['default']); + style.strokeWidth = 3; + current_route.style = style; + current_route.geometry = linestring; + settings.layerRoute.addFeatures([current_route]); + return current_route; + }, display_feature_detail: function (pk) { /* * update current detail panel with an AJAX request @@ -471,25 +1235,34 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { uri += "getDetail/" + pk; var params = {} if (settings.simple) { params["simple"] = 1; } - $.ajax({url: uri, - data: params, + $.ajax({url: uri, + data: params, + dataType: "html", success: function (data) { - if ( settings.display_feature_detail_fx ) { - // Custom function ? - settings.display_feature_detail_fx(data, settings); + if ( settings.display_feature_detail_fx ) { + // Custom function ? + settings.display_feature_detail_fx(data, settings); + } + else { + if (!settings.popupContentFull) { + $('#detail').html(data).show(); } else { - if (!settings.simple) { - $('#panel').addClass('panel-minified'); - $('#detail').html(data).show(); - } - else { - settings.current_popup.setContentHTML("<div class='cloud'>" + data + "</div>"); - } + settings.current_popup.setContentHTML("<div class='cloud'>" + data + "</div>"); } } + } }); }, + displayMessage: function(message){ + if (!$('#chimere_message').length) return; + $('#chimere_message').html(message); + $('#chimere_message').dialog('open'); + }, + hideMessage: function(message){ + if (!$('#chimere_message').length) return; + $('#chimere_message').dialog('close'); + }, center_on_feature: function(feature) { var f = get_or_set(feature, settings.current_feature); if (f) @@ -511,28 +1284,64 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { var uri = extra_url + "getDescriptionDetail/" + category_id; $.ajax({url:uri, success: function (data) { - $("#category_detail").html(data).dialog(); - $("#category_detail").dialog( "option", "title", + $("#category_description").html(data).dialog(); + $("#category_description").dialog( "option", "title", $("#category_title").html()); } }); }, + /* + * Load the subcategory description if available + */ + subcategory_detail: function(category_id){ + var uri = extra_url + "getCategory/" + category_id; + + $.ajax({url: uri, + dataType: "json", + success: function (data) { + if (!data.description){return} + $('#category_description').html(data.description); + $("#category_description").dialog("option", "title", + data.name); + $('#category_description').dialog('open'); + }, + error: function (data) { + // fail silently + } + }); + }, toggle_category: function (id) { // TODO make this id DOM element customisable // Check if element is currently visible or not var was_visible = $("#maincategory_" + id).is(":visible"); // Close all categories - $("#categories ul.subcategories").hide(); + var category_plus = STATIC_URL + "chimere/img/plus.png"; + var category_minus = STATIC_URL + "chimere/img/minus.png"; + if (settings.category_accordion){ + $("#categories ul.subcategories").hide(); + $("#categories img.toggle_category").attr("src", category_plus); + $("#categories .main_category").addClass("toggle_plus"); + $("#categories .main_category").removeClass("toggle_minus"); + } // Put a minus image - $("#categories img.toggle_category").attr("src", STATIC_URL + "chimere/img/plus.png"); if (!was_visible) { // Show the subcategories $("#maincategory_" + id).toggle(); + $("#maincategory_" + id).parent().addClass("toggle_minus"); + $("#maincategory_" + id).parent().removeClass("toggle_plus"); // Put a plus image - $("#maincategory_img_" + id).attr("src", STATIC_URL + "chimere/img/minus.png"); + $("#maincategory_img_" + id).attr("src", category_minus); settings.current_category = id; } + if (!settings.category_accordion && was_visible) + { + $("#maincategory_" + id).toggle(); + $("#maincategory_" + id).parent().addClass("toggle_plus"); + $("#maincategory_" + id).parent().removeClass("toggle_minus"); + // Put a minus image + $("#maincategory_img_" + id).attr("src", category_plus); + } }, zoomToCurrentExtent: function(){ /* zoom to current extent */ @@ -564,17 +1373,13 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { }, /* put the marker on the map and update latitude and longitude fields */ putEditMarker: function (lonlat, zoom){ - if (settings.current_feature) { - settings.layerMarkers.removeMarker(settings.current_feature); + if (settings.current_edit_feature) { + settings.layerMarkers.removeMarker(settings.current_edit_feature); } - settings.current_feature = new OpenLayers.Marker(lonlat.clone(), + settings.current_edit_feature = new OpenLayers.Marker(lonlat.clone(), settings.default_icon); - settings.layerMarkers.addMarker(settings.current_feature); - lonlat = lonlat.clone().transform(settings.map.getProjectionObject(), - EPSG_DISPLAY_PROJECTION); - $('#id_point').val('POINT(' + lonlat.lon + ' ' + lonlat.lat + ')'); - $('#live_latitude').val(lonlat.lat); - $('#live_longitude').val(lonlat.lon); + settings.layerMarkers.addMarker(settings.current_edit_feature); + methods.updateMarkerInput(); /* zoom to the point */ if (zoom){ var bounds = settings.layerMarkers.getDataExtent(); @@ -582,6 +1387,28 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { } return; }, + updateMarkerInput: function(){ + if (!settings.current_edit_feature) { + return; + } + lonlat = settings.current_edit_feature.lonlat.clone().transform( + settings.map.getProjectionObject(), + EPSG_DISPLAY_PROJECTION); + $('#id_point').val('POINT(' + lonlat.lon + ' ' + lonlat.lat + ')'); + if($('#live_latitude').length){ + $('#live_latitude').val(lonlat.lat); + $('#live_longitude').val(lonlat.lon); + } + + }, + updateRoutingInput: function(){ + if (!settings.current_route_feature) { + return; + } + var current_geo = settings.current_route_feature.geometry.clone(); + current_geo.transform(EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION); + jQuery('#id_route').val(current_geo); + }, activateCurrentControl: function(){ if (settings.current_control){ settings.current_control.activate(); @@ -637,19 +1464,25 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { if (bounds) settings.map.zoomToExtent(bounds); }, hidePopup: function (evt) { + $('#'+settings.marker_hover_id).hide(); if (settings.hide_popup_fx) { settings.hide_popup_fx(evt, settings) } else { // Default behaviour if (settings.current_popup) { - settings.current_popup.hide(); if (!settings.simple){ - $('#panel').removeClass('panel-minified'); $('#detail').hide(); } + if (settings.current_popup.visible()){ + settings.current_popup.hide(); + if(evt) + settings.map.events.triggerEvent('click', evt); + return true; + } } } + return false; }, saveExtent: function(){ var extent_key = 'MAP_EXTENT'; @@ -785,8 +1618,23 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { if (vertices){ jQuery('#id_point').val(vertices); } + }, + updateNominatimName:function(lonlat, response_id){ + $.ajax({ + url: nominatim_url.substring(0, nominatim_url.length-6) + 'reverse', + data: { + format: "json", + lat:lonlat.lat, + lon:lonlat.lon + }, + dataType:'json', + success: function (vals) { + $('#'+response_id).html(vals.display_name); + $('#nominatim_'+response_id).html(vals.display_name); + $('#chimere_'+response_id).html(vals.display_name); + } + }); } - }; // End of helpers $.fn.chimere = function (thing) { @@ -813,7 +1661,6 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { else { $.error( 'Method ' + thing + ' does not exist on jQuery.chimere' ); } - return this; }; })( jQuery ); diff --git a/chimere/static/chimere/js/nominatim-widget.js b/chimere/static/chimere/js/nominatim-widget.js new file mode 100644 index 0000000..99f7034 --- /dev/null +++ b/chimere/static/chimere/js/nominatim-widget.js @@ -0,0 +1,46 @@ +var default_nominatim_lbl = ''; +var nominatim_widget_options = { + source: function (request, response) { + $.ajax({ + url: nominatim_url, + data: { + format: "json", + q: request.term, + }, + dataType:'json', + success: function ( data ) { + response ( $.map(data, function(item) { + return { + label: item.display_name, + value: item.display_name, + lat: item.lat, + lon: item.lon + } + })); + + } + }) + }, + minLength: 6, + delay: 1000, + select: function ( event, ui ) { + $('#'+$(this).attr('id')+'_lat').val(ui.item.lat); + $('#'+$(this).attr('id')+'_lon').val(ui.item.lon); + $('#'+$(this).attr('id')+'_label').html(ui.item.label); + $('#chimere_'+$(this).attr('id').substring(10)+'_label').html( + ui.item.label); + $('#'+$(this).attr('id')).val(default_nominatim_lbl); + jQuery("#map").chimere("routingInputChange", $(this).attr('id')); + return false; + }, + open: function() { + $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); + }, + close: function() { + $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); + } +} + +$(function(){ + $(".nominatim-widget").autocomplete(nominatim_widget_options); +}); diff --git a/chimere/static/chimere/js/routing-widget.js b/chimere/static/chimere/js/routing-widget.js new file mode 100644 index 0000000..34ca46c --- /dev/null +++ b/chimere/static/chimere/js/routing-widget.js @@ -0,0 +1,47 @@ +var step_label = "Step"; +var add_step = null; + +$(document).ready(function() { + var itinerary_step_number = 0; + $("#add_step_link").click(function(){ + $('#main-map').chimere('add_step_fx'); + return false; + }); + $('#search_routing').button({'disabled':true}); + $('#routing_button').click(function(){ + $('#chimere_itinerary_panel').dialog('open'); + }); + $('#chimere_itinerary_modify').click(function(){ + $('#chimere_itinerary').hide(); + $('#chimere_itinerary_form').show(); + }); + $('#chimere_itinerary_new').click(function(){ + $('#map').chimere('routingClear'); + }); + $('#search_routing').click(function(){ + $('#map').chimere('route'); + }); + + var detached_speeds = Array(); + function filter_speed(transport){ + $("#id_speed_div").show(); + for (i=0;i<detached_speeds.length;i+=1){ + $("#id_speed_div ul").append(detached_speeds[i]); + } + detached_speeds = Array(); + $("#id_speed_div input[type=radio]").each(function(){ + if(!$(this).val().match(transport) && $(this).val()){ + detached_speeds.push($(this).parent().parent().detach()); + } + }); + $('#id_speed_div').val(''); + if($("#id_speed_div input[type=radio]").length == 1){ + $("#id_speed_div").hide(); + } + } + $('#id_transport label').click(function(){ + checked_item = $("#"+$(this).attr('for')); + filter_speed(checked_item.val()); + }); + filter_speed($('#id_transport :checked').val()); +}); diff --git a/chimere/static/chimere/js/utils.js b/chimere/static/chimere/js/utils.js index 80ab91a..460e843 100644 --- a/chimere/static/chimere/js/utils.js +++ b/chimere/static/chimere/js/utils.js @@ -236,6 +236,12 @@ function has_index(index, arr) { function get_or_set(v, d){ return typeof v === "undefined" ? d : v;} +/* email validity */ +function isValidEmailAddress(emailAddress) { + var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i); + return pattern.test(emailAddress); +}; + /* remove multiple, leading or trailing spaces */ function trim(s) { s = s.replace(/(^\s*)|(\s*$)/gi,""); diff --git a/chimere/tasks.py b/chimere/tasks.py index a74dce8..02e32a4 100644 --- a/chimere/tasks.py +++ b/chimere/tasks.py @@ -33,7 +33,7 @@ from external_utils import OsmApi def single_instance_task(timeout): def task_exc(func): def wrapper(*args, **kwargs): - return func() + return func(*args, **kwargs) return wrapper return task_exc diff --git a/chimere/templates/base.html b/chimere/templates/base.html index 2a50fc3..619aa0b 100644 --- a/chimere/templates/base.html +++ b/chimere/templates/base.html @@ -2,30 +2,30 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> - <title>{% block title %}Chimère{% endblock %}</title> + <title>{% block title %}{{PROJECT_NAME}}{% endblock %}</title> {% block extra_head %} {% endblock %} </head> <body {% block body_id %}{% endblock %} {% block body_class %}{% endblock %}> - {% block extrabody %} +{% block extrabody %} +{% endblock %} +{% block body %} +<div id="header"> + {% block header %} {% endblock %} - {% block body %} - <div id="header"> - {% block header %} - {% endblock %} - </div> - <div id="sidebar"> - {% block sidebar %} - {% endblock %} - </div> - <div id="content"> - {% block content %} - {% endblock %} - </div> - <div id="footer"> - {% block footer %} - {% endblock %} - </div> +</div> +<div id="sidebar"> + {% block sidebar %} {% endblock %} +</div> +<div id="content"> + {% block content %} + {% endblock %} +</div> +<div id="footer"> + {% block footer %} + {% endblock %} +</div> +{% endblock %} </body> </html> diff --git a/chimere/templates/chimere/base.html b/chimere/templates/chimere/base.html index a1a0b39..620c84f 100644 --- a/chimere/templates/chimere/base.html +++ b/chimere/templates/chimere/base.html @@ -2,6 +2,7 @@ {% load chimere_tags i18n %} {% block extra_head %} <link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/styles.css" /> +<link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/print.css" media='print'/> {% if css_area %} <link rel="stylesheet" href="{{ css_area }}" />{% endif %} {% endblock %} diff --git a/chimere/templates/chimere/blocks/actions.html b/chimere/templates/chimere/blocks/actions.html index 2806321..93debb0 100644 --- a/chimere/templates/chimere/blocks/actions.html +++ b/chimere/templates/chimere/blocks/actions.html @@ -2,7 +2,7 @@ <ul id='action' class='action'> {% for action, subactions in actions %} <li class='ui-widget ui-button ui-state-default ui-corner-all {% ifequal action.id action_selected.0 %} ui-state-active{% endifequal %}'> - <a href='{{extra_url}}{{ action.path }}' onclick='jQuery("#map").chimere("saveExtent");'>{{ action.label }}</a> + <a href='{{ action.url }}' onclick='jQuery("#map").chimere("saveExtent");'>{{ action.label }}</a> </li> {% endfor %} </ul> @@ -11,7 +11,7 @@ {% ifequal action.id action_selected.0 %}{% if subactions %} {% for subaction in subactions %} <li class='ui-widget ui-button ui-state-default ui-corner-all{% ifequal subaction.id action_selected.1 %} ui-state-active{% endifequal %}'> - <a href='{{extra_url}}{{ subaction.path }}' onclick='saveExtent();'>{{ subaction.label }}</a> + <a href='{{ subaction.url }}' onclick='saveExtent();'>{{ subaction.label }}</a> </li> {% endfor %} {% endif %}{% endifequal %} diff --git a/chimere/templates/chimere/blocks/alternate_multimedia.html b/chimere/templates/chimere/blocks/alternate_multimedia.html index 0662750..50bddd5 100644 --- a/chimere/templates/chimere/blocks/alternate_multimedia.html +++ b/chimere/templates/chimere/blocks/alternate_multimedia.html @@ -14,13 +14,14 @@ {% for formset in formsets %} {% for frm in formset%} {% if not forloop.last %} - <li> + <li class='{% if forloop.parentloop.counter0 %}picture{%else%}multimedia{%endif%}'> {%if forloop.first %}{% for hidden in frm.hidden_fields %} {{ hidden }} {% endfor %}{% endif %} {% for field in frm.visible_fields %} {% if field.name == "name" %} - <span class='value'>{{ field.field.value }}</span> + <span class='value'>{{ field.value }}</span> + <img class='remove-media' alt='Remove media' src='{{STATIC_URL}}chimere/img/close.png'/> {% endif %} <span class='hidden'>{{field}}</span> {% endfor %} @@ -31,7 +32,7 @@ </ul> <button id='add_multimedia_list'>{% trans "Add" %}</button> </div> - <div id='multimedia_form' title="{% trans "Add multimedia from your computer or a site"%}"> + <div id='multimedia_form' title="{% trans "Add multimedia from your computer or a website"%}"> <div class='notice'>{% trans "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu luctus ipsum. Donec vel urna a turpis consectetur consectetur. Vestibulum ut enim vel odio porta vulputate." %} </div> <div class="fieldWrapper"> @@ -51,6 +52,9 @@ </div> <script text='text/javascript'> $(function(){ + $(".remove-media").click(function(){ + $(this).parents('li').remove(); + }); var current_image_number = 0; var current_multi_number = 0; $("#multimedia_form").dialog({autoOpen:false, @@ -110,20 +114,33 @@ content += '<input type="hidden" name="'+prefix+'-DELETE" value=""/>\n'; content += '<input type="hidden" name="'+prefix+'-name" value="'+ $("#multimedia_name").val() +'"/>\n'; content += $("#multimedia_name").val(); - content += " <img class='remove-media' src='{{STATIC_URL}}chimere/img/close.png'/>"; + content += " <img class='remove-media' alt='Remove media' src='{{STATIC_URL}}chimere/img/close.png'/>"; + content += " <img class='remove-media' alt='Remove media' src='{{STATIC_URL}}chimere/img/close.png'/>"; content += '</li>'; contener.append(content); if ($('#media_type_image:checked').val() && $("#picture-"+current_image_number+"-picture").val()){ - // the file item cannot be recopied - security issue - // so it is hiden then a new one is added - //$('#picture-'+current_image_number+'-picture').hide(); + // the file field cannot be recopied - security issue + // so it is moved var file_item = $('#picture-'+current_image_number+'-picture'); - //var cloned = file_item.clone(true); - //file_item.hide(); - //cloned.insertAfter(file_item); + var cloned = file_item.clone(true); + file_item.hide(); + cloned.insertAfter(file_item); file_item.appendTo($("#multimedia_list_content li").last()); + current_image_number += 1; + cloned.attr('id', 'picture-'+current_image_number+'-picture'); + cloned.attr('name', 'picture-'+current_image_number+'-picture'); + cloned.val(''); + $('#id_picture-TOTAL_FORMS').val(current_image_number + 1); + } else { + current_multi_number += 1; + $('#id_multimedia-TOTAL_FORMS').val(current_multi_number + 1); } + // empty the fields + $("#multimedia_name").val(''); + $("#multimedia_url").val(''); + $("#media_type_image").prop('checked', ''); + $("#media_type_other").prop('checked', ''); $("#multimedia_form").dialog("close"); $(".remove-media").click(function(){ $(this).parents('li').remove(); diff --git a/chimere/templates/chimere/blocks/categories.html b/chimere/templates/chimere/blocks/categories.html index 8c8a8f8..d87fe4d 100644 --- a/chimere/templates/chimere/blocks/categories.html +++ b/chimere/templates/chimere/blocks/categories.html @@ -1,14 +1,14 @@ {% load i18n %} <ul id='ul_categories'> {% for category, lst_sub_categories in sub_categories %} - <li> + <li class='main_category'> <img class="control_image toggle_category" id="maincategory_img_{{category.id}}" alt="control" src="{{ STATIC_URL }}chimere/img/{% if category.selected %}minus.png{% else %}plus.png{% endif %}" /> <input type="checkbox" id='checkall_{{category.id}}'> {% trans category.name %} <img id="zoom_to_category_{{category.id}}" class="zoom_image zoom_to_category" alt='{% trans "Zoom to" %} {{category.name}}' src='{{ STATIC_URL }}chimere/img/zoom.png' /> <ul class='subcategories' id='maincategory_{{category.id}}'{% if not category.selected %} style='display:None'{% endif %}> {% for sub_category in lst_sub_categories %} - <li id='li_sub_{{sub_category.id}}'> + <li id='li_sub_{{sub_category.id}}' class='subcategory'> <input type='checkbox' name='category_{{sub_category.id}}' id='category_{{sub_category.id}}'{% if sub_category.selected %} checked='checked'{% endif %}/> <label for='category_{{sub_category.id}}'> <img alt='{{ sub_category.name }}' src='{{ MEDIA_URL }}{{sub_category.icon.image}}'/> @@ -27,5 +27,5 @@ <li id='display_submited'> <input type='checkbox' name='display_submited' id='display_submited_check'/> {% trans "Display markers and routes waiting for validation"%} </li> - {% endif %} + {% endfor %} </ul> diff --git a/chimere/templates/chimere/blocks/head_chimere.html b/chimere/templates/chimere/blocks/head_chimere.html index 4031ac4..147d05b 100644 --- a/chimere/templates/chimere/blocks/head_chimere.html +++ b/chimere/templates/chimere/blocks/head_chimere.html @@ -1,16 +1,18 @@ {% for css_url in OSM_CSS_URLS %} <link rel="stylesheet" href="{{ css_url }}" />{% endfor %} {% for js_url in OSM_JS_URLS %} -<script src="{{ js_url }}"></script>{% endfor %} -<script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js"></script> +<script src="{{ js_url }}" type="text/javascript"></script>{% endfor %} +{% if routing %}<script src="{{ STATIC_URL }}chimere/js/routing-widget.js" type="text/javascript"></script>{% endif %} +<script src="{{ STATIC_URL }}chimere/js/clustering.js" type="text/javascript"></script> +<script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js" type="text/javascript"></script> <script type="text/javascript"> /* Global variables */ var STATIC_URL = static_url = "{{ STATIC_URL }}"; var MEDIA_URL = media_path = "{{ MEDIA_URL }}"; var extra_url = "{{ EXTRA_URL }}"; </script> -<script src="{{ STATIC_URL }}chimere/js/utils.js"></script> -<script src="{{ STATIC_URL }}chimere/js/base.js"></script> +<script src="{{ STATIC_URL }}chimere/js/utils.js" type="text/javascript"></script> +<script src="{{ STATIC_URL }}chimere/js/base.js" type="text/javascript"></script> <script type="text/javascript"> var DEFAULT_ZOOM = {{ DEFAULT_ZOOM }}; var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:{{ EPSG_DISPLAY_PROJECTION }}'); @@ -23,8 +25,9 @@ var area_name = '{{ area_name }}';{% endif %} $(function() {$( ".draggable" ).draggable({handle:"h2"});}); + var get_share_url = '{% url chimere:get-share-url %}'; </script> -<style> +<style type="text/css"> .olControlPanPanel div { background-image: url({{STATIC_URL}}chimere/img/pan-panel.png); } diff --git a/chimere/templates/chimere/blocks/head_form.html b/chimere/templates/chimere/blocks/head_form.html new file mode 100644 index 0000000..032a711 --- /dev/null +++ b/chimere/templates/chimere/blocks/head_form.html @@ -0,0 +1,2 @@ + +<script src="{{ TINYMCE_URL }}tiny_mce.js" type="text/javascript"></script> diff --git a/chimere/templates/chimere/blocks/head_jme.html b/chimere/templates/chimere/blocks/head_jme.html index a3fe683..bf31e6f 100644 --- a/chimere/templates/chimere/blocks/head_jme.html +++ b/chimere/templates/chimere/blocks/head_jme.html @@ -1,16 +1,16 @@ <script class="jwPlayer" type="application/swf" src="{{STATIC_URL}}jme/packages/player.swf"></script> -<script src="{{STATIC_URL}}jme/packages/mm.full.min.js"></script> -<script src="{{STATIC_URL}}jme/utils/jmeEmbedControls.js"></script> +<script src="{{STATIC_URL}}jme/packages/mm.full.min.js" type="text/javascript"></script> +<script src="{{STATIC_URL}}jme/utils/jmeEmbedControls.js" type="text/javascript"></script> <link rel="stylesheet" href="{{STATIC_URL}}jme/css/player-controls.css" /> <!-- a11y-slider --> -<script src="{{STATIC_URL}}jme/utils/a11y-slider.ext.js"></script> +<script src="{{STATIC_URL}}jme/utils/a11y-slider.ext.js" type="text/javascript"></script> <!-- workaround for flash bug in ie --> -<script src="{{STATIC_URL}}jme/utils/reinitjme.js"></script> +<script src="{{STATIC_URL}}jme/utils/reinitjme.js" type="text/javascript"></script> <!-- fullwindow plugin --> <script class="jme-jwPlayer" type="application/swf" src="{{STATIC_URL}}jme/packages/jmefs.swf"></script> -<script src="{{STATIC_URL}}jme/plugins/fullwindow.js"></script> +<script src="{{STATIC_URL}}jme/plugins/fullwindow.js" type="text/javascript"></script> <!-- useractivity --> -<script src="{{STATIC_URL}}jme/utils/useractivity.js"></script> +<script src="{{STATIC_URL}}jme/utils/useractivity.js" type="text/javascript"></script> <!-- prettyPhoto not jme but media --> <link rel="stylesheet" href="{{STATIC_URL}}prettyPhoto/css/prettyPhoto.css" /> diff --git a/chimere/templates/chimere/blocks/map.html b/chimere/templates/chimere/blocks/map.html index 886c50b..6304e13 100644 --- a/chimere/templates/chimere/blocks/map.html +++ b/chimere/templates/chimere/blocks/map.html @@ -5,10 +5,16 @@ </script> <div id="waiting"> <div id="waiting-content"> - <img src='{{STATIC_URL}}chimere/img/ajax-loader.gif'/> + <img alt='Ajax loader' src='{{STATIC_URL}}chimere/img/ajax-loader.gif'/> <p>{% trans "Loading of the map in progress" %}</p> </div> </div> +<div id="layer_selection"> + <h4>{% trans "Display options" %}</h4> + <ul id='layer_list'> + <li class='head layer_map_type'>{% trans "Map type"%}</li> + </ul> +</div> <script type="text/javascript"> {% if single_category %} $(function() {$('#panel').hide()});{% endif %} @@ -17,6 +23,7 @@ chimere_init_options["map_layers"] = [{{map_layers|safe|escape}}]; chimere_init_options['permalink_label'] = '{%trans "Permalink"%}'; chimere_init_options['permalink_element'] = document.getElementById('permalink'); + chimere_init_options['routing'] = {{routing}}; {% if dynamic_categories %}chimere_init_options['dynamic_categories'] = true;{% endif %} {% if default_area %} chimere_init_options["default_area"] = new Array({{default_area.upper_left_corner.x}}, {{default_area.upper_left_corner.y}}, {{default_area.lower_right_corner.x}}, {{default_area.lower_right_corner.y}}); @@ -24,11 +31,16 @@ {% if p_zoom %}chimere_init_options["zoom"] = {{ p_zoom }};{% endif %} {% if p_lat %}chimere_init_options["lat"] = {{ p_lat }};{% endif %} {% if p_lon %}chimere_init_options["lon"] = {{ p_lon }};{% endif %} + {% if p_routing_start_lon %}chimere_init_options["routing_start_lon"] = {{ p_routing_start_lon }};{% endif %} + {% if p_routing_start_lat %}chimere_init_options["routing_start_lat"] = {{ p_routing_start_lat }};{% endif %} + {% if p_routing_end_lon %}chimere_init_options["routing_end_lon"] = {{ p_routing_end_lon }};{% endif %} + {% if p_routing_end_lat %}chimere_init_options["routing_end_lat"] = {{ p_routing_end_lat }};{% endif %} + {% if p_routing_steps %}chimere_init_options["routing_steps_lonlat"] = [{{ p_routing_steps }}];{% endif %} chimere_init_options["icon_offset"] = new OpenLayers.Pixel({{icon_offset_x}}, {{icon_offset_y}}); chimere_init_options["dynamic_categories"] = {{ dynamic_categories }}; {% if p_display_submited %}chimere_init_options["display_submited"] = {{ p_display_submited }};{% endif %} - chimere_init_options["checked_categories"] = {{ p_checked_categories }}; + chimere_init_options["checked_categories"] = [{% for cc in checked_categories %}{% if forloop.counter0 > 0 %}, {% endif %}{{cc}}{% endfor %}]; {% if area_id %}chimere_init_options['area_id'] = "{{area_id}}";{% endif %} {% if p_current_feature %} chimere_init_options["display_feature"] = {{ p_current_feature }}; @@ -43,5 +55,28 @@ {% if zoom %} $('#maps').chimere('zoom', {'area':{{zoom}} }); {% endif %} -</script> + // init layer selection + $(function() { + {% for layer_name, js, def in map_layers %} + $('#layer_list').append("<li><input type='radio' value='{{forloop.counter0}}' name='layer_type' id='layer_{{forloop.counter}}'{% if def %} checked='checked'{% endif %}><label for='layer_{{forloop.counter}}'>{{layer_name}}</li>");{% endfor %} + {% for subcat in subcat_layer %} + {% if not subcat.category %} + $('#layer_list').append("<li class='head layer_category'>{{subcat.name}}</li>");{% else %} + $('#layer_list').append("<li><input type='checkbox' name='layer_cat' value='category_{{subcat.pk}}' id='layer_cat_{{subcat.pk}}'{% if subcat.pk in checked_categories %} checked='checked'{% endif %}><label for='layer_cat_{{subcat.pk}}'>{{subcat.name}}</li>");{%endif%}{% endfor %} + $('#layer_selection h4').click(function(){ + $('#layer_list').toggle(); + }); + $('#layer_list input[name=layer_type]').change(function(){ + $('#{{map_id}}').chimere('changeMapLayer', $(this).val()); + }); + $('#layer_list input[name=layer_cat]').change(function(){ + // the prop has to be called twice not to mess up with the triggered + // click + $('#'+$(this).val()).prop("checked", this.checked); + $('#'+$(this).val()).trigger('click'); + $('#'+$(this).val()).prop("checked", this.checked); + }); + }); +</script> +<div id='marker_hover'><div id='marker_hover_content'></div></div> diff --git a/chimere/templates/chimere/blocks/map_menu.html b/chimere/templates/chimere/blocks/map_menu.html new file mode 100644 index 0000000..38fb4a8 --- /dev/null +++ b/chimere/templates/chimere/blocks/map_menu.html @@ -0,0 +1,14 @@ +{% load i18n %} +<div id='chimere_map_menu'> + <ul> + {% if routing %} + <li id='map_menu_from' class='routing_item'>{% trans "From" context "routing" %}</li> + <li id='map_menu_step' class='routing_item'>{% trans "Add a step" context "routing" %}</li> + <li id='map_menu_to' class='routing_item'>{% trans "To" context "routing" %}</li> + <li id='map_menu_clear' class='routing_item'>{% trans "Clear the itinerary" context "routing" %}</li> + {% endif%} + <li id='map_menu_zoomin'>{% trans "Zoom in" %}</li> + <li id='map_menu_zoomout'>{% trans "Zoom out" %}</li> + <li id='map_menu_center'>{% trans "Center the map here" %}</li> + </ul> +</div> diff --git a/chimere/templates/chimere/blocks/multimedia_file.html b/chimere/templates/chimere/blocks/multimedia_file.html index cc7c5d3..a360a9e 100644 --- a/chimere/templates/chimere/blocks/multimedia_file.html +++ b/chimere/templates/chimere/blocks/multimedia_file.html @@ -1,6 +1,6 @@ {% load i18n %} {% if multimedia_item.picture %} -<a rel="prettyPhoto" href='{{multimedia_item.picture.url}}' ><img class='media-img' alt="{{multimedia_item.name}}" src='{{multimedia_item.thumbnailfile.url}}'/></a>{% endif %} +<a rel="prettyPhoto" href='{{multimedia_item.picture.url}}' ><img class='media-img thumbnail' alt="{{multimedia_item.name}}" src='{{multimedia_item.thumbnailfile.url}}'/></a>{% endif %} {% if multimedia_item.url %} {% if multimedia_item.multimedia_type.iframe %} diff --git a/chimere/templates/chimere/blocks/news.html b/chimere/templates/chimere/blocks/news.html new file mode 100644 index 0000000..fa581f7 --- /dev/null +++ b/chimere/templates/chimere/blocks/news.html @@ -0,0 +1,53 @@ +{% load i18n sanitize chimere_tags %} +{% if news_lst %} +<a href='#' id='news_button' class='ui-widget ui-button ui-state-default ui-corner-all'>{% trans "News"%}</a> +<script type='text/javascript'> +function display_news(){$("#welcome").dialog({title:"{% trans "News"%}", + width:360});} +$("#news_button").bind('click', display_welcome); +$(function(){ + $('#news div.media-player').jmeEmbedControls(); + $('#news video').each(function(index){$(this).pause()}); + $('#news audio').each(function(index){$(this).pause()}); + {% if display %}display_news();{%endif%} +}); +</script> +<div id='news' style='display:none'> + <div id='detail_content'> + <div class='news'> + {% if news_lst %} + {% for news in news_lst %} + <div class='info'> + {% if news.title %} + <h3>{{news.title}} – {{ news.date }}</h3> + <p>{{news.content|safe}}</p> + {% else %} + <h3>{{news.name}} – {{ news.start_date }}{% if news.end_date %} - {{ news.end_date }}{% endif %}</h3> + {% if news.default_pictures or news.default_pictures or news.default_multimedia_items%} + <div class='small-gallery'> + {% for picture in news.default_pictures %} + {% multimedia_render picture %} + {%endfor%} + {% for multimedia_item in news.default_multimedia_items %} + {% multimedia_render multimedia_item %} + {%endfor%} + </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> + {% 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> + {% endfor %} + <p class='marker_link'><a href='{% get_tinyfied_url news area_name %}'>{% trans "See it on the map"%}</a></p> + {% endif %} + </div> + {%endfor%} + {% endif %} + <div class='info'> + </div> + </div> + </div> +</div> +{% endif %} + diff --git a/chimere/templates/chimere/blocks/routing.html b/chimere/templates/chimere/blocks/routing.html new file mode 100644 index 0000000..db97191 --- /dev/null +++ b/chimere/templates/chimere/blocks/routing.html @@ -0,0 +1,48 @@ +{% load i18n %} +{# Don't forget to include routing-widget.js in your main template #} +{% if routing %} +{{itinerary_form.media}} +<a href='#' id='routing_button' class='ui-widget ui-button ui-state-default ui-corner-all'>{% trans "Itinerary"%}</a> +<div id='chimere_itinerary_panel'> + <div id='chimere_itinerary_form'> + {% for hidden in itinerary_form.hidden_fields %} + {{ hidden }} + {% endfor %} + {% for field in itinerary_form.visible_fields %} + <div id='{{field.auto_id}}_div'> + {% if field.label %}<label for='{{field.auto_id}}'>{{ field.label }}</label>{%endif%} + {{field}}</div> + {% endfor %} + <a id='add_step_link' href='#'>{% trans "Add a step" %}</a> + <span id='search_routing'>{% trans "Search" %}</span> + </div> + <div id='chimere_itinerary'> + <div id='chimere_itinerary_action'> + <ul class='action'> + <li class='ui-widget ui-button ui-state-default ui-corner-all'> + <a href='#' id='chimere_itinerary_modify'>{% trans "Modify" %}</a> + </li> + <li class='ui-widget ui-button ui-state-default ui-corner-all'> + <a href='#' id='chimere_itinerary_new'>{% trans "New search" %}</a> + </li> + </ul> + </div> + <div class='itinerary_label' id='total_label_div'> + <span id='chimere_total_label'></span> + </div> + <div class='itinerary_label'> + <span class='label'>{% trans "Start:"%}</span> <span id='chimere_start_label'></span></div> + <div id='chimere_itinerary_content'> + </div> + <div class='itinerary_label'> + <span class='label'>{% trans "Finish:"%}</span> <span id='chimere_end_label'></span> + </div> + </div> +</div> +<script language='javascript' type='text/javascript'> +<!-- +var step_label = "{% trans "Step" %}"; +var routing_fail_message = "{{routing_fail_message|safe}}"; +// --> +</script> +{% endif%} diff --git a/chimere/templates/chimere/blocks/share_bar.html b/chimere/templates/chimere/blocks/share_bar.html new file mode 100644 index 0000000..e421a0f --- /dev/null +++ b/chimere/templates/chimere/blocks/share_bar.html @@ -0,0 +1,39 @@ +{% load i18n %} + {% if share_networks %} + {% if simple %}{% trans "Share on"%}{% for share_network in share_networks %} + <a href='{{share_network.1}}'>{{share_network.0}}</a> + {% endfor %}{%else%} + <ul class='share'> + <li>{% trans "Share"%}</li>{% for share_network in share_networks %} + <li><a class='share_link share_id_{{share_network.0}}' href='{{share_network.1}}'><img src="{{share_network.2}}" alt="{{share_network.0}}"/></a></li> + {% endfor %}</ul>{% endif %} + <script language='text/javascript'> + $(function(){ + $('.share_link').click(function(){ + var href = $(this).attr('href'); + var url = '{% url chimere:get-share-url %}'; + var classes = $(this).attr('class').split(' '); + prefix = 'share_id_'; + var share_id; + for (idx=0;idx<classes.length;idx++){ + if(classes[idx].substring(0, prefix.length) == prefix){ + var share_id = classes[idx].substring(prefix.length); + } + } + var params = $('#permalink a').attr('href').split('/'); + url += share_id + params[params.length-1]; + $.ajax({url: url, + dataType: "html", + success: function (url) { + window.open(url); + return false; + }, + error: function(){ + return false; + } + }); + return false; + }); + }); + </script> + {% endif %} diff --git a/chimere/templates/chimere/default_extra_page.html b/chimere/templates/chimere/default_extra_page.html new file mode 100644 index 0000000..884d4cc --- /dev/null +++ b/chimere/templates/chimere/default_extra_page.html @@ -0,0 +1,15 @@ +{% extends "chimere/base.html" %} +{% load i18n chimere_tags %} +{% block extra_head %} + {{ block.super }} + {{ form.media }} + {% head_jquery %} +{% endblock %} +{% block message_map %}{% endblock %} +{% block message_edit%}{% endblock %} +{% block content %} + {{ block.super }} + <h3>{{title}}</h3> + {{content|safe}} +{% endblock %} + diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html index 33ddfd1..134c03e 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -35,14 +35,7 @@ <a href="mailto:?from={{moderator_emails}}&subject={% trans "Propose amendment" %}&body={% trans "I would like to propose an amendment for this item:"%} {{share_url}}"> {% trans "Propose amendment" %} </a>{%endif%} - {% if share_networks %} - {% if simple %}{% trans "Share on"%}{% for share_network in share_networks %} - <a href='{{share_network.1}}'>{{share_network.0}}</a> - {% endfor %}{%else%} - <ul class='share'> - <li>{% trans "Share"%}</li>{% for share_network in share_networks %} - <li><a href='{{share_network.1}}'><img src="{{share_network.2}}" alt="{{share_network.0}}"/></a></li> - {% endfor %}</ul>{% endif %} + {% share_bar marker.name %} {% endif %} </div> {% if marker.multimedia_items %} diff --git a/chimere/templates/chimere/edit.html b/chimere/templates/chimere/edit.html index 66862cd..9732005 100644 --- a/chimere/templates/chimere/edit.html +++ b/chimere/templates/chimere/edit.html @@ -132,14 +132,15 @@ </div> <div id='upload_in_progress'> <p>{% trans "Upload in progress. Please wait..." %}</p> - <p><img src='{{STATIC_URL}}chimere/img/ajax-loader.gif'/></p> + <p><img alt='Ajax loader' src='{{STATIC_URL}}chimere/img/ajax-loader.gif'/></p> </div> <script text='text/javascript'> $( "#upload_in_progress" ).dialog({ modal: true, resizable:false, height:110, - autoOpen:false + autoOpen:false, + dialogClass:'alert-box' } ); $(".ui-dialog-titlebar").hide(); diff --git a/chimere/templates/chimere/main_map.html b/chimere/templates/chimere/main_map.html index 76f796d..b7aa868 100644 --- a/chimere/templates/chimere/main_map.html +++ b/chimere/templates/chimere/main_map.html @@ -4,7 +4,7 @@ {% head_jquery %} {% head_chimere %} {% head_jme %} -<script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js"></script> +<script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js" type="text/javascript"></script> {{ block.super }} {% endblock %} {% block message_edit %}{% endblock %} @@ -18,20 +18,36 @@ </form> </div> + <div id='category_description'> + </div> + <script type='text/javascript'> + $(function(){$('#category_description').dialog({'autoOpen':false});}); + </script> + <div id='utils-div' class='ui-widget ui-state-default ui-corner-all'> {% if areas_visible %} {% display_areas %} {% endif %} + {% routing %} + {% display_welcome %} {% display_news news_visible %} <div id='permalink' class='ui-widget ui-button ui-state-default ui-corner-all'></div> <a id='simple_button' class='ui-widget ui-button ui-state-default ui-corner-all' href='{% url chimere:simple_index area_name_slash %}'>{% trans "Simple map" %}</a> </div> <div id='detail' class='ui-widget ui-corner-all'></div> - <div id='category_detail'></div> {% endblock %} {% block content %} {{block.super}} + <div id='main-map'></div> +<script type="text/javascript"> + $("#main-map").show(); +</script> + {% map_menu %} {% map 'main-map' %} + <div id='chimere_message'></div> + <script type='text/javascript'> + $(function(){$('#chimere_message').dialog({'autoOpen':false});}); + </script> {% 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 2b806ca..b73413a 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -10,6 +10,8 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q, Count +from django.template import defaultfilters +from django.utils.translation import ugettext as _ from django.template.loader import render_to_string from chimere.models import Marker, Area, News, SubCategory, MultimediaType @@ -39,22 +41,9 @@ def submited(context): return {"edit_url":reverse('chimere:edit'), "index_url":reverse('chimere:index')} -@register.inclusion_tag('chimere/blocks/welcome.html', takes_context=True) -def display_news(context, display=False): - """ - Welcome message and active news. - """ - area = None - context_data = {'display':display} - if "area_name" in context: - try: - area = Area.objects.get(urn=context["area_name"]) - context_data['area_name'] = context['area_name'] - context_data['welcome_message'] = area.welcome_message - except ObjectDoesNotExist: - pass +def get_news(area=None): # Retrieve news - news = News.objects.filter(available=True) + news = News.objects.filter(available=True, is_front_page=True) if area: news = news.filter(Q(areas__isnull=True)|Q(areas__in=[area.pk])) news = list(news.all()) @@ -62,13 +51,50 @@ def display_news(context, display=False): # Retrieve active markers today = date.today() after = today + timedelta(settings.CHIMERE_DAYS_BEFORE_EVENT) - q = Marker.objects.filter(status='A', start_date__lte=after - ).filter(Q(end_date__gte=today)|Q(end_date__isnull=True)) + q = Q(end_date__gte=today) | Q(end_date__isnull=True) + q = Marker.objects.filter(status='A', start_date__lte=after, + is_front_page=True).filter(q) if area: q = q.filter(area.getIncludeMarker()) news += list(q) news.sort(key=lambda x:x.date, reverse=True) - context_data['news_lst'] = news + return news + +@register.inclusion_tag('chimere/blocks/welcome.html', takes_context=True) +def display_welcome(context, display=False, title=''): + """ + Welcome message and active news. + """ + context_data = {'display':display} + area = None + if "area_name" in context: + try: + area = Area.objects.get(urn=context["area_name"]) + context_data['area_name'] = context['area_name'] + context_data['welcome_message'] = area.welcome_message + except ObjectDoesNotExist: + pass + context_data['news_lst'] = get_news(area)[:3] + context_data['STATIC_URL'] = settings.STATIC_URL + context_data['title'] = title if title \ + else _(u"Welcome to the %s") % settings.PROJECT_NAME + return context_data + +@register.inclusion_tag('chimere/blocks/news.html', takes_context=True) +def display_news(context, title=''): + """ + All news. + """ + area = None + context_data = {'STATIC_URL':settings.STATIC_URL} + if "area_name" in context: + try: + area = Area.objects.get(urn=context["area_name"]) + context_data['area_name'] = context['area_name'] + context_data['welcome_message'] = area.welcome_message + except ObjectDoesNotExist: + pass + context_data['news_lst'] = get_news(area) return context_data @register.inclusion_tag('chimere/blocks/head_jquery.html', takes_context=True) @@ -117,9 +143,36 @@ def head_chimere(context): "MAP_LAYER": settings.CHIMERE_DEFAULT_MAP_LAYER, "OSM_CSS_URLS": settings.OSM_CSS_URLS, "OSM_JS_URLS": settings.OSM_JS_URLS, + 'routing':settings.CHIMERE_ENABLE_ROUTING + } + return context_data + +@register.inclusion_tag('chimere/blocks/head_form.html') +def head_form(): + """ + Manualy add forms header (necessary in case of ajax load) + """ + context_data = { + "TINYMCE_URL": settings.TINYMCE_URL, } return context_data +@register.inclusion_tag('chimere/blocks/map_menu.html', takes_context=True) +def map_menu(context): + context_data = {'routing':settings.CHIMERE_ENABLE_ROUTING} + return context_data + +@register.inclusion_tag('chimere/blocks/routing.html', takes_context=True) +def routing(context): + context_data = { + 'routing':settings.CHIMERE_ENABLE_ROUTING, + 'itinerary_form':context['itinerary_form'], + 'routing_fail_message':_(settings.CHIMERE_ROUTING_FAIL_MESSAGE + ).replace('\n', '\\n'), + 'routing_transport':context['routing_transport']} + context_data['STATIC_URL'] = settings.STATIC_URL + return context_data + @register.inclusion_tag('chimere/blocks/map.html', takes_context=True) def map(context, map_id='map'): context_data = {'map_id':map_id, @@ -128,12 +181,16 @@ def map(context, map_id='map'): context_data['icon_offset_y'] = settings.CHIMERE_ICON_OFFSET_Y context_data['icon_width'] = settings.CHIMERE_ICON_WIDTH context_data['icon_height'] = settings.CHIMERE_ICON_HEIGHT + context_data['routing'] = 'true' if settings.CHIMERE_ENABLE_ROUTING \ + else 'none' area_name = context['area_name'] if 'area_name' in context else 'area_name' map_layers, default_area = get_map_layers(area_name) - context_data['map_layers'] = ", ".join(map_layers) + context_data['js_map_layers'] = ", ".join( + [js for name, js, default in map_layers]) + context_data['map_layers'] = map_layers if default_area: context_data['selected_map_layer'] = default_area - context_data['p_checked_categories'] = None + context_data['checked_categories'] = [] area = None if area_name: try: @@ -145,7 +202,10 @@ def map(context, map_id='map'): area = Area.objects.get(default=True) except ObjectDoesNotExist: pass + subcat_layer = SubCategory.objects.filter(as_layer=True, available=True) if area: + if area.subcategories.count(): + subcat_layer = subcat_layer.filter(areas__pk=area.pk) context_data['area_id'] = area_name if 'zoomout' in context and context['zoomout']: context_data['zoom'] = "[%s]" % ",".join(( @@ -155,11 +215,10 @@ def map(context, map_id='map'): unicode(area.lower_right_corner.y))) if area.subcategories.filter(available=True).count() == 1: context_data['single_category'] = True - context_data['p_checked_categories'] = "[%d]" % \ - area.subcategories.all()[0].pk + context_data['checked_categories'] = area.subcategories.all()[0].pk elif area.default_subcategories.count(): - context_data['p_checked_categories'] = unicode([subcategory.pk - for subcategory in area.default_subcategories.all()]) + context_data['checked_categories'] = [s.pk + for s in area.default_subcategories.all()] if area.restrict_to_extent: context_data['restricted_extent'] = """ var bounds = new OpenLayers.Bounds(); @@ -167,17 +226,20 @@ bounds.extend(new OpenLayers.LonLat(%f, %f)); bounds.extend(new OpenLayers.LonLat(%f, %f)); """ % (area.upper_left_corner.x, area.upper_left_corner.y, area.lower_right_corner.x, area.lower_right_corner.y) - + context_data['subcat_layer'], c_cat = [], None + for subcat in subcat_layer.order_by('category__order', 'category').all(): + if subcat.category != c_cat: + context_data['subcat_layer'].append(subcat.category) + c_cat = subcat.category + context_data['subcat_layer'].append(subcat) if SubCategory.objects.filter(available=True).count() <= 1: context_data['single_category'] = True - if not context_data['p_checked_categories']: + if not context_data['checked_categories']: cat = '' if SubCategory.objects.filter(available=True).count(): cat = unicode(SubCategory.objects.filter(available=True ).all()[0].pk) - context_data['p_checked_categories'] = "[%s]" % cat - if not context_data['p_checked_categories']: - context_data['p_checked_categories'] = "[]" + context_data['checked_categories'] = cat context_data['dynamic_categories'] = 'true' \ if area and area.dynamic_categories else 'false' if 'request' not in context: @@ -186,7 +248,8 @@ bounds.extend(new OpenLayers.LonLat(%f, %f)); # Default values if request.GET: for key in ('zoom', 'lon', 'lat', 'display_submited', - 'current_feature'): + 'current_feature', 'routing_start_lon', 'routing_start_lat', + 'routing_end_lon', 'routing_end_lat', 'routing_steps'): if key in request.GET and request.GET[key]: context_data['p_'+key] = request.GET[key] else: @@ -194,7 +257,7 @@ bounds.extend(new OpenLayers.LonLat(%f, %f)); if 'checked_categories' in request.GET \ and request.GET['checked_categories']: cats = request.GET['checked_categories'].split('_') - context_data['p_checked_categories'] = "[%s]" % ",".join(cats) + context_data['checked_categories'] = cats return context_data @register.inclusion_tag('chimere/blocks/multimedia_file.html', @@ -216,6 +279,16 @@ def get_tinyfied_url(marker, area_name=''): url = marker.get_absolute_url(area_name) return url +@register.inclusion_tag('chimere/blocks/share_bar.html', + takes_context=True) +def share_bar(context, name='', email_only=False): + context['STATIC_URL'] = settings.STATIC_URL + context['name'] = name + context['email_only'] = email_only + context['share_networks'] = [(defaultfilters.slugify(name), url, icon) + for name, url, icon in settings.CHIMERE_SHARE_NETWORKS] + return context + @register.filter(name='ol_map') def ol_map(item, arg='map_id'): geom, geom_type = None, None diff --git a/chimere/tests.py b/chimere/tests.py index d3dc3de..af342c5 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -4,6 +4,7 @@ import datetime import lxml.etree import os +import simplejson as json test_path = os.path.abspath(__file__) test_dir_path = os.path.dirname(test_path) + os.sep @@ -90,12 +91,14 @@ def marker_setup(sub_categories=[]): markers.append(marker_1) marker_2 = Marker.objects.create(name="Marker 2", status='A', point='SRID=4326;POINT(-3.5 48.4)', + is_front_page=True, available_date=current_date, start_date=current_date) marker_2.categories.add(sub_categories[1]) markers.append(marker_2) marker_3 = Marker.objects.create(name="Marker 3", status='A', point='SRID=4326;POINT(-4.5 48.45)', + is_front_page=True, available_date=current_date - datetime.timedelta(days=60), start_date=current_date - datetime.timedelta(days=60), end_date=current_date - datetime.timedelta(days=30)) @@ -240,8 +243,14 @@ class OSMImporterTest(TestCase, ImporterTest): importer2 = Importer.objects.create(importer_type='OSM', source=test_dir_path+'tests/sample_ways.osm') importer2.categories.add(subcategories[1]) + importer3 = Importer.objects.create(importer_type='OSM', + source='http://open.mapquestapi.com/xapi/api/0.6/way'\ + '[highway=motorway]'\ + '[bbox=2.0393839939136975,48.68908639634696,'\ + '2.3140421970277316,48.790972349390415]') - self.marker_importers = [(importer1, 19), (importer2, 8)] + self.marker_importers = [(importer1, 19), (importer2, 8), + (importer3, None)] class GeoRSSImporterTest(TestCase, ImporterTest): def setUp(self): @@ -381,15 +390,22 @@ class DynamicCategoryTest(TestCase): cats = self.areas[2].getCategories(status='A', filter_available=True) self.assertEqual(len(cats), 2) + def test_get_all_categories(self): + url = reverse('chimere:get_all_categories') + response = self.client.get(url) + self.assertEqual(200, response.status_code) + cats = json.loads(response.content)['categories'] + self.assertEqual(len(cats), 2) + class NewsTest(TestCase): def setUp(self): self.areas = areas_setup() self.markers = marker_setup() self.news = [] - self.news.append(News.objects.create(title=u"Test news 1", - available=True)) - self.news.append(News.objects.create(title=u"Test news 2", - available=False)) + self.news.append(News.objects.create(is_front_page=True, + title=u"Test news 1", available=True)) + self.news.append(News.objects.create(is_front_page=True, + title=u"Test news 2", available=False)) def test_news_display(self): context = display_news(Context({})) diff --git a/chimere/urls.py b/chimere/urls.py index 9d4018a..aa95921 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -51,9 +51,21 @@ if settings.CHIMERE_FEEDS: LatestPOIsByZoneID(), name='feeds-areaid'), ) +if settings.CHIMERE_ENABLE_ROUTING: + urlpatterns += patterns('chimere.views', + url(r'^(?P<area_name>[a-zA-Z0-9_-]*/)?route/'\ + r'(?P<transport>(%s))/((?P<speed>[0-9][0-9]*)/)?' + r'(?P<lon1>[-]?[0-9]+[.]?[0-9]*)_(?P<lat1>[-]?[0-9]+[.]?[0-9]*)_'\ + r'(?P<lonlat_steps>([-]?[0-9]+[.]?[0-9]*_[-]?[0-9]+[.]?[0-9]*_)*)'\ + r'(?P<lon2>[-]?[0-9]+[.]?[0-9]*)_(?P<lat2>[-]?[0-9]+[.]?[0-9]*)$' % + ('|'.join([key for key, lbl in settings.CHIMERE_ROUTING_TRANSPORT])), + 'route', name="route"), + ) + urlpatterns += patterns('chimere.views', url(r'^charte/?$', 'charte', name="charte"), - url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?contact/?$', 'contactus', name="contact"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?contact/?$', 'contactus', + name="contact"), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit/$', 'edit', name="edit"), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit/(?P<item_id>\w+)/(?P<submited>\w+)?$', @@ -71,12 +83,20 @@ urlpatterns += patterns('chimere.views', name="getgeoobjects"), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getAvailableCategories/$', 'get_available_categories', name="get_categories"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getAllCategories/$', + 'get_all_categories', name="get_all_categories"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?getCategory/(?P<category_id>\d+)/?$', + 'getCategory', name="get_category"), + url(r'^(?P<area_name>[a-zA-Z0-9_-]*/)?get-share-url/(?P<network>\w+)?$', + 'getShareUrl', name="get-share-url"), url(r'^(?P<area_name>[a-zA-Z0-9_-]*/)?ty/(?P<tiny_urn>\w+)$', 'redirectFromTinyURN', name="tiny"), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?upload_file/((?P<category_id>\w+)/)?$', 'uploadFile', name='upload_file'), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?process_route_file/(?P<file_id>\d+)/$', 'processRouteFile', name='process_route_file'), + url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?dyn/(?P<page_id>\w+)/$', + 'extraPage', name='extra_page'), # At the end, because it catches large url(r'^(?P<area_name>[a-zA-Z0-9_-]+)?', 'index', name="index"), ) diff --git a/chimere/utils.py b/chimere/utils.py index 8a9855a..0d97757 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -81,6 +81,7 @@ class ImportManager: 'import_key__icontains':'%s:%s;' % (key, import_key), 'import_source':self.importer_instance.source} try: + item = None if pk: ref_item = cls.objects.get(pk=pk) else: @@ -490,10 +491,10 @@ class CSVManager(ImportManager): return (0, 0, msg) reader = csv.reader(source, delimiter=';', quotechar='"') prop_cols = [] - for pm in Marker.properties(): + for pm in Marker.all_properties(): prop_cols.append((pm.name, pm.getAttrName(), pm.getAttrName()+'_set')) - cols = self.COLS + prop_cols + cols = list(self.COLS) + prop_cols datas = [] for idx, row in enumerate(reader): if not idx: # first row @@ -505,7 +506,7 @@ class CSVManager(ImportManager): if len(row) < len(cols): continue pk, name, cats, state = row[0], row[1], row[2], row[3] - description, geom = row[4], row[5] + description, geom = row[4], row[5].upper() COL_INDEX = 6 dct = {'description':description, 'name':name, @@ -520,7 +521,7 @@ class CSVManager(ImportManager): dct['route'] = geom else: continue - import_key = pk if pk else name + import_key = pk if pk else name.decode('utf-8') item, updated, created = self.create_or_update_item(cls, dct, import_key, pk=pk) if updated: @@ -538,8 +539,8 @@ class CSVManager(ImportManager): def export(cls, queryset): dct = {'description':unicode(datetime.date.today()), 'data':[]} cls_name = queryset.model.__name__.lower() - cols = cls.COLS - for pm in queryset.model.properties(): + cols = list(cls.COLS) + for pm in queryset.model.all_properties(): cols.append((pm.name, pm.getAttrName(), pm.getAttrName()+'_set')) header = [col[0] for col in cols] dct['data'].append(header) diff --git a/chimere/views.py b/chimere/views.py index db63809..b40e58a 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -29,27 +29,31 @@ from itertools import groupby import re from django.conf import settings +from django.contrib.gis.geos import GEOSGeometry +from django.contrib.gis.gdal.error import OGRException +from django.contrib.gis.measure import D from django.core import serializers from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import redirect, render_to_response -from django.template import loader, RequestContext -from django.utils import simplejson +from django.template import loader, RequestContext, defaultfilters +from django.utils import simplejson as json from django.utils.http import urlquote from django.utils.translation import ugettext as _ from chimere.actions import actions -from chimere.models import Category, SubCategory, PropertyModel, \ - Marker, Route, News, SimpleArea, Area, Color, TinyUrl, RouteFile, \ - get_users_by_area +from chimere.models import Category, SubCategory, PropertyModel, Page,\ + Marker, Route, News, SimpleArea, Area, Color, TinyUrl, RouteFile from chimere.widgets import getMapJS, PointChooserWidget, \ RouteChooserWidget, AreaWidget from chimere.forms import MarkerForm, RouteForm, ContactForm, FileForm, \ FullFileForm, MultimediaFileFormSet, PictureFileFormSet, notifySubmission,\ - notifyStaff, AreaForm + notifyStaff, AreaForm, RoutingForm, getStaffEmails + +from chimere.route import router def get_base_uri(request): base_uri = 'http://' @@ -101,9 +105,36 @@ def get_base_response(area_name=""): if area and area.dynamic_categories else False base_response_dct['JQUERY_JS_URLS'] = settings.JQUERY_JS_URLS base_response_dct['JQUERY_CSS_URLS'] = settings.JQUERY_CSS_URLS + base_response_dct['PROJECT_NAME'] = settings.PROJECT_NAME return base_response_dct, None -def index(request, area_name=None, default_area=None, simple=False): +def getShareUrl(request, area_name='', network=''): + """ + Get a share url + """ + data = getTinyfiedUrl(request, request.GET.urlencode(), area_name) + for name, url, img in settings.CHIMERE_SHARE_NETWORKS: + if defaultfilters.slugify(name) == network: + return HttpResponse(url % {'text':data['text'], 'url':data['url']}) + return HttpResponse('') + +def getShareNetwork(request, area_name='', marker=None): + """ + Get URLs to share items + """ + parameters = "" + if marker: + parameters = u'current_feature=%d' % marker.pk + parameters += u"&checked_categories=%s" % "_".join([str(m.id) \ + for m in marker.categories.all()]) + net_dct = getTinyfiedUrl(request, parameters, area_name) + share_networks = [] + for network in settings.CHIMERE_SHARE_NETWORKS: + share_networks.append((network[0], network[1] % net_dct, network[2])) + return share_networks, net_dct + +def index(request, area_name=None, default_area=None, simple=False, + get_response=False): """ Main page """ @@ -123,18 +154,27 @@ def index(request, area_name=None, default_area=None, simple=False): if request.GET and 'lat' in request.GET \ and 'lon' in request.GET: zoomout = None + if settings.CHIMERE_ENABLE_ROUTING: + response_dct['itinerary_form'] = RoutingForm() + response_dct['routing_transport'] = settings.CHIMERE_ROUTING_TRANSPORT response_dct.update({ - 'actions':actions, 'action_selected':('view',), + 'actions':actions(response_dct['area_name']), + 'action_selected':('view',), 'error_message':'', 'news_visible': news_visible, 'areas_visible': settings.CHIMERE_DISPLAY_AREAS, 'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, 'dynamic_categories':response_dct['dynamic_categories'], - 'zoomout':zoomout + 'zoomout':zoomout, + 'contact_email':settings.CONTACT_EMAIL }) + response_dct['share_networks'], net_dct = \ + getShareNetwork(request, response_dct['area_name']) tpl = 'chimere/main_map.html' if simple: tpl = 'chimere/main_map_simple.html' + if get_response: + return tpl, response_dct return render_to_response(tpl, response_dct, context_instance=RequestContext(request)) @@ -268,7 +308,7 @@ def edit(request, area_name="", item_id=None, submited=False): if request.POST and request.POST.get('point'): point_value = request.POST.get('point') response_dct.update({ - 'actions':actions, + 'actions':actions(response_dct['area_name']), 'action_selected':('contribute', 'edit'), 'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, 'form':form, @@ -347,7 +387,7 @@ def processRouteFile(request, area_name='', file_id=None): route = route_file.route if not route: return HttpResponse(status=500) - return HttpResponse('('+simplejson.dumps({'wkt':route, + return HttpResponse('(' + json.dumps({'wkt':route, 'file_id':file_id})+')', 'application/javascript', status=200) except OSError as e: @@ -376,7 +416,7 @@ def editRoute(request, area_name="", item_id=None, submited=False): if request.POST and request.POST.get('route'): route_value = request.POST.get('route') response_dct.update({ - 'actions':actions, + 'actions':actions(response_dct['area_name']), 'action_selected':('contribute', 'edit-route'), 'error_message':'', 'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, @@ -404,7 +444,8 @@ def submited(request, area_name="", action=""): response_dct, redir = get_base_response(area_name) if redir: return redir - response_dct.update({'actions':actions, 'action_selected':action,}) + response_dct.update({'actions':actions(response_dct['area_name']), + 'action_selected':action,}) return render_to_response('chimere/submited.html', response_dct, context_instance=RequestContext(request)) @@ -415,7 +456,8 @@ def charte(request, area_name=""): response_dct, redir = get_base_response(area_name) if redir: return redir - response_dct.update({'actions':actions, 'action_selected':('charte',)}) + response_dct.update({'actions':actions(response_dct['area_name']), + 'action_selected':('charte',)}) return render_to_response('chimere/charte.html', response_dct, context_instance=RequestContext(request)) @@ -443,11 +485,32 @@ def contactus(request, area_name=""): response_dct, redir = get_base_response(area_name) if redir: return redir - response_dct.update({'actions':actions, 'action_selected':('contact',), + response_dct.update({'actions':actions(response_dct['area_name']), + 'action_selected':('contact',), 'contact_form':form, 'message':msg}) return render_to_response('chimere/contactus.html', response_dct, context_instance=RequestContext(request)) +def extraPage(request, area_name="", page_id=""): + """ + Extra dynamic pages + """ + try: + page = Page.objects.get(available=True, mnemonic=page_id) + except ObjectDoesNotExist: + return redirect(reverse('chimere:index')) + response_dct, redir = get_base_response(area_name) + if redir: + return redir + response_dct.update({'actions':actions(response_dct['area_name']), + 'action_selected':(page_id,), + 'content':page.content, + 'title':page.title}) + tpl = page.template_path if page.template_path \ + else 'chimere/default_extra_page.html' + return render_to_response(tpl, response_dct, + context_instance=RequestContext(request)) + def getDetail(request, area_name, marker_id): ''' Get the detail for a marker @@ -464,15 +527,14 @@ def getDetail(request, area_name, marker_id): if request.method == 'GET': if 'simple' in request.GET and request.GET['simple']: response_dct['simple'] = True - parameters = u'current_feature=%s' % marker_id - parameters += u"&checked_categories=%s" % "_".join([str(m.id) \ - for m in marker.categories.all()]) - net_dct = getTinyfiedUrl(request, parameters, response_dct['area_name']) - share_networks = [] + response_dct['share_networks'], net_dct = \ + getShareNetwork(request, response_dct['area_name'], marker) response_dct['share_url'] = net_dct['url'] - for network in settings.CHIMERE_SHARE_NETWORKS: - share_networks.append((network[0], network[1] % net_dct, network[2])) - response_dct['share_networks'] = share_networks + net_dct['to'] = settings.CONTACT_EMAIL + if net_dct['to']: + net_dct["body"] = _(settings.CHIMERE_MODIF_EMAIL) + response_dct['modif_by_email'] = 'mailto:?to=%(to)s&subject='\ + '%(text)s&body=%(body)s%(url)s' % net_dct # to be sure there is unique IDs during a browsing response_dct['time_now'] = datetime.datetime.now().strftime('%H%M%S') response_dct['dated'] = settings.CHIMERE_DAYS_BEFORE_EVENT \ @@ -550,10 +612,28 @@ def getGeoObjects(request, area_name, category_ids, status): data = '{"type": "FeatureCollection", "features":[%s]}' % ",".join(jsons) return HttpResponse(data) +def get_all_categories(request, area_name=None): + ''' + Get all available categories in JSON + ''' + context_data, redir = get_base_response(area_name) + area = context_data["area"] + subcategories = [] + if area: + subcategories = list(area.getCategories('A', + area_name=context_data['area_name'])) + else: + categories = SubCategory.getAvailable() + for cat, subcats in categories: + subcategories += subcats + subcats = [subcat.getJSONDict() for subcat in subcategories] + jsons = json.dumps({'categories':subcats}) + return HttpResponse(jsons) + def get_available_categories(request, area_name=None, area=None, status='A', force=None): ''' - Get categories for a designed area + Get category menu for a designed area ''' context_data, redir = get_base_response(area_name) area = context_data["area"] @@ -598,6 +678,16 @@ def get_available_categories(request, area_name=None, area=None, status='A', return render_to_response('chimere/blocks/categories.html', context_data, context_instance=RequestContext(request)) +def getCategory(request, area_name='', category_id=0): + ''' + Get the JSON for a category (mainly in order to get the description) + ''' + try: + category = SubCategory.objects.get(pk=category_id) + except ObjectDoesNotExist: + return HttpResponse('no results') + return HttpResponse(category.getJSON()) + def getTinyfiedUrl(request, parameters, area_name=''): ''' Get the tinyfied version of parameters @@ -638,6 +728,72 @@ def redirectFromTinyURN(request, area_name='', tiny_urn=''): return redir return HttpResponseRedirect(response_dct['extra_url'] + parameters) +def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, + transport='foot', speed=''): + ''' + Get the JSON for a route + ''' + try: + lon1, lat1 = float(lon1), float(lat1) + lon2, lat2 = float(lon2), float(lat2) + steps = [float(lonlat) for lonlat in lonlat_steps.split('_') if lonlat] + # regroup by 2 + steps = [(steps[i*2], steps[i*2+1]) for i in range(len(steps)/2)] + except ValueError: + return HttpResponse('no results') + jsons, desc, total = router.route(lon1, lat1, lon2, lat2, steps=steps, + transport=transport, speed=speed) + if not jsons: + return HttpResponse('no results') + jsonencoder = json.JSONEncoder() + total = jsonencoder.encode(total) + desc = jsonencoder.encode(desc) + + # get associated POIs + try: + route = GEOSGeometry(jsons[0]) + except OGRException: + return HttpResponse(_(u"Bad geometry"), status=500) + cats = SubCategory.objects.filter(routing_warn=True) + message = '' + if cats.count(): + st_string = '{"type":"Feature", "geometry":{ "type": "Point", '\ + '"coordinates": [ %f, %f ] }, "properties":{"icon_path":"%s",'\ + '"icon_width":%d, "icon_height":%d}}' + points = [(m.point, m.categories.all()[0].icon) + for m in list(Marker.objects.filter(status='A', + categories__in=cats, point__distance_lte=(route, D(m=15)) + ).all())] + for pt, icon in points: + st = st_string % (pt.x, pt.y, icon.image.url, icon.image.width, + icon.image.height) + jsons.append(st) + routes = Route.objects.filter(status='A', categories__in=cats, + route__crosses=route) + intersect = False + for rout in routes.intersection(route): + pts = rout.intersection + icon = rout.categories.all()[0].icon + if hasattr(pts, 'x'): + pts = [pts] + if pts: + pt = pts[0] + st = st_string % (pt.x, pt.y, icon.image.url, icon.image.width, + icon.image.height) + jsons.append(st) + if points or intersect: + message = getattr(settings, 'CHIMERE_ROUTING_WARN_MESSAGE', '') + if message: + message = ', "message":%s' % jsonencoder.encode( + "%s" % _(message)) + else: + message = '' + data = '{"properties":{"transport":%s, "total":%s, "description":%s}, '\ + '"type": "FeatureCollection", "features":[%s]%s}' % ( + jsonencoder.encode(transport), total, desc, ",".join(jsons), + message) + return HttpResponse(data) + def rss(request, area_name=''): ''' Redirect to RSS subscription page @@ -645,7 +801,8 @@ def rss(request, area_name=''): response_dct, redir = get_base_response(area_name) if redir: return redir - response_dct.update({'actions':actions, 'action_selected':('rss',), + response_dct.update({'actions':actions(response_dct['area_name']), + 'action_selected':('rss',), 'category_rss_feed':'',}) # If the form has been submited if request.method == "POST": diff --git a/chimere/widgets.py b/chimere/widgets.py index 4cccf32..481a5c9 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -27,6 +27,9 @@ from django.contrib.gis.db import models from django.contrib.gis.geos import fromstr from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.forms.widgets import RadioInput, RadioFieldRenderer +from django.utils.encoding import force_unicode +from django.utils.html import conditional_escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -70,18 +73,23 @@ def get_map_layers(area_name=''): pass map_layers, default = [], None if area and area.layers.count(): - map_layers = [layer.layer_code + map_layers = [[layer.name, layer.layer_code, False] for layer in area.layers.order_by('arealayers__order').all()] def_layer = area.layers.filter(arealayers__default=True) if def_layer.count(): def_layer = def_layer.all()[0] for order, map_layer in enumerate(map_layers): - if map_layer == def_layer.layer_code: + if map_layer[1] == def_layer.layer_code: default = order + map_layers[order][2] = True + else: + map_layers[0][2] = True elif settings.CHIMERE_DEFAULT_MAP_LAYER: - map_layers = [settings.CHIMERE_DEFAULT_MAP_LAYER] + map_layers = [(_(u"Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, + True)] else: - map_layers = ["new OpenLayers.Layer.OSM.Mapnik('Mapnik')"] + map_layers = [(u"Mapnik", "new OpenLayers.Layer.OSM.Mapnik('Mapnik')", + True)] return map_layers, default class ChosenSelectWidget(forms.Select): @@ -103,6 +111,41 @@ class ChosenSelectWidget(forms.Select): u"</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) +""" +JQuery UI button select widget. +""" +class ButtonRadioInput(RadioInput): + def render(self, name=None, value=None, attrs=None, choices=()): + name = name or self.name + value = value or self.value + attrs = attrs or self.attrs + if 'id' in self.attrs: + label_for = ' for="%s_%s"' % (self.attrs['id'], self.index) + else: + label_for = '' + choice_label = conditional_escape(force_unicode(self.choice_label)) + return mark_safe(u'%s <label%s>%s</label>' % (self.tag(), label_for, + choice_label)) +class ButtonRadioFieldRenderer(RadioFieldRenderer): + def __iter__(self): + for i, choice in enumerate(self.choices): + yield ButtonRadioInput(self.name, self.value, self.attrs.copy(), + choice, i) + def render(self): + return mark_safe(u'\n'.join([force_unicode(w) for w in self])) +class ButtonSelectWidget(forms.RadioSelect): + def __init__(self, *args, **kwargs): + self.renderer = ButtonRadioFieldRenderer + super(ButtonSelectWidget, self).__init__(*args, **kwargs) + + def render(self, *args, **kwargs): + rendered = "<div id='%s'>\n" % kwargs['attrs']['id'] + rendered += super(ButtonSelectWidget, self).render(*args, **kwargs) + rendered += u"\n<script type='text/javascript'>\n"\ + u" $('#%s').buttonset();\n"\ + u"</script>\n</div>\n" % kwargs['attrs']['id'] + return mark_safe(rendered) + class ImporterChoicesWidget(forms.Select): ''' Importer select widget. @@ -125,6 +168,33 @@ class TextareaWidgetBase(forms.Textarea): rendered = super(TextareaWidgetBase, self).render(*args, **kwargs) return mark_safe(rendered) +class FullTextareaWidget(TextareaWidgetBase): + """ + Manage the edition of a text using TinyMCE + """ + class Media: + js = ["%stiny_mce.js" % settings.TINYMCE_URL] + + def render(self, *args, **kwargs): + if 'attrs' not in kwargs: + kwargs['attrs'] = {} + if 'class' not in kwargs['attrs']: + kwargs['attrs']['class'] = '' + else: + kwargs['attrs']['class'] += ' ' + kwargs['attrs']['class'] += 'mceEditor' + rendered = super(FullTextareaWidget, self).render(*args, **kwargs) + rendered += u"""<script type='text/javascript'> +tinyMCE.init({ + mode : "textareas", + theme : "advanced", + relative_urls : false, + editor_selector : "mceEditor" +}); +</script> +""" + return mark_safe(rendered) + class TextareaWidget(TextareaWidgetBase): """ Manage the edition of a text using TinyMCE @@ -151,6 +221,27 @@ class DatePickerWidget(forms.TextInput): u"</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) +class NominatimWidget(forms.TextInput): + class Media: + js = ["%schimere/js/nominatim-widget.js" % settings.STATIC_URL] + def render(self, name, value, attrs=None, area_name=''): + tpl = u""" +<input type='hidden' name='nominatim_%(id)s_lat' id='nominatim_%(id)s_lat'/> +<input type='hidden' name='nominatim_%(id)s_lon' id='nominatim_%(id)s_lon'/> +<input type='text' class='nominatim-widget' name='nominatim_%(id)s' id='nominatim_%(id)s' value=""/> +<label class='nominatim-label' id='nominatim_%(id)s_label'> </label> +<script type='text/javascript'> +var default_nominatim_lbl = "%(label)s"; +var nominatim_url = "%(nominatim_url)s"; +$("#nominatim_%(id)s").val(default_nominatim_lbl); +$("#nominatim_%(id)s").click(function(){ + $("#nominatim_%(id)s").val(''); +}); +</script> +""" % {'id':name, 'nominatim_url':settings.NOMINATIM_URL, + 'label':_(u"Street, City, Country")} + return mark_safe(tpl) + class PointChooserWidget(forms.TextInput): """ Manage the edition of point on a map @@ -182,7 +273,11 @@ class PointChooserWidget(forms.TextInput): else: value = None map_layers, default_area = get_map_layers(area_name) + map_layers = [js for n, js, default in map_layers] js = """ + var resolutions; + var zoomOffset; + OpenLayers.ImgPath = '%schimere/img/'; var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s'); var EPSG_PROJECTION = epsg_projection = new OpenLayers.Projection('EPSG:%s'); @@ -259,7 +354,11 @@ class RouteChooserWidget(forms.TextInput): ''' tpl = getMapJS(area_name) map_layers, default_area = get_map_layers(area_name) + map_layers = [js for nm, js, default in map_layers] js = """ + var resolutions; + var zoomOffset; + var extra_url = "%s"; OpenLayers.ImgPath = '%schimere/img/'; var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s'); @@ -272,7 +371,7 @@ class RouteChooserWidget(forms.TextInput): chimere_init_options['edition'] = true; chimere_init_options['edition_type_is_route'] = true; chimere_init_options["checked_categories"] = []; - """ % ( reverse("chimere:index"), settings.STATIC_URL, + """ % (reverse("chimere:index"), settings.STATIC_URL, settings.CHIMERE_EPSG_DISPLAY_PROJECTION, settings.CHIMERE_EPSG_PROJECTION, settings.CHIMERE_DEFAULT_CENTER, settings.CHIMERE_DEFAULT_ZOOM, ", ".join(map_layers)) diff --git a/example_project/locale/fr/LC_MESSAGES/django.po b/example_project/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..ac36871 --- /dev/null +++ b/example_project/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,47 @@ +# Chimère +# Copyright (C) 2012 +# This file is distributed under the same license as the Chimère package. +# Étienne Loks <etienne.loks@peacefrogs.net>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: 2.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-26 17:11+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" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" + +#: settings.py:79 +msgid "Foot" +msgstr "Marche" + +#: settings.py:80 +msgid "Bicycle" +msgstr "À vélo" + +#: settings.py:81 +msgid "Motorcar" +msgstr "En voiture" + +#: settings.py:84 +msgid "You are walking slowly" +msgstr "Vous marchez lentement" + +#: settings.py:85 +msgid "You are walking pretty quickly" +msgstr "Vous marchez plutôt vite" + +#: settings.py:86 +msgid "You are riding pretty slowly" +msgstr "Vous conduisez plutôt lentement" + +#: settings.py:87 +msgid "You are riding pretty quickly" +msgstr "Vous conduisez plutôt rapidement" + +#: settings.py:106 +msgid "Hello, I would like to propose you a modification about this item: " +msgstr "Bonjour, je voudrais vous proposer une modification à propos de cet élément : " diff --git a/example_project/settings.py b/example_project/settings.py index c48a847..f89a9b8 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -5,6 +5,7 @@ # overload all theses settings in your local_settings.py file import os +_ = lambda s: s DEBUG = False TEMPLATE_DEBUG = DEBUG @@ -14,6 +15,7 @@ PROJECT_NAME = u'Chimère' ROOT_PATH = os.path.realpath(os.path.dirname(__file__)) + "/" EMAIL_HOST = 'localhost' +CONTACT_EMAIL = '' STATIC_URL = '/static/' STATIC_ROOT = ROOT_PATH + 'static/' @@ -76,10 +78,41 @@ CHIMERE_HIDE_PROPERTYMODEL = False # encoding for shapefile import CHIMERE_SHAPEFILE_ENCODING = 'ISO-8859-1' +# enable routing in Chimère +CHIMERE_ENABLE_ROUTING = False + +CHIMERE_ROUTING_TRANSPORT = (('foot', _(u"Foot")), + ('bicycle', _(u"Bicycle")), + ('motorcar', _(u"Motorcar")), + ) + +CHIMERE_ROUTING_SPEEDS = {'foot':((3, _(u"You are walking slowly")), + (6, _(u"You are walking pretty quickly")),), + 'bicycle':((16, _(u"You are riding pretty slowly")), + (22, _(u"You are riding pretty quickly")),) + } + +# available routing engine: 'routino' +CHIMERE_ROUTING_ENGINE = { + 'ENGINE': 'routino', + 'PATH': '/usr/local/src/web/bin/router', + 'DB_PATH': '/var/local/routino/', +} + +CHIMERE_ROUTING_FAIL_MESSAGE = _(u"Routing engine has failed to find an " + u"appropriate route. Start point or end point may be too far from " + u"an existing path.") + +NOMINATIM_URL = 'http://nominatim.openstreetmap.org/search' + # thumbnail CHIMERE_THUMBS_SCALE_HEIGHT=250 CHIMERE_THUMBS_SCALE_WIDTH=None +# length of short description +CHIMERE_SHORT_DESC_LENGTH = 400 + +CHIMERE_MODIF_EMAIL = _(u"""Hello, I would like to propose you a modification about this item: """) CHIMERE_CSV_ENCODING = 'ISO-8859-1' ADMINS = ( |