paulb@5 | 1 | #!/usr/bin/env python |
paulb@5 | 2 | |
paulb@5 | 3 | "A WebStack application for a PEP 241 repository." |
paulb@5 | 4 | |
paulb@5 | 5 | import WebStack.Generic |
paulb@353 | 6 | import XSLForms.Resources.WebResources |
paulb@88 | 7 | import XSLForms.Utils |
paulb@5 | 8 | import os |
paulb@5 | 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 setting. |
paulb@560 | 17 | |
paulb@560 | 18 | encoding = "utf-8" |
paulb@560 | 19 | |
paulb@102 | 20 | # Resource classes. |
paulb@102 | 21 | |
paulb@353 | 22 | class PEP241Resource(XSLForms.Resources.WebResources.XSLFormsResource): |
paulb@5 | 23 | |
paulb@5 | 24 | "A resource providing repository browsing." |
paulb@5 | 25 | |
paulb@5 | 26 | resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") |
paulb@88 | 27 | template_resources = { |
paulb@303 | 28 | "pep241" : ("pep241_template.xhtml", "pep241_output.xsl") |
paulb@242 | 29 | } |
paulb@303 | 30 | init_resources = { |
paulb@303 | 31 | "pep241" : ("pep241_template.xhtml", "pep241_input.xsl") |
paulb@242 | 32 | } |
paulb@242 | 33 | document_resources = { |
paulb@242 | 34 | "categories" : "pep241_categories.xml" |
paulb@88 | 35 | } |
paulb@308 | 36 | in_page_resources = { |
paulb@514 | 37 | "platforms" : ("pep241", "pep241_output_platforms.xsl", "platforms"), |
paulb@514 | 38 | "supported-platforms" : ("pep241", "pep241_output_supported_platforms.xsl", "supported-platforms"), |
paulb@514 | 39 | "keywords" : ("pep241", "pep241_output_keywords.xsl", "keywords"), |
paulb@514 | 40 | "authors" : ("pep241", "pep241_output_authors.xsl", "authors"), |
paulb@514 | 41 | "dependencies" : ("pep241", "pep241_output_dependencies.xsl", "dependencies") |
paulb@308 | 42 | } |
paulb@5 | 43 | |
paulb@88 | 44 | def respond_to_form(self, trans, form): |
paulb@5 | 45 | |
paulb@88 | 46 | """ |
paulb@88 | 47 | Respond to a request having the given transaction 'trans' and the given |
paulb@88 | 48 | 'form' information. |
paulb@88 | 49 | """ |
paulb@26 | 50 | |
paulb@308 | 51 | in_page_resource = self.get_in_page_resource(trans) |
paulb@88 | 52 | parameters = form.get_parameters() |
paulb@88 | 53 | documents = form.get_documents() |
paulb@88 | 54 | selectors = form.get_selectors() |
paulb@5 | 55 | |
paulb@5 | 56 | # Ensure the presence of a document. |
paulb@5 | 57 | |
paulb@5 | 58 | if documents.has_key("package"): |
paulb@5 | 59 | package = documents["package"] |
paulb@5 | 60 | else: |
paulb@88 | 61 | package = form.new_instance("package") |
paulb@5 | 62 | |
paulb@26 | 63 | # Add and remove elements according to the selectors found. |
paulb@26 | 64 | |
paulb@88 | 65 | XSLForms.Utils.add_elements(selectors.get("add_platform"), "platform", "platforms") |
paulb@88 | 66 | XSLForms.Utils.remove_elements(selectors.get("remove_platform")) |
paulb@88 | 67 | XSLForms.Utils.add_elements(selectors.get("add_supported_platform"), "supported-platform", "supported-platforms") |
paulb@88 | 68 | XSLForms.Utils.remove_elements(selectors.get("remove_supported_platform")) |
paulb@88 | 69 | XSLForms.Utils.add_elements(selectors.get("add_keyword"), "keyword", "keywords") |
paulb@88 | 70 | XSLForms.Utils.remove_elements(selectors.get("remove_keyword")) |
paulb@88 | 71 | XSLForms.Utils.add_elements(selectors.get("add_author"), "author", "authors") |
paulb@88 | 72 | XSLForms.Utils.remove_elements(selectors.get("remove_author")) |
paulb@88 | 73 | XSLForms.Utils.add_elements(selectors.get("add_dependency"), "dependency", "dependencies") |
paulb@88 | 74 | XSLForms.Utils.remove_elements(selectors.get("remove_dependency")) |
paulb@5 | 75 | |
paulb@26 | 76 | # Send a response according to certain parameters. |
paulb@26 | 77 | # When exported, an XML version of the data is returned. |
paulb@26 | 78 | |
paulb@26 | 79 | if parameters.has_key("export"): |
paulb@560 | 80 | trans.set_content_type(WebStack.Generic.ContentType("text/xml", encoding)) |
paulb@88 | 81 | package.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) |
paulb@18 | 82 | |
paulb@26 | 83 | # When not exported, the data is transformed to produce a normal Web |
paulb@26 | 84 | # page. |
paulb@26 | 85 | |
paulb@26 | 86 | else: |
paulb@18 | 87 | |
paulb@26 | 88 | # Transform, adding enumerations/ranges. |
paulb@5 | 89 | |
paulb@303 | 90 | input_xsl = self.prepare_initialiser("pep241") |
paulb@242 | 91 | categories_xml = self.prepare_document("categories") |
paulb@303 | 92 | package = self.get_result([input_xsl], package, references={"category" : categories_xml}) |
paulb@5 | 93 | |
paulb@26 | 94 | # Start the response. |
paulb@26 | 95 | |
paulb@560 | 96 | trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", encoding)) |
paulb@5 | 97 | |
paulb@26 | 98 | # Ensure that an output stylesheet exists. |
paulb@5 | 99 | |
paulb@308 | 100 | if in_page_resource in self.in_page_resources.keys(): |
paulb@514 | 101 | trans_xsl = self.prepare_fragment(in_page_resource) |
paulb@308 | 102 | stylesheet_parameters = self.prepare_parameters(parameters) |
paulb@308 | 103 | else: |
paulb@308 | 104 | trans_xsl = self.prepare_output("pep241") |
paulb@308 | 105 | stylesheet_parameters = {} |
paulb@26 | 106 | |
paulb@26 | 107 | # Complete the response. |
paulb@26 | 108 | |
paulb@303 | 109 | self.send_output(trans, [trans_xsl], package, stylesheet_parameters) |
paulb@303 | 110 | |
paulb@303 | 111 | #from XSLTools import XSLOutput |
paulb@303 | 112 | #import sys |
paulb@303 | 113 | #proc = XSLOutput.Processor([trans_xsl], parameters=stylesheet_parameters) |
paulb@303 | 114 | #proc.send_output(sys.stderr, "iso-8859-1", package) |
paulb@5 | 115 | |
paulb@102 | 116 | # Site map initialisation. |
paulb@102 | 117 | |
paulb@102 | 118 | def get_site(): |
paulb@102 | 119 | |
paulb@102 | 120 | "Return a simple Web site resource." |
paulb@102 | 121 | |
paulb@102 | 122 | # Get the main resource and the directory used by the application. |
paulb@102 | 123 | |
paulb@102 | 124 | pep241_resource = PEP241Resource() |
paulb@102 | 125 | directory = pep241_resource.resource_dir |
paulb@102 | 126 | |
paulb@102 | 127 | # Make a simple Web site. |
paulb@102 | 128 | |
paulb@102 | 129 | resource = MapResource({ |
paulb@102 | 130 | # Static resources: |
paulb@102 | 131 | "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), |
paulb@308 | 132 | "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), |
paulb@308 | 133 | # In-page resources: |
paulb@308 | 134 | "platforms" : pep241_resource, |
paulb@309 | 135 | "supported-platforms" : pep241_resource, |
paulb@309 | 136 | "keywords" : pep241_resource, |
paulb@313 | 137 | "authors" : pep241_resource, |
paulb@314 | 138 | "dependencies" : pep241_resource, |
paulb@102 | 139 | # Main page: |
paulb@102 | 140 | "" : pep241_resource |
paulb@102 | 141 | }) |
paulb@102 | 142 | |
paulb@560 | 143 | return EncodingSelector(resource, encoding) |
paulb@102 | 144 | |
paulb@514 | 145 | # Resource preparation ahead of time - useful for making installations. |
paulb@514 | 146 | |
paulb@514 | 147 | def prepare_resources(): |
paulb@514 | 148 | for cls in [PEP241Resource]: |
paulb@514 | 149 | XSLForms.Resources.WebResources.prepare_resources(cls) |
paulb@514 | 150 | |
paulb@5 | 151 | # vim: tabstop=4 expandtab shiftwidth=4 |