summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/forms.py35
-rw-r--r--chimere/migrations/0001_initial.py6
-rw-r--r--chimere/models.py46
-rw-r--r--chimere/templates/base.html3
-rw-r--r--chimere/templates/chimere/blocks/categories.html2
-rw-r--r--chimere/templates/chimere/blocks/head.html26
-rw-r--r--chimere/templates/chimere/blocks/map_params.html2
-rw-r--r--chimere/templatetags/chimere_tags.py10
-rw-r--r--chimere/urls.py2
-rw-r--r--chimere/views.py114
-rw-r--r--chimere/widgets.py46
-rw-r--r--example_project/settings.py.example30
12 files changed, 173 insertions, 149 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index 06845d7..52e727c 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -99,15 +99,10 @@ class CategoryAdminForm(forms.ModelForm):
class Meta:
model = Category
-class MarkerAdminForm(forms.ModelForm):
+class MarkerAdminFormBase(forms.ModelForm):
"""
Main form for marker
"""
- # declare properties
- for property in PropertyModel.objects.filter(available=True):
- exec('property_%d_%d = forms.CharField(label="%s", widget=%s, '\
- 'required=False)' % (property.order, property.id, property.name,
- PropertyModel.TYPE_WIDGET[property.type]))
class Meta:
model = Marker
@@ -126,8 +121,8 @@ class MarkerAdminForm(forms.ModelForm):
keys['initial'].update(property_dct)
else:
keys['initial'] = property_dct
- super(MarkerAdminForm, self).__init__(*args, **keys)
- if settings.DAYS_BEFORE_EVENT:
+ super(MarkerAdminFormBase, self).__init__(*args, **keys)
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = AdminDateWidget()
self.fields['end_date'].widget = AdminDateWidget()
@@ -135,7 +130,7 @@ class MarkerAdminForm(forms.ModelForm):
'''
Verify that a start date is provided when an end date is set
'''
- if not settings.DAYS_BEFORE_EVENT:
+ if not settings.CHIMERE_DAYS_BEFORE_EVENT:
return self.cleaned_data
if self.cleaned_data['end_date'] and \
not self.cleaned_data['start_date']:
@@ -148,7 +143,8 @@ class MarkerAdminForm(forms.ModelForm):
"""
Custom save method in order to manage associated properties
"""
- new_marker = super(MarkerAdminForm, self).save(*args, **keys)
+ print self.cleaned_data
+ new_marker = super(MarkerAdminFormBase, self).save(*args, **keys)
if 'status' not in self.cleaned_data:
new_marker.status = 'S'
if new_marker.status == 'A':
@@ -162,6 +158,16 @@ class MarkerAdminForm(forms.ModelForm):
new_marker.saveProperties(properties)
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):
"""
Form for the edit page
@@ -193,13 +199,13 @@ class RouteAdminForm(forms.ModelForm):
else:
keys['initial'] = property_dct
super(RouteAdminForm, self).__init__(*args, **keys)
- if settings.DAYS_BEFORE_EVENT:
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = AdminDateWidget()
self.fields['end_date'].widget = AdminDateWidget()
def save(self, *args, **keys):
"""
- Custom save method in order to manage status
+ Custom save method in order to manage associated properties
"""
new_route = super(RouteAdminForm, self).save(*args, **keys)
if 'status' not in self.cleaned_data:
@@ -218,11 +224,6 @@ class RouteForm(RouteAdminForm):
class Meta:
model = Route
exclude = ('status',)
- # marker properties
- for property in PropertyModel.objects.filter(available=True):
- exec('property_%d_%d = forms.CharField(label="%s", widget=%s, '\
- 'required=False)' % (property.order, property.id, property.name,
- PropertyModel.TYPE_WIDGET[property.type]))
def save(self, *args, **keys):
"""
diff --git a/chimere/migrations/0001_initial.py b/chimere/migrations/0001_initial.py
index 93d61e4..74f67a6 100644
--- a/chimere/migrations/0001_initial.py
+++ b/chimere/migrations/0001_initial.py
@@ -140,7 +140,7 @@ class Migration(SchemaMigration):
db.create_unique('main_route_categories', ['route_id', 'subcategory_id'])
# Adding model 'Area'
- db.create_table('chimere_area', (
+ db.create_table('main_area', (
('available', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=150)),
('urn', self.gf('django.db.models.fields.SlugField')(db_index=True, unique=True, max_length=50, blank=True)),
@@ -213,7 +213,7 @@ class Migration(SchemaMigration):
db.delete_table('main_route_categories')
# Deleting model 'Area'
- db.delete_table('chimere_area')
+ db.delete_table('main_area')
# Deleting model 'PropertyModel'
db.delete_table('main_propertymodel')
@@ -224,7 +224,7 @@ class Migration(SchemaMigration):
models = {
'chimere.area': {
- 'Meta': {'object_name': 'Area'},
+ 'Meta': {'object_name': 'Area', 'db_table': "'main_area'"},
'available': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}),
diff --git a/chimere/models.py b/chimere/models.py
index f28fb28..b4ee64e 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -30,9 +30,12 @@ from django.contrib.gis.db import models
from django.contrib.gis.gdal import SpatialReference
from django.contrib import admin
from django.core.files import File
+from django import forms
from django.utils.translation import ugettext_lazy as _
-from chimere.widgets import PointField, RouteField, SelectMultipleField
+from chimere.widgets import PointField, RouteField, SelectMultipleField, \
+ TextareaWidget
+from chimere.managers import BaseGeoManager
class News(models.Model):
"""News of the site
@@ -178,7 +181,7 @@ class SubCategory(models.Model):
for sub_category in subcategories:
if sub_category.category not in sub_categories:
sub_categories[sub_category.category] = []
- if sub_category.id in settings.DEFAULT_CATEGORIES:
+ if sub_category.id in settings.CHIMERE_DEFAULT_CATEGORIES:
sub_category.selected = True
sub_category.category.selected = True
sub_categories[sub_category.category].append(sub_category)
@@ -191,7 +194,7 @@ class Marker(models.Model):
name = models.CharField(_(u"Name"), max_length=150)
categories = SelectMultipleField(SubCategory)
point = PointField(_(u"Localisation"),
- srid=settings.EPSG_DISPLAY_PROJECTION)
+ srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
picture = models.ImageField(_(u"Image"), upload_to='upload', blank=True,
null=True, height_field='height', width_field='width')
height = models.IntegerField(_(u"Height"), blank=True, null=True)
@@ -203,7 +206,7 @@ class Marker(models.Model):
for key, label in STATUS:
STATUS_DCT[key] = label
status = models.CharField(_(u"Status"), max_length=1, choices=STATUS)
- if settings.DAYS_BEFORE_EVENT:
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
start_date = models.DateField(_(u"Start date"), blank=True, null=True,
help_text=_(u"Not mandatory. Set it for dated item such as event. "\
u"Format YYYY-MM-DD"))
@@ -214,14 +217,14 @@ class Marker(models.Model):
available_date = models.DateTimeField(_(u"Available Date"), blank=True,
null=True)
route = models.ForeignKey(u"Route", blank=True, null=True)
- objects = models.GeoManager()
+ objects = BaseGeoManager()
def __unicode__(self):
return self.name
@property
def date(self):
- if settings.DAYS_BEFORE_EVENT:
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
return self.start_date
class Meta:
@@ -305,9 +308,15 @@ class Marker(models.Model):
u'"icon_height":%(icon_height)d}}' % items)
return ",".join(jsons)
+ @property
+ def default_category(self):
+ # Should we select only available ones ?
+ # Should we catch if not exists ?
+ return self.categories.all()[0]
+
def get_absolute_url(self):
parameters = 'current_feature=%d&checked_categories=%s' % (self.id,
- self.categories.all()[0].id)
+ self.default_category.pk)
return settings.BASE_URL + 'ty/' + TinyUrl.getUrnByParameters(parameters)
class RouteFile(models.Model):
@@ -370,7 +379,8 @@ class Route(models.Model):
'''
name = models.CharField(_(u"Name"), max_length=150)
categories = SelectMultipleField(SubCategory)
- route = RouteField(_(u"Route"), srid=settings.EPSG_DISPLAY_PROJECTION)
+ route = RouteField(_(u"Route"),
+ srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
associated_file = models.ForeignKey(RouteFile, blank=True, null=True,
verbose_name=_(u"Associated file"))
picture = models.ImageField(_(u"Image"), upload_to='upload', blank=True,
@@ -383,7 +393,7 @@ class Route(models.Model):
STATUS_DCT = {}
for key, label in STATUS:
STATUS_DCT[key] = label
- if settings.DAYS_BEFORE_EVENT:
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
start_date = models.DateField(_(u"Start date"), blank=True, null=True,
help_text=_(u"Not mandatory. Set it for dated item such as event. "\
u"Format YYYY-MM-DD"))
@@ -391,7 +401,7 @@ class Route(models.Model):
help_text=_(u"Not mandatory. Set it only if you have a multi-day "\
u"event. Format YYYY-MM-DD"))
status = models.CharField(_(u"Status"), max_length=1, choices=STATUS)
- objects = models.GeoManager()
+ objects = BaseGeoManager()
def __unicode__(self):
return self.name
@@ -443,10 +453,10 @@ def getDateCondition():
'''
Return an SQL condition for apparition of dates
'''
- if not settings.DAYS_BEFORE_EVENT:
+ if not settings.CHIMERE_DAYS_BEFORE_EVENT:
return ""
now = datetime.now().strftime('%Y-%m-%d')
- after = (datetime.now() + timedelta(settings.DAYS_BEFORE_EVENT)
+ after = (datetime.now() + timedelta(settings.CHIMERE_DAYS_BEFORE_EVENT)
).strftime('%Y-%m-%d')
date_condition = " and %(alias)s.start_date is null or "
date_condition += "(%(alias)s.start_date >= '" + now + "' and "
@@ -501,7 +511,7 @@ class SimpleArea:
self.lower_right_corner.x, self.lower_right_corner.y,
self.upper_left_corner.x, self.lower_right_corner.y,
self.upper_left_corner.x, self.upper_left_corner.y,
- settings.EPSG_DISPLAY_PROJECTION
+ settings.CHIMERE_EPSG_DISPLAY_PROJECTION
)
date_condition = getDateCondition()
sql_main = '''select subcat.id as id, subcat.category_id as category_id,
@@ -544,9 +554,9 @@ class Area(models.Model, SimpleArea):
order = models.IntegerField(_(u"Order"))
available = models.BooleanField(_(u"Available"))
upper_left_corner = models.PointField(_(u"Upper left corner"),
- default='POINT(0 0)', srid=settings.EPSG_DISPLAY_PROJECTION)
+ default='POINT(0 0)', srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
lower_right_corner = models.PointField(_(u"Lower right corner"),
- default='POINT(0 0)', srid=settings.EPSG_DISPLAY_PROJECTION)
+ default='POINT(0 0)', srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
objects = models.GeoManager()
def __unicode__(self):
@@ -586,9 +596,9 @@ class PropertyModel(models.Model):
TYPE = (('T', _('Text')),
('L', _('Long text')),
('P', _('Password')))
- TYPE_WIDGET = {'T':'forms.TextInput',
- 'L':'TextareaWidget',
- 'P':'forms.PasswordInput'}
+ TYPE_WIDGET = {'T':forms.TextInput,
+ 'L':TextareaWidget,
+ 'P':forms.PasswordInput}
type = models.CharField(_(u"Type"), max_length=1, choices=TYPE)
def __unicode__(self):
return self.name
diff --git a/chimere/templates/base.html b/chimere/templates/base.html
index f19601a..2a50fc3 100644
--- a/chimere/templates/base.html
+++ b/chimere/templates/base.html
@@ -1,5 +1,4 @@
-{% load i18n %}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+{% load i18n %}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
diff --git a/chimere/templates/chimere/blocks/categories.html b/chimere/templates/chimere/blocks/categories.html
index 5ff8f36..5ba89fc 100644
--- a/chimere/templates/chimere/blocks/categories.html
+++ b/chimere/templates/chimere/blocks/categories.html
@@ -24,6 +24,6 @@
</li>
{% endfor %}
<li id='display_submited'>
- <input type='checkbox' onclick='loadGeoObjects()' name='display_submited' id='display_submited_check'/> {% trans "Display markers and routes waiting for validation"%}
+ <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.html b/chimere/templates/chimere/blocks/head.html
index c982717..5742798 100644
--- a/chimere/templates/chimere/blocks/head.html
+++ b/chimere/templates/chimere/blocks/head.html
@@ -1,4 +1,12 @@
-<script type="text/javascript" src="{{ STATIC_URL }}chimere/js/jquery/jquery-1.6.1.min.js"></script>
+{% if css_area %}
+<link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/{{ css_area }}.css" />{% endif %}
+{% for css_url in URL_OSM_CSS %}
+<link rel="stylesheet" href="{{ css_url }}" />{% endfor %}
+<link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/styles.css" />
+{% for js_url in URL_OSM_JS %}
+<script src="{{ js_url }}"></script>{% endfor %}
+
+<script type="text/javascript" src="{{ JQUERY_URL }}"></script>
<script type="text/javascript">
/* Global variables */
/* lower cases are for retrocompatibility */
@@ -11,16 +19,6 @@
var ICON_OFFSET_X = {{ ICON_OFFSET_X }};
var ICON_OFFSET_Y = {{ ICON_OFFSET_Y }};
</script>
-{% if css_area %}
- <link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/{{ css_area }}.css" />
-{% endif %}
-{% for css_url in URL_OSM_CSS %}
- <link rel="stylesheet" href="{{ css_url }}" />
-{% endfor %}
-<link rel="stylesheet" href="{{ STATIC_URL }}chimere/css/styles.css" />
-{% for js_url in URL_OSM_JS %}
- <script src="{{ js_url }}"></script>
-{% endfor %}
<script src="{{ STATIC_URL }}chimere/js/utils.js"></script>
<script src="{{ STATIC_URL }}chimere/js/base.js"></script>
<script src="{{ STATIC_URL }}chimere/js/jquery.chimere.js"></script>
@@ -33,11 +31,9 @@
var map_layer = {{ MAP_LAYER|safe }};
var restricted_extent;
{% if area_name %}
- var area_name = '{{ area_name }}';
- {% endif %}
+ var area_name = '{{ area_name }}';{% endif %}
{% if RESTRICTED_EXTENT %}
- restricted_extent = new OpenLayers.Bounds({{ RESTRICTED_EXTENT|join:"," }});
- {% endif %}
+ restricted_extent = new OpenLayers.Bounds({{ RESTRICTED_EXTENT|join:"," }});{% endif %}
</script>
diff --git a/chimere/templates/chimere/blocks/map_params.html b/chimere/templates/chimere/blocks/map_params.html
index 81f0f0b..78e9000 100644
--- a/chimere/templates/chimere/blocks/map_params.html
+++ b/chimere/templates/chimere/blocks/map_params.html
@@ -11,7 +11,7 @@
{% if p_lat %}chimere_init_options["lat"] = {{ p_lat }};{% endif %}
{% if p_lon %}chimere_init_options["lon"] = {{ p_lon }};{% endif %}
{% if p_display_submited %}chimere_init_options["display_submited"] = {{ p_display_submited }};{% endif %}
- chimere_init_options["checked_categories"] = {% if p_checked_categories %}[{{p_checked_categories}}]{% else %} {{ CHIMERE_DEFAULT_CATEGORIES }}{% endif %};
+ chimere_init_options["checked_categories"] = {% if p_checked_categories %}{{p_checked_categories}}{% else %} {{ CHIMERE_DEFAULT_CATEGORIES }}{% endif %};
var p_current_feature{% if p_current_feature %} = {{ p_current_feature }}{% endif %};
</script>
diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py
index f848019..b19d0a0 100644
--- a/chimere/templatetags/chimere_tags.py
+++ b/chimere/templatetags/chimere_tags.py
@@ -44,6 +44,7 @@ def head(context):
"""
context_data = {
"STATIC_URL": settings.STATIC_URL,
+ "JQUERY_URL": settings.JQUERY_URL,
"MEDIA_URL": settings.MEDIA_URL,
"DYNAMIC_CATEGORIES": settings.CHIMERE_DYNAMIC_CATEGORIES,
"EXTRA_URL": reverse("chimere:index"),
@@ -62,13 +63,16 @@ def head(context):
}
if settings.CHIMERE_CSS_AREAS and "area_name" in context:
context_data['css_area'] = context["area_name"]
- ret urn context_data
+ return context_data
@register.inclusion_tag('chimere/blocks/map_params.html', takes_context=True)
def map_params(context):
- request = context["request"]
- # Default values
context_data = {'p_checked_categories': settings.CHIMERE_DEFAULT_CATEGORIES}
+ try:
+ request = context['request']
+ except KeyError:
+ return context_data
+ # Default values
if request.GET:
for key in ('zoom', 'lon', 'lat', 'display_submited',
'current_feature'):
diff --git a/chimere/urls.py b/chimere/urls.py
index 0959b18..c065393 100644
--- a/chimere/urls.py
+++ b/chimere/urls.py
@@ -59,5 +59,3 @@ urlpatterns += patterns('chimere.views',
urlpatterns += patterns('chimere.views',
url(r'^(?P<area_name>\w+)?', 'index', name="index"),
)
-
-
diff --git a/chimere/views.py b/chimere/views.py
index eed0199..f27c501 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -26,6 +26,7 @@ from itertools import groupby
from django.conf import settings
from django.core import serializers
+from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render_to_response
@@ -43,12 +44,13 @@ from chimere.widgets import getMapJS, PointChooserWidget, \
from chimere.forms import MarkerForm, RouteForm, ContactForm, \
FileForm, FullFileForm, notifySubmission, notifyStaff
+#TODO: convert to requestcontext
def get_base_response(area_name=""):
"""
Get the base url
"""
base_response_dct = {'media_path':settings.STATIC_URL,}
- base_url = reverse("chimere:index") # App urls must be included with namespace
+ base_url = reverse("chimere:index") # App urls must be included with namespace
if not base_url.startswith('/'):
base_url = '/' + base_url
if area_name:
@@ -56,7 +58,7 @@ def get_base_response(area_name=""):
base_url += '/'
base_url += area_name + '/'
base_response_dct['extra_url'] = base_url
- if settings.CSS_AREAS and area_name:
+ if settings.CHIMERE_CSS_AREAS and area_name:
base_response_dct['css_area'] = area_name + ".css"
base_response_dct['area_name'] = area_name
base_response_dct['JQUERY_URL'] = settings.JQUERY_URL
@@ -66,32 +68,32 @@ def index(request, area_name=None, default_area=None, simple=False):
"""
Main page
"""
- extra = ""
- 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.STATIC_URL,
- "%smain_map.js" % settings.STATIC_URL,]:
- extra += tab + '<script src="%s"></script>\n' % url
- # show the welcome page
+ # show the news
+ # only if user is not came yet today
today = datetime.date.today().strftime('%y-%m-%d')
- display_welcome = None
+ news_visible = False
if not 'last_visit' in request.session or \
request.session['last_visit'] != today:
request.session['last_visit'] = today
- display_welcome = True
+ news_visible = True
response_dct = get_base_response(area_name)
- areas = None
- if settings.DISPLAY_AREAS:
- areas = Area.getAvailable()
+ # If the URL specify an area
+ default_area = None
+ if area_name:
+ try:
+ default_area = Area.objects.get(urn=area_name)
+ except Area.DoesNotExist:
+ # Do not return an error
+ pass
response_dct.update({'actions':actions, 'action_selected':('view',),
'error_message':'', 'default_area':default_area,
- 'extra_head':extra + getMapJS(area_name),
- 'welcome':welcome(request, display_welcome),
- 'areas':areas, 'map_layer':settings.MAP_LAYER,
- 'dynamic_categories':settings.DYNAMIC_CATEGORIES,
+ 'news_visible': news_visible,
+ 'areas_visible': settings.CHIMERE_DISPLAY_AREAS,
+ 'map_layer':settings.CHIMERE_MAP_LAYER,
+ 'dynamic_categories':settings.CHIMERE_DYNAMIC_CATEGORIES,
})
# manage permalink
+ """" # à tester
if request.GET:
for key in ('zoom', 'lon', 'lat', 'display_submited',
'current_feature'):
@@ -104,10 +106,10 @@ def index(request, area_name=None, default_area=None, simple=False):
cats = request.GET['checked_categories'].split('_')
response_dct['p_checked_categories'] = ",".join(cats)
else:
- response_dct['p_checked_categories'] = '';
- tpl = 'main_map.html'
+ response_dct['p_checked_categories'] = ''"""
+ tpl = 'chimere/main_map.html'
if simple:
- tpl = 'main_map_simple.html'
+ tpl = 'chimere/main_map_simple.html'
return render_to_response(tpl, response_dct,
context_instance=RequestContext(request))
@@ -137,9 +139,9 @@ def edit(request, area_name=""):
response_dct.update({'actions':actions,
'action_selected':('contribute', 'edit'),
'error_message':'',
- 'map_layer':settings.MAP_LAYER,
+ 'map_layer':settings.CHIMERE_MAP_LAYER,
'form':form,
- 'dated':settings.DAYS_BEFORE_EVENT,
+ 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
'extra_head':form.media,
'sub_categories':SubCategory.getAvailable(['M', 'B'],
area_name),
@@ -150,7 +152,7 @@ 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('chimere/edit.html', response_dct,
context_instance=RequestContext(request))
def uploadFile(request, category_id='', area_name=''):
@@ -239,13 +241,13 @@ def editRoute(request, area_name=""):
response_dct.update({'actions':actions,
'action_selected':('contribute', 'edit_route'),
'error_message':'',
- 'map_layer':settings.MAP_LAYER,
+ 'map_layer':settings.CHIMERE_MAP_LAYER,
'form':form,
- 'dated':settings.DAYS_BEFORE_EVENT,
+ 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
'extra_head':form.media,
'sub_categories':SubCategory.getAvailable(['R', 'B'],
area_name),
- 'route_widget':RouteChooserWidget().render('route', '',
+ 'route_widget':RouteChooserWidget().render('route', None,
area_name=area_name,
routefile_id='',),
'properties':declared_fields
@@ -253,7 +255,7 @@ 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('chimere/edit_route.html', response_dct,
context_instance=RequestContext(request))
def welcome(request, display=None):
@@ -262,12 +264,13 @@ def welcome(request, display=None):
"""
response_dct = {'display':display}
news = list(News.objects.filter(available=True).all())
- if settings.DAYS_BEFORE_EVENT:
+ if settings.CHIMERE_DAYS_BEFORE_EVENT:
q = checkDate(Q(status='A', start_date__isnull=False))
news += list(Marker.objects.filter(q).all())
- news.sort(key=lambda x:x.date)
+ news.sort(key=lambda x:x.date, reverse=True)
response_dct['news_lst'] = news
- return loader.render_to_string('welcome.html', response_dct)
+ return loader.render_to_string('chimere/blocks/welcome.html', response_dct,
+ context_instance=RequestContext(request))
def submited(request, area_name="", action=""):
"""
@@ -275,7 +278,7 @@ 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('chimere/submited.html', response_dct,
context_instance=RequestContext(request))
def charte(request, area_name=""):
@@ -284,7 +287,7 @@ 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('chimere/charte.html', response_dct,
context_instance=RequestContext(request))
def contactus(request, area_name=""):
@@ -311,7 +314,7 @@ def contactus(request, area_name=""):
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('chimere/contactus.html', response_dct,
context_instance=RequestContext(request))
def getDetail(request, area_name, marker_id):
@@ -335,8 +338,8 @@ def getDetail(request, area_name, marker_id):
for network in settings.SHARE_NETWORKS:
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,
+ response_dct['dated'] = settings.CHIMERE_DAYS_BEFORE_EVENT and marker.start_date
+ return render_to_response('chimere/detail.html', response_dct,
context_instance=RequestContext(request))
def getDescriptionDetail(request, area_name, category_id):
@@ -349,17 +352,17 @@ 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('chimere/category_detail.html', response_dct,
context_instance=RequestContext(request))
def checkDate(q):
"""
Filter a queryset to manage dates
"""
- if not settings.DAYS_BEFORE_EVENT:
+ if not settings.CHIMERE_DAYS_BEFORE_EVENT:
return q
today = datetime.date.today()
- after = today + datetime.timedelta(settings.DAYS_BEFORE_EVENT)
+ after = today + datetime.timedelta(settings.CHIMERE_DAYS_BEFORE_EVENT)
q = q & ( Q(start_date__isnull=True)
| Q(start_date__gte=today, start_date__lte=after)
@@ -407,28 +410,33 @@ def getGeoObjects(request, area_name, category_ids, status):
data = '{"type": "FeatureCollection", "features":[%s]}' % ",".join(jsons)
return HttpResponse(data)
-def getAvailableCategories(request, area_name=None, area=None, status='A',
+def get_available_categories(request, area_name=None, area=None, status='A',
force=None):
'''
Get categories for a designed area
'''
- if settings.DYNAMIC_CATEGORIES and not area:
+ if settings.CHIMERE_DYNAMIC_CATEGORIES and \
+ not "current_extent" in request.GET:
return ""
- response_dct = get_base_response('area_name')
- if not settings.DYNAMIC_CATEGORIES:
+ context_data = get_base_response(area_name)
+ if not settings.CHIMERE_DYNAMIC_CATEGORIES:
+ # Categories are not updated dynamicaly when the user move the map
+ # so we return ALL the categories
subcategories = SubCategory.getAvailable()
- response_dct['sub_categories'] = subcategories
- return render_to_response('categories.html', response_dct)
+ context_data['sub_categories'] = subcategories
+ return render_to_response('chimere/blocks/categories.html', context_data,
+ context_instance=RequestContext(request))
default_message = "<p class='warning'>%s</p>" % \
_("No category available in this area.")
- if not status: # there must be a status
+ if not "status" in request.GET: # there must be a status
status = 'A'
try:
status = status.split('_')
- area = area.replace('M', '-').replace('D', '.')
- area = SimpleArea([float(pt) for pt in area.split('_')])
+ current_extent = request.GET["current_extent"].replace('M', '-')\
+ .replace('D', '.')
+ area = SimpleArea([float(pt) for pt in current_extent.split('_')])
except:
- # bad area format
+ # bad extent format
return HttpResponse(default_message)
# if not force and area.isIn(SimpleArea(cookie.AREA):return
categories = area.getCategories(status)
@@ -440,9 +448,9 @@ def getAvailableCategories(request, area_name=None, area=None, status='A',
categories = sorted(categories, key=get_cat_order)
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,
- context_instance=RequestContext(request))
+ context_data['sub_categories'] = subcategories
+ return render_to_response('chimere/blocks/categories.html', context_data,
+ context_instance=RequestContext(request))
def getTinyfiedUrl(parameters, area_name=''):
'''
diff --git a/chimere/widgets.py b/chimere/widgets.py
index c2a6d60..2f4b8e7 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.STATIC_URL+"OpenLayers.js",
+URL_OSM_JS = [settings.STATIC_URL + "chimere/js/OpenLayers.js",
"http://www.openstreetmap.org/openlayers/OpenStreetMap.js"]
def getMapJS(area_name=''):
@@ -37,21 +37,22 @@ def getMapJS(area_name=''):
'''
# projection, center and bounds definitions
js = u"var epsg_display_projection = new OpenLayers.Projection('EPSG:%d')\
-;\n" % settings.EPSG_DISPLAY_PROJECTION
+;\n" % settings.CHIMERE_EPSG_DISPLAY_PROJECTION
+ js += u"OpenLayers.ImgPath = '%schimere/img/';\n" % settings.STATIC_URL
js += u"var epsg_projection = new OpenLayers.Projection('EPSG:%d');\n" % \
- settings.EPSG_PROJECTION
+ settings.CHIMERE_EPSG_PROJECTION
js += u"var centerLonLat = new OpenLayers.LonLat(%f,\
%f).transform(epsg_display_projection, epsg_projection);\n" % \
- settings.DEFAULT_CENTER
+ settings.CHIMERE_DEFAULT_CENTER
js += u"var media_path = '%s';\n" % settings.STATIC_URL
- js += u"var map_layer = %s;\n" % settings.MAP_LAYER
+ js += u"var map_layer = %s;\n" % settings.CHIMERE_MAP_LAYER
js += u"var restricted_extent;\n"
if area_name:
js += u"var area_name='%s';\n" % area_name
- if settings.RESTRICTED_EXTENT:
+ if settings.CHIMERE_RESTRICTED_EXTENT:
restricted_extent_str = [str(coord) \
- for coord in settings.RESTRICTED_EXTENT]
+ for coord in settings.CHIMERE_RESTRICTED_EXTENT]
js += u"restricted_extent = new OpenLayers.Bounds(%s);\n" %\
", ".join(restricted_extent_str)
js = u"""<script type="text/javascript"><!--
@@ -65,7 +66,7 @@ class TextareaWidget(forms.Textarea):
"""
class Media:
js = ["%stiny_mce.js" % settings.TINYMCE_URL,
- "%stextareas.js" % settings.STATIC_URL,]
+ "%schimere/js/textareas.js" % settings.STATIC_URL,]
class PointChooserWidget(forms.TextInput):
"""
@@ -73,10 +74,10 @@ class PointChooserWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
+ "all": URL_OSM_CSS + ["%schimere/css/forms.css" % settings.STATIC_URL,]
}
- js = URL_OSM_JS + ["%sedit_map.js" % settings.STATIC_URL,
- "%sbase.js" % settings.STATIC_URL,]
+ js = URL_OSM_JS + ["%schimere/js/edit_map.js" % settings.STATIC_URL,
+ "%schimere/js/base.js" % settings.STATIC_URL,]
def render(self, name, value, attrs=None, area_name=''):
'''
@@ -97,7 +98,7 @@ class PointChooserWidget(forms.TextInput):
else:
value = None
tpl = getMapJS(area_name)
- tpl += u'<script src="%sedit_map.js"></script>\n' % settings.STATIC_URL
+ tpl += u'<script src="%schimere/js/edit_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 +142,10 @@ class RouteChooserWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
+ "all": URL_OSM_CSS + ["%schimere/css/forms.css" % settings.STATIC_URL,]
}
- js = ["%sedit_route_map.js" % settings.STATIC_URL,
- "%sbase.js" % settings.STATIC_URL,] + URL_OSM_JS
+ js = ["%schimere/js/edit_route_map.js" % settings.STATIC_URL,
+ "%schimere/js/base.js" % settings.STATIC_URL,] + URL_OSM_JS
def render(self, name, value, attrs=None, area_name='', routefile_id=None):
'''
@@ -249,10 +250,10 @@ class AreaWidget(forms.TextInput):
"""
class Media:
css = {
- "all": URL_OSM_CSS + ["%sforms.css" % settings.STATIC_URL,]
+ "all": URL_OSM_CSS + ["%schimere/css/forms.css" % settings.STATIC_URL,]
}
- js = URL_OSM_JS + ["%sedit_area.js" % settings.STATIC_URL,
- "%sbase.js" % settings.STATIC_URL,]
+ js = URL_OSM_JS + ["%schimere/js/edit_area.js" % settings.STATIC_URL,
+ "%schimere/js/base.js" % settings.STATIC_URL,]
def render(self, name, value, attrs=None):
"""
@@ -318,13 +319,14 @@ class AreaField(forms.MultiValueField):
class MultiSelectWidget(forms.SelectMultiple):
class Media:
css = {'all': (
- settings.STATIC_URL + 'jquery/bsmSelect/css/jquery.bsmselect.css',
- settings.STATIC_URL + 'jquery/css/jquery.bsmselect.custom.css',
+ settings.STATIC_URL + 'chimere/js/jquery/bsmSelect/css/jquery.bsmselect.css',
+ settings.STATIC_URL + 'chimere/js/jquery/bsmSelect/css/jquery.bsmselect.custom.css',
)
}
js = (
- settings.STATIC_URL + 'jquery/bsmSelect/js/jquery.bsmselect.js',
- settings.STATIC_URL + 'jquery/bsmSelect/js/jquery.bsmselect.compatibility.js',
+ settings.JQUERY_URL,
+ settings.STATIC_URL + 'chimere/js/jquery/bsmSelect/js/jquery.bsmselect.js',
+ settings.STATIC_URL + 'chimere/js/jquery/bsmSelect/js/jquery.bsmselect.compatibility.js',
)
def render(self, name, value, attrs=None):
diff --git a/example_project/settings.py.example b/example_project/settings.py.example
index c9a3934..f7fe697 100644
--- a/example_project/settings.py.example
+++ b/example_project/settings.py.example
@@ -12,45 +12,51 @@ 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"
+TINYMCE_URL = '/tinymce/'
+JQUERY_URL = '/javascript/jquery/jquery.js'
GPSBABEL = '/usr/bin/gpsbabel'
GPSBABEL_OPTIONS = 'simplify,crosstrack,error=0.005k' # simplify with an
# error of 5 meters
#GPSBABEL_OPTIONS = 'simplify,count=100'
## chimere specific ##
+CHIMERE_DEFAULT_ZOOM = 10
# center of the map
-DEFAULT_CENTER = (-1.679444, 48.114722)
+CHIMERE_DEFAULT_CENTER = (-1.679444, 48.114722)
# projection used by the main map
# most public map providers use spherical mercator : 900913
-EPSG_PROJECTION = 900913
+CHIMERE_EPSG_PROJECTION = 900913
# projection displayed to the end user by openlayers
# chimere use the same projection to save its data in the database
-EPSG_DISPLAY_PROJECTION = 4326
+CHIMERE_EPSG_DISPLAY_PROJECTION = 4326
# to restrict the map to a defined bounding box set it here
# (left, bottom, right, top)
-RESTRICTED_EXTENT = None
+CHIMERE_RESTRICTED_EXTENT = None
# dynamic load of categories on the main map
-DYNAMIC_CATEGORIES = False
+CHIMERE_DYNAMIC_CATEGORIES = False
# display of shortcuts for areas
-DISPLAY_AREAS = True
+CHIMERE_DISPLAY_AREAS = True
# specific css for areas
-CSS_AREAS = True
+CHIMERE_CSS_AREAS = True
# number of day before an event to display
# if equal to 0: disable event management
# if you change this value from 0 to a value in a production environnement
# don't forget to run the upgrade.py script to create appropriate fields in
# the database
-DAYS_BEFORE_EVENT = 30
+CHIMERE_DAYS_BEFORE_EVENT = 30
+
+CHIMERE_ICON_WIDTH = 34
+CHIMERE_ICON_HEIGHT = 38
+CHIMERE_ICON_OFFSET_X = -17
+CHIMERE_ICON_OFFSET_Y = -38
# default id category to check on the map
-DEFAULT_CATEGORIES = [1]
+CHIMERE_DEFAULT_CATEGORIES = [1]
# JS definition of the main map cf. OpenLayers documentation for more details
#MAP_LAYER = '''new OpenLayers.Layer.OSM.CycleMap("Cycle map", {
#displayOutsideMaxExtent: true, wrapDateLine: true})''' # OSM cyclemap
-MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map
+CHIMERE_MAP_LAYER = "new OpenLayers.Layer.OSM.Mapnik('Mapnik')" # OSM mapnik map
DEBUG = True
TEMPLATE_DEBUG = DEBUG