# HG changeset patch # User souliane # Date 1401366841 -7200 # Node ID 0a9986452bba1117ca219f404c0e962f523b074f # Parent 7ea0215e70926d3d4e2d3332f2a6b6a185025222 frontends: fixes bug with private message introduced with revision 1000 (6f1e03068b5f) + display messages from contacts not in roster diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/constants.py --- 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') diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/primitivus/chat.py --- 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) diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/primitivus/contact_list.py --- 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 diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/primitivus/primitivus --- 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) diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/quick_frontend/quick_app.py --- 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) diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/quick_frontend/quick_contact_list.py --- 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']) diff -r 7ea0215e7092 -r 0a9986452bba frontends/src/wix/contact_list.py --- 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):