diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py
index 11983ef..1c1eb94 100644
--- a/dav_events/forms/events.py
+++ b/dav_events/forms/events.py
@@ -70,7 +70,8 @@ class EventUpdateForm(forms.ModelForm):
class Meta:
model = models.Event
fields = '__all__'
- exclude = ('accepted', 'accepted_at', 'accepted_by')
+ exclude = ('accepted', 'accepted_at', 'accepted_by',
+ 'published', 'published_at', 'published_by',)
class EventCreateForm(ChainedForm):
diff --git a/dav_events/migrations/0013_auto_20180224_1401.py b/dav_events/migrations/0013_auto_20180224_1401.py
new file mode 100644
index 0000000..0701453
--- /dev/null
+++ b/dav_events/migrations/0013_auto_20180224_1401.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.9 on 2018-02-24 14:01
+from __future__ import unicode_literals
+
+import dav_events.models
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('dav_events', '0012_event_registration_howto'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='event',
+ name='published',
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name='event',
+ name='published_at',
+ field=models.DateTimeField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='event',
+ name='published_by',
+ field=models.ForeignKey(blank=True, null=True, on_delete=models.SET(dav_events.models.get_ghost_user), related_name='+', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/dav_events/models.py b/dav_events/models.py
index a8539ea..439223d 100644
--- a/dav_events/models.py
+++ b/dav_events/models.py
@@ -46,6 +46,14 @@ class Event(models.Model):
blank=True,
null=True,
default=None)
+ published = models.BooleanField(default=False)
+ published_at = models.DateTimeField(blank=True,
+ null=True)
+ published_by = models.ForeignKey(settings.AUTH_USER_MODEL,
+ blank=True,
+ null=True,
+ on_delete=models.SET(get_ghost_user),
+ related_name='+')
# DescriptionForm
title = models.CharField(max_length=config.TITLE_MAX_LENGTH)
@@ -213,7 +221,7 @@ class Event(models.Model):
if user:
self.accepted_by = user
else:
- logger.error('Event.accept(): no user given! (Event: %s)', self.event)
+ logger.warning('Event.accept(): no user given! (Event: %s)', self.event)
self.save()
logger.info('Event is accepted: %s', self)
@@ -229,6 +237,20 @@ class Event(models.Model):
else:
return None
+ def set_published(self, user=None):
+ if not self.accepted:
+ logger.warning('Event.set_published(): event is not accepted yet! (Event: %s)', self.event)
+
+ if not self.published:
+ self.published = True
+ self.published_at = timezone.now()
+ if user:
+ self.published_by = user
+ else:
+ logger.warning('Event.set_published(): no user given! (Event: %s)', self.event)
+ self.save()
+ logger.info('Event is published: %s', self)
+
def get_status(self):
now = datetime.date.today()
if self.alt_last_day:
@@ -242,7 +264,9 @@ class Event(models.Model):
elif self.first_day and self.first_day < now:
return 'expired'
- if self.accepted:
+ if self.published:
+ return 'published'
+ elif self.accepted:
return 'accepted'
elif self.owner:
return 'submitted'
diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html
index db9f294..5055bb6 100644
--- a/dav_events/templates/dav_events/event_detail.html
+++ b/dav_events/templates/dav_events/event_detail.html
@@ -30,24 +30,64 @@
+
{% endblock modals %}
{% block page-container-fluid %}
-
@@ -71,14 +111,14 @@
-
+
{% trans 'Eingereicht' %}:
{{ event.created_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
- {{ event.owner.get_full_name }}
+ {% trans 'von' %} {{ event.owner.get_full_name }}
@@ -88,7 +128,7 @@
{% if event.accepted %}
{{ event.accepted_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
- {{ event.accepted_by.get_full_name }}
+ {% trans 'von' %} {{ event.accepted_by.get_full_name }}
{% else %}
-
{% endif %}
@@ -101,25 +141,27 @@
{% if event.published %}
{{ event.published_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
- {{ event.published_by.get_full_name }}
+ {% trans 'von' %} {{ event.published_by.get_full_name }}
{% else %}
-
{% endif %}
-
- {% if event.get_status == 'expired' %}
+
+
+ {% if event.get_status == 'expired' %}
{% trans 'Ausgelaufen' %}
- {% elif event.get_status == 'published' %}
+ {% elif event.get_status == 'published' %}
{% trans 'Veröffentlicht' %}
- {% elif event.get_status == 'accepted' %}
+ {% elif event.get_status == 'accepted' %}
{% trans 'Freigegeben' %}
- {% elif event.get_status == 'submitted' %}
+ {% elif event.get_status == 'submitted' %}
{% trans 'Eingereicht' %}
- {% else %}
- {% trans 'Kaputt' %} (){{ event.get_status }}
- {% endif %}
+ {% else %}
+ {% trans 'Kaputt' %} ({{ event.get_status }})
+ {% endif %}
+
diff --git a/dav_events/urls.py b/dav_events/urls.py
index ae2c9e5..8759e1f 100644
--- a/dav_events/urls.py
+++ b/dav_events/urls.py
@@ -11,6 +11,7 @@ urlpatterns = [
url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
url(r'^events/export$', views.events.EventListExportView.as_view(), name='event_list_export'),
url(r'^events/(?P
\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
+ url(r'^events/(?P\d+)/setpublished', views.events.EventSetPublishedView.as_view(), name='event_setpublished'),
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'),
url(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/',
diff --git a/dav_events/views/events.py b/dav_events/views/events.py
index 55e6601..2e32005 100644
--- a/dav_events/views/events.py
+++ b/dav_events/views/events.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
import logging
import os
from django.apps import apps
@@ -121,19 +122,21 @@ class EventPermissionMixin(object):
if obj.accepted and (has_role(user, 'publish') or has_role(user, 'publish_incremental')):
return True
elif permission == 'accept':
- if not obj.accepted:
- if has_role(user, 'manage_all'):
- return True
- if has_role(user, 'manage_{}'.format(obj.sport.lower())):
- return True
+ if has_role(user, 'manage_all'):
+ return True
+ if has_role(user, 'manage_{}'.format(obj.sport.lower())):
+ return True
elif permission == 'update':
- if not obj.accepted:
+ if not obj.accepted and not obj.published:
if has_role(user, 'manage_all'):
return True
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
return True
elif has_role(user, 'publish') or has_role(user, 'publish_incremental'):
return True
+ elif permission == 'publish':
+ if has_role(user, 'publish') or has_role(user, 'publish_incremental'):
+ return True
return False
@@ -156,6 +159,7 @@ class EventDetailView(EventPermissionMixin, generic.DetailView):
obj = context.get('event')
context['has_permission_accept'] = self.has_permission('accept', obj)
context['has_permission_update'] = self.has_permission('update', obj)
+ context['has_permission_publish'] = self.has_permission('publish', obj)
return context
@method_decorator(login_required)
@@ -173,6 +177,19 @@ class EventAcceptView(EventDetailView):
return HttpResponseRedirect(event.get_absolute_url())
+class EventSetPublishedView(EventDetailView):
+ permission = 'publish'
+
+ def get(self, request, *args, **kwargs):
+ event = self.get_object()
+ if event.accepted:
+ event.set_published(request.user)
+ messages.success(request, _(u'Veröffentlichung registriert.'))
+ else:
+ messages.error(request, _(u'Veranstaltung ist noch nicht freigegeben.'))
+ return HttpResponseRedirect(event.get_absolute_url())
+
+
class EventUpdateView(EventPermissionMixin, generic.UpdateView):
permission = 'update'
model = models.Event
@@ -188,7 +205,8 @@ class EventUpdateView(EventPermissionMixin, generic.UpdateView):
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
+ context['has_permission_update'] = self.has_permission('update', obj)
+ context['has_permission_publish'] = self.has_permission('publish', obj)
return context
@method_decorator(login_required)