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
|
# Copyright (C) 1998-2009 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/>.
import sys
from mailman import Message
from mailman import Utils
from mailman import i18n
from mailman.app.lifecycle import create_list
from mailman.config import config
from mailman.core import errors
from mailman.interfaces.listmanager import ListAlreadyExistsError
from mailman.options import SingleMailingListOptions
_ = i18n._
class ScriptOptions(SingleMailingListOptions):
usage = _("""\
%prog [options]
Create a new mailing list.
fqdn_listname is the 'fully qualified list name', basically the posting
address of the list. It must be a valid email address and the domain must be
registered with Mailman.
Note that listnames are forced to lowercase.""")
def add_options(self):
super(ScriptOptions, self).add_options()
self.parser.add_option(
'--language',
type='unicode', action='store',
help=_("""\
Make the list's preferred language LANGUAGE, which must be a two letter
language code."""))
self.parser.add_option(
'-o', '--owner',
type='unicode', action='append', default=[],
dest='owners', help=_("""\
Specific a listowner email address. If the address is not currently
registered with Mailman, the address is registered and linked to a user.
Mailman will send a confirmation message to the address, but it will also send
a list creation notice to the address. More than one owner can be
specified."""))
self.parser.add_option(
'-q', '--quiet',
default=False, action='store_true',
help=_("""\
Normally the administrator is notified by email (after a prompt) that their
list has been created. This option suppresses the prompt and
notification."""))
self.parser.add_option(
'-a', '--automate',
default=False, action='store_true',
help=_("""\
This option suppresses the prompt prior to administrator notification but
still sends the notification. It can be used to make newlist totally
non-interactive but still send the notification, assuming at least one list
owner is specified with the -o option.."""))
def sanity_check(self):
"""Set up some defaults we couldn't set up earlier."""
if self.options.language is None:
self.options.language = unicode(config.mailman.default_language)
# Is the language known?
if self.options.language not in config.languages.enabled_codes:
self.parser.error(_('Unknown language: $opts.language'))
# Handle variable number of positional arguments
if len(self.arguments) > 0:
parser.error(_('Unexpected arguments'))
def main():
options = ScriptOptions()
options.initialize()
# Create the mailing list, applying styles as appropriate.
fqdn_listname = options.options.listname
if fqdn_listname is None:
options.parser.error(_('--listname is required'))
try:
mlist = create_list(fqdn_listname, options.options.owners)
mlist.preferred_language = options.options.language
except errors.InvalidEmailAddress:
options.parser.error(_('Illegal list name: $fqdn_listname'))
except ListAlreadyExistsError:
options.parser.error(_('List already exists: $fqdn_listname'))
except errors.BadDomainSpecificationError, domain:
options.parser.error(_('Undefined domain: $domain'))
config.db.commit()
if not options.options.quiet:
d = dict(
listname = mlist.fqdn_listname,
admin_url = mlist.script_url('admin'),
listinfo_url = mlist.script_url('listinfo'),
requestaddr = mlist.request_address,
siteowner = mlist.no_reply_address,
)
text = Utils.maketext('newlist.txt', d, mlist=mlist)
# Set the I18N language to the list's preferred language so the header
# will match the template language. Stashing and restoring the old
# translation context is just (healthy? :) paranoia.
with i18n.using_language(mlist.preferred_language):
msg = Message.UserNotification(
owner_mail, mlist.no_reply_address,
_('Your new mailing list: $fqdn_listname'),
text, mlist.preferred_language)
msg.send(mlist)
|