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"