summaryrefslogtreecommitdiff
path: root/src/mailman/app/docs/subscriptions.rst
blob: 8291132ce21943db42b24c4316726c9b522bdc2a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
=====================
Subscription services
=====================

The `ISubscriptionService` utility provides higher level convenience methods
useful for searching, retrieving, iterating, adding, and removing
memberships.

    >>> from mailman.interfaces.subscriptions import ISubscriptionService
    >>> from zope.component import getUtility
    >>> service = getUtility(ISubscriptionService)

You can use the service to get all members of all mailing lists, for any
membership role.  At first, there are no memberships.

    >>> service.get_members()
    []
    >>> sum(1 for member in service)
    0
    >>> print service.get_member(801)
    None

The service can be used to subscribe new members, but only with the `member`
role.  At a minimum, a mailing list and an address for the new user is
required.

    >>> mlist = create_list('test@example.com')
    >>> anne = service.join('test@example.com', 'anne@example.com')
    >>> anne
    <Member: anne <anne@example.com> on test@example.com as MemberRole.member>

The real name of the new member can be given.

    >>> bart = service.join('test@example.com', 'bart@example.com',
    ...                     'Bart Person')
    >>> bart
    <Member: Bart Person <bart@example.com>
             on test@example.com as MemberRole.member>

Other roles can be subscribed using the more traditional interfaces.

    >>> from mailman.interfaces.member import MemberRole
    >>> from mailman.utilities.datetime import now
    >>> address = list(anne.user.addresses)[0]
    >>> address.verified_on = now()
    >>> anne.user.preferred_address = address
    >>> anne_owner = mlist.subscribe(anne.user, MemberRole.owner)

And all the subscribed members can now be displayed.

    >>> service.get_members()
    [<Member: anne <anne@example.com> on test@example.com as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.member>,
     <Member: Bart Person <bart@example.com> on test@example.com
              as MemberRole.member>]
    >>> sum(1 for member in service)
    3
    >>> print service.get_member(3)
    <Member: anne <anne@example.com> on test@example.com as MemberRole.owner>

Regular members can also be removed.

    >>> service.leave('test@example.com', 'anne@example.com')
    >>> service.get_members()
    [<Member: anne <anne@example.com> on test@example.com as MemberRole.owner>,
     <Member: Bart Person <bart@example.com> on test@example.com
              as MemberRole.member>]
    >>> sum(1 for member in service)
    2


Finding members
===============

If you know the member id for a specific member, you can get that member.

    >>> service.get_member(3)
    <Member: anne <anne@example.com> on test@example.com as MemberRole.owner>

If you know the member's address, you can find all their memberships, based on
specific search criteria.
::

    >>> mlist2 = create_list('foo@example.com')
    >>> mlist3 = create_list('bar@example.com')
    >>> mlist.subscribe(anne.user, MemberRole.member)
    <Member: anne <anne@example.com> on test@example.com as MemberRole.member>
    >>> mlist.subscribe(anne.user, MemberRole.moderator)
    <Member: anne <anne@example.com> on test@example.com
             as MemberRole.moderator>
    >>> mlist2.subscribe(anne.user, MemberRole.member)
    <Member: anne <anne@example.com> on foo@example.com as MemberRole.member>
    >>> mlist3.subscribe(anne.user, MemberRole.owner)
    <Member: anne <anne@example.com> on bar@example.com as MemberRole.owner>

    >>> service.find_members('anne@example.com')
    [<Member: anne <anne@example.com> on bar@example.com as MemberRole.owner>,
     <Member: anne <anne@example.com> on foo@example.com as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.moderator>]

There may be no matching memberships.

    >>> service.find_members('cris@example.com')
    []

Memberships can also be searched for by user id.

    >>> service.find_members(1)
    [<Member: anne <anne@example.com> on bar@example.com as MemberRole.owner>,
     <Member: anne <anne@example.com> on foo@example.com as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.moderator>]

You can find all the memberships for a specific mailing list.

    >>> service.find_members(fqdn_listname='test@example.com')
    [<Member: anne <anne@example.com> on test@example.com
              as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.moderator>,
     <Member: Bart Person <bart@example.com> on test@example.com
              as MemberRole.member>]

You can find all the memberships for an address on a specific mailing list.

    >>> service.find_members('anne@example.com', 'test@example.com')
    [<Member: anne <anne@example.com> on test@example.com
              as MemberRole.member>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.moderator>]

You can find all the memberships for an address with a specific role.

    >>> service.find_members('anne@example.com', role=MemberRole.owner)
    [<Member: anne <anne@example.com> on bar@example.com as MemberRole.owner>,
     <Member: anne <anne@example.com> on test@example.com
              as MemberRole.owner>]

You can also find a specific membership by all three criteria.

    >>> service.find_members('anne@example.com', 'test@example.com',
    ...                      MemberRole.owner)
    [<Member: anne <anne@example.com> on test@example.com
              as MemberRole.owner>]