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" : ("configuration", "config_output_cpu.xsl", "cpu-node"), 46 "memory" : ("configuration", "config_output_memory.xsl", "memory-node"), 47 "hard-disks" : ("configuration", "config_output_harddisks.xsl", "hard-disks-node"), 48 "accessories" : ("configuration", "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 62 # Creating selected elements. 63 64 selectors = form.get_selectors(create=1) 65 66 # Ensure the presence of a document. 67 68 if documents.has_key("configuration"): 69 configuration = documents["configuration"] 70 else: 71 configuration = form.new_instance("configuration") 72 73 # Add and remove elements according to the selectors found. 74 75 XSLForms.Utils.add_elements(selectors.get("add-memory-unit"), "memory-unit") 76 XSLForms.Utils.remove_elements(selectors.get("remove-memory-unit")) 77 XSLForms.Utils.add_elements(selectors.get("add-storage-unit"), "storage-unit") 78 XSLForms.Utils.remove_elements(selectors.get("remove-storage-unit")) 79 XSLForms.Utils.add_elements(selectors.get("add-hard-disk"), "hard-disk") 80 XSLForms.Utils.remove_elements(selectors.get("remove-hard-disk")) 81 82 # Send a response according to certain parameters. 83 # When exported, an XML version of the data is returned. 84 85 if parameters.has_key("export"): 86 trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) 87 configuration.toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) 88 89 # When not exported, the data is transformed to produce a normal Web 90 # page. 91 92 else: 93 94 # Transform, adding enumerations/ranges. 95 96 init_xsl = self.prepare_initialiser("configuration") 97 configuration = self.get_result([init_xsl], configuration, 98 references={ 99 "accessories" : self.prepare_document("accessories"), 100 "base-system" : self.prepare_document("base-system"), 101 "cpu" : self.prepare_document("cpu"), 102 "hard-disk" : self.prepare_document("hard-disk"), 103 "keyboard" : self.prepare_document("keyboard"), 104 "memory-unit" : self.prepare_document("memory-unit"), 105 "mouse" : self.prepare_document("mouse"), 106 "screen" : self.prepare_document("screen"), 107 "storage-unit" : self.prepare_document("storage-unit") 108 }) 109 110 # Filter out inappropriate choices. 111 112 filter_xsl_list = self.prepare_transform("filter") 113 configuration = self.get_result(filter_xsl_list, configuration) 114 115 # Start the response. 116 117 trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", self.encoding)) 118 119 # Ensure that an output stylesheet exists. 120 121 if in_page_resource in self.in_page_resources.keys(): 122 trans_xsl = self.prepare_fragment(in_page_resource) 123 stylesheet_parameters = self.prepare_parameters(parameters) 124 else: 125 trans_xsl = self.prepare_output("configuration") 126 stylesheet_parameters = {} 127 128 # Complete the response. 129 130 try: 131 stylesheet_parameters["locale"] = trans.get_content_languages()[0] 132 except IndexError: 133 pass 134 self.send_output(trans, [trans_xsl], configuration, stylesheet_parameters, 135 references={"translations" : self.prepare_document("translations")}) 136 137 #from XSLTools import XSLOutput 138 #import sys 139 #proc = XSLOutput.Processor([trans_xsl], parameters=stylesheet_parameters, 140 # references={"translations" : self.prepare_document("translations")}) 141 #proc.send_output(sys.stderr, "iso-8859-1", configuration) 142 143 # Site map initialisation. 144 145 def get_site(): 146 147 "Return a simple Web site resource." 148 149 # Get the main resource and the directory used by the application. 150 151 configurator_resource = ConfiguratorResource() 152 directory = configurator_resource.resource_dir 153 154 # Make a simple Web site. 155 156 resource = MapResource({ 157 # Static resources: 158 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 159 "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), 160 # Main page: 161 "" : configurator_resource, 162 # Fragments: 163 "cpu" : configurator_resource, 164 "memory" : configurator_resource, 165 "hard-disks" : configurator_resource, 166 "accessories" : configurator_resource 167 }) 168 169 return resource 170 171 # Resource preparation ahead of time - useful for making installations. 172 173 def prepare_resources(): 174 for cls in [ConfiguratorResource]: 175 XSLForms.Resources.WebResources.prepare_resources(cls) 176 177 # vim: tabstop=4 expandtab shiftwidth=4