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