summaryrefslogtreecommitdiff
path: root/mailman/bin/create_list.py
blob: 0c6039e45f398eae4cd66c2076c8255bc6a61dc7 (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
# 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 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)