------------------------------------------------------------
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

Reply via email to