changeset 1320:3012c2f15dae frontends_multi_profiles

merges souliane commits
author Goffi <goffi@goffi.org>
date Mon, 09 Feb 2015 21:40:45 +0100 (2015-02-09)
parents 781ee3539252 (current diff) 9e904f8a094e (diff)
children e9888db0eb0c
files
diffstat 2 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/quick_frontend/quick_widgets.py	Mon Feb 09 21:39:51 2015 +0100
+++ b/frontends/src/quick_frontend/quick_widgets.py	Mon Feb 09 21:40:45 2015 +0100
@@ -100,18 +100,20 @@
         @param class_(class): class of the widget to create
         @param target: target depending of the widget, usually a JID instance
         @param args(list): optional args to create a new instance of class_
-        @param kwargs(list): optional kwargs to create anew instance of class_
+        @param kwargs(dict): optional kwargs to create a new instance of class_
             if 'profile' key is present, it will be popped and put in 'profiles'
             if there is neither 'profile' nor 'profiles', None will be used for 'profiles'
             if 'on_new_widget' is present it can have the following values:
                 C.WIDGET_NEW [default]: self.host.newWidget will be called on widget creation
-                [callable]: this method will be called instead of self.host.newWidget
+                [callable]: this method will be called instead of self.host.newWidget,
+                    and can return another widget to modify the result of the present method
                 None: do nothing
             if 'on_existing_widget' is present it can have the following values:
                 C.WIDGET_KEEP  [default]: return the existing widget
                 C.WIDGET_RAISE: raise WidgetAlreadyExistsError
                 C.WIDGET_RECREATE: create a new widget *WITH A NEW HASH*
-                [callable]: this method will be called with existing widget as argument
+                [callable]: this method will be called with existing widget as argument,
+                    and can return another widget to modify the result of the present method
             if 'force_hash' is present, the hash given in value will be used instead of the one returned by class_.getWidgetHash
             other keys will be used to instanciate class_ if the case happen (e.g. if type_ is present and class_ is a QuickChat subclass,
                 it will be used to create a new QuickChat instance).
@@ -169,7 +171,9 @@
             if on_new_widget == C.WIDGET_NEW:
                 self.host.newWidget(widget)
             elif callable(on_new_widget):
-                on_new_widget(widget)
+                result = on_new_widget(widget)
+                if isinstance(result, QuickWidget):
+                    widget = result
             else:
                 assert on_new_widget is None
         else:
@@ -195,7 +199,7 @@
                 new_kwargs['on_existing_widget'] = C.WIDGET_RAISE
                 hash_idx = 1
                 while True:
-                    new_kwargs['force_hash'] = hash_ + "_new_instance_{}".format(hash_idx)
+                    new_kwargs['force_hash'] = "{}_new_instance_{}".format(hash_, hash_idx)
                     try:
                         widget = self.getOrCreateWidget(class_, target, *args, **new_kwargs)
                     except WidgetAlreadyExistsError:
@@ -204,7 +208,9 @@
                         log.debug(u"Widget already exists, a new one has been recreated with hash {}".format(new_kwargs['force_hash']))
                         break
             elif callable(on_existing_widget):
-                on_existing_widget(widget)
+                result = on_existing_widget(widget)
+                if isinstance(result, QuickWidget):
+                    widget = result
             else:
                 raise exceptions.InternalError("Unexpected on_existing_widget value ({})".format(on_existing_widget))
 
--- a/frontends/src/tools/jid.py	Mon Feb 09 21:39:51 2015 +0100
+++ b/frontends/src/tools/jid.py	Mon Feb 09 21:40:45 2015 +0100
@@ -58,12 +58,14 @@
             return getattr(self.__internal_str, name)
 
         def __eq__(self, other):
+            if not isinstance(other, JID):
+                return False
             return (self.node == other.node
                     and self.domain == other.domain
                     and self.resource == other.resource)
 
         def __hash__(self):
-            return hash(self.__internal_str)
+            return hash('JID<{}>'.format(self.__internal_str))
 
         def find(self, *args):
             return self.__internal_str.find(*args)
@@ -75,7 +77,7 @@
                 node_end = 0
             domain_end = self.__internal_str.find('/')
             if domain_end == 0:
-               raise ValueError("a jid can't start with '/'")
+                raise ValueError("a jid can't start with '/'")
             if domain_end == -1:
                 domain_end = len(self.__internal_str)
             self.node = self.__internal_str[:node_end] or None