paul@676 | 1 | #!/usr/bin/env python |
paul@676 | 2 | |
paul@676 | 3 | """ |
paul@676 | 4 | A WebStack application for "playing" questionnaires designed by the |
paul@676 | 5 | questionnaire editor. |
paul@676 | 6 | """ |
paul@676 | 7 | |
paul@676 | 8 | import WebStack.Generic |
paul@676 | 9 | from XSLForms.Resources.WebResources import \ |
paul@676 | 10 | XSLFormsResource, input, output, resources, prepare_resources as xslforms_prepare_resources |
paul@676 | 11 | import os |
paul@676 | 12 | import libxml2dom |
paul@676 | 13 | from WebStack.Repositories.Directory import DirectoryRepository |
paul@676 | 14 | import time |
paul@676 | 15 | |
paul@676 | 16 | # Site map imports. |
paul@676 | 17 | |
paul@676 | 18 | from WebStack.Resources.ResourceMap import MapResource |
paul@676 | 19 | from WebStack.Resources.Selectors import EncodingSelector |
paul@676 | 20 | from WebStack.Resources.Static import DirectoryResource |
paul@676 | 21 | |
paul@676 | 22 | # Configuration settings. |
paul@676 | 23 | |
paul@676 | 24 | encoding = "utf-8" |
paul@676 | 25 | storage_directory = os.path.join(os.getcwd(), "Responses") |
paul@676 | 26 | |
paul@676 | 27 | # Resource classes. |
paul@676 | 28 | |
paul@676 | 29 | class QuestionnairePlayerResource(XSLFormsResource): |
paul@676 | 30 | |
paul@676 | 31 | "A resource providing a questionnaire editor." |
paul@676 | 32 | |
paul@676 | 33 | resource_dir = resources(__file__) |
paul@676 | 34 | template_resources = { |
paul@676 | 35 | "questionnaire" : output("player_template.xhtml") |
paul@676 | 36 | } |
paul@676 | 37 | #init_resources = { |
paul@676 | 38 | # "questionnaire" : input("player_template.xhtml") |
paul@676 | 39 | # } |
paul@676 | 40 | document_resources = { |
paul@676 | 41 | "questions" : "questions.xml" |
paul@676 | 42 | } |
paul@676 | 43 | |
paul@676 | 44 | def select_activity(self, trans, form): |
paul@676 | 45 | form.set_activity("questionnaire") |
paul@676 | 46 | |
paul@676 | 47 | def create_document(self, trans, form): |
paul@676 | 48 | if XSLFormsResource.create_document(self, trans, form): |
paul@676 | 49 | questions_xml = self.prepare_document("questions") |
paul@676 | 50 | questions = libxml2dom.parse(questions_xml) |
paul@676 | 51 | doc = form.get_document() |
paul@676 | 52 | imported_questions = doc.importNode(questions.documentElement, 1) |
paul@676 | 53 | doc.replaceChild(imported_questions, doc.documentElement) |
paul@676 | 54 | |
paul@676 | 55 | def respond_to_input(self, trans, form): |
paul@676 | 56 | |
paul@676 | 57 | parameters = form.get_parameters() |
paul@676 | 58 | selectors = form.get_selectors() |
paul@676 | 59 | questionnaire = form.get_document() |
paul@676 | 60 | |
paul@676 | 61 | # Send a response according to certain parameters. |
paul@676 | 62 | # When saved, an XML version of the data is employed. |
paul@676 | 63 | |
paul@676 | 64 | if parameters.has_key("finish"): |
paul@676 | 65 | repository = DirectoryRepository(storage_directory) |
paul@676 | 66 | key = str(time.time()) |
paul@676 | 67 | output_filename = repository.lock(key, 1) |
paul@676 | 68 | try: |
paul@676 | 69 | questionnaire.toStream(open(output_filename, "wb"), "utf-8", prettyprint=1) |
paul@676 | 70 | finally: |
paul@676 | 71 | repository.unlock(key) |
paul@676 | 72 | |
paul@676 | 73 | # Site map initialisation. |
paul@676 | 74 | |
paul@676 | 75 | def get_site(): |
paul@676 | 76 | |
paul@676 | 77 | "Return a simple Web site resource." |
paul@676 | 78 | |
paul@676 | 79 | # Get the main resource and the directory used by the application. |
paul@676 | 80 | |
paul@676 | 81 | questionnaire_resource = QuestionnairePlayerResource() |
paul@676 | 82 | directory = questionnaire_resource.resource_dir |
paul@676 | 83 | |
paul@676 | 84 | # Make a simple Web site. |
paul@676 | 85 | |
paul@676 | 86 | resource = MapResource({ |
paul@676 | 87 | # Static resources: |
paul@676 | 88 | "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), |
paul@676 | 89 | # Main page: |
paul@676 | 90 | "" : questionnaire_resource |
paul@676 | 91 | }) |
paul@676 | 92 | |
paul@676 | 93 | return EncodingSelector(resource, encoding) |
paul@676 | 94 | |
paul@676 | 95 | # Resource preparation ahead of time - useful for making installations. |
paul@676 | 96 | |
paul@676 | 97 | def prepare_resources(): |
paul@676 | 98 | for cls in [QuestionnairePlayerResource]: |
paul@676 | 99 | xslforms_prepare_resources(cls) |
paul@676 | 100 | |
paul@676 | 101 | # vim: tabstop=4 expandtab shiftwidth=4 |