diff options
| -rw-r--r-- | chimere/forms.py | 51 | ||||
| -rw-r--r-- | chimere/tests.py | 32 | 
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() | 
