~abompard/mailman/import21

« back to all changes in this revision

Viewing changes to src/mailman/utilities/importer.py

  • Committer: Aurélien Bompard
  • Date: 2013-10-08 13:45:36 UTC
  • Revision ID: aurelien@bompard.org-20131008134536-nv8r7t2b38mrt1rw
Make sure the imported preferred_language exists, and work around Python issue 9666

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
__metaclass__ = type
23
23
__all__ = [
24
24
    'import_config_pck',
 
25
    'ImportError',
25
26
    ]
26
27
 
27
28
 
31
32
from urllib2 import URLError
32
33
 
33
34
from mailman.config import config
 
35
from mailman.core.errors import MailmanError
34
36
from mailman.interfaces.action import FilterAction, Action
35
37
from mailman.interfaces.autorespond import ResponseAction
36
38
from mailman.interfaces.digests import DigestFrequency
42
44
from mailman.interfaces.bounce import UnrecognizedBounceDisposition
43
45
from mailman.interfaces.usermanager import IUserManager
44
46
from mailman.interfaces.member import DeliveryMode, DeliveryStatus, MemberRole
 
47
from mailman.interfaces.languages import ILanguageManager
45
48
from mailman.handlers.decorate import decorate, decorate_template
46
49
from mailman.utilities.i18n import search
47
50
from zope.component import getUtility
48
51
 
49
52
 
50
53
 
 
54
class Import21Error(MailmanError):
 
55
    pass
 
56
 
 
57
 
51
58
def seconds_to_delta(value):
52
59
    return datetime.timedelta(seconds=value)
53
60
 
107
114
def unicode_to_string(value):
108
115
    return str(value) if value is not None else None
109
116
 
 
117
 
 
118
def check_language_code(code):
 
119
    if code is None:
 
120
        return None
 
121
    code = unicode(code)
 
122
    if code not in getUtility(ILanguageManager):
 
123
        msg = """Missing language: {0}
 
124
You must add a section describing this language in your mailman.cfg file.
 
125
This section should look like this:
 
126
[language.{1}]
 
127
# The English name for the language.
 
128
description: CHANGE ME
 
129
# And the default character set for the language.
 
130
charset: utf-8
 
131
# Whether the language is enabled or not.
 
132
enabled: yes
 
133
""".format(code, code[:2])
 
134
        raise Import21Error(msg)
 
135
    return code
 
136
 
110
137
 
111
138
# Attributes in Mailman 2 which have a different type in Mailman 3.
112
139
TYPES = dict(
129
156
    default_member_action=member_action_mapping,
130
157
    default_nonmember_action=nonmember_action_mapping,
131
158
    moderator_password=unicode_to_string,
 
159
    preferred_language=check_language_code,
132
160
    )
133
161
 
134
162
 
180
208
        # Handle the simple case where the key is an attribute of the
181
209
        # IMailingList and the types are the same (modulo 8-bit/unicode
182
210
        # strings).
183
 
        if hasattr(mlist, key):
 
211
        # When attributes raise an exception, hasattr may think they don't
 
212
        # exist (see python issue 9666). Add them here.
 
213
        if hasattr(mlist, key) or key in ("preferred_language", ):
184
214
            if isinstance(value, str):
185
215
                for encoding in ("ascii", "utf-8"):
186
216
                    try:
346
376
            pass
347
377
        if email in config_dict.get("language", {}):
348
378
            member.preferences.preferred_language = \
349
 
                unicode(config_dict["language"][email])
 
379
                check_language_code(config_dict["language"][email])
350
380
        # if the user already exists, display_name and password will be
351
381
        # overwritten
352
382
        if email in config_dict.get("usernames", {}):