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