summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/forms.py51
-rw-r--r--chimere/tests.py32
2 files changed, 75 insertions, 8 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index e1af9d1..4744dd2 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -25,6 +25,7 @@ from django import forms
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse
+from django.db.models import Q
from django.forms.formsets import formset_factory
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Permission, ContentType
@@ -36,7 +37,8 @@ if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and \
from chimere.models import Marker, Route, PropertyModel, Area,\
News, Category, RouteFile, MultimediaFile, MultimediaType, \
- PictureFile, Importer, PropertyModelChoice, Page, IMPORTER_CHOICES
+ PictureFile, Importer, PropertyModelChoice, Page, IMPORTER_CHOICES, \
+ get_areas_for_user, SubCategoryUserLimit
from chimere.widgets import AreaField, PointField, TextareaWidget, \
FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget,\
TextareaAdminWidget, ImportFiltrWidget, ImporterChoicesWidget, RE_XAPI
@@ -61,14 +63,48 @@ class UTC(tzinfo):
def getStaffEmails():
return [u.email for u in User.objects.filter(
- is_staff=True).exclude(email="").order_by('id')]
+ is_superuser=True).exclude(email="").order_by('id')]
+
+
+def getRelevantModeratorEmails(geo_object):
+ categories = list(geo_object.categories.all())
+ # q = Q(is_staff=True) & (
+ # Q(subcategory_limit_to__count=0) |
+ # Q(subcategory_limit_to__subcategory__in=categories))
+ q1 = Q(is_staff=True) & (
+ Q(subcategory_limit_to__subcategory__in=categories))
+ qusers = list(User.objects.filter(q1).exclude(email="").all())
+ q2 = Q(is_staff=True)
+ qusers += list(User.objects.filter(q2).exclude(
+ email="").exclude(pk__in=[
+ sl.user.pk for sl in SubCategoryUserLimit.objects.all()]).all())
+ users = []
+ for user in qusers:
+ areas = get_areas_for_user(user)
+ if not areas:
+ users.append(user)
+ continue
+ contained = Q()
+ qs = geo_object.__class__.objects.filter(pk=geo_object.pk)
+ for area in areas:
+ if hasattr(geo_object, 'point'):
+ contained = contained | area.getIncludeMarker()
+ elif hasattr(geo_object, 'route'):
+ contained = contained | area.getIncludeRoute()
+ qs = qs.filter(contained)
+ if qs.count():
+ users.append(user)
+ lst = [u.email for u in users]
+ return lst
def notifyStaff(subject, body, sender=None):
- if not settings.EMAIL_HOST:
- return
user_list = getStaffEmails()
- if not user_list:
+ notifyByEmail(subject, body, user_list, sender)
+
+
+def notifyByEmail(subject, body, user_list, sender=None):
+ if not settings.EMAIL_HOST or not user_list:
return
if settings.PROJECT_NAME:
subject = u'[%s] %s' % (settings.PROJECT_NAME, subject)
@@ -95,7 +131,10 @@ def notifySubmission(absolute_uri, geo_object):
geo_object.__class__.__name__.lower()
message += absolute_uri + reverse(named_url, args=(geo_object.pk,))
message += u"\n\n--\nChimère"
- return notifyStaff(subject, message)
+
+ user_list = getStaffEmails() + getRelevantModeratorEmails(geo_object)
+ user_list = list(set(user_list))
+ return notifyByEmail(subject, message, user_list)
class ContactForm(forms.Form):
diff --git a/chimere/tests.py b/chimere/tests.py
index 1c950fc..578baa6 100644
--- a/chimere/tests.py
+++ b/chimere/tests.py
@@ -10,6 +10,7 @@ test_dir_path = os.path.dirname(test_path) + os.sep
from django.contrib.auth.models import User, Group
from django.contrib.gis.geos import GEOSGeometry
+from django.core import mail
from django.core.files import File
from django.core.urlresolvers import reverse
from django.template import Context
@@ -17,7 +18,7 @@ from django.test import TestCase
from chimere.models import Area, Icon, Importer, Category, SubCategory, \
Marker, Route, News, SubCategoryUserLimit
-from chimere.forms import MarkerForm, AreaAdminForm
+from chimere.forms import MarkerForm, AreaAdminForm, notifySubmission
from chimere.templatetags.chimere_tags import display_news
from chimere.utils import ShapefileManager
@@ -367,7 +368,7 @@ class FeedsTest(TestCase):
self.assertEqual(int(doc.xpath('count(//item)')), 2)
-class AdminTest(TestCase):
+class AdministratorsTest(TestCase):
def setUp(self):
self.areas = areas_setup()
self.subcategories = subcategory_setup()
@@ -389,6 +390,8 @@ class AdminTest(TestCase):
g.user_set.add(self.moderation_user)
g.user_set.add(self.moderation_user2)
+
+class AdminTest(AdministratorsTest):
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])
@@ -427,6 +430,31 @@ class AdminTest(TestCase):
self.assertEqual(404, response.status_code)
+class NotifyTest(AdministratorsTest):
+ def test_notify_email(self):
+ # OK for all: two moderators and superuser
+ m1 = self.markers[0]
+ notifySubmission('dont-care-about-uri-for-tests', m1)
+ out = mail.outbox.pop()
+ self.assertEqual(sorted(out.to),
+ sorted([self.adminuser.email,
+ self.moderation_user.email,
+ self.moderation_user2.email]))
+ # not in the area for both moderators
+ m2 = self.markers[1]
+ notifySubmission('dont-care-about-uri-for-tests', m2)
+ out = mail.outbox.pop()
+ self.assertEqual(out.to, [self.adminuser.email])
+ # not a category followed by moderator2
+ m3 = self.markers[2]
+ notifySubmission('dont-care-about-uri-for-tests', m3)
+ out = mail.outbox.pop()
+ self.assertEqual(sorted(out.to),
+ sorted([self.adminuser.email,
+ self.moderation_user.email]))
+ self.assertEqual(len(out.to), 2)
+
+
class MarkerFormTest(TestCase):
def setUp(self):
self.subcategories = subcategory_setup()