core, bridge: new method paramsRegisterApp to register frontend's specific parameters

This commit is contained in:
souliane 2013-12-27 13:28:26 +01:00
commit 4a0d8be8ec

View file

@ -295,10 +295,40 @@ class Params(object):
#the node is new
return None
def updateParams(self, xml):
def updateParams(self, xml, security_limit=NO_SECURITY_LIMIT, app=''):
"""import xml in parameters, do nothing if the param already exist
@param xml: parameters in xml form"""
src_dom = minidom.parseString(xml.encode('utf-8'))
If security_limit is specified and greater than -1, the parameters
that have a security level lower than security_limit are skipped.
@param xml: parameters in xml form
@param security_limit: -1 means no security then the higher the most secure
@param app: name of the frontend registering the parameters or empty value
"""
src_parent = minidom.parseString(xml.encode('utf-8')).documentElement
def pre_process_app_node(src_parent, security_limit, app):
"""Parameters that are registered from a frontend must be checked"""
to_remove = []
for type_node in src_parent.childNodes:
if type_node.nodeName != INDIVIDUAL:
to_remove.append(type_node) # accept individual parameters only
continue
for cat_node in type_node.childNodes:
if cat_node.nodeName != 'category':
to_remove.append(cat_node)
continue
to_remove_count = 0 # count the params to be removed from current category
for node in cat_node.childNodes:
if node.nodeName != "param" or not self.checkSecurityLimit(node, security_limit):
to_remove.append(node)
to_remove_count += 1
continue
node.setAttribute('app', app)
if len(cat_node.childNodes) == to_remove_count: # remove empty category
for dummy in xrange(0, to_remove_count):
to_remove.pop()
to_remove.append(cat_node)
for node in to_remove:
node.parentNode.removeChild(node)
def import_node(tgt_parent, src_parent):
for child in src_parent.childNodes:
@ -315,7 +345,28 @@ class Params(object):
# the node already exists, we recurse 1 more level
import_node(node, child)
import_node(self.dom.documentElement, src_dom.documentElement)
if app:
pre_process_app_node(src_parent, security_limit, app)
import_node(self.dom.documentElement, src_parent)
def paramsRegisterApp(self, xml, security_limit, app):
"""Register frontend's specific parameters
If security_limit is specified and greater than -1, the parameters
that have a security level lower than security_limit are skipped.
@param xml: XML definition of the parameters to be added
@param security_limit: -1 means no security then the higher the most secure
@param app: name of the frontend registering the parameters
"""
if not app:
warning(_("Trying to register frontends parameters with no specified app: aborted"))
return
if not hasattr(self, "frontends_cache"):
self.frontends_cache = {}
if app in self.frontends_cache:
warning(_("Trying to register twice frontends parameters for %(app)s: aborted" % {"app": app}))
return
self.updateParams(xml, security_limit, app)
debug("Frontends parameters registered for %(app)s" % {'app': app})
def __default_ok(self, value, name, category):
#FIXME: will not work with individual parameters
@ -471,12 +522,13 @@ class Params(object):
return None
return cache[(category, name)]
def __constructProfileXml(self, security_limit, profile):
def __constructProfileXml(self, security_limit, app, profile):
"""Construct xml for asked profile, filling values when needed
/!\ as noticed in doc, don't forget to unlink the minidom.Document
@security_limit: NO_SECURITY_LIMIT (-1) to return all the params.
@param security_limit: NO_SECURITY_LIMIT (-1) to return all the params.
Otherwise sole the params which have a security level defined *and*
lower or equal to the specified value are returned.
@param app: name of the frontend requesting the parameters, or '' to get all parameters
@param profile: profile name (not key !)
@return: a deferred that fire a minidom.Document of the profile xml (cf warning above)
"""
@ -518,6 +570,8 @@ class Params(object):
name = param_node.getAttribute('name')
if not self.checkSecurityLimit(param_node, security_limit):
continue
if not self.checkApp(param_node, app):
continue
if name not in dest_params:
# this is reached when a previous category exists
dest_params[name] = param_node.cloneNode(True)
@ -551,18 +605,31 @@ class Params(object):
return d.addCallback(constructProfile, profile_cache)
def getParamsUI(self, security_limit, profile_key):
"""Return a SàT XMLUI for parameters, with given profile"""
def getParamsUI(self, security_limit, app, profile_key):
"""
@param security_limit: NO_SECURITY_LIMIT (-1) to return all the params.
Otherwise sole the params which have a security level defined *and*
lower or equal to the specified value are returned.
@param app: name of the frontend requesting the parameters, or '' to get all parameters
@param profile_key: Profile key which can be either a magic (eg: @DEFAULT@) or the name of an existing profile.
@return: a SàT XMLUI for parameters
"""
profile = self.getProfileName(profile_key)
if not profile:
error(_("Asking params for inexistant profile"))
return ""
d = self.getParams(security_limit, profile)
d = self.getParams(security_limit, app, profile)
return d.addCallback(lambda param_xml: paramsXml2xmlUI(param_xml))
def getParams(self, security_limit, profile_key):
"""Construct xml for asked profile
Take params xml as skeleton"""
def getParams(self, security_limit, app, profile_key):
"""Construct xml for asked profile, take params xml as skeleton
@param security_limit: NO_SECURITY_LIMIT (-1) to return all the params.
Otherwise sole the params which have a security level defined *and*
lower or equal to the specified value are returned.
@param app: name of the frontend requesting the parameters, or '' to get all parameters
@param profile_key: Profile key which can be either a magic (eg: @DEFAULT@) or the name of an existing profile.
@return: XML of parameters
"""
profile = self.getProfileName(profile_key)
if not profile:
error(_("Asking params for inexistant profile"))
@ -573,10 +640,18 @@ class Params(object):
prof_xml.unlink()
return '\n'.join((line for line in return_xml.split('\n') if line))
return self.__constructProfileXml(security_limit, profile).addCallback(returnXML)
return self.__constructProfileXml(security_limit, app, profile).addCallback(returnXML)
def getParamsForCategory(self, category, security_limit, profile_key):
"""Return node's xml for selected category"""
def getParamsForCategory(self, category, security_limit, app, profile_key):
"""
@param category: the desired category
@param security_limit: NO_SECURITY_LIMIT (-1) to return all the params.
Otherwise sole the params which have a security level defined *and*
lower or equal to the specified value are returned.
@param app: name of the frontend requesting the parameters, or '' to get all parameters
@param profile_key: Profile key which can be either a magic (eg: @DEFAULT@) or the name of an existing profile.
@return: node's xml for selected category
"""
#TODO: manage category of general type (without existant profile)
profile = self.getProfileName(profile_key)
if not profile:
@ -593,7 +668,7 @@ class Params(object):
prof_xml.unlink()
return "<category />"
d = self.__constructProfileXml(security_limit, profile)
d = self.__constructProfileXml(security_limit, app, profile)
return d.addCallback(returnCategoryXml)
def _getParamNode(self, name, category, type_="@ALL@"): # FIXME: is type_ useful ?
@ -680,6 +755,16 @@ class Params(object):
return True
return False
def checkApp(self, node, app):
"""Check the given node against the given app.
@param node: parameter node
@param app: name of the frontend requesting the parameters, or '' to get all parameters
@return: True if this node concerns the given app.
"""
if not app or not node.hasAttribute("app"):
return True
return node.getAttribute("app") == app
class Memory(object):
"""This class manage all persistent informations"""
@ -1063,14 +1148,14 @@ class Memory(object):
def asyncGetStringParamA(self, name, category, attr="value", security_limit=NO_SECURITY_LIMIT, profile_key='@NONE@'):
return self.params.asyncGetStringParamA(name, category, attr, security_limit, profile_key)
def getParamsUI(self, security_limit=NO_SECURITY_LIMIT, profile_key='@NONE@'):
return self.params.getParamsUI(security_limit, profile_key)
def getParamsUI(self, security_limit=NO_SECURITY_LIMIT, app='', profile_key='@NONE@'):
return self.params.getParamsUI(security_limit, app, profile_key)
def getParams(self, security_limit=NO_SECURITY_LIMIT, profile_key='@NONE@'):
return self.params.getParams(security_limit, profile_key)
def getParams(self, security_limit=NO_SECURITY_LIMIT, app='', profile_key='@NONE@'):
return self.params.getParams(security_limit, app, profile_key)
def getParamsForCategory(self, category, security_limit=NO_SECURITY_LIMIT, profile_key='@NONE@'):
return self.params.getParamsForCategory(category, security_limit, profile_key)
def getParamsForCategory(self, category, security_limit=NO_SECURITY_LIMIT, app='', profile_key='@NONE@'):
return self.params.getParamsForCategory(category, security_limit, app, profile_key)
def getParamsCategories(self):
return self.params.getParamsCategories()
@ -1081,5 +1166,8 @@ class Memory(object):
def updateParams(self, xml):
return self.params.updateParams(xml)
def paramsRegisterApp(self, xml, security_limit=NO_SECURITY_LIMIT, app=''):
return self.params.paramsRegisterApp(xml, security_limit, app)
def setDefault(self, name, category, callback, errback=None):
return self.params.setDefault(name, category, callback, errback)