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
|
# Copyright (C) 2007-2014 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
# GNU Mailman is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
"""Interface describing the basics of a user."""
__all__ = [
'IUser',
'PasswordChangeEvent',
'UnverifiedAddressError',
]
from mailman.interfaces.address import AddressError
from zope.interface import Interface, Attribute
class UnverifiedAddressError(AddressError):
"""Unverified address cannot be used as a user's preferred address."""
class PasswordChangeEvent:
"""Event which gets triggered when a user changes their password."""
def __init__(self, user):
self.user = user
def __str__(self):
return '<{0} {1}>'.format(self.__class__.__name__,
self.user.display_name)
class IUser(Interface):
"""A basic user."""
display_name = Attribute(
"""This user's display name.""")
password = Attribute(
"""This user's password information.""")
user_id = Attribute(
"""The user's unique, random identifier as a UUID.""")
created_on = Attribute(
"""The date and time at which this user was created.""")
addresses = Attribute(
"""An iterator over all the `IAddresses` controlled by this user.""")
preferred_address = Attribute(
"""The user's preferred `IAddress`. This must be validated.""")
memberships = Attribute(
"""A roster of this user's memberships.""")
def register(email, display_name=None):
"""Register the given email address and link it to this user.
:param email: The text email address to register.
:type email: str
:param display_name: The user's display name. If not given the empty
string is used.
:type display_name: str
:return: The address object linked to the user. If the associated
address object already existed (unlinked to a user) then the
`display_name` parameter is ignored.
:rtype: `IAddress`
:raises AddressAlreadyLinkedError: if this `IAddress` is already
linked to another user.
"""
def link(address):
"""Link this user to the given IAddress.
Raises AddressAlreadyLinkedError if this IAddress is already linked to
another user.
"""
def unlink(address):
"""Unlink this IAddress from the user.
Raises AddressNotLinkedError if this address is not linked to this
user, either because it's not linked to any user or it's linked to
some other user.
"""
def controls(email):
"""Determine whether this user controls the given email address.
:param email: The text email address to register.
:type email: str
:return: True if the user controls the given email address.
:rtype: bool
"""
preferences = Attribute(
"""This user's preferences.""")
|