bornhack-website/src/backoffice/views/game.py

107 lines
3.3 KiB
Python
Raw Normal View History

import logging
from camps.mixins import CampViewMixin
from django.contrib import messages
from django.contrib.auth.models import User
from django.db.models import Count, Q
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import DetailView, ListView
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from tokens.models import Token, TokenFind
from ..mixins import (
RaisePermissionRequiredMixin,
)
logger = logging.getLogger("bornhack.%s" % __name__)
################################
# Secret Token views
class TokenListView(CampViewMixin, RaisePermissionRequiredMixin, ListView):
"""Show a list of secret tokens for this camp"""
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = Token
template_name = "token_list.html"
class TokenDetailView(CampViewMixin, RaisePermissionRequiredMixin, DetailView):
"""Show details for a token."""
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = Token
template_name = "token_detail.html"
class TokenCreateView(CampViewMixin, RaisePermissionRequiredMixin, CreateView):
"""Create a new Token."""
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = Token
template_name = "token_form.html"
fields = ["token", "category", "description"]
def form_valid(self, form):
token = form.save(commit=False)
token.camp = self.camp
token.save()
return redirect(
reverse(
"backoffice:token_detail",
kwargs={"camp_slug": self.camp.slug, "pk": token.id},
)
)
class TokenUpdateView(CampViewMixin, RaisePermissionRequiredMixin, UpdateView):
"""Update a token."""
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = Token
template_name = "token_form.html"
fields = ["token", "category", "description"]
class TokenDeleteView(CampViewMixin, RaisePermissionRequiredMixin, DeleteView):
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = Token
template_name = "token_delete.html"
def delete(self, *args, **kwargs):
self.get_object().tokenfind_set.all().delete()
return super().delete(*args, **kwargs)
def get_success_url(self):
messages.success(
self.request, "The Token and all related TokenFinds has been deleted"
)
return reverse("backoffice:token_list", kwargs={"camp_slug": self.camp.slug})
class TokenStatsView(CampViewMixin, RaisePermissionRequiredMixin, ListView):
"""Show stats for token finds for this camp"""
permission_required = ["camps.backoffice_permission", "camps.gameteam_permission"]
model = User
template_name = "token_stats.html"
def get_queryset(self, **kwargs):
tokenusers = (
TokenFind.objects.filter(token__camp=self.camp)
.distinct("user")
.values_list("user", flat=True)
)
return (
User.objects.filter(id__in=tokenusers)
.annotate(
token_find_count=Count(
"token_finds", filter=Q(token_finds__token__camp=self.camp)
)
)
.exclude(token_find_count=0)
)