You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.1 KiB
144 lines
4.1 KiB
1 year ago
|
import qrcode
|
||
|
import base64
|
||
|
import io
|
||
|
|
||
|
from django.contrib.auth import get_user
|
||
|
from django.shortcuts import redirect, get_object_or_404
|
||
|
from django.urls import reverse
|
||
|
from django.views.generic import DetailView
|
||
|
from django.views.generic.base import TemplateView
|
||
|
from django.core.exceptions import PermissionDenied
|
||
|
from django.db import transaction
|
||
|
|
||
|
from . import logika
|
||
|
from .models import Stanoviste, Tym
|
||
|
from .utils.hash import get_hash_now, get_hash_previous, get_hash_preprevious
|
||
|
from .utils.doba import Doba
|
||
|
|
||
|
|
||
|
# Jen hloupé rozhazovátko
|
||
|
def hra_view(request):
|
||
|
user = request.user
|
||
|
if not user.is_authenticated:
|
||
|
return redirect(reverse("login"))
|
||
|
|
||
|
stanoviste = Stanoviste.objects.filter(user=user.id).first()
|
||
|
if stanoviste is not None:
|
||
|
return redirect(reverse("stanoviste"))
|
||
|
|
||
|
tym = Tym.objects.filter(user=user.id).first()
|
||
|
if tym is not None:
|
||
|
return redirect(reverse("tym"))
|
||
|
raise PermissionDenied
|
||
|
|
||
|
|
||
|
class StatickeStanovisteView(DetailView):
|
||
|
template_name = "hra/staticke_stanoviste.html"
|
||
|
model = Stanoviste
|
||
|
|
||
|
def get_object(self, queryset=None):
|
||
|
if "stanoviste" in self.kwargs:
|
||
|
return get_object_or_404(Stanoviste, id=self.kwargs["stanoviste"])
|
||
|
user = get_user(self.request)
|
||
|
stanoviste = Stanoviste.objects.filter(user=user.id).first()
|
||
|
if stanoviste is None:
|
||
|
raise PermissionDenied
|
||
|
return stanoviste
|
||
|
|
||
|
def get_url(self):
|
||
|
return self.request.build_absolute_uri(reverse(
|
||
|
"tym",
|
||
|
kwargs={
|
||
|
"stanoviste": self.object.id,
|
||
|
"my_hash": get_hash_now(self.object.id),
|
||
|
}
|
||
|
))
|
||
|
|
||
|
@staticmethod
|
||
|
def get_base64_qr_code(url: str):
|
||
|
buffer = io.BytesIO()
|
||
|
qrcode.make(url).save(buffer)
|
||
|
# https://stackoverflow.com/a/75157188
|
||
|
img_str = base64.b64encode(buffer.getvalue())
|
||
|
return img_str.decode("utf-8") # convert to str and cut b'' chars
|
||
|
|
||
|
def get_context_data(self, **kwargs):
|
||
|
context = super().get_context_data()
|
||
|
url = self.get_url()
|
||
|
context["url"] = url
|
||
|
context["image64"] = self.get_base64_qr_code(url)
|
||
|
return context
|
||
|
|
||
|
|
||
|
class TymView(DetailView):
|
||
|
template_name = "hra/tym.html"
|
||
|
model = Tym
|
||
|
|
||
|
def get_object(self, queryset=None):
|
||
|
user = get_user(self.request)
|
||
|
tym = Tym.objects.filter(user=user.id).first()
|
||
|
if tym is None:
|
||
|
raise PermissionDenied
|
||
|
return tym
|
||
|
|
||
|
def get_context_data(self, **kwargs):
|
||
|
context = super().get_context_data()
|
||
|
context["doba"] = self.object.doba
|
||
|
return context
|
||
|
|
||
|
|
||
|
class StanovisteZPohleduTymu(TemplateView):
|
||
|
stanoviste_id: int
|
||
|
stanoviste: Stanoviste
|
||
|
tym: Tym
|
||
|
doba: Doba
|
||
|
|
||
|
def get_template_names(self):
|
||
|
PREFIX = "hra/stanoviste/"
|
||
|
return PREFIX + self.stanoviste.template
|
||
|
|
||
|
def setup(self, request, *args, **kwargs):
|
||
|
super().setup(request, *args, **kwargs)
|
||
|
self.stanoviste_id = self.kwargs["stanoviste"]
|
||
|
self.stanoviste = get_object_or_404(Stanoviste, id=self.stanoviste_id)
|
||
|
self.tym = get_object_or_404(Tym, user=self.request.user.id)
|
||
|
self.doba = self.tym.doba
|
||
|
|
||
|
def dispatch(self, request, *args, **kwargs):
|
||
|
if not self.pristupne():
|
||
|
return redirect(reverse("timeout"))
|
||
|
return super().dispatch(request, *args, **kwargs)
|
||
|
|
||
|
def pristupne(self):
|
||
|
my_hash = self.kwargs["my_hash"]
|
||
|
return my_hash == get_hash_now(self.stanoviste_id) or my_hash == get_hash_previous(self.stanoviste_id) or my_hash == get_hash_preprevious(self.stanoviste_id)
|
||
|
|
||
|
def get_posible_choices(self) -> list[str]:
|
||
|
return logika.get_posible_choices[self.stanoviste.id](self.doba, self.tym)
|
||
|
|
||
|
def get_context_data(self, **kwargs):
|
||
|
context = super().get_context_data()
|
||
|
context["stanoviste"] = self.stanoviste
|
||
|
context["tym"] = self.tym
|
||
|
context["doba"] = self.doba
|
||
|
context["choices"] = self.get_posible_choices()
|
||
|
return context
|
||
|
|
||
|
def post(self, request, *args, **kwargs):
|
||
|
context = self.get_context_data(**kwargs)
|
||
|
self.template_name = "hra/staticke_stanoviste.html"
|
||
|
choice = self.request.POST.get("choice", None)
|
||
|
with transaction.atomic():
|
||
|
if (choice is None) or (choice not in self.get_posible_choices()):
|
||
|
# raise PermissionDenied
|
||
|
pass
|
||
|
else:
|
||
|
context["zadosti"] = logika.apply_choice[self.stanoviste.id][choice](self.doba, self.tym)
|
||
|
context["choice"] = choice
|
||
|
del(context["choices"])
|
||
|
return self.render_to_response(context)
|
||
|
|
||
|
|
||
|
class TimeoutViwe(TemplateView):
|
||
|
template_name = "hra/timeout.html"
|