1 #!/usr/bin/env python 2 3 "A WebStack application for a system configurator." 4 5 import WebStack.Generic 6 from XSLForms.Resources.WebResources import \ 7 XSLFormsResource, input, output, resources, prepare_resources as xslforms_prepare_resources 8 import os 9 10 # Site map imports. 11 12 from WebStack.Resources.ResourceMap import MapResource 13 from WebStack.Resources.Selectors import EncodingSelector 14 from WebStack.Resources.Static import DirectoryResource 15 16 # Configuration settings. 17 18 encoding = "utf-8" 19 20 # Resource classes. 21 22 class ConfiguratorResource(XSLFormsResource): 23 24 "A resource providing a system configurator." 25 26 resource_dir = resources(__file__) 27 template_resources = { 28 "configuration" : output("config_template.xhtml") 29 } 30 init_resources = { 31 "configuration" : input("config_template.xhtml") 32 } 33 transform_resources = { 34 "filter" : ["config_filter.xsl"] 35 } 36 document_resources = { 37 "accessories" : "config_accessories.xml", 38 "base-system" : "config_base_system.xml", 39 "cpu" : "config_cpu.xml", 40 "hard-disk" : "config_hard_disk.xml", 41 "keyboard" : "config_keyboard.xml", 42 "memory-unit" : "config_memory_unit.xml", 43 "mouse" : "config_mouse.xml", 44 "screen" : "config_screen.xml", 45 "storage-unit" : "config_storage_unit.xml", 46 "translations" : "translations.xml" 47 } 48 in_page_resources = { 49 "cpu" : ("configuration", "config_output_cpu.xsl", "cpu-node"), 50 "memory" : ("configuration", "config_output_memory.xsl", "memory-node"), 51 "hard-disks" : ("configuration", "config_output_harddisks.xsl", "hard-disks-node"), 52 "accessories" : ("configuration", "config_output_accessories.xsl", "accessories-node") 53 } 54 55 def select_activity(self, trans, form): 56 self.set_activity(trans, "configuration") 57 58 def respond_to_input(self, trans, form): 59 60 # Creating selected elements. 61 62 selectors = form.get_selectors(create=1) 63 64 # Add and remove elements according to the selectors found. 65 66 self.add_elements(selectors.get("add-memory-unit"), "memory-unit") 67 self.remove_elements(selectors.get("remove-memory-unit")) 68 self.add_elements(selectors.get("add-storage-unit"), "storage-unit") 69 self.remove_elements(selectors.get("remove-storage-unit")) 70 self.add_elements(selectors.get("add-hard-disk"), "hard-disk") 71 self.remove_elements(selectors.get("remove-hard-disk")) 72 73 # Send a response according to certain parameters. 74 # When exported, an XML version of the data is returned. 75 76 parameters = form.get_parameters() 77 78 if parameters.has_key("export"): 79 trans.set_content_type(WebStack.Generic.ContentType("text/xml", encoding)) 80 self.get_document(trans).toStream(trans.get_response_stream(), trans.get_response_stream_encoding()) 81 raise WebStack.Generic.EndOfResponse 82 83 def init_document(self, trans, form): 84 85 # Transform, adding enumerations/ranges. 86 87 XSLFormsResource.init_document(self, trans, form, 88 references={ 89 "accessories" : self.prepare_document("accessories"), 90 "base-system" : self.prepare_document("base-system"), 91 "cpu" : self.prepare_document("cpu"), 92 "hard-disk" : self.prepare_document("hard-disk"), 93 "keyboard" : self.prepare_document("keyboard"), 94 "memory-unit" : self.prepare_document("memory-unit"), 95 "mouse" : self.prepare_document("mouse"), 96 "screen" : self.prepare_document("screen"), 97 "storage-unit" : self.prepare_document("storage-unit") 98 }) 99 100 def respond_to_document(self, trans, form): 101 102 # Filter out inappropriate choices. 103 104 filter_xsl_list = self.prepare_transform("filter") 105 self.set_document(trans, self.get_result(filter_xsl_list, self.get_document(trans))) 106 107 def create_output(self, trans, form): 108 109 # Complete the response. 110 111 stylesheet_parameters = {} 112 113 try: 114 stylesheet_parameters["locale"] = trans.get_content_languages()[0] 115 except IndexError: 116 pass 117 118 XSLFormsResource.create_output(self, trans, form, 119 stylesheet_parameters=stylesheet_parameters, 120 references={ 121 "translations" : self.prepare_document("translations") 122 }) 123 124 # Site map initialisation. 125 126 def get_site(): 127 128 "Return a simple Web site resource." 129 130 # Get the main resource and the directory used by the application. 131 132 configurator_resource = ConfiguratorResource() 133 directory = configurator_resource.resource_dir 134 135 # Make a simple Web site. 136 137 resource = MapResource({ 138 # Static resources: 139 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 140 "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), 141 # Main page: 142 "" : configurator_resource, 143 # Fragments: 144 "cpu" : configurator_resource, 145 "memory" : configurator_resource, 146 "hard-disks" : configurator_resource, 147 "accessories" : configurator_resource 148 }) 149 150 return EncodingSelector(resource, encoding) 151 152 # Resource preparation ahead of time - useful for making installations. 153 154 def prepare_resources(): 155 for cls in [ConfiguratorResource]: 156 xslforms_prepare_resources(cls) 157 158 # vim: tabstop=4 expandtab shiftwidth=4