Added primitive Update Event feature.
This commit is contained in:
1
TODO.txt
1
TODO.txt
@@ -8,7 +8,6 @@
|
|||||||
- ApproachForm aufteilen
|
- ApproachForm aufteilen
|
||||||
- Teilnehmerzahl und Trainerzahl kombinieren
|
- Teilnehmerzahl und Trainerzahl kombinieren
|
||||||
- Save as Draft
|
- Save as Draft
|
||||||
- Edit Event
|
|
||||||
- Copy Event
|
- Copy Event
|
||||||
- Tourenreferent managed Gruppen der Subreferenten
|
- Tourenreferent managed Gruppen der Subreferenten
|
||||||
- Initialtexte und Placeholder von forms in config
|
- Initialtexte und Placeholder von forms in config
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
# E-Mails
|
# E-Mails
|
||||||
ENABLE_EMAIL_NOTIFICATIONS = False
|
ENABLE_EMAIL_NOTIFICATIONS = True
|
||||||
EMAIL_SENDER = 'Jens Kleineheismann <kleineheismann@kit.edu>'
|
EMAIL_SENDER = 'Jens Kleineheismann <kleineheismann@kit.edu>'
|
||||||
EMAIL_BASE_URL = 'http://localhost:8000'
|
EMAIL_BASE_URL = 'http://localhost:8000'
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,13 @@ logger = logging.getLogger(__name__)
|
|||||||
DEVELOPMENT_INIT_FORMS = False
|
DEVELOPMENT_INIT_FORMS = False
|
||||||
|
|
||||||
|
|
||||||
|
class EventUpdateForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = models.Event
|
||||||
|
fields = '__all__'
|
||||||
|
exclude = ('accepted', 'accepted_at', 'accepted_by')
|
||||||
|
|
||||||
|
|
||||||
class EventCreateForm(ChainedForm):
|
class EventCreateForm(ChainedForm):
|
||||||
_model = models.Event
|
_model = models.Event
|
||||||
_initial_form_name = 'ModeForm'
|
_initial_form_name = 'ModeForm'
|
||||||
|
|||||||
@@ -188,7 +188,8 @@ class Event(models.Model):
|
|||||||
|
|
||||||
def accept(self, user=None):
|
def accept(self, user=None):
|
||||||
if not self.accepted:
|
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 = True
|
||||||
self.accepted_at = timezone.now()
|
self.accepted_at = timezone.now()
|
||||||
if user:
|
if user:
|
||||||
@@ -200,6 +201,9 @@ class Event(models.Model):
|
|||||||
]
|
]
|
||||||
for email in emails_to_send:
|
for email in emails_to_send:
|
||||||
email.send()
|
email.send()
|
||||||
|
return self.number
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
def get_next_number(self):
|
def get_next_number(self):
|
||||||
counter = 0
|
counter = 0
|
||||||
@@ -207,7 +211,7 @@ class Event(models.Model):
|
|||||||
year = self.first_day.year
|
year = self.first_day.year
|
||||||
year_begin = datetime.date(year, 1, 1)
|
year_begin = datetime.date(year, 1, 1)
|
||||||
year_end = datetime.date(year, 12, 31)
|
year_end = datetime.date(year, 12, 31)
|
||||||
qs = Event.objects.filter(accepted=True,
|
qs = Event.objects.filter(number__isnull=False,
|
||||||
sport=self.sport,
|
sport=self.sport,
|
||||||
first_day__gte=year_begin,
|
first_day__gte=year_begin,
|
||||||
first_day__lte=year_end).order_by('-number')
|
first_day__lte=year_end).order_by('-number')
|
||||||
|
|||||||
@@ -7,20 +7,24 @@
|
|||||||
<div class="action-tabs">
|
<div class="action-tabs">
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
<a class="btn"
|
||||||
|
href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Details' %}</a>
|
<a class="btn"
|
||||||
|
href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Details' %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="{% if not has_permission_accept or event.accepted %}disabled{% endif %}">
|
<li class="{% if not has_permission_accept or event.accepted %}disabled{% endif %}">
|
||||||
<a class="{% if has_permission_accept and not event.accepted %}btn-success{% endif %}"
|
<a class="btn {% if has_permission_accept and not event.accepted %}btn-success{% else %}disabled{% endif %}"
|
||||||
href="{% url 'dav_events:event_accept' event.pk %}">{% trans 'Freigeben' %}</a>
|
href="{% url 'dav_events:event_accept' event.pk %}">{% trans 'Freigeben' %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="disabled">
|
<li class="{% if not has_permission_update or event.accepted %}disabled{% endif %}">
|
||||||
<a href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Ändern' %}</a>
|
<a class="btn {% if has_permission_update and not event.accepted %}btn-warning{% else %}disabled{% endif %}"
|
||||||
|
href="{% url 'dav_events:event_update' event.pk %}">{% trans 'Ändern' %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="disabled">
|
<li class="disabled">
|
||||||
<a href="{% url 'dav_events:event_detail' event.pk %}"
|
<a class="btn disabled"
|
||||||
|
href="{% url 'dav_events:event_detail' event.pk %}"
|
||||||
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">{% trans 'Kopieren' %}</a>
|
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">{% trans 'Kopieren' %}</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
42
dav_events/templates/dav_events/event_update_form.html
Normal file
42
dav_events/templates/dav_events/event_update_form.html
Normal file
@@ -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 %}
|
||||||
|
<div class="action-tabs">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Details' %}</a>
|
||||||
|
</li>
|
||||||
|
<li class="{% if not has_permission_accept or event.accepted %}disabled{% endif %}">
|
||||||
|
<a class="{% if has_permission_accept and not event.accepted %}btn-success{% endif %}"
|
||||||
|
href="{% url 'dav_events:event_accept' event.pk %}">{% trans 'Freigeben' %}</a>
|
||||||
|
</li>
|
||||||
|
<li class="active">
|
||||||
|
<a href="{% url 'dav_events:event_update' event.pk %}">{% trans 'Ändern' %}</a>
|
||||||
|
</li>
|
||||||
|
<li class="disabled">
|
||||||
|
<a href="{% url 'dav_events:event_detail' event.pk %}"
|
||||||
|
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">{% trans 'Kopieren' %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading"><h3 class="panel-title">{{ event }}</h3></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{% bootstrap_form form layout='horizontal' %}
|
||||||
|
</div>
|
||||||
|
<div class="panel-footer">
|
||||||
|
<button type="submit" class="btn btn-danger">{% trans 'Speichern' %}</button>
|
||||||
|
<a class="btn btn-warning" href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Abbrechen' %}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock page-container-fluid %}
|
||||||
@@ -11,5 +11,6 @@ urlpatterns = [
|
|||||||
url(r'^events$', views.events.EventListView.as_view(), name='event_list'),
|
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/create$', views.events.EventCreateView.as_view(), name='event_create'),
|
||||||
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+)/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'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class EventPermissionMixin(object):
|
|||||||
group_name = getattr(config, group_name_var, None)
|
group_name = getattr(config, group_name_var, None)
|
||||||
if group_name and user.groups.filter(name=group_name).count():
|
if group_name and user.groups.filter(name=group_name).count():
|
||||||
return True
|
return True
|
||||||
elif permission in ('edit', 'accept'):
|
elif permission in ('update', 'accept'):
|
||||||
if user.groups.filter(name=config.MANAGE_ALL_GROUP).count():
|
if user.groups.filter(name=config.MANAGE_ALL_GROUP).count():
|
||||||
return True
|
return True
|
||||||
group_name_var = 'MANAGE_{}_GROUP'.format(obj.sport)
|
group_name_var = 'MANAGE_{}_GROUP'.format(obj.sport)
|
||||||
@@ -74,7 +74,7 @@ class EventPermissionMixin(object):
|
|||||||
def enforce_permission(self, obj):
|
def enforce_permission(self, obj):
|
||||||
permission = self.permission
|
permission = self.permission
|
||||||
if not self.has_permission(permission, obj):
|
if not self.has_permission(permission, obj):
|
||||||
raise PermissionDenied()
|
raise PermissionDenied(permission)
|
||||||
|
|
||||||
|
|
||||||
class EventDetailView(EventPermissionMixin, generic.DetailView):
|
class EventDetailView(EventPermissionMixin, generic.DetailView):
|
||||||
@@ -89,7 +89,7 @@ class EventDetailView(EventPermissionMixin, generic.DetailView):
|
|||||||
context = super(EventDetailView, self).get_context_data(**kwargs)
|
context = super(EventDetailView, 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_edit'] = self.has_permission('edit', obj)
|
context['has_permission_update'] = self.has_permission('update', obj)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
@@ -110,6 +110,31 @@ class EventAcceptView(EventDetailView):
|
|||||||
return super(EventAcceptView, self).get(request, *args, **kwargs)
|
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):
|
class EventCreateView(generic.FormView):
|
||||||
form_class = forms.events.EventCreateForm
|
form_class = forms.events.EventCreateForm
|
||||||
template_dir = os.path.join('dav_events', 'event_create')
|
template_dir = os.path.join('dav_events', 'event_create')
|
||||||
|
|||||||
Reference in New Issue
Block a user