1 # -*- coding: utf-8 -*-
5 from MailMan
import UserDesc
as mailman_userdesc
6 from MailMan
import MailList
as mailman_mlist
8 from groups
import models
as groups_models
11 class ListError(Exception):
15 class OperationForbidden(ListError
):
19 class InvalidOperation(ListError
):
23 def is_mlist_admin(mlist
, user
):
24 if user
.is_superuser
or user
in mlist
.owner
:
26 if user
.memberships
.filter(group__dns
=self
.domain
, level
=groups_models
.Membership
.LEVEL_ADMIN
).exists():
30 def require_mlist_admin(mlist
, user
):
31 if not is_mlist_admin(mlist
, user
):
32 raise OperationForbidden()
36 """Lock a mailing list.
39 - Open the list, locking it
40 - If the function didn't raise an error, save the list
44 def decorated(self
, *args
, **kwargs
):
45 mlist
= self
.get_mlist(lock
=True)
47 kwargs
.update(mlist
=mlist
)
48 result
= fun(self
, *args
, **kwargs
)
59 def decorated(self
, *args
, **kwargs
):
60 mlist
= self
.get_mlist(lock
=False)
61 kwargs
.update(mlist
=mlist
)
62 return fun(self
, *args
, **kwargs
)
67 def require_list_admin(fun
):
68 """Ensure the given 'user' is an admin of the 'mlist'."""
70 def decorated(*args
, **kwargs
):
72 mlist
= kwargs
['mlist']
73 require_mlist_admin(mlist
, user
)
75 return fun(*args
, **kwargs
)
80 class MailingList(object):
82 def __init__(self
, mbox
, domain
, *args
, **kwargs
):
85 self
.address
= '%s@%s' %
(self
.mbox
, self
.domain
)
86 super(MailingList
, self
).__init__(*args
, **kwargs
)
91 return groups_models
.XGroup
.objects
.get(dns
=self
.domain
)
92 except groups_models
.XGroup
.DoesNotExist
:
95 # MailMan interactions
96 # ====================
99 def mailman_name(self
):
100 return '%(domain)s_%(mbox)s' % dict
(
105 def get_mlist(self
, lock
=False):
106 """The mailman-style MailList object."""
107 return mailman_mlist
.MailList(self
.mailman_name
, lock
=lock
)
109 def get_userdesc(self
, user
):
110 return mailman_userdesc
.UserDesc(
112 user
.get_full_name(),
119 def subscribe(self
, user
, mlist
):
120 userdesc
= self
.get_userdesc(user
)
123 if mlist
.subscribe_policy
in (0, 1):
124 # Open or user-confirmed subscription
125 mlist
.ApprovedAddMember(userdesc
)
126 elif userdesc
.address
in mlist
.owner
:
127 mlist
.ApprovedAddMember(userdesc
)
129 # Admin-confirmed subscription
130 mlist
.HoldSubscription(userdesc
.address
, userdesc
.fullname
,
131 password
='', digest
='', lang
='')
138 def subscribe_user(self
, user
, target
, mlist
):
139 userdesc
= self
.get_userdesc(target
)
140 mlist
.ApprovedAddMember(userdesc
)
143 def unsubscribe(self
, user
, mlist
):
144 userdesc
= self
.get_userdesc(user
)
146 mlist
.ApprovedDeleteMember(userdesc
.address
)
150 def unsubscribe_user(self
, user
, target
, mlist
):
151 userdesc
= self
.get_userdesc(target
)
152 mlist
.ApprovedDeleteMember(userdesc
)
156 def mass_subscribe(self
, user
, users
, mlist
):
158 userdesc
= self
.get_userdesc(target
)
159 if userdesc
.address
not in mlist
.members
:
160 mlist
.ApprovedAddMember(userdesc
)
165 def mass_unsubscribe(self
, user
, users
, mlist
):
167 userdesc
= self
.get_userdesc(target
)
168 if userdesc
.address
in mlist
.members
:
169 mlist
.ApprovedDeleteMember(userdesc
)
174 def add_owner(self
, user
, target
, mlist
):
175 userdesc
= self
.get_userdesc(target
)
176 mlist
.owner
.append(userdesc
.address
)
180 def del_owner(self
, user
, target
, mlist
):
181 if len(mlist
.owner
< 2):
182 # Can't remove last admin
183 raise InvalidOperation(u
"Impossible de supprimer le dernier modérateur.")
185 userdesc
= self
.get_userdesc(target
)
186 mlist
.owner
.remove(userdesc
.address
)
192 def get_members(self
, user
, mlist
):
196 def get_lists(cls
, domain
):