changeset 1058:0a9986452bba

frontends: fixes bug with private message introduced with revision 1000 (6f1e03068b5f) + display messages from contacts not in roster
author souliane <souliane@mailoo.org>
date Thu, 29 May 2014 14:34:01 +0200
parents 7ea0215e7092
children b2b9c184033f
files frontends/src/constants.py frontends/src/primitivus/chat.py frontends/src/primitivus/contact_list.py frontends/src/primitivus/primitivus frontends/src/quick_frontend/quick_app.py frontends/src/quick_frontend/quick_contact_list.py frontends/src/wix/contact_list.py
diffstat 7 files changed, 49 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/constants.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/constants.py	Thu May 29 14:34:01 2014 +0200
@@ -75,3 +75,6 @@
         "composing": u'✎',
         "paused": u"⦷"
     }
+
+    # Roster
+    GROUP_NOT_IN_ROSTER = D_('Not in roster')
--- a/frontends/src/primitivus/chat.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/primitivus/chat.py	Thu May 29 14:34:01 2014 +0200
@@ -25,7 +25,7 @@
 from sat_frontends.primitivus.card_game import CardGame
 from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate
 from sat_frontends.primitivus.xmlui import XMLUI
-from sat_frontends.primitivus.constants import Const
+from sat_frontends.primitivus.constants import Const as C
 import time
 from sat.tools.jid  import JID
 
@@ -179,18 +179,18 @@
     def updateChatState(self, state, nick=None):
         """Set the chat state (XEP-0085) of the contact. Leave nick to None
         to set the state for a one2one conversation, or give a nickname or
-        Const.ALL_OCCUPANTS to set the state of a participant within a MUC.
+        C.ALL_OCCUPANTS to set the state of a participant within a MUC.
         @param state: the new chat state
-        @param nick: None for one2one, the MUC user nick or Const.ALL_OCCUPANTS
+        @param nick: None for one2one, the MUC user nick or C.ALL_OCCUPANTS
         """
         if nick:
             assert(self.type == 'group')
-            occupants = self.occupants if nick == Const.ALL_OCCUPANTS else [nick]
+            occupants = self.occupants if nick == C.ALL_OCCUPANTS else [nick]
             options = self.present_wid.getAllValues()
             for index in xrange(0, len(options)):
                 nick = options[index].value
                 if nick in occupants:
-                    options[index] = (nick, '%s %s' % (Const.MUC_USER_STATES[state], nick))
+                    options[index] = (nick, '%s %s' % (C.MUC_USER_STATES[state], nick))
             self.present_wid.changeValues(options)
             self.host.redraw()
         else:
@@ -209,7 +209,7 @@
         full_jid = JID("%s/%s" % (self.target.bare, nick))
         new_jid = escapePrivate(full_jid)
         if new_jid not in self.host.contact_list:
-            self.host.contact_list.add(new_jid)
+            self.host.contact_list.add(new_jid, [C.GROUP_NOT_IN_ROSTER])
 
         #now we select the new window
         self.host.contact_list.setFocus(full_jid, True)
--- a/frontends/src/primitivus/contact_list.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/primitivus/contact_list.py	Thu May 29 14:34:01 2014 +0200
@@ -236,30 +236,36 @@
     def replace(self, jid, groups=None, attributes=None):
         """Add a contact to the list if doesn't exist, else update it.
 
+        This method can be called with groups=None for the purpose of updating
+        the contact's attributes (e.g. nickname). In that case, the groups
+        attribute must not be set to the default group but ignored. If not,
+        you may move your contact from its actual group(s) to the default one.
+
+        None value for 'groups' has a different meaning than [None] which is for the default group.
+
         @param jid (JID)
         @param groups (list): list of groups or None to ignore the groups membership.
         @param attributes (dict)
-
-        XXX: None value for 'groups' has a different meaning than [None] which is for the default group.
         """
-        QuickContactList.replace(self, jid, groups, attributes)
+        QuickContactList.replace(self, jid, groups, attributes)  # eventually change the nickname
         if jid.bare in self.specials:
             return
-        if not attributes:
-            attributes = {}
+        if groups is None:
+            self.update()
+            return
         assert isinstance(jid, JID)
-        if groups is not None:
-            if not groups:
-                groups = [None]
-            for group in [group for group in self.groups if group not in groups]:
-                try:  # remove the contact from a previous group
-                    self.groups[group][1].remove(jid.bare)
-                except KeyError:
-                    pass
-            for group in groups:
-                if group not in self.groups:
-                    self.groups[group] = [True, set()]  # [unfold, list_of_contacts]
-                self.groups[group][1].add(jid.bare)
+        assert isinstance(groups, list)
+        if groups == []:
+            groups = [None]  # [None] is the default group
+        for group in [group for group in self.groups if group not in groups]:
+            try:  # remove the contact from a previous group
+                self.groups[group][1].remove(jid.bare)
+            except KeyError:
+                pass
+        for group in groups:
+            if group not in self.groups:
+                self.groups[group] = [True, set()]  # [unfold, list_of_contacts]
+            self.groups[group][1].add(jid.bare)
         self.update()
 
     def remove(self, jid):
@@ -278,7 +284,7 @@
 
     def add(self, jid, param_groups=None):
         """add a contact to the list"""
-        self.replace(jid, param_groups)
+        self.replace(jid, param_groups if param_groups else [None])
 
     def setSpecial(self, special_jid, special_type, show=False):
         """Set entity as a special
--- a/frontends/src/primitivus/primitivus	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/primitivus/primitivus	Thu May 29 14:34:01 2014 +0200
@@ -388,7 +388,7 @@
         if not from_jid in self.contact_list and from_jid.bare != self.profiles[profile]['whoami'].bare:
             #XXX: needed to show entities which haven't sent any
             #     presence information and which are not in roster
-            self.contact_list.replace(from_jid, ['Not in roster'])
+            self.contact_list.replace(from_jid, [C.GROUP_NOT_IN_ROSTER])
 
         if JID(self.contact_list.selected).bare != from_jid.bare:
             self.contact_list.putAlert(from_jid)
--- a/frontends/src/quick_frontend/quick_app.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/quick_frontend/quick_app.py	Thu May 29 14:34:01 2014 +0200
@@ -269,7 +269,7 @@
             else:
                 from_jid = new_jid
             if new_jid not in self.contact_list:
-                self.contact_list.add(new_jid)
+                self.contact_list.add(new_jid, [C.GROUP_NOT_IN_ROSTER])
 
         self.newMessage(from_jid, to_jid, msg, _type, extra, profile)
 
--- a/frontends/src/quick_frontend/quick_contact_list.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/quick_frontend/quick_contact_list.py	Thu May 29 14:34:01 2014 +0200
@@ -57,11 +57,16 @@
     def replace(self, jid, groups=None, attributes=None):
         """Add a contact to the list if doesn't exist, else update it.
 
+        This method can be called with groups=None for the purpose of updating
+        the contact's attributes (e.g. nickname). In that case, the groups
+        attribute must not be set to the default group but ignored. If not,
+        you may move your contact from its actual group(s) to the default one.
+
+        None value for 'groups' has a different meaning than [None] which is for the default group.
+
         @param jid (JID)
         @param groups (list): list of groups or None to ignore the groups membership.
         @param attributes (dict)
-
-        XXX: None value for 'groups' has a different meaning than [None] which is for the default group.
         """
         if attributes and 'name' in attributes:
             self.setCache(jid, 'name', attributes['name'])
--- a/frontends/src/wix/contact_list.py	Sun Jun 08 17:39:21 2014 +0200
+++ b/frontends/src/wix/contact_list.py	Thu May 29 14:34:01 2014 +0200
@@ -79,11 +79,16 @@
     def replace(self, contact, groups=None, attributes=None):
         """Add a contact to the list if doesn't exist, else update it.
 
+        This method can be called with groups=None for the purpose of updating
+        the contact's attributes (e.g. nickname). In that case, the groups
+        attribute must not be set to the default group but ignored. If not,
+        you may move your contact from its actual group(s) to the default one.
+
+        None value for 'groups' has a different meaning than [None] which is for the default group.
+
         @param jid (JID)
         @param groups (list): list of groups or None to ignore the groups membership.
         @param attributes (dict)
-
-        XXX: None value for 'groups' has a different meaning than [None] which is for the default group.
         """
         log.debug(_("update %s") % contact)
         if not self.__find_idx(contact):