From 0c1f82a3c7e2b08614abfb88ff66946c7ec7554f Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sun, 26 Jan 2020 08:29:14 +0000 Subject: [PATCH] Add API route to generate member's application PDF forms --- apiserver/apiserver/api/utils.py | 45 ++++++++++++++++++++++++++- apiserver/apiserver/api/views.py | 13 ++++++-- apiserver/docs/source/api.rst | 12 +++++++ apiserver/misc/blank_member_form.pdf | Bin 0 -> 45605 bytes apiserver/requirements.txt | 2 ++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 apiserver/misc/blank_member_form.pdf diff --git a/apiserver/apiserver/api/utils.py b/apiserver/apiserver/api/utils.py index 0bf1dea..b6f6ba6 100644 --- a/apiserver/apiserver/api/utils.py +++ b/apiserver/apiserver/api/utils.py @@ -1,9 +1,13 @@ -from rest_framework.exceptions import ValidationError import datetime +import io +from rest_framework.exceptions import ValidationError from dateutil import relativedelta from uuid import uuid4 from PIL import Image from bleach.sanitizer import Cleaner +from PyPDF2 import PdfFileWriter, PdfFileReader +from reportlab.pdfgen import canvas +from reportlab.lib.pagesizes import letter from django.db.models import Sum @@ -239,3 +243,42 @@ def link_old_member(data, user): for t in training: t.user = user t.save() + + +BLANK_FORM = 'misc/blank_member_form.pdf' +def generate_application_pdf(member): + packet = io.BytesIO() + + can = canvas.Canvas(packet, pagesize=letter) + can.drawRightString(580, 770, '{} {} ({})'.format( + member['first_name'], + member['last_name'], + member['id'], + )) + can.drawString(34, 683, member['first_name']) + can.drawString(218, 683, member['last_name']) + can.drawString(403, 683, member['preferred_name']) + can.drawString(34, 654, member['street_address']) + can.drawString(275, 654, member['city']) + can.drawString(459, 654, member['postal_code']) + can.drawString(34, 626, member['email']) + can.drawString(332, 626, member['phone']) + can.drawString(34, 570, member['emergency_contact_name']) + can.drawString(332, 570, member['emergency_contact_phone']) + can.save() + + packet.seek(0) + new_pdf = PdfFileReader(packet) + existing_pdf = PdfFileReader(open(BLANK_FORM, 'rb')) + output = PdfFileWriter() + page = existing_pdf.getPage(0) + page.mergePage(new_pdf.getPage(0)) + output.addPage(page) + page = existing_pdf.getPage(1) + output.addPage(page) + page = existing_pdf.getPage(2) + output.addPage(page) + + outputStream = io.BytesIO() + output.write(outputStream) + return outputStream diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index cabe35a..4c267b3 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -1,6 +1,8 @@ from django.contrib.auth.models import User, Group from django.shortcuts import get_object_or_404 from django.db.models import Max +from django.http import HttpResponse +from django.core.files.base import File from rest_framework import viewsets, views, mixins, generics, exceptions from rest_framework.decorators import action from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS @@ -110,7 +112,7 @@ class MemberViewSet(Base, Retrieve, Update): def pause(self, request, pk=None): if not is_admin_director(self.request.user): raise exceptions.PermissionDenied() - member = get_object_or_404(self.queryset, pk=pk) + member = self.get_object() member.paused_date = datetime.date.today() member.save() return Response(200) @@ -119,13 +121,20 @@ class MemberViewSet(Base, Retrieve, Update): def unpause(self, request, pk=None): if not is_admin_director(self.request.user): raise exceptions.PermissionDenied() - member = get_object_or_404(self.queryset, pk=pk) + member = self.get_object() member.current_start_date = datetime.date.today() member.paused_date = None member.save() utils.tally_membership_months(member) return Response(200) + @action(detail=True) + def forms(self, request, pk=None): + member = self.get_object() + serializer = self.get_serializer(member) + form = utils.generate_application_pdf(serializer.data) + return HttpResponse(File(form), content_type='application/pdf') + class CardViewSet(Base, Create, Retrieve, Update, Destroy): permission_classes = [AllowMetadata | IsAuthenticated, IsObjOwnerOrAdmin] diff --git a/apiserver/docs/source/api.rst b/apiserver/docs/source/api.rst index 323e1ee..facbd15 100644 --- a/apiserver/docs/source/api.rst +++ b/apiserver/docs/source/api.rst @@ -343,6 +343,18 @@ Pausing / Unpausing Member :status 200: +Member PDF Forms +++++++++++++++++ + +.. http:get:: /members/(id)/forms/ + + Generate member's application PDF forms. Users can only view their own, + admins can view anyone's. + + :param id: + + :requestheader Authorization: ``Token `` + Search ------ diff --git a/apiserver/misc/blank_member_form.pdf b/apiserver/misc/blank_member_form.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da7ef9c2f863c641e2df1bef96ff53b7cb438370 GIT binary patch literal 45605 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 literal 0 HcmV?d00001 diff --git a/apiserver/requirements.txt b/apiserver/requirements.txt index 2c30f3d..d6fca8b 100644 --- a/apiserver/requirements.txt +++ b/apiserver/requirements.txt @@ -23,10 +23,12 @@ Pillow==7.0.0 pycparser==2.19 Pygments==2.5.2 pyparsing==2.4.6 +PyPDF2==1.26.0 python-dateutil==2.8.1 python-Levenshtein==0.12.0 python3-openid==3.1.0 pytz==2019.3 +reportlab==3.5.34 requests==2.22.0 requests-oauthlib==1.3.0 six==1.13.0