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)