diff --git a/dav_auth/admin.py b/dav_auth/admin.py index 8774339..1e76950 100644 --- a/dav_auth/admin.py +++ b/dav_auth/admin.py @@ -1,5 +1,21 @@ 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.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) diff --git a/dav_auth/views.py b/dav_auth/views.py index 5349edf..cf22504 100644 --- a/dav_auth/views.py +++ b/dav_auth/views.py @@ -70,6 +70,7 @@ class SetPasswordView(auth_views.PasswordChangeView): def form_valid(self, form): r = super().form_valid(form) 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): email = emails.PasswordSetEmail(self.request.user, form.cleaned_data['new_password']) email.send() diff --git a/dav_event_office/templates/dav_event_office/event_list.html b/dav_event_office/templates/dav_event_office/event_list.html index 9e145f2..08c1f9c 100644 --- a/dav_event_office/templates/dav_event_office/event_list.html +++ b/dav_event_office/templates/dav_event_office/event_list.html @@ -70,6 +70,7 @@ $(document).ready( function () { var table = $("#objects_table").DataTable( { orderCellsTop: true, + order: [[3, 'desc']], paging: false, language: { search: "{% trans 'Filter' %}:", diff --git a/dav_events/admin.py b/dav_events/admin.py index 8b3896d..7f25261 100644 --- a/dav_events/admin.py +++ b/dav_events/admin.py @@ -1,6 +1,6 @@ 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) @@ -8,6 +8,11 @@ class EventStatusAdmin(admin.ModelAdmin): pass +class EventChangeInline(admin.TabularInline): + model = EventChange + extra = 1 + + class EventFlagInline(admin.TabularInline): model = EventFlag extra = 1 @@ -19,7 +24,7 @@ class EventParticipantInline(admin.TabularInline): @admin.register(Event) class EventAdmin(admin.ModelAdmin): - inlines = [EventFlagInline, EventParticipantInline] + inlines = [EventChangeInline, EventFlagInline, EventParticipantInline] ordering = ['sport', 'number'] diff --git a/dav_events/apps.py b/dav_events/apps.py index 663cfb7..1157ed5 100644 --- a/dav_events/apps.py +++ b/dav_events/apps.py @@ -5,6 +5,7 @@ from dav_base.config.apps import AppConfig as _AppConfig, DefaultSetting DEFAULT_SETTINGS = ( DefaultSetting('enable_email_on_status_update', False), DefaultSetting('enable_email_on_update', False), + DefaultSetting('enable_email_on_registration_closed', False), DefaultSetting('groups_manager_super', []), DefaultSetting('groups_manager_w', []), DefaultSetting('groups_manager_s', []), @@ -31,5 +32,6 @@ class AppConfig(_AppConfig): def ready(self): from . import signals - signals.event_updated.connect(signals.send_emails_on_event_update) - signals.event_status_updated.connect(signals.send_emails_on_event_status_update) + signals.event_updated.connect(signals.signal_handler_for_event_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) diff --git a/dav_events/django_project_config/settings-dav_events.py b/dav_events/django_project_config/settings-dav_events.py index fc8ca9c..f8620cf 100644 --- a/dav_events/django_project_config/settings-dav_events.py +++ b/dav_events/django_project_config/settings-dav_events.py @@ -5,6 +5,7 @@ from dav_events.config import FieldInitial # E-Mails ENABLE_EMAIL_ON_STATUS_UPDATE = False ENABLE_EMAIL_ON_UPDATE = False +ENABLE_EMAIL_ON_REGISTRATION_CLOSED = False # Authorization Roles / Groups GROUPS_MANAGER_SUPER = ['Tourenreferenten'] diff --git a/dav_events/models/event.py b/dav_events/models/event.py index 122604e..d5a8f6b 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -259,7 +259,6 @@ class Event(models.Model): def save(self, implicit_update=False, **kwargs): creating = False - original_text = '' if not self.id: user_model = get_user_model() diff --git a/dav_events/signals.py b/dav_events/signals.py index 842ac7b..918c472 100644 --- a/dav_events/signals.py +++ b/dav_events/signals.py @@ -3,16 +3,23 @@ from django.dispatch import Signal event_created = Signal(providing_args=['event']) event_updated = Signal(providing_args=['event', 'diff', 'user']) 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') diff = kwargs.get('diff') updater = kwargs.get('user') 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') flag = kwargs.get('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) diff --git a/dav_events/tests/test_apps.py b/dav_events/tests/test_apps.py index 80180f5..a61d99a 100644 --- a/dav_events/tests/test_apps.py +++ b/dav_events/tests/test_apps.py @@ -9,6 +9,7 @@ class TestCase(AppsTestCase): settings = ( AppSetting('enable_email_on_status_update', bool), AppSetting('enable_email_on_update', bool), + AppSetting('enable_email_on_registration_closed', bool), AppSetting('groups_manager_super', list), AppSetting('groups_manager_w', list), AppSetting('groups_manager_s', list), diff --git a/dav_events/views/events.py b/dav_events/views/events.py index 823cdd3..eb7a2f3 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -21,6 +21,7 @@ from .. import choices from .. import emails from .. import forms from .. import models +from .. import signals from ..roles import get_users_by_role, has_role from ..workflow import DefaultWorkflow @@ -54,7 +55,7 @@ class EventListView(generic.ListView): qs = self.model.objects.filter(filter) - return qs + return qs.order_by('-first_day', 'number') def get_context_data(self, **kwargs): context = super(EventListView, self).get_context_data(**kwargs) @@ -261,19 +262,11 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView): 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): logger.info('Close registration: %s', event) event.registration_closed = 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')) def _reopen_registration(self, request, event): diff --git a/dav_events/workflow.py b/dav_events/workflow.py index 36ddb06..81e7cf8 100644 --- a/dav_events/workflow.py +++ b/dav_events/workflow.py @@ -55,7 +55,7 @@ class BasicWorkflow(object): flag.save() change = EventChange(event=event, user=flag.user, operation=EventChange.RAISE_FLAG, content=status.code) 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 # 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 not event.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, 'publishing_facebook', @@ -436,6 +436,20 @@ class BasicWorkflow(object): email = emails.EventCanceledMail(recipient=recipient, event=event, editor=updater) 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 #