diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-03-18 20:03:26 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-03-18 20:03:26 +0100 |
commit | 64956fbaf18a8e687d8f0fffc79889a277f42fcd (patch) | |
tree | e4c92902db6e39eb1bb458eb04e148035f450d82 | |
parent | 318bfc901e262a8d35323f42eb71b364497dc27c (diff) | |
download | Chimère-64956fbaf18a8e687d8f0fffc79889a277f42fcd.tar.bz2 Chimère-64956fbaf18a8e687d8f0fffc79889a277f42fcd.zip |
Better management of extra pages
-rw-r--r-- | chimere/actions.py | 18 | ||||
-rw-r--r-- | chimere/admin.py | 10 | ||||
-rw-r--r-- | chimere/forms.py | 7 | ||||
-rw-r--r-- | chimere/migrations/0017_auto_20180318_1958.py | 85 | ||||
-rw-r--r-- | chimere/models.py | 39 | ||||
-rw-r--r-- | chimere/static/chimere/css/styles.css | 56 | ||||
-rw-r--r-- | chimere/templates/chimere/base.html | 3 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/actions.html | 37 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/page_title.html | 5 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 5 | ||||
-rw-r--r-- | chimere/urls_chimere.py | 2 | ||||
-rw-r--r-- | chimere/views.py | 7 |
12 files changed, 200 insertions, 74 deletions
diff --git a/chimere/actions.py b/chimere/actions.py index f965e9b..27614a1 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -22,9 +22,10 @@ Actions available in the main interface """ from django.conf import settings from django.core.urlresolvers import reverse, NoReverseMatch +from django.http import Http404 from django.utils.translation import ugettext_lazy as _ -from chimere.models import Page, Area +from chimere.models import Page, Area, AreaPages class Action: @@ -79,6 +80,8 @@ def actions(area_name=''): (Action('categories', 'chimere:category-directory', _('Directory')), []) ) + else: + raise Http404 real_acts = [] for act, childs in acts: @@ -99,9 +102,20 @@ def actions(area_name=''): for child_act in real_childs: child_act.update_url(area_name) real_acts.append((act, real_childs)) - for page in Page.objects.filter(available=True).order_by('order'): + for page in Page.objects.filter(areas__urn=area.urn, available=True): act = Action(page.mnemonic, 'chimere:extra_page', page.title, [page.mnemonic]) act.update_url(area_name) real_acts.append((act, [])) return real_acts + + +def get_extra_pages(area): + if not area: + return [] + extra_pages = [] + for area_page in AreaPages.objects.filter( + area__urn=area.urn, page__available=True).order_by('order').all(): + extra_pages.append(area_page.page) + return extra_pages + diff --git a/chimere/admin.py b/chimere/admin.py index 04a438a..c3b588a 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -50,7 +50,8 @@ from chimere.models import Category, Icon, SubCategory, Marker, \ PropertyModel, News, Route, Area, ColorTheme, Color, \ MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ PropertyModelChoice, Page, get_areas_for_user, Overlay, \ - ImporterKeyCategories, SubCategoryUserLimit, AreaOverlays, RouteFile + ImporterKeyCategories, SubCategoryUserLimit, AreaOverlays, RouteFile, \ + AreaPages from chimere.utils import ShapefileManager, KMLManager, CSVManager @@ -487,6 +488,11 @@ class PolygonAdmin(MarkerAdmin): models.Polygon.objects.filter(pk=item_id)) +class PageInline(admin.TabularInline): + model = AreaPages + extra = 1 + + class LayerInline(admin.TabularInline): model = AreaLayers extra = 1 @@ -503,7 +509,7 @@ class AreaAdmin(admin.ModelAdmin): """ form = AreaAdminForm exclude = ['upper_left_corner', 'lower_right_corner'] - inlines = [LayerInline, OverlayInline] + inlines = [LayerInline, OverlayInline, PageInline] list_display = ['name', 'order', 'available', 'default'] diff --git a/chimere/forms.py b/chimere/forms.py index 54dfd43..1e1397e 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -162,11 +162,14 @@ class PageAdminForm(forms.ModelForm): """ Main form for extra pages """ - content = forms.CharField(widget=FullTextareaWidget) + content = forms.CharField( + widget=FullTextareaWidget, required=False, + help_text=Page._meta.get_field('content').help_text + ) class Meta: model = Page - exclude = [] + exclude = ['template_path'] class OSMForm(forms.Form): diff --git a/chimere/migrations/0017_auto_20180318_1958.py b/chimere/migrations/0017_auto_20180318_1958.py new file mode 100644 index 0000000..b46fb43 --- /dev/null +++ b/chimere/migrations/0017_auto_20180318_1958.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2018-03-18 19:58 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('chimere', '0016_aggregated_delete_rules'), + ] + + operations = [ + migrations.CreateModel( + name='AreaPages', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.IntegerField(verbose_name='Order')), + ], + options={ + 'verbose_name_plural': 'Areas - Pages', + 'ordering': ('order',), + 'verbose_name': 'Area - Page', + }, + ), + migrations.AlterModelOptions( + name='page', + options={'verbose_name': 'Page', 'verbose_name_plural': 'Page'}, + ), + migrations.AlterModelOptions( + name='picturefile', + options={'ordering': ['order'], 'verbose_name': 'Picture file', 'verbose_name_plural': 'Picture files'}, + ), + migrations.RemoveField( + model_name='page', + name='order', + ), + migrations.AddField( + model_name='area', + name='logo', + field=models.ImageField(blank=True, null=True, upload_to='maps', verbose_name='Logo'), + ), + migrations.AddField( + model_name='page', + name='image', + field=models.ImageField(blank=True, help_text='If an image is provided, this image replace the title onthe menu', null=True, upload_to='maps', verbose_name='Image'), + ), + migrations.AddField( + model_name='page', + name='url', + field=models.URLField(blank=True, help_text='Target to an external link (do not fill content if you want to point to an external link)', null=True, verbose_name='Url'), + ), + migrations.AlterField( + model_name='area', + name='favicon', + field=models.ImageField(blank=True, null=True, upload_to='maps', verbose_name='Favicon'), + ), + migrations.AlterField( + model_name='page', + name='content', + field=models.TextField(blank=True, help_text='Content of the page (do not fill external link if you want to display this content.', null=True, verbose_name='Content'), + ), + migrations.AlterField( + model_name='page', + name='mnemonic', + field=models.CharField(blank=True, max_length=150, null=True, verbose_name='Mnemonic'), + ), + migrations.AddField( + model_name='areapages', + name='area', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='chimere.Area'), + ), + migrations.AddField( + model_name='areapages', + name='page', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='chimere.Page'), + ), + migrations.AddField( + model_name='area', + name='pages', + field=models.ManyToManyField(blank=True, related_name='areas', through='chimere.AreaPages', to='chimere.Page'), + ), + ] diff --git a/chimere/models.py b/chimere/models.py index 8ce88ef..80bf0f3 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -42,7 +42,7 @@ from django.contrib.postgres.search import SearchVectorField, SearchVector, \ SearchQuery from django.core.files import File from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, NoReverseMatch from django.db.models import Q, Count from django.db.models.signals import post_save, pre_save from django.template import defaultfilters @@ -58,16 +58,25 @@ class Page(models.Model): """Simple extra pages """ title = models.CharField(_("Name"), max_length=150) - mnemonic = models.CharField(_("Mnemonic"), max_length=10, blank=True, + image = models.ImageField( + _("Image"), blank=True, null=True, upload_to='maps', + help_text=_("If an image is provided, this image replace the title on" + "the menu")) + mnemonic = models.CharField(_("Mnemonic"), max_length=150, blank=True, null=True) available = models.BooleanField(_("Available"), default=True) - order = models.IntegerField(_("Order"), default=10, blank=True, null=True) template_path = models.CharField(_("Template path"), max_length=150, blank=True, null=True) - content = models.TextField(blank=True, null=True) + url = models.URLField(_("Url"), blank=True, null=True, + help_text=_("Target to an external link (do not fill " + "content if you want to point to an " + "external link)")) + content = models.TextField( + _("Content"), blank=True, null=True, + help_text=_("Content of the page (do not fill external link if you " + "want to display this content.")) class Meta: - ordering = ["order"] verbose_name = _("Page") verbose_name_plural = _("Page") @@ -2009,9 +2018,10 @@ class Area(models.Model, SimpleArea): show_directory = models.BooleanField( _("Show directory"), default=True ) - # logo = models.ImageField(_("Logo"), upload_to='logos', blank=True, - # null=True) - favicon = models.ImageField(_(u"Favicon"), blank=True, null=True) + favicon = models.ImageField(_(u"Favicon"), upload_to='maps', blank=True, + null=True) + logo = models.ImageField(_("Logo"), upload_to='maps', blank=True, + null=True) upper_left_corner = models.PointField( _("Upper left corner"), default='POINT(0 0)', srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) @@ -2024,6 +2034,8 @@ class Area(models.Model, SimpleArea): through='AreaLayers', blank=True) overlays = models.ManyToManyField(Overlay, related_name='overlays', through='AreaOverlays', blank=True) + pages = models.ManyToManyField(Page, related_name='areas', + through='AreaPages', blank=True) default_subcategories = models.ManyToManyField( SubCategory, blank=True, verbose_name=_("Sub-categories checked by default")) @@ -2240,6 +2252,17 @@ class AreaOverlays(models.Model): verbose_name_plural = _("Areas - Overlays") +class AreaPages(models.Model): + area = models.ForeignKey(Area) + page = models.ForeignKey(Page) + order = models.IntegerField(_("Order")) + + class Meta: + ordering = ('order',) + verbose_name = _("Area - Page") + verbose_name_plural = _("Areas - Pages") + + slug_help = _(u"The slug is the standardized version of the name. It contains " u"only lowercase letters, numbers and hyphens. Each slug must " u"be unique.") diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 0c424b9..0fd3891 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -223,7 +223,7 @@ h2, h3{ #detail_footer, #areas, #detail, #main-map, div.warning, #content, .action li.selected, #content .olControlLayerSwitcher .layersDiv, #panel, #map-footer, #utils-div, #action, #panel #categories, .main_category, -#page_title, #ul_categories .subcategories li, #action-panel, +#ul_categories .subcategories li, #action-panel, ul.ui-autocomplete.ui-menu.ui-corner-all.ui-widget-content, .extra-criteria, #chimere_itinerary_form, .welcome-logo, #permalink, #footer-panel{ border-color:#999; @@ -372,16 +372,8 @@ a[disabled] { color: #ccc; } -#page_title{ - position:absolute; - top:6px; - right:20px; - font-weight:bold; - font-size:30px; - color:#fff; -} - #topbar{ + font-family: 'Open Sans Condensed', sans-serif; height: 35px; z-index: 10; position: absolute; @@ -389,16 +381,27 @@ a[disabled] { padding:0; background-color: #fff; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.3); - padding-left: 300px; +} + +#topbar img{ + height: 28px; + vertical-align: top; +} + +#top-menu-first{ + position: absolute; + width: 300px; + font-size: 1.4em; + padding: 0.15em 0.4em; } #top-menu{ text-transform: uppercase; - padding: 3px + padding: 3px; + padding-left: 300px; } #top-menu .action{ - font-family: 'Open Sans Condensed', sans-serif; font-size: 1.4em; } @@ -2765,33 +2768,6 @@ a#ui-active-menuitem.ui-state-hover{ padding:0; } -#page_title{ - top:0; - right:0; - padding:0 30px; - position:relative; - border-bottom-width:1px; - border-bottom-style:solid; - background-color:#fff; - display:none; -} - -#page_title h1{ - text-align:right; - padding:0; - margin:0; - font-size:40px; - font-style:italic; -} - -#page_title h2{ - text-align:right; - padding:0; - margin:0; - font-style:italic; - background-color:#fff; -} - #header{ padding:0; margin:0; diff --git a/chimere/templates/chimere/base.html b/chimere/templates/chimere/base.html index ece8b9d..4ac8c97 100644 --- a/chimere/templates/chimere/base.html +++ b/chimere/templates/chimere/base.html @@ -30,9 +30,6 @@ <p id='no-js' class='warning'>{% trans "You must enable JavaScript in your browser to display Chimère."%}</p> </div> </noscript> - {% block page_title %} - {% include "chimere/blocks/page_title.html" %} - {% endblock %} {% block actions %} {% include "chimere/blocks/actions.html" %} {% endblock %} diff --git a/chimere/templates/chimere/blocks/actions.html b/chimere/templates/chimere/blocks/actions.html index 2b098c8..3001f41 100644 --- a/chimere/templates/chimere/blocks/actions.html +++ b/chimere/templates/chimere/blocks/actions.html @@ -1,25 +1,48 @@ -{% load i18n chimere_tags %} +{% load i18n chimere_tags bootstrap %} <div id="topbar"> + <div id="top-menu-first"> + <a href="{% url 'index' area.urn %}"> + {% if area.logo %} + <img src="{{area.logo.url}}"> + {% else %} + {{area.name}} + {% endif %} + </a> + </div> <div id="top-menu" class="row"> <div class="col-md-2 action"> <a href="{% url 'index' area_name %}"> {% trans "Map" %} </a> </div> + {% if area.show_directory %} <div class="col-md-2 action"> <a href="{% url 'chimere:category-directory' area_name %}"> {% trans "Directory" %} </a> </div> + {% endif %} + <div class="col-md-{%if not extra_pages %}6{% elif extra_pages|length < 3 %}4{% else %}6{% endif %}"> + <div id='search-box'></div> + </div> {% for page in extra_pages %} - <div class="col-md-2 action"> - <a href='{{page.url}}'> - {{page.name}} + <div class="col-md-{% if page.image %}1{% else%}2{% endif %} action"> + {% if page.url %} + <a href='{{page.url}}' target="_blank"> + {% else %} + <a href='#' + onclick="$('#{{page.mnemonic}}').modal('show');return false;"> + {% endif %} + {% if page.image %} + <img src="{{page.image.url}}"> + {% else %} + {{page.title}} + {% endif %} </a> </div> {% endfor %} - <div class="col-md-6"> - <div id='search-box'></div> - </div> </div> </div> +{% for page in extra_pages %}{% if not page.url %} +{% bootstrap_modal page.mnemonic page.title page.content|safe %} +{% endif %}{% endfor %} diff --git a/chimere/templates/chimere/blocks/page_title.html b/chimere/templates/chimere/blocks/page_title.html deleted file mode 100644 index f068b97..0000000 --- a/chimere/templates/chimere/blocks/page_title.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load i18n %} - <div id='page_title'> - <h1>Carte OuVerte</h1> - <h2>du plateau de saclay</h2> - </div> diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index 9f83da1..89ced3f 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -390,3 +390,8 @@ def ol_map(item, arg='map_id'): @register.filter(name='is_in') def is_in(item, include=''): return item in include.split(";") + + +@register.filter(name='length') +def length(item): + return len(item) diff --git a/chimere/urls_chimere.py b/chimere/urls_chimere.py index c888efa..436b991 100644 --- a/chimere/urls_chimere.py +++ b/chimere/urls_chimere.py @@ -94,7 +94,7 @@ else: ] urlpatterns += [ - url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?dyn/(?P<page_id>\w+)/$', + url(r'^(?:(?P<area_name>[a-zA-Z0-9_-]+)/)?dyn/(?P<page_id>[a-zA-Z0-9_-]+)/$', views.extraPage, name='extra_page'), url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?contact/?$', views.contactus, name="contact"), diff --git a/chimere/views.py b/chimere/views.py index 676ede0..a9f27e6 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -41,7 +41,7 @@ from django.utils.http import urlquote from django.utils.translation import ugettext as _ from django.views.generic import TemplateView, ListView, FormView -from chimere.actions import actions +from chimere.actions import actions, get_extra_pages from chimere import models from chimere import forms from chimere import widgets @@ -125,6 +125,7 @@ def get_base_response(request, area_name=""): area, area_name = get_area(area_name) base_response_dct['area'] = area + base_response_dct['extra_pages'] = get_extra_pages(area) base_response_dct['area_name'] = area_name if area and area.favicon: base_response_dct['favicon'] = area.favicon @@ -209,8 +210,7 @@ def index(request, area_name=None, default_area=None, simple=False, if request.GET and "ty" in request.GET: response_dct['tiny'] = request.GET["ty"] response_dct.update({ - 'actions': actions(response_dct['area_name']), - 'action_selected': ('view',), + 'action_selected': ('map',), 'error_message': '', 'is_map': True, 'news_visible': news_visible, @@ -501,7 +501,6 @@ def edit_page(get_edit, types, geom_name, widget, init_widget=True): if request.POST and request.POST.get(geom_attr): value = request.POST.get(geom_attr) response_dct.update({ - 'actions': current_actions, 'action_selected': ('contribute', 'edit-' + geom_name), 'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER, 'error_message': '', |