accessibility-checker-api/webproj/accessibility_checker/views.py

145 lines
4.4 KiB
Python

import json
from pathlib import Path
from typing import Dict, List, Set
from django.http.response import JsonResponse
from django.http.response import HttpResponse
# from django.shortcuts import render
from django.shortcuts import redirect
from django.views.generic import TemplateView, View
from . import models
from . import services
# Create your views here.
def favicon(request):
b = (Path('.')/'templates'/'favicon.ico').read_bytes()
return HttpResponse(b, content_type='image/x-icon')
class Root(TemplateView):
template_name = 'index.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["requested_reports"] = models.RequestedReport.objects.order_by(
'-id')[:10].all()
return context
def post(self, request):
urls_s = request.POST.get('urls', '')
urls = list(filter(len, map(str.strip, urls_s.splitlines())))
depth = int(request.POST.get('depth', '0'))
return redirect('work', 0, depth, '\r\n'.join(urls).encode('utf-8').hex(), permanent=False)
class FullList(TemplateView):
template_name = 'full_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["requested_reports"] = models.RequestedReport.objects.order_by(
'-id').all()
return context
class Work(View):
def get(self, request, after: int, depth: int, hexurls: str):
nxt = ['index', 'api'][after]
urls = list(filter(len, map(str.strip, bytes.fromhex(
hexurls).decode('utf-8').splitlines())))
services.AccessibilityCheckerService().assess_many(
urls,
depth
)
return redirect(nxt)
class Details(TemplateView):
template_name = 'details.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["requested_report"] = models.RequestedReport.objects.filter(
pk=context['pk']).first()
return context
class FullLines(TemplateView):
template_name = 'full_lines.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["page_report"] = models.PageReport.objects.filter(
pk=context['pk']).first()
return context
def model_to_json_simple(m):
j = {**m.__dict__}
del j['_state']
return j
def replace_id_for_model(m, j, l):
del j[f'{l}_id']
j[l] = model_to_json_simple(getattr(m, l, {}))
class ApiAll(View):
def get(self, request):
x = list()
for i in models.RequestedReport.objects.order_by('-id').all():
d = model_to_json_simple(i)
d['reports'] = list(map(lambda a: a.pk, i.reports.all()))
x.append(d)
return JsonResponse(x, safe=False)
class ApiDetails(View):
def get(self, request, pk):
j = models.RequestedReport.objects.filter(pk=pk).first()
e = model_to_json_simple(j)
e['reports'] = list()
for i in j.reports.all():
d = model_to_json_simple(i)
replace_id_for_model(i, d, 'url')
e['reports'].append(d)
return JsonResponse(e, safe=False)
class ApiDetailsFull(View):
def get(self, request, pk):
j = models.RequestedReport.objects.filter(pk=pk).first()
e = model_to_json_simple(j)
e['reports'] = list()
for i in j.reports.all():
d = model_to_json_simple(i)
replace_id_for_model(i, d, 'url')
d['lines'] = list()
e['reports'].append(d)
for k in i.lines.all():
f = model_to_json_simple(k)
replace_id_for_model(k, f, 'subject_of_concern')
replace_id_for_model(k, f, 'generator')
replace_id_for_model(k, f, 'pattern')
d['lines'].append(f)
return JsonResponse(e, safe=False)
class ApiLines(View):
def get(self, request, ppk, pk):
j = models.PageReport.objects.filter(pk=pk).first()
e = model_to_json_simple(j)
replace_id_for_model(j, e, 'url')
e['lines'] = list()
for i in j.lines.all():
d = model_to_json_simple(i)
replace_id_for_model(i, d, 'subject_of_concern')
replace_id_for_model(i, d, 'generator')
replace_id_for_model(i, d, 'pattern')
e['lines'].append(d)
return JsonResponse(e, safe=False)