Added published status.
This commit is contained in:
@@ -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):
|
||||
|
||||
33
dav_events/migrations/0013_auto_20180224_1401.py
Normal file
33
dav_events/migrations/0013_auto_20180224_1401.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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'
|
||||
|
||||
@@ -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">×</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' %} 
|
||||
{% trans 'Ja' %}
|
||||
</a>
|
||||
<button type="button" class="btn btn-danger" data-dismiss="modal">
|
||||
{% bootstrap_icon 'remove' %} 
|
||||
{% 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' %} 
|
||||
{% 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' %} 
|
||||
{% 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' %} 
|
||||
{% else %}
|
||||
{% bootstrap_icon 'unchecked' %} 
|
||||
{% 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' %} 
|
||||
{% else %}
|
||||
{% bootstrap_icon 'unchecked' %} 
|
||||
{% 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>
|
||||
|
||||
@@ -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})/',
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user