Files
Exam/utils/decorators.py
2026-01-09 18:28:10 +08:00

92 lines
3.3 KiB
Python

# -*- coding: utf-8 -*-
import datetime
import logging
from functools import wraps
from django.shortcuts import render
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from competition.models import CompetitionKindInfo
from utils.errors import (CompetitionError, CompetitionHasEnded,
CompetitionNotFound, CompetitionNotStarted,
ProfileError, ProfileNotFound)
from utils.response import json_response
def check_login(func=None):
@wraps(func)
def wrapper(request, *args, **kwargs):
uid = request.session.get('uid', '')
if not uid:
if request.path.startswith('/bs'):
return render(request, 'err.html', ProfileNotFound)
elif request.path.startswith('/api'):
return json_response(*ProfileError.ProfileNotFound)
return func(request, *args, **kwargs)
return wrapper
def check_copstatus(func=None):
@wraps(func)
def wrapper(request, *args, **kwargs):
kind_id = request.GET.get('kind_id', '') or request.POST.get('kind_id', '')
try:
kind_info = CompetitionKindInfo.objects.get(kind_id=kind_id)
except CompetitionKindInfo.DoesNotExist:
if request.path.startswith('/bs'):
return render(request, 'err.html', CompetitionNotFound)
if request.path.startswith('/api'):
return json_response(*CompetitionError.CompetitionNotFound)
if kind_info.cop_finishat < datetime.datetime.now(tz=datetime.timezone.utc):
if request.path.startswith('/bs'):
return render(request, 'err.html', CompetitionHasEnded)
if request.path.startswith('/api'):
return json_response(*CompetitionError.CompetitionHasEnded)
if kind_info.cop_startat > datetime.datetime.now(tz=datetime.timezone.utc):
if request.path.startswith('/bs'):
return render(request, 'err.html', CompetitionNotStarted)
if request.path.startswith('/api'):
return json_response(*CompetitionError.CompetitionNotStarted)
return func(request, *args, **kwargs)
return wrapper
def logerr(func=None):
@wraps(func)
def wrapper(request, *args, **kwargs):
name = func.__name__
if not settings.DEBUG:
logger = logging.getLogger('file')
try:
logger.debug('func=%s&flag=%s&content=%s', name, 'BODY', request.body)
except Exception as e:
logger.error('func=%s&flag=%s&content=%s', name, 'ERROR', e)
if request.method == 'GET':
logger.debug('func=%s&flag=%s&content=%s', name, 'GET', request.GET)
if request.method == 'POST':
logger.debug('func=%s&flag=%s&content=%s', name, 'POST', request.POST)
response = func(request, *args, **kwargs)
try:
logger.debug('func=%s&flag=%s&content=%s', name, 'RESPONSE', response.content)
except Exception as e:
logger.error('func=%s&flag=%s&content=%s', name, 'ERROR', e)
return response
return func(request, *args, **kwargs)
return wrapper