diff options
-rw-r--r-- | chimere/forms.py | 35 | ||||
-rw-r--r-- | chimere/migrations/0001_initial.py | 6 | ||||
-rw-r--r-- | chimere/models.py | 46 | ||||
-rw-r--r-- | chimere/templates/base.html | 3 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/categories.html | 2 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/head.html | 26 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/map_params.html | 2 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 10 | ||||
-rw-r--r-- | chimere/urls.py | 2 | ||||
-rw-r--r-- | chimere/views.py | 114 | ||||
-rw-r--r-- | chimere/widgets.py | 46 | ||||
-rw-r--r-- | example_project/settings.py.example | 30 |
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 |