diff options
Diffstat (limited to 'chimere/views.py')
-rw-r--r-- | chimere/views.py | 145 |
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: |