diff --git a/src/events/mixins.py b/src/events/mixins.py
index 914cc55..d9698ab 100644
--- a/src/events/mixins.py
+++ b/src/events/mixins.py
@@ -1,6 +1,6 @@
"""Mixins for Events."""
from django.http import Http404
-
+from django.shortcuts import get_object_or_404
from . import models
@@ -34,12 +34,14 @@ class EventDetailMixin(object):
:return: TemplateContext object"""
context = super(EventDetailMixin, self).get_context_data(**kwargs)
- if hasattr(self, 'event') and self.event:
+ if hasattr(self, 'event'):
context['event'] = self.event
elif hasattr(self, 'object') and isinstance(self.object, models.Event):
context['event'] = self.object
elif hasattr(self, 'object') and hasattr(self.object, 'event'):
context['event'] = self.object.event
+ else:
+ print("No Event in Context!")
return context
def get_queryset(self):
@@ -49,12 +51,9 @@ class EventDetailMixin(object):
:return: a django QuerySets
"""
if self.model == models.Event:
- self.event = models.Event.objects.get(pk=self.kwargs['pk'])
+ self.event = get_object_or_404(models.Event, pk=self.kwargs['pk'])
queryset = self.model.objects.all()
else:
- try:
- self.event = models.Event.objects.get(pk=self.kwargs['event'])
- queryset = self.model.objects.filter(event=self.event)
- except models.Event.DoesNotExist:
- raise Http404(_('Event does not exist'))
+ self.event = get_object_or_404(models.Event, pk=self.kwargs['event'])
+ queryset = self.model.objects.filter(event=self.event)
return queryset.prefetch_related()
diff --git a/src/mahjong_ranking/forms.py b/src/mahjong_ranking/forms.py
index c852558..4d15cad 100644
--- a/src/mahjong_ranking/forms.py
+++ b/src/mahjong_ranking/forms.py
@@ -10,6 +10,7 @@ from django import forms
from django.utils.translation import ugettext as _
from . import models
+from events.models import Event
USER_MODEL = get_user_model()
@@ -58,3 +59,8 @@ class HanchanAdminForm(HanchanForm):
""" Extend the formfields to add the confirmed checkbox. """
model = models.Hanchan
fields = HanchanForm.Meta.fields + ('confirmed',)
+
+HanchanFormset = forms.inlineformset_factory(Event, models.Hanchan,
+ form=HanchanForm,
+ extra=1,
+ can_delete=True)
diff --git a/src/mahjong_ranking/templates/mahjong_ranking/eventhanchan_form.html b/src/mahjong_ranking/templates/mahjong_ranking/eventhanchan_form.html
new file mode 100755
index 0000000..de744d9
--- /dev/null
+++ b/src/mahjong_ranking/templates/mahjong_ranking/eventhanchan_form.html
@@ -0,0 +1,69 @@
+{% extends "events/event_detail.html" %}{% load i18n humanize thumbnail %}
+
+{% block title %}Hanchans: {{ event.name }}{% endblock %}
+
+{% block maincontent %}
{% trans 'Edit Hanchans' %}
+
+
+{% endblock %}
+
+{% block comments %}{% endblock %}{% block buttonbar %}{% endblock %}
diff --git a/src/mahjong_ranking/urls.py b/src/mahjong_ranking/urls.py
index 8ec9615..4158f5c 100644
--- a/src/mahjong_ranking/urls.py
+++ b/src/mahjong_ranking/urls.py
@@ -4,14 +4,15 @@ from django.conf.urls import url
from django.views.generic import RedirectView
from . import views
-
urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^$',
RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)),
- url(r'^event/(?P[\d]+)/mahjong/$',
- views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P[\d]+)/add-hanchan/$',
views.HanchanForm.as_view(), name="add-hanchan-form"),
+ url(r'^event/(?P[\d]+)/edit/$',
+ views.EventHanchanForm.as_view(), name="event-hanchan-form"),
+ url(r'^event/(?P[\d]+)/mahjong/$',
+ views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P[\d]+)/mahjong-ranking/$',
views.EventRankingList.as_view(), name="event-ranking"),
url(r'^hanchan/(?P[\d]+)/edit/$',
@@ -32,6 +33,7 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
views.PlayerLadderScore.as_view(), name="player-ladder-score"),
url(r'^mahjong/$', views.KyuDanRankingList.as_view(),
name="kyudanranking-list"),
- url(r'^mahjong/(?P[\+\-\w]+)/$',
+ url(r'^mahjong/(?P[\+\-][a-z_]+)/$',
views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
]
+
diff --git a/src/mahjong_ranking/views.py b/src/mahjong_ranking/views.py
index e39abdf..1c305b1 100644
--- a/src/mahjong_ranking/views.py
+++ b/src/mahjong_ranking/views.py
@@ -16,6 +16,7 @@ from kasu import xlsx
from . import forms, models
from .mixins import MahjongMixin
+DEFAULT_KYU_DAN_ORDER = '-score'
KYU_DAN_ORDER = { # map sort URL args to Django ORM order_by args
'+full_name': ('user__last_name', 'user__first_name'),
'-full_name': ('-user__last_name', '-user__first_name'),
@@ -107,6 +108,47 @@ class HanchanForm(SuccessMessageMixin, EventDetailMixin,
'one.') % self.object
+class EventHanchanForm(EventDetailMixin, PermissionRequiredMixin,
+ generic.TemplateView):
+ """Display a Formset to add and Edit Hanchans of the specific Event."""
+ permission_required = 'mahjong_ranking.edit_hanchan'
+ template_name = 'mahjong_ranking/eventhanchan_form.html'
+ model=models.Hanchan
+
+ def get_context_data(self, **kwargs):
+ self.event = models.Event.objects.get(pk=self.kwargs['event'])
+ context = super(EventHanchanForm, self).get_context_data()
+ context['formset'] = self.formset
+ return context
+
+ def get(self, request, *args, **kwargs):
+ self.get_queryset()
+ self.formset = forms.HanchanFormset(
+ instance=self.event,
+ initial=[{'start': self.event.start}]
+ )
+ context = self.get_context_data(**kwargs)
+ return self.render_to_response(context)
+
+ def post(self, request, *args, **kwargs):
+ print("ICH WURDE GEPOSTET!!!!")
+ self.get_queryset()
+ self.formset = forms.HanchanFormset(
+ self.request.POST,
+ self.request.FILES,
+ instance=self.event,
+ initial=[{'start': self.event.start}]
+ )
+ if self.formset.is_valid():
+ self.formset.save()
+ return django.http.HttpResponseRedirect(
+ reverse('event-hanchan-form', kwargs={'event': self.event.pk})
+ )
+ context = self.get_context_data(**kwargs)
+ return self.render_to_response(context)
+
+
+
class EventHanchanList(EventDetailMixin, generic.ListView):
"List all hanchans played on a given event."
model = models.Hanchan
@@ -120,15 +162,15 @@ class EventRankingList(EventDetailMixin, generic.ListView):
class KyuDanRankingList(MahjongMixin, generic.ListView):
"""List all Players with an Kyu or Dan score. """
- default_order = '-score'
- order_by = ''
+ order_by = None
paginate_by = 25
def dispatch(self, request, *args, **kwargs):
"""Set the order_by settings, revert to default_order if necessary."""
- self.order_by = KYU_DAN_ORDER[
- kwargs.get('order_by', self.default_order)
- ]
+ if kwargs.get('order_by') in KYU_DAN_ORDER.keys():
+ self.order_by = KYU_DAN_ORDER[kwargs.get('order_by')]
+ else:
+ self.order_by = KYU_DAN_ORDER[DEFAULT_KYU_DAN_ORDER]
return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
def get_queryset(self):