diff options
Diffstat (limited to 'src/mailman/utilities/importer.py')
| -rw-r--r-- | src/mailman/utilities/importer.py | 51 |
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]) |
