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 } 35 36 def respond_to_form(self, trans, form): 37 38 """ 39 Respond to a request having the given transaction 'trans' and the given 40 'form' information. 41 """ 42 43 in_page_resource = self.get_in_page_resource(trans) 44 parameters = form.get_parameters() 45 documents = form.get_documents() 46 selectors = form.get_selectors() 47 48 # Ensure the presence of a document. 49 50 if documents.has_key("package"): 51 package = documents["package"] 52 else: 53 package = form.new_instance("package") 54 55 # Add and remove elements according to the selectors found. 56 57 XSLForms.Utils.add_elements(selectors.get("add_platform"), "platform", "platforms") 58 XSLForms.Utils.remove_elements(selectors.get("remove_platform")) 59 XSLForms.Utils.add_elements(selectors.get("add_supported_platform"), "supported-platform", "supported-platforms") 60 XSLForms.Utils.remove_elements(selectors.get("remove_supported_platform")) 61 XSLForms.Utils.add_elements(selectors.get("add_keyword"), "keyword", "keywords") 62 XSLForms.Utils.remove_elements(selectors.get("remove_keyword")) 63 XSLForms.Utils.add_elements(selectors.get("add_author"), "author", "authors") 64 XSLForms.Utils.remove_elements(selectors.get("remove_author")) 65 XSLForms.Utils.add_elements(selectors.get("add_dependency"), "dependency", "dependencies") 66 XSLForms.Utils.remove_elements(selectors.get("remove_dependency")) 67 68 # Send a response according to certain parameters. 69 # When exported, an XML version of the data is returned. 70 71 if parameters.has_key("export"): 72 trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) 73 package.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) 74 75 # When not exported, the data is transformed to produce a normal Web 76 # page. 77 78 else: 79 80 # Transform, adding enumerations/ranges. 81 82 input_xsl = self.prepare_initialiser("pep241") 83 categories_xml = self.prepare_document("categories") 84 package = self.get_result([input_xsl], package, references={"category" : categories_xml}) 85 86 # Start the response. 87 88 trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", self.encoding)) 89 90 # Ensure that an output stylesheet exists. 91 92 if in_page_resource in self.in_page_resources.keys(): 93 trans_xsl = self.prepare_fragment("pep241", in_page_resource) 94 stylesheet_parameters = self.prepare_parameters(parameters) 95 else: 96 trans_xsl = self.prepare_output("pep241") 97 stylesheet_parameters = {} 98 99 # Complete the response. 100 101 self.send_output(trans, [trans_xsl], package, stylesheet_parameters) 102 103 #from XSLTools import XSLOutput 104 #import sys 105 #proc = XSLOutput.Processor([trans_xsl], parameters=stylesheet_parameters) 106 #proc.send_output(sys.stderr, "iso-8859-1", package) 107 108 # Site map initialisation. 109 110 def get_site(): 111 112 "Return a simple Web site resource." 113 114 # Get the main resource and the directory used by the application. 115 116 pep241_resource = PEP241Resource() 117 directory = pep241_resource.resource_dir 118 119 # Make a simple Web site. 120 121 resource = MapResource({ 122 # Static resources: 123 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 124 "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), 125 # In-page resources: 126 "platforms" : pep241_resource, 127 # Main page: 128 "" : pep241_resource 129 }) 130 131 return resource 132 133 # vim: tabstop=4 expandtab shiftwidth=4