Added published status.

This commit is contained in:
2018-02-24 15:50:21 +01:00
parent 0f0dbbd34c
commit 37264f783a
6 changed files with 149 additions and 30 deletions

View File

@@ -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):

View File

@@ -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),
),
]

View File

@@ -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'

View File

@@ -30,24 +30,64 @@
</div>
</div>
</div>
<div id="modal-setpublished-dialog" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">{% trans 'Wird die Veranstaltung veröffentlicht?' %}</h4>
</div>
<div class="modal-body">
<p class="text-center">
<strong>{{ event }}</strong>
</p>
</div>
<div class="modal-footer">
<a class="btn btn-success" href="{% url 'dav_events:event_setpublished' event.pk %}">
{% bootstrap_icon 'ok' %}&thinsp;
{% trans 'Ja' %}
</a>
<button type="button" class="btn btn-danger" data-dismiss="modal">
{% bootstrap_icon 'remove' %}&thinsp;
{% trans 'Nein' %}
</button>
</div>
</div>
</div>
</div>
{% endblock modals %}
{% block page-container-fluid %}
<div class="action-tabs">
<div class="pull-right">
<a class="btn {% if has_permission_accept %}btn-success{% else %}btn-default disabled{% endif %}"
data-toggle="modal" data-target="#modal-accept-dialog">
{% bootstrap_icon 'check' %}&thinsp;
{% trans 'Freigeben' %}
</a>
<!--
<a class="btn btn-warning"
<a class="btn btn-primary"
href="{% url 'dav_events:event_detail' event.pk %}"
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">
{% bootstrap_icon 'duplicate' %}&thinsp;
{% trans 'Kopieren' %}
</a>
-->
{% if has_permission_accept %}
<a class="btn {% if event.get_status == 'submitted' %}btn-success{% else %}btn-default disabled{% endif %}"
data-toggle="modal" data-target="#modal-accept-dialog">
{% if event.accepted %}
{% bootstrap_icon 'check' %}&thinsp;
{% else %}
{% bootstrap_icon 'unchecked' %}&thinsp;
{% endif %}
{% trans 'Freigeben' %}
</a>
{% endif %}
{% if has_permission_publish %}
<a class="btn {% if event.get_status == 'accepted' %}btn-success{% else %}btn-default disabled{% endif %}"
data-toggle="modal" data-target="#modal-setpublished-dialog">
{% if event.published %}
{% bootstrap_icon 'check' %}&thinsp;
{% else %}
{% bootstrap_icon 'unchecked' %}&thinsp;
{% endif %}
{% trans 'Wird veröffentlicht' %}
</a>
{% endif %}
</div>
<ul class="nav nav-tabs" role="tablist">
<li>
@@ -71,14 +111,14 @@
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="col-sm-10">
<div class="col-sm-9">
<div class="row">
<div class="col-sm-2">
<strong>{% trans 'Eingereicht' %}:</strong>
</div>
<div class="col-sm-10">
{{ event.created_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
{{ event.owner.get_full_name }}
{% trans 'von' %} {{ event.owner.get_full_name }}
</div>
</div>
<div class="row">
@@ -88,7 +128,7 @@
<div class="col-sm-10">
{% if event.accepted %}
{{ event.accepted_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
{{ event.accepted_by.get_full_name }}
{% trans 'von' %} {{ event.accepted_by.get_full_name }}
{% else %}
-
{% endif %}
@@ -101,25 +141,27 @@
<div class="col-sm-10">
{% if event.published %}
{{ event.published_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
{{ event.published_by.get_full_name }}
{% trans 'von' %} {{ event.published_by.get_full_name }}
{% else %}
-
{% endif %}
</div>
</div>
</div>
<div class="col-sm-2">
{% if event.get_status == 'expired' %}
<div class="col-sm-3">
<div class="pull-right">
{% if event.get_status == 'expired' %}
<span class="label label-info">{% trans 'Ausgelaufen' %}</span>
{% elif event.get_status == 'published' %}
{% elif event.get_status == 'published' %}
<span class="label label-success">{% trans 'Veröffentlicht' %}</span>
{% elif event.get_status == 'accepted' %}
{% elif event.get_status == 'accepted' %}
<span class="label label-warning">{% trans 'Freigegeben' %}</span>
{% elif event.get_status == 'submitted' %}
{% elif event.get_status == 'submitted' %}
<span class="label label-danger">{% trans 'Eingereicht' %}</span>
{% else %}
<span class="label label-default">{% trans 'Kaputt' %} (){{ event.get_status }}</span>
{% endif %}
{% else %}
<span class="label label-default">{% trans 'Kaputt' %} ({{ event.get_status }})</span>
{% endif %}
</div>
</div>
</div>
</div>

View File

@@ -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<pk>\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
url(r'^events/(?P<pk>\d+)/setpublished', views.events.EventSetPublishedView.as_view(), name='event_setpublished'),
url(r'^events/(?P<pk>\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'),
url(r'^events/(?P<pk>\d+)/', views.events.EventDetailView.as_view(), name='event_detail'),
url(r'^action/(?P<pk>[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/',

View File

@@ -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)