summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-02-15 19:57:33 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-02-15 19:57:33 +0100
commit053c3a9a421a980a2af2f8e60df2d0c106b959e7 (patch)
tree7eafee9ba4a8db2c5e470f599939cab18f4c22d7
parentfbfae775970eb0b29c3ac3f79d5bcd7c9acb12fb (diff)
downloadChimère-053c3a9a421a980a2af2f8e60df2d0c106b959e7.tar.bz2
Chimère-053c3a9a421a980a2af2f8e60df2d0c106b959e7.zip
Use staticfiles (refs #315)
-rw-r--r--chimere/templates/base.html6
-rw-r--r--chimere/templates/categories.html8
-rw-r--r--chimere/templates/detail.html2
-rw-r--r--chimere/templates/main_map.html2
-rw-r--r--chimere/templates/upload_file.html6
-rw-r--r--chimere/views.py46
-rw-r--r--chimere/widgets.py36
-rw-r--r--docs/upgrade.rst10
-rw-r--r--example_project/settings.py.example50
-rw-r--r--example_project/urls.py2
10 files changed, 118 insertions, 50 deletions
diff --git a/chimere/templates/base.html b/chimere/templates/base.html
index f8a057d..67322f6 100644
--- a/chimere/templates/base.html
+++ b/chimere/templates/base.html
@@ -5,13 +5,13 @@
<head>
<title>{% block title %}Chimère{% endblock %}</title>
<script type="text/javascript"><!--
- var media_path = '{{media_path}}';
+ var media_path = '{{STATIC_URL}}';
var extra_url = "{{extra_url}}";
// --></script>
<script type="text/javascript" src="{{JQUERY_URL}}"></script>
{% block extra_head %}{{extra_head|safe}}{% endblock %}
- <link rel="stylesheet" href="{{media_path}}styles.css" />
- {%if css_area%}<link rel="stylesheet" href="{{media_path}}{{css_area}}" />{%endif%}
+ <link rel="stylesheet" href="{{STATIC_URL}}styles.css" />
+ {%if css_area%}<link rel="stylesheet" href="{{STATIC_URL}}{{css_area}}" />{%endif%}
{% block head %}{% endblock %}
</head>
diff --git a/chimere/templates/categories.html b/chimere/templates/categories.html
index 5646075..db3d827 100644
--- a/chimere/templates/categories.html
+++ b/chimere/templates/categories.html
@@ -2,18 +2,18 @@
<ul id='ul_categories'>
{% for category, lst_sub_categories in sub_categories %}
<li>
- <img class='control_image' id='maincategory_img_{{category.id}}' alt='control' src='{{media_path}}icons/{% if category.selected %}minus.png{%else%}plus.png{%endif%}' onclick='toggleCategory(this);'/>
+ <img class='control_image' id='maincategory_img_{{category.id}}' alt='control' src='{{STATIC_URL}}icons/{% if category.selected %}minus.png{%else%}plus.png{%endif%}' onclick='toggleCategory(this);'/>
<input type="checkbox" id='checkall_{{category.id}}' onclick="checkAll(this);loadGeoObjects();">
{% trans category.name %}
-<img class='zoom_image' alt='{% trans "Zoom to" %} {{category.name}}' src='{{media_path}}icons/zoom.png' onclick='zoomToCategory({{category.id}})'/>
+<img class='zoom_image' alt='{% trans "Zoom to" %} {{category.name}}' src='{{STATIC_URL}}icons/zoom.png' onclick='zoomToCategory({{category.id}})'/>
<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' onclick='loadGeoObjects()' 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_path}}{{sub_category.icon.image}}'/>
+ <img alt='{{sub_category.name}}' src='{{STATIC_URL}}{{sub_category.icon.image}}'/>
{% trans sub_category.name %}</label>
- <img class='zoom_image' alt='{% trans "Zoom to" %} {{sub_category.name}}' src='{{media_path}}icons/zoom.png' onclick='zoomToSubCategory({{sub_category.id}})'/>
+ <img class='zoom_image' alt='{% trans "Zoom to" %} {{sub_category.name}}' src='{{STATIC_URL}}icons/zoom.png' onclick='zoomToSubCategory({{sub_category.id}})'/>
</li>{% endfor %}
{%if category.description%}<li><a href='#' onclick='displayCategoryDetail({{category.id}});'>{%trans "Tell me more..."%}</a></li>{%endif%}
</ul>
diff --git a/chimere/templates/detail.html b/chimere/templates/detail.html
index a1b61b6..c35f664 100644
--- a/chimere/templates/detail.html
+++ b/chimere/templates/detail.html
@@ -2,7 +2,7 @@
{% load sanitize %}
<h2>{{ marker.name }}</h2>
<div id='detail_content'>
-{% if marker.picture %}<img src='{{media_path}}{{marker.picture}}' alt='{{marker.name}}'/>{%endif%}
+{% if marker.picture %}<img src='{{STATIC_URL}}{{marker.picture}}' alt='{{marker.name}}'/>{%endif%}
<div>
{% if dated %}
<p id='detail_start_date'><label>{% trans "Date:" %}</label> <span>{{marker.start_date|date:"D d M Y"}}
diff --git a/chimere/templates/main_map.html b/chimere/templates/main_map.html
index 8b8cc2e..b426c25 100644
--- a/chimere/templates/main_map.html
+++ b/chimere/templates/main_map.html
@@ -15,7 +15,7 @@
{%if areas%}<div id='areas'>
<h2>{% trans "Shortcuts"%}</h2>
<ul>{% for area in areas%}
-<li><img class='zoom_image' alt='{% trans "Zoom to" %} {{area.name}}' src='{{media_path}}icons/zoom.png' onclick='zoomToArea({{area.upper_left_corner.x|unlocalize_point}}, {{area.upper_left_corner.y|unlocalize_point}}, {{area.lower_right_corner.x|unlocalize_point}}, {{area.lower_right_corner.y|unlocalize_point}}); loadGeoObjects();'/> {{area.name}}</li>{%endfor%}
+<li><img class='zoom_image' alt='{% trans "Zoom to" %} {{area.name}}' src='{{STATIC_URL}}icons/zoom.png' onclick='zoomToArea({{area.upper_left_corner.x|unlocalize_point}}, {{area.upper_left_corner.y|unlocalize_point}}, {{area.lower_right_corner.x|unlocalize_point}}, {{area.lower_right_corner.y|unlocalize_point}}); loadGeoObjects();'/> {{area.name}}</li>{%endfor%}
</ul>
</div>{%endif%}
diff --git a/chimere/templates/upload_file.html b/chimere/templates/upload_file.html
index 0ef276d..d08f723 100644
--- a/chimere/templates/upload_file.html
+++ b/chimere/templates/upload_file.html
@@ -5,12 +5,12 @@
<head>
<title>{% block title %}Chimère{% endblock %}</title>
<script type="text/javascript"><!--
- var media_path = '{{media_path}}';
+ var media_path = '{{STATIC_URL}}';
var extra_url = "{{extra_url}}";
// --></script>
{% block extra_head %}{{extra_head|safe}}{% endblock %}
- <link rel="stylesheet" href="{{media_path}}styles.css" />
- {%if css_area%}<link rel="stylesheet" href="{{media_path}}{{css_area}}" />{%endif%}
+ <link rel="stylesheet" href="{{STATIC_URL}}styles.css" />
+ {%if css_area%}<link rel="stylesheet" href="{{STATIC_URL}}{{css_area}}" />{%endif%}
<script type="text/javascript" src="{{JQUERY_URL}}"></script>
{% block head %}{% endblock %}
</head>
diff --git a/chimere/views.py b/chimere/views.py
index 90fa821..17e510c 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-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
@@ -29,7 +29,7 @@ from django.core import serializers
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render_to_response
-from django.template import loader
+from django.template import loader, RequestContext
from django.utils import simplejson
from django.utils.http import urlquote
from django.utils.translation import ugettext as _
@@ -47,7 +47,7 @@ def get_base_response(area_name=""):
"""
Get the base url
"""
- base_response_dct = {'media_path':settings.MEDIA_URL,}
+ base_response_dct = {'media_path':settings.STATIC_URL,}
base_url = settings.EXTRA_URL
if not base_url.startswith('/'):
base_url = '/' + base_url
@@ -70,8 +70,8 @@ def index(request, area_name=None, default_area=None, simple=False):
tab = " "*4
for url in URL_OSM_CSS:
extra += tab + '<link rel="stylesheet" href="%s" />' % url
- for url in URL_OSM_JS + ["%sbase.js" % settings.MEDIA_URL,
- "%smain_map.js" % settings.MEDIA_URL,]:
+ for url in URL_OSM_JS + ["%sbase.js" % settings.STATIC_URL,
+ "%smain_map.js" % settings.STATIC_URL,]:
extra += tab + '<script src="%s"></script>\n' % url
# show the welcome page
today = datetime.date.today().strftime('%y-%m-%d')
@@ -108,7 +108,8 @@ def index(request, area_name=None, default_area=None, simple=False):
tpl = 'main_map.html'
if simple:
tpl = 'main_map_simple.html'
- return render_to_response(tpl, response_dct)
+ return render_to_response(tpl, response_dct,
+ context_instance=RequestContext(request))
def edit(request, area_name=""):
"""
@@ -149,7 +150,8 @@ def edit(request, area_name=""):
# manualy populate the custom widget
if 'subcategory' in form.data and form.data['subcategory']:
response_dct['current_category'] = int(form.data['subcategory'])
- return render_to_response('edit.html', response_dct)
+ return render_to_response('edit.html', response_dct,
+ context_instance=RequestContext(request))
def uploadFile(request, category_id='', area_name=''):
response_dct = get_base_response(area_name)
@@ -192,7 +194,8 @@ def uploadFile(request, category_id='', area_name=''):
# An unbound form
form = Form()
response_dct.update({'form':form})
- return render_to_response('upload_file.html', response_dct)
+ return render_to_response('upload_file.html', response_dct,
+ context_instance=RequestContext(request))
def processRouteFile(request, area_name='', file_id=None):
if file_id:
@@ -250,7 +253,8 @@ def editRoute(request, area_name=""):
# manualy populate the custom widget
if 'subcategory' in form.data and form.data['subcategory']:
response_dct['current_category'] = int(form.data['subcategory'])
- return render_to_response('edit_route.html', response_dct)
+ return render_to_response('edit_route.html', response_dct,
+ context_instance=RequestContext(request))
def welcome(request, display=None):
"""
@@ -271,7 +275,8 @@ def submited(request, area_name="", action=""):
"""
response_dct = get_base_response(area_name)
response_dct.update({'actions':actions, 'action_selected':action,})
- return render_to_response('submited.html', response_dct)
+ return render_to_response('submited.html', response_dct,
+ context_instance=RequestContext(request))
def charte(request, area_name=""):
"""
@@ -279,7 +284,8 @@ def charte(request, area_name=""):
"""
response_dct = get_base_response(area_name)
response_dct.update({'actions':actions, 'action_selected':('charte',)})
- return render_to_response('charte.html', response_dct)
+ return render_to_response('charte.html', response_dct,
+ context_instance=RequestContext(request))
def contactus(request, area_name=""):
"""
@@ -295,9 +301,9 @@ def contactus(request, area_name=""):
response = notifyStaff(_(u"Comments/request on the map"),
form.cleaned_data['content'], form.cleaned_data['email'])
if response:
- msg = _(u"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.")
+ msg = _(u"Thank you for your contribution. It will be taken "\
+ u"into account. If you have left your email you may "\
+ u"be contacted soon for more details.")
else:
msg = _(u"Temporary error. Renew your message later.")
else:
@@ -305,7 +311,8 @@ details.")
response_dct = get_base_response(area_name)
response_dct.update({'actions':actions, 'action_selected':('contact',),
'contact_form':form, 'message':msg})
- return render_to_response('contactus.html', response_dct)
+ return render_to_response('contactus.html', response_dct,
+ context_instance=RequestContext(request))
def getDetail(request, area_name, marker_id):
'''
@@ -329,7 +336,8 @@ def getDetail(request, area_name, marker_id):
share_networks.append((network[0], network[1] % net_dct, network[2]))
response_dct['share_networks'] = share_networks
response_dct['dated'] = settings.DAYS_BEFORE_EVENT and marker.start_date
- return render_to_response('detail.html', response_dct)
+ return render_to_response('detail.html', response_dct,
+ context_instance=RequestContext(request))
def getDescriptionDetail(request, area_name, category_id):
'''
@@ -341,7 +349,8 @@ def getDescriptionDetail(request, area_name, category_id):
return HttpResponse('no results')
response_dct = get_base_response(area_name)
response_dct['category'] = category
- return render_to_response('category_detail.html', response_dct)
+ return render_to_response('category_detail.html', response_dct,
+ context_instance=RequestContext(request))
def checkDate(q):
"""
@@ -432,7 +441,8 @@ def getAvailableCategories(request, area_name=None, area=None, status='A',
subcategories = [(cat, list(subcats)) \
for cat, subcats in groupby(categories, get_cat)]
response_dct['sub_categories'] = subcategories
- return render_to_response('categories.html', response_dct)
+ return render_to_response('categories.html', response_dct,
+ context_instance=RequestContext(request))
def getTinyfiedUrl(parameters, area_name=''):
'''
diff --git a/chimere/widgets.py b/chimere/widgets.py
index ec63ea3..c2a6d60 100644
--- a/chimere/widgets.py
+++ b/chimere/widgets.py
@@ -29,7 +29,7 @@ from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
URL_OSM_CSS = ["http://www.openlayers.org/api/theme/default/style.css"]
-URL_OSM_JS = [settings.MEDIA_URL+"OpenLayers.js",
+URL_OSM_JS = [settings.STATIC_URL+"OpenLayers.js",
"http://www.openstreetmap.org/openlayers/OpenStreetMap.js"]
def getMapJS(area_name=''):
@@ -43,7 +43,7 @@ def getMapJS(area_name=''):
js += u"var centerLonLat = new OpenLayers.LonLat(%f,\
%f).transform(epsg_display_projection, epsg_projection);\n" % \
settings.DEFAULT_CENTER
- js += u"var media_path = '%s';\n" % settings.MEDIA_URL
+ js += u"var media_path = '%s';\n" % settings.STATIC_URL
js += u"var map_layer = %s;\n" % settings.MAP_LAYER
js += u"var restricted_extent;\n"
@@ -65,7 +65,7 @@ class TextareaWidget(forms.Textarea):
"""
class Media:
js = ["%stiny_mce.js" % settings.TINYMCE_URL,
- "%stextareas.js" % settings.MEDIA_URL,]
+ "%stextareas.js" % settings.STATIC_URL,]
class PointChooserWidget(forms.TextInput):
"""
@@ -73,10 +73,10 @@ class PointChooserWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.MEDIA_URL,]
+ "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
}
- js = URL_OSM_JS + ["%sedit_map.js" % settings.MEDIA_URL,
- "%sbase.js" % settings.MEDIA_URL,]
+ js = URL_OSM_JS + ["%sedit_map.js" % settings.STATIC_URL,
+ "%sbase.js" % settings.STATIC_URL,]
def render(self, name, value, attrs=None, area_name=''):
'''
@@ -97,7 +97,7 @@ class PointChooserWidget(forms.TextInput):
else:
value = None
tpl = getMapJS(area_name)
- tpl += u'<script src="%sedit_map.js"></script>\n' % settings.MEDIA_URL
+ tpl += u'<script src="%sedit_map.js"></script>\n' % settings.STATIC_URL
tpl += u"""<div id='map_edit'></div>
<div id='live_lonlat'>
<p><label for='live_latitude'>%s</label>\
@@ -141,10 +141,10 @@ class RouteChooserWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.MEDIA_URL,]
+ "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
}
- js = ["%sedit_route_map.js" % settings.MEDIA_URL,
- "%sbase.js" % settings.MEDIA_URL,] + URL_OSM_JS
+ js = ["%sedit_route_map.js" % settings.STATIC_URL,
+ "%sbase.js" % settings.STATIC_URL,] + URL_OSM_JS
def render(self, name, value, attrs=None, area_name='', routefile_id=None):
'''
@@ -176,7 +176,7 @@ _(u"To delete a point move the mouse cursor over it and press the \"d\" or \
_(u"To add a point click in the middle of a segment and drag the new point to \
the desired position"))
tpl += u'<script src="%sedit_route_map.js"></script>\n' % \
- settings.MEDIA_URL
+ settings.STATIC_URL
if not value:
# upload a file
tpl += u"""<script type='text/javascript'><!--
@@ -249,10 +249,10 @@ class AreaWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.MEDIA_URL,]
+ "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
}
- js = URL_OSM_JS + ["%sedit_area.js" % settings.MEDIA_URL,
- "%sbase.js" % settings.MEDIA_URL,]
+ js = URL_OSM_JS + ["%sedit_area.js" % settings.STATIC_URL,
+ "%sbase.js" % settings.STATIC_URL,]
def render(self, name, value, attrs=None):
"""
@@ -318,13 +318,13 @@ class AreaField(forms.MultiValueField):
class MultiSelectWidget(forms.SelectMultiple):
class Media:
css = {'all': (
- settings.MEDIA_URL + 'jquery/bsmSelect/css/jquery.bsmselect.css',
- settings.MEDIA_URL + 'jquery/css/jquery.bsmselect.custom.css',
+ settings.STATIC_URL + 'jquery/bsmSelect/css/jquery.bsmselect.css',
+ settings.STATIC_URL + 'jquery/css/jquery.bsmselect.custom.css',
)
}
js = (
- settings.MEDIA_URL + 'jquery/bsmSelect/js/jquery.bsmselect.js',
- settings.MEDIA_URL + 'jquery/bsmSelect/js/jquery.bsmselect.compatibility.js',
+ settings.STATIC_URL + 'jquery/bsmSelect/js/jquery.bsmselect.js',
+ settings.STATIC_URL + 'jquery/bsmSelect/js/jquery.bsmselect.compatibility.js',
)
def render(self, name, value, attrs=None):
diff --git a/docs/upgrade.rst b/docs/upgrade.rst
index 10548d7..18c8026 100644
--- a/docs/upgrade.rst
+++ b/docs/upgrade.rst
@@ -84,8 +84,16 @@ Adapt settings.py
The format of settings.py could have evolved, the easiest way to complete your
settings.py is to compare your old settings.py.example and the new one provided.
+Upgrade to version 2.0
+**********************
+
+ - Add to the settings.py a STATIC_URL variable by default set to '/static/' (be
+careful to change MEDIA_URL if it is already set to '/static/').
+
+ - Add the detail of TEMPLATE_CONTEXT_PROCESSORS (see settings.py.example)
+
Specific upgrade from version 1.0 to version 1.1
-***************************************************
+************************************************
Version 1.1 of Chimère uses Django 1.2 and with it the way to define database
has changed.
diff --git a/example_project/settings.py.example b/example_project/settings.py.example
index 2715d02..c9a3934 100644
--- a/example_project/settings.py.example
+++ b/example_project/settings.py.example
@@ -10,6 +10,7 @@ ROOT_PATH = os.path.realpath(os.path.dirname(__file__)) + "/"
EXTRA_URL = 'chimere/'
BASE_URL = SERVER_URL + EXTRA_URL
EMAIL_HOST = 'localhost'
+STATIC_URL = '/static/'
TINYMCE_URL = 'http://localhost/tinymce/'
JQUERY_URL = "/chimere/static/jquery/jquery-1.4.4.min.js"
@@ -147,6 +148,7 @@ INSTALLED_APPS = (
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
+ 'django.contrib.staticfiles',
'south',
'chimere',
# activate it if you want to use migration scripts
@@ -157,3 +159,51 @@ INSTALLED_APPS = (
if 'chimere_rss' in INSTALLED_APPS:
TEMPLATE_DIRS.append(ROOT_PATH + 'chimere_rss/templates')
+
+LOGGING = {'version': 1,
+ 'disable_existing_loggers': False,
+ 'handlers': {
+ /# Include the default Django email handler for errors
+ # This is what you'd get without configuring logging at all.
+ 'mail_admins': {
+ 'class': 'django.utils.log.AdminEmailHandler',
+ 'level': 'ERROR',
+ # But the emails are plain text by default - HTML is nicer
+ 'include_html': True,
+ },
+ # Log to a text file that can be rotated by logrotate
+ 'logfile': {
+ 'class': 'logging.handlers.WatchedFileHandler',
+ 'filename': '/var/log/django/chimere.log'
+ },
+ },
+ 'loggers': {
+ # Again, default Django configuration to email unhandled exceptions
+ 'django.request': {
+ 'handlers': ['mail_admins'],
+ 'level': 'ERROR',
+ 'propagate': True,
+ },
+ # Might as well log any errors anywhere else in Django
+ 'django': {
+ 'handlers': ['logfile'],
+ 'level': 'ERROR',
+ 'propagate': False,
+ },
+ # Your own app - this assumes all your logger names start with "myapp."
+ 'main': {
+ 'handlers': ['logfile'],
+ 'level': 'WARNING', # Or maybe INFO or DEBUG
+ 'propogate': False
+ },
+ },
+}
+
+TEMPLATE_CONTEXT_PROCESSORS = (
+ 'django.core.context_processors.debug',
+ 'django.core.context_processors.i18n',
+ 'django.core.context_processors.media',
+ 'django.core.context_processors.static',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+)
diff --git a/example_project/urls.py b/example_project/urls.py
index 84a7e13..1f95694 100644
--- a/example_project/urls.py
+++ b/example_project/urls.py
@@ -33,7 +33,7 @@ urlpatterns += staticfiles_urlpatterns()
urlpatterns += patterns('',
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^admin/', include(admin.site.urls)),
- url(r'^chimere/', include('chimere.urls', namespace="chimere")),
+ url(r'^', include('chimere.urls', namespace="chimere")),
)
if 'rss' in settings.INSTALLED_APPS: