107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
|
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)
|
||
|
)
|