paulb@31 | 1 | #!/usr/bin/env python |
paulb@31 | 2 | |
paulb@31 | 3 | "A WebStack questionnaire application." |
paulb@31 | 4 | |
paulb@31 | 5 | import WebStack.Generic |
paulb@662 | 6 | from XSLForms.Resources.WebResources import \ |
paulb@662 | 7 | XSLFormsResource, output, resources, prepare_resources as xslforms_prepare_resources |
paulb@31 | 8 | import os |
paulb@31 | 9 | |
paulb@102 | 10 | # Site map imports. |
paulb@102 | 11 | |
paulb@102 | 12 | from WebStack.Resources.ResourceMap import MapResource |
paulb@560 | 13 | from WebStack.Resources.Selectors import EncodingSelector |
paulb@102 | 14 | from WebStack.Resources.Static import DirectoryResource |
paulb@102 | 15 | |
paulb@560 | 16 | # Configuration settings. |
paulb@560 | 17 | |
paulb@560 | 18 | encoding = "utf-8" |
paulb@560 | 19 | |
paulb@102 | 20 | # Resource classes. |
paulb@102 | 21 | |
paulb@662 | 22 | class QuestionnaireEditorResource(XSLFormsResource): |
paulb@31 | 23 | |
paulb@31 | 24 | "A resource providing a questionnaire editor." |
paulb@31 | 25 | |
paulb@662 | 26 | resource_dir = resources(__file__) |
paulb@90 | 27 | template_resources = { |
paulb@662 | 28 | "questionnaire" : output("question_template.xhtml") |
paulb@90 | 29 | } |
paulb@31 | 30 | |
paulb@662 | 31 | def select_activity(self, trans, form): |
paulb@662 | 32 | form.set_activity("questionnaire") |
paulb@31 | 33 | |
paulb@662 | 34 | def respond_to_input(self, trans, form): |
paulb@31 | 35 | |
paulb@90 | 36 | parameters = form.get_parameters() |
paulb@90 | 37 | selectors = form.get_selectors() |
paulb@662 | 38 | questionnaire = form.get_document() |
paulb@31 | 39 | |
paulb@662 | 40 | self.remove_elements(selectors.get("remove-question")) |
paulb@662 | 41 | self.add_elements(selectors.get("add-choice"), "choice") |
paulb@662 | 42 | self.remove_elements(selectors.get("remove-choice")) |
paulb@31 | 43 | |
paulb@31 | 44 | # Add questions using the normal request parameter. |
paulb@31 | 45 | |
paulb@31 | 46 | if parameters.has_key("add-question"): |
paulb@31 | 47 | new_question = questionnaire.ownerDocument.createElementNS(None, "question") |
paulb@31 | 48 | questionnaire.xpath("questionnaire")[0].appendChild(new_question) |
paulb@31 | 49 | |
paulb@31 | 50 | # Send a response according to certain parameters. |
paulb@31 | 51 | # When exported, an XML version of the data is returned. |
paulb@31 | 52 | |
paulb@31 | 53 | if parameters.has_key("export"): |
paulb@560 | 54 | trans.set_content_type(WebStack.Generic.ContentType("text/xml", encoding)) |
paulb@90 | 55 | questionnaire.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) |
paulb@662 | 56 | raise WebStack.Generic.EndOfResponse |
paulb@31 | 57 | |
paulb@102 | 58 | # Site map initialisation. |
paulb@102 | 59 | |
paulb@102 | 60 | def get_site(): |
paulb@102 | 61 | |
paulb@102 | 62 | "Return a simple Web site resource." |
paulb@102 | 63 | |
paulb@102 | 64 | # Get the main resource and the directory used by the application. |
paulb@102 | 65 | |
paulb@102 | 66 | questionnaire_resource = QuestionnaireEditorResource() |
paulb@102 | 67 | directory = questionnaire_resource.resource_dir |
paulb@102 | 68 | |
paulb@102 | 69 | # Make a simple Web site. |
paulb@102 | 70 | |
paulb@102 | 71 | resource = MapResource({ |
paulb@102 | 72 | # Static resources: |
paulb@102 | 73 | "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), |
paulb@102 | 74 | # Main page: |
paulb@102 | 75 | "" : questionnaire_resource |
paulb@102 | 76 | }) |
paulb@102 | 77 | |
paulb@560 | 78 | return EncodingSelector(resource, encoding) |
paulb@102 | 79 | |
paulb@514 | 80 | # Resource preparation ahead of time - useful for making installations. |
paulb@514 | 81 | |
paulb@514 | 82 | def prepare_resources(): |
paulb@514 | 83 | for cls in [QuestionnaireEditorResource]: |
paulb@662 | 84 | xslforms_prepare_resources(cls) |
paulb@514 | 85 | |
paulb@31 | 86 | # vim: tabstop=4 expandtab shiftwidth=4 |