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: | 
