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