Improved group/role thing. Improved email sending (prepare for

OneClickAction).
This commit is contained in:
2018-01-26 16:58:47 +01:00
parent 5cf05666ab
commit 6f003aaf6a
7 changed files with 97 additions and 75 deletions

View File

@@ -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),
)

View File

@@ -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,

View File

@@ -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'

View File

@@ -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']

View File

@@ -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='+')

View File

@@ -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

View File

@@ -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