From f09fb76752f2c975bd0881fa4d20164cd5cc218d Mon Sep 17 00:00:00 2001 From: souliane Date: Thu, 29 May 2014 14:34:01 +0200 Subject: [PATCH] frontends: fixes bug with private message introduced with revision 1000 (6f1e03068b5f) + display messages from contacts not in roster --- frontends/src/constants.py | 3 ++ frontends/src/primitivus/chat.py | 12 +++--- frontends/src/primitivus/contact_list.py | 42 +++++++++++-------- frontends/src/primitivus/primitivus | 2 +- frontends/src/quick_frontend/quick_app.py | 2 +- .../src/quick_frontend/quick_contact_list.py | 9 +++- frontends/src/wix/contact_list.py | 9 +++- 7 files changed, 49 insertions(+), 30 deletions(-) diff --git a/frontends/src/constants.py b/frontends/src/constants.py index 2114f178..dfe081d8 100644 --- a/frontends/src/constants.py +++ b/frontends/src/constants.py @@ -75,3 +75,6 @@ class Const(constants.Const): "composing": u'✎', "paused": u"⦷" } + + # Roster + GROUP_NOT_IN_ROSTER = D_('Not in roster') diff --git a/frontends/src/primitivus/chat.py b/frontends/src/primitivus/chat.py index 94235367..ee711151 100644 --- a/frontends/src/primitivus/chat.py +++ b/frontends/src/primitivus/chat.py @@ -25,7 +25,7 @@ from sat_frontends.quick_frontend.quick_chat import QuickChat 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 @@ class Chat(urwid.WidgetWrap, QuickChat): 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 @@ class Chat(urwid.WidgetWrap, QuickChat): 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) diff --git a/frontends/src/primitivus/contact_list.py b/frontends/src/primitivus/contact_list.py index 9e00791a..98396d7d 100644 --- a/frontends/src/primitivus/contact_list.py +++ b/frontends/src/primitivus/contact_list.py @@ -236,30 +236,36 @@ class ContactList(urwid.WidgetWrap, QuickContactList): 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 @@ class ContactList(urwid.WidgetWrap, QuickContactList): 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 diff --git a/frontends/src/primitivus/primitivus b/frontends/src/primitivus/primitivus index b47e13e9..6a0a506f 100755 --- a/frontends/src/primitivus/primitivus +++ b/frontends/src/primitivus/primitivus @@ -388,7 +388,7 @@ class PrimitivusApp(QuickApp, InputHistory): 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) diff --git a/frontends/src/quick_frontend/quick_app.py b/frontends/src/quick_frontend/quick_app.py index 16dec97e..08e38630 100644 --- a/frontends/src/quick_frontend/quick_app.py +++ b/frontends/src/quick_frontend/quick_app.py @@ -269,7 +269,7 @@ class QuickApp(object): 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) diff --git a/frontends/src/quick_frontend/quick_contact_list.py b/frontends/src/quick_frontend/quick_contact_list.py index 3198913c..5723b608 100644 --- a/frontends/src/quick_frontend/quick_contact_list.py +++ b/frontends/src/quick_frontend/quick_contact_list.py @@ -57,11 +57,16 @@ class QuickContactList(object): 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']) diff --git a/frontends/src/wix/contact_list.py b/frontends/src/wix/contact_list.py index 92287d30..2cdd2c13 100644 --- a/frontends/src/wix/contact_list.py +++ b/frontends/src/wix/contact_list.py @@ -79,11 +79,16 @@ class ContactList(wx.SimpleHtmlListBox, QuickContactList): 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):