class NodeSpace(object): implements(INodeSpace) def __init__(self, location = '', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw) def __get_node_tree(self): return Dictionary(self.__nodetree) nodetree = property(__get_node_tree) def __get_url(self): return self.__url url = property(__get_url) def __get_root(self): return self.as_node('/') root = property(__get_root) def as_node(self, path): if not isinstance(path, str) and hasattr(path, 'url'): path = path.url node = self.__nodetree.get(path) if not node: node = IConfigurableNode(_og_as_node(path)) return node def as_node_collection(self, paths): nodes = map(self.as_node, paths) return OrderedCollection(nodes) def as_internal_node(self, path): return self.as_node(path) def as_node_url(self, node): if isinstance(node, str) and self.__nodetree.has_key(node): return node else: return self.as_node(node).url def as_node_url_collection(self,nodes): urls = map(self.as_node_url, nodes) return OrderedCollection(urls) def create_node(self,factory): return factory(self) def add_node(self, node, url = None): if url is None: url = node.url assigned = self.__nodetree.setdefault(url, node) if assigned is not node: raise ValueError('URL "%s" already taken' % url) return url def remove_node(self, node, url = None): if url is None: url = self.as_node_url(node) elif self.as_node(url) is not node: raise ValueError('Node at %s is not node provided' % url) return self.__nodetree.pop(url)
def render(self, request_path): attrs = KeyWordAssist() document = HTMLgen.Div(**attrs("class", "content")) encoded_schedule = urllib.quote_plus(self.schedule.url) config_form = HTMLgen.Form(request_path) nodeinput = HTMLgen.Input(name='node', value=encoded_schedule, type='hidden') actioninput = HTMLgen.Input(name="actionName", value="configure", type="hidden") config_form.append(nodeinput) config_form.append(actioninput) config_form.submit.value = 'save' config_form.submit.onClick = ('return utils.schedule.' 'validate_configuration(this.form);') config_section = HTMLgen.Div(**attrs('class', 'section')) config_table = HTMLgen.TableLite( **attrs('class', 'configuration-table')) config_header = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH(header, scope="col", abbr=header, id="%sheader" % header) if header == "Action": setattr(headcell, "class", "control") config_header.append(headcell) config_table.append(config_header) configrows = [] classes = itertools.cycle(['light', 'dark']) config = Dictionary(self.schedule.configuration()) namerow = HTMLgen.TR(**attrs('class', classes.next())) namerow.append(HTMLgen.TH('Schedule Name')) sched_name = config.pop('name').split("RZSched_") namefield = HTMLgen.Input(value=sched_name[1], name='configure.name') namerow.append(HTMLgen.TD(namefield, **attrs('class', 'configuration'))) configrows.append(namerow) config_table.append(*configrows) config_form.append(config_table) config_section.append(config_form) config_section.append( navigation(request_path, "reload", self.schedule.url)) config_section.append( navigation(request_path, "back", self.schedule.parent.url)) document.append(config_section) return str(document)
def render(self, request_path): attrs = KeyWordAssist() document = HTMLgen.Div(**attrs("class", "content")) encoded_schedule = urllib.quote_plus(self.schedule.url) config_form = HTMLgen.Form(request_path) nodeinput = HTMLgen.Input( name='node', value=encoded_schedule, type='hidden') actioninput = HTMLgen.Input( name="actionName", value="configure", type="hidden") config_form.append(nodeinput) config_form.append(actioninput) config_form.submit.value = 'save' config_form.submit.onClick = ('return utils.schedule.' 'validate_configuration(this.form);') config_section = HTMLgen.Div(**attrs('class','section')) config_table = HTMLgen.TableLite(**attrs('class', 'configuration-table')) config_header = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH(header, scope="col", abbr=header, id="%sheader" % header) if header == "Action": setattr(headcell, "class", "control") config_header.append(headcell) config_table.append(config_header) configrows = [] classes = itertools.cycle(['light', 'dark']) config = Dictionary(self.schedule.configuration()) namerow = HTMLgen.TR(**attrs('class', classes.next())) namerow.append(HTMLgen.TH('Schedule Name')) sched_name = config.pop('name').split("RZSched_") namefield = HTMLgen.Input(value=sched_name[1], name='configure.name') namerow.append(HTMLgen.TD(namefield, **attrs('class', 'configuration'))) configrows.append(namerow) config_table.append(*configrows) config_form.append(config_table) config_section.append(config_form) config_section.append( navigation(request_path, "reload", self.schedule.url)) config_section.append( navigation(request_path, "back", self.schedule.parent.url)) document.append(config_section) return str(document)
def render(self, request_path): attrs = KeyWordAssist() document = self.base_doc.copy() encoded = cgi.escape(self.role.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.role.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input(name="actionName", type='hidden', value="configure") config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class', 'section')) config_table = HTMLgen.TableLite(**attrs('class', 'configuration')) headrow = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH(header, scope="col", abbr=header, id="%sheader" % header) if header == "Value": setattr(headcell, "class", "control") headrow.append(headcell) config_table.append(headrow) configrows = [] rowclasses = ['light', 'dark'] config = Dictionary(self.role.configuration()) namerow = HTMLgen.TR(**attrs('class', rowclasses[len(configrows) % 2])) namerow.append(HTMLgen.TH('Role Name')) namefield = HTMLgen.Input(value=config.pop('name'), name='configure.name') namefield.onFocus = "this.readOnly=true;this.style.color='grey'" namerow.append(HTMLgen.TD(namefield, **attrs('class', 'control'))) configrows.append(namerow) config_table.append(*configrows) config_form.append(config_table) config_section.append(adorn(config_form, id="main")) document.append(config_section) return str(document)
def render(self, request_path): attrs = KeyWordAssist() document = self.base_doc.copy() encoded = cgi.escape(self.role.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.role.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input( name="actionName",type='hidden',value="configure") config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class','section')) config_table = HTMLgen.TableLite(**attrs('class', 'configuration')) headrow = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH(header, scope="col", abbr=header, id="%sheader" % header) if header == "Value": setattr(headcell, "class", "control") headrow.append(headcell) config_table.append(headrow) configrows = [] rowclasses = ['light', 'dark'] config = Dictionary(self.role.configuration()) namerow = HTMLgen.TR(**attrs('class', rowclasses[len(configrows) % 2])) namerow.append(HTMLgen.TH('Role Name')) namefield = HTMLgen.Input(value = config.pop('name'), name = 'configure.name') namefield.onFocus="this.readOnly=true;this.style.color='grey'" namerow.append(HTMLgen.TD(namefield, **attrs('class', 'control'))) configrows.append(namerow) config_table.append(*configrows) config_form.append(config_table) config_section.append(adorn(config_form, id="main")) document.append(config_section) return str(document)
def render(self, request_path): from mpx.service.trendmanager.trendutil import DojoInput, CustomInput attrs = KeyWordAssist() document = self.base_doc.copy() page_heading = HTMLgen.Heading(2, 'Edit %s' % self.user.name, id="editorlabel") document.append(page_heading) container = HTMLgen.Div(id="forms") encoded = cgi.escape(self.user.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.user.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input(name="actionName", type='hidden', value="configure") config_form.append(hidden) config_table = HTMLgen.TableLite( **{ 'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom:10px;' }) configrows = [] config = Dictionary(self.user.configuration()) namerow = HTMLgen.TR() namerow.append(HTMLgen.TH('Username')) namefield = DojoInput( **{ 'value': config.pop('name'), 'name': 'configure.name', 'disabled': True }) #if namefield.value in ["mpxadmin" , "Anonymous"]: #always disabling change of username: username is a key field #namefield.onFocus="this.readOnly=true;this.style.color='grey'" namerow.append(HTMLgen.TD(namefield)) configrows.append(namerow) oldpasswordrow = HTMLgen.TR() oldpasswordrow.append(HTMLgen.TH('Old Password')) oldpasswordfield = DojoInput(**{ 'type': 'password', 'name': 'configure.old_password' }) oldpasswordrow.append( HTMLgen.TD(oldpasswordfield, **attrs('class', 'control'))) configrows.append(oldpasswordrow) passwordrow = HTMLgen.TR() passwordrow.append(HTMLgen.TH('New Password')) password = config.pop('password') passwordfield = DojoInput(**{ 'type': 'password', 'name': 'configure.password' }) passwordrow.append( HTMLgen.TD(passwordfield, **attrs('class', 'control'))) configrows.append(passwordrow) confirmrow = HTMLgen.TR() confirmrow.append(HTMLgen.TH('Confirm Password')) confirmfield = DojoInput(**{ 'type': 'password', 'name': 'configure.password' }) confirmrow.append(HTMLgen.TD(confirmfield, **attrs('class', 'control'))) configrows.append(confirmrow) homepagerow = HTMLgen.TR() homepagerow.append(HTMLgen.TH('User Homepage')) homepagecell = HTMLgen.TD(**attrs('class', 'control')) homepagefield = DojoInput( **{ 'value': config.pop('homepage'), 'name': 'configure.homepage', 'id': 'homepage' }) homepagecell.append(homepagefield) browsebutton = HTMLgen.Input(type='button', value='...', name='homepage') browsebutton.onClick = "utils.select.files.open('%s');" % homepagefield.id homepagecell.append(browsebutton) homepagerow.append(homepagecell) configrows.append(homepagerow) config_table.append(*configrows) config_form.append(config_table) container.append(adorn(config_form, id="main")) ### # Roles part of page. roles_table = HTMLgen.TableLite( **{ 'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom: 10px; width: 250px;' }) roleform = HTMLgen.Form(request_path) roleform.name = "Assign Roles" roleform.append(manager) roleform.append(node) roleform.submit.value = 'commit' action = HTMLgen.Input(name="actionName", type='hidden', value="invoke") method = HTMLgen.Input(name="methodName", type="hidden", value='set_roles') roleform.append(action) roleform.append(method) rolerows = [] roles = self.user.parent.parent.role_manager.get_role_names() adminrole = self.user.parent.parent.role_manager.administrator.name roles = sorted(roles, key=lambda role: role.lower()) assignedroles = self.user.get_roles() if adminrole in assignedroles: roles = [adminrole] # duplicating the 'params' variable, as the dijit CheckBox # toggling cannot be identified by the HTML form. roleform.append( HTMLgen.Input(name="params", type="hidden", value=adminrole)) else: roles.remove(adminrole) for role in roles: rolerow = HTMLgen.TR() rolerow.append(HTMLgen.TH(role)) encoded_role = cgi.escape(role) field = DojoInput(dojoType='dijit.form.CheckBox', type="checkbox", checked=(role in assignedroles), name='params', value=encoded_role, readOnly=(role == adminrole)) rolecell = HTMLgen.TD(**attrs('style', 'width:25px;')) rolecell.append(field) rolerow.append(rolecell) rolerows.append(rolerow) roles_table.append(*rolerows) roleform.append(roles_table) container.append(adorn(roleform, id="roles")) document.append(container) return str(document)
def __init__(self, location = '', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw)
def __init__(self, *args, **kw): self.__children = Dictionary() self.__nameorder = [] super(CompositeNode, self).__init__(*args, **kw)
class CompositeNode(ConfigurableNode): implements(ICompositeNode) STARTCHILDFAILURE = '"%s" failed to start child "%s".' STOPCHILDFAILURE = '"%s" failed to stop child "%s".' PRUNECHILDFAILURE = '"%s" failed to stop child "%s".' def __init__(self, *args, **kw): self.__children = Dictionary() self.__nameorder = [] super(CompositeNode, self).__init__(*args, **kw) def __get_children(self): return self.__children.copy() children = property(__get_children) def children_nodes(self): return map(self.__children.get, self.__nameorder) def children_names(self): return self.__nameorder[:] def create_child(self, factory, name): if self.has_child(name): raise ValueError('Child named "%s" exists.' % name) child = factor(self.nodespace) child.configure({'name': name, 'parent': self}) return self.get_child(name) def add_child(self,node): if not IConfigurableNode.providedBy(node): raise TypeError('node is not IConfigurableNode') child = self.__children.setdefault(node.name, node) if child is not node: raise ValueError('Child "%s" already exists.' % node.name) self.__nameorder.append(node.name) childurl = path.join(self.url, child.name) self.nodespace.add_node(child, childurl) return childurl def rename_child(self, child, oldname): if self.get_child(oldname) is not child: raise ValueError('Child with name %s it not same' % oldname) index = self.get_index(oldname) nodeurl = self.add_child(child) self.remove_child(child, oldname) # Preserve the child's position. self.__nameorder.remove(child.name) self.__nameorder.insert(index, child.name) return nodeurl def remove_child(self, node, name = None): if name is None: name = node.name self.__nameorder.remove(name) self.__children.pop(name) nodeurl = path.join(self.url, name) self.nodespace.remove_node(node, nodeurl) def prune(self): for child in self.children_nodes(): try: child.prune() except: try: message = self.PRUNECHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return super(CompositeNode, self).prune() def prune_child(self, node): self.get_child(node).prune() def start(self): result = super(CompositeNode, self).start() for child in self.children_nodes(): try: child.start() except: try: message = self.STARTCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return result def stop(self): for child in self.children_nodes(): try: child.stop() except: try: message = self.STOPCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix = 'Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix = 'Handled') return super(CompositeNode, self).stop() def has_child(self, child): return self.__children.has_key(child) or (child in self.children_nodes()) def get_index(self, child): if not isinstance(child, str): child = child.name return self.__nameorder.index(child) def get_child(self, child): if not isinstance(child, str): child = child.name c = self.__children if c.has_key(child): return c[child] raise ENoSuchName(child) def descendants_nodes(self): nodes = self.children_nodes() count = len(nodes) for child in nodes[0:count]: if IParentNode.providedBy(child): nodes.extend(child.descendants_nodes()) return nodes def descendants_names(self): nodes = self.descendants_nodes() return [node.name for node in nodes]
def render(self, request_path): attrs = KeyWordAssist() document = HTMLgen.Div(**attrs("class", "content")) encoded_driver = urllib.quote_plus(self.driver.name) encoded_manager = urllib.quote_plus(self.driver.parent.url) context = HTMLgen.Input(name='manage', value=encoded_manager, type='hidden') editorinput = HTMLgen.Input(name='edit', type='hidden', value=encoded_driver) navigation = HTMLgen.Div(**attrs('class', 'confignavigation')) closeform = HTMLgen.Form(request_path) closeform.append(context) closeform.submit.value = 'close' closeform.submit.onClick = "return handle_close();" navigation.append(closeform) #document.append(navigation) config_form = HTMLgen.Form(request_path) config_form.append(context) config_form.submit.value = 'Save' hidden = HTMLgen.Input(name="configure", type='hidden', value=encoded_driver) config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class','section')) config_table = HTMLgen.TableLite( **attrs('class', 'configuration-table')) config_header = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH( header, scope="col", abbr=header, id="%sheader" % header) config_header.append(headcell) config_table.append(config_header) configrows = [] classes = itertools.cycle(["light", "dark"]) config = Dictionary(self.driver.configuration()) namerow = HTMLgen.TR(**attrs('class', classes.next())) namerow.append(HTMLgen.TH('Value Driver Name')) namefield = HTMLgen.Input( value=config.pop('name'), name='configure.name') namerow.append( HTMLgen.TD(namefield, **attrs('class', 'configuration'))) configrows.append(namerow) periodrow = HTMLgen.TR(**attrs('class', classes.next())) periodrow.append(HTMLgen.TH('Poll Period')) periodfield = HTMLgen.Input( value=config.pop('period'), name='configure.period') periodrow.append( HTMLgen.TD(periodfield, **attrs('class', 'configuration'))) configrows.append(periodrow) inputrow = HTMLgen.TR(**attrs('class', classes.next())) inputrow.append(HTMLgen.TH('Input Node')) inputfield = IdentifiedInput( value=config.pop('input'), id='inputnode', name='configure.input') inputcell = HTMLgen.TD() inputcell.append(inputfield) browsebutton = HTMLgen.Input(type='button', value='Select', name = 'context') browsebutton.onClick = "utils.select.nodes.open('%s');" % inputfield.id inputcell.append(browsebutton) inputrow.append(inputcell) configrows.append(inputrow) nonoutputrows = len(configrows) outputs = config.pop('outputs') for output in outputs: outputrow = HTMLgen.TR(**attrs('class', classes.next())) outputrow.append(HTMLgen.TH('Output Node')) outputfield = IdentifiedInput( value=output, name='configure.outputs', id='Output%s' % (len(configrows) - nonoutputrows)) outputcell = HTMLgen.TD() outputcell.append(outputfield) browsebutton = HTMLgen.Input( type='button', value='Select', name='context') browsebutton.onClick = ( "utils.select.nodes.open('%s');" % outputfield.id) outputcell.append(browsebutton) outputrow.append(outputcell) configrows.append(outputrow) conversionrow = HTMLgen.TR(**attrs('class', classes.next())) conversionrow.append(HTMLgen.TH('Input Conversion')) conversions = [('None', 'none'), ('Integer', 'int'), ('Float', 'float'), ('String', 'str')] options = [] conversion = config.pop('conversion') for name, value in conversions: selected = not not (conversion == value) option = StandardizedOption(name, None, value, selected) options.append(option) conversionfield = StandardizedSelect(options, name='configure.conversion') conversionrow.append( HTMLgen.TD(conversionfield, **attrs('class', 'configuration'))) configrows.append(conversionrow) config_table.append(*configrows) config_form.append(config_table) config_section.append(config_form) document.append(config_section) return str(document)
def render(self, request_path): attrs = KeyWordAssist() document = HTMLgen.Div(**attrs("class", "content")) encoded_driver = urllib.quote_plus(self.driver.name) encoded_manager = urllib.quote_plus(self.driver.parent.url) context = HTMLgen.Input(name='manage', value=encoded_manager, type='hidden') editorinput = HTMLgen.Input(name='edit', type='hidden', value=encoded_driver) navigation = HTMLgen.Div(**attrs('class', 'confignavigation')) closeform = HTMLgen.Form(request_path) closeform.append(context) closeform.submit.value = 'close' closeform.submit.onClick = "return handle_close();" navigation.append(closeform) #document.append(navigation) config_form = HTMLgen.Form(request_path) config_form.append(context) config_form.submit.value = 'Save' hidden = HTMLgen.Input(name="configure", type='hidden', value=encoded_driver) config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class', 'section')) config_table = HTMLgen.TableLite( **attrs('class', 'configuration-table')) config_header = HTMLgen.TR(**attrs('class', 'table-header')) for header in ['Attribute', 'Value']: headcell = HTMLgen.TH(header, scope="col", abbr=header, id="%sheader" % header) config_header.append(headcell) config_table.append(config_header) configrows = [] classes = itertools.cycle(["light", "dark"]) config = Dictionary(self.driver.configuration()) namerow = HTMLgen.TR(**attrs('class', classes.next())) namerow.append(HTMLgen.TH('Value Driver Name')) namefield = HTMLgen.Input(value=config.pop('name'), name='configure.name') namerow.append(HTMLgen.TD(namefield, **attrs('class', 'configuration'))) configrows.append(namerow) periodrow = HTMLgen.TR(**attrs('class', classes.next())) periodrow.append(HTMLgen.TH('Poll Period')) periodfield = HTMLgen.Input(value=config.pop('period'), name='configure.period') periodrow.append( HTMLgen.TD(periodfield, **attrs('class', 'configuration'))) configrows.append(periodrow) inputrow = HTMLgen.TR(**attrs('class', classes.next())) inputrow.append(HTMLgen.TH('Input Node')) inputfield = IdentifiedInput(value=config.pop('input'), id='inputnode', name='configure.input') inputcell = HTMLgen.TD() inputcell.append(inputfield) browsebutton = HTMLgen.Input(type='button', value='Select', name='context') browsebutton.onClick = "utils.select.nodes.open('%s');" % inputfield.id inputcell.append(browsebutton) inputrow.append(inputcell) configrows.append(inputrow) nonoutputrows = len(configrows) outputs = config.pop('outputs') for output in outputs: outputrow = HTMLgen.TR(**attrs('class', classes.next())) outputrow.append(HTMLgen.TH('Output Node')) outputfield = IdentifiedInput(value=output, name='configure.outputs', id='Output%s' % (len(configrows) - nonoutputrows)) outputcell = HTMLgen.TD() outputcell.append(outputfield) browsebutton = HTMLgen.Input(type='button', value='Select', name='context') browsebutton.onClick = ("utils.select.nodes.open('%s');" % outputfield.id) outputcell.append(browsebutton) outputrow.append(outputcell) configrows.append(outputrow) conversionrow = HTMLgen.TR(**attrs('class', classes.next())) conversionrow.append(HTMLgen.TH('Input Conversion')) conversions = [('None', 'none'), ('Integer', 'int'), ('Float', 'float'), ('String', 'str')] options = [] conversion = config.pop('conversion') for name, value in conversions: selected = not not (conversion == value) option = StandardizedOption(name, None, value, selected) options.append(option) conversionfield = StandardizedSelect(options, name='configure.conversion') conversionrow.append( HTMLgen.TD(conversionfield, **attrs('class', 'configuration'))) configrows.append(conversionrow) config_table.append(*configrows) config_form.append(config_table) config_section.append(config_form) document.append(config_section) return str(document)
class NodeSpace(object): implements(INodeSpace) def __init__(self, location='', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw) def __get_node_tree(self): return Dictionary(self.__nodetree) nodetree = property(__get_node_tree) def __get_url(self): return self.__url url = property(__get_url) def __get_root(self): return self.as_node('/') root = property(__get_root) def as_node(self, path): if not isinstance(path, str) and hasattr(path, 'url'): path = path.url node = self.__nodetree.get(path) if not node: node = IConfigurableNode(_og_as_node(path)) return node def as_node_collection(self, paths): nodes = map(self.as_node, paths) return OrderedCollection(nodes) def as_internal_node(self, path): return self.as_node(path) def as_node_url(self, node): if isinstance(node, str) and self.__nodetree.has_key(node): return node else: return self.as_node(node).url def as_node_url_collection(self, nodes): urls = map(self.as_node_url, nodes) return OrderedCollection(urls) def create_node(self, factory): return factory(self) def add_node(self, node, url=None): if url is None: url = node.url assigned = self.__nodetree.setdefault(url, node) if assigned is not node: raise ValueError('URL "%s" already taken' % url) return url def remove_node(self, node, url=None): if url is None: url = self.as_node_url(node) elif self.as_node(url) is not node: raise ValueError('Node at %s is not node provided' % url) return self.__nodetree.pop(url)
class CompositeNode(ConfigurableNode): implements(ICompositeNode) STARTCHILDFAILURE = '"%s" failed to start child "%s".' STOPCHILDFAILURE = '"%s" failed to stop child "%s".' PRUNECHILDFAILURE = '"%s" failed to stop child "%s".' def __init__(self, *args, **kw): self.__children = Dictionary() self.__nameorder = [] super(CompositeNode, self).__init__(*args, **kw) def __get_children(self): return self.__children.copy() children = property(__get_children) def children_nodes(self): return map(self.__children.get, self.__nameorder) def children_names(self): return self.__nameorder[:] def create_child(self, factory, name): if self.has_child(name): raise ValueError('Child named "%s" exists.' % name) child = factor(self.nodespace) child.configure({'name': name, 'parent': self}) return self.get_child(name) def add_child(self, node): if not IConfigurableNode.providedBy(node): raise TypeError('node is not IConfigurableNode') child = self.__children.setdefault(node.name, node) if child is not node: raise ValueError('Child "%s" already exists.' % node.name) self.__nameorder.append(node.name) childurl = path.join(self.url, child.name) self.nodespace.add_node(child, childurl) return childurl def rename_child(self, child, oldname): if self.get_child(oldname) is not child: raise ValueError('Child with name %s it not same' % oldname) index = self.get_index(oldname) nodeurl = self.add_child(child) self.remove_child(child, oldname) # Preserve the child's position. self.__nameorder.remove(child.name) self.__nameorder.insert(index, child.name) return nodeurl def remove_child(self, node, name=None): if name is None: name = node.name self.__nameorder.remove(name) self.__children.pop(name) nodeurl = path.join(self.url, name) self.nodespace.remove_node(node, nodeurl) def prune(self): for child in self.children_nodes(): try: child.prune() except: try: message = self.PRUNECHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return super(CompositeNode, self).prune() def prune_child(self, node): self.get_child(node).prune() def start(self): result = super(CompositeNode, self).start() for child in self.children_nodes(): try: child.start() except: try: message = self.STARTCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return result def stop(self): for child in self.children_nodes(): try: child.stop() except: try: message = self.STOPCHILDFAILURE % (self.url, child.name) except: msglog.exception(prefix='Handled') else: msglog.log('broadway', msglog.types.ERR, message) msglog.exception(prefix='Handled') return super(CompositeNode, self).stop() def has_child(self, child): return self.__children.has_key(child) or (child in self.children_nodes()) def get_index(self, child): if not isinstance(child, str): child = child.name return self.__nameorder.index(child) def get_child(self, child): if not isinstance(child, str): child = child.name c = self.__children if c.has_key(child): return c[child] raise ENoSuchName(child) def descendants_nodes(self): nodes = self.children_nodes() count = len(nodes) for child in nodes[0:count]: if IParentNode.providedBy(child): nodes.extend(child.descendants_nodes()) return nodes def descendants_names(self): nodes = self.descendants_nodes() return [node.name for node in nodes]
def render(self, request_path): attrs = KeyWordAssist() document = self.base_doc.copy() page_heading = HTMLgen.Heading( 2, 'Edit %s' % self.policy.name, id="editorlabel") document.append(page_heading) encoded = cgi.escape(self.policy.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.policy.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input( name="actionName",type='hidden',value="configure") config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class','section')) config_table = HTMLgen.TableLite( **{'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom:10px;'}) config_header = HTMLgen.TR(**attrs('class', 'table-header')) config_table.append(config_header) configrows = [] config = Dictionary(self.policy.configuration()) namerow = HTMLgen.TR() namerow.append(HTMLgen.TH('Name')) namefield = DojoInput(**{'value': config.pop('name'), 'name': 'configure.name', 'disabled': True}) #namefield.onFocus="this.readOnly=true;this.style.color='grey'" namefield = self.update_control(namefield,'name') namerow.append(HTMLgen.TD(namefield)) configrows.append(namerow) # acquiresrow = HTMLgen.TR(**attrs('class', rowclasses[len(configrows) % 2])) # acquiresrow.append(HTMLgen.TH('Acquires Existing Assertions')) # acquires = config.pop('acquires') # yesoption = StandardizedOption('Yes', None, 'True') # nooption = StandardizedOption('No', None, 'False') # if as_boolean(acquires): # yesoption.select() # else: # nooption.select() # options = [yesoption, nooption] # acquiresfield = StandardizedSelect(options, name='configure.acquires') # acquiresrow.append(HTMLgen.TD(acquiresfield, **attrs('class', 'control'))) # configrows.append(acquiresrow) contextrow = HTMLgen.TR() contextrow.append(HTMLgen.TH('Policy Context')) contextcell = HTMLgen.TD() contextfield = DojoInput(**{'value': config.pop('context', ''), 'name': 'configure.context', 'id': 'context'}) contextcell.append(contextfield) browsebutton = HTMLgen.Input(type='button', value='Select', name = 'context') browsebutton.onClick = "utils.select.nodes.open('%s');" % contextfield.id contextcell.append(browsebutton) contextrow.append(contextcell) configrows.append(contextrow) config_table.append(*configrows) config_form.append(config_table) config_section.append(adorn(config_form, id="main")) document.append(config_section) ### # Permissions part of page. section = HTMLgen.Div(id='permissions', **attrs('class','section')) # Names of available permissions. fields = [] permissions = self.policy.parent.get_permissions() for permission in permissions: field = HTMLgen.Input(type='checkbox', checked=False, name='params', value=permission) fields.append(field) forms = [] roles = self.policy.parent.parent.role_manager.get_role_names() roles.sort() rolemap = config.pop('rolemap') action = HTMLgen.Input(name="actionName",type='hidden',value='invoke') method = HTMLgen.Input( name="methodName", type='hidden',value='set_permissions') classes = itertools.cycle(['light', 'dark']) for role in roles: encoded = cgi.escape(role) form = HTMLgen.Form(request_path) ptable = HTMLgen.TableLite(**{'class':'configuration-table', 'style': 'margin:10px;'}) title = HTMLgen.Input(type="hidden", name="title", value=encoded) form.append(title) form.append(manager) form.append(node) form.append(action) form.append(method) # Make first parameter passed to set_permissions the current role. # Being the first input with name 'params', this will always be first value. rolefield = HTMLgen.Input( name="params", type='hidden', value=encoded) form.append(rolefield) # Copy list of all available permissions # fields so original not modified. pfields = copy.deepcopy(fields) # If any permissions are granted, # pre-select them in permissions inputs. pgranted = rolemap.get(role, []) for permission in pgranted: pfields[permissions.index(permission)].checked = 1 # Add all availble permission fields. for permission,field in zip(permissions, pfields): prow = HTMLgen.TR(**attrs('class', classes.next())) prow.append(HTMLgen.TH(permission)) prow.append(HTMLgen.TD(field, **attrs('class', 'control'))) ptable.append(prow) form.append(ptable) form.submit.value = 'commit' section.append(form) document.append(section) return str(document)
def __init__(self, location='', *args, **kw): self.__nodetree = Dictionary() self.__url = location super(NodeSpace, self).__init__(*args, **kw)
class Dispatcher(object): implements(IDispatcher) dispatchers = Dictionary() def __new__(klass, name=None, *args, **keywords): dispatcher = Dispatcher.dispatchers.get(name, None) if dispatcher is None: dispatcher = super(Dispatcher, klass).__new__(klass, name, *args, **keywords) if name is not None: named = Dispatcher.dispatchers.setdefault(name, dispatcher) # If a race-condition existed, 'dispatcher' would not be 'new' # and should not, in that case, be initialized. if named is dispatcher: register_utility(dispatcher, IDispatcher, name) else: return dispatcher dispatcher.initialize(name, *args, **keywords) return dispatcher def __init__(self, *args, **kw): super(Dispatcher, self).__init__() def initialize(self, name, debug=True): if name is None: name = id(self) self.id = name self.debug = debug self.sources = {ALL: {}} self.topics = {ALL: {}} self.types = {ALL: {}} def register_for_type(self, callback, event_type, source=ALL, fast=True): if source is None: source = ALL return self.register_for(callback, [event_type], [ALL], [source], fast) def register_for_types(self, callback, event_types, source=ALL, fast=True): if source is None: source = ALL return self.register_for(callback, event_types, [ALL], [source], fast) def register_for_topic(self, callback, topic, source=ALL, fast=True): if source is None: source = ALL return self.register_for(callback, [ALL], [topic], [source], fast) def register_for_topics(self, callback, topics, source=ALL, fast=True): if source is None: source = ALL return self.register_for(callback, [ALL], topics, [source], fast) def register_for_source(self, callback, source, event_type=ALL, topic=ALL, fast=True): if event_type is None: event_type = ALL if topic is None: topic = ALL return self.register_for(callback, [event_type], [topic], [source], fast) def register_for_sources(self, callback, sources, event_type=ALL, topic=ALL, fast=True): if event_type is None: event_type = ALL if topic is None: topic = ALL return self.register_for(callback, [event_type], [topic], sources, fast) def register_for(self, callback, types, topics, sources, fast=True): if types is None: types = [ALL] if topics is None: topics = [ALL] if sources is None: sources = [ALL] callback = CollectableCallback(callback, fast) for event_type in types: self.types.setdefault(event_type, {})[callback.guid] = callback for source in sources: self.sources.setdefault(source, {})[callback.guid] = callback for topic in topics: self.topics.setdefault(topic, {})[callback.guid] = callback callback.types = types callback.topics = topics callback.sources = sources return callback.guid def unregister(self, guid): callback = CollectableCallback.get_callback(guid) for event_type in callback.types: try: del (self.types[event_type][guid]) except KeyError: pass for topic in callback.topics: try: del (self.topics[topic][guid]) except KeyError: pass for source in callback.sources: try: del (self.sources[source][guid]) except KeyError: pass return def dispatch(self, event, topics=None, *args, **kw): if not isinstance(topics, (list, tuple)): topics = [topics] source_listeners = self.sources[ALL].copy() if hasattr(event, 'source'): source_listeners.update(self.sources.get(event.source, {})) topic_listeners = self.topics[ALL].copy() for topic in topics: topic_listeners.update(self.topics.get(topic, {})) type_listeners = self.types[ALL].copy() # Listners for type(event) or any of its superclasses. eventmro = inspect.getmro(type(event)) for etype in eventmro: type_listeners.update(self.types.get(etype, {})) set = type_listeners.keys() set = filter(topic_listeners.has_key, set) set = filter(source_listeners.has_key, set) callbacks = map(source_listeners.get, set) fast, slow = [], [] for callback in callbacks: if callback.is_fast(): fast.append(callback) else: slow.append(callback) if fast: self.run_callbacks(fast, event, *args, **kw) if slow: self.queue_callbacks(slow, event, *args, **kw) return len(callbacks) def timed_dispatch(self, *args, **kw): tstart = time.time() result = self.dispatch(*args, **kw) tend = time.time() return result def run_callbacks(self, callbacks, event, *args, **kw): expired = [] for callback in callbacks: try: callback(event, *args, **kw) except Expired: expired.append(callback) except Exception, error: msglog.exception(prefix="handled") for callback in expired: self.unregister(callback.guid) return len(callbacks)
def __get_node_tree(self): return Dictionary(self.__nodetree)
def render(self, request_path): attrs = KeyWordAssist() document = self.base_doc.copy() page_heading = HTMLgen.Heading(2, 'Edit %s' % self.policy.name, id="editorlabel") document.append(page_heading) encoded = cgi.escape(self.policy.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.policy.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input(name="actionName", type='hidden', value="configure") config_form.append(hidden) config_section = HTMLgen.Div(**attrs('class', 'section')) config_table = HTMLgen.TableLite( **{ 'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom:10px;' }) config_header = HTMLgen.TR(**attrs('class', 'table-header')) config_table.append(config_header) configrows = [] config = Dictionary(self.policy.configuration()) namerow = HTMLgen.TR() namerow.append(HTMLgen.TH('Name')) namefield = DojoInput( **{ 'value': config.pop('name'), 'name': 'configure.name', 'disabled': True }) #namefield.onFocus="this.readOnly=true;this.style.color='grey'" namefield = self.update_control(namefield, 'name') namerow.append(HTMLgen.TD(namefield)) configrows.append(namerow) # acquiresrow = HTMLgen.TR(**attrs('class', rowclasses[len(configrows) % 2])) # acquiresrow.append(HTMLgen.TH('Acquires Existing Assertions')) # acquires = config.pop('acquires') # yesoption = StandardizedOption('Yes', None, 'True') # nooption = StandardizedOption('No', None, 'False') # if as_boolean(acquires): # yesoption.select() # else: # nooption.select() # options = [yesoption, nooption] # acquiresfield = StandardizedSelect(options, name='configure.acquires') # acquiresrow.append(HTMLgen.TD(acquiresfield, **attrs('class', 'control'))) # configrows.append(acquiresrow) contextrow = HTMLgen.TR() contextrow.append(HTMLgen.TH('Policy Context')) contextcell = HTMLgen.TD() contextfield = DojoInput( **{ 'value': config.pop('context', ''), 'name': 'configure.context', 'id': 'context' }) contextcell.append(contextfield) browsebutton = HTMLgen.Input(type='button', value='Select', name='context') browsebutton.onClick = "utils.select.nodes.open('%s');" % contextfield.id contextcell.append(browsebutton) contextrow.append(contextcell) configrows.append(contextrow) config_table.append(*configrows) config_form.append(config_table) config_section.append(adorn(config_form, id="main")) document.append(config_section) ### # Permissions part of page. section = HTMLgen.Div(id='permissions', **attrs('class', 'section')) # Names of available permissions. fields = [] permissions = self.policy.parent.get_permissions() for permission in permissions: field = HTMLgen.Input(type='checkbox', checked=False, name='params', value=permission) fields.append(field) forms = [] roles = self.policy.parent.parent.role_manager.get_role_names() roles.sort() rolemap = config.pop('rolemap') action = HTMLgen.Input(name="actionName", type='hidden', value='invoke') method = HTMLgen.Input(name="methodName", type='hidden', value='set_permissions') classes = itertools.cycle(['light', 'dark']) for role in roles: encoded = cgi.escape(role) form = HTMLgen.Form(request_path) ptable = HTMLgen.TableLite(**{ 'class': 'configuration-table', 'style': 'margin:10px;' }) title = HTMLgen.Input(type="hidden", name="title", value=encoded) form.append(title) form.append(manager) form.append(node) form.append(action) form.append(method) # Make first parameter passed to set_permissions the current role. # Being the first input with name 'params', this will always be first value. rolefield = HTMLgen.Input(name="params", type='hidden', value=encoded) form.append(rolefield) # Copy list of all available permissions # fields so original not modified. pfields = copy.deepcopy(fields) # If any permissions are granted, # pre-select them in permissions inputs. pgranted = rolemap.get(role, []) for permission in pgranted: pfields[permissions.index(permission)].checked = 1 # Add all availble permission fields. for permission, field in zip(permissions, pfields): prow = HTMLgen.TR(**attrs('class', classes.next())) prow.append(HTMLgen.TH(permission)) prow.append(HTMLgen.TD(field, **attrs('class', 'control'))) ptable.append(prow) form.append(ptable) form.submit.value = 'commit' section.append(form) document.append(section) return str(document)
def render(self, request_path): from mpx.service.trendmanager.trendutil import DojoInput, CustomInput attrs = KeyWordAssist() document = self.base_doc.copy() page_heading = HTMLgen.Heading( 2, 'Edit %s' % self.user.name, id="editorlabel") document.append(page_heading) container = HTMLgen.Div(id="forms") encoded = cgi.escape(self.user.parent.name) manager = HTMLgen.Input(name='manager', type='hidden', value=encoded) encoded = cgi.escape(self.user.name) node = HTMLgen.Input(name='node', type='hidden', value=encoded) config_form = HTMLgen.Form(request_path) config_form.append(manager) config_form.append(node) config_form.submit.value = 'commit' hidden = HTMLgen.Input( name="actionName",type='hidden',value="configure") config_form.append(hidden) config_table = HTMLgen.TableLite( **{'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom:10px;'}) configrows = [] config = Dictionary(self.user.configuration()) namerow = HTMLgen.TR() namerow.append(HTMLgen.TH('Username')) namefield = DojoInput(**{'value': config.pop('name'), 'name': 'configure.name', 'disabled': True}) #if namefield.value in ["mpxadmin" , "Anonymous"]: #always disabling change of username: username is a key field #namefield.onFocus="this.readOnly=true;this.style.color='grey'" namerow.append(HTMLgen.TD(namefield)) configrows.append(namerow) oldpasswordrow = HTMLgen.TR() oldpasswordrow.append(HTMLgen.TH('Old Password')) oldpasswordfield = DojoInput(**{'type': 'password', 'name': 'configure.old_password'}) oldpasswordrow.append(HTMLgen.TD(oldpasswordfield, **attrs('class', 'control'))) configrows.append(oldpasswordrow) passwordrow = HTMLgen.TR() passwordrow.append(HTMLgen.TH('New Password')) password = config.pop('password') passwordfield = DojoInput(**{'type': 'password', 'name': 'configure.password'}) passwordrow.append(HTMLgen.TD(passwordfield, **attrs('class', 'control'))) configrows.append(passwordrow) confirmrow = HTMLgen.TR() confirmrow.append(HTMLgen.TH('Confirm Password')) confirmfield = DojoInput(**{'type': 'password', 'name': 'configure.password'}) confirmrow.append(HTMLgen.TD(confirmfield, **attrs('class', 'control'))) configrows.append(confirmrow) homepagerow = HTMLgen.TR() homepagerow.append(HTMLgen.TH('User Homepage')) homepagecell = HTMLgen.TD(**attrs('class', 'control')) homepagefield = DojoInput(**{'value': config.pop('homepage'), 'name': 'configure.homepage', 'id': 'homepage'}) homepagecell.append(homepagefield) browsebutton = HTMLgen.Input(type='button', value='...', name = 'homepage') browsebutton.onClick = "utils.select.files.open('%s');" % homepagefield.id homepagecell.append(browsebutton) homepagerow.append(homepagecell) configrows.append(homepagerow) config_table.append(*configrows) config_form.append(config_table) container.append(adorn(config_form, id="main")) ### # Roles part of page. roles_table = HTMLgen.TableLite(**{'class': 'nodeEditTable nodeEditContent', 'style': 'margin-bottom: 10px; width: 250px;'}) roleform = HTMLgen.Form(request_path) roleform.name = "Assign Roles" roleform.append(manager) roleform.append(node) roleform.submit.value = 'commit' action = HTMLgen.Input(name="actionName",type='hidden',value="invoke") method = HTMLgen.Input( name="methodName",type="hidden",value='set_roles') roleform.append(action) roleform.append(method) rolerows = [] roles = self.user.parent.parent.role_manager.get_role_names() adminrole = self.user.parent.parent.role_manager.administrator.name roles = sorted(roles, key=lambda role: role.lower()) assignedroles = self.user.get_roles() if adminrole in assignedroles: roles = [adminrole] # duplicating the 'params' variable, as the dijit CheckBox # toggling cannot be identified by the HTML form. roleform.append(HTMLgen.Input(name="params", type="hidden", value=adminrole)) else: roles.remove(adminrole) for role in roles: rolerow = HTMLgen.TR() rolerow.append(HTMLgen.TH(role)) encoded_role = cgi.escape(role) field = DojoInput( dojoType='dijit.form.CheckBox', type="checkbox", checked=(role in assignedroles), name='params', value = encoded_role, readOnly = (role == adminrole)) rolecell = HTMLgen.TD(**attrs('style', 'width:25px;')) rolecell.append(field) rolerow.append(rolecell) rolerows.append(rolerow) roles_table.append(*rolerows) roleform.append(roles_table) container.append(adorn(roleform, id="roles")) document.append(container) return str(document)