From 6f003aaf6a9ba7d6f38d0d0fbbf3de4bd95438e4 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Fri, 26 Jan 2018 16:58:47 +0100 Subject: [PATCH] Improved group/role thing. Improved email sending (prepare for OneClickAction). --- dav_events/apps.py | 18 +++---- .../django.main.settings-dav_events.py | 22 ++++---- dav_events/emails.py | 51 +++++++------------ dav_events/forms/events.py | 6 +-- dav_events/models.py | 32 +++++++++--- dav_events/utils.py | 23 ++++++++- dav_events/views/events.py | 20 +++----- 7 files changed, 97 insertions(+), 75 deletions(-) diff --git a/dav_events/apps.py b/dav_events/apps.py index 0f75e69..2ef2c75 100644 --- a/dav_events/apps.py +++ b/dav_events/apps.py @@ -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), ) diff --git a/dav_events/console_scripts/Resources/django.main.settings-dav_events.py b/dav_events/console_scripts/Resources/django.main.settings-dav_events.py index f4dd196..d15f87e 100644 --- a/dav_events/console_scripts/Resources/django.main.settings-dav_events.py +++ b/dav_events/console_scripts/Resources/django.main.settings-dav_events.py @@ -3,21 +3,21 @@ from django.utils.translation import ugettext_lazy as _ # E-Mails ENABLE_EMAIL_NOTIFICATIONS = False -EMAIL_SENDER = 'Jens Kleineheismann ' +EMAIL_SENDER = 'DAV Veranstaltungsheinzel ' 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, diff --git a/dav_events/emails.py b/dav_events/emails.py index de7a6f5..48400a9 100644 --- a/dav_events/emails.py +++ b/dav_events/emails.py @@ -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' diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index f74ff1a..8e5b3a2 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -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'] diff --git a/dav_events/models.py b/dav_events/models.py index d25f55e..8ab69c0 100644 --- a/dav_events/models.py +++ b/dav_events/models.py @@ -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='+') diff --git a/dav_events/utils.py b/dav_events/utils.py index 1e4048a..3785b56 100644 --- a/dav_events/utils.py +++ b/dav_events/utils.py @@ -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 diff --git a/dav_events/views/events.py b/dav_events/views/events.py index c93a963..c1dd5c7 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -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