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