1 #!/usr/bin/env python 2 3 "A WebStack questionnaire application." 4 5 import WebStack.Generic 6 import XSLForms.Resources.WebResources 7 import XSLForms.Utils 8 import os 9 10 # Site map imports. 11 12 from WebStack.Resources.ResourceMap import MapResource 13 from WebStack.Resources.Static import DirectoryResource 14 15 # Resource classes. 16 17 class QuestionnaireEditorResource(XSLForms.Resources.WebResources.XSLFormsResource): 18 19 "A resource providing a questionnaire editor." 20 21 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 22 encoding = "utf-8" 23 template_resources = { 24 "question" : ("question_template.xhtml", "question_output.xsl") 25 } 26 27 def respond_to_form(self, trans, form): 28 29 """ 30 Respond to a request having the given transaction 'trans' and the given 31 'form' information. 32 """ 33 34 parameters = form.get_parameters() 35 documents = form.get_documents() 36 selectors = form.get_selectors() 37 38 # Ensure the presence of a document. 39 40 if documents.has_key("questionnaire"): 41 questionnaire = documents["questionnaire"] 42 else: 43 questionnaire = form.new_instance("questionnaire") 44 45 # Add and remove elements according to the selectors found. 46 47 XSLForms.Utils.remove_elements(selectors.get("remove-question")) 48 XSLForms.Utils.add_elements(selectors.get("add-choice"), "choice") 49 XSLForms.Utils.remove_elements(selectors.get("remove-choice")) 50 51 # Add questions using the normal request parameter. 52 53 if parameters.has_key("add-question"): 54 new_question = questionnaire.ownerDocument.createElementNS(None, "question") 55 questionnaire.xpath("questionnaire")[0].appendChild(new_question) 56 57 # Send a response according to certain parameters. 58 # When exported, an XML version of the data is returned. 59 60 if parameters.has_key("export"): 61 trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) 62 questionnaire.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) 63 64 # When not exported, the data is transformed to produce a normal Web 65 # page. 66 67 else: 68 69 # Start the response. 70 71 trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", self.encoding)) 72 73 # Ensure that an output stylesheet exists. 74 75 trans_xsl = self.prepare_output("question") 76 77 # Complete the response. 78 79 self.send_output(trans, [trans_xsl], questionnaire) 80 81 # Site map initialisation. 82 83 def get_site(): 84 85 "Return a simple Web site resource." 86 87 # Get the main resource and the directory used by the application. 88 89 questionnaire_resource = QuestionnaireEditorResource() 90 directory = questionnaire_resource.resource_dir 91 92 # Make a simple Web site. 93 94 resource = MapResource({ 95 # Static resources: 96 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 97 # Main page: 98 "" : questionnaire_resource 99 }) 100 101 return resource 102 103 # Resource preparation ahead of time - useful for making installations. 104 105 def prepare_resources(): 106 for cls in [QuestionnaireEditorResource]: 107 XSLForms.Resources.WebResources.prepare_resources(cls) 108 109 # vim: tabstop=4 expandtab shiftwidth=4