1 #!/usr/bin/env python 2 3 "A WebStack application for a PEP 241 repository." 4 5 import WebStack.Generic 6 import XSLForms.Fields 7 import XSLForms.Output 8 import XSLOutput 9 import os 10 11 class PEP241Resource: 12 13 "A resource providing repository browsing." 14 15 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 16 encoding = "utf-8" 17 18 def respond(self, trans): 19 20 # Produce stylesheet. 21 22 if trans.get_path_info().split("/")[-1] == "styles.css": 23 trans.set_content_type(WebStack.Generic.ContentType("text/css", self.encoding)) 24 out = trans.get_response_stream() 25 f = open(os.path.join(self.resource_dir, "styles.css"), "rb") 26 out.write(f.read()) 27 f.close() 28 raise WebStack.Generic.EndOfResponse 29 30 # Handle other requests. 31 32 global XSLForms # NOTE: Strangely required to avoid UnboundLocalError! 33 method = trans.get_request_method() 34 if method == "GET": 35 fields = XSLForms.Fields.Fields(encoding="iso-8859-1", values_are_lists=1) 36 items = trans.get_fields_from_path().items() 37 documents = fields.make_documents(items) 38 elif method == "POST": 39 fields = XSLForms.Fields.Fields(encoding=self.encoding, values_are_lists=1) 40 items = trans.get_fields_from_body(self.encoding).items() 41 documents = fields.make_documents(items) 42 else: 43 trans.set_response_code(405) 44 raise WebStack.Generic.EndOfResponse 45 46 # Ensure the presence of a document. 47 48 if documents.has_key("package"): 49 package = documents["package"] 50 else: 51 package = fields.new_instance("package") 52 53 selectors = fields.get_selectors(items, documents) 54 import libxml2dom, sys 55 for name, values in selectors.items(): 56 sys.stderr.write("\n" + name + "\n") 57 for value in values: 58 libxml2dom.toStream(value, sys.stderr) 59 60 # Start the response. 61 62 trans.set_content_type(WebStack.Generic.ContentType("text/html", self.encoding)) 63 64 # Ensure that an output stylesheet exists. 65 66 trans_xsl = os.path.join(self.resource_dir, "pep241_output.xsl") 67 template_xml = os.path.join(self.resource_dir, "pep241_template.xhtml") 68 69 if not os.path.exists(trans_xsl) or \ 70 os.path.getmtime(trans_xsl) < os.path.getmtime(template_xml): 71 72 import XSLForms.Prepare 73 template_xml = os.path.join(self.resource_dir, "pep241_template.xhtml") 74 XSLForms.Prepare.make_stylesheet(template_xml, trans_xsl) 75 76 # Complete the response. 77 78 proc = XSLOutput.Processor([trans_xsl]) 79 proc.send_output(trans.get_response_stream(), trans.get_response_stream_encoding(), 80 package) 81 82 # vim: tabstop=4 expandtab shiftwidth=4