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