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