summaryrefslogtreecommitdiff
path: root/chimere/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/views.py')
-rw-r--r--chimere/views.py145
1 files changed, 99 insertions, 46 deletions
diff --git a/chimere/views.py b/chimere/views.py
index 9ecd240..7274bf0 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -47,7 +47,7 @@ from django.views.generic import TemplateView, ListView
from chimere.actions import actions
from chimere.models import Category, SubCategory, PropertyModel, Page,\
Marker, Route, Polygon, SimpleArea, Area, Color, TinyUrl, RouteFile,\
- AggregatedRoute
+ AggregatedRoute, AggregatedPolygon
from chimere.widgets import PointChooserWidget, RouteChooserWidget, AreaWidget,\
PolygonChooserWidget
@@ -185,7 +185,8 @@ def index(request, area_name=None, default_area=None, simple=False,
'error_message': '',
'is_map': True,
'news_visible': news_visible,
- 'areas_visible': settings.CHIMERE_DISPLAY_AREAS,
+ 'areas_visible': settings.CHIMERE_DISPLAY_AREAS
+ and Area.objects.filter(available=True).count() > 1,
'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER,
'dynamic_categories': response_dct['dynamic_categories'],
'zoomout': zoomout,
@@ -208,6 +209,19 @@ def index(request, area_name=None, default_area=None, simple=False,
context_instance=RequestContext(request))
+def edit(request, area_name="", item_id=None, submited=False):
+ """
+ Edition page
+ """
+ response_dct, redir = get_base_response(request, area_name)
+ if redir:
+ return redir
+ current_actions = actions(response_dct['area_name'])
+ redir = action_do_redirect('edit-no-page', current_actions)
+ # a redir is always send... or there is a problem
+ return redirect(redir)
+
+
def get_edit_page(redirect_url, item_cls, item_form,
multimediafile_formset=MultimediaFileFormSet,
picturefile_formset=PictureFileFormSet):
@@ -263,7 +277,8 @@ def get_edit_page(redirect_url, item_cls, item_form,
request.session.session_key):
inst = init_item
form = item_form(request.POST, request.FILES, instance=inst,
- subcategories=listed_subcats)
+ subcategories=listed_subcats,
+ area_name=area_name)
formset_multi = multimediafile_formset(
request.POST, request.FILES, initial=init_multi,
prefix='multimedia')
@@ -318,7 +333,8 @@ def get_edit_page(redirect_url, item_cls, item_form,
u"There are missing field(s)"
u" and/or errors in the submited form.")
else:
- form = item_form(instance=init_item, subcategories=listed_subcats)
+ form = item_form(instance=init_item, subcategories=listed_subcats,
+ area_name=area_name)
formset_multi = multimediafile_formset(initial=init_multi,
prefix='multimedia')
formset_picture = picturefile_formset(initial=init_picture,
@@ -327,10 +343,28 @@ def get_edit_page(redirect_url, item_cls, item_form,
formset_picture), subcategories
return func
-get_edit_marker = get_edit_page('chimere:edit', Marker, MarkerForm)
+def action_do_redirect(action_name, available_actions):
+ # redirect to an edit
+ is_edit = 'edit' in action_name
+ redir = None
+ for action, subactions in available_actions:
+ if action.id == action_name:
+ return
+ if not redir and action.id != action_name:
+ redir = action.url
+ for subaction in subactions:
+ if subaction.id == action_name:
+ return
+ if is_edit and 'edit' not in redir \
+ and 'edit' in subaction.id:
+ redir = subaction.url
+ return redir
-def edit(request, area_name="", item_id=None, submited=False):
+get_edit_marker = get_edit_page('chimere:editmarker', Marker, MarkerForm)
+
+
+def editMarker(request, area_name="", item_id=None, submited=False):
"""
Edition page
"""
@@ -340,17 +374,26 @@ def edit(request, area_name="", item_id=None, submited=False):
return response
item_id, init_item, response_dct, form, formset_multi, formset_picture = \
values
+
+ # verify action is available
+ current_actions = actions(response_dct['area_name'])
+ redir = action_do_redirect('edit-marker', current_actions)
+ if redir:
+ return redirect(redir)
+
# get the "manualy" declared_fields. Ie: properties
- declared_fields = form.declared_fields.keys()
- declared_fields = PropertyModel.objects.filter(available=True).all()
- filtered_properties = PropertyModel.objects.filter(
- available=True, subcategories__id__isnull=False).all()
+ querys = PropertyModel.getAvailable(area_name=area_name)
+ declared_fields, filtered_properties = [], []
+ for query in querys:
+ declared_fields += query.all()
+ filtered_properties += query.filter(
+ subcategories__id__isnull=False).all()
point_value = init_item.point if init_item else None
if request.POST and request.POST.get('point'):
point_value = request.POST.get('point')
response_dct.update({
- 'actions': actions(response_dct['area_name']),
- 'action_selected': ('contribute', 'edit'),
+ 'actions': current_actions,
+ 'action_selected': ('contribute', 'edit-marker'),
'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER,
'form': form,
'formset_multi': formset_multi,
@@ -454,6 +497,12 @@ def editRoute(request, area_name="", item_id=None, submited=False):
item_id, init_item, response_dct, form, formset_multi, formset_picture = \
values
+ # verify action is available
+ current_actions = actions(response_dct['area_name'])
+ redir = action_do_redirect('edit-route', current_actions)
+ if redir:
+ return redirect(redir)
+
# get the "manualy" declared_fields. Ie: properties
declared_fields = form.declared_fields.keys()
if 'description' in declared_fields:
@@ -462,7 +511,7 @@ def editRoute(request, area_name="", item_id=None, submited=False):
if request.POST and request.POST.get('route'):
route_value = request.POST.get('route')
response_dct.update({
- 'actions': actions(response_dct['area_name']),
+ 'actions': current_actions,
'action_selected': ('contribute', 'edit-route'),
'error_message': '',
'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER,
@@ -492,19 +541,30 @@ def editPolygon(request, area_name="", item_id=None, submited=False):
Polygon edition page
"""
response, values, sub_categories = get_edit_polygon(request, area_name,
- item_id, ['R', 'B'])
+ item_id, ['P'])
if response:
return response
item_id, init_item, response_dct, form, formset_multi, formset_picture = \
values
+ # verify action is available
+ current_actions = actions(response_dct['area_name'])
+ redir = action_do_redirect('edit-polygon', current_actions)
+ if redir:
+ return redirect(redir)
+
# get the "manualy" declared_fields. Ie: properties
- declared_fields = form.declared_fields.keys()
+ querys = PropertyModel.getAvailable(area_name=area_name)
+ declared_fields, filtered_properties = [], []
+ for query in querys:
+ declared_fields += query.all()
+ filtered_properties += query.filter(
+ subcategories__id__isnull=False).all()
polygon_value = init_item.polygon if init_item else None
if request.POST and request.POST.get('polygon'):
polygon_value = request.POST.get('polygon')
response_dct.update({
- 'actions': actions(response_dct['area_name']),
+ 'actions': current_actions,
'action_selected': ('contribute', 'edit-polygon'),
'error_message': '',
'map_layer': settings.CHIMERE_DEFAULT_MAP_LAYER,
@@ -517,6 +577,7 @@ def editPolygon(request, area_name="", item_id=None, submited=False):
'polygon_widget': PolygonChooserWidget().render(
'polygon', polygon_value, area_name=response_dct['area_name'],),
'properties': declared_fields,
+ 'filtered_properties': filtered_properties,
'submited': submited
})
# manualy populate the custom widget
@@ -608,6 +669,10 @@ def extraPage(request, area_name="", page_id=""):
context_instance=RequestContext(request))
+def getDetailUndefined(request, area_name):
+ return HttpResponse('')
+
+
def getDetail(request, area_name, key):
'''
Get the detail of a geographic item
@@ -647,6 +712,7 @@ def getDetail(request, area_name, key):
response_dct['dated'] = settings.CHIMERE_DAYS_BEFORE_EVENT \
and marker.start_date
response_dct['routing_enabled'] = settings.CHIMERE_ENABLE_ROUTING
+ response_dct['properties'] = marker.getProperties(area_name=area_name)
return render_to_response('chimere/detail.html', response_dct,
context_instance=RequestContext(request))
@@ -683,7 +749,8 @@ def checkDate(q):
def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
- item_types=('Marker', 'Route', 'Polygon')):
+ aggregated=False, item_types=('Marker', 'Route',
+ 'Polygon')):
'''
Get geo objects
'''
@@ -714,36 +781,22 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
return empty
category_ids = [int(cat_id) for cat_id in category_ids]
- if getjson:
- current_cat, colors, idx = None, None, 0
- for polygon in query.all():
- color, inner_color = "", ""
- if polygon.inner_color:
- inner_color = polygon.inner_color
- if polygon.color:
- color = polygon.color
- else:
- c_cat = None
- for cat in polygon.categories.all():
- if cat.id in category_ids:
- c_cat = cat
- break
- if c_cat and not current_cat or current_cat != c_cat:
- idx = 0
- current_cat = c_cat
- colors = list(Color.objects.filter(
- color_theme=c_cat.color_theme))
- if colors:
- color = colors[idx % len(colors)].code
- idx += 1
- else:
- color = "#000"
- if not inner_color:
- inner_color = "rgba(180, 180, 180, 0.3)"
- items.append(json.loads(polygon.getGeoJSON(
- color=color, inner_color=inner_color)))
+ if aggregated:
+ query = AggregatedPolygon.objects.filter(
+ status__in=status, subcategory__in=category_ids).order_by(
+ 'subcategory', '-pk')
+ if getjson:
+ for poly in query.all():
+ items.append(json.loads(poly.getGeoJSON()))
+ else:
+ items += list(query)
else:
- items += list(query)
+ if getjson:
+ current_cat, colors, idx = None, None, 0
+ items += Polygon.getGeoJSONs(
+ query, limit_to_categories=category_ids)
+ else:
+ items += list(query)
# routes
if 'Route' in item_types: