* 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 6796b58d4c
commit 4b0a5c9c82
5 changed files with 135 additions and 17 deletions

View File

@@ -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)

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 . 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"),
]

View File

@@ -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):