reddit-image-wall-getter/hash_thumbnailer_distributed/webproj/thumbnailer/views.py

67 lines
2.1 KiB
Python

import json
from django.http import HttpResponse, JsonResponse
from django.http.request import HttpRequest
from django.shortcuts import get_object_or_404, render
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View
from webproj.thumbnailer.models import ErrorLog, Job, Log, PerformanceLog, ToJsonableMixin
# Create your views here.
@method_decorator(csrf_exempt, name='dispatch')
class JobsView(View):
def get(self, request: HttpRequest):
job: Job = Job.objects.filter(taken_at=None, result=None).first()
if job is None:
job = Job.objects.filter(result=None).order_by('taken_at').first()
if job is None:
return HttpResponse('done')
job.taken_at = timezone.now()
job.save()
return HttpResponse(f'{job.pk}')
@method_decorator(csrf_exempt, name='dispatch')
class JobView(View):
def get(self, request: HttpRequest, job_id: int):
job = get_object_or_404(Job, id=job_id)
job.taken_at = timezone.now()
job.save()
return JsonResponse(job.to_jsonable(), safe=False)
def post(self, request, job_id):
job = get_object_or_404(Job, id=job_id)
job.result = json.dumps(json.loads(request.body))
job.save()
return HttpResponse('ok')
class LogView(View):
model = Log
def post(self, request: HttpRequest):
Logging = type(self).model
logging = Logging()
logging.sender = json.dumps(json.loads(request.POST['sender']))
logging.content = json.dumps(json.loads(request.POST['content']))
logging.save()
return JsonResponse(logging.to_jsonable(), safe=False)
def get(self, request: HttpRequest):
return JsonResponse(list(map(ToJsonableMixin.to_jsonable, type(self).model.objects.all())), safe=False)
@method_decorator(csrf_exempt, name='dispatch')
class LogErrorView(LogView):
model = ErrorLog
@method_decorator(csrf_exempt, name='dispatch')
class LogPerformanceView(LogView):
model = PerformanceLog