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 def add_element(positions, element_name, element_parent_name=None): 12 if not positions: 13 return 14 for position in positions: 15 if element_parent_name: 16 parent_elements = position.xpath(element_parent_name) 17 print "*", parent_elements 18 if not parent_elements: 19 parent_element = position.ownerDocument.createElementNS(None, element_parent_name) 20 position.appendChild(parent_element) 21 else: 22 parent_element = parent_elements[0] 23 else: 24 parent_element = position 25 parent_element.appendChild(position.ownerDocument.createElementNS(None, element_name)) 26 27 def remove_element(positions): 28 if not positions: 29 return 30 for position in positions: 31 position.parentNode.removeChild(position) 32 33 class PEP241Resource: 34 35 "A resource providing repository browsing." 36 37 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 38 encoding = "utf-8" 39 40 def respond(self, trans): 41 42 # Produce stylesheet. 43 44 if trans.get_path_info().split("/")[-1] == "styles.css": 45 trans.set_content_type(WebStack.Generic.ContentType("text/css", self.encoding)) 46 out = trans.get_response_stream() 47 f = open(os.path.join(self.resource_dir, "styles.css"), "rb") 48 out.write(f.read()) 49 f.close() 50 raise WebStack.Generic.EndOfResponse 51 52 # Handle other requests. 53 54 global XSLForms # NOTE: Strangely required to avoid UnboundLocalError! 55 method = trans.get_request_method() 56 if method == "GET": 57 fields = XSLForms.Fields.Fields(encoding="iso-8859-1", values_are_lists=1) 58 items = trans.get_fields_from_path().items() 59 documents = fields.make_documents(items) 60 elif method == "POST": 61 fields = XSLForms.Fields.Fields(encoding=self.encoding, values_are_lists=1) 62 items = trans.get_fields_from_body(self.encoding).items() 63 documents = fields.make_documents(items) 64 else: 65 trans.set_response_code(405) 66 raise WebStack.Generic.EndOfResponse 67 68 # Ensure the presence of a document. 69 70 if documents.has_key("package"): 71 package = documents["package"] 72 else: 73 package = fields.new_instance("package") 74 75 selectors = fields.get_selectors(items, documents) 76 add_element(selectors.get("add_author"), "author", "authors") 77 remove_element(selectors.get("remove_author")) 78 79 # Start the response. 80 81 trans.set_content_type(WebStack.Generic.ContentType("text/html", self.encoding)) 82 83 # Ensure that an output stylesheet exists. 84 85 trans_xsl = os.path.join(self.resource_dir, "pep241_output.xsl") 86 template_xml = os.path.join(self.resource_dir, "pep241_template.xhtml") 87 88 if not os.path.exists(trans_xsl) or \ 89 os.path.getmtime(trans_xsl) < os.path.getmtime(template_xml): 90 91 import XSLForms.Prepare 92 template_xml = os.path.join(self.resource_dir, "pep241_template.xhtml") 93 XSLForms.Prepare.make_stylesheet(template_xml, trans_xsl) 94 95 # Complete the response. 96 97 proc = XSLOutput.Processor([trans_xsl]) 98 proc.send_output(trans.get_response_stream(), trans.get_response_stream_encoding(), 99 package) 100 101 # vim: tabstop=4 expandtab shiftwidth=4