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