diff --git a/PyRIGS/views.py b/PyRIGS/views.py index 1a47b7da..4479a97a 100644 --- a/PyRIGS/views.py +++ b/PyRIGS/views.py @@ -321,45 +321,59 @@ class OEmbedView(generic.View): return JsonResponse(data) +def get_info_string(user): + user_str = f"by {user.name} " if user else "" + time = timezone.now().strftime('%d/%m/%Y %H:%I') + return f"[Paperwork generated {user_str}on {time}" + + +def render_pdf_response(template, context, append_terms): + merger = PdfFileMerger() + rml = template.render(context) + buffer = rml2pdf.parseString(rml) + merger.append(PdfFileReader(buffer)) + buffer.close() + + if append_terms: + terms = urllib.request.urlopen(settings.TERMS_OF_HIRE_URL) + merger.append(BytesIO(terms.read())) + + merged = BytesIO() + merger.write(merged) + + response = HttpResponse(content_type='application/pdf') + f = context['filename'] + response['Content-Disposition'] = f'filename="{f}"' + response.write(merged.getvalue()) + return response + class PrintView(generic.View): append_terms = False def get_context_data(self, **kwargs): obj = get_object_or_404(self.model, pk=self.kwargs['pk']) - user_str = f"by {self.request.user.name} " if self.request.user is not None else "" - time = timezone.now().strftime('%d/%m/%Y %H:%I') object_name = re.sub(r'[^a-zA-Z0-9 \n\.]', '', obj.name) context = { 'object': obj, 'current_user': self.request.user, 'object_name': object_name, - 'info_string': f"[Paperwork generated {user_str}on {time} - {obj.current_version_id}]", + 'info_string': get_info_string(self.request.user) + "- {obj.current_version_id}]", } return context def get(self, request, pk): - template = get_template(self.template_name) + return render_pdf_response(get_template(self.template_name), self.get_context_data(), self.append_terms) - merger = PdfFileMerger() - context = self.get_context_data() +class PrintListView(generic.ListView): + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + context['current_user'] = self.request.user, + context['info_string'] = get_info_string(self.request.user) + "]" + return context - rml = template.render(context) - buffer = rml2pdf.parseString(rml) - merger.append(PdfFileReader(buffer)) - buffer.close() - - if self.append_terms: - terms = urllib.request.urlopen(settings.TERMS_OF_HIRE_URL) - merger.append(BytesIO(terms.read())) - - merged = BytesIO() - merger.write(merged) - - response = HttpResponse(content_type='application/pdf') - f = context['filename'] - response['Content-Disposition'] = f'filename="{f}"' - response.write(merged.getvalue()) - return response + def get(self, request): + self.object_list = self.get_queryset() + return render_pdf_response(get_template(self.template_name), self.get_context_data(), False) diff --git a/RIGS/static/imgs/paperwork/corner-tr-su.jpg b/RIGS/static/imgs/paperwork/corner-tr-su.jpg index 4cbe1298..e1f960fa 100644 Binary files a/RIGS/static/imgs/paperwork/corner-tr-su.jpg and b/RIGS/static/imgs/paperwork/corner-tr-su.jpg differ diff --git a/RIGS/templates/base_print.xml b/RIGS/templates/base_print.xml index 04bcfdd9..40c5e773 100644 --- a/RIGS/templates/base_print.xml +++ b/RIGS/templates/base_print.xml @@ -11,6 +11,7 @@ + @@ -27,6 +28,8 @@ + + diff --git a/training/templates/item_list.xml b/training/templates/item_list.xml new file mode 100644 index 00000000..8e4f57e9 --- /dev/null +++ b/training/templates/item_list.xml @@ -0,0 +1,23 @@ +{% extends 'base_print.xml' %} + +{% block content %} +

TEC Training Item List

+ +{% for category in categories %} + +

{{category}}

+ {% for item in category.items.all %} +

{{ item }}

+ {{ item.description }} + {% if item.prerequisites.exists %} +

Prerequisites:

+
    + {% for p in item.prerequisites.all %} +
  • {{p}}
  • + {% endfor %} +
+ {% endif %} + + {% endfor %} +{% endfor %} +{% endblock %} diff --git a/training/urls.py b/training/urls.py index de0dd2e6..55ab7523 100644 --- a/training/urls.py +++ b/training/urls.py @@ -8,6 +8,7 @@ from versioning.views import VersionHistory urlpatterns = [ path('items/', login_required(views.ItemList.as_view()), name='item_list'), + path('items/export/', login_required(views.ItemListExport.as_view()), name='item_list_export'), path('item//qualified_users/', login_required(views.ItemQualifications.as_view()), name='item_qualification'), path('trainee/list/', login_required(views.TraineeList.as_view()), name='trainee_list'), diff --git a/training/views.py b/training/views.py index 50d1c4a6..67084689 100644 --- a/training/views.py +++ b/training/views.py @@ -7,7 +7,7 @@ from django.db import transaction from django.db.models import Q, Count from django.db.utils import IntegrityError -from PyRIGS.views import is_ajax, ModalURLMixin, get_related +from PyRIGS.views import is_ajax, ModalURLMixin, get_related, PrintListView from training import models, forms from users import views from reversion.views import RevisionMixin @@ -24,6 +24,17 @@ class ItemList(generic.ListView): return context +class ItemListExport(PrintListView): + model = models.TrainingItem + template_name = 'item_list.xml' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['filename'] = f"TrainingItemList.pdf" + context["categories"] = models.TrainingCategory.objects.all() + return context + + class TraineeDetail(views.ProfileDetail): template_name = "trainee_detail.html" model = models.Trainee