1 #!/usr/bin/env python 2 3 "A WebStack application for a system configurator." 4 5 import WebStack.Generic 6 import XSLForms.Utils 7 import XSLForms.Resources.WebResources 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 ConfiguratorResource(XSLForms.Resources.WebResources.XSLFormsResource): 18 19 "A resource providing a system configurator." 20 21 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 22 encoding = "utf-8" 23 template_resources = { 24 "configuration" : ("config_template.xhtml", "config_output.xsl") 25 } 26 init_resources = { 27 "configuration" : ("config_template.xhtml", "config_input.xsl") 28 } 29 transform_resources = { 30 "filter" : ["config_filter.xsl"] 31 } 32 document_resources = { 33 "accessories" : "config_accessories.xml", 34 "base-system" : "config_base_system.xml", 35 "cpu" : "config_cpu.xml", 36 "hard-disk" : "config_hard_disk.xml", 37 "keyboard" : "config_keyboard.xml", 38 "memory-unit" : "config_memory_unit.xml", 39 "mouse" : "config_mouse.xml", 40 "screen" : "config_screen.xml", 41 "storage-unit" : "config_storage_unit.xml", 42 "translations" : "translations.xml" 43 } 44 in_page_resources = { 45 "cpu" : ("config_output_cpu.xsl", "cpu-node"), 46 "memory" : ("config_output_memory.xsl", "memory-node"), 47 "hard-disks" : ("config_output_harddisks.xsl", "hard-disks-node"), 48 "accessories" : ("config_output_accessories.xsl", "accessories-node") 49 } 50 51 def respond_to_form(self, trans, form): 52 53 """ 54 Respond to a request having the given transaction 'trans' and the given 55 'form' information. 56 """ 57 58 in_page_resource = self.get_in_page_resource(trans) 59 parameters = form.get_parameters() 60 documents = form.get_documents() 61 selectors = form.get_selectors() 62 63 # Ensure the presence of a document. 64 65 if documents.has_key("configuration"): 66 configuration = documents["configuration"] 67 else: 68 configuration = form.new_instance("configuration") 69 70 # Add and remove elements according to the selectors found. 71 72 XSLForms.Utils.add_elements(selectors.get("add-memory-unit"), "memory-unit") 73 XSLForms.Utils.remove_elements(selectors.get("remove-memory-unit")) 74 XSLForms.Utils.add_elements(selectors.get("add-storage-unit"), "storage-unit") 75 XSLForms.Utils.remove_elements(selectors.get("remove-storage-unit")) 76 XSLForms.Utils.add_elements(selectors.get("add-hard-disk"), "hard-disk") 77 XSLForms.Utils.remove_elements(selectors.get("remove-hard-disk")) 78 79 # Send a response according to certain parameters. 80 # When exported, an XML version of the data is returned. 81 82 if parameters.has_key("export"): 83 trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) 84 configuration.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) 85 86 # When not exported, the data is transformed to produce a normal Web 87 # page. 88 89 else: 90 91 # Transform, adding enumerations/ranges. 92 93 init_xsl = self.prepare_initialiser("configuration") 94 configuration = self.get_result([init_xsl], configuration, 95 references={ 96 "accessories" : self.prepare_document("accessories"), 97 "base-system" : self.prepare_document("base-system"), 98 "cpu" : self.prepare_document("cpu"), 99 "hard-disk" : self.prepare_document("hard-disk"), 100 "keyboard" : self.prepare_document("keyboard"), 101 "memory-unit" : self.prepare_document("memory-unit"), 102 "mouse" : self.prepare_document("mouse"), 103 "screen" : self.prepare_document("screen"), 104 "storage-unit" : self.prepare_document("storage-unit") 105 }) 106 107 # Filter out inappropriate choices. 108 109 filter_xsl_list = self.prepare_transform("filter") 110 configuration = self.get_result(filter_xsl_list, configuration) 111 112 # Start the response. 113 114 trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", self.encoding)) 115 116 # Ensure that an output stylesheet exists. 117 118 if in_page_resource in self.in_page_resources.keys(): 119 trans_xsl = self.prepare_fragment("configuration", in_page_resource) 120 stylesheet_parameters = self.prepare_parameters(parameters) 121 else: 122 trans_xsl = self.prepare_output("configuration") 123 stylesheet_parameters = {} 124 125 # Complete the response. 126 127 stylesheet_parameters["locale"] = trans.get_content_languages()[0] 128 self.send_output(trans, [trans_xsl], configuration, stylesheet_parameters, 129 references={"translations" : self.prepare_document("translations")}) 130 131 #from XSLTools import XSLOutput 132 #import sys 133 #proc = XSLOutput.Processor([trans_xsl], parameters=stylesheet_parameters) 134 #proc.send_output(sys.stderr, "iso-8859-1", configuration) 135 136 # Site map initialisation. 137 138 def get_site(): 139 140 "Return a simple Web site resource." 141 142 # Get the main resource and the directory used by the application. 143 144 configurator_resource = ConfiguratorResource() 145 directory = configurator_resource.resource_dir 146 147 # Make a simple Web site. 148 149 resource = MapResource({ 150 # Static resources: 151 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 152 "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), 153 # Main page: 154 "" : configurator_resource, 155 # Fragments: 156 "cpu" : configurator_resource, 157 "memory" : configurator_resource, 158 "hard-disks" : configurator_resource, 159 "accessories" : configurator_resource 160 }) 161 162 return resource 163 164 # vim: tabstop=4 expandtab shiftwidth=4