diff options
Diffstat (limited to 'chimere/forms.py')
-rw-r--r-- | chimere/forms.py | 51 |
1 files changed, 45 insertions, 6 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): |