comparison 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
comparison
equal deleted inserted replaced
537:28cddc96c4ed 538:2c4016921403
225 del node[1].attributes['default_cb'] 225 del node[1].attributes['default_cb']
226 d = defer.maybeDeferred(callback) 226 d = defer.maybeDeferred(callback)
227 d.addCallback(self.__default_ok, name, category) 227 d.addCallback(self.__default_ok, name, category)
228 d.addErrback(errback or self.__default_ko, name, category) 228 d.addErrback(errback or self.__default_ko, name, category)
229 229
230 def __getAttr(self, node, attr, value):
231 """ get attribute value
232 @param node: XML param node
233 @param attr: name of the attribute to get (e.g.: 'value' or 'type')
234 @param value: user defined value"""
235 if attr == 'value':
236 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
237 if node.getAttribute('type') == 'bool':
238 return value_to_use.lower() not in ('false','0')
239 return value_to_use
240 return node.getAttribute(attr)
241
242 def __type_to_string(self, result):
243 """ convert result to string, according to its type """
244 if isinstance(result,bool):
245 return "true" if result else "false"
246 return result
247
248 def getStringParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
249 """ Same as getParamA but for bridge: convert non string value to string """
250 return self.__type_to_string(self.getParamA(name, category, attr, profile_key))
251
230 def getParamA(self, name, category, attr="value", profile_key="@DEFAULT@"): 252 def getParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
231 """Helper method to get a specific attribute 253 """Helper method to get a specific attribute
232 @param name: name of the parameter 254 @param name: name of the parameter
233 @param category: category of the parameter 255 @param category: category of the parameter
234 @param attr: name of the attribute (default: "value") 256 @param attr: name of the attribute (default: "value")
235 @param profile: owner of the param (@ALL@ for everyone) 257 @param profile: owner of the param (@ALL@ for everyone)
236 258
237 @return: attribute""" 259 @return: attribute"""
260 #FIXME: looks really dirty and buggy, need to be reviewed/refactored
238 node = self.__getParamNode(name, category) 261 node = self.__getParamNode(name, category)
239 if not node: 262 if not node:
240 error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category}) 263 error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category})
241 return "" 264 raise exceptions.NotFound
242 265
243 if node[0] == 'general': 266 if node[0] == 'general':
244 value = self.__getParam(None, category, name, 'general') 267 value = self.__getParam(None, category, name, 'general')
245 return value if value!=None else node[1].getAttribute(attr) 268 return self.__getAttr(node[1], attr, value)
246 269
247 assert(node[0] == 'individual') 270 assert(node[0] == 'individual')
248 271
249 profile = self.getProfileName(profile_key) 272 profile = self.getProfileName(profile_key)
250 if not profile: 273 if not profile:
251 error(_('Requesting a param for an non-existant profile')) 274 error(_('Requesting a param for an non-existant profile'))
252 return "" 275 raise exceptions.ProfileUnknownError
253 276
254 if profile not in self.params: 277 if profile not in self.params:
255 error(_('Requesting synchronous param for not connected profile')) 278 error(_('Requesting synchronous param for not connected profile'))
256 return "" 279 raise exceptions.ConnectedProfileError
257 280
258 if attr == "value": 281 if attr == "value":
259 value = self.__getParam(profile, category, name) 282 value = self.__getParam(profile, category, name)
260 return value if value!=None else node[1].getAttribute(attr) 283 return self.__getAttr(node[1], attr, value)
261 else: 284
262 return node[1].getAttribute(attr) 285 def asyncGetStringParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
286 d = self.asyncGetParamA(name, category, attr, profile_key)
287 d.addCallback(self.__type_to_string)
288 return d
263 289
264 def asyncGetParamA(self, name, category, attr="value", profile_key="@DEFAULT@"): 290 def asyncGetParamA(self, name, category, attr="value", profile_key="@DEFAULT@"):
265 """Helper method to get a specific attribute 291 """Helper method to get a specific attribute
266 @param name: name of the parameter 292 @param name: name of the parameter
267 @param category: category of the parameter 293 @param category: category of the parameter
272 error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category}) 298 error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category})
273 return None 299 return None
274 300
275 if node[0] == 'general': 301 if node[0] == 'general':
276 value = self.__getParam(None, category, name, 'general') 302 value = self.__getParam(None, category, name, 'general')
277 return defer.succeed(value if value!=None else node[1].getAttribute(attr)) 303 return defer.succeed(self.__getAttr(node[1], attr, value))
278 304
279 assert(node[0] == 'individual') 305 assert(node[0] == 'individual')
280 306
281 profile = self.getProfileName(profile_key) 307 profile = self.getProfileName(profile_key)
282 if not profile: 308 if not profile:
283 error(_('Requesting a param for a non-existant profile')) 309 error(_('Requesting a param for a non-existant profile'))
284 return defer.fail() 310 return defer.fail()
285 311
286 if attr != "value": 312 if attr != "value":
287 return defer.succeed(node[1].getAttribute(attr)) 313 return defer.succeed(node[1].getAttribute(attr))
288 default = node[1].getAttribute(attr)
289 try: 314 try:
290 value = self.__getParam(profile, category, name) 315 value = self.__getParam(profile, category, name)
291 return defer.succeed(value if value!=None else default) 316 return defer.succeed(self.__getAttr(node[1], attr, value))
292 except exceptions.ProfileNotInCacheError: 317 except exceptions.ProfileNotInCacheError:
293 #We have to ask data to the storage manager 318 #We have to ask data to the storage manager
294 d = self.storage.getIndParam(category, name, profile) 319 d = self.storage.getIndParam(category, name, profile)
295 return d.addCallback(lambda value: value if value!=None else default) 320 return d.addCallback(lambda value: self.__getAttr(node[1], attr, value))
296 321
297 def __getParam(self, profile, category, name, _type='individual', cache=None): 322 def __getParam(self, profile, category, name, _type='individual', cache=None):
298 """Return the param, or None if it doesn't exist 323 """Return the param, or None if it doesn't exist
299 @param profile: the profile name (not profile key, i.e. name and not something like @DEFAULT@) 324 @param profile: the profile name (not profile key, i.e. name and not something like @DEFAULT@)
300 @param category: param category 325 @param category: param category
301 @param name: param name 326 @param name: param name
302 @param type: "general" or "individual" 327 @param _type: "general" or "individual"
303 @param cache: temporary cache, to use when profile is not logged 328 @param cache: temporary cache, to use when profile is not logged
304 @return: param value or None if it doesn't exist 329 @return: param value or None if it doesn't exist
305 """ 330 """
306 if _type == 'general': 331 if _type == 'general':
307 if self.params_gen.has_key((category, name)): 332 if self.params_gen.has_key((category, name)):
612 637
613 def addToHistory(self, from_jid, to_jid, message, _type='chat', timestamp=None, profile="@NONE@"): 638 def addToHistory(self, from_jid, to_jid, message, _type='chat', timestamp=None, profile="@NONE@"):
614 assert(profile!="@NONE@") 639 assert(profile!="@NONE@")
615 return self.storage.addToHistory(from_jid, to_jid, message, _type, timestamp, profile) 640 return self.storage.addToHistory(from_jid, to_jid, message, _type, timestamp, profile)
616 641
617 def getHistory(self, from_jid, to_jid, limit=0, between=True): 642 def getHistory(self, from_jid, to_jid, limit=0, between=True, profile="@NONE@"):
618 return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between) 643 assert(profile != "@NONE@")
644 return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between, profile)
619 645
620 def addServerFeature(self, feature, profile): 646 def addServerFeature(self, feature, profile):
621 """Add a feature discovered from server 647 """Add a feature discovered from server
622 @param feature: string of the feature 648 @param feature: string of the feature
623 @param profile: which profile is using this server ?""" 649 @param profile: which profile is using this server ?"""
786 if not self.subscriptions.has_key(profile): 812 if not self.subscriptions.has_key(profile):
787 return {} 813 return {}
788 814
789 return self.subscriptions[profile] 815 return self.subscriptions[profile]
790 816
817 def getStringParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
818 return self.params.getStringParamA(name, category, attr, profile_key)
819
791 def getParamA(self, name, category, attr="value", profile_key='@DEFAULT@'): 820 def getParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
792 return self.params.getParamA(name, category, attr, profile_key) 821 return self.params.getParamA(name, category, attr, profile_key)
793 822
794 def asyncGetParamA(self, name, category, attr="value", profile_key='@DEFAULT@'): 823 def asyncGetStringParamA(self, name, category, attr="value", profile_key='@DEFAULT@'):
795 return self.params.asyncGetParamA(name, category, attr, profile_key) 824 return self.params.asyncGetStringParamA(name, category, attr, profile_key)
796 825
797 def getParamsUI(self, profile_key): 826 def getParamsUI(self, profile_key):
798 return self.params.getParamsUI(profile_key) 827 return self.params.getParamsUI(profile_key)
799 828
800 def getParams(self, profile_key): 829 def getParams(self, profile_key):