This repository has been archived on 2025-11-04. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
csmb-housewars/housewars/views.py

70 lines
2.6 KiB
Python

from django.contrib import messages
from django.db.models import Count, F, Q, Subquery, OuterRef
from django.db.models.functions import Coalesce
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import CreateView
from formtools.wizard.views import SessionWizardView
from .forms import ActivityForm, PointsEntryForm, UserEntryForm
from .models import Activity, Quota, PointsEntry, UserEntry
FORMS = [("user", UserEntryForm),
("activity", ActivityForm)]
TEMPLATES = {"user": "housewars/entry_form.html",
"activity": "housewars/activity_form.html"}
class EntryCreateView(SessionWizardView):
form_list = FORMS
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
def post(self, *args, **kwargs):
form = self.get_form(data=self.request.POST, files=self.request.FILES)
if not form.is_valid():
if (form.errors.as_data().get('__all__')):
for error in form.errors.as_data().get('__all__'):
messages.error(self.request, error.messages[0])
return super().post(*args, **kwargs)
def get_form(self, step=None, data=None, files=None):
form = super().get_form(step, data, files)
if step == 'activity':
cd = self.storage.get_step_data('user')
quota = Quota.objects.filter(
house=cd.get('user-house'), activity=OuterRef('id')).values('quota')
filtered1 = Activity.objects.filter(time__isnull=False).annotate(final_quota=Coalesce(Subquery(quota[:1]), F('default_quota'))).annotate(count=Count(
'activity1', filter=Q(activity1__house=cd.get('user-house')))).filter(final_quota__gt=F('count'))
filtered2 = Activity.objects.filter(time__isnull=False).annotate(final_quota=Coalesce(Subquery(quota[:1]), F('default_quota'))).annotate(count=Count(
'activity1', filter=Q(activity1__house=cd.get('user-house')))).filter(final_quota__gt=F('count'), time=30)
form.fields['activity1'].queryset = filtered1
form.fields['activity2'].queryset = filtered2
return form
def done(self, form_list, **kwargs):
UserEntry.objects.create(**self.get_all_cleaned_data())
messages.success(self.request, 'Your entry has been submitted')
return redirect('housewars:signup')
def get_success_url(self):
return reverse('housewars:signup')
class CreatePointsEntry(CreateView):
model = PointsEntry
form_class = PointsEntryForm
def get_success_url(self):
return reverse('housewars:add_points')