summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/admin.py34
-rw-r--r--chimere/models.py2
-rw-r--r--chimere/tests.py40
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):