Let contact instances know their corresponding account.

contact.account and gc_contact.account contains the account name of the owning account. There is still code around in many placed which tries to workaround this missing information. Such code has to be migrated on per-need basis.
This commit is contained in:
Stephan Erb 2009-11-05 15:57:43 +01:00
parent c6448d0f2b
commit 06129f45ef
9 changed files with 108 additions and 42 deletions

View File

@ -29,16 +29,23 @@
## ##
import common.gajim import common.gajim
from common import caps from common import caps
class XMPPEntity(object):
class CommonContact(object): '''Base representation of entities in XMPP'''
def __init__(self, jid, resource, show, status, name, our_chatstate, def __init__(self, jid, account, resource):
self.jid = jid
self.resource = resource
self.account = account
class CommonContact(XMPPEntity):
def __init__(self, jid, account, resource, show, status, name, our_chatstate,
composing_xep, chatstate, client_caps=None): composing_xep, chatstate, client_caps=None):
XMPPEntity.__init__(self, jid, account, resource)
self.jid = jid self.jid = jid
self.resource = resource self.resource = resource
self.show = show self.show = show
@ -99,12 +106,12 @@ class CommonContact(object):
class Contact(CommonContact): class Contact(CommonContact):
'''Information concerning each contact''' '''Information concerning each contact'''
def __init__(self, jid='', name='', groups=[], show='', status='', sub='', def __init__(self, jid, account, name='', groups=[], show='', status='', sub='',
ask='', resource='', priority=0, keyID='', client_caps=None, ask='', resource='', priority=0, keyID='', client_caps=None,
our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None,
composing_xep=None, mood={}, tune={}, activity={}): composing_xep=None, mood={}, tune={}, activity={}):
CommonContact.__init__(self, jid, resource, show, status, name, CommonContact.__init__(self, jid, account, resource, show, status, name,
our_chatstate, composing_xep, chatstate, client_caps=client_caps) our_chatstate, composing_xep, chatstate, client_caps=client_caps)
self.contact_name = '' # nick choosen by contact self.contact_name = '' # nick choosen by contact
@ -184,11 +191,11 @@ class Contact(CommonContact):
class GC_Contact(CommonContact): class GC_Contact(CommonContact):
'''Information concerning each groupchat contact''' '''Information concerning each groupchat contact'''
def __init__(self, room_jid='', name='', show='', status='', role='', def __init__(self, room_jid, account, name='', show='', status='', role='',
affiliation='', jid='', resource='', our_chatstate=None, affiliation='', jid='', resource='', our_chatstate=None,
composing_xep=None, chatstate=None): composing_xep=None, chatstate=None):
CommonContact.__init__(self, jid, resource, show, status, name, CommonContact.__init__(self, jid, account, resource, show, status, name,
our_chatstate, composing_xep, chatstate) our_chatstate, composing_xep, chatstate)
self.room_jid = room_jid self.room_jid = room_jid
@ -233,7 +240,7 @@ class Contacts:
del self._gc_contacts[account] del self._gc_contacts[account]
del self._metacontacts_tags[account] del self._metacontacts_tags[account]
def create_contact(self, jid='', name='', groups=[], show='', status='', def create_contact(self, jid, account, name='', groups=[], show='', status='',
sub='', ask='', resource='', priority=0, keyID='', client_caps=None, sub='', ask='', resource='', priority=0, keyID='', client_caps=None,
our_chatstate=None, chatstate=None, last_status_time=None, our_chatstate=None, chatstate=None, last_status_time=None,
composing_xep=None, mood={}, tune={}, activity={}): composing_xep=None, mood={}, tune={}, activity={}):
@ -244,21 +251,23 @@ class Contacts:
if group not in groups_unique: if group not in groups_unique:
groups_unique.append(group) groups_unique.append(group)
return Contact(jid=jid, name=name, groups=groups_unique, show=show, return Contact(jid=jid, account=account, name=name, groups=groups_unique,
status=status, sub=sub, ask=ask, resource=resource, priority=priority, show=show, status=status, sub=sub, ask=ask, resource=resource, priority=priority,
keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate, keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate,
chatstate=chatstate, last_status_time=last_status_time, chatstate=chatstate, last_status_time=last_status_time,
composing_xep=composing_xep, mood=mood, tune=tune, activity=activity) composing_xep=composing_xep, mood=mood, tune=tune, activity=activity)
def copy_contact(self, contact): def copy_contact(self, contact):
return self.create_contact(jid=contact.jid, name=contact.name, return self.create_contact(jid=contact.jid, account=contact.account,
groups=contact.groups, show=contact.show, status=contact.status, name=contact.name, groups=contact.groups, show=contact.show, status=contact.status,
sub=contact.sub, ask=contact.ask, resource=contact.resource, sub=contact.sub, ask=contact.ask, resource=contact.resource,
priority=contact.priority, keyID=contact.keyID, priority=contact.priority, keyID=contact.keyID,
client_caps=contact.client_caps, our_chatstate=contact.our_chatstate, client_caps=contact.client_caps, our_chatstate=contact.our_chatstate,
chatstate=contact.chatstate, last_status_time=contact.last_status_time) chatstate=contact.chatstate, last_status_time=contact.last_status_time)
def add_contact(self, account, contact): def add_contact(self, account, contact):
assert account == contact.account # migration check
# No such account before ? # No such account before ?
if account not in self._contacts: if account not in self._contacts:
self._contacts[account] = {contact.jid : [contact]} self._contacts[account] = {contact.jid : [contact]}
@ -623,16 +632,18 @@ class Contacts:
def contact_from_gc_contact(self, gc_contact): def contact_from_gc_contact(self, gc_contact):
'''Create a Contact instance from a GC_Contact instance''' '''Create a Contact instance from a GC_Contact instance'''
jid = gc_contact.get_full_jid() jid = gc_contact.get_full_jid()
return Contact(jid=jid, resource=gc_contact.resource, return Contact(jid=jid, account=gc_contact.account, resource=gc_contact.resource,
name=gc_contact.name, groups=[], show=gc_contact.show, name=gc_contact.name, groups=[], show=gc_contact.show,
status=gc_contact.status, sub='none', client_caps=gc_contact.client_caps) status=gc_contact.status, sub='none', client_caps=gc_contact.client_caps)
def create_gc_contact(self, room_jid='', name='', show='', status='', def create_gc_contact(self, room_jid, account, name='', show='', status='',
role='', affiliation='', jid='', resource=''): role='', affiliation='', jid='', resource=''):
return GC_Contact(room_jid, name, show, status, role, affiliation, jid, return GC_Contact(room_jid, name, show, status, role, affiliation, jid,
resource) resource)
def add_gc_contact(self, account, gc_contact): def add_gc_contact(self, account, gc_contact):
assert account == gc_contact.account # migration check
# No such account before ? # No such account before ?
if account not in self._gc_contacts: if account not in self._gc_contacts:
self._contacts[account] = {gc_contact.room_jid : {gc_contact.name: \ self._contacts[account] = {gc_contact.room_jid : {gc_contact.name: \

View File

@ -1888,7 +1888,7 @@ class SubscriptionRequestWindow:
if self.jid in gajim.interface.instances[self.account]['infos']: if self.jid in gajim.interface.instances[self.account]['infos']:
gajim.interface.instances[self.account]['infos'][self.jid].window.present() gajim.interface.instances[self.account]['infos'][self.jid].window.present()
else: else:
contact = gajim.contacts.create_contact(jid=self.jid, name='', contact = gajim.contacts.create_contact(jid=self.jid, account=self.account, name='',
groups=[], show='', status='', sub='', ask='', resource='', groups=[], show='', status='', sub='', ask='', resource='',
priority=5, keyID='', our_chatstate=None, chatstate=None) priority=5, keyID='', our_chatstate=None, chatstate=None)
gajim.interface.instances[self.account]['infos'][self.jid] = \ gajim.interface.instances[self.account]['infos'][self.jid] = \

View File

@ -284,7 +284,7 @@ _('Connection with peer cannot be established.'))
if contact.find('/') == -1: if contact.find('/') == -1:
return return
(jid, resource) = contact.split('/', 1) (jid, resource) = contact.split('/', 1)
contact = gajim.contacts.create_contact(jid=jid, resource=resource) contact = gajim.contacts.create_contact(jid=jid, account=account, resource=resource)
file_name = os.path.split(file_path)[1] file_name = os.path.split(file_path)[1]
file_props = self.get_send_file_props(account, contact, file_props = self.get_send_file_props(account, contact,
file_path, file_name, file_desc) file_path, file_name, file_desc)

View File

@ -1463,7 +1463,7 @@ class GroupchatControl(ChatControlBase):
self.draw_all_roles() self.draw_all_roles()
iter_ = model.append(role_iter, (None, nick, 'contact', name, None)) iter_ = model.append(role_iter, (None, nick, 'contact', name, None))
if not nick in gajim.contacts.get_nick_list(self.account, self.room_jid): if not nick in gajim.contacts.get_nick_list(self.account, self.room_jid):
gc_contact = gajim.contacts.create_gc_contact(room_jid=self.room_jid, gc_contact = gajim.contacts.create_gc_contact(room_jid=self.room_jid, account=self.account,
name=nick, show=show, status=status, role=role, name=nick, show=show, status=status, role=role,
affiliation=affiliation, jid=j, resource=resource) affiliation=affiliation, jid=j, resource=resource)
gajim.contacts.add_gc_contact(self.account, gc_contact) gajim.contacts.add_gc_contact(self.account, gc_contact)

View File

@ -344,7 +344,7 @@ class Interface:
# Ignore offline presence of unknown self resource # Ignore offline presence of unknown self resource
if new_show < 2: if new_show < 2:
return return
contact1 = gajim.contacts.create_contact(jid=ji, contact1 = gajim.contacts.create_contact(jid=ji, account=account,
name=gajim.nicks[account], groups=['self_contact'], name=gajim.nicks[account], groups=['self_contact'],
show=array[1], status=status_message, sub='both', ask='none', show=array[1], status=status_message, sub='both', ask='none',
priority=priority, keyID=keyID, resource=resource, priority=priority, keyID=keyID, resource=resource,
@ -612,8 +612,8 @@ class Interface:
keyID = attached_keys[attached_keys.index(jid) + 1] keyID = attached_keys[attached_keys.index(jid) + 1]
name = jid.split('@', 1)[0] name = jid.split('@', 1)[0]
name = name.split('%', 1)[0] name = name.split('%', 1)[0]
contact1 = gajim.contacts.create_contact(jid=jid, name=name, contact1 = gajim.contacts.create_contact(jid=jid, account=account,
groups=[], show='online', status='online', name=name, groups=[], show='online', status='online',
ask='to', resource=array[1], keyID=keyID) ask='to', resource=array[1], keyID=keyID)
gajim.contacts.add_contact(account, contact1) gajim.contacts.add_contact(account, contact1)
self.roster.add_contact(jid, account) self.roster.add_contact(jid, account)
@ -1213,8 +1213,8 @@ class Interface:
if sub == 'remove': if sub == 'remove':
return return
# Add new contact to roster # Add new contact to roster
contact = gajim.contacts.create_contact(jid=jid, name=name, contact = gajim.contacts.create_contact(jid=jid, account=account,
groups=groups, show='offline', sub=sub, ask=ask) name=name, groups=groups, show='offline', sub=sub, ask=ask)
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
self.roster.add_contact(jid, account) self.roster.add_contact(jid, account)
else: else:
@ -1353,7 +1353,7 @@ class Interface:
'attached_gpg_keys').split() 'attached_gpg_keys').split()
if jid in attached_keys: if jid in attached_keys:
keyID = attached_keys[attached_keys.index(jid) + 1] keyID = attached_keys[attached_keys.index(jid) + 1]
contact = gajim.contacts.create_contact(jid=jid, name='', contact = gajim.contacts.create_contact(jid=jid, account=account, name='',
groups=[_('Not in Roster')], show='not in roster', status='', groups=[_('Not in Roster')], show='not in roster', status='',
sub='none', keyID=keyID) sub='none', keyID=keyID)
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
@ -2567,7 +2567,7 @@ class Interface:
account): account):
# Join new groupchat # Join new groupchat
if minimize: if minimize:
contact = gajim.contacts.create_contact(jid=room_jid, name=nick) contact = gajim.contacts.create_contact(jid=room_jid, account=account, name=nick)
gc_control = GroupchatControl(None, contact, account) gc_control = GroupchatControl(None, contact, account)
gajim.interface.minimized_controls[account][room_jid] = gc_control gajim.interface.minimized_controls[account][room_jid] = gc_control
self.roster.add_groupchat(room_jid, account) self.roster.add_groupchat(room_jid, account)
@ -2590,7 +2590,7 @@ class Interface:
def new_room(self, room_jid, nick, account, is_continued=False): def new_room(self, room_jid, nick, account, is_continued=False):
# Get target window, create a control, and associate it with the window # Get target window, create a control, and associate it with the window
contact = gajim.contacts.create_contact(jid=room_jid, name=nick) contact = gajim.contacts.create_contact(jid=room_jid, account=account, name=nick)
mw = self.msg_win_mgr.get_window(contact.jid, account) mw = self.msg_win_mgr.get_window(contact.jid, account)
if not mw: if not mw:
mw = self.msg_win_mgr.create_window(contact, account, mw = self.msg_win_mgr.create_window(contact, account,

View File

@ -808,7 +808,7 @@ class RosterWindow:
else: else:
name = jid.split('@')[0] name = jid.split('@')[0]
# New groupchat # New groupchat
contact = gajim.contacts.create_contact(jid=jid, name=name, contact = gajim.contacts.create_contact(jid=jid, account=account, name=name,
groups=[_('Groupchats')], show=show, status=status, sub='none') groups=[_('Groupchats')], show=show, status=status, sub='none')
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
self.add_contact(jid, account) self.add_contact(jid, account)
@ -843,7 +843,7 @@ class RosterWindow:
Return the added contact instance.''' Return the added contact instance.'''
contact = gajim.contacts.get_contact_with_highest_priority(account, jid) contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
if contact is None: if contact is None:
contact = gajim.contacts.create_contact(jid=jid, name=jid, contact = gajim.contacts.create_contact(jid=jid, account=account, name=jid,
groups=[_('Transports')], show='offline', status='offline', groups=[_('Transports')], show='offline', status='offline',
sub='from') sub='from')
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
@ -984,7 +984,7 @@ class RosterWindow:
'attached_gpg_keys').split() 'attached_gpg_keys').split()
if jid in attached_keys: if jid in attached_keys:
keyID = attached_keys[attached_keys.index(jid) + 1] keyID = attached_keys[attached_keys.index(jid) + 1]
contact = gajim.contacts.create_contact(jid=jid, name=nick, contact = gajim.contacts.create_contact(jid=jid, account=account, name=nick,
groups=[_('Not in Roster')], show='not in roster', status='', groups=[_('Not in Roster')], show='not in roster', status='',
sub='none', resource=resource, keyID=keyID) sub='none', resource=resource, keyID=keyID)
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
@ -1774,7 +1774,7 @@ class RosterWindow:
if gajim.jid_is_transport(jid): if gajim.jid_is_transport(jid):
array[jid]['groups'] = [_('Transports')] array[jid]['groups'] = [_('Transports')]
contact1 = gajim.contacts.create_contact(jid=ji, name=name, contact1 = gajim.contacts.create_contact(jid=ji, account=account, name=name,
groups=array[jid]['groups'], show=show, status=status, groups=array[jid]['groups'], show=show, status=status,
sub=array[jid]['subscription'], ask=array[jid]['ask'], sub=array[jid]['subscription'], ask=array[jid]['ask'],
resource=resource, keyID=keyID) resource=resource, keyID=keyID)
@ -1921,7 +1921,7 @@ class RosterWindow:
'attached_gpg_keys').split() 'attached_gpg_keys').split()
if jid in attached_keys: if jid in attached_keys:
keyID = attached_keys[attached_keys.index(jid) + 1] keyID = attached_keys[attached_keys.index(jid) + 1]
contact = gajim.contacts.create_contact(jid=jid, name=nickname, contact = gajim.contacts.create_contact(jid=jid, account=account, name=nickname,
groups=groups, show='requested', status='', ask='none', groups=groups, show='requested', status='', ask='none',
sub='subscribe', keyID=keyID) sub='subscribe', keyID=keyID)
gajim.contacts.add_contact(account, contact) gajim.contacts.add_contact(account, contact)
@ -2511,7 +2511,7 @@ class RosterWindow:
account_name = account account_name = account
if gajim.account_is_connected(account): if gajim.account_is_connected(account):
account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total))
contact = gajim.contacts.create_contact(jid=jid, name=account_name, contact = gajim.contacts.create_contact(jid=jid, account=account, name=account_name,
show=connection.get_status(), sub='', status=connection.status, show=connection.get_status(), sub='', status=connection.status,
resource=connection.server_resource, resource=connection.server_resource,
priority=connection.priority, mood=connection.mood, priority=connection.priority, mood=connection.mood,
@ -5102,7 +5102,7 @@ class RosterWindow:
service_discovery_menuitem.connect('activate', service_discovery_menuitem.connect('activate',
self.on_service_disco_menuitem_activate, account) self.on_service_disco_menuitem_activate, account)
hostname = gajim.config.get_per('accounts', account, 'hostname') hostname = gajim.config.get_per('accounts', account, 'hostname')
contact = gajim.contacts.create_contact(jid=hostname) # Fake contact contact = gajim.contacts.create_contact(jid=hostname, account=account) # Fake contact
execute_command_menuitem.connect('activate', execute_command_menuitem.connect('activate',
self.on_execute_command, contact, account) self.on_execute_command, contact, account)

View File

@ -110,7 +110,7 @@ class SearchWindow:
if jid in gajim.interface.instances[self.account]['infos']: if jid in gajim.interface.instances[self.account]['infos']:
gajim.interface.instances[self.account]['infos'][jid].window.present() gajim.interface.instances[self.account]['infos'][jid].window.present()
else: else:
contact = gajim.contacts.create_contact(jid = jid, name='', groups=[], contact = gajim.contacts.create_contact(jid=jid, account=self.account, name='', groups=[],
show='', status='', sub='', ask='', resource='', priority=0, show='', status='', sub='', ask='', resource='', priority=0,
keyID='', our_chatstate=None, chatstate=None) keyID='', our_chatstate=None, chatstate=None)
gajim.interface.instances[self.account]['infos'][jid] = \ gajim.interface.instances[self.account]['infos'][jid] = \

View File

@ -506,7 +506,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
contact = gajim.contacts.get_contact(account, self.jid, resource) contact = gajim.contacts.get_contact(account, self.jid, resource)
if not contact: if not contact:
contact = gajim.contacts.create_contact(jid=jid, contact = gajim.contacts.create_contact(jid=jid, account=account,
resource=resource, show=self.conn.get_status()) resource=resource, show=self.conn.get_status())
gajim.interface.new_chat(contact, account, resource=resource, gajim.interface.new_chat(contact, account, resource=resource,

View File

@ -6,7 +6,7 @@ import unittest
import lib import lib
lib.setup_env() lib.setup_env()
from common.contacts import CommonContact, Contact, GC_Contact from common.contacts import CommonContact, Contact, GC_Contact, Contacts
from common.xmpp import NS_MUC from common.xmpp import NS_MUC
from common import caps from common import caps
@ -14,9 +14,9 @@ from common import caps
class TestCommonContact(unittest.TestCase): class TestCommonContact(unittest.TestCase):
def setUp(self): def setUp(self):
self.contact = CommonContact(jid='', resource='', show='', status='', self.contact = CommonContact(jid='', account="", resource='', show='',
name='', our_chatstate=None, composing_xep=None, chatstate=None, status='', name='', our_chatstate=None, composing_xep=None,
client_caps=None) chatstate=None, client_caps=None)
def test_default_client_supports(self): def test_default_client_supports(self):
''' '''
@ -31,21 +31,76 @@ class TestCommonContact(unittest.TestCase):
self.assertTrue(self.contact.supports(NS_MUC), self.assertTrue(self.contact.supports(NS_MUC),
msg="Must not backtrace on simple check for supported feature") msg="Must not backtrace on simple check for supported feature")
class TestContact(TestCommonContact): class TestContact(TestCommonContact):
def setUp(self): def setUp(self):
TestCommonContact.setUp(self) TestCommonContact.setUp(self)
self.contact = Contact() self.contact = Contact(jid="test@gajim.org", account="account")
def test_attributes_available(self):
'''This test supports the migration from the old to the new contact
domain model by smoke testing that no attribute values are lost'''
attributes = ["jid", "resource", "show", "status", "name", "our_chatstate",
"composing_xep", "chatstate", "client_caps", "priority", "sub"]
for attr in attributes:
self.assertTrue(hasattr(self.contact, attr), msg="expected: " + attr)
class TestGC_Contact(TestCommonContact): class TestGC_Contact(TestCommonContact):
def setUp(self): def setUp(self):
TestCommonContact.setUp(self) TestCommonContact.setUp(self)
self.contact = GC_Contact() self.contact = GC_Contact("confernce@gajim.org", "account")
def test_attributes_available(self):
'''This test supports the migration from the old to the new contact
domain model by asserting no attributes have been lost'''
attributes = ["jid", "resource", "show", "status", "name", "our_chatstate",
"composing_xep", "chatstate", "client_caps", "role", "room_jid"]
for attr in attributes:
self.assertTrue(hasattr(self.contact, attr), msg="expected: " + attr)
class TestContacts(unittest.TestCase):
def setUp(self):
self.contacts = Contacts()
def test_create_add_get_contact(self):
jid = 'test@gajim.org'
account = "account"
contact = self.contacts.create_contact(jid=jid, account=account)
self.contacts.add_contact(account, contact)
retrieved_contact = self.contacts.get_contact(account, jid)
self.assertEqual(contact, retrieved_contact, "Contact must be known")
self.contacts.remove_contact(account, contact)
retrieved_contact = self.contacts.get_contact(account, jid)
self.assertNotEqual(contact, retrieved_contact,
msg="Contact must not be known any longer")
def test_copy_contact(self):
jid = 'test@gajim.org'
account = "account"
contact = self.contacts.create_contact(jid=jid, account=account)
copy = self.contacts.copy_contact(contact)
self.assertFalse(contact is copy, msg="Must not be the same")
# Not yet implemented to remain backwart compatible
# self.assertEqual(contact, copy, msg="Must be equal")
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()