Added published status.
This commit is contained in:
@@ -70,7 +70,8 @@ class EventUpdateForm(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = models.Event
|
model = models.Event
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
exclude = ('accepted', 'accepted_at', 'accepted_by')
|
exclude = ('accepted', 'accepted_at', 'accepted_by',
|
||||||
|
'published', 'published_at', 'published_by',)
|
||||||
|
|
||||||
|
|
||||||
class EventCreateForm(ChainedForm):
|
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,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
default=None)
|
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
|
# DescriptionForm
|
||||||
title = models.CharField(max_length=config.TITLE_MAX_LENGTH)
|
title = models.CharField(max_length=config.TITLE_MAX_LENGTH)
|
||||||
@@ -213,7 +221,7 @@ class Event(models.Model):
|
|||||||
if user:
|
if user:
|
||||||
self.accepted_by = user
|
self.accepted_by = user
|
||||||
else:
|
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()
|
self.save()
|
||||||
logger.info('Event is accepted: %s', self)
|
logger.info('Event is accepted: %s', self)
|
||||||
|
|
||||||
@@ -229,6 +237,20 @@ class Event(models.Model):
|
|||||||
else:
|
else:
|
||||||
return None
|
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):
|
def get_status(self):
|
||||||
now = datetime.date.today()
|
now = datetime.date.today()
|
||||||
if self.alt_last_day:
|
if self.alt_last_day:
|
||||||
@@ -242,7 +264,9 @@ class Event(models.Model):
|
|||||||
elif self.first_day and self.first_day < now:
|
elif self.first_day and self.first_day < now:
|
||||||
return 'expired'
|
return 'expired'
|
||||||
|
|
||||||
if self.accepted:
|
if self.published:
|
||||||
|
return 'published'
|
||||||
|
elif self.accepted:
|
||||||
return 'accepted'
|
return 'accepted'
|
||||||
elif self.owner:
|
elif self.owner:
|
||||||
return 'submitted'
|
return 'submitted'
|
||||||
|
|||||||
@@ -30,24 +30,64 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</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 %}
|
{% endblock modals %}
|
||||||
|
|
||||||
{% block page-container-fluid %}
|
{% block page-container-fluid %}
|
||||||
<div class="action-tabs">
|
<div class="action-tabs">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
<a class="btn {% if has_permission_accept %}btn-success{% else %}btn-default disabled{% endif %}"
|
<a class="btn btn-primary"
|
||||||
data-toggle="modal" data-target="#modal-accept-dialog">
|
|
||||||
{% bootstrap_icon 'check' %} 
|
|
||||||
{% trans 'Freigeben' %}
|
|
||||||
</a>
|
|
||||||
<!--
|
|
||||||
<a class="btn btn-warning"
|
|
||||||
href="{% url 'dav_events:event_detail' event.pk %}"
|
href="{% url 'dav_events:event_detail' event.pk %}"
|
||||||
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">
|
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">
|
||||||
{% bootstrap_icon 'duplicate' %} 
|
{% bootstrap_icon 'duplicate' %} 
|
||||||
{% trans 'Kopieren' %}
|
{% trans 'Kopieren' %}
|
||||||
</a>
|
</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>
|
</div>
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li>
|
<li>
|
||||||
@@ -71,14 +111,14 @@
|
|||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-9">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
<strong>{% trans 'Eingereicht' %}:</strong>
|
<strong>{% trans 'Eingereicht' %}:</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{{ event.created_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
|
{{ 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>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -88,7 +128,7 @@
|
|||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{% if event.accepted %}
|
{% if event.accepted %}
|
||||||
{{ event.accepted_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
|
{{ 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 %}
|
{% else %}
|
||||||
-
|
-
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -101,14 +141,15 @@
|
|||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{% if event.published %}
|
{% if event.published %}
|
||||||
{{ event.published_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
|
{{ 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 %}
|
{% else %}
|
||||||
-
|
-
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-3">
|
||||||
|
<div class="pull-right">
|
||||||
{% if event.get_status == 'expired' %}
|
{% if event.get_status == 'expired' %}
|
||||||
<span class="label label-info">{% trans 'Ausgelaufen' %}</span>
|
<span class="label label-info">{% trans 'Ausgelaufen' %}</span>
|
||||||
{% elif event.get_status == 'published' %}
|
{% elif event.get_status == 'published' %}
|
||||||
@@ -118,12 +159,13 @@
|
|||||||
{% elif event.get_status == 'submitted' %}
|
{% elif event.get_status == 'submitted' %}
|
||||||
<span class="label label-danger">{% trans 'Eingereicht' %}</span>
|
<span class="label label-danger">{% trans 'Eingereicht' %}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="label label-default">{% trans 'Kaputt' %} (){{ event.get_status }}</span>
|
<span class="label label-default">{% trans 'Kaputt' %} ({{ event.get_status }})</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock page-container-fluid %}
|
{% endblock page-container-fluid %}
|
||||||
@@ -11,6 +11,7 @@ urlpatterns = [
|
|||||||
url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
|
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/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+)/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+)/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'^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})/',
|
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 logging
|
||||||
import os
|
import os
|
||||||
from django.apps import apps
|
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')):
|
if obj.accepted and (has_role(user, 'publish') or has_role(user, 'publish_incremental')):
|
||||||
return True
|
return True
|
||||||
elif permission == 'accept':
|
elif permission == 'accept':
|
||||||
if not obj.accepted:
|
|
||||||
if has_role(user, 'manage_all'):
|
if has_role(user, 'manage_all'):
|
||||||
return True
|
return True
|
||||||
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
||||||
return True
|
return True
|
||||||
elif permission == 'update':
|
elif permission == 'update':
|
||||||
if not obj.accepted:
|
if not obj.accepted and not obj.published:
|
||||||
if has_role(user, 'manage_all'):
|
if has_role(user, 'manage_all'):
|
||||||
return True
|
return True
|
||||||
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
if has_role(user, 'manage_{}'.format(obj.sport.lower())):
|
||||||
return True
|
return True
|
||||||
elif has_role(user, 'publish') or has_role(user, 'publish_incremental'):
|
elif has_role(user, 'publish') or has_role(user, 'publish_incremental'):
|
||||||
return True
|
return True
|
||||||
|
elif permission == 'publish':
|
||||||
|
if has_role(user, 'publish') or has_role(user, 'publish_incremental'):
|
||||||
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -156,6 +159,7 @@ class EventDetailView(EventPermissionMixin, generic.DetailView):
|
|||||||
obj = context.get('event')
|
obj = context.get('event')
|
||||||
context['has_permission_accept'] = self.has_permission('accept', obj)
|
context['has_permission_accept'] = self.has_permission('accept', obj)
|
||||||
context['has_permission_update'] = self.has_permission('update', obj)
|
context['has_permission_update'] = self.has_permission('update', obj)
|
||||||
|
context['has_permission_publish'] = self.has_permission('publish', obj)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
@@ -173,6 +177,19 @@ class EventAcceptView(EventDetailView):
|
|||||||
return HttpResponseRedirect(event.get_absolute_url())
|
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):
|
class EventUpdateView(EventPermissionMixin, generic.UpdateView):
|
||||||
permission = 'update'
|
permission = 'update'
|
||||||
model = models.Event
|
model = models.Event
|
||||||
@@ -188,7 +205,8 @@ class EventUpdateView(EventPermissionMixin, generic.UpdateView):
|
|||||||
context = super(EventUpdateView, self).get_context_data(**kwargs)
|
context = super(EventUpdateView, self).get_context_data(**kwargs)
|
||||||
obj = context.get('event')
|
obj = context.get('event')
|
||||||
context['has_permission_accept'] = self.has_permission('accept', obj)
|
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
|
return context
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
|
|||||||
Reference in New Issue
Block a user