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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.xcfBinary files differ new 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 = ( | 
