diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-07 13:04:10 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-07 13:04:47 +0200 |
commit | 55a09a3c8f6446475b7a9c9693f19e5fb8830509 (patch) | |
tree | b614d1f5be7b25ef67fb7d4397dd9a96fb91201d | |
parent | 7f06e73b305f7abcfcfd2968f65649f75b9d1a75 (diff) | |
download | Chimère-55a09a3c8f6446475b7a9c9693f19e5fb8830509.tar.bz2 Chimère-55a09a3c8f6446475b7a9c9693f19e5fb8830509.zip |
Reactivate categories filtering by area
-rw-r--r-- | chimere/forms.py | 8 | ||||
-rw-r--r-- | chimere/models.py | 22 | ||||
-rw-r--r-- | chimere/static/chimere/css/styles.css | 6 | ||||
-rw-r--r-- | chimere/static/chimere/img/layer-switcher-maximize.png | bin | 594 -> 566 bytes | |||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 5 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/map_params.html | 1 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 2 | ||||
-rw-r--r-- | chimere/views.py | 30 |
8 files changed, 51 insertions, 23 deletions
diff --git a/chimere/forms.py b/chimere/forms.py index 84ae27b..ed6b5d7 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -125,10 +125,14 @@ class MarkerAdminFormBase(forms.ModelForm): keys['initial'].update(property_dct) else: keys['initial'] = property_dct + subcategories = keys.pop('subcategories') \ + if 'subcategories' in keys else [] super(MarkerAdminFormBase, self).__init__(*args, **keys) if settings.CHIMERE_DAYS_BEFORE_EVENT: self.fields['start_date'].widget = DatePickerWidget() self.fields['end_date'].widget = DatePickerWidget() + if subcategories: + self.fields['categories'].choices = subcategories def clean(self): ''' @@ -203,10 +207,14 @@ class RouteAdminForm(forms.ModelForm): keys['initial'].update(property_dct) else: keys['initial'] = property_dct + subcategories = keys.pop('subcategories') \ + if 'subcategories' in keys else [] super(RouteAdminForm, self).__init__(*args, **keys) if settings.CHIMERE_DAYS_BEFORE_EVENT: self.fields['start_date'].widget = DatePickerWidget() self.fields['end_date'].widget = DatePickerWidget() + if subcategories: + self.fields['categories'].choices = subcategories def save(self, *args, **keys): """ diff --git a/chimere/models.py b/chimere/models.py index 5fe213b..8b508a9 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -179,9 +179,6 @@ class SubCategory(models.Model): # if there some restrictions with categories limit them if area.subcategories.count(): sub_ids = [sub.id for sub in area.subcategories.all()] - # if no area is defined for a category don't filter it - sub_ids += [sub.id for sub in subcategories - if not sub.areas.count()] subcategories = subcategories.filter(id__in=sub_ids) for sub_category in subcategories: if sub_category.category not in sub_categories: @@ -715,10 +712,21 @@ class SimpleArea: return True return False - def getCategories(self, status='A', filter_available=True): + def getCategories(self, status='A', filter_available=True, area_name=None): """ Get categories for this area """ + wheres = [] + if area_name: + subcategory_pks = [] + for cat, subcats in SubCategory.getAvailable(area_name=area_name): + for subcat in subcats: + subcategory_pks.append(unicode(subcat.pk)) + if filter_available: + wheres += ['subcat.available = TRUE', 'cat.available = TRUE'] + wheres += ['subcat.id in (%s)' % ",".join(subcategory_pks)] + where = " where " + " and ".join(wheres) if wheres else "" + equal_status = '' if len(status) == 1: equal_status = "='%s'" % status[0] @@ -747,8 +755,7 @@ class SimpleArea: sql += ''' inner join chimere_marker_categories mc on mc.subcategory_id=subcat.id and mc.marker_id=mark.id''' - if filter_available: - sql += ' where subcat.available = TRUE and cat.available = TRUE' + sql += where subcats = set(SubCategory.objects.raw(sql)) sql = sql_main + ''' inner join chimere_route rt on (ST_Intersects(%s, rt.route) or @@ -759,8 +766,7 @@ class SimpleArea: sql += ''' inner join chimere_route_categories rc on rc.subcategory_id=subcat.id and rc.route_id=rt.id''' - if filter_available: - sql += ' where subcat.available = TRUE and cat.available = TRUE' + sql += where subcats.union(SubCategory.objects.raw(sql)) return subcats diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 1c5d923..8f0316a 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -24,14 +24,14 @@ h2, h3, th, .action li, .action li a, color:#333; } -/* backgroundcolor definition */ +/* background-color definition */ body, h2, h3, th, .ui-widget-header, .action li.selected, #content .olControlLayerSwitcher .layersDiv, #content .olControlLayerSwitcher span{ - background-color:#4ea30d; + background-color:#449506; } .ui-widget-header{ @@ -254,7 +254,7 @@ ul#action-2 { #utils-div{ left:28px; - bottom:20px; + bottom:50px; padding:0.3em; padding-right:1.4em; width:auto; diff --git a/chimere/static/chimere/img/layer-switcher-maximize.png b/chimere/static/chimere/img/layer-switcher-maximize.png Binary files differindex f23bef8..8b1e686 100644 --- a/chimere/static/chimere/img/layer-switcher-maximize.png +++ b/chimere/static/chimere/img/layer-switcher-maximize.png diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index f395333..565ad27 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -44,6 +44,7 @@ See the file COPYING for details. dynamic_categories: false, display_submited: false, display_feature: null, + area_id: null, checked_categories: [], zoom: null, lat: null, @@ -237,7 +238,9 @@ See the file COPYING for details. current_extent = current_extent.toArray().join('_') current_extent = current_extent.replace(/\./g, 'D'); current_extent = current_extent.replace(/-/g, 'M'); - var uri = extra_url + "getAvailableCategories/"; + var uri = extra_url + if (settings.area_id) uri += settings.area_id + "/"; + uri += "getAvailableCategories/"; var params = {"current_extent": current_extent} if (settings.display_submited) params["status"] = "A_S"; $.ajax({url: uri, diff --git a/chimere/templates/chimere/blocks/map_params.html b/chimere/templates/chimere/blocks/map_params.html index 794798b..5ba7145 100644 --- a/chimere/templates/chimere/blocks/map_params.html +++ b/chimere/templates/chimere/blocks/map_params.html @@ -17,6 +17,7 @@ {% 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 %}; var p_current_feature{% if p_current_feature %} = {{ p_current_feature }}{% endif %}; + {% if area_id %}chimere_init_options['area_id'] = "{{area_id}}";{% endif %} $("#map").chimere(chimere_init_options); {% if zoom %} $('#maps').chimere('zoom', {'area':{{zoom}} }); diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index 11ef3bc..ec713b9 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -111,6 +111,8 @@ def map_params(context): context_data['icon_height'] = settings.CHIMERE_ICON_HEIGHT area_name = context['area_name'] if 'area_name' in context else 'area_name' context_data['map_layers'] = ", ".join(get_map_layers(area_name)) + if area_name: + context_data['area_id'] = area_name if area_name and 'zoomout' in context and context['zoomout']: try: area = Area.objects.get(urn=area_name) diff --git a/chimere/views.py b/chimere/views.py index a9c0480..5acf369 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -110,9 +110,14 @@ def get_edit_page(redirect_url, item_cls, item_form): """ Edition page """ - def func(request, area_name="", item_id=None): + def func(request, area_name="", item_id=None, subcategories=[]): response_dct = get_base_response(area_name) + listed_subcats = [] + if subcategories: + for cat, subcats in subcategories: + listed_subcats.append((unicode(cat), + [(subcat.pk, subcat.name) for subcat in subcats])) # if an item_id is provided: modification init_item, ref_item = None, None if item_id: @@ -138,7 +143,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) + form = item_form(request.POST, request.FILES, instance=inst, + subcategories=listed_subcats) formset_multi = MultimediaFileFormSet(request.POST, request.FILES, initial=init_multi, prefix='multimedia') formset_picture = PictureFileFormSet(request.POST, request.FILES, @@ -179,7 +185,7 @@ def get_edit_page(redirect_url, item_cls, item_form): response_dct['error_message'] = _(u"There are missing field(s)" u" and/or errors in the submited form.") else: - form = item_form(instance=init_item) + form = item_form(instance=init_item, subcategories=listed_subcats) formset_multi = MultimediaFileFormSet(initial=init_multi, prefix='multimedia') formset_picture = PictureFileFormSet(initial=init_picture, @@ -194,7 +200,9 @@ def edit(request, area_name="", item_id=None, submited=False): """ Edition page """ - response, values = get_edit_marker(request, area_name, item_id) + sub_categories = SubCategory.getAvailable(['M', 'B'], area_name) + response, values = get_edit_marker(request, area_name, item_id, + subcategories=sub_categories) if response: return response item_id, init_item, response_dct, form, formset_multi, formset_picture = \ @@ -212,8 +220,7 @@ def edit(request, area_name="", item_id=None, submited=False): 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT, 'extra_head':form.media, 'marker_id':item_id, - 'sub_categories':SubCategory.getAvailable(['M', 'B'], - area_name), + 'sub_categories':sub_categories, 'point_widget':PointChooserWidget().render('point', init_item.point if init_item else None, area_name=area_name), @@ -294,7 +301,9 @@ def editRoute(request, area_name="", item_id=None, submited=False): """ Route edition page """ - response, values = get_edit_route(request, area_name, item_id) + sub_categories = SubCategory.getAvailable(['M', 'B'], area_name) + response, values = get_edit_route(request, area_name, item_id, + subcategories=sub_categories) if response: return response item_id, init_item, response_dct, form, formset_multi, formset_picture = \ @@ -312,8 +321,7 @@ def editRoute(request, area_name="", item_id=None, submited=False): 'formset_picture':formset_picture, 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT, 'extra_head':form.media, - 'sub_categories':SubCategory.getAvailable(['R', 'B'], - area_name), + 'sub_categories':sub_categories, 'route_widget':RouteChooserWidget().render('route', init_item.route if init_item else None, area_name=area_name, routefile_id='',), @@ -492,7 +500,7 @@ def get_available_categories(request, area_name=None, area=None, status='A', 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() + subcategories = SubCategory.getAvailable(area_name=area_name) context_data['sub_categories'] = subcategories return render_to_response('chimere/blocks/categories.html', context_data, context_instance=RequestContext(request)) @@ -509,7 +517,7 @@ def get_available_categories(request, area_name=None, area=None, status='A', # bad extent format return HttpResponse(default_message) # if not force and area.isIn(SimpleArea(cookie.AREA):return - categories = area.getCategories(status) + categories = area.getCategories(status, area_name=area_name) if not categories: return HttpResponse(default_message) get_cat = lambda subcat: subcat.category |