* 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."""
|
"""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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
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 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"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user