------------------------------------------------------------
revno: 6614
committer: Barry Warsaw <[EMAIL PROTECTED]>
branch nick: 3.0
timestamp: Tue 2008-03-25 21:16:01 -0400
message:
merge pycon branch
modified:
mailman/database/roster.py
mailman/database/user.py
mailman/docs/users.txt
mailman/interfaces/user.py
------------------------------------------------------------
revno: 6613.1.2
committer: Barry Warsaw <[EMAIL PROTECTED]>
branch nick: pycon
timestamp: Tue 2008-03-25 21:10:24 -0400
message:
Flesh out and make working IUser.memberships, with tests.
modified:
mailman/database/roster.py
mailman/docs/users.txt
------------------------------------------------------------
revno: 6613.1.1
committer: Barry Warsaw <[EMAIL PROTECTED]>
branch nick: pycon
timestamp: Mon 2008-03-24 13:45:32 -0400
message:
The start of exposing memberships in the IUser.
modified:
mailman/database/roster.py
mailman/database/user.py
mailman/docs/users.txt
mailman/interfaces/user.py
=== modified file 'mailman/database/roster.py'
--- a/mailman/database/roster.py 2008-03-06 05:29:11 +0000
+++ b/mailman/database/roster.py 2008-03-26 01:10:24 +0000
@@ -22,6 +22,19 @@
moderator, and administrator roster filters.
"""
+__metaclass__ = type
+__all__ = [
+ 'AdministratorRoster',
+ 'DigestMemberRoster',
+ 'MemberRoster',
+ 'Memberships',
+ 'ModeratorRoster',
+ 'OwnerRoster',
+ 'RegularMemberRoster',
+ 'Subscribers',
+ ]
+
+
from storm.locals import *
from zope.interface import implements
@@ -33,7 +46,7 @@
-class AbstractRoster(object):
+class AbstractRoster:
"""An abstract IRoster class.
This class takes the simple approach of implemented the 'users' and
@@ -208,3 +221,46 @@
Member,
mailing_list=self._mlist.fqdn_listname):
yield member
+
+
+
+class Memberships:
+ """A roster of a single user's memberships."""
+
+ implements(IRoster)
+
+ name = 'memberships'
+
+ def __init__(self, user):
+ self._user = user
+
+ @property
+ def members(self):
+ results = config.db.store.find(
+ Member,
+ Address.user_id == self._user.id,
+ Member.address_id == Address.id)
+ for member in results:
+ yield member
+
+ @property
+ def users(self):
+ yield self._user
+
+ @property
+ def addresses(self):
+ for address in self._user.addresses:
+ yield address
+
+ def get_member(self, address):
+ results = config.db.store.find(
+ Member,
+ Member.address_id == Address.id,
+ Address.user_id == self._user.id)
+ if results.count() == 0:
+ return None
+ elif results.count() == 1:
+ return results[0]
+ else:
+ raise AssertionError('Too many matching member results: %s' %
+ results.count())
=== modified file 'mailman/database/user.py'
--- a/mailman/database/user.py 2008-02-27 06:26:18 +0000
+++ b/mailman/database/user.py 2008-03-24 17:45:32 +0000
@@ -23,6 +23,7 @@
from mailman.database.model import Model
from mailman.database.address import Address
from mailman.database.preferences import Preferences
+from mailman.database.roster import Memberships
from mailman.interfaces import (
AddressAlreadyLinkedError, AddressNotLinkedError, IUser)
@@ -78,3 +79,7 @@
raise AddressAlreadyLinkedError(addrobj)
addrobj.user = self
return addrobj
+
+ @property
+ def memberships(self):
+ return Memberships(self)
=== modified file 'mailman/docs/users.txt'
--- a/mailman/docs/users.txt 2008-02-27 06:26:18 +0000
+++ b/mailman/docs/users.txt 2008-03-26 01:10:24 +0000
@@ -3,7 +3,7 @@
Users are entities that represent people. A user has a real name and a
password. Optionally a user may have some preferences and a set of addresses
-they control.
+they control. A user also knows which mailing lists they are subscribed to.
See usermanager.txt for examples of how to create, delete, and find users.
@@ -146,3 +146,49 @@
receive_list_copy : False
receive_own_postings : False
delivery_mode : DeliveryMode.regular
+
+
+Subscriptions
+-------------
+
+Users know which mailing lists they are subscribed to, regardless of
+membership role.
+
+ >>> user_1.link(address_1)
+ >>> sorted(address.address for address in user_1.addresses)
+ [u'[EMAIL PROTECTED]', u'[EMAIL PROTECTED]', u'[EMAIL PROTECTED]']
+ >>> com = usermgr.get_address(u'[EMAIL PROTECTED]')
+ >>> org = usermgr.get_address(u'[EMAIL PROTECTED]')
+ >>> net = usermgr.get_address(u'[EMAIL PROTECTED]')
+
+ >>> from mailman.app.lifecycle import create_list
+ >>> mlist_1 = create_list(u'[EMAIL PROTECTED]')
+ >>> mlist_2 = create_list(u'[EMAIL PROTECTED]')
+ >>> mlist_3 = create_list(u'[EMAIL PROTECTED]')
+ >>> from mailman.interfaces import MemberRole
+
+ >>> com.subscribe(mlist_1, MemberRole.member)
+ <Member: Zoe Person <[EMAIL PROTECTED]> on [EMAIL PROTECTED] as
+ MemberRole.member>
+ >>> org.subscribe(mlist_2, MemberRole.member)
+ <Member: [EMAIL PROTECTED] on [EMAIL PROTECTED] as MemberRole.member>
+ >>> org.subscribe(mlist_2, MemberRole.owner)
+ <Member: [EMAIL PROTECTED] on [EMAIL PROTECTED] as MemberRole.owner>
+ >>> net.subscribe(mlist_3, MemberRole.moderator)
+ <Member: [EMAIL PROTECTED] on [EMAIL PROTECTED] as
+ MemberRole.moderator>
+
+ >>> memberships = user_1.memberships
+ >>> from mailman.interfaces import IRoster
+ >>> from zope.interface.verify import verifyObject
+ >>> verifyObject(IRoster, memberships)
+ True
+ >>> members = sorted(memberships.members)
+ >>> len(members)
+ 4
+ >>> for member in sorted(members, key=lambda m: m.address.address):
+ ... print member.address.address, member.mailing_list, member.role
+ [EMAIL PROTECTED] [EMAIL PROTECTED] MemberRole.member
+ [EMAIL PROTECTED] [EMAIL PROTECTED] MemberRole.moderator
+ [EMAIL PROTECTED] [EMAIL PROTECTED] MemberRole.member
+ [EMAIL PROTECTED] [EMAIL PROTECTED] MemberRole.owner
=== modified file 'mailman/interfaces/user.py'
--- a/mailman/interfaces/user.py 2008-02-08 04:01:48 +0000
+++ b/mailman/interfaces/user.py 2008-03-24 17:45:32 +0000
@@ -33,6 +33,9 @@
addresses = Attribute(
"""An iterator over all the IAddresses controlled by this user.""")
+ memberships = Attribute(
+ """A roster of this user's membership.""")
+
def register(address, real_name=None):
"""Register the given email address and link it to this user.
--
Primary development focus
https://code.launchpad.net/~mailman-coders/mailman/3.0
You are receiving this branch notification because you are subscribed to it.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
http://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org