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
from common import caps
class CommonContact(object):
class XMPPEntity(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):
XMPPEntity.__init__(self, jid, account, resource)
self.jid = jid
self.resource = resource
self.show = show
@ -99,12 +106,12 @@ class CommonContact(object):
class Contact(CommonContact):
'''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,
our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None,
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)
self.contact_name = '' # nick choosen by contact
@ -184,11 +191,11 @@ class Contact(CommonContact):
class GC_Contact(CommonContact):
'''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,
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)
self.room_jid = room_jid
@ -233,7 +240,7 @@ class Contacts:
del self._gc_contacts[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,
our_chatstate=None, chatstate=None, last_status_time=None,
composing_xep=None, mood={}, tune={}, activity={}):
@ -244,21 +251,23 @@ class Contacts:
if group not in groups_unique:
groups_unique.append(group)
return Contact(jid=jid, name=name, groups=groups_unique, show=show,
status=status, sub=sub, ask=ask, resource=resource, priority=priority,
return Contact(jid=jid, account=account, name=name, groups=groups_unique,
show=show, status=status, sub=sub, ask=ask, resource=resource, priority=priority,
keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate,
chatstate=chatstate, last_status_time=last_status_time,
composing_xep=composing_xep, mood=mood, tune=tune, activity=activity)
def copy_contact(self, contact):
return self.create_contact(jid=contact.jid, name=contact.name,
groups=contact.groups, show=contact.show, status=contact.status,
return self.create_contact(jid=contact.jid, account=contact.account,
name=contact.name, groups=contact.groups, show=contact.show, status=contact.status,
sub=contact.sub, ask=contact.ask, resource=contact.resource,
priority=contact.priority, keyID=contact.keyID,
client_caps=contact.client_caps, our_chatstate=contact.our_chatstate,
chatstate=contact.chatstate, last_status_time=contact.last_status_time)
def add_contact(self, account, contact):
assert account == contact.account # migration check
# No such account before ?
if account not in self._contacts:
self._contacts[account] = {contact.jid : [contact]}
@ -623,16 +632,18 @@ class Contacts:
def contact_from_gc_contact(self, gc_contact):
'''Create a Contact instance from a GC_Contact instance'''
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,
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=''):
return GC_Contact(room_jid, name, show, status, role, affiliation, jid,
resource)
def add_gc_contact(self, account, gc_contact):
assert account == gc_contact.account # migration check
# No such account before ?
if account not in self._gc_contacts:
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']:
gajim.interface.instances[self.account]['infos'][self.jid].window.present()
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='',
priority=5, keyID='', our_chatstate=None, chatstate=None)
gajim.interface.instances[self.account]['infos'][self.jid] = \

View File

@ -284,7 +284,7 @@ _('Connection with peer cannot be established.'))
if contact.find('/') == -1:
return
(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_props = self.get_send_file_props(account, contact,
file_path, file_name, file_desc)

View File

@ -1463,7 +1463,7 @@ class GroupchatControl(ChatControlBase):
self.draw_all_roles()
iter_ = model.append(role_iter, (None, nick, 'contact', name, None))
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,
affiliation=affiliation, jid=j, resource=resource)
gajim.contacts.add_gc_contact(self.account, gc_contact)

View File

@ -344,7 +344,7 @@ class Interface:
# Ignore offline presence of unknown self resource
if new_show < 2:
return
contact1 = gajim.contacts.create_contact(jid=ji,
contact1 = gajim.contacts.create_contact(jid=ji, account=account,
name=gajim.nicks[account], groups=['self_contact'],
show=array[1], status=status_message, sub='both', ask='none',
priority=priority, keyID=keyID, resource=resource,
@ -612,8 +612,8 @@ class Interface:
keyID = attached_keys[attached_keys.index(jid) + 1]
name = jid.split('@', 1)[0]
name = name.split('%', 1)[0]
contact1 = gajim.contacts.create_contact(jid=jid, name=name,
groups=[], show='online', status='online',
contact1 = gajim.contacts.create_contact(jid=jid, account=account,
name=name, groups=[], show='online', status='online',
ask='to', resource=array[1], keyID=keyID)
gajim.contacts.add_contact(account, contact1)
self.roster.add_contact(jid, account)
@ -1213,8 +1213,8 @@ class Interface:
if sub == 'remove':
return
# Add new contact to roster
contact = gajim.contacts.create_contact(jid=jid, name=name,
groups=groups, show='offline', sub=sub, ask=ask)
contact = gajim.contacts.create_contact(jid=jid, account=account,
name=name, groups=groups, show='offline', sub=sub, ask=ask)
gajim.contacts.add_contact(account, contact)
self.roster.add_contact(jid, account)
else:
@ -1353,7 +1353,7 @@ class Interface:
'attached_gpg_keys').split()
if jid in attached_keys:
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='',
sub='none', keyID=keyID)
gajim.contacts.add_contact(account, contact)
@ -2567,7 +2567,7 @@ class Interface:
account):
# Join new groupchat
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)
gajim.interface.minimized_controls[account][room_jid] = gc_control
self.roster.add_groupchat(room_jid, account)
@ -2590,7 +2590,7 @@ class Interface:
def new_room(self, room_jid, nick, account, is_continued=False):
# 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)
if not mw:
mw = self.msg_win_mgr.create_window(contact, account,

View File

@ -808,7 +808,7 @@ class RosterWindow:
else:
name = jid.split('@')[0]
# 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')
gajim.contacts.add_contact(account, contact)
self.add_contact(jid, account)
@ -843,7 +843,7 @@ class RosterWindow:
Return the added contact instance.'''
contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
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',
sub='from')
gajim.contacts.add_contact(account, contact)
@ -984,7 +984,7 @@ class RosterWindow:
'attached_gpg_keys').split()
if jid in attached_keys:
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='',
sub='none', resource=resource, keyID=keyID)
gajim.contacts.add_contact(account, contact)
@ -1774,7 +1774,7 @@ class RosterWindow:
if gajim.jid_is_transport(jid):
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,
sub=array[jid]['subscription'], ask=array[jid]['ask'],
resource=resource, keyID=keyID)
@ -1921,7 +1921,7 @@ class RosterWindow:
'attached_gpg_keys').split()
if jid in attached_keys:
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',
sub='subscribe', keyID=keyID)
gajim.contacts.add_contact(account, contact)
@ -2511,7 +2511,7 @@ class RosterWindow:
account_name = account
if gajim.account_is_connected(account):
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,
resource=connection.server_resource,
priority=connection.priority, mood=connection.mood,
@ -5102,7 +5102,7 @@ class RosterWindow:
service_discovery_menuitem.connect('activate',
self.on_service_disco_menuitem_activate, account)
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',
self.on_execute_command, contact, account)

View File

@ -110,7 +110,7 @@ class SearchWindow:
if jid in gajim.interface.instances[self.account]['infos']:
gajim.interface.instances[self.account]['infos'][jid].window.present()
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,
keyID='', our_chatstate=None, chatstate=None)
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)
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())
gajim.interface.new_chat(contact, account, resource=resource,

View File

@ -6,7 +6,7 @@ import unittest
import lib
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 import caps
@ -14,9 +14,9 @@ from common import caps
class TestCommonContact(unittest.TestCase):
def setUp(self):
self.contact = CommonContact(jid='', resource='', show='', status='',
name='', our_chatstate=None, composing_xep=None, chatstate=None,
client_caps=None)
self.contact = CommonContact(jid='', account="", resource='', show='',
status='', name='', our_chatstate=None, composing_xep=None,
chatstate=None, client_caps=None)
def test_default_client_supports(self):
'''
@ -31,21 +31,76 @@ class TestCommonContact(unittest.TestCase):
self.assertTrue(self.contact.supports(NS_MUC),
msg="Must not backtrace on simple check for supported feature")
class TestContact(TestCommonContact):
def 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):
def 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__":
unittest.main()