Improved group/role thing. Improved email sending (prepare for
OneClickAction).
This commit is contained in:
@@ -6,15 +6,15 @@ DEFAULT_SETTINGS = (
|
||||
DefaultSetting('enable_email_notifications', False),
|
||||
DefaultSetting('email_sender', None),
|
||||
DefaultSetting('email_base_url', None),
|
||||
DefaultSetting('manage_all_group', None),
|
||||
DefaultSetting('manage_w_group', None),
|
||||
DefaultSetting('manage_s_group', None),
|
||||
DefaultSetting('manage_m_group', None),
|
||||
DefaultSetting('manage_k_group', None),
|
||||
DefaultSetting('manage_b_group', None),
|
||||
DefaultSetting('publisher_group', None),
|
||||
DefaultSetting('incremental_publisher_group', None),
|
||||
DefaultSetting('development_init_forms', False),
|
||||
DefaultSetting('group_manage_all', None),
|
||||
DefaultSetting('group_manage_w', None),
|
||||
DefaultSetting('group_manage_s', None),
|
||||
DefaultSetting('group_manage_m', None),
|
||||
DefaultSetting('group_manage_k', None),
|
||||
DefaultSetting('group_manage_b', None),
|
||||
DefaultSetting('group_publish', None),
|
||||
DefaultSetting('group_publish_incremental', None),
|
||||
DefaultSetting('forms_development_init', False),
|
||||
DefaultSetting('fee_matrix', ImproperlyConfigured),
|
||||
)
|
||||
|
||||
|
||||
@@ -3,21 +3,21 @@ from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
# E-Mails
|
||||
ENABLE_EMAIL_NOTIFICATIONS = False
|
||||
EMAIL_SENDER = 'Jens Kleineheismann <kleineheismann@kit.edu>'
|
||||
EMAIL_SENDER = 'DAV Veranstaltungsheinzel <heinzel@heinzelwerk.de>'
|
||||
EMAIL_BASE_URL = 'http://localhost:8000'
|
||||
|
||||
# Auth Config
|
||||
MANAGE_ALL_GROUP = 'Tourenreferenten'
|
||||
MANAGE_W_GROUP = 'Wanderreferenten'
|
||||
MANAGE_S_GROUP = 'Skireferenten'
|
||||
MANAGE_M_GROUP = 'MTBReferenten'
|
||||
MANAGE_K_GROUP = 'Kletterreferenten'
|
||||
MANAGE_B_GROUP = 'Bergsteigerreferenten'
|
||||
PUBLISHER_GROUP = 'Redaktion'
|
||||
INCREMENTAL_PUBLISHER_GROUP = 'OnlineRedaktion'
|
||||
# Authorization Roles / Groups
|
||||
GROUP_MANAGE_ALL = 'Tourenreferenten'
|
||||
GROUP_MANAGE_W = 'Wanderreferenten'
|
||||
GROUP_MANAGE_S = 'Skireferenten'
|
||||
GROUP_MANAGE_M = 'MTBReferenten'
|
||||
GROUP_MANAGE_K = 'Kletterreferenten'
|
||||
GROUP_MANAGE_B = 'Bergsteigerreferenten'
|
||||
GROUP_PUBLISH = 'Redaktion'
|
||||
GROUP_PUBLISH_INCREMENTAL = 'OnlineRedaktion'
|
||||
|
||||
# EventCreateForm
|
||||
# DEVELOPMENT_INIT_FORMS = False
|
||||
# FORMS_DEVELOPMENT_INIT = False
|
||||
FEE_MATRIX = {
|
||||
'0': {'description': _(u'Keiner / direkte Abrechnung (Tageswanderung)'),
|
||||
'trainer_fee': 0,
|
||||
|
||||
@@ -5,7 +5,7 @@ from django.core.exceptions import ImproperlyConfigured
|
||||
from django.core.mail import EmailMessage
|
||||
from django.template.loader import get_template
|
||||
|
||||
from .utils import get_group_members
|
||||
from .utils import get_users_by_role
|
||||
|
||||
app_config = apps.get_containing_app_config(__package__)
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -14,22 +14,16 @@ logger = logging.getLogger(__name__)
|
||||
def get_recipients(task, sport=None):
|
||||
users = []
|
||||
if task == 'accept':
|
||||
group_var_name = 'manage_all_group'
|
||||
group_name = getattr(app_config.settings, group_var_name, None)
|
||||
if group_name:
|
||||
users.extend(get_group_members(group_name, ignore_missing=True))
|
||||
role = 'manage_all'
|
||||
users += get_users_by_role(role)
|
||||
|
||||
if sport:
|
||||
group_var_name = 'manage_{}_group'.format(sport.lower())
|
||||
group_name = getattr(app_config.settings, group_var_name, None)
|
||||
if group_name:
|
||||
users.extend(get_group_members(group_name, ignore_missing=True))
|
||||
role = 'manage_{}'.format(sport.lower())
|
||||
users += get_users_by_role(role)
|
||||
|
||||
elif task == 'publish':
|
||||
group_var_name = 'incremental_publisher_group'
|
||||
group_name = getattr(app_config.settings, group_var_name, None)
|
||||
if group_name:
|
||||
users.extend(get_group_members(group_name, ignore_missing=True))
|
||||
role = 'incremental_publisher'
|
||||
users += get_users_by_role(role)
|
||||
else:
|
||||
raise ValueError('utils.get_recipients(): invalid value for task')
|
||||
|
||||
@@ -57,9 +51,9 @@ class AbstractMail(object):
|
||||
context.update(extra_context)
|
||||
return context
|
||||
|
||||
def _get_body(self):
|
||||
def _get_body(self, context=None):
|
||||
template = self._get_template()
|
||||
context = self._get_context_data()
|
||||
context = self._get_context_data(extra_context=context)
|
||||
return template.render(context)
|
||||
|
||||
def _get_recipients(self):
|
||||
@@ -82,11 +76,20 @@ class AbstractEventMail(AbstractMail):
|
||||
_subject = u'[DAV Veranstaltungen]'
|
||||
_template_name = 'dav_events/emails/default.txt'
|
||||
|
||||
def __init__(self, event):
|
||||
def __init__(self, recipient, event):
|
||||
self._recipient = recipient
|
||||
self._event = event
|
||||
|
||||
def _get_recipients(self):
|
||||
r = u'"{fullname}" <{email}>'.format(fullname=self._recipient.get_full_name(),
|
||||
email=self._recipient.email)
|
||||
return [r]
|
||||
|
||||
def _get_context_data(self, extra_context=None):
|
||||
context = super(AbstractEventMail, self)._get_context_data(extra_context=extra_context)
|
||||
context.update({
|
||||
'recipient': self._recipient,
|
||||
})
|
||||
context.update(self._event.get_template_context())
|
||||
return context
|
||||
|
||||
@@ -99,11 +102,6 @@ class NewEventMail(AbstractEventMail):
|
||||
s += u' Neue Veranstaltung angelegt'
|
||||
return s
|
||||
|
||||
def _get_recipients(self):
|
||||
r = u'{fullname} <{email}>'.format(fullname=self._event.owner.get_full_name(),
|
||||
email=self._event.owner.email)
|
||||
return [r]
|
||||
|
||||
|
||||
class EventToAcceptMail(AbstractEventMail):
|
||||
_template_name = 'dav_events/emails/event_to_accept.txt'
|
||||
@@ -113,9 +111,6 @@ class EventToAcceptMail(AbstractEventMail):
|
||||
s += u' Neue Veranstaltung freigeben'
|
||||
return s
|
||||
|
||||
def _get_recipients(self):
|
||||
return get_recipients('accept', self._event.sport)
|
||||
|
||||
|
||||
class EventAcceptedMail(AbstractEventMail):
|
||||
_template_name = 'dav_events/emails/event_accepted.txt'
|
||||
@@ -125,11 +120,6 @@ class EventAcceptedMail(AbstractEventMail):
|
||||
s += u' Veranstaltung wurde freigegeben'
|
||||
return s
|
||||
|
||||
def _get_recipients(self):
|
||||
r = u'{fullname} <{email}>'.format(fullname=self._event.owner.get_full_name(),
|
||||
email=self._event.owner.email)
|
||||
return [r]
|
||||
|
||||
|
||||
class EventToPublishMail(AbstractEventMail):
|
||||
_template_name = 'dav_events/emails/event_to_publish.txt'
|
||||
@@ -139,9 +129,6 @@ class EventToPublishMail(AbstractEventMail):
|
||||
s += u' Veranstaltung veröffentlichen'
|
||||
return s
|
||||
|
||||
def _get_recipients(self):
|
||||
return get_recipients('publish', self._event.sport)
|
||||
|
||||
|
||||
class PasswordSetEmail(AbstractMail):
|
||||
_subject = u'[DAV Veranstaltungen] Zugangsdaten'
|
||||
|
||||
@@ -208,7 +208,7 @@ class LocationForm(EventCreateForm):
|
||||
elif sport == 'W':
|
||||
self.fields['location'].widget.attrs['placeholder'] = u'Maikammer, Pfalz'
|
||||
|
||||
if app_config.settings.development_init_forms:
|
||||
if app_config.settings.forms_development_init:
|
||||
self.fields['location'].initial = self.fields['location'].widget.attrs['placeholder']
|
||||
|
||||
|
||||
@@ -479,7 +479,7 @@ class DescriptionForm(EventCreateForm):
|
||||
elif sport == 'W' and not last_day:
|
||||
title_prefix += u'%s ' % ugettext(u'Tageswanderung')
|
||||
|
||||
if app_config.settings.development_init_forms:
|
||||
if app_config.settings.forms_development_init:
|
||||
if not title_prefix:
|
||||
title_prefix = u'%s' % choices.SPORT_CHOICES.get_label(sport)
|
||||
|
||||
@@ -610,7 +610,7 @@ class TrainerForm(EventCreateForm):
|
||||
self.fields['trainer_firstname'].initial = self._request.user.first_name
|
||||
self.fields['trainer_familyname'].initial = self._request.user.last_name
|
||||
self.fields['trainer_email'].initial = self._request.user.email
|
||||
elif app_config.settings.development_init_forms:
|
||||
elif app_config.settings.forms_development_init:
|
||||
self.fields['trainer_firstname'].initial = self.fields['trainer_firstname'].widget.attrs['placeholder']
|
||||
self.fields['trainer_familyname'].initial = self.fields['trainer_familyname'].widget.attrs['placeholder']
|
||||
self.fields['trainer_email'].initial = self.fields['trainer_email'].widget.attrs['placeholder']
|
||||
|
||||
@@ -3,6 +3,7 @@ import datetime
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import uuid
|
||||
from babel.dates import format_date
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
@@ -16,6 +17,7 @@ from django_countries.fields import CountryField
|
||||
from . import choices
|
||||
from . import config
|
||||
from . import emails
|
||||
from .utils import get_users_by_role
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -178,9 +180,15 @@ class Event(models.Model):
|
||||
email=self.trainer_email,
|
||||
)
|
||||
owner.save()
|
||||
|
||||
self.owner = owner
|
||||
emails_to_send.append(emails.NewEventMail(event=self))
|
||||
emails_to_send.append(emails.EventToAcceptMail(event=self))
|
||||
|
||||
managers = get_users_by_role('manage_all')
|
||||
managers += get_users_by_role('manage_{}'.format(self.sport.lower()))
|
||||
for user in managers:
|
||||
emails_to_send.append(emails.EventToAcceptMail(recipient=user, event=self))
|
||||
|
||||
emails_to_send.append(emails.NewEventMail(recipient=owner, event=self))
|
||||
|
||||
super(Event, self).save(**kwargs)
|
||||
for email in emails_to_send:
|
||||
@@ -195,12 +203,15 @@ class Event(models.Model):
|
||||
if user:
|
||||
self.accepted_by = user
|
||||
self.save()
|
||||
emails_to_send = [
|
||||
emails.EventAcceptedMail(event=self),
|
||||
emails.EventToPublishMail(event=self)
|
||||
]
|
||||
for email in emails_to_send:
|
||||
|
||||
publishers = get_users_by_role('publish_incremental')
|
||||
for user in publishers:
|
||||
email = emails.EventToPublishMail(recipient=user, event=self)
|
||||
email.send()
|
||||
|
||||
email = emails.EventAcceptedMail(recipient=self.owner, event=self)
|
||||
email.send()
|
||||
|
||||
return self.number
|
||||
else:
|
||||
return None
|
||||
@@ -330,3 +341,10 @@ class Event(models.Model):
|
||||
template_name = os.path.join('dav_events', 'event.html')
|
||||
template = get_template(template_name)
|
||||
return template.render(self.get_template_context())
|
||||
|
||||
|
||||
# class OneClickAction(models.Model):
|
||||
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
# caller = models.ForeignKey(settings.AUTH_USER_MODEL,
|
||||
# null=True,
|
||||
# related_name='+')
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import logging
|
||||
from django.apps import apps
|
||||
from django.contrib.auth.models import Group
|
||||
|
||||
app_config = apps.get_containing_app_config(__package__)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -12,5 +14,24 @@ def get_group_members(group_name, ignore_missing=False):
|
||||
except Group.DoesNotExist:
|
||||
if not ignore_missing:
|
||||
raise
|
||||
|
||||
return users
|
||||
|
||||
|
||||
def get_group_name_by_role(role):
|
||||
group_name_var = 'group_{}'.format(role)
|
||||
return getattr(app_config.settings, group_name_var, None)
|
||||
|
||||
|
||||
def get_users_by_role(role):
|
||||
users = []
|
||||
group_name = get_group_name_by_role(role)
|
||||
if group_name:
|
||||
users = get_group_members(group_name, ignore_missing=True)
|
||||
return users
|
||||
|
||||
|
||||
def has_role(user, role):
|
||||
group_name = get_group_name_by_role(role)
|
||||
if group_name and user.groups.filter(name=group_name).count():
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -14,6 +14,7 @@ from django.views import generic
|
||||
|
||||
from .. import forms
|
||||
from .. import models
|
||||
from ..utils import has_role
|
||||
|
||||
app_config = apps.get_containing_app_config(__package__)
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -26,14 +27,13 @@ class EventListView(generic.ListView):
|
||||
user = self.request.user
|
||||
if user.is_superuser:
|
||||
qs = self.model.objects.all()
|
||||
elif user.groups.filter(name=app_config.settings.manage_all_group).count():
|
||||
elif has_role(user, 'manage_all'):
|
||||
qs = self.model.objects.all()
|
||||
else:
|
||||
user_sports_list = list()
|
||||
for k in ('W', 'S', 'M', 'K', 'B'):
|
||||
group_name_var = 'manage_{}_group'.format(k.lower())
|
||||
group_name = getattr(app_config.settings, group_name_var, None)
|
||||
if group_name and user.groups.filter(name=group_name).count():
|
||||
role = 'manage_{}'.format(k.lower())
|
||||
if has_role(user, role):
|
||||
user_sports_list.append(k)
|
||||
qs = self.model.objects.filter(Q(owner=user) | Q(sport__in=user_sports_list))
|
||||
|
||||
@@ -56,18 +56,14 @@ class EventPermissionMixin(object):
|
||||
if permission == 'view':
|
||||
if obj.owner == user:
|
||||
return True
|
||||
if user.groups.filter(name=app_config.settings.manage_all_group).count():
|
||||
if has_role(user, 'manage_all'):
|
||||
return True
|
||||
group_name_var = 'manage_{}_group'.format(obj.sport.lower())
|
||||
group_name = getattr(app_config.settings, group_name_var, None)
|
||||
if group_name and user.groups.filter(name=group_name).count():
|
||||
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
||||
return True
|
||||
elif permission in ('update', 'accept'):
|
||||
if user.groups.filter(name=app_config.settings.manage_all_group).count():
|
||||
if has_role(user, 'manage_all'):
|
||||
return True
|
||||
group_name_var = 'manage_{}_group'.format(obj.sport)
|
||||
group_name = getattr(app_config.settings, group_name_var, None)
|
||||
if group_name and user.groups.filter(name=group_name).count():
|
||||
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user