sprint/SprintLib/BaseView.py
Egor Matveev d8946dc267 done
2021-11-22 15:33:26 +03:00

79 lines
2.5 KiB
Python

from typing import Optional
from django.db import transaction
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponseRedirect, JsonResponse
from django.shortcuts import render
from django.utils import timezone
from SprintLib.EntityStorage import EntityStorage
class AccessError(Exception):
pass
class BaseView:
request: WSGIRequest = None
context: dict = {}
entities = EntityStorage()
required_login: Optional[bool] = None
view_file: Optional[str] = None
@classmethod
def as_view(cls):
@transaction.atomic
def execute(request):
if request.user.is_authenticated:
user_info = request.user.userinfo
user_info.last_request = timezone.now()
user_info.save()
c = cls()
if c.required_login is not None:
if c.required_login and not request.user.is_authenticated:
return HttpResponseRedirect("/enter")
if not c.required_login and request.user.is_authenticated:
return HttpResponseRedirect("/")
request_method = request.method.lower()
c.request = request
exec("from Main.models import *")
for key in request.GET.keys():
if key.endswith("_id"):
model_name = key.rstrip("_id")
c.entities.add(
model_name,
eval(model_name.capitalize()).objects.get(
id=int(request.GET[key])
),
)
context = c.entities.entities
if "action" in request.POST.keys():
request_method += "_" + request.POST["action"]
method = getattr(c, request_method, None)
try:
data = c.pre_handle()
if method:
if data is None:
data = method()
if type(data) == str:
return HttpResponseRedirect(data)
if type(data) == dict:
return JsonResponse(data)
if data is not None:
return data
context = {**context, **c.context}
return render(request, c.view_file, context)
except AccessError:
return HttpResponseRedirect("/")
return execute
def pre_handle(self):
pass
def get(self):
pass
def post(self):
pass