summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit64956fbaf18a8e687d8f0fffc79889a277f42fcd (patch)
treee4c92902db6e39eb1bb458eb04e148035f450d82
parent318bfc901e262a8d35323f42eb71b364497dc27c (diff)
downloadChimère-64956fbaf18a8e687d8f0fffc79889a277f42fcd.tar.bz2
Chimère-64956fbaf18a8e687d8f0fffc79889a277f42fcd.zip
Better management of extra pages
-rw-r--r--chimere/actions.py18
-rw-r--r--chimere/admin.py10
-rw-r--r--chimere/forms.py7
-rw-r--r--chimere/migrations/0017_auto_20180318_1958.py85
-rw-r--r--chimere/models.py39
-rw-r--r--chimere/static/chimere/css/styles.css56
-rw-r--r--chimere/templates/chimere/base.html3
-rw-r--r--chimere/templates/chimere/blocks/actions.html37
-rw-r--r--chimere/templates/chimere/blocks/page_title.html5
-rw-r--r--chimere/templatetags/chimere_tags.py5
-rw-r--r--chimere/urls_chimere.py2
-rw-r--r--chimere/views.py7
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': '',