105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
from django.conf import settings
|
|
from django.contrib import staticfiles
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.views.generic import ListView
|
|
|
|
import requests
|
|
import weasyprint
|
|
|
|
from membershipworks.models import Member
|
|
from .models import Certification, Department
|
|
|
|
WIKI_URL = settings.WIKI_URL
|
|
|
|
|
|
class MemberCertificationListView(ListView):
|
|
template_name = "paperwork/member_certifications.dj.html"
|
|
context_object_name = "certifications"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["show_outdated"] = (
|
|
self.request.GET.get("show_outdated", "false").lower() == "true"
|
|
)
|
|
return context
|
|
|
|
def get_queryset(self):
|
|
self.member = get_object_or_404(Member, uid=self.kwargs["uid"])
|
|
return Certification.objects.filter(member=self.member)
|
|
|
|
|
|
@login_required
|
|
def department_certifications(request):
|
|
departments = Department.objects.prefetch_related("shop_lead_flag__members")
|
|
if request.user.is_superuser:
|
|
departments = departments.all()
|
|
elif hasattr(request.user, "ldap_user"):
|
|
user_member = Member.objects.get(
|
|
uid=request.user.ldap_user.attrs["employeeNumber"][0]
|
|
)
|
|
# TODO: could be a lot simpler if membershipworks was in the same database
|
|
# TODO: should also select children
|
|
member_flags = list(user_member.flags.all().values_list("pk", flat=True))
|
|
departments = departments.filter(shop_lead_flag__in=member_flags)
|
|
else:
|
|
departments = []
|
|
|
|
certifications = Certification.objects.filter(
|
|
certification_version__definition__department__in=departments
|
|
).prefetch_related(
|
|
"certification_version__definition__department",
|
|
"member",
|
|
)
|
|
|
|
return render(
|
|
request,
|
|
"paperwork/department_certifications.dj.html",
|
|
{"departments": departments, "certifications": certifications},
|
|
)
|
|
|
|
|
|
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}"',
|
|
},
|
|
)
|