# HG changeset patch # User paulb # Date 1121381678 0 # Node ID 98963b9961792e9b0191f6cc05e6e372408a1f10 # Parent 7f85d5ca7740da3afb9e38a0390c425bb941281a [project @ 2005-07-14 22:54:38 by paulb] Updated the application to use the XSLForms.Resources resource class. diff -r 7f85d5ca7740 -r 98963b996179 examples/Common/Questionnaire/__init__.py --- a/examples/Common/Questionnaire/__init__.py Thu Jul 14 22:54:26 2005 +0000 +++ b/examples/Common/Questionnaire/__init__.py Thu Jul 14 22:54:38 2005 +0000 @@ -3,87 +3,43 @@ "A WebStack questionnaire application." import WebStack.Generic -import XSLForms.Fields -import XSLForms.Output -import XSLOutput -import libxml2dom +import XSLForms.Resources +import XSLForms.Utils import os -# NOTE: Move these functions into a common utility library. - -def add_elements(positions, element_name, element_parent_name=None): - if not positions: - return - for position in positions: - if element_parent_name: - parent_elements = position.xpath(element_parent_name) - if not parent_elements: - parent_element = position.ownerDocument.createElementNS(None, element_parent_name) - position.appendChild(parent_element) - else: - parent_element = parent_elements[0] - else: - parent_element = position - parent_element.appendChild(position.ownerDocument.createElementNS(None, element_name)) - -def remove_elements(positions): - if not positions: - return - for position in positions: - position.parentNode.removeChild(position) - -# NOTE: This is so much like ConfiguratorResource that some common parts could -# NOTE: be extracted. - -class QuestionnaireEditorResource: +class QuestionnaireEditorResource(XSLForms.Resources.XSLFormsResource): "A resource providing a questionnaire editor." resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") encoding = "utf-8" - - def respond(self, trans): - - # Produce stylesheet. + template_resources = { + "question" : ("question_template.xhtml", "question_output.xsl") + } - if trans.get_path_info().split("/")[-1] == "styles.css": - trans.set_content_type(WebStack.Generic.ContentType("text/css", self.encoding)) - out = trans.get_response_stream() - f = open(os.path.join(self.resource_dir, "styles.css"), "rb") - out.write(f.read()) - f.close() - raise WebStack.Generic.EndOfResponse + def respond_to_form(self, trans, form): - global XSLForms # NOTE: Strangely required to avoid UnboundLocalError! - method = trans.get_request_method() - - # Only obtain field information according to the stated method. + """ + Respond to a request having the given transaction 'trans' and the given + 'form' information. + """ - if method == "GET": - fields = XSLForms.Fields.Fields(encoding="iso-8859-1", values_are_lists=1) - parameters = trans.get_fields_from_path() - documents = fields.make_documents(parameters.items()) - elif method == "POST": - fields = XSLForms.Fields.Fields(encoding=self.encoding, values_are_lists=1) - parameters = trans.get_fields_from_body(self.encoding) - documents = fields.make_documents(parameters.items()) - else: - trans.set_response_code(405) - raise WebStack.Generic.EndOfResponse + parameters = form.get_parameters() + documents = form.get_documents() + selectors = form.get_selectors() # Ensure the presence of a document. if documents.has_key("questionnaire"): questionnaire = documents["questionnaire"] else: - questionnaire = fields.new_instance("questionnaire") + questionnaire = form.new_instance("questionnaire") # Add and remove elements according to the selectors found. - selectors = fields.get_selectors(parameters.items(), documents) - remove_elements(selectors.get("remove-question")) - add_elements(selectors.get("add-choice"), "choice") - remove_elements(selectors.get("remove-choice")) + XSLForms.Utils.remove_elements(selectors.get("remove-question")) + XSLForms.Utils.add_elements(selectors.get("add-choice"), "choice") + XSLForms.Utils.remove_elements(selectors.get("remove-choice")) # Add questions using the normal request parameter. @@ -96,7 +52,7 @@ if parameters.has_key("export"): trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) - libxml2dom.toStream(questionnaire, trans.get_response_stream(), trans.get_response_stream_encoding()) + questionnaire.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) # When not exported, the data is transformed to produce a normal Web # page. @@ -109,20 +65,10 @@ # Ensure that an output stylesheet exists. - trans_xsl = os.path.join(self.resource_dir, "question_output.xsl") - template_xml = os.path.join(self.resource_dir, "question_template.xhtml") - - if not os.path.exists(trans_xsl) or \ - os.path.getmtime(trans_xsl) < os.path.getmtime(template_xml): - - import XSLForms.Prepare - template_xml = os.path.join(self.resource_dir, "question_template.xhtml") - XSLForms.Prepare.make_stylesheet(template_xml, trans_xsl) + trans_xsl = self.prepare_output("question") # Complete the response. - proc = XSLOutput.Processor([trans_xsl]) - proc.send_output(trans.get_response_stream(), trans.get_response_stream_encoding(), - questionnaire) + self.send_output(trans, [trans_xsl], questionnaire) # vim: tabstop=4 expandtab shiftwidth=4