* Throw 404 instead of a 503 in Event Mixins if the related event does

not exist.
* Changes in the KyuDanRanking View to be more stable if we get bogus
kwargs.
This commit is contained in:
2018-01-10 02:02:35 +01:00
parent cce6ac6014
commit afd163298c
5 changed files with 135 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
"""Mixins for Events.""" """Mixins for Events."""
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404
from . import models from . import models
@@ -34,12 +34,14 @@ class EventDetailMixin(object):
:return: TemplateContext object""" :return: TemplateContext object"""
context = super(EventDetailMixin, self).get_context_data(**kwargs) context = super(EventDetailMixin, self).get_context_data(**kwargs)
if hasattr(self, 'event') and self.event: if hasattr(self, 'event'):
context['event'] = self.event context['event'] = self.event
elif hasattr(self, 'object') and isinstance(self.object, models.Event): elif hasattr(self, 'object') and isinstance(self.object, models.Event):
context['event'] = self.object context['event'] = self.object
elif hasattr(self, 'object') and hasattr(self.object, 'event'): elif hasattr(self, 'object') and hasattr(self.object, 'event'):
context['event'] = self.object.event context['event'] = self.object.event
else:
print("No Event in Context!")
return context return context
def get_queryset(self): def get_queryset(self):
@@ -49,12 +51,9 @@ class EventDetailMixin(object):
:return: a django QuerySets :return: a django QuerySets
""" """
if self.model == models.Event: 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() queryset = self.model.objects.all()
else: else:
try: self.event = get_object_or_404(models.Event, pk=self.kwargs['event'])
self.event = models.Event.objects.get(pk=self.kwargs['event'])
queryset = self.model.objects.filter(event=self.event) queryset = self.model.objects.filter(event=self.event)
except models.Event.DoesNotExist:
raise Http404(_('Event does not exist'))
return queryset.prefetch_related() return queryset.prefetch_related()

View File

@@ -10,6 +10,7 @@ from django import forms
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from . import models from . import models
from events.models import Event
USER_MODEL = get_user_model() USER_MODEL = get_user_model()
@@ -58,3 +59,8 @@ class HanchanAdminForm(HanchanForm):
""" Extend the formfields to add the confirmed checkbox. """ """ Extend the formfields to add the confirmed checkbox. """
model = models.Hanchan model = models.Hanchan
fields = HanchanForm.Meta.fields + ('confirmed',) fields = HanchanForm.Meta.fields + ('confirmed',)
HanchanFormset = forms.inlineformset_factory(Event, models.Hanchan,
form=HanchanForm,
extra=1,
can_delete=True)

View File

@@ -0,0 +1,69 @@
{% extends "events/event_detail.html" %}{% load i18n humanize thumbnail %}
{% block title %}Hanchans: {{ event.name }}{% endblock %}
{% block maincontent %}<h2 class="grid_12">{% trans 'Edit Hanchans' %}</h2>
<form method="post" action="">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<fieldset class="hanchan">
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<p>
<label for="id_{{ form.start.html_name }}_0" class="field_name {{ form.start.css_classes }}">{{ form.start.label }}:</label>
{{ form.start }}
{{ form.start.errors }}
</p>
<table>
<thead>
<tr>
<th>{{form.player1.label}}</th>
<th>{{form.player2.label}}</th>
<th>{{form.player3.label}}</th>
<th>{{form.player4.label}}</th>
</tr>
</thead>
<tr>
<td>{{ form.player1 }}</td>
<td>{{ form.player2 }}</td>
<td>{{ form.player3 }}</td>
<td>{{ form.player4 }}</td>
</tr>
<tr>
<td>{{ form.player1_input_score }}</td>
<td>{{ form.player2_input_score }}</td>
<td>{{ form.player3_input_score }}</td>
<td>{{ form.player4_input_score }}</td>
</tr>
<tr>
<td>{{ form.player1.errors }} {{ form.player1_input_score.errors }}</td>
<td>{{ form.player2.errors }} {{ form.player2_input_score.errors }}</td>
<td>{{ form.player3.errors }} {{ form.player3_input_score.errors }}</td>
<td>{{ form.player4.errors }} {{ form.player4_input_score.errors }}</td>
</tr>
</table>
<p><label for="id_{{ form.comment.html_name }}" class="field_name {{ form.comment.css_classes }}">{{ form.comment.label }}:</label>
{{ form.comment }}
{{ form.comment.errors }}
</p>
<p>
<label for="id_{{ form.DELETE.html_name }}" class="field_name {{ form.DELETE.css_classes }}">{{ form.DELETE.label }}:</label>
{{ form.DELETE }} {{form.DELETE.help_text}}
{{ form.DELETE.errors }}
</p>
<p> {{ form.non_field_errors }}</p>
</fieldset>
{% endfor %}
{% if formset.errors %}<ul class="error">{{ formset.errors|unordered_list }} </ul> {% endif %}
<p class="buttonbar">
<a href="{% url 'event-hanchan-list' event.pk %}" class="button"><span class="fa fa-undo"></span> {% trans 'back' %}</a>
<button type="submit"><span class="fa fa-hdd-o"></span> {% trans 'save' %}</button>
</p>
</form>
{% endblock %}
{% block comments %}{% endblock %}{% block buttonbar %}{% endblock %}

View File

@@ -4,14 +4,15 @@ from django.conf.urls import url
from django.views.generic import RedirectView from django.views.generic import RedirectView
from . import views from . import views
urlpatterns = [ # Ignore PyLintBear (C0103) urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^$', url(r'^$',
RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)), RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)),
url(r'^event/(?P<event>[\d]+)/mahjong/$',
views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P<event>[\d]+)/add-hanchan/$', url(r'^event/(?P<event>[\d]+)/add-hanchan/$',
views.HanchanForm.as_view(), name="add-hanchan-form"), views.HanchanForm.as_view(), name="add-hanchan-form"),
url(r'^event/(?P<event>[\d]+)/edit/$',
views.EventHanchanForm.as_view(), name="event-hanchan-form"),
url(r'^event/(?P<event>[\d]+)/mahjong/$',
views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P<event>[\d]+)/mahjong-ranking/$', url(r'^event/(?P<event>[\d]+)/mahjong-ranking/$',
views.EventRankingList.as_view(), name="event-ranking"), views.EventRankingList.as_view(), name="event-ranking"),
url(r'^hanchan/(?P<hanchan>[\d]+)/edit/$', url(r'^hanchan/(?P<hanchan>[\d]+)/edit/$',
@@ -32,6 +33,7 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
views.PlayerLadderScore.as_view(), name="player-ladder-score"), views.PlayerLadderScore.as_view(), name="player-ladder-score"),
url(r'^mahjong/$', views.KyuDanRankingList.as_view(), url(r'^mahjong/$', views.KyuDanRankingList.as_view(),
name="kyudanranking-list"), name="kyudanranking-list"),
url(r'^mahjong/(?P<order_by>[\+\-\w]+)/$', url(r'^mahjong/(?P<order_by>[\+\-][a-z_]+)/$',
views.KyuDanRankingList.as_view(), name="kyudanranking-list"), views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
] ]

View File

@@ -16,6 +16,7 @@ from kasu import xlsx
from . import forms, models from . import forms, models
from .mixins import MahjongMixin from .mixins import MahjongMixin
DEFAULT_KYU_DAN_ORDER = '-score'
KYU_DAN_ORDER = { # map sort URL args to Django ORM order_by args 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'),
'-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 '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): class EventHanchanList(EventDetailMixin, generic.ListView):
"List all hanchans played on a given event." "List all hanchans played on a given event."
model = models.Hanchan model = models.Hanchan
@@ -120,15 +162,15 @@ class EventRankingList(EventDetailMixin, generic.ListView):
class KyuDanRankingList(MahjongMixin, generic.ListView): class KyuDanRankingList(MahjongMixin, generic.ListView):
"""List all Players with an Kyu or Dan score. """ """List all Players with an Kyu or Dan score. """
default_order = '-score' order_by = None
order_by = ''
paginate_by = 25 paginate_by = 25
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
"""Set the order_by settings, revert to default_order if necessary.""" """Set the order_by settings, revert to default_order if necessary."""
self.order_by = KYU_DAN_ORDER[ if kwargs.get('order_by') in KYU_DAN_ORDER.keys():
kwargs.get('order_by', self.default_order) 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) return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):