diff options
-rw-r--r-- | chimere/admin.py | 34 | ||||
-rw-r--r-- | chimere/models.py | 2 | ||||
-rw-r--r-- | chimere/tests.py | 40 |
3 files changed, 59 insertions, 17 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 5a95ece..fb3b15c 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -231,6 +231,25 @@ class HasCategoriesListFilter(SimpleListFilter): return queryset.exclude(categories__isnull=True) return queryset + +def moderator_right(user, qs, geo_type='marker'): + if user.is_superuser: + return qs + areas = get_areas_for_user(user) + if areas: + contained = Q() + for area in areas: + if geo_type == 'marker': + contained = contained | area.getIncludeMarker() + elif geo_type == 'route': + contained = contained | area.getIncludeRoute() + qs = qs.filter(contained) + if user.subcategory_limit_to.count(): + qs = qs.filter(categories__in=SubCategory.objects.filter( + limited_for_user__user=user).all()) + return qs + + class MarkerAdmin(admin.ModelAdmin): """ Specialized the Point field. @@ -283,12 +302,7 @@ class MarkerAdmin(admin.ModelAdmin): 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) - contained = Q() - for area in areas: - contained = contained | area.getIncludeMarker() - qs = qs.filter(contained) + qs = moderator_right(request.user, qs, geo_type='marker') ordering = self.ordering or () if ordering: qs = qs.order_by(*ordering) @@ -311,6 +325,7 @@ class MarkerAdmin(admin.ModelAdmin): ) return my_urls + urls + class RouteAdmin(MarkerAdmin): """ Specialized the Route field. @@ -348,12 +363,7 @@ class RouteAdmin(MarkerAdmin): 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) - contained = Q() - for area in areas: - contained = contained | area.getIncludeRoute() - qs = qs.filter(contained) + qs = moderator_right(request.user, qs, geo_type='route') ordering = self.ordering or () if ordering: qs = qs.order_by(*ordering) diff --git a/chimere/models.py b/chimere/models.py index f333589..755d43c 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -317,7 +317,7 @@ class SubCategoryUserLimit(models.Model): """ subcategory = models.ForeignKey( SubCategory, related_name='limited_for_user') - user = models.ForeignKey(User, related_name='subcategory_limit') + user = models.ForeignKey(User, related_name='subcategory_limit_to') def __unicode__(self): return u"{} / {}".format(self.user, self.subcategory) diff --git a/chimere/tests.py b/chimere/tests.py index 369fe6b..1c950fc 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -8,7 +8,7 @@ import simplejson as json test_path = os.path.abspath(__file__) test_dir_path = os.path.dirname(test_path) + os.sep -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from django.contrib.gis.geos import GEOSGeometry from django.core.files import File from django.core.urlresolvers import reverse @@ -16,7 +16,7 @@ from django.template import Context from django.test import TestCase from chimere.models import Area, Icon, Importer, Category, SubCategory, \ - Marker, Route, News + Marker, Route, News, SubCategoryUserLimit from chimere.forms import MarkerForm, AreaAdminForm from chimere.templatetags.chimere_tags import display_news from chimere.utils import ShapefileManager @@ -370,12 +370,27 @@ class FeedsTest(TestCase): class AdminTest(TestCase): def setUp(self): self.areas = areas_setup() - self.markers = marker_setup() + self.subcategories = subcategory_setup() + self.markers = marker_setup(self.subcategories) self.adminuser = User.objects.create_superuser( 'admin', 'admin@test.com', 'pass') - self.client.login(username='admin', password='pass') + self.moderation_user = User.objects.create_user( + 'mod_1', 'mod1@test.com', 'pass') + self.moderation_user.is_staff = True + self.moderation_user.save() + self.moderation_user2 = User.objects.create_user( + 'mod_2', 'mod2@test.com', 'pass') + self.moderation_user2.is_staff = True + self.moderation_user2.save() + SubCategoryUserLimit.objects.create( + subcategory=self.subcategories[0], + user=self.moderation_user2) + for g in Group.objects.all(): + g.user_set.add(self.moderation_user) + g.user_set.add(self.moderation_user2) def test_actions(self): + self.client.login(username='admin', password='pass') q_markers = Marker.objects.filter(pk__in=[m.pk for m in self.markers]) # disable self.client.post( @@ -394,6 +409,23 @@ class AdminTest(TestCase): self.assertEqual(q_markers.count(), q_markers.filter(status='A').count()) + def test_moderation_action_filter(self): + m_ok = self.markers[0] + m_nok = self.markers[2] + self.client.login(username='mod_1', password='pass') + response = self.client.get('/admin/chimere/marker/{}/'.format(m_ok.pk)) + self.assertEqual(200, response.status_code) + response = self.client.get( + '/admin/chimere/marker/{}/'.format(m_nok.pk)) + self.assertEqual(200, response.status_code) + self.client.logout() + self.client.login(username='mod_2', password='pass') + response = self.client.get('/admin/chimere/marker/{}/'.format(m_ok.pk)) + self.assertEqual(200, response.status_code) + response = self.client.get( + '/admin/chimere/marker/{}/'.format(m_nok.pk)) + self.assertEqual(404, response.status_code) + class MarkerFormTest(TestCase): def setUp(self): |