1 #!/usr/bin/env python 2 3 "An example of a system configurator which runs under PyQt and WebStack." 4 5 import os 6 7 class ConfiguratorResource: 8 9 # Standard attributes. 10 11 resource_dir = os.path.join(os.path.split(__file__)[0], "Resources") 12 13 design_resources = { 14 "configuration" : "config.ui" 15 } 16 17 widget_resources = { 18 "hard_disk" : ("config_hard_disk.ui", "hard_disk"), 19 "memory_unit" : ("config_memory_unit.ui", "memory_unit"), 20 "storage_unit" : ("config_storage_unit.ui", "storage_unit") 21 #"hard_disks" : ("config_hard_disks.ui", "hard_disks"), 22 #"memory_units" : ("config_memory_units.ui", "memory_units"), 23 #"storage_units" : ("config_storage_units.ui", "storage_units") 24 } 25 26 document_resources = { 27 "base-system" : "config_base_system.xml", 28 "cpu" : "config_cpu.xml", 29 "hard-disk" : "config_hard_disk.xml", 30 "keyboard" : "config_keyboard.xml", 31 "memory-unit" : "config_memory_unit.xml", 32 "mouse" : "config_mouse.xml", 33 "screen" : "config_screen.xml", 34 "storage-unit" : "config_storage_unit.xml" 35 } 36 37 # Initialisation. 38 39 def __init__(self, *args, **kw): 40 pass 41 42 def form_init(self): 43 44 self.reset_collection(self.child("hard_disks")) 45 self.reset_collection(self.child("memory_units")) 46 self.reset_collection(self.child("storage_units")) 47 48 def form_populate(self): 49 50 # Get field data. 51 # NOTE: This would be done for whole page updates in a Web application. 52 53 self.populate_list(self.child("base_system"), self.get_elements("base-system")) 54 self.populate_list(self.child("keyboard"), self.get_elements("keyboard")) 55 self.populate_list(self.child("mouse"), self.get_elements("mouse")) 56 self.populate_list(self.child("screen"), self.get_elements("screen")) 57 58 # General functionality. 59 60 def form_refresh(self, current_text=None): 61 62 # Ensure consistency. 63 # NOTE: This would be done for whole page updates in a Web application. 64 # NOTE: This would also be done for page updates where the information 65 # NOTE: involved was important. 66 67 current_text = current_text or self.child("base_system").currentText() 68 69 # Find the CPU socket and the interface of the current base system. 70 cpu_socket = None 71 interface = None 72 for element in self.get_elements("base-system"): 73 text = element.getAttribute("value") 74 if text == current_text: 75 cpu_socket = element.getAttribute("cpu-socket") 76 interface = element.getAttribute("interface") 77 78 # Find all valid CPUs. 79 valid = [] 80 for element in self.get_elements("cpu"): 81 if not element.hasAttribute("cpu-socket") or element.getAttribute("cpu-socket") == cpu_socket: 82 valid.append(element) 83 self.populate_list(self.child("cpu"), valid) 84 85 # Find all valid hard disks. 86 valid = [] 87 for element in self.get_elements("hard-disk"): 88 if not element.hasAttribute("interface") or element.getAttribute("interface") == interface: 89 valid.append(element) 90 for hard_disk_value in self.factory.find_widgets(self, "hard_disk_value"): 91 self.populate_list(hard_disk_value, valid) 92 93 # Find memory units. 94 for memory_unit_value in self.factory.find_widgets(self, "memory_unit_value"): 95 self.populate_list(memory_unit_value, self.get_elements("memory-unit")) 96 97 # Find storage units. 98 for storage_unit_value in self.factory.find_widgets(self, "storage_unit_value"): 99 self.populate_list(storage_unit_value, self.get_elements("storage-unit")) 100 101 # Slots. 102 103 def baseSystemChanged(self, current_text): 104 self.request_refresh(current_text) 105 106 def addHardDisk(self): 107 #hard_disks = self.prepare_widget("configuration", "hard_disks") 108 #tab_pages = hard_disks.child("tab pages") 109 #tab = tab_pages.child("tab") 110 #self.child("hard_disks").addTab(tab, hard_disks.tabLabel(tab)) 111 #self.factory.connect(tab, self) 112 hard_disk = self.prepare_widget("configuration", "hard_disk", self.child("hard_disks")) 113 self.child("hard_disks").layout().add(hard_disk) 114 hard_disk.show() 115 self.factory.connect(hard_disk, self) 116 117 # Perform the consistency check. 118 # NOTE: This is not as efficient as it could be since the general check 119 # NOTE: refreshes all fields, not just newly added ones. 120 self.request_refresh() 121 122 def addMemoryUnit(self): 123 #memory_units = self.prepare_widget("configuration", "memory_units") 124 #tab_pages = memory_units.child("tab pages") 125 #tab = tab_pages.child("tab") 126 #self.child("memory_units").addTab(tab, memory_units.tabLabel(tab)) 127 #self.factory.connect(tab, self) 128 memory_unit = self.prepare_widget("configuration", "memory_unit", self.child("memory_units")) 129 self.child("memory_units").layout().add(memory_unit) 130 memory_unit.show() 131 self.factory.connect(memory_unit, self) 132 133 # Perform the consistency check. 134 # NOTE: This is not as efficient as it could be since the general check 135 # NOTE: refreshes all fields, not just newly added ones. 136 self.request_refresh() 137 138 def addStorageUnit(self): 139 #storage_units = self.prepare_widget("configuration", "storage_units") 140 #tab_pages = storage_units.child("tab pages") 141 #tab = tab_pages.child("tab") 142 #self.child("storage_units").addTab(tab, storage_units.tabLabel(tab)) 143 #self.factory.connect(tab, self) 144 storage_unit = self.prepare_widget("configuration", "storage_unit", self.child("storage_units")) 145 self.child("storage_units").layout().add(storage_unit) 146 storage_unit.show() 147 self.factory.connect(storage_unit, self) 148 149 # Perform the consistency check. 150 # NOTE: This is not as efficient as it could be since the general check 151 # NOTE: refreshes all fields, not just newly added ones. 152 self.request_refresh() 153 154 def removeHardDisk(self): 155 #page = self.hard_disks.currentPage() 156 #self.hard_disks.removePage(page) 157 #page.deleteLater() 158 remove_hard_disk = self.sender() 159 hard_disk = remove_hard_disk.parent() 160 self.child("hard_disks").layout().remove(hard_disk) 161 hard_disk.deleteLater() 162 163 def removeMemoryUnit(self): 164 #page = self.memory_units.currentPage() 165 #self.memory_units.removePage(page) 166 #page.deleteLater() 167 remove_memory_unit = self.sender() 168 memory_unit = remove_memory_unit.parent() 169 self.child("memory_units").layout().remove(memory_unit) 170 memory_unit.deleteLater() 171 172 def removeStorageUnit(self): 173 #page = self.storage_units.currentPage() 174 #self.storage_units.removePage(page) 175 #page.deleteLater() 176 remove_storage_unit = self.sender() 177 storage_unit = remove_storage_unit.parent() 178 self.child("storage_units").layout().remove(storage_unit) 179 storage_unit.deleteLater() 180 181 def updateConfig(self): 182 self.form_refresh() 183 184 def exportConfig(self): 185 print "configuration.exportConfig(): Not implemented yet" 186 187 def get_resource(resource_type, *args, **kw): 188 189 if resource_type == "PyQt": 190 import XSLForms.Resources.PyQtResources 191 try: 192 import QtConfigurator.Forms 193 except ImportError: 194 print "*" * 60 195 print "Please generate the following file before running this example:" 196 print os.path.join(os.path.split(__file__)[0], "Forms.py") 197 print "Use the pyuic program along with the form definition file:" 198 print os.path.join(os.path.split(__file__)[0], "Resources", "config.ui") 199 print "*" * 60 200 print 201 raise 202 class Configurator(ConfiguratorResource, QtConfigurator.Forms.Configurator, XSLForms.Resources.PyQtResources.XSLFormsResource): 203 def __init__(self, *args, **kw): 204 QtConfigurator.Forms.Configurator.__init__(self, *args, **kw) 205 XSLForms.Resources.PyQtResources.XSLFormsResource.__init__(self, "configuration") 206 ConfiguratorResource.__init__(self, *args, **kw) 207 resource = Configurator(*args, **kw) 208 resource.form_init() 209 resource.form_populate() 210 211 else: 212 import XSLForms.Resources.PyQtWebResources 213 from WebStack.Resources.ResourceMap import MapResource 214 from WebStack.Resources.Static import DirectoryResource 215 216 class Configurator(ConfiguratorResource, XSLForms.Resources.PyQtWebResources.XSLFormsResource): 217 def __init__(self, *args, **kw): 218 XSLForms.Resources.PyQtWebResources.XSLFormsResource.__init__(self, "configuration") 219 ConfiguratorResource.__init__(self, *args, **kw) 220 221 configurator_resource = Configurator(*args, **kw) 222 directory = configurator_resource.resource_dir 223 resource = MapResource({ 224 "styles" : DirectoryResource(os.path.join(directory, "styles"), {"css" : "text/css"}), 225 "scripts" : DirectoryResource(os.path.join(directory, "scripts"), {"js" : "text/javascript"}), 226 "" : configurator_resource 227 }) 228 229 # Do not initialise or populate the resource here: both happen when a 230 # Web request is received (initialisation when no form document is 231 # found; population when a form document is prepared for output). 232 233 return resource 234 235 # vim: tabstop=4 expandtab shiftwidth=4