initial
This commit is contained in:
98
BaseLib/BaseView.py
Normal file
98
BaseLib/BaseView.py
Normal file
@@ -0,0 +1,98 @@
|
||||
import typing
|
||||
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
from django.http import HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from BaseLib.BaseEntity import BaseEntity
|
||||
from BaseLib.bot import notify_if_needed
|
||||
|
||||
|
||||
class AccessError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class BaseView(BaseEntity):
|
||||
request: WSGIRequest
|
||||
context: typing.Optional[typing.Dict] = None
|
||||
required_login: typing.Optional[bool] = None
|
||||
view_file: typing.Optional[str] = None
|
||||
endpoint: typing.Optional[str] = None
|
||||
fields_except: typing.Tuple[str] = ()
|
||||
|
||||
def __init__(self, request):
|
||||
self.context = {}
|
||||
self.request = request
|
||||
|
||||
def get_user(self):
|
||||
return self.request.user
|
||||
|
||||
@classmethod
|
||||
def as_path(cls):
|
||||
return cls.endpoint, cls.as_view()
|
||||
|
||||
@classmethod
|
||||
def as_view(cls):
|
||||
@csrf_exempt
|
||||
def execute(request: WSGIRequest):
|
||||
try:
|
||||
c = cls(request)
|
||||
if c.required_login is not None:
|
||||
if c.required_login and not request.user.is_authenticated:
|
||||
return HttpResponseRedirect("/welcome")
|
||||
if (
|
||||
not c.required_login
|
||||
and request.user.is_authenticated
|
||||
):
|
||||
return HttpResponseRedirect("/")
|
||||
request_method = request.method.lower()
|
||||
exec("from Platform.common_models import *")
|
||||
context = {}
|
||||
for key in request.GET.keys():
|
||||
if key.endswith("_id") and key not in cls.fields_except:
|
||||
model_name = key[:-3]
|
||||
setattr(
|
||||
c,
|
||||
model_name,
|
||||
eval(model_name[0].upper() + model_name[1:]).objects.get(
|
||||
id=int(request.GET[key])
|
||||
),
|
||||
)
|
||||
context[model_name] = getattr(c, model_name)
|
||||
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 isinstance(data, BaseView):
|
||||
return HttpResponseRedirect(data.endpoint)
|
||||
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}
|
||||
res = render(request, c.view_file, context)
|
||||
res.headers["X-Frame-Options"] = "ALLOW"
|
||||
return res
|
||||
except AccessError:
|
||||
return HttpResponseRedirect("/")
|
||||
except Exception as exc:
|
||||
notify_if_needed(exc)
|
||||
raise
|
||||
|
||||
return execute
|
||||
|
||||
def pre_handle(self):
|
||||
pass
|
||||
|
||||
def get(self):
|
||||
pass
|
||||
|
||||
def post(self):
|
||||
pass
|
Reference in New Issue
Block a user