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