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' %}

+ +
+ {% csrf_token %} + {{ formset.management_form }} + + {% for form in formset %} +
+ {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} +

+ + {{ form.start }} + {{ form.start.errors }} +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{form.player1.label}}{{form.player2.label}}{{form.player3.label}}{{form.player4.label}}
{{ form.player1 }}{{ form.player2 }}{{ form.player3 }}{{ form.player4 }}
{{ form.player1_input_score }}{{ form.player2_input_score }}{{ form.player3_input_score }}{{ form.player4_input_score }}
{{ form.player1.errors }} {{ form.player1_input_score.errors }}{{ form.player2.errors }} {{ form.player2_input_score.errors }}{{ form.player3.errors }} {{ form.player3_input_score.errors }}{{ form.player4.errors }} {{ form.player4_input_score.errors }}
+

+ {{ form.comment }} + {{ form.comment.errors }} +

+

+ + {{ form.DELETE }} {{form.DELETE.help_text}} + {{ form.DELETE.errors }} +

+

{{ form.non_field_errors }}

+
+ {% endfor %} + {% if formset.errors %} {% endif %} + +

+ {% trans 'back' %} + +

+
+{% 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):