diff options
Diffstat (limited to 'chimere/main/admin.py')
-rw-r--r-- | chimere/main/admin.py | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/chimere/main/admin.py b/chimere/main/admin.py index 195e7c4..31c9d5c 100644 --- a/chimere/main/admin.py +++ b/chimere/main/admin.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2008 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2008-2010 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as @@ -29,6 +29,19 @@ from chimere.main.widgets import TextareaWidget from django.contrib import admin +def get_areas_for_user(user): + """ + Getting subcats for a specific user + """ + perms = user.get_all_permissions() + areas = set() + prefix = 'main.change_area_' + for perm in perms: + if perm.startswith(prefix): + area = Area.objects.get(urn=perm[len(prefix):]) + areas.add(area) + return areas + class MarkerAdmin(admin.ModelAdmin): """ Specialized the Point field. @@ -38,6 +51,19 @@ class MarkerAdmin(admin.ModelAdmin): list_filter = ('status', 'subcategory') form = MarkerAdminForm + def queryset(self, request): + qs = self.model._default_manager.get_query_set() + if not request.user.is_superuser: + areas = get_areas_for_user(request.user) + if not areas: + return self.model.objects.extra(where=['1=0']) + in_areas = " or ".join([area.getIncludeSql() for area in areas]) + qs = qs.extra(where=[in_areas]) + ordering = self.ordering or () + if ordering: + qs = qs.order_by(*ordering) + return qs + class RouteAdmin(admin.ModelAdmin): """ Specialized the Route field. @@ -47,6 +73,20 @@ class RouteAdmin(admin.ModelAdmin): list_filter = ('status', 'subcategory') form = RouteAdminForm + def queryset(self, request): + qs = self.model._default_manager.get_query_set() + if not request.user.is_superuser: + areas = get_areas_for_user(request.user) + if not areas: + return self.model.objects.extra(where=['1=0']) + in_areas = " or ".join([area.getIncludeSql( + geometry='"main_route".route') for area in areas]) + qs = qs.extra(where=[in_areas]) + ordering = self.ordering or () + if ordering: + qs = qs.order_by(*ordering) + return qs + class AreaAdmin(admin.ModelAdmin): """ Specialized the area field. |