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 44 def select_activity(self, trans, form): 45 form.set_activity("questionnaire") 46 47 def create_document(self, trans, form): 48 if XSLFormsResource.create_document(self, trans, form): 49 questions_xml = self.prepare_document("questions") 50 questions = libxml2dom.parse(questions_xml) 51 doc = form.get_document() 52 imported_questions = doc.importNode(questions.documentElement, 1) 53 doc.replaceChild(imported_questions, doc.documentElement) 54 55 def respond_to_input(self, trans, form): 56 57 parameters = form.get_parameters() 58 selectors = form.get_selectors() 59 questionnaire = form.get_document() 60 61 # Send a response according to certain parameters. 62 # When saved, an XML version of the data is employed. 63 64 if parameters.has_key("finish"): 65 repository = DirectoryRepository(storage_directory) 66 key = str(time.time()) 67 output_filename = repository.lock(key, 1) 68 try: 69 questionnaire.toStream(open(output_filename, "wb"), "utf-8", prettyprint=1) 70 finally: 71 repository.unlock(key) 72 73 # Site map initialisation. 74 75 def get_site(): 76 77 "Return a simple Web site resource." 78 79 # Get the main resource and the directory used by the application. 80 81 questionnaire_resource = QuestionnairePlayerResource() 82 directory = questionnaire_resource.resource_dir 83 84 # Make a simple Web site. 85 86 resource = MapResource({ 87 # Static resources: 88 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 89 # Main page: 90 "" : questionnaire_resource 91 }) 92 93 return EncodingSelector(resource, encoding) 94 95 # Resource preparation ahead of time - useful for making installations. 96 97 def prepare_resources(): 98 for cls in [QuestionnairePlayerResource]: 99 xslforms_prepare_resources(cls) 100 101 # vim: tabstop=4 expandtab shiftwidth=4