-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmailman.py
70 lines (57 loc) · 2.64 KB
/
mailman.py
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
"""
Mailman mailing lists for members and societies.
"""
from typing import List, Optional, Tuple
from srcf.database import Member
from ..email import send
from ..plumbing import bespoke, mailman
from ..plumbing.common import Collect, Owner, State, owner_name, Password, Result
def _list_name_owner(owner: Owner, suffix: Optional[str] = None) -> Tuple[str, str]:
username = owner_name(owner)
name = "{}-{}".format(username, suffix) if suffix else username
admin = "{}@srcf.net".format(username) if isinstance(owner, Member) else owner.email
return name, admin
def get_list_suffixes(owner: Owner) -> List[Optional[str]]:
"""
Find the suffixes of all lists belonging to a given owner.
"""
lists = bespoke.get_mailman_lists(owner)
return [name.split("-", 1)[1] if "-" in name else None for name in lists]
@Result.collect_value
def create_list(owner: Owner,
suffix: Optional[str] = None) -> Collect[Tuple[str, Optional[Password]]]:
"""
Create a new mailing list for a user or society.
"""
name, admin = _list_name_owner(owner, suffix)
if name.endswith(("-post", "-admin", "-bounces", "-confirm", "-join", "-leave", "-owner",
"-request", "-subscribe", "-unsubscribe")):
raise ValueError("List name {!r} ends with reserved suffix".format(name))
res_create = yield from mailman.ensure_list(name, admin)
if res_create.state == State.created:
yield bespoke.configure_mailing_list(name)
yield bespoke.generate_mailman_aliases()
yield send(owner, "tasks/mailman_create.j2", {"listname": name,
"password": res_create.value})
return (name, res_create.value)
@Result.collect_value
def reset_owner_password(owner: Owner, suffix: Optional[str] = None) -> Collect[Password]:
"""
Reset a list's owner to match its name, and generate a new admin password.
"""
name, admin = _list_name_owner(owner, suffix)
yield mailman.set_owner(name, admin)
res_passwd = yield from mailman.reset_password(name)
yield send(owner, "tasks/mailman_password.j2", {"listname": name,
"password": res_passwd.value})
return res_passwd.value
@Result.collect
def remove_list(owner: Owner, suffix: Optional[str] = None,
remove_archive: bool = False) -> Collect[None]:
"""
Delete an existing mailing list, and optionally its message archives.
"""
name, _ = _list_name_owner(owner, suffix)
res_remove = yield from mailman.remove_list(name, remove_archive)
if res_remove:
yield bespoke.generate_mailman_aliases()