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