diff --git a/TODO.txt b/TODO.txt index 1ca8f4b..7bacb7c 100644 --- a/TODO.txt +++ b/TODO.txt @@ -8,7 +8,6 @@ - ApproachForm aufteilen - Teilnehmerzahl und Trainerzahl kombinieren - Save as Draft -- Edit Event - Copy Event - Tourenreferent managed Gruppen der Subreferenten - Initialtexte und Placeholder von forms in config diff --git a/dav_events/config.py b/dav_events/config.py index 02e6c94..942e2df 100644 --- a/dav_events/config.py +++ b/dav_events/config.py @@ -2,7 +2,7 @@ from django.utils.translation import ugettext_lazy as _ # E-Mails -ENABLE_EMAIL_NOTIFICATIONS = False +ENABLE_EMAIL_NOTIFICATIONS = True EMAIL_SENDER = 'Jens Kleineheismann ' EMAIL_BASE_URL = 'http://localhost:8000' diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index 73808e2..6d19562 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -17,6 +17,13 @@ logger = logging.getLogger(__name__) DEVELOPMENT_INIT_FORMS = False +class EventUpdateForm(forms.ModelForm): + class Meta: + model = models.Event + fields = '__all__' + exclude = ('accepted', 'accepted_at', 'accepted_by') + + class EventCreateForm(ChainedForm): _model = models.Event _initial_form_name = 'ModeForm' diff --git a/dav_events/models.py b/dav_events/models.py index 176839e..d25f55e 100644 --- a/dav_events/models.py +++ b/dav_events/models.py @@ -188,7 +188,8 @@ class Event(models.Model): def accept(self, user=None): if not self.accepted: - self.number = self.get_next_number() + if not self.number: + self.number = self.get_next_number() self.accepted = True self.accepted_at = timezone.now() if user: @@ -200,6 +201,9 @@ class Event(models.Model): ] for email in emails_to_send: email.send() + return self.number + else: + return None def get_next_number(self): counter = 0 @@ -207,7 +211,7 @@ class Event(models.Model): year = self.first_day.year year_begin = datetime.date(year, 1, 1) year_end = datetime.date(year, 12, 31) - qs = Event.objects.filter(accepted=True, + qs = Event.objects.filter(number__isnull=False, sport=self.sport, first_day__gte=year_begin, first_day__lte=year_end).order_by('-number') diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html index ee2f0e0..8c48cab 100644 --- a/dav_events/templates/dav_events/event_detail.html +++ b/dav_events/templates/dav_events/event_detail.html @@ -7,20 +7,24 @@
diff --git a/dav_events/templates/dav_events/event_update_form.html b/dav_events/templates/dav_events/event_update_form.html new file mode 100644 index 0000000..c0b94bf --- /dev/null +++ b/dav_events/templates/dav_events/event_update_form.html @@ -0,0 +1,42 @@ +{% extends 'dav_events/base.html' %} +{% load bootstrap3 %} +{% load i18n %} + +{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %} + +{% block page-container-fluid %} + +
+ {% csrf_token %} +
+

{{ event }}

+
+ {% bootstrap_form form layout='horizontal' %} +
+ +
+
+{% endblock page-container-fluid %} diff --git a/dav_events/urls.py b/dav_events/urls.py index ac12b61..0350b65 100644 --- a/dav_events/urls.py +++ b/dav_events/urls.py @@ -11,5 +11,6 @@ urlpatterns = [ url(r'^events$', views.events.EventListView.as_view(), name='event_list'), url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'), url(r'^events/(?P\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'), + url(r'^events/(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'), url(r'^events/(?P\d+)/', views.events.EventDetailView.as_view(), name='event_detail'), ] diff --git a/dav_events/views/events.py b/dav_events/views/events.py index 19ddb2c..8fb09c7 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -61,7 +61,7 @@ class EventPermissionMixin(object): group_name = getattr(config, group_name_var, None) if group_name and user.groups.filter(name=group_name).count(): return True - elif permission in ('edit', 'accept'): + elif permission in ('update', 'accept'): if user.groups.filter(name=config.MANAGE_ALL_GROUP).count(): return True group_name_var = 'MANAGE_{}_GROUP'.format(obj.sport) @@ -74,7 +74,7 @@ class EventPermissionMixin(object): def enforce_permission(self, obj): permission = self.permission if not self.has_permission(permission, obj): - raise PermissionDenied() + raise PermissionDenied(permission) class EventDetailView(EventPermissionMixin, generic.DetailView): @@ -89,7 +89,7 @@ class EventDetailView(EventPermissionMixin, generic.DetailView): context = super(EventDetailView, self).get_context_data(**kwargs) obj = context.get('event') context['has_permission_accept'] = self.has_permission('accept', obj) - context['has_permission_edit'] = self.has_permission('edit', obj) + context['has_permission_update'] = self.has_permission('update', obj) return context @method_decorator(login_required) @@ -110,6 +110,31 @@ class EventAcceptView(EventDetailView): return super(EventAcceptView, self).get(request, *args, **kwargs) +class EventUpdateView(EventPermissionMixin, generic.UpdateView): + permission = 'update' + model = models.Event + form_class = forms.events.EventUpdateForm + template_name_suffix = '_update_form' + + def get_object(self, queryset=None): + obj = super(EventUpdateView, self).get_object(queryset=queryset) + self.enforce_permission(obj) + if obj.accepted: + raise PermissionDenied('accepted') + return obj + + def get_context_data(self, **kwargs): + context = super(EventUpdateView, self).get_context_data(**kwargs) + obj = context.get('event') + context['has_permission_accept'] = self.has_permission('accept', obj) + context['has_permission_update'] = True + return context + + @method_decorator(login_required) + def dispatch(self, request, *args, **kwargs): + return super(EventUpdateView, self).dispatch(request, *args, **kwargs) + + class EventCreateView(generic.FormView): form_class = forms.events.EventCreateForm template_dir = os.path.join('dav_events', 'event_create')