summaryrefslogtreecommitdiff
path: root/src/mailman/utilities/importer.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/utilities/importer.py')
-rw-r--r--src/mailman/utilities/importer.py51
1 files changed, 28 insertions, 23 deletions
diff --git a/src/mailman/utilities/importer.py b/src/mailman/utilities/importer.py
index cc8a0cf44..2db5f3ace 100644
--- a/src/mailman/utilities/importer.py
+++ b/src/mailman/utilities/importer.py
@@ -17,9 +17,6 @@
"""Importer routines."""
-from __future__ import absolute_import, print_function, unicode_literals
-
-__metaclass__ = type
__all__ = [
'Import21Error',
'import_config_pck',
@@ -48,7 +45,7 @@ from mailman.interfaces.nntp import NewsgroupModeration
from mailman.interfaces.usermanager import IUserManager
from mailman.utilities.filesystem import makedirs
from mailman.utilities.i18n import search
-from urllib2 import URLError
+from six.moves.urllib_error import URLError
from zope.component import getUtility
@@ -58,7 +55,7 @@ class Import21Error(MailmanError):
-def str_to_unicode(value):
+def bytes_to_str(value):
# Convert a string to unicode when the encoding is not declared.
if not isinstance(value, bytes):
return value
@@ -71,8 +68,10 @@ def str_to_unicode(value):
return value.decode('ascii', 'replace')
-def unicode_to_string(value):
- return None if value is None else str(value)
+def str_to_bytes(value):
+ if value is None or isinstance(value, bytes):
+ return value
+ return value.encode('utf-8')
def seconds_to_delta(value):
@@ -84,7 +83,7 @@ def days_to_delta(value):
def list_members_to_unicode(value):
- return [str_to_unicode(item) for item in value]
+ return [bytes_to_str(item) for item in value]
@@ -132,7 +131,7 @@ def nonmember_action_mapping(value):
def check_language_code(code):
if code is None:
return None
- code = str_to_unicode(code)
+ code = bytes_to_str(code)
if code not in getUtility(ILanguageManager):
msg = """Missing language: {0}
You must add a section describing this language to your mailman.cfg file.
@@ -170,7 +169,7 @@ TYPES = dict(
forward_unrecognized_bounces_to=UnrecognizedBounceDisposition,
gateway_to_mail=bool,
include_rfc2369_headers=bool,
- moderator_password=unicode_to_string,
+ moderator_password=str_to_bytes,
newsgroup_moderation=NewsgroupModeration,
nntp_prefix_subject_too=bool,
pass_extensions=list_members_to_unicode,
@@ -213,8 +212,10 @@ DATETIME_COLUMNS = [
]
EXCLUDES = set((
+ 'delivery_status',
'digest_members',
'members',
+ 'user_options',
))
@@ -243,9 +244,9 @@ def import_config_pck(mlist, config_dict):
# If the mailing list has a preferred language that isn't registered
# in the configuration file, hasattr() will swallow the KeyError this
# raises and return False. Treat that attribute specially.
- if hasattr(mlist, key) or key == 'preferred_language':
- if isinstance(value, str):
- value = str_to_unicode(value)
+ if key == 'preferred_language' or hasattr(mlist, key):
+ if isinstance(value, bytes):
+ value = bytes_to_str(value)
# Some types require conversion.
converter = TYPES.get(key)
try:
@@ -279,17 +280,19 @@ def import_config_pck(mlist, config_dict):
# Handle ban list.
ban_manager = IBanManager(mlist)
for address in config_dict.get('ban_list', []):
- ban_manager.ban(str_to_unicode(address))
+ ban_manager.ban(bytes_to_str(address))
# Handle acceptable aliases.
acceptable_aliases = config_dict.get('acceptable_aliases', '')
- if isinstance(acceptable_aliases, basestring):
+ if isinstance(acceptable_aliases, bytes):
+ acceptable_aliases = acceptable_aliases.decode('utf-8')
+ if isinstance(acceptable_aliases, str):
acceptable_aliases = acceptable_aliases.splitlines()
alias_set = IAcceptableAliasSet(mlist)
for address in acceptable_aliases:
address = address.strip()
if len(address) == 0:
continue
- address = str_to_unicode(address)
+ address = bytes_to_str(address)
try:
alias_set.add(address)
except ValueError:
@@ -343,7 +346,8 @@ def import_config_pck(mlist, config_dict):
if oldvar not in config_dict:
continue
text = config_dict[oldvar]
- text = text.decode('utf-8', 'replace')
+ if isinstance(text, bytes):
+ text = text.decode('utf-8', 'replace')
for oldph, newph in convert_placeholders:
text = text.replace(oldph, newph)
default_value, default_text = defaults.get(newvar, (None, None))
@@ -380,8 +384,9 @@ def import_config_pck(mlist, config_dict):
with codecs.open(filepath, 'w', encoding='utf-8') as fp:
fp.write(text)
# Import rosters.
- members = set(config_dict.get('members', {}).keys()
- + config_dict.get('digest_members', {}).keys())
+ regulars_set = set(config_dict.get('members', {}))
+ digesters_set = set(config_dict.get('digest_members', {}))
+ members = regulars_set.union(digesters_set)
import_roster(mlist, config_dict, members, MemberRole.member)
import_roster(mlist, config_dict, config_dict.get('owner', []),
MemberRole.owner)
@@ -407,7 +412,7 @@ def import_roster(mlist, config_dict, members, role):
for email in members:
# For owners and members, the emails can have a mixed case, so
# lowercase them all.
- email = str_to_unicode(email).lower()
+ email = bytes_to_str(email).lower()
if roster.get_member(email) is not None:
print('{} is already imported with role {}'.format(email, role),
file=sys.stderr)
@@ -421,7 +426,7 @@ def import_roster(mlist, config_dict, members, role):
merged_members.update(config_dict.get('members', {}))
merged_members.update(config_dict.get('digest_members', {}))
if merged_members.get(email, 0) != 0:
- original_email = str_to_unicode(merged_members[email])
+ original_email = bytes_to_str(merged_members[email])
else:
original_email = email
address = usermanager.create_address(original_email)
@@ -449,9 +454,9 @@ def import_roster(mlist, config_dict, members, role):
# overwritten.
if email in config_dict.get('usernames', {}):
address.display_name = \
- str_to_unicode(config_dict['usernames'][email])
+ bytes_to_str(config_dict['usernames'][email])
user.display_name = \
- str_to_unicode(config_dict['usernames'][email])
+ bytes_to_str(config_dict['usernames'][email])
if email in config_dict.get('passwords', {}):
user.password = config.password_context.encrypt(
config_dict['passwords'][email])