67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
from django.conf import settings
|
|
from django.contrib import staticfiles
|
|
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
|
|
from django.shortcuts import get_object_or_404
|
|
from django.views.generic import ListView
|
|
|
|
import requests
|
|
import weasyprint
|
|
|
|
from membershipworks.models import Member
|
|
from .models import Certification
|
|
|
|
WIKI_URL = settings.WIKI_URL
|
|
|
|
|
|
class MemberCertificationListView(ListView):
|
|
template_name = "paperwork/member_certifications.dj.html"
|
|
context_object_name = "certifications"
|
|
|
|
def get_queryset(self):
|
|
self.member = get_object_or_404(Member, uid=self.kwargs["uid"])
|
|
return Certification.objects.filter(member=self.member)
|
|
|
|
|
|
def certification_pdf(request, cert_name):
|
|
wiki_page = f"{cert_name.replace('_', ' ')} Certification"
|
|
|
|
r = requests.get(
|
|
WIKI_URL + "/api.php",
|
|
params={
|
|
"action": "askargs",
|
|
"conditions": wiki_page,
|
|
"printouts": "Version|Approval Date|Approval status",
|
|
"format": "json",
|
|
"api_version": "2",
|
|
"origin": "*",
|
|
},
|
|
)
|
|
|
|
results = r.json()["query"]["results"]
|
|
if wiki_page not in results:
|
|
return HttpResponseNotFound(
|
|
f'No such certification found on wiki: <a href="{WIKI_URL}/wiki/{wiki_page}">{wiki_page}</a>'
|
|
)
|
|
|
|
printouts = results[wiki_page]["printouts"]
|
|
if printouts["Approval status"] != ["approve"]:
|
|
return HttpResponseBadRequest(
|
|
f'Certification is not yet approved on wiki: <a href="{WIKI_URL}/wiki/{wiki_page}">{wiki_page}</a>'
|
|
)
|
|
|
|
filename = (
|
|
f'{wiki_page}_v{printouts["Version"][0]} - {printouts["Approval Date"][0]}.pdf'
|
|
)
|
|
|
|
html = weasyprint.HTML(f"{WIKI_URL}/index.php?title={wiki_page}")
|
|
|
|
stylesheet = staticfiles.finders.find("paperwork/certification-print.css")
|
|
pdf = html.write_pdf(stylesheets=[stylesheet])
|
|
return HttpResponse(
|
|
pdf,
|
|
headers={
|
|
"Content-Type": "application/pdf",
|
|
"Content-Disposition": f'inline; filename="{filename}"',
|
|
},
|
|
)
|