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