diff src/memory/memory.py @ 538:2c4016921403

core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles - added profile argument to askConfirmation, actionResult, actionResultExt, entityDataUpdated, confirmationAnswer, getProgress - core, frontends: fixed calls/signals according to new bridge API - user of proper profile namespace for progression indicators and dialogs - memory: getParam* now return bool when param type is bool - memory: added getStringParam* to return string instead of typed value - core, memory, storage, quick_frontend: getHistory now manage properly multi-profiles - plugins XEP-0047, XEP-0054, XEP-0065, XEP-0077, XEP-0096; multi-profiles proper handling
author Goffi <goffi@goffi.org>
date Sat, 10 Nov 2012 16:38:16 +0100
parents 862c0d6ab974
children 2b3e3349f6a4
line wrap: on
line diff
--- a/src/memory/memory.py	Sun Nov 04 23:53:26 2012 +0100
+++ b/src/memory/memory.py	Sat Nov 10 16:38:16 2012 +0100
@@ -227,6 +227,28 @@
             d.addCallback(self.__default_ok, name, category)
             d.addErrback(errback or self.__default_ko, name, category)
 
+    def __getAttr(self, node, attr, value):
+        """ get attribute value
+        @param node: XML param node
+        @param attr: name of the attribute to get (e.g.: 'value' or 'type')
+        @param value: user defined value"""
+        if attr == 'value':
+            value_to_use = value if value!=None else node.getAttribute(attr) #we use value (user defined) if it exist, else we use node's default value
+            if node.getAttribute('type') == 'bool':
+                return value_to_use.lower() not in ('false','0')
+            return value_to_use
+        return node.getAttribute(attr)
+
+    def __type_to_string(self, result):
+        """ convert result to string, according to its type """
+        if isinstance(result,bool):
+            return "true" if result else "false"
+        return result
+
+    def getStringParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
+        """ Same as getParamA but for bridge: convert non string value to string """
+        return self.__type_to_string(self.getParamA(name, category, attr, profile_key))
+
     def getParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
         """Helper method to get a specific attribute
            @param name: name of the parameter
@@ -235,31 +257,35 @@
            @param profile: owner of the param (@ALL@ for everyone)
            
            @return: attribute"""
+        #FIXME: looks really dirty and buggy, need to be reviewed/refactored
         node = self.__getParamNode(name, category)
         if not node:
             error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category})
-            return ""
+            raise exceptions.NotFound
 
         if node[0] == 'general':
             value = self.__getParam(None, category, name, 'general')
-            return value if value!=None else node[1].getAttribute(attr)
+            return self.__getAttr(node[1], attr, value)
         
         assert(node[0] == 'individual')
 
         profile = self.getProfileName(profile_key)
         if not profile:
             error(_('Requesting a param for an non-existant profile'))
-            return ""
+            raise exceptions.ProfileUnknownError
         
         if profile not in self.params:
             error(_('Requesting synchronous param for not connected profile'))
-            return ""
+            raise exceptions.ConnectedProfileError
 
         if attr == "value": 
             value = self.__getParam(profile, category, name)
-            return value if value!=None else node[1].getAttribute(attr)
-        else:
-            return node[1].getAttribute(attr)
+            return self.__getAttr(node[1], attr, value)
+
+    def asyncGetStringParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
+        d = self.asyncGetParamA(name, category, attr, profile_key)
+        d.addCallback(self.__type_to_string)
+        return d
 
     def asyncGetParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
         """Helper method to get a specific attribute
@@ -274,7 +300,7 @@
 
         if node[0] == 'general':
             value = self.__getParam(None, category, name, 'general')
-            return defer.succeed(value if value!=None else node[1].getAttribute(attr))
+            return defer.succeed(self.__getAttr(node[1], attr, value))
         
         assert(node[0] == 'individual')
 
@@ -285,21 +311,20 @@
         
         if attr != "value": 
             return defer.succeed(node[1].getAttribute(attr))
-        default = node[1].getAttribute(attr)
         try:
             value = self.__getParam(profile, category, name)
-            return defer.succeed(value if value!=None else default)
+            return defer.succeed(self.__getAttr(node[1], attr, value))
         except exceptions.ProfileNotInCacheError:
             #We have to ask data to the storage manager
             d = self.storage.getIndParam(category, name, profile)
-            return d.addCallback(lambda value: value if value!=None else default)
+            return d.addCallback(lambda value: self.__getAttr(node[1], attr, value))
 
     def __getParam(self, profile, category, name, _type='individual', cache=None):
         """Return the param, or None if it doesn't exist
         @param profile: the profile name (not profile key, i.e. name and not something like @DEFAULT@)
         @param category: param category
         @param name: param name
-        @param type: "general" or "individual"
+        @param _type: "general" or "individual"
         @param cache: temporary cache, to use when profile is not logged
         @return: param value or None if it doesn't exist
         """
@@ -614,8 +639,9 @@
         assert(profile!="@NONE@")
         return self.storage.addToHistory(from_jid, to_jid, message, _type, timestamp, profile)
 
-    def getHistory(self, from_jid, to_jid, limit=0, between=True):
-        return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between)
+    def getHistory(self, from_jid, to_jid, limit=0, between=True, profile="@NONE@"):
+        assert(profile != "@NONE@")
+        return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between, profile)
 
     def addServerFeature(self, feature, profile):
         """Add a feature discovered from server
@@ -788,11 +814,14 @@
         
         return self.subscriptions[profile]
 
+    def getStringParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
+        return self.params.getStringParamA(name, category, attr, profile_key)
+    
     def getParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
         return self.params.getParamA(name, category, attr, profile_key)
     
-    def asyncGetParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
-        return self.params.asyncGetParamA(name, category, attr, profile_key)
+    def asyncGetStringParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
+        return self.params.asyncGetStringParamA(name, category, attr, profile_key)
     
     def getParamsUI(self, profile_key):
         return self.params.getParamsUI(profile_key)