diff options
author | Lance Stout <lancestout@gmail.com> | 2012-03-07 11:44:07 -0800 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2012-03-07 14:55:27 -0800 |
commit | a71823dc040062c02a2036db7473845ca07b52f3 (patch) | |
tree | c3e97566ec63cd936203684321e1cce1df73fb74 /sleekxmpp/roster | |
parent | d41ada6b66e4fb1b447c2f6aa4f0e227429afbbf (diff) | |
download | slixmpp-a71823dc040062c02a2036db7473845ca07b52f3.tar.gz slixmpp-a71823dc040062c02a2036db7473845ca07b52f3.tar.bz2 slixmpp-a71823dc040062c02a2036db7473845ca07b52f3.tar.xz slixmpp-a71823dc040062c02a2036db7473845ca07b52f3.zip |
Add support for roster versioning.
This was XEP-0237, but is now part of RFC 6121.
Roster backends should now expose two additional methods:
version(jid):
Return the version of the given JID's roster.
set_version(jid, version):
Update the version of the given JID's roster.
A new state field will be passed to the backend if an item
has been marked for removal. This is 'removed' which will
be set to True.
Diffstat (limited to 'sleekxmpp/roster')
-rw-r--r-- | sleekxmpp/roster/item.py | 12 | ||||
-rw-r--r-- | sleekxmpp/roster/single.py | 28 |
2 files changed, 39 insertions, 1 deletions
diff --git a/sleekxmpp/roster/item.py b/sleekxmpp/roster/item.py index eb2f64b3..9cb278a4 100644 --- a/sleekxmpp/roster/item.py +++ b/sleekxmpp/roster/item.py @@ -134,6 +134,7 @@ class RosterItem(object): 'subscription': 'none', 'name': '', 'groups': []} + self._db_state = {} self.load() @@ -171,16 +172,25 @@ class RosterItem(object): return self._state return None - def save(self): + def save(self, remove=False): """ Save the item's state information to an external datastore, if one has been provided. + + Arguments: + remove -- If True, expunge the item from the datastore. """ self['subscription'] = self._subscription() + if remove: + self._state['removed'] = True if self.db: self.db.save(self.owner, self.jid, self._state, self._db_state) + # Finally, remove the in-memory copy if needed. + if remove: + del self.xmpp.roster[self.owner][self.jid] + def __getitem__(self, key): """Return a state field's value.""" if key in self._state: diff --git a/sleekxmpp/roster/single.py b/sleekxmpp/roster/single.py index 159eb07d..518afebe 100644 --- a/sleekxmpp/roster/single.py +++ b/sleekxmpp/roster/single.py @@ -57,11 +57,28 @@ class RosterNode(object): self.auto_authorize = True self.auto_subscribe = True self.last_status = None + self._version = '' self._jids = {} if self.db: + if hasattr(self.db, 'version'): + self._version = self.db.version(self.jid) for jid in self.db.entries(self.jid): self.add(jid) + + @property + def version(self): + """Retrieve the roster's version ID.""" + if self.db and hasattr(self.db, 'version'): + self._version = self.db.version(self.jid) + return self._version + + @version.setter + def version(self, version): + """Set the roster's version ID.""" + self._version = version + if self.db and hasattr(self.db, 'set_version'): + self.db.set_version(self.jid, version) def __getitem__(self, key): """ @@ -75,6 +92,17 @@ class RosterNode(object): self.add(key, save=True) return self._jids[key] + def __delitem__(self, key): + """ + Remove a roster item from the local storage. + + To remove an item from the server, use the remove() method. + """ + if isinstance(key, JID): + key = key.bare + if key in self._jids: + del self._jids[key] + def __len__(self): """Return the number of JIDs referenced by the roster.""" return len(self._jids) |