changeset e372476abb9c in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=e372476abb9c
description: Make the GC_Contacts class 'account insensitive'. Instead, create
an Account class which holds a GC_Contacts object.
The API has been preserved. For now the old Contacts() API has not been
changed.
diffstat:
src/common/account.py | 26 ++++++++
src/common/contacts.py | 134 ++++++++++++++++++++------------------------
test/runtests.py | 1 +
test/unit/test_account.py | 19 ++++++
4 files changed, 107 insertions(+), 73 deletions(-)
diffs (271 lines):
diff -r bd7fe1131cb6 -r e372476abb9c src/common/account.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/common/account.py Tue Nov 10 21:08:25 2009 +0100
@@ -0,0 +1,26 @@
+# -*- coding:utf-8 -*-
+## src/common/contacts.py
+##
+## Copyright (C) 2009 Stephan Erb <steve-e AT h3c.de>
+##
+## This file is part of Gajim.
+##
+## Gajim is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published
+## by the Free Software Foundation; version 3 only.
+##
+## Gajim is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
+##
+
+class Account(object):
+
+ def __init__(self, gc_contacts):
+ self.gc_contacts = gc_contacts
+
+
\ No newline at end of file
diff -r bd7fe1131cb6 -r e372476abb9c src/common/contacts.py
--- a/src/common/contacts.py Tue Nov 10 19:26:17 2009 +0100
+++ b/src/common/contacts.py Tue Nov 10 21:08:25 2009 +0100
@@ -30,6 +30,7 @@
import common.gajim
import caps
+from account import Account
class XMPPEntity(object):
'''Base representation of entities in XMPP'''
@@ -204,21 +205,21 @@
'''Information concerning all contacts and groupchat contacts'''
def __init__(self):
self._contacts = {} # list of contacts {acct: {jid1: [C1, C2]},
} one Contact per resource
-
- self._gc_contacts = GC_Contacts()
self._metacontact_manager = MetacontactManager(self)
+ self._accounts = {}
def change_account_name(self, old_name, new_name):
self._contacts[new_name] = self._contacts[old_name]
del self._contacts[old_name]
- self._gc_contacts.change_account_name(old_name, new_name)
+ self._accounts[new_name] = self._accounts[old_name]
+ del self._accounts[old_name]
+
self._metacontact_manager.change_account_name(old_name,
new_name)
def add_account(self, account):
self._contacts[account] = {}
-
- self._gc_contacts.add_account(account)
+ self._accounts[account] = Account(GC_Contacts())
self._metacontact_manager.add_account(account)
def get_accounts(self):
@@ -226,8 +227,7 @@
def remove_account(self, account):
del self._contacts[account]
-
- self._gc_contacts.remove_account(account)
+ del self._accounts[account]
self._metacontact_manager.remove_account(account)
def create_contact(self, jid, account, name='', groups=[], show='',
status='',
@@ -426,33 +426,12 @@
def get_jid_list(self, account):
return self._contacts[account].keys()
-
def __getattr__(self, attr_name):
# Only called if self has no attr_name
- if hasattr(self._gc_contacts, attr_name):
- return getattr(self._gc_contacts, attr_name)
- elif hasattr(self._metacontact_manager, attr_name):
+ if hasattr(self._metacontact_manager, attr_name):
return getattr(self._metacontact_manager, attr_name)
else:
raise AttributeError(attr_name)
-
-
-
-class GC_Contacts():
-
- def __init__(self):
- self._gc_contacts = {} # list of contacts that are in gc {acct:
{room_jid: {nick: C}}}
-
- def change_account_name(self, old_name, new_name):
- self._gc_contacts[new_name] = self._gc_contacts[old_name]
- del self._gc_contacts[old_name]
-
- def add_account(self, account):
- if account not in self._gc_contacts:
- self._gc_contacts[account] = {}
-
- def remove_account(self, account):
- del self._gc_contacts[account]
def create_gc_contact(self, room_jid, account, name='', show='',
status='',
role='', affiliation='', jid='', resource=''):
@@ -460,68 +439,77 @@
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._gc_contacts[account] = {gc_contact.room_jid :
{gc_contact.name: \
- gc_contact}}
- return
- # No such room_jid before ?
- if gc_contact.room_jid not in self._gc_contacts[account]:
- self._gc_contacts[account][gc_contact.room_jid] =
{gc_contact.name: \
- gc_contact}
- return
-
self._gc_contacts[account][gc_contact.room_jid][gc_contact.name] = \
- gc_contact
+ return
self._accounts[account].gc_contacts.add_gc_contact(gc_contact)
def remove_gc_contact(self, account, gc_contact):
- if account not in self._gc_contacts:
- return
- if gc_contact.room_jid not in self._gc_contacts[account]:
- return
- if gc_contact.name not in self._gc_contacts[account][
- gc_contact.room_jid]:
- return
- del
self._gc_contacts[account][gc_contact.room_jid][gc_contact.name]
- # It was the last nick in room ?
- if not len(self._gc_contacts[account][gc_contact.room_jid]):
- del self._gc_contacts[account][gc_contact.room_jid]
+ return
self._accounts[account].gc_contacts.remove_gc_contact(gc_contact)
def remove_room(self, account, room_jid):
- if account not in self._gc_contacts:
- return
- if room_jid not in self._gc_contacts[account]:
- return
- del self._gc_contacts[account][room_jid]
+ return self._accounts[account].gc_contacts.remove_room(room_jid)
def get_gc_list(self, account):
- if account not in self._gc_contacts:
- return []
- return self._gc_contacts[account].keys()
+ return self._accounts[account].gc_contacts.get_gc_list()
def get_nick_list(self, account, room_jid):
- gc_list = self.get_gc_list(account)
+ return
self._accounts[account].gc_contacts.get_nick_list(room_jid)
+
+ def get_gc_contact(self, account, room_jid, nick):
+ return
self._accounts[account].gc_contacts.get_gc_contact(room_jid, nick)
+
+ def get_nb_role_total_gc_contacts(self, account, room_jid, role):
+ return
self._accounts[account].gc_contacts.get_nb_role_total_gc_contacts(room_jid,
role)
+
+
+class GC_Contacts():
+
+ def __init__(self):
+ # list of contacts that are in gc {room_jid: {nick: C}}}
+ self._rooms = {}
+
+ def add_gc_contact(self, gc_contact):
+ if gc_contact.room_jid not in self._rooms:
+ self._rooms[gc_contact.room_jid] = {gc_contact.name:
gc_contact}
+ else:
+ self._rooms[gc_contact.room_jid][gc_contact.name] =
gc_contact
+
+ def remove_gc_contact(self, gc_contact):
+ if gc_contact.room_jid not in self._rooms:
+ return
+ if gc_contact.name not in self._rooms[gc_contact.room_jid]:
+ return
+ del self._rooms[gc_contact.room_jid][gc_contact.name]
+ # It was the last nick in room ?
+ if not len(self._rooms[gc_contact.room_jid]):
+ del self._rooms[gc_contact.room_jid]
+
+ def remove_room(self, room_jid):
+ if room_jid not in self._rooms:
+ return
+ del self._rooms[room_jid]
+
+ def get_gc_list(self):
+ return self._rooms.keys()
+
+ def get_nick_list(self, room_jid):
+ gc_list = self.get_gc_list()
if not room_jid in gc_list:
return []
- return self._gc_contacts[account][room_jid].keys()
+ return self._rooms[room_jid].keys()
- def get_gc_contact(self, account, room_jid, nick):
- nick_list = self.get_nick_list(account, room_jid)
+ def get_gc_contact(self, room_jid, nick):
+ nick_list = self.get_nick_list(room_jid)
if not nick in nick_list:
return None
- return self._gc_contacts[account][room_jid][nick]
+ return self._rooms[room_jid][nick]
- def get_nb_role_total_gc_contacts(self, account, room_jid, role):
+ def get_nb_role_total_gc_contacts(self, room_jid, role):
'''Returns the number of group chat contacts for the given role
and the
total number of group chat contacts'''
- if account not in self._gc_contacts:
- return 0, 0
- if room_jid not in self._gc_contacts[account]:
+ if room_jid not in self._rooms:
return 0, 0
nb_role = nb_total = 0
- for nick in self._gc_contacts[account][room_jid]:
- if self._gc_contacts[account][room_jid][nick].role ==
role:
+ for nick in self._rooms[room_jid]:
+ if self._rooms[room_jid][nick].role == role:
nb_role += 1
nb_total += 1
return nb_role, nb_total
diff -r bd7fe1131cb6 -r e372476abb9c test/runtests.py
--- a/test/runtests.py Tue Nov 10 19:26:17 2009 +0100
+++ b/test/runtests.py Tue Nov 10 21:08:25 2009 +0100
@@ -41,6 +41,7 @@
'unit.test_contacts',
'unit.test_gui_interface',
'unit.test_sessions',
+ 'unit.test_account',
)
#modules = ()
diff -r bd7fe1131cb6 -r e372476abb9c test/unit/test_account.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/test_account.py Tue Nov 10 21:08:25 2009 +0100
@@ -0,0 +1,19 @@
+'''
+Tests for Account classes
+'''
+import unittest
+
+import lib
+lib.setup_env()
+
+from common.account import Account
+
+class Test(unittest.TestCase):
+
+ def testInstantiate(self):
+ account = Account(gc_contacts=None)
+
+ self.assertTrue(account.gc_contacts is None)
+
+if __name__ == "__main__":
+ unittest.main()
\ No newline at end of file
_______________________________________________
Commits mailing list
[email protected]
http://lists.gajim.org/cgi-bin/listinfo/commits