Merge pull request 'New Stuff' (#90) from stage into production
All checks were successful
Run tests / Execute tox to run the test suite (push) Successful in 3m38s

Reviewed-on: #90
This commit was merged in pull request #90.
This commit is contained in:
2024-09-19 15:51:14 +02:00
11 changed files with 59 additions and 19 deletions

View File

@@ -1,5 +1,21 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import GroupAdmin as _GroupAdmin
from django.contrib.auth.models import Group
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.utils.translation import ugettext as _
admin.site.unregister(Group)
class UserInLine(admin.TabularInline):
model = Group.user_set.through
verbose_name = _('Gruppenmitglied')
verbose_name_plural = _('Gruppenmitglieder')
extra = 0
@admin.register(Group)
class GroupAdmin(_GroupAdmin):
inlines = [UserInLine]
@admin.register(Permission) @admin.register(Permission)

View File

@@ -70,6 +70,7 @@ class SetPasswordView(auth_views.PasswordChangeView):
def form_valid(self, form): def form_valid(self, form):
r = super().form_valid(form) r = super().form_valid(form)
messages.success(self.request, _('Passwort gespeichert.')) messages.success(self.request, _('Passwort gespeichert.'))
logger.info('Changed Password for user \'%s\'', self.request.user)
if form.cleaned_data.get('send_password_mail', False): if form.cleaned_data.get('send_password_mail', False):
email = emails.PasswordSetEmail(self.request.user, form.cleaned_data['new_password']) email = emails.PasswordSetEmail(self.request.user, form.cleaned_data['new_password'])
email.send() email.send()

View File

@@ -70,6 +70,7 @@
$(document).ready( function () { $(document).ready( function () {
var table = $("#objects_table").DataTable( { var table = $("#objects_table").DataTable( {
orderCellsTop: true, orderCellsTop: true,
order: [[3, 'desc']],
paging: false, paging: false,
language: { language: {
search: "{% trans 'Filter' %}:", search: "{% trans 'Filter' %}:",

View File

@@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import EventStatus, EventFlag, Event, OneClickAction, Participant, TrashedParticipant from .models import EventStatus, EventFlag, EventChange, Event, OneClickAction, Participant, TrashedParticipant
@admin.register(EventStatus) @admin.register(EventStatus)
@@ -8,6 +8,11 @@ class EventStatusAdmin(admin.ModelAdmin):
pass pass
class EventChangeInline(admin.TabularInline):
model = EventChange
extra = 1
class EventFlagInline(admin.TabularInline): class EventFlagInline(admin.TabularInline):
model = EventFlag model = EventFlag
extra = 1 extra = 1
@@ -19,7 +24,7 @@ class EventParticipantInline(admin.TabularInline):
@admin.register(Event) @admin.register(Event)
class EventAdmin(admin.ModelAdmin): class EventAdmin(admin.ModelAdmin):
inlines = [EventFlagInline, EventParticipantInline] inlines = [EventChangeInline, EventFlagInline, EventParticipantInline]
ordering = ['sport', 'number'] ordering = ['sport', 'number']

View File

@@ -5,6 +5,7 @@ from dav_base.config.apps import AppConfig as _AppConfig, DefaultSetting
DEFAULT_SETTINGS = ( DEFAULT_SETTINGS = (
DefaultSetting('enable_email_on_status_update', False), DefaultSetting('enable_email_on_status_update', False),
DefaultSetting('enable_email_on_update', False), DefaultSetting('enable_email_on_update', False),
DefaultSetting('enable_email_on_registration_closed', False),
DefaultSetting('groups_manager_super', []), DefaultSetting('groups_manager_super', []),
DefaultSetting('groups_manager_w', []), DefaultSetting('groups_manager_w', []),
DefaultSetting('groups_manager_s', []), DefaultSetting('groups_manager_s', []),
@@ -31,5 +32,6 @@ class AppConfig(_AppConfig):
def ready(self): def ready(self):
from . import signals from . import signals
signals.event_updated.connect(signals.send_emails_on_event_update) signals.event_updated.connect(signals.signal_handler_for_event_update)
signals.event_status_updated.connect(signals.send_emails_on_event_status_update) signals.event_status_updated.connect(signals.signal_handler_for_event_status_update)
signals.event_registration_closed.connect(signals.signal_handler_for_event_registration_closed)

View File

@@ -5,6 +5,7 @@ from dav_events.config import FieldInitial
# E-Mails # E-Mails
ENABLE_EMAIL_ON_STATUS_UPDATE = False ENABLE_EMAIL_ON_STATUS_UPDATE = False
ENABLE_EMAIL_ON_UPDATE = False ENABLE_EMAIL_ON_UPDATE = False
ENABLE_EMAIL_ON_REGISTRATION_CLOSED = False
# Authorization Roles / Groups # Authorization Roles / Groups
GROUPS_MANAGER_SUPER = ['Tourenreferenten'] GROUPS_MANAGER_SUPER = ['Tourenreferenten']

View File

@@ -259,7 +259,6 @@ class Event(models.Model):
def save(self, implicit_update=False, **kwargs): def save(self, implicit_update=False, **kwargs):
creating = False creating = False
original_text = ''
if not self.id: if not self.id:
user_model = get_user_model() user_model = get_user_model()

View File

@@ -3,16 +3,23 @@ from django.dispatch import Signal
event_created = Signal(providing_args=['event']) event_created = Signal(providing_args=['event'])
event_updated = Signal(providing_args=['event', 'diff', 'user']) event_updated = Signal(providing_args=['event', 'diff', 'user'])
event_status_updated = Signal(providing_args=['event', 'flag']) event_status_updated = Signal(providing_args=['event', 'flag'])
event_registration_closed = Signal(providing_args=['event', 'user'])
def send_emails_on_event_update(sender, **kwargs): def signal_handler_for_event_update(sender, **kwargs):
event = kwargs.get('event') event = kwargs.get('event')
diff = kwargs.get('diff') diff = kwargs.get('diff')
updater = kwargs.get('user') updater = kwargs.get('user')
event.workflow.send_emails_on_update(diff, updater) event.workflow.send_emails_on_update(diff, updater)
def send_emails_on_event_status_update(sender, **kwargs): def signal_handler_for_event_status_update(sender, **kwargs):
event = kwargs.get('event') event = kwargs.get('event')
flag = kwargs.get('flag') flag = kwargs.get('flag')
event.workflow.send_emails_on_status_update(flag) event.workflow.send_emails_on_status_update(flag)
def signal_handler_for_event_registration_closed(sender, **kwargs):
event = kwargs.get('event')
updater = kwargs.get('user')
event.workflow.send_emails_on_registration_closed(updater)

View File

@@ -9,6 +9,7 @@ class TestCase(AppsTestCase):
settings = ( settings = (
AppSetting('enable_email_on_status_update', bool), AppSetting('enable_email_on_status_update', bool),
AppSetting('enable_email_on_update', bool), AppSetting('enable_email_on_update', bool),
AppSetting('enable_email_on_registration_closed', bool),
AppSetting('groups_manager_super', list), AppSetting('groups_manager_super', list),
AppSetting('groups_manager_w', list), AppSetting('groups_manager_w', list),
AppSetting('groups_manager_s', list), AppSetting('groups_manager_s', list),

View File

@@ -21,6 +21,7 @@ from .. import choices
from .. import emails from .. import emails
from .. import forms from .. import forms
from .. import models from .. import models
from .. import signals
from ..roles import get_users_by_role, has_role from ..roles import get_users_by_role, has_role
from ..workflow import DefaultWorkflow from ..workflow import DefaultWorkflow
@@ -54,7 +55,7 @@ class EventListView(generic.ListView):
qs = self.model.objects.filter(filter) qs = self.model.objects.filter(filter)
return qs return qs.order_by('-first_day', 'number')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(EventListView, self).get_context_data(**kwargs) context = super(EventListView, self).get_context_data(**kwargs)
@@ -261,19 +262,11 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView):
return context return context
def _notify_publisher(self, event, editor):
recipients = get_users_by_role('publisher_web')
recipients += get_users_by_role('publisher_facebook')
for recipient in recipients:
if recipient.email:
email = emails.EventRegistrationClosedMail(recipient=recipient, event=event, editor=editor)
email.send()
def _close_registration(self, request, event): def _close_registration(self, request, event):
logger.info('Close registration: %s', event) logger.info('Close registration: %s', event)
event.registration_closed = True event.registration_closed = True
event.save(implicit_update=True) event.save(implicit_update=True)
self._notify_publisher(event, request.user) signals.event_registration_closed.send(sender=self.__class__, event=event, user=request.user)
messages.success(request, _(u'Die Anmeldung wurde geschlossen')) messages.success(request, _(u'Die Anmeldung wurde geschlossen'))
def _reopen_registration(self, request, event): def _reopen_registration(self, request, event):

View File

@@ -55,7 +55,7 @@ class BasicWorkflow(object):
flag.save() flag.save()
change = EventChange(event=event, user=flag.user, operation=EventChange.RAISE_FLAG, content=status.code) change = EventChange(event=event, user=flag.user, operation=EventChange.RAISE_FLAG, content=status.code)
change.save() change.save()
logger.info('Flagging status \'%s\' for %s', status.code, event) logger.info('Flagged status \'%s\' for %s (ID: %d)', status.code, event, event.id)
return flag return flag
# TODO: the name/intention of this method is unclear. Could we make it obsolete? # TODO: the name/intention of this method is unclear. Could we make it obsolete?
@@ -75,7 +75,7 @@ class BasicWorkflow(object):
if event.flags.filter(status__code='accepted').exists(): if event.flags.filter(status__code='accepted').exists():
if not event.number: if not event.number:
self.set_number() self.set_number()
logger.info('Setting number on Event %s', event) logger.info('Assigned number to Event %s (ID: %d)', event, event.id)
if code in (None, if code in (None,
'publishing_facebook', 'publishing_facebook',
@@ -436,6 +436,20 @@ class BasicWorkflow(object):
email = emails.EventCanceledMail(recipient=recipient, event=event, editor=updater) email = emails.EventCanceledMail(recipient=recipient, event=event, editor=updater)
email.send() email.send()
def send_emails_on_registration_closed(self, updater):
event = self._event
app_config = apps.get_containing_app_config(__package__)
if not app_config.settings.enable_email_on_registration_closed:
return
recipients = get_users_by_role('publisher_web')
recipients += get_users_by_role('publisher_facebook')
for recipient in recipients:
if recipient.email:
email = emails.EventRegistrationClosedMail(recipient=recipient, event=event, editor=updater)
email.send()
# #
# Permissions # Permissions
# #