Esempio n. 1
0
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)
Esempio n. 2
0
    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)
Esempio n. 3
0
 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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
 def __init__(self, location = '', *args, **kw):
     self.__nodetree = Dictionary()
     self.__url = location
     super(NodeSpace, self).__init__(*args, **kw)
Esempio n. 8
0
 def __init__(self, *args, **kw):
     self.__children = Dictionary()
     self.__nameorder = []
     super(CompositeNode, self).__init__(*args, **kw)
Esempio n. 9
0
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]
Esempio n. 10
0
    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)
Esempio n. 11
0
    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)
Esempio n. 12
0
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)
Esempio n. 13
0
 def __init__(self, *args, **kw):
     self.__children = Dictionary()
     self.__nameorder = []
     super(CompositeNode, self).__init__(*args, **kw)
Esempio n. 14
0
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]
Esempio n. 15
0
    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)
Esempio n. 16
0
 def __init__(self, location='', *args, **kw):
     self.__nodetree = Dictionary()
     self.__url = location
     super(NodeSpace, self).__init__(*args, **kw)
Esempio n. 17
0
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)
Esempio n. 18
0
 def __get_node_tree(self):
     return Dictionary(self.__nodetree)
Esempio n. 19
0
    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)
Esempio n. 20
0
    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)