diff --git a/rigForms/static/images/form-print/checked_checkbox.jpg b/rigForms/static/images/form-print/checked_checkbox.jpg new file mode 100644 index 00000000..9de2c75c Binary files /dev/null and b/rigForms/static/images/form-print/checked_checkbox.jpg differ diff --git a/rigForms/static/images/form-print/unchecked_checkbox.jpg b/rigForms/static/images/form-print/unchecked_checkbox.jpg new file mode 100644 index 00000000..c602955c Binary files /dev/null and b/rigForms/static/images/form-print/unchecked_checkbox.jpg differ diff --git a/rigForms/templates/rigForms/form_print.xml b/rigForms/templates/rigForms/form_print.xml new file mode 100644 index 00000000..3e192c6e --- /dev/null +++ b/rigForms/templates/rigForms/form_print.xml @@ -0,0 +1,96 @@ + +{% load multiply from filters %} +{% load static %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello this is some text + {% include "rigForms/form_print_page.xml" %} + + + \ No newline at end of file diff --git a/rigForms/templates/rigForms/form_print_page.xml b/rigForms/templates/rigForms/form_print_page.xml new file mode 100644 index 00000000..1060f43a --- /dev/null +++ b/rigForms/templates/rigForms/form_print_page.xml @@ -0,0 +1,17 @@ + + + + + {% autoescape off %} + + + + +{{ formData }} + + +{% endautoescape %} + + + + \ No newline at end of file diff --git a/rigForms/templates/rigForms/print/render-array.xml b/rigForms/templates/rigForms/print/render-array.xml new file mode 100644 index 00000000..6f410cfe --- /dev/null +++ b/rigForms/templates/rigForms/print/render-array.xml @@ -0,0 +1,16 @@ +{# "field" context should have "title", "description" and "value" #} +{# "children" context should be a string of inner XML #} + + + +

{{field.title}}

+ +
+ +{% autoescape off %} + +{% for child in children %} + {{ child }} +{% endfor %} + +{% endautoescape %} \ No newline at end of file diff --git a/rigForms/templates/rigForms/print/render-boolean.xml b/rigForms/templates/rigForms/print/render-boolean.xml new file mode 100644 index 00000000..74474b0a --- /dev/null +++ b/rigForms/templates/rigForms/print/render-boolean.xml @@ -0,0 +1,15 @@ +{# "field" context should have "title", "description"} + + + + + {% if value %} + + {% else %} + + {% endif %} + +

{{field.title}}

+ {{field.description}} + +
\ No newline at end of file diff --git a/rigForms/templates/rigForms/print/render-object.xml b/rigForms/templates/rigForms/print/render-object.xml new file mode 100644 index 00000000..a7769fe5 --- /dev/null +++ b/rigForms/templates/rigForms/print/render-object.xml @@ -0,0 +1,14 @@ +{# "field" context should have "title", "description" and "value" #} +{# "children" context should be a string of inner XML #} + + + +

{{field.title}}

+ +
+ +{% autoescape off %} + +{{ children }} + +{% endautoescape %} \ No newline at end of file diff --git a/rigForms/templates/rigForms/print/render-string.xml b/rigForms/templates/rigForms/print/render-string.xml new file mode 100644 index 00000000..d05758fd --- /dev/null +++ b/rigForms/templates/rigForms/print/render-string.xml @@ -0,0 +1,12 @@ +{# "field" context should have "title", "description" and "value"} + + + + +

{{field.title}}

+ {{field.description}} + + + {{value}} + +
\ No newline at end of file diff --git a/rigForms/urls.py b/rigForms/urls.py index 30c56091..abec91a0 100644 --- a/rigForms/urls.py +++ b/rigForms/urls.py @@ -11,5 +11,6 @@ urlpatterns = patterns('', name='update_form'), url(r'^for-event/(?P\d+)/$', permission_required_with_403('rigForms.view_form')(views.FormList.as_view()), name='form_list'), + url(r'^(?P\d+)/print/$', permission_required_with_403('rigForms.view_form')(views.FormPrint.as_view()), name='form_print'), ) diff --git a/rigForms/views.py b/rigForms/views.py index f22f80f7..14a7bd7f 100644 --- a/rigForms/views.py +++ b/rigForms/views.py @@ -7,6 +7,18 @@ from django.http.response import HttpResponseRedirect from django.core.urlresolvers import reverse_lazy, reverse, NoReverseMatch from django.db.models import Q +import json +from collections import OrderedDict +from z3c.rml import rml2pdf +from django.template.loader import get_template +from django.template import RequestContext +import cStringIO as StringIO +import re +import copy + + +from django.http import HttpResponse + import RIGS class FormCreate(generic.CreateView): @@ -76,5 +88,146 @@ class FormList(generic.ListView): return context +class FormPrint(generic.TemplateView): + def _render_object(self, field, value, current_indent): + # Render all the child form bits first + current_indent += 20 + children = self._render_field(field["properties"], value, current_indent) + current_indent -= 20 + template = get_template('rigForms/print/render-object.xml') + context = { + 'field': field, + 'children': children, + 'currentIndent':current_indent + } + return template.render(context) + + def _render_string(self, field, value, current_indent): + template = get_template('rigForms/print/render-string.xml') + context = { + 'field': field, + 'currentIndent':current_indent, + 'value':value + } + return template.render(context) + + def _render_array(self, field, value, current_indent): + # Render all the child form bits first + current_indent += 20 + children=[] + + try: + numberOfChildren = len(value) + + for key,item in enumerate(value): + thisField = copy.deepcopy(field["items"]) + try: + thisField["title"] = thisField["title"] + " " + str(key+1) + except KeyError: + pass + + children.append(self._render_field_item(thisField,item,current_indent)) + + except TypeError: + numberOfChildren = 0 + + current_indent -= 20 + + template = get_template('rigForms/print/render-array.xml') + context = { + 'field': field, + 'children': children, + 'currentIndent':current_indent + } + return template.render(context) + + + def _render_boolean(self, field, value, current_indent): + template = get_template('rigForms/print/render-boolean.xml') + context = { + 'field': field, + 'currentIndent':current_indent, + 'value':value + } + return template.render(context) + + def _render_field_item(self, field, value, current_indent): + result = "" + if type(field) is OrderedDict: + + if "type" in field: + if field["type"] == "object": + rendered = self._render_object(field,value,current_indent) + elif field["type"] == "string": + rendered = self._render_string(field,value,current_indent) + elif field["type"] == "array": + rendered = self._render_array(field,value,current_indent) + elif field["type"] == "boolean": + rendered = self._render_boolean(field,value,current_indent) + else: + rendered = "

an unknown field

" + # self._render_field(field,value,current_indent) + else: + rendered = "

No type:" + str(key) + str(field) + "

" + + result += rendered + else: + result += "

Not ordereddict:" + str(key) + str(field) + "

" + + return result + + + def _render_field(self, parentField, parentValue, current_indent): + result = "" + for (key,field) in parentField.items(): + try: + value = parentValue[str(key)] + except KeyError: + value = None + except TypeError: + value = None + + result += self._render_field_item(field, value, current_indent) + + return result + + def get(self, request, pk): + form = get_object_or_404(models.Form, pk=pk) + + jsonSchema = json.loads(form.schema.schema, object_pairs_hook=OrderedDict) + jsonData = json.loads(form.data, object_pairs_hook=OrderedDict) + + formData = self._render_field(jsonSchema["properties"], jsonData, 0) + + # For development return the raw string + # response = HttpResponse() + # response.write(pdfData) + # return response + + template = get_template('rigForms/form_print.xml') + + context = RequestContext(request, { + 'fonts': { + 'opensans': { + 'regular': 'RIGS/static/fonts/OPENSANS-REGULAR.TTF', + 'bold': 'RIGS/static/fonts/OPENSANS-BOLD.TTF', + } + }, + 'formData':formData + }) + + rml = template.render(context) + buffer = StringIO.StringIO() + + buffer = rml2pdf.parseString(rml) + + pdfData = buffer.read() + + # escapedEventName = re.sub('[^a-zA-Z0-9 \n\.]', '', object.name) + + response = HttpResponse(content_type='application/pdf') + response['Content-Disposition'] = "filename=Form.pdf" + response.write(pdfData) + return response