* 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:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
69
src/mahjong_ranking/templates/mahjong_ranking/eventhanchan_form.html
Executable file
69
src/mahjong_ranking/templates/mahjong_ranking/eventhanchan_form.html
Executable 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 %}
|
||||
@@ -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<event>[\d]+)/mahjong/$',
|
||||
views.EventHanchanList.as_view(), name="event-hanchan-list"),
|
||||
url(r'^event/(?P<event>[\d]+)/add-hanchan/$',
|
||||
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/$',
|
||||
views.EventRankingList.as_view(), name="event-ranking"),
|
||||
url(r'^hanchan/(?P<hanchan>[\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<order_by>[\+\-\w]+)/$',
|
||||
url(r'^mahjong/(?P<order_by>[\+\-][a-z_]+)/$',
|
||||
views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
|
||||
]
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user