diff options
55 files changed, 4083 insertions, 462 deletions
| diff --git a/chimere/actions.py b/chimere/actions.py index 0363d54..a434279 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+'/'] + 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 e5f47f1..3b3af2c 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -35,13 +35,14 @@ except ImportError:      pass  from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\ -                          NewsAdminForm, CategoryAdminForm, ImporterAdminForm +     SubCategoryAdminForm, NewsAdminForm, CategoryAdminForm, ImporterAdminForm,\ +     PageAdminForm  from chimere.models import Category, Icon, SubCategory, Marker, \       PropertyModel, News, Route, Area, ColorTheme, Color, RouteFile,\ -     MultimediaType, MultimediaFile, PictureFile, Importer, Layer, AreaLayers +     MultimediaType, MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ +     PropertyModelChoice, MultimediaExtension, Page  from chimere.utils import unicode_normalize, ShapefileManager, KMLManager,\                            CSVManager -from chimere.widgets import TextareaWidget  def get_areas_for_user(user):      """ @@ -114,9 +115,9 @@ class MarkerAdmin(admin.ModelAdmin):      list_filter = ('status', 'categories')      actions = [validate, 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'] +                       'submiter_name']      form = MarkerAdminForm      inlines = [MultimediaInline, PictureInline] @@ -175,6 +176,7 @@ class SubCategoryAdmin(admin.ModelAdmin):      """      list_display = ('name', 'category', 'available')      list_filter = ('category',) +    form = SubCategoryAdminForm  def importing(modeladmin, request, queryset):      for importer in queryset: @@ -212,6 +214,11 @@ class ImporterAdmin(admin.ModelAdmin):      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 NewsAdmin(admin.ModelAdmin):      """ @@ -237,6 +244,10 @@ class IconAdmin(admin.ModelAdmin):  class RouteFileAdmin(admin.ModelAdmin):      list_display = ['name', 'file_type'] +class MultimediaExtensionAdmin(admin.ModelAdmin): +    list_display = ('name', 'multimedia_type') +    list_filter = ('multimedia_type',) +  class MultimediaTypeAdmin(admin.ModelAdmin):      search_fields = ("name",)      list_display = ('name', 'media_type', 'mime_type', 'iframe', 'available') @@ -252,7 +263,14 @@ class PictureFileAdmin(admin.ModelAdmin):      list_display = ('name', 'picture', 'miniature', 'order')      list_filter = ('miniature',) +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) @@ -260,9 +278,10 @@ admin.site.register(SubCategory, SubCategoryAdmin)  admin.site.register(Marker, MarkerAdmin)  admin.site.register(RouteFile, RouteFileAdmin)  admin.site.register(Route, RouteAdmin) -admin.site.register(PropertyModel) +admin.site.register(PropertyModel, PropertyModelAdmin)  admin.site.register(Area, AreaAdmin)  admin.site.register(ColorTheme, ColorThemeAdmin) +admin.site.register(MultimediaExtension, MultimediaExtensionAdmin)  admin.site.register(MultimediaType, MultimediaTypeAdmin)  admin.site.register(MultimediaFile, MultimediaFileAdmin)  admin.site.register(PictureFile, PictureFileAdmin) diff --git a/chimere/fixtures/initial_data.json b/chimere/fixtures/initial_data.json index fe1cc98..71f4972 100644 --- a/chimere/fixtures/initial_data.json +++ b/chimere/fixtures/initial_data.json @@ -34,39 +34,6 @@          }      },       { -        "pk": 1,  -        "model": "chimere.category",  -        "fields": { -            "available": true,  -            "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc blandit porta eros, quis varius orci luctus nec. Suspendisse tempor sagittis tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus imperdiet consequat dolor. Etiam risus orci, auctor nec hendrerit ut, congue at ante. Aliquam et accumsan neque. Aliquam ac massa felis, ac porttitor nunc. Curabitur blandit odio id enim sodales blandit. Curabitur eleifend commodo lorem a feugiat. Nam at quam semper justo ultricies tempor.\r\n",  -            "name": "Default category",  -            "order": 10 -        } -    },  -    { -        "pk": 1,  -        "model": "chimere.icon",  -        "fields": { -            "width": 21,  -            "image": "icons/marker.png",  -            "name": "Default icon",  -            "height": 25 -        } -    },  -    { -        "pk": 1,  -        "model": "chimere.subcategory",  -        "fields": { -            "category": 1,  -            "available": true,  -            "name": "Default subcategory",  -            "item_type": "M",  -            "color_theme": null,  -            "order": 10,  -            "icon": 1 -        } -    },  -    {          "pk": 7,          "model": "chimere.multimediatype",          "fields": { @@ -232,6 +199,97 @@          }      },      { +        "pk": 16, +        "model": "chimere.multimediatype", +        "fields": { +            "available": false, +            "media_type": "O", +            "iframe": false, +            "name": "auto", +            "mime_type": "" +        } +    }, +    { +        "pk": 1, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 7, +            "name": "mkv" +        } +    }, +    { +        "pk": 3, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 2, +            "name": "mp3" +        } +    }, +    { +        "pk": 4, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 3, +            "name": "ogg" +        } +    }, +    { +        "pk": 5, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 5, +            "name": "mp4" +        } +    }, +    { +        "pk": 6, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 4, +            "name": "mpg" +        } +    }, +    { +        "pk": 7, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 4, +            "name": "mpeg" +        } +    }, +    { +        "pk": 8, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 8, +            "name": "avi" +        } +    }, +    { +        "pk": 9, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 6, +            "name": "ogm" +        } +    }, +    { +        "pk": 10, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 6, +            "name": "ogv" +        } +    }, +    { +        "pk": 11, +        "model": "chimere.multimediaextension", +        "fields": { +            "multimedia_type": 13, +            "name": "webm" +        } +    }, +    {          "pk": 1,          "model": "chimere.layer",          "fields": { diff --git a/chimere/forms.py b/chimere/forms.py index e465a8f..5cf2c63 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -32,10 +32,11 @@ from django.contrib.admin.widgets import AdminDateWidget  from django.core.mail import EmailMessage, BadHeaderError  from chimere.models import Marker, Route, PropertyModel, Property, Area,\ -     News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ -     PictureFile, Importer +   News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ +   PictureFile, Importer, PropertyModelChoice, IFRAME_LINKS, \ +   MultimediaExtension, Page  from chimere.widgets import AreaField, PointField, TextareaWidget, \ -                            DatePickerWidget +    FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget  from datetime import timedelta, datetime, tzinfo @@ -53,13 +54,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 @@ -89,11 +95,25 @@ 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 NewsAdminForm(forms.ModelForm):      """      Main form for news      """ -    content = forms.CharField(widget=TextareaWidget) +    content = forms.CharField(widget=FullTextareaWidget)      class Meta:          model = News @@ -191,16 +211,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      """ @@ -302,6 +338,10 @@ class RouteForm(RouteAdminForm):                                                      if k in marker_fields])          marker_dct['status'] = new_route.status          categories = [] +        if not marker_dct['point']: +            first_point = new_route.route.coords[0] +            marker_dct['point'] = 'POINT(%f %f)' % (first_point[0], +                                                    first_point[1])          new_marker, created = Marker.objects.get_or_create(route=new_route,                                                             defaults=marker_dct)          if not created: @@ -365,7 +405,33 @@ class MultimediaFileForm(BaseFileForm):      def __init__(self, *args, **kwargs):          super(MultimediaFileForm, self).__init__(*args, **kwargs)          self.fields['multimedia_type'].widget.choices = \ -                                              MultimediaType.get_tuples() +                                                MultimediaType.get_tuples() +        # this can be auto detect +        self.fields['multimedia_type'].required = False + +    def clean(self): +        if not self.cleaned_data.get('url'): +            return self.cleaned_data +        if self.cleaned_data.get('multimedia_type') and \ +           self.cleaned_data['multimedia_type'].name != 'auto': +            return self.cleaned_data +        url = self.cleaned_data['url'] +        for mm_type in IFRAME_LINKS: +            res, embeded_url = IFRAME_LINKS[mm_type] +            if [r for r in res if r.search(url)]: +                multimedia_type = MultimediaType.objects.get( +                                    name__iexact=mm_type) +                self.cleaned_data['multimedia_type'] = multimedia_type +                return self.cleaned_data +        ext = url.split(".")[-1] +        q = MultimediaExtension.objects.filter(name__iendswith=ext) +        if q.count(): +            self.cleaned_data['multimedia_type'] = q.all()[0].multimedia_type +        else: +            # default to an iframe +            self.cleaned_data['multimedia_type'] = \ +                MultimediaType.objects.filter(name__iexact='iframe').all()[0] +        return self.cleaned_data  MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True) @@ -403,7 +469,7 @@ class AreaAdminForm(forms.ModelForm):      Admin page to create an area      """      area = AreaField(label=_("Area"), fields=(PointField(), PointField())) -    welcome_message = forms.CharField(widget=TextareaWidget) +    welcome_message = forms.CharField(widget=TextareaWidget, required=False)      class Meta:          model = Area @@ -454,3 +520,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) + +    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 4462ff1..9a3c975 100644 --- a/chimere/locale/fr/LC_MESSAGES/django.po +++ b/chimere/locale/fr/LC_MESSAGES/django.po @@ -1,48 +1,47 @@  # Chimère  # Copyright (C) 2008-2012  # This file is distributed under the same license as the Chimère package. -# Étienne Loks <etienne.loks@peacefrogs.net>, 2008-2011. +# Étienne Loks <etienne.loks@peacefrogs.net>, 2008-2012.  #  msgid ""  msgstr "" -"Project-Id-Version: 0.2\n" +"Project-Id-Version: 2.0\n"  "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-20 21:17+0200\n" -"PO-Revision-Date: 2010-03-20 20:00+0100\n" +"POT-Creation-Date: 2012-09-05 19:08+0200\n"  "Last-Translator: Étienne Loks <etienne.loks@peacefrogs.net>\n"  "MIME-Version: 1.0\n"  "Content-Type: text/plain; charset=UTF-8\n"  "Content-Transfer-Encoding: 8bit\n" -#: __init__.py:8 models.py:502 +#: __init__.py:8 models.py:586  msgid "Multimedia files"  msgstr "Fichiers multimedias" -#: __init__.py:9 models.py:551 +#: __init__.py:9 models.py:643  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" @@ -86,382 +85,445 @@ 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:76 +#: forms.py:82  msgid "New submission for"  msgstr "Nouvelle proposition pour" -#: forms.py:77 +#: forms.py:83  #, 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:79 +#: forms.py:85  msgid "To valid, precise or unvalid this item: "  msgstr "Pour valider, préciser ou rejeter cet élément : " -#: forms.py:89 +#: forms.py:95  msgid "Email (optional)"  msgstr "Courriel (optionnel) " -#: forms.py:90 +#: forms.py:96  msgid "Object"  msgstr "Objet" -#: forms.py:158 +#: forms.py:173  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:171 +#: forms.py:184  msgid "This field is mandatory for the selected categories"  msgstr "Ce champ est obligatoire pour les catégories sélectionnées" -#: forms.py:385 +#: forms.py:445  msgid "File"  msgstr "Fichier" -#: forms.py:391 +#: forms.py:451  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:396 models.py:49 models.py:102 models.py:123 models.py:136 -#: models.py:150 models.py:233 models.py:449 models.py:492 models.py:536 -#: models.py:567 models.py:804 models.py:816 models.py:901 +#: forms.py:456 models.py:50 models.py:98 models.py:158 models.py:179 +#: models.py:192 models.py:206 models.py:298 models.py:520 models.py:576 +#: models.py:620 models.py:737 models.py:975 models.py:987 models.py:1072  #: templates/chimere/edit.html:39 templates/chimere/edit_route.html:36 +#: templates/chimere/blocks/alternate_multimedia.html:39  msgid "Name"  msgstr "Nom" -#: forms.py:405 models.py:853 +#: forms.py:465 models.py:1024  msgid "Area"  msgstr "Zone" -#: models.py:50 models.py:124 models.py:151 models.py:244 models.py:453 -#: models.py:822 models.py:903 +#: forms.py:524 +msgid "Start" +msgstr "Départ" + +#: forms.py:525 +msgid "Finish" +msgstr "Arrivée :" + +#: forms.py:526 +msgid "Speed" +msgstr "Vitesse" + +#: models.py:51 +msgid "Mnemonic" +msgstr "Mnémonique" + +#: models.py:53 models.py:99 models.py:180 models.py:207 models.py:309 +#: models.py:524 models.py:993 models.py:1074 models.py:1110  msgid "Available"  msgstr "Disponible" -#: models.py:51 models.py:912 +#: models.py:54 models.py:168 models.py:181 models.py:211 models.py:578 +#: models.py:635 models.py:992 models.py:1061 models.py:1073 +msgid "Order" +msgstr "Ordre" + +#: models.py:55 +msgid "Template path" +msgstr "Chemin du patron" + +#: models.py:62 models.py:63 +msgid "Page" +msgstr "Page" + +#: models.py:100 models.py:367 +msgid "Is front page" +msgstr "Est en page principale" + +#: models.py:102 models.py:1083  msgid "Date"  msgstr "Date" -#: models.py:57 models.py:58 +#: models.py:104 models.py:577 +msgid "Url" +msgstr "Url" + +#: models.py:109 models.py:110 templates/chimere/blocks/news.html:3 +#: templates/chimere/blocks/news.html:5  msgid "News"  msgstr "Nouvelle" -#: models.py:63 +#: models.py:119  msgid "Parameters"  msgstr "Paramètres" -#: models.py:67 +#: models.py:123  msgid "TinyUrl"  msgstr "Mini-url" -#: models.py:106 models.py:113 models.py:153 +#: models.py:162 models.py:169 models.py:209  msgid "Color theme"  msgstr "Thème de couleur" -#: models.py:111 +#: models.py:167  msgid "Code"  msgstr "Code" -#: models.py:112 models.py:125 models.py:155 models.py:494 models.py:543 -#: models.py:821 models.py:890 models.py:902 -msgid "Order" -msgstr "Ordre" - -#: models.py:118 +#: models.py:174  msgid "Color"  msgstr "Couleur" -#: models.py:131 models.py:149 templates/chimere/main_map.html:13 +#: models.py:187 models.py:205 templates/chimere/main_map.html:13  msgid "Category"  msgstr "Catégorie" -#: models.py:137 models.py:445 models.py:537 models.py:632 +#: models.py:193 models.py:516 models.py:621 models.py:802 +#: templates/chimere/blocks/alternate_multimedia.html:43  msgid "Image"  msgstr "Image" -#: models.py:139 models.py:539 models.py:634 +#: models.py:195 models.py:623 models.py:804  msgid "Height"  msgstr "Hauteur" -#: models.py:140 models.py:540 models.py:635 +#: models.py:196 models.py:624 models.py:805  msgid "Width"  msgstr "Largeur" -#: models.py:144 models.py:152 +#: models.py:200 models.py:208  msgid "Icon"  msgstr "Icône" -#: models.py:156 +#: models.py:212 +msgid "Is dated" +msgstr "Est daté" + +#: models.py:213  msgid "Marker"  msgstr "Point d'intérêt" -#: models.py:157 models.py:628 models.py:643 +#: models.py:214 models.py:798 models.py:813  #: templates/chimere/edit_route.html:27  msgid "Route"  msgstr "Trajet" -#: models.py:158 +#: models.py:215  msgid "Both"  msgstr "Mixte" -#: models.py:159 +#: models.py:216  msgid "Item type"  msgstr "Type d'élément" -#: models.py:164 +#: models.py:221  msgid "Sub-category"  msgstr "Sous-catégorie" -#: models.py:165 +#: models.py:222  msgid "Sub-categories"  msgstr "Sous-catégories" -#: models.py:211 +#: models.py:276  msgid "Importer type"  msgstr "Type d'import" -#: models.py:214 models.py:255 +#: models.py:279 models.py:320  msgid "Source"  msgstr "Source" -#: models.py:216 +#: models.py:281  msgid "Filter"  msgstr "Filtre" -#: models.py:219 +#: models.py:284  msgid "Associated subcategories"  msgstr "Sous-catégories associées" -#: models.py:220 +#: models.py:285  msgid "State"  msgstr "État" -#: models.py:222 +#: models.py:287  msgid "SRID"  msgstr "SRID" -#: models.py:223 +#: models.py:288  msgid "Zipped file"  msgstr "Fichier zippé" -#: models.py:226 +#: models.py:291  msgid "Importer"  msgstr "Import" -#: models.py:235 +#: models.py:300  msgid "Submitter session key"  msgstr "Clé de session du demandeur" -#: models.py:237 +#: models.py:302  msgid "Submitter name or nickname"  msgstr "Nom ou pseudo du demandeur" -#: models.py:239 +#: models.py:304  msgid "Submitter email"  msgstr "Courriel du demandeur" -#: models.py:241 +#: models.py:306  msgid "Submitter comment"  msgstr "Commentaire du demandeur" -#: models.py:243 +#: models.py:308  msgid "Submited"  msgstr "Soumis" -#: models.py:245 +#: models.py:310  msgid "Modified"  msgstr "Modifié" -#: models.py:246 +#: models.py:311  msgid "Disabled"  msgstr "Désactivé" -#: models.py:247 +#: models.py:312  msgid "Imported"  msgstr "Importé" -#: models.py:248 +#: models.py:313  msgid "Excluded"  msgstr "Exclu" -#: models.py:250 +#: models.py:315  msgid "Status"  msgstr "État" -#: models.py:251 +#: models.py:316  msgid "Import key"  msgstr "Clé d'import" -#: models.py:253 +#: models.py:318  msgid "Import version"  msgstr "Version de l'import" -#: models.py:258 templates/chimere/edit.html:56 +#: models.py:323 templates/chimere/edit.html:56  #: templates/chimere/edit_route.html:52  msgid "Start date"  msgstr "Date de début" -#: models.py:259 +#: models.py:324  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:261 templates/chimere/edit.html:62 +#: models.py:326 templates/chimere/edit.html:62  #: templates/chimere/edit_route.html:58  msgid "End date"  msgstr "Date de fin" -#: models.py:262 +#: models.py:327  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:294 +#: models.py:359  msgid "Reference marker"  msgstr "Point d'intérêt de référence" -#: models.py:295 +#: models.py:360  msgid "Localisation"  msgstr "Localisation" -#: models.py:297 +#: models.py:362  msgid "Available Date"  msgstr "Date de mise en disponibilité" -#: models.py:301 templates/chimere/edit.html:49 +#: models.py:366 templates/chimere/edit.html:49  #: templates/chimere/edit_route.html:46  msgid "Description"  msgstr "Description" -#: models.py:349 models.py:932 +#: models.py:420 models.py:1120  msgid "Point of interest"  msgstr "Point d'intérêt" -#: models.py:443 +#: models.py:514  msgid "Audio"  msgstr "Audio" -#: models.py:444 +#: models.py:515  msgid "Video"  msgstr "Vidéo" -#: models.py:446 +#: models.py:517  msgid "Other"  msgstr "Autre" -#: models.py:447 +#: models.py:518  msgid "Media type"  msgstr "Type de media" -#: models.py:450 +#: models.py:521  msgid "Mime type"  msgstr "Type mime" -#: models.py:452 +#: models.py:523  msgid "Inside an iframe"  msgstr "À l'intérieur d'un iframe" -#: models.py:456 +#: models.py:527  msgid "Multimedia type"  msgstr "Type de multimedia" -#: models.py:457 +#: models.py:528  msgid "Multimedia types"  msgstr "Types de multimedia" -#: models.py:493 -msgid "Url" -msgstr "Url" +#: models.py:563 +msgid "Extension name" +msgstr "Nom de l'extension" + +#: models.py:565 +msgid "Associated multimedia type" +msgstr "Type de multimedia associé" + +#: models.py:569 +msgid "Multimedia extension" +msgstr "Extension de fichier multimedia" -#: models.py:496 models.py:541 +#: models.py:570 +msgid "Multimedia extensions" +msgstr "Extensions de fichier multimedia" + +#: models.py:580 models.py:625  msgid "Display inside the description?"  msgstr "Apparaît dans la description ?" -#: models.py:501 +#: models.py:585  msgid "Multimedia file"  msgstr "Fichier multimedia" -#: models.py:550 +#: models.py:627 +msgid "Thumbnail" +msgstr "Miniature" + +#: models.py:631 +msgid "Thumbnail height" +msgstr "Hauteur de la miniature" + +#: models.py:633 +msgid "Thumbnail width" +msgstr "Largeur de la miniature" + +#: models.py:642  msgid "Picture file"  msgstr "Fichier d'image" -#: models.py:568 +#: models.py:738  msgid "Raw file (gpx or kml)"  msgstr "Fichier brut (gpx ou kml)" -#: models.py:569 +#: models.py:739  msgid "Simplified file"  msgstr "Fichier simplifié" -#: models.py:571 +#: models.py:741  msgid "KML"  msgstr "KML" -#: models.py:571 +#: models.py:741  msgid "GPX"  msgstr "GPX" -#: models.py:576 +#: models.py:746  msgid "Route file"  msgstr "Fichier de trajet" -#: models.py:577 +#: models.py:747  msgid "Route files"  msgstr "Fichiers de trajet" -#: models.py:627 +#: models.py:797  msgid "Reference route"  msgstr "Trajet de référence" -#: models.py:631 +#: models.py:801  msgid "Associated file"  msgstr "Fichier associé" -#: models.py:805 +#: models.py:976  msgid "Layer code"  msgstr "Code pour la couche" -#: models.py:811 +#: models.py:982  msgid "Layer"  msgstr "Couche" -#: models.py:817 +#: models.py:988  msgid "Area urn"  msgstr "Urn de la zone" -#: models.py:819 templates/chimere/blocks/welcome.html:3 +#: models.py:990 templates/chimere/blocks/welcome.html:3  msgid "Welcome message"  msgstr "Message d'accueil" -#: models.py:823 +#: models.py:994  msgid "Upper left corner"  msgstr "Coin en haut à gauche" -#: models.py:825 +#: models.py:996  msgid "Lower right corner"  msgstr "Coin en bas à droite" -#: models.py:827 +#: models.py:998  msgid "Default area"  msgstr "Zone par défaut" -#: models.py:828 +#: models.py:999  msgid "Only one area is set by default"  msgstr "Seule une zone est définie par défaut" -#: models.py:832 +#: models.py:1003  msgid "Sub-categories checked by default"  msgstr "Sous-catégories cochées par défaut" -#: models.py:834 +#: models.py:1005  msgid "Sub-categories dynamicaly displayed"  msgstr "Sous-categories affichées dynamiquement" -#: models.py:835 +#: models.py:1006  msgid ""  "If checked, categories are only displayed in the menu if they are available "  "on the current extent." @@ -469,68 +531,76 @@ msgstr ""  "Si coché, les catégories sont disponibles sur le menu seulement si elles "  "apparaissent sur la zone affichée." -#: models.py:839 models.py:906 +#: models.py:1010 models.py:1077  msgid "Restricted to theses sub-categories"  msgstr "Restreindre à ces sous-categories" -#: models.py:840 +#: models.py:1011  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:842 +#: models.py:1013  msgid "Link to an external CSS"  msgstr "Lien vers une feuille de style externe" -#: models.py:844 +#: models.py:1015  msgid "Restrict to the area extent"  msgstr "Restreindre à l'étendue de la zone" -#: models.py:891 +#: models.py:1062  msgid "Default layer"  msgstr "Couche par défaut" -#: models.py:895 models.py:896 +#: models.py:1066 models.py:1067  msgid "Layers"  msgstr "Couches" -#: models.py:904 +#: models.py:1075  msgid "Mandatory"  msgstr "Obligatoire" -#: models.py:907 +#: models.py:1078  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:909 +#: models.py:1080  msgid "Text"  msgstr "Texte" -#: models.py:910 +#: models.py:1081  msgid "Long text"  msgstr "Texte long" -#: models.py:911 +#: models.py:1082  msgid "Password"  msgstr "Mot de passe" -#: models.py:917 +#: models.py:1084 +msgid "Choices" +msgstr "Choix" + +#: models.py:1092  msgid "Type"  msgstr "Type" -#: models.py:922 models.py:934 +#: models.py:1097 models.py:1108 models.py:1122  msgid "Property model"  msgstr "Modèle de propriété" -#: models.py:935 +#: models.py:1109 models.py:1123  msgid "Value"  msgstr "Valeur" -#: models.py:939 +#: models.py:1115 +msgid "Model property choice" +msgstr "Choix pour les modèles de propriété" + +#: models.py:1134  msgid "Property"  msgstr "Propriété" @@ -630,19 +700,19 @@ msgstr ""  msgid "Bad param"  msgstr "Mauvais paramètre" -#: views.py:229 +#: views.py:241  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:312 +#: views.py:323  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:434 +#: views.py:455  msgid "Comments/request on the map"  msgstr "Commentaires/requètes sur la carte" -#: views.py:437 +#: views.py:458  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." @@ -651,48 +721,52 @@ msgstr ""  "laissé votre courriel vous serez peut-être contacté bientôt pour plus de "  "détails." -#: views.py:441 +#: views.py:462  msgid "Temporary error. Renew your message later."  msgstr "Erreur temporaire. Réenvoyez votre message plus tard." -#: views.py:572 +#: views.py:620  msgid "No category available in this area."  msgstr "Pas de catégorie disponible sur cette zone." -#: views.py:679 +#: views.py:753  msgid "Incorrect choice in the list"  msgstr "Choix incorrect dans la liste" -#: widgets.py:187 +#: widgets.py:229 +msgid "Street, City, Country" +msgstr "Rue, Commune, Pays" + +#: widgets.py:295  msgid "Latitude"  msgstr "Latitude" -#: widgets.py:187 +#: widgets.py:295  msgid "Longitude"  msgstr "Longitude" -#: widgets.py:212 +#: widgets.py:320  msgid "Invalid point"  msgstr "Point invalide" -#: widgets.py:262 +#: widgets.py:370  msgid "Creation mode"  msgstr "Mode création" -#: widgets.py:263 +#: widgets.py:371  msgid "To start drawing the route click on the toggle button: \"Draw\"."  msgstr ""  "Pour commencer le dessin cliquez sur le bouton : « Tracer »." -#: widgets.py:265 +#: widgets.py:373  msgid "Then click on the map to begin the drawing."  msgstr "Puis cliquez sur la carte pour commencer le dessin." -#: widgets.py:266 +#: widgets.py:374  msgid "You can add points by clicking again."  msgstr "Vous pouvez ajouter des points en cliquant de nouveau." -#: widgets.py:267 +#: widgets.py:375  msgid ""  "To finish the drawing double click. When the drawing is finished you can "  "edit it." @@ -700,7 +774,7 @@ msgstr ""  "Pour finir le tracé double-cliquez. Quand le tracé est fini vous pouvez "  "toujours l'éditer." -#: widgets.py:269 +#: widgets.py:377  msgid ""  "While creating to undo a drawing click again on the toggle button \"Stop "  "drawing\"." @@ -708,17 +782,17 @@ msgstr ""  "En mode création vous pouvez annuler un tracé en appuyant sur le bouton "  "« Arrêter le tracé »." -#: widgets.py:274 +#: widgets.py:382  msgid "Modification mode"  msgstr "Mode modification" -#: widgets.py:275 +#: widgets.py:383  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:276 +#: widgets.py:384  msgid ""  "To delete a point move the mouse cursor over it and press the \"d\" or \"Del"  "\" key." @@ -726,7 +800,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:278 +#: widgets.py:386  msgid ""  "To add a point click in the middle of a segment and drag the new point to "  "the desired position" @@ -735,33 +809,33 @@ msgstr ""  "maintenez le bouton appuyé et déplacez le nouveau point à la position "  "désirée." -#: widgets.py:285 +#: widgets.py:393  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:288 +#: widgets.py:396  msgid "Upload a route file (GPX or KML)"  msgstr "Déposer un trajet (fichier GPX ou KML)" -#: widgets.py:289 +#: widgets.py:397  msgid "or"  msgstr "ou" -#: widgets.py:294 +#: widgets.py:402  msgid "Start \"hand\" drawing"  msgstr "Commencer le tracé manuellement" -#: widgets.py:317 +#: widgets.py:425  msgid "Move on the map"  msgstr "Se déplacer" -#: widgets.py:317 +#: widgets.py:425  msgid "Draw"  msgstr "Tracer" -#: widgets.py:442 +#: widgets.py:550  msgid "Select..."  msgstr "Sélectionner..." @@ -809,6 +883,10 @@ msgstr "Partager sur"  msgid "Share"  msgstr "Partager" +#: templates/chimere/detail.html:36 +msgid "Propose a modification" +msgstr "Proposer une modification" +  #: templates/chimere/edit.html:20  msgid "Error"  msgstr "Erreur" @@ -858,7 +936,11 @@ msgstr "Votre courriel"  msgid "Comments about your submission"  msgstr "Commentaires au sujet de votre proposition" -#: templates/chimere/edit.html:133 templates/chimere/edit_route.html:77 +#: templates/chimere/edit.html:134 +msgid "Upload in progress. Please wait..." +msgstr "Traitement en cours. Veuillez patienter..." + +#: templates/chimere/edit.html:152 templates/chimere/edit_route.html:77  msgid "Propose"  msgstr "Proposez" @@ -882,6 +964,54 @@ msgstr "Déposer un fichier"  msgid "Upload"  msgstr "Déposer" +#: templates/chimere/blocks/alternate_multimedia.html:33 +#: templates/chimere/blocks/alternate_multimedia.html:51 +msgid "Add" +msgstr "Ajouter" + +#: templates/chimere/blocks/alternate_multimedia.html:35 +msgid "Add multimedia from your computer or a website" +msgstr "Ajouter du multimedia depuis votre ordinateur ou un site web" + +#: 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 " +"vel odio porta vulputate." +msgstr "" + +#: templates/chimere/blocks/alternate_multimedia.html:44 +msgid "Audio, video, other..." +msgstr "Audio, vidéo, autre..." + +#: templates/chimere/blocks/alternate_multimedia.html:47 +msgid "Download" +msgstr "Téléchargement" + +#: templates/chimere/blocks/alternate_multimedia.html:48 +msgid "Or" +msgstr "Ou" + +#: templates/chimere/blocks/alternate_multimedia.html:49 +msgid "Web address" +msgstr "Adresse web" + +#: templates/chimere/blocks/alternate_multimedia.html:80 +msgid "You must provide a name." +msgstr "Vous devez donner un nom." + +#: templates/chimere/blocks/alternate_multimedia.html:85 +msgid "You must choose a media type." +msgstr "Voux devez choisir un type de média." + +#: templates/chimere/blocks/alternate_multimedia.html:91 +msgid "You must provide a file or a web address." +msgstr "Vous devez fournir un fichier ou une adresse web." + +#: templates/chimere/blocks/alternate_multimedia.html:96 +msgid "You must provide a web address." +msgstr "Voux devez donner une adresse web." +  #: templates/chimere/blocks/areas.html:4  msgid "Areas:"  msgstr "Zones :" @@ -913,7 +1043,39 @@ msgstr "Ce site utilise Chimère"  msgid "Map"  msgstr "Carte" -#: templates/chimere/blocks/map_params.html:6 +#: 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/map_params.html:8  msgid "Permalink"  msgstr "Lien permanent" @@ -923,6 +1085,43 @@ 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:47 +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:43 +msgid "Step" +msgstr "Étape" +  #: templates/chimere/blocks/submited.html:3  msgid ""  "Your new proposition/modification has been submited. A moderator will treat " @@ -951,10 +1150,6 @@ msgstr "Retourner à la carte"  msgid "Welcome"  msgstr "Accueil" -#: templates/chimere/blocks/welcome.html:47 -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" @@ -987,26 +1182,6 @@ msgstr "Choisir une zone pré-définie"  msgid "Or select the area by zooming and panning this map"  msgstr "Ou sélectionner une zone en zoomant et en se déplaçant sur cette carte" -#~ msgid "Submit a modification" -#~ msgstr "Proposer une modification" - -#~ msgid "Add/modify a site" -#~ msgstr "Ajouter ou modifier un site" - -#~ msgid "Categorys" -#~ msgstr "Catégories" - -#~ msgid "Theme" -#~ msgstr "Thème" - -#~ msgid "Subtheme" -#~ msgstr "Sous-thème" - -#~ msgid "Subthemes" -#~ msgstr "Sous-thèmes" - -#~ msgid "Themes" -#~ msgstr "Thèmes" - -#~ msgid "Site name" -#~ msgstr "Nom du site" +#: templatetags/chimere_tags.py:64 +msgid "Welcome to the %s" +msgstr "Bienvenue sur %s" diff --git a/chimere/migrations/0029_auto__add_propertymodelchoice.py b/chimere/migrations/0029_auto__add_propertymodelchoice.py new file mode 100644 index 0000000..b80129f --- /dev/null +++ b/chimere/migrations/0029_auto__add_propertymodelchoice.py @@ -0,0 +1,232 @@ +# -*- 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']) + + +    def backwards(self, orm): +        # Deleting model 'PropertyModelChoice' +        db.delete_table('chimere_propertymodelchoice') + + +    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.multimediafile': { +            'Meta': {'object_name': 'MultimediaFile'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), +            'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']"}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) +        }, +        'chimere.multimediatype': { +            'Meta': {'object_name': 'MultimediaType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) +        }, +        'chimere.news': { +            'Meta': {'object_name': 'News'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'content': ('django.db.models.fields.TextField', [], {}), +            'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) +        }, +        'chimere.picturefile': { +            'Meta': {'object_name': 'PictureFile'}, +            'height': ('django.db.models.fields.IntegerField', [], {}), +            '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'}), +            '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/0030_auto__add_multimediaextension.py b/chimere/migrations/0030_auto__add_multimediaextension.py new file mode 100644 index 0000000..47888c4 --- /dev/null +++ b/chimere/migrations/0030_auto__add_multimediaextension.py @@ -0,0 +1,237 @@ +# -*- 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 '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 model 'MultimediaExtension' +        db.delete_table('chimere_multimediaextension') + + +    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.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'}), +            '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/0029_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py b/chimere/migrations/0031_auto__add_field_subcategory_dated.py index 72d718c..5ebbecf 100644 --- a/chimere/migrations/0029_auto__add_field_marker_modified_since_import__add_field_marker_not_for.py +++ b/chimere/migrations/0031_auto__add_field_subcategory_dated.py @@ -8,39 +8,15 @@ 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', +        # 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 '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 field 'SubCategory.dated' +        db.delete_column('chimere_subcategory', 'dated')      models = { @@ -125,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']"}), @@ -138,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'}), @@ -196,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'}), @@ -206,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', [], {}), @@ -233,6 +218,7 @@ class Migration(SchemaMigration):              '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'}), 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/models.py b/chimere/models.py index dacbbcb..01d5f27 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -25,6 +25,7 @@ import simplejson as json  from lxml import etree  from PIL import Image  from subprocess import Popen, PIPE +from BeautifulSoup import BeautifulSoup  from django.conf import settings  from django.contrib.gis.db import models @@ -43,13 +44,64 @@ from chimere.widgets import PointField, RouteField, SelectMultipleField, \  from chimere.managers import BaseGeoManager  from chimere.utils import KMLManager, OSMManager, ShapefileManager +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)      def __unicode__(self):          ordering = ["-date"]          return self.title @@ -57,6 +109,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      """ @@ -153,10 +209,12 @@ class SubCategory(models.Model):      color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"),                                      blank=True, null=True)      order = models.IntegerField(_(u"Order")) +    dated = models.BooleanField(_(u"Is dated"), default=False)      TYPE = (('M', _(u'Marker')),              ('R', _(u'Route')),              ('B', _(u'Both')),)      item_type = models.CharField(_(u"Item type"), max_length=1, choices=TYPE) +    description = models.TextField(blank=True, null=True)      def __unicode__(self):          return u"%s / %s" % (self.category.name, self.name)      class Meta: @@ -194,6 +252,24 @@ class SubCategory(models.Model):          return [(category, sub_cats) for category, sub_cats \                                           in sub_categories.items()] +    @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 getJSON(self, categories_id=[]): +        '''Return a JSON string - mainly used to get description +        ''' +        items = {'id':self.pk, 'name':json.dumps(self.name), +                 'description':json.dumps(self.description) if self.description\ +                               else ''} +        json_string = u'{"pk": %(id)d, "name": %(name)s, '\ +            u'"description":%(description)s}' % items +        return json_string +  IMPORTERS = {'KML':KMLManager,               'OSM':OSMManager,               'SHP':ShapefileManager @@ -312,6 +388,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): @@ -356,6 +434,10 @@ class Marker(GeographicItem):          if settings.CHIMERE_DAYS_BEFORE_EVENT:              return self.start_date +    @property +    def short_desc(self): +        return shortify(self.description) +      class Meta:          ordering = ('status', 'name')          verbose_name = _(u"Point of interest") @@ -516,17 +598,30 @@ IFRAME_LINKS = {      'youtube':((re.compile(r'youtube.com\/watch\?v=([A-Za-z0-9_-]*)'),                  re.compile(r'youtu.be\/([A-Za-z0-9_-]*)'),                  re.compile(r'youtube.com\/embed\/([A-Za-z0-9_-]*)')), -                "http://www.youtube.com/embed/%s"), +                 "http://www.youtube.com/embed/%s"),      'dailymotion':(          (re.compile(r'dailymotion.com/video/([A-Za-z0-9]*)_[A-Za-z0-9_-]*'),           re.compile(r'dailymotion.com/embed/video/([A-Za-z0-9]*)'),           re.compile("http://www.dailymotion.com/embed/video/%s")), -         'http://www.dailymotion.com/embed/video/%s'), +          'http://www.dailymotion.com/embed/video/%s'),      'vimeo':((re.compile(r'vimeo.com/([A-Za-z0-9]*)'),                re.compile(r'vimeo.com/video/([A-Za-z0-9]*)')), -              "http://player.vimeo.com/video/%s") +               "http://player.vimeo.com/video/%s")  } +class MultimediaExtension(models.Model): +    name = models.CharField(_(u"Extension name"), max_length=6) +    multimedia_type = models.ForeignKey(MultimediaType, +                        verbose_name=_(u"Associated multimedia type"), +                        related_name='extensions') + +    class Meta: +        verbose_name = _(u"Multimedia extension") +        verbose_name_plural = _(u"Multimedia extensions") + +    def __unicode__(self): +        return self.name +  class MultimediaFile(models.Model):      name = models.CharField(_(u"Name"), max_length=150)      url = models.URLField(_(u"Url"), max_length=200) @@ -570,7 +665,6 @@ def multimediafile_post_save(sender, **kwargs):      multimediafile.save()  post_save.connect(multimediafile_post_save, sender=MultimediaFile) -  class PictureFile(models.Model):      name = models.CharField(_(u"Name"), max_length=150)      picture = models.ImageField(_(u"Image"), upload_to='pictures', @@ -602,7 +696,6 @@ def scale_image(max_x, pair):      new_y = (float(max_x) / x) * y      return (int(max_x), int(new_y)) -  IMAGE_EXIF_ORIENTATION_MAP = {      1: 0,      8: 2, @@ -1045,11 +1138,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 @@ -1067,6 +1164,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      ''' @@ -1075,7 +1185,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") @@ -1086,6 +1203,11 @@ class Property(models.Model):                  return datetime.date(*[int(val) for val in self.value.split('-')])              except:                  return "" +        if self.propertymodel.type == 'C': +            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..040a7be --- /dev/null +++ b/chimere/route.py @@ -0,0 +1,116 @@ +#!/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.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() +        ds = DataSource(tmp_dir + 'shortest-track.gpx') +        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/print.css b/chimere/static/chimere/css/print.css new file mode 100644 index 0000000..b6b4e68 --- /dev/null +++ b/chimere/static/chimere/css/print.css @@ -0,0 +1,36 @@ +#topbar, +#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; +} + + + diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index f8ed3fe..f3af02b 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,22 @@ 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{ +.action li.selected, #no-js-message, +#content .olControlLayerSwitcher .layersDiv, +#content .olControlLayerSwitcher span, +#chimere_itinerary td.l{      background-color:#449506;  } @@ -38,10 +50,11 @@ body, h2, h3, th,  }  fieldset, .action li, #content, -#map-footer, #panel, #areas, +#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;  } @@ -63,7 +76,7 @@ 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 +92,7 @@ div.warning,      opacity:0.9;  } -#panel, #areas, #detail, #category_detail{ +#panel, #areas, #detail, #category_description, #chimere_itinerary_panel{      opacity:0.8;  } @@ -102,7 +115,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 +166,6 @@ h3{  h4, caption{      font-weight:normal; -    font-style:italic;      margin:0;      text-align:left;  } @@ -174,6 +186,10 @@ fieldset{      margin-top:8px;  } +.hidden{ +    display:none; +} +  .ui-dialog-buttonset{      text-align:center;  } @@ -309,28 +325,33 @@ ul#action-2 {      max-width:280px;  } -ul#share{ +ul.share{      list-style-type:none;      margin:0;      padding:0; +    display:inline;  } -ul#share li{ +ul.share li{      display:inline;      line-height:22px;      vertical-align: bottom;  } -#share a{ +.share a{      text-decoration:None;  } -#share img{ +.share img{      border:None;      width:22px;      height:22px;  } +.share .share-icon img{ +    width:74px; +} +  .detail_footer{      text-align:center;      position:absolute; @@ -355,8 +376,6 @@ ul#share li{  #main-map{      position:absolute; -    margin:0px; -    padding:0px;      height:93%;      margin:0;      padding:0; @@ -409,12 +428,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;  } @@ -533,26 +650,18 @@ p.warning{  } -#welcome_button, +a#welcome_button, +a#routing_button,  #permalink{      display: block; -    text-align:center;      margin:0.3em;      padding:0.2em; -} - -a#welcome_button, -#permalink{ +    width:100%;      font-size:14px;      text-align:center;      text-decoration:none;  } -#welcome_button, -#permalink{ -    width:100%; -} -  /* forms */  table.inline-table{ @@ -595,6 +704,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; +}  /* openlayer customisation */  .olControlPermalink { 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/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/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 3f9d39d..4482879 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/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index fbb3ecd..68a621e 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,17 +79,28 @@ 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.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, +            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 @@ -119,6 +135,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 +160,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 +207,40 @@ 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; +                settings.icon_start = new OpenLayers.Icon( +                    STATIC_URL + "chimere/img/flag-start.png", +                    new OpenLayers.Size(32, 32), +                    new OpenLayers.Pixel(0, -32)); +                settings.icon_step = new OpenLayers.Icon( +                    STATIC_URL + "chimere/img/flag-step.png", +                    new OpenLayers.Size(32, 32), +                    new OpenLayers.Pixel(0, -32)); +                settings.icon_end = new OpenLayers.Icon( +                    STATIC_URL + "chimere/img/flag-finish.png", +                    new OpenLayers.Size(32, 32), +                    new OpenLayers.Pixel(0, -32)); +                $('#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.layerRoute.setOpacity(0.8); +                settings.layerRouteMarker = new OpenLayers.Layer.Markers( +                                                               'Route markers'); +                settings.map.addLayer(settings.layerRouteMarker); +                settings.layerRouteMarker.setOpacity(0.8); +            }              /* Vectors layer */              settings.layerVectors = new OpenLayers.Layer.Vector("Vector Layer");              settings.map.addLayer(settings.layerVectors); @@ -209,13 +282,10 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {              if (!settings.edition){                  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 +293,107 @@ 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(); +                } +            }          }, // end of init +        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); +        }, + +        // init the context menu +        zoomIn: function(){ +            methods.mapCenter(); +            settings.map.zoomIn(); +        }, + +        // zoom in from the map 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; +        }, + +        /* +        * Display menu on the map +        */ +        displayMapMenu: function(e) { +            if (methods.hidePopup()) 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          */ @@ -254,7 +423,6 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {                      }                  });          }, -          /*          * Update the categories div in ajax          */ @@ -289,7 +457,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 > label"); +                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){ @@ -297,6 +471,14 @@ 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 () { @@ -304,15 +486,37 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {                  * Add event listener in categories DOM elements                  */                  $('#categories #ul_categories > li > input').bind("click", function () { -                                    _toggle_subcategories($(this));methods.loadGeoObjects();settings.permalink.updateLink();}); +                    _toggle_subcategories($(this)); +                    methods.loadGeoObjects(); +                    settings.permalink.updateLink(); +                });                  $('.subcategories li input').bind("click", function () { -                                    methods.loadGeoObjects();_toggle_categories($(this));settings.permalink.updateLink();}); +                    if($(this).is(':checked')){ +                        var c_name = $(this).attr('name'); +                        methods.subcategory_detail( +                            c_name.substr(c_name.lastIndexOf("_")+1)); +                    } +                    methods.loadGeoObjects(); +                    _toggle_categories($(this)); +                    settings.permalink.updateLink(); +                });                  $('#display_submited_check').bind("click", function () { -                                                                methods.loadGeoObjects();settings.permalink.updateLink();}); +                    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").bind("click", function (e) { +                    var id = this.id.substr(this.id.lastIndexOf("_")+1); +                    methods.toggle_category(id); +                });              }              var _reCheckCategories = function (){                  /* recheck categories on init or when a redraw occurs */ @@ -353,7 +557,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {                                                                  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;              feature.data.popupContentHTML += "</div>"; @@ -363,7 +567,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {              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(); @@ -373,32 +577,49 @@ 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); @@ -417,9 +638,10 @@ 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); +                _repan_popup();                  methods.loadCategories();              }              return feature; @@ -448,6 +670,241 @@ 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'); +            } +        }, + +        // 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("#nominatim_start_label").attr('id', c_id+'_label' +                                                    ).html(''); +            cloned.children('label[for="id_start"]').html(step_label +                                                   ).attr('for', ""); +            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:radio[name=transport]:checked').val(); +            if(transport){ +                uri += transport + "/" +            } +            var speed = $('#id_speed option:selected').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(); +                        for (var i = 0; i < data.features.length; i++) { +                            settings.current_route_feature = +                                        methods.putRoute(data.features[i]); +                        } +                        settings.map.zoomToExtent( +                                settings.layerRoute.getDataExtent()); +                        settings.map.zoomOut(); +                        $('#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 (data) { +                        settings.layerRoute.removeAllFeatures(); +                    } +                }); + +        }, +        /* +        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 @@ -457,23 +914,23 @@ 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>");                              }                          } +                    }                     });          },          center_on_feature: function(feature) { @@ -497,20 +954,42 @@ 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(); +            if (settings.category_accordion){ +                $("#categories ul.subcategories").hide(); +                $("#categories img.toggle_category").attr("src", STATIC_URL + "chimere/img/plus.png"); +            }              // Put a minus image -            $("#categories img.toggle_category").attr("src", STATIC_URL + "chimere/img/plus.png");              if (!was_visible)              {                  // Show the subcategories @@ -519,6 +998,12 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {                  $("#maincategory_img_" + id).attr("src", STATIC_URL + "chimere/img/minus.png");                  settings.current_category = id;              } +            if (!settings.category_accordion && was_visible) +            { +                $("#maincategory_" + id).toggle(); +                // Put a minus image +                $("#maincategory_img_" + id).attr("src", STATIC_URL + "chimere/img/plus.png"); +            }          },          zoomToCurrentExtent: function(){              /* zoom to current extent */ @@ -550,17 +1035,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(); @@ -568,6 +1049,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(); @@ -629,13 +1132,16 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {              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(); +                        return true; +                    }                  }              } +            return false;          },          saveExtent: function(){              var extent_key = 'MAP_EXTENT'; @@ -770,8 +1276,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) { diff --git a/chimere/static/chimere/js/nominatim-widget.js b/chimere/static/chimere/js/nominatim-widget.js new file mode 100644 index 0000000..80aa03a --- /dev/null +++ b/chimere/static/chimere/js/nominatim-widget.js @@ -0,0 +1,45 @@ +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..043c957 --- /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").append(detached_speeds[i]); +        } +        detached_speeds = Array(); +        $("#id_speed option").each(function(){ +            if(!$(this).val().match(transport) && $(this).val()){ +                detached_speeds.push($(this).detach()); +            } +        }); +        $('#id_speed').val(''); +        if($("#id_speed option").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/templates/base.html b/chimere/templates/base.html index 2a50fc3..149cc71 100644 --- a/chimere/templates/base.html +++ b/chimere/templates/base.html @@ -7,25 +7,25 @@      {% 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 709ff9c..e4d514a 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 new file mode 100644 index 0000000..ccee804 --- /dev/null +++ b/chimere/templates/chimere/blocks/alternate_multimedia.html @@ -0,0 +1,151 @@ +{% load i18n %} +    <div id='multimedia_list'> +    {% for formset in formsets %} +        {{ formset.management_form }} +        {% if formset.errors %}<div class='errors'> +        {% for dict in formset.errors %} +            {% for error in dict.values %} +                {{ error }} +            {% endfor %} +        {% endfor %} +        </div>{% endif %} +    {% endfor %} +        <ul id='multimedia_list_content'> +    {% for formset in formsets %} +        {% for frm in formset%} +            {% if not forloop.last %} +            <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.value }}</span> +                <img class='remove-media' src='{{STATIC_URL}}chimere/img/close.png'/> +            {% endif %} +                <span class='hidden'>{{field}}</span> +            {% endfor %} +            </li> +            {% endif %} +        {% endfor %} +    {% endfor %} +        </ul> +        <button id='add_multimedia_list'>{% trans "Add" %}</button> +    </div> +    <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"> +            <label for="multimedia_name">{% trans "Name" %}</label> +            <input type='text' id='multimedia_name' name='multimedia_name'> +        </div> +        <div class="fieldWrapper"> +        <input type='radio' value='image' id='media_type_image' name="multimedia_type"> {% trans "Image" %} +        <input type='radio' value='other' id='media_type_other' name="multimedia_type"> {% trans "Audio, video, other..." %} +        </div> +        <div class="fieldWrapper"> +        <label id="multimedia_file_label">{% trans "Download"%}</label> <input type='file' name='picture-0-picture' id='picture-0-picture' class='multimedia_file'> +        <p class='notice'>{% trans "Or" %}</p> +        <label for='multimedia_url'>{% trans "Web address"%}</label> <input type='text' name='multimedia_url' id='multimedia_url'> +        </div> +        <button id='add_media'>{% trans "Add" %}</button> +    </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, +                                          modal:true, +                                          resizable:false, +                                          width:400, +                                          height:250}); +            $('#add_multimedia_list').click(function(){ +                $("#multimedia_form").dialog("open"); +                return false; +            }); +            $('#media_type_image').click(function(){ +                $("#multimedia_file_label").removeClass('disabled'); +                $("#multimedia_file").removeAttr('disabled'); +            }); +            $('#media_type_other').click(function(){ +                $("#multimedia_file_label").addClass('disabled'); +                $("#multimedia_file").attr('disabled', 'disabled'); +            }); +            $('#add_media').click(function(){ +                // test the validity +                if (!$('#multimedia_name').val()){ +                    alert("{% trans "You must provide a name." %}") +                    return false; +                } +                if (!$('#media_type_image:checked').val() &&  +                        !$('#media_type_other:checked').val()){ +                    alert("{% trans "You must choose a media type." %}") +                    return false; +                } +                if ($('#media_type_image:checked').val() +                        && !$("#picture-"+current_image_number+"-picture").val() +                        && !$("#multimedia_url").val()){ +                    alert("{% trans "You must provide a file or a web address." %}") +                    return false; +                } +                if ($('#media_type_other:checked').val() +                        && !$("#multimedia_url").val()){ +                    alert("{% trans "You must provide a web address." %}") +                    return false; +                } +                // recopy field in the main form +                var prefix = ''; +                var contener = $("#multimedia_list_content") +                content = '<li'; +                if ($('#media_type_image:checked').val()){ +                    content += ' class="picture">'; +                    prefix = 'picture-' + current_image_number; +                } else { +                    content += ' class="multimedia">'; +                    prefix = 'multimedia-' + current_multi_number; +                    content += '<input type="hidden" name="'+prefix+'-multimedia_type" value="{{auto_type_id}}" />\n'; +                    content += '<input type="hidden" name="'+prefix+'-url" value="'+$("#multimedia_url").val()+'" />\n'; +                } +                content += '<input type="hidden" name="'+prefix+'-id"/>\n'; +                content += '<input type="hidden" name="'+prefix+'-miniature" value="1"/>\n'; +                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 += '</li>'; +                contener.append(content); +                if ($('#media_type_image:checked').val() +                        && $("#picture-"+current_image_number+"-picture").val()){ +                    // 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); +                    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(); +                }); +                return false; +            }); +        }); +    </script> + diff --git a/chimere/templates/chimere/blocks/categories.html b/chimere/templates/chimere/blocks/categories.html index 5ba89fc..9c5ffd6 100644 --- a/chimere/templates/chimere/blocks/categories.html +++ b/chimere/templates/chimere/blocks/categories.html @@ -1,29 +1,29 @@  {% load i18n %} -<ul id='ul_categories'> -    {% for category, lst_sub_categories in sub_categories %} -    <li> -        <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}}'> -                <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}}'/> -                    {% trans sub_category.name %} -                </label> -                <img id="zoom_to_subcategory_{{sub_category.id}}" class="zoom_image zoom_to_subcategory" alt='{% trans "Zoom to" %} {{sub_category.name}}' src='{{ STATIC_URL }}chimere/img/zoom.png' /> -            </li> -            {% endfor %} -            {% if category.description %} -                <li><a href="#" onclick="$('#map').chimere('category_detail', {{category.id}});">{% trans "Tell me more..." %}</a></li> -            {% endif %} -        </ul> -    </li> -    {% endfor %} -    <li id='display_submited'> -        <input type='checkbox' name='display_submited' id='display_submited_check'/> {% trans "Display markers and routes waiting for validation"%} -    </li> -</ul> +    <ul id='ul_categories'> +        {% for category, lst_sub_categories in sub_categories %} +        <li> +            <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}}'> +                    <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}}'/> +                        {% trans sub_category.name %} +                    </label> +                    <img id="zoom_to_subcategory_{{sub_category.id}}" class="zoom_image zoom_to_subcategory" alt='{% trans "Zoom to" %} {{sub_category.name}}' src='{{ STATIC_URL }}chimere/img/zoom.png' /> +                </li> +                {% endfor %} +                {% if category.description %} +                    <li><a href="#" onclick="$('#map').chimere('category_detail', {{category.id}});">{% trans "Tell me more..." %}</a></li> +                {% endif %} +            </ul> +        </li> +        {% endfor %} +        <li id='display_submited'> +            <input type='checkbox' name='display_submited' id='display_submited_check'/> {% trans "Display markers and routes waiting for validation"%} +        </li> +    </ul> diff --git a/chimere/templates/chimere/blocks/head_chimere.html b/chimere/templates/chimere/blocks/head_chimere.html index 4031ac4..29a1be4 100644 --- a/chimere/templates/chimere/blocks/head_chimere.html +++ b/chimere/templates/chimere/blocks/head_chimere.html @@ -2,6 +2,7 @@  <link rel="stylesheet" href="{{ css_url }}" />{% endfor %}  {% for js_url in OSM_JS_URLS %}  <script src="{{ js_url }}"></script>{% endfor %} +{% if routing %}<script src="{{ STATIC_URL }}chimere/js/routing-widget.js"></script>{% endif %}  <script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js"></script>  <script type="text/javascript">      /* Global variables */ @@ -23,6 +24,7 @@      var area_name = '{{ area_name }}';{% endif %}      $(function() {$( ".draggable" ).draggable({handle:"h2"});}); +    var get_share_url = '{% url chimere:get-share-url %}';  </script>  <style>  .olControlPanPanel div { diff --git a/chimere/templates/chimere/blocks/head_form.html b/chimere/templates/chimere/blocks/head_form.html new file mode 100644 index 0000000..2485c1a --- /dev/null +++ b/chimere/templates/chimere/blocks/head_form.html @@ -0,0 +1,2 @@ + +<script src="{{ TINYMCE_URL }}tiny_mce.js"></script> 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/map_params.html b/chimere/templates/chimere/blocks/map_params.html index 57ced90..2247c06 100644 --- a/chimere/templates/chimere/blocks/map_params.html +++ b/chimere/templates/chimere/blocks/map_params.html @@ -7,6 +7,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}}); @@ -14,6 +15,11 @@      {% 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 }}; diff --git a/chimere/templates/chimere/blocks/multimedia_file.html b/chimere/templates/chimere/blocks/multimedia_file.html index a1e9868..d659348 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 alt="{{multimedia_item.name}}" src='{{multimedia_item.thumbnailfile.url}}'/></a>{% endif %} +<a rel="prettyPhoto" href='{{multimedia_item.picture.url}}' ><img class='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..15aee04 --- /dev/null +++ b/chimere/templates/chimere/blocks/routing.html @@ -0,0 +1,45 @@ +{% 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'> +step_label = "{% trans "Step" %}"; +</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 95e6a70..94270cb 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -25,20 +25,14 @@      {% if marker.multimedia_items %}      <a href='#' id='show_gallery_link'>{% trans "Show multimedia gallery" %}</a>      {% endif %} -    </div>{% 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 id='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 %} +    </div> +    {% share_bar marker.name %} +    <a href="{{modif_by_email}}">{% trans "Propose a modification" %}</a>      {% comment %}      <a href='{% if marker.route %}{% url chimere:editroute-item area_name_slash|default_if_none:"" marker.route.pk "" %}{%else%}{% url chimere:edit-item area_name_slash|default_if_none:"" marker.pk "" %}{%endif%}'>          {% trans "Submit a modification" %}      </a>      {% endcomment %} -{% endif %}  </div>  {% if marker.multimedia_items %}  <div id='gallery-{{marker.pk}}' class='gallery'> diff --git a/chimere/templates/chimere/edit.html b/chimere/templates/chimere/edit.html index 66862cd..867437e 100644 --- a/chimere/templates/chimere/edit.html +++ b/chimere/templates/chimere/edit.html @@ -139,7 +139,8 @@                   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 5a49e46..a0ecffc 100644 --- a/chimere/templates/chimere/main_map.html +++ b/chimere/templates/chimere/main_map.html @@ -18,15 +18,22 @@          </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>      </div>      <div id='detail' class='ui-widget ui-corner-all'></div> -    <div id='category_detail'></div>  {% endblock %}  {% block content %}      {{block.super}} @@ -34,6 +41,7 @@  <script type="text/javascript">     $("#main-map").show();  </script> +    {% map_menu %}      {% map_params %}  {% endblock %}  {% block footer %} diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index 46fb422..f2221b2 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -9,8 +9,11 @@ from django import template  from django.conf import settings  from django.core.exceptions import ObjectDoesNotExist  from django.core.urlresolvers import reverse +from django.db.models import Q +from django.template import defaultfilters +from django.utils.translation import ugettext as _ -from chimere.models import Marker, Area, News, SubCategory +from chimere.models import Marker, Area, News, SubCategory, MultimediaType  from chimere.widgets import get_map_layers  log = getLogger(__name__) @@ -37,22 +40,29 @@ 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. -    """ -    context_data = {'display':display} +def get_news():      # Retrieve news -    news = list(News.objects.filter(available=True)) +    news = list(News.objects.filter(available=True, is_front_page=True))      if settings.CHIMERE_DAYS_BEFORE_EVENT:          # Retrieve active markers          today = date.today()          after = today + timedelta(settings.CHIMERE_DAYS_BEFORE_EVENT) -        news += list(Marker.objects.filter(status='A', end_date__gte=today, -                     start_date__lte=after)) +        q = Q(end_date__gte=today) | Q(end_date__isnull=True) +        news += list(Marker.objects.filter(status='A', +                     start_date__lte=after, is_front_page=True).filter(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} +    context_data['news_lst'] = get_news()[:3] +    context_data['STATIC_URL'] = settings.STATIC_URL +    context_data['title'] = title if title \ +                            else _(u"Welcome to the %s") % settings.PROJECT_NAME      if "area_name" in context:          try:              area = Area.objects.get(urn=context["area_name"]) @@ -62,6 +72,15 @@ def display_news(context, display=False):              pass      return context_data +@register.inclusion_tag('chimere/blocks/news.html', takes_context=True) +def display_news(context, title=''): +    """ +    All news. +    """ +    context_data = {'news_lst': get_news(), +                    'STATIC_URL':settings.STATIC_URL} +    return context_data +  @register.inclusion_tag('chimere/blocks/head_jquery.html', takes_context=True)  def head_jquery(context):      """ @@ -108,16 +127,42 @@ 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']} +    context_data['STATIC_URL'] = settings.STATIC_URL +    return context_data +  @register.inclusion_tag('chimere/blocks/map_params.html', takes_context=True)  def map_params(context):      context_data =  {} +    context_data['STATIC_URL'] = settings.STATIC_URL      context_data['icon_offset_x'] = settings.CHIMERE_ICON_OFFSET_X      context_data['icon_offset_y'] = settings.CHIMERE_ICON_OFFSET_Y      context_data['icon_width'] = settings.CHIMERE_ICON_WIDTH      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) @@ -176,7 +221,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: @@ -193,9 +239,24 @@ def multimedia_render(context, multimedia_file):      context['multimedia_item'] = multimedia_file      return context +@register.inclusion_tag('chimere/blocks/alternate_multimedia.html') +def alternate_multimedia(formset_multi, formset_picture): +    return {'formsets':[formset_multi, formset_picture], +            "STATIC_URL": settings.STATIC_URL, +            'auto_type_id':MultimediaType.objects.get(name='auto').pk} +  @register.simple_tag  def get_tinyfied_url(marker, area_name=''):      if not marker or not hasattr(marker, 'get_absolute_url'):          return ""      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=''): +    context['STATIC_URL'] = settings.STATIC_URL +    context['name'] = name +    context['share_networks'] = [(defaultfilters.slugify(name), url, icon) +                for name, url, icon in settings.CHIMERE_SHARE_NETWORKS] +    return context diff --git a/chimere/urls.py b/chimere/urls.py index a232382..d6ef9b9 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,18 @@ 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_-]+/)?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/views.py b/chimere/views.py index eeacd81..fd8f927 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -26,6 +26,7 @@ Views of the project  import datetime  from itertools import groupby +import simplejson  from django.conf import settings  from django.core import serializers @@ -34,20 +35,22 @@ 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.template import loader, RequestContext, defaultfilters  from django.utils import simplejson  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, \ +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,6 +104,31 @@ def get_base_response(area_name=""):      base_response_dct['JQUERY_CSS_URLS'] = settings.JQUERY_CSS_URLS      return base_response_dct, None +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):      """      Main page @@ -121,15 +149,21 @@ 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.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' @@ -260,7 +294,7 @@ def edit(request, area_name="", item_id=None, submited=False):      filtered_properties = PropertyModel.objects.filter(available=True,                                  subcategories__id__isnull=False).all()      response_dct.update({ -        'actions':actions, +        'actions':actions(response_dct['area_name']),          'action_selected':('contribute', 'edit'),          'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,          'form':form, @@ -365,7 +399,7 @@ def editRoute(request, area_name="", item_id=None, submited=False):      if 'description' in declared_fields:          declared_fields.pop(declared_fields.index('description'))      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, @@ -392,12 +426,20 @@ def welcome(request, display=None):      Welcome string      """      response_dct = {'display':display} -    news = list(News.objects.filter(available=True).all()) +    news = list(News.objects.filter(available=True, is_front_page=True).all())      if settings.CHIMERE_DAYS_BEFORE_EVENT: -        q = checkDate(Q(status='A', start_date__isnull=False)) +        q = checkDate(Q(status='A', start_date__isnull=False, +                        is_front_page=True))          news += list(Marker.objects.filter(q).all()) -    news.sort(key=lambda x:x.date, reverse=True) +    news.sort(key=lambda x:x.date, reverse=True)[:3]      response_dct['news_lst'] = news +    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      return loader.render_to_string('chimere/blocks/welcome.html', response_dct,                                         context_instance=RequestContext(request)) @@ -408,7 +450,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)) @@ -419,7 +462,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)) @@ -447,11 +491,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 @@ -468,15 +533,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'] = ";".join(getStaffEmails()) +    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      response_dct['dated'] = settings.CHIMERE_DAYS_BEFORE_EVENT \                              and marker.start_date      return render_to_response('chimere/detail.html', response_dct, @@ -598,6 +662,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 @@ -637,6 +711,31 @@ 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 = simplejson.JSONEncoder() +    total = jsonencoder.encode(total) +    desc = jsonencoder.encode(desc) +    data = '{"properties":{"total":%s, "description":%s}, '\ +           '"type": "FeatureCollection", "features":[%s]}' % (total, desc, +                                                              ",".join(jsons)) +    return HttpResponse(data) +  def rss(request, area_name=''):      '''      Redirect to RSS subscription page @@ -644,7 +743,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 ce848ea..c0f08c7 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -26,6 +26,9 @@ from django.core.exceptions import ObjectDoesNotExist  from django.conf import settings  from django.contrib.gis.db import models  from django.contrib.gis.geos import fromstr +from django.utils.html import conditional_escape +from django.forms.widgets import RadioInput, RadioFieldRenderer +from django.utils.encoding import force_unicode  from django.utils.safestring import mark_safe  from django.utils.translation import ugettext as _ @@ -100,13 +103,48 @@ 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 TextareaWidget(forms.Textarea):      """      Manage the edition of a text using TinyMCE      """      class Media: -        js = ["%stiny_mce.js" % settings.TINYMCE_URL, -              "%schimere/js/textareas.js" % settings.STATIC_URL,] +        js = ["%stiny_mce.js" % settings.TINYMCE_URL] +      def render(self, *args, **kwargs):          if 'attrs' not in kwargs:              kwargs['attrs'] = {} @@ -116,6 +154,45 @@ class TextareaWidget(forms.Textarea):              kwargs['attrs']['class'] += ' '          kwargs['attrs']['class'] += 'mceEditor'          rendered = super(TextareaWidget, self).render(*args, **kwargs) +        rendered += u"""<script type='text/javascript'> +tinyMCE.init({ +    mode : "textareas", +    theme : "advanced", +    relative_urls : false, +    editor_selector : "mceEditor", +    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,bullist,numlist,separator,hr,separator,link", +    theme_advanced_buttons2 : "", +    theme_advanced_buttons3 : "" +}); +</script> +""" +        return mark_safe(rendered) + +class FullTextareaWidget(forms.Textarea): +    """ +    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 DatePickerWidget(forms.TextInput): @@ -131,6 +208,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 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 6aaa577..372f1e6 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/' @@ -72,10 +74,37 @@ CHIMERE_OSM_PASSWORD = 'test'  # 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/', +} + +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 = ( | 
