summaryrefslogtreecommitdiff
path: root/src/mailman/model/docs/usermanager.rst
blob: a98f88670e44e8e820f7cc2fec2973a57fd172d2 (plain)
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
================
The user manager
================

The ``IUserManager`` is how you create, delete, and manage users.

    >>> from mailman.interfaces.usermanager import IUserManager
    >>> from zope.component import getUtility
    >>> user_manager = getUtility(IUserManager)


Creating users
==============

There are several ways you can create a user object.  The simplest is to
create a `blank` user by not providing an address or real name at creation
time.  This user will have an empty string as their real name, but will not
have a password.
::

    >>> from mailman.interfaces.user import IUser
    >>> from zope.interface.verify import verifyObject
    >>> user = user_manager.create_user()
    >>> verifyObject(IUser, user)
    True

    >>> dump_list(address.email for address in user.addresses)
    *Empty*
    >>> print(user.display_name)
    <BLANKLINE>
    >>> print(user.password)
    None

The user has preferences, but none of them will be specified.

    >>> print(user.preferences)
    <Preferences ...>

A user can be assigned a real name.

    >>> user.display_name = 'Anne Person'
    >>> dump_list(user.display_name for user in user_manager.users)
    Anne Person

A user can be assigned a password.

    >>> user.password = 'secret'
    >>> dump_list(user.password for user in user_manager.users)
    secret

You can also create a user with an address to start out with.

    >>> user_2 = user_manager.create_user('bperson@example.com')
    >>> verifyObject(IUser, user_2)
    True
    >>> dump_list(address.email for address in user_2.addresses)
    bperson@example.com
    >>> dump_list(user.display_name for user in user_manager.users)
    <BLANKLINE>
    Anne Person

As above, you can assign a real name to such users.

    >>> user_2.display_name = 'Ben Person'
    >>> dump_list(user.display_name for user in user_manager.users)
    Anne Person
    Ben Person

You can also create a user with just a real name.

    >>> user_3 = user_manager.create_user(display_name='Claire Person')
    >>> verifyObject(IUser, user_3)
    True
    >>> dump_list(address.email for address in user.addresses)
    *Empty*
    >>> dump_list(user.display_name for user in user_manager.users)
    Anne Person
    Ben Person
    Claire Person

Finally, you can create a user with both an address and a real name.

    >>> user_4 = user_manager.create_user('dperson@example.com', 'Dan Person')
    >>> verifyObject(IUser, user_3)
    True
    >>> dump_list(address.email for address in user_4.addresses)
    dperson@example.com
    >>> dump_list(address.display_name for address in user_4.addresses)
    Dan Person
    >>> dump_list(user.display_name for user in user_manager.users)
    Anne Person
    Ben Person
    Claire Person
    Dan Person


Deleting users
==============

You delete users by going through the user manager.  The deleted user is no
longer available through the user manager iterator.

    >>> user_manager.delete_user(user)
    >>> dump_list(user.display_name for user in user_manager.users)
    Ben Person
    Claire Person
    Dan Person


Finding users
=============

You can ask the user manager to find the ``IUser`` that controls a particular
email address.  You'll get back the original user object if it's found.  Note
that the ``.get_user()`` method takes a string email address, not an
``IAddress`` object.

    >>> address = list(user_4.addresses)[0]
    >>> found_user = user_manager.get_user(address.email)
    >>> found_user
    <User "Dan Person" (...) at ...>
    >>> found_user is user_4
    True

If the address is not in the user database or does not have a user associated
with it, you will get ``None`` back.

    >>> print(user_manager.get_user('zperson@example.com'))
    None
    >>> user_4.unlink(address)
    >>> print(user_manager.get_user(address.email))
    None

Users can also be found by their unique user id.

    >>> found_user = user_manager.get_user_by_id(user_4.user_id)
    >>> user_4
    <User "Dan Person" (...) at ...>
    >>> found_user
    <User "Dan Person" (...) at ...>
    >>> user_4.user_id == found_user.user_id
    True

If a non-existent user id is given, None is returned.

    >>> from uuid import UUID
    >>> print(user_manager.get_user_by_id(UUID(int=801)))
    None


Finding all members
===================

The user manager can return all the members known to the system.

    >>> mlist = create_list('test@example.com')
    >>> mlist.subscribe(list(user_2.addresses)[0])
    <Member: bperson@example.com on test@example.com as MemberRole.member>
    >>> mlist.subscribe(user_manager.create_address('eperson@example.com'))
    <Member: eperson@example.com on test@example.com as MemberRole.member>
    >>> mlist.subscribe(user_manager.create_address('fperson@example.com'))
    <Member: fperson@example.com on test@example.com as MemberRole.member>

Bart is also the owner of the mailing list.

    >>> from mailman.interfaces.member import MemberRole
    >>> mlist.subscribe(list(user_2.addresses)[0], MemberRole.owner)
    <Member: bperson@example.com on test@example.com as MemberRole.owner>

There are now four members in the system.  Sort them by address then role.

    >>> def sort_key(member):
    ...     return (member.address.email, member.role.name)
    >>> members = sorted(user_manager.members, key=sort_key)
    >>> for member in members:
    ...     print(member.mailing_list.list_id, member.address.email,
    ...           member.role)
    test.example.com bperson@example.com MemberRole.member
    test.example.com bperson@example.com MemberRole.owner
    test.example.com eperson@example.com MemberRole.member
    test.example.com fperson@example.com MemberRole.member


Creating a new user
===================

A common situation (especially during the subscription life cycle) is to
create a user linked to an address, with a preferred address.  Say for
example, we are asked to subscribe a new address we have never seen before.

    >>> cris = user_manager.make_user('cris@example.com', 'Cris Person')

Since we've never seen ``cris@example.com`` before, this call creates a new
user with the given email and display name.

    >>> cris
    <User "Cris Person" (5) at ...>

The user has a single unverified address object.

    >>> for address in cris.addresses:
    ...     print(repr(address))
    <Address: Cris Person <cris@example.com> [not verified] at ...>


Server owners
=============

Some users are designated as *server owners*.  At first there are no server
owners.

    >>> len(list(user_manager.server_owners))
    0

Dan is made a server owner.

    >>> user_4.is_server_owner = True
    >>> owners = list(user_manager.server_owners)
    >>> len(owners)
    1
    >>> owners[0]
    <User "Dan Person" (...) at ...>

Now Ben and Claire are also made server owners.

    >>> user_2.is_server_owner = True
    >>> user_3.is_server_owner = True
    >>> owners = list(user_manager.server_owners)
    >>> len(owners)
    3
    >>> from operator import attrgetter
    >>> for user in sorted(owners, key=attrgetter('display_name')):
    ...     print(user)
    <User "Ben Person" (...) at ...>
    <User "Claire Person" (...) at ...>
    <User "Dan Person" (...) at ...>

Clair retires as a server owner.

    >>> user_3.is_server_owner = False
    >>> owners = list(user_manager.server_owners)
    >>> len(owners)
    2
    >>> for user in sorted(owners, key=attrgetter('display_name')):
    ...     print(user)
    <User "Ben Person" (...) at ...>
    <User "Dan Person" (...) at ...>