diff options
40 files changed, 181 insertions, 367 deletions
diff --git a/src/mailman/languages/language.py b/src/mailman/languages/language.py index 669d50ce5..2b58180ed 100644 --- a/src/mailman/languages/language.py +++ b/src/mailman/languages/language.py @@ -18,16 +18,12 @@ """The representation of a language.""" -__all__ = [ - 'Language', - ] - - +from mailman import public from mailman.interfaces.languages import ILanguage from zope.interface import implementer - +@public @implementer(ILanguage) class Language: """The representation of a language.""" diff --git a/src/mailman/languages/manager.py b/src/mailman/languages/manager.py index 88306b172..9832eb3eb 100644 --- a/src/mailman/languages/manager.py +++ b/src/mailman/languages/manager.py @@ -17,11 +17,7 @@ """Language manager.""" -__all__ = [ - 'LanguageManager', - ] - - +from mailman import public from mailman.interfaces.configuration import ConfigurationUpdatedEvent from mailman.interfaces.languages import ILanguageManager from mailman.languages.language import Language @@ -29,7 +25,7 @@ from zope.component import getUtility from zope.interface import implementer - +@public @implementer(ILanguageManager) class LanguageManager: """Language manager.""" @@ -73,7 +69,7 @@ class LanguageManager: self._languages.clear() - +@public def handle_ConfigurationUpdatedEvent(event): if not isinstance(event, ConfigurationUpdatedEvent): return diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py index f33a7ef46..ce32704bb 100644 --- a/src/mailman/model/address.py +++ b/src/mailman/model/address.py @@ -18,6 +18,7 @@ """Model for addresses.""" from email.utils import formataddr +from mailman import public from mailman.database.model import Model from mailman.interfaces.address import ( AddressVerificationEvent, IAddress, IEmailValidator) @@ -29,11 +30,7 @@ from zope.event import notify from zope.interface import implementer -__all__ = [ - 'Address', - ] - - +@public @implementer(IAddress) class Address(Model): """See `IAddress`.""" @@ -70,10 +67,10 @@ class Address(Model): verified = ('verified' if self.verified_on else 'not verified') address_str = str(self) if self._original is None: - return '<Address: {0} [{1}] at {2:#x}>'.format( + return '<Address: {} [{}] at {:#x}>'.format( address_str, verified, id(self)) else: - return '<Address: {0} [{1}] key: {2} at {3:#x}>'.format( + return '<Address: {} [{}] key: {} at {:#x}>'.format( address_str, verified, self.email, id(self)) @property diff --git a/src/mailman/model/autorespond.py b/src/mailman/model/autorespond.py index 00c329ff5..20c19889f 100644 --- a/src/mailman/model/autorespond.py +++ b/src/mailman/model/autorespond.py @@ -17,6 +17,7 @@ """Autoresponder records.""" +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import Enum @@ -27,13 +28,8 @@ from sqlalchemy import Column, Date, ForeignKey, Integer, desc from sqlalchemy.orm import relationship from zope.interface import implementer -__all__ = [ - 'AutoResponseRecord', - 'AutoResponseSet', - ] - - +@public @implementer(IAutoResponseRecord) class AutoResponseRecord(Model): """See `IAutoResponseRecord`.""" @@ -58,6 +54,7 @@ class AutoResponseRecord(Model): self.date_sent = today() +@public @implementer(IAutoResponseSet) class AutoResponseSet: """See `IAutoResponseSet`.""" diff --git a/src/mailman/model/bans.py b/src/mailman/model/bans.py index e81a7a01a..e690145a4 100644 --- a/src/mailman/model/bans.py +++ b/src/mailman/model/bans.py @@ -19,17 +19,15 @@ import re +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.interfaces.bans import IBan, IBanManager from sqlalchemy import Column, Integer, Unicode from zope.interface import implementer -__all__ = [ - 'BanManager', - ] - +@public @implementer(IBan) class Ban(Model): """See `IBan`.""" @@ -46,6 +44,7 @@ class Ban(Model): self.list_id = list_id +@public @implementer(IBanManager) class BanManager: """See `IBanManager`.""" @@ -84,7 +83,7 @@ class BanManager: bans = store.query(Ban).filter_by(list_id=None) for ban in bans: if (ban.email.startswith('^') and - re.match(ban.email, email, re.IGNORECASE) is not None): + re.match(ban.email, email, re.IGNORECASE) is not None): return True else: # This is a list-specific ban. @@ -99,13 +98,13 @@ class BanManager: bans = store.query(Ban).filter_by(list_id=list_id) for ban in bans: if (ban.email.startswith('^') and - re.match(ban.email, email, re.IGNORECASE) is not None): + re.match(ban.email, email, re.IGNORECASE) is not None): return True # And now try global pattern bans. bans = store.query(Ban).filter_by(list_id=None) for ban in bans: if (ban.email.startswith('^') and - re.match(ban.email, email, re.IGNORECASE) is not None): + re.match(ban.email, email, re.IGNORECASE) is not None): return True return False diff --git a/src/mailman/model/bounce.py b/src/mailman/model/bounce.py index 544907ad5..b7f217048 100644 --- a/src/mailman/model/bounce.py +++ b/src/mailman/model/bounce.py @@ -17,6 +17,7 @@ """Bounce support.""" +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import Enum @@ -27,6 +28,7 @@ from sqlalchemy import Boolean, Column, DateTime, Integer, Unicode from zope.interface import implementer +@public @implementer(IBounceEvent) class BounceEvent(Model): """See `IBounceEvent`.""" @@ -51,6 +53,7 @@ class BounceEvent(Model): self.processed = False +@public @implementer(IBounceProcessor) class BounceProcessor: """See `IBounceProcessor`.""" diff --git a/src/mailman/model/digests.py b/src/mailman/model/digests.py index 39eef0c6f..fa1e7c417 100644 --- a/src/mailman/model/digests.py +++ b/src/mailman/model/digests.py @@ -17,6 +17,7 @@ """One last digest.""" +from mailman import public from mailman.database.model import Model from mailman.database.types import Enum from mailman.interfaces.digests import IOneLastDigest @@ -25,11 +26,8 @@ from sqlalchemy import Column, Integer, ForeignKey from sqlalchemy.orm import relationship from zope.interface import implementer -__all__ = [ - 'OneLastDigest', - ] - +@public @implementer(IOneLastDigest) class OneLastDigest(Model): """See `IOneLastDigest`.""" diff --git a/src/mailman/model/domain.py b/src/mailman/model/domain.py index fb73bf470..8607f0d94 100644 --- a/src/mailman/model/domain.py +++ b/src/mailman/model/domain.py @@ -17,6 +17,7 @@ """Domains.""" +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.interfaces.domain import ( @@ -32,12 +33,8 @@ from zope.event import notify from zope.interface import implementer from zope.component import getUtility -__all__ = [ - 'Domain', - 'DomainManager', - ] - +@public @implementer(IDomain) class Domain(Model): """Domains.""" @@ -134,6 +131,7 @@ class Domain(Model): self.owners.remove(user_manager.get_user(owner)) +@public @implementer(IDomainManager) class DomainManager: """Domain manager.""" @@ -149,7 +147,7 @@ class DomainManager: # a constraint that should (also) be maintained in the database. if self.get(mail_host) is not None: raise BadDomainSpecificationError( - 'Duplicate email host: %s' % mail_host) + 'Duplicate email host: {}'.format(mail_host)) notify(DomainCreatingEvent(mail_host)) domain = Domain(mail_host, description, base_url, owners) store.add(domain) diff --git a/src/mailman/model/language.py b/src/mailman/model/language.py index fd51f9522..f0a3326a8 100644 --- a/src/mailman/model/language.py +++ b/src/mailman/model/language.py @@ -17,16 +17,14 @@ """Model for languages.""" +from mailman import public from mailman.database.model import Model from mailman.interfaces.languages import ILanguage from sqlalchemy import Column, Integer, Unicode from zope.interface import implementer -__all__ = [ - 'Language', - ] - +@public @implementer(ILanguage) class Language(Model): """See `ILanguage`.""" diff --git a/src/mailman/model/listmanager.py b/src/mailman/model/listmanager.py index 074b6b600..0ad29880f 100644 --- a/src/mailman/model/listmanager.py +++ b/src/mailman/model/listmanager.py @@ -17,6 +17,7 @@ """A mailing list manager.""" +from mailman import public from mailman.database.transaction import dbconnection from mailman.interfaces.address import InvalidEmailAddressError from mailman.interfaces.listmanager import ( @@ -31,11 +32,8 @@ from mailman.utilities.datetime import now from zope.event import notify from zope.interface import implementer -__all__ = [ - 'ListManager', - ] - +@public @implementer(IListManager) class ListManager: """An implementation of the `IListManager` interface.""" @@ -47,7 +45,7 @@ class ListManager: listname, at, hostname = fqdn_listname.partition('@') if len(hostname) == 0: raise InvalidEmailAddressError(fqdn_listname) - list_id = '{0}.{1}'.format(listname, hostname) + list_id = '{}.{}'.format(listname, hostname) notify(ListCreatingEvent(fqdn_listname)) mlist = store.query(MailingList).filter_by(_list_id=list_id).first() if mlist: @@ -62,7 +60,7 @@ class ListManager: def get(self, store, fqdn_listname): """See `IListManager`.""" listname, at, hostname = fqdn_listname.partition('@') - list_id = '{0}.{1}'.format(listname, hostname) + list_id = '{}.{}'.format(listname, hostname) return store.query(MailingList).filter_by(_list_id=list_id).first() @dbconnection diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index 8e4df5f50..b147acd72 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -19,6 +19,7 @@ import os +from mailman import public from mailman.config import config from mailman.database.model import Model from mailman.database.transaction import dbconnection @@ -60,15 +61,12 @@ from zope.component import getUtility from zope.event import notify from zope.interface import implementer -__all__ = [ - 'MailingList', - ] - SPACE = ' ' UNDERSCORE = '_' +@public @implementer(IMailingList) class MailingList(Model): """See `IMailingList`.""" @@ -101,7 +99,7 @@ class MailingList(Model): # Attributes which are directly modifiable via the web u/i. The more # complicated attributes are currently stored as pickles, though that # will change as the schema and implementation is developed. - accept_these_nonmembers = Column(PickleType) # XXX + accept_these_nonmembers = Column(PickleType) # XXX admin_immed_notify = Column(Boolean) admin_notify_mchanges = Column(Boolean) administrivia = Column(Boolean) @@ -120,13 +118,13 @@ class MailingList(Model): collapse_alternatives = Column(Boolean) convert_html_to_plaintext = Column(Boolean) # Bounces. - bounce_info_stale_after = Column(Interval) # XXX - bounce_matching_headers = Column(Unicode) # XXX - bounce_notify_owner_on_disable = Column(Boolean) # XXX - bounce_notify_owner_on_removal = Column(Boolean) # XXX - bounce_score_threshold = Column(Integer) # XXX - bounce_you_are_disabled_warnings = Column(Integer) # XXX - bounce_you_are_disabled_warnings_interval = Column(Interval) # XXX + bounce_info_stale_after = Column(Interval) # XXX + bounce_matching_headers = Column(Unicode) # XXX + bounce_notify_owner_on_disable = Column(Boolean) # XXX + bounce_notify_owner_on_removal = Column(Boolean) # XXX + bounce_score_threshold = Column(Integer) # XXX + bounce_you_are_disabled_warnings = Column(Integer) # XXX + bounce_you_are_disabled_warnings_interval = Column(Interval) # XXX forward_unrecognized_bounces_to = Column( Enum(UnrecognizedBounceDisposition)) process_bounces = Column(Boolean) @@ -160,7 +158,7 @@ class MailingList(Model): member_moderation_notice = Column(Unicode) mime_is_default_digest = Column(Boolean) # FIXME: There should be no moderator_password - moderator_password = Column(LargeBinary) # TODO : was RawStr() + moderator_password = Column(LargeBinary) # TODO : was RawStr() newsgroup_moderation = Column(Enum(NewsgroupModeration)) nntp_prefix_subject_too = Column(Boolean) nonmember_rejection_notice = Column(Unicode) @@ -277,49 +275,49 @@ class MailingList(Model): @property def no_reply_address(self): """See `IMailingList`.""" - return '{0}@{1}'.format(config.mailman.noreply_address, self.mail_host) + return '{}@{}'.format(config.mailman.noreply_address, self.mail_host) @property def owner_address(self): """See `IMailingList`.""" - return '{0}-owner@{1}'.format(self.list_name, self.mail_host) + return '{}-owner@{}'.format(self.list_name, self.mail_host) @property def request_address(self): """See `IMailingList`.""" - return '{0}-request@{1}'.format(self.list_name, self.mail_host) + return '{}-request@{}'.format(self.list_name, self.mail_host) @property def bounces_address(self): """See `IMailingList`.""" - return '{0}-bounces@{1}'.format(self.list_name, self.mail_host) + return '{}-bounces@{}'.format(self.list_name, self.mail_host) @property def join_address(self): """See `IMailingList`.""" - return '{0}-join@{1}'.format(self.list_name, self.mail_host) + return '{}-join@{}'.format(self.list_name, self.mail_host) @property def leave_address(self): """See `IMailingList`.""" - return '{0}-leave@{1}'.format(self.list_name, self.mail_host) + return '{}-leave@{}'.format(self.list_name, self.mail_host) @property def subscribe_address(self): """See `IMailingList`.""" - return '{0}-subscribe@{1}'.format(self.list_name, self.mail_host) + return '{}-subscribe@{}'.format(self.list_name, self.mail_host) @property def unsubscribe_address(self): """See `IMailingList`.""" - return '{0}-unsubscribe@{1}'.format(self.list_name, self.mail_host) + return '{}-unsubscribe@{}'.format(self.list_name, self.mail_host) def confirm_address(self, cookie): """See `IMailingList`.""" local_part = expand(config.mta.verp_confirm_format, dict( - address = '{0}-confirm'.format(self.list_name), - cookie = cookie)) - return '{0}@{1}'.format(local_part, self.mail_host) + address='{}-confirm'.format(self.list_name), + cookie=cookie)) + return '{}@{}'.format(local_part, self.mail_host) @property def preferred_language(self): @@ -499,6 +497,7 @@ class MailingList(Model): return member +@public @implementer(IAcceptableAlias) class AcceptableAlias(Model): """See `IAcceptableAlias`.""" @@ -519,6 +518,7 @@ class AcceptableAlias(Model): self.alias = alias +@public @implementer(IAcceptableAliasSet) class AcceptableAliasSet: """See `IAcceptableAliasSet`.""" @@ -554,6 +554,7 @@ class AcceptableAliasSet: yield alias.alias +@public @implementer(IListArchiver) class ListArchiver(Model): """See `IListArchiver`.""" @@ -591,6 +592,7 @@ class ListArchiver(Model): self._is_enabled = value +@public @implementer(IListArchiverSet) class ListArchiverSet: @dbconnection @@ -623,6 +625,7 @@ class ListArchiverSet: ListArchiver.name == archiver_name).one_or_none() +@public @implementer(IHeaderMatch) class HeaderMatch(Model): """See `IHeaderMatch`.""" @@ -667,7 +670,7 @@ class HeaderMatch(Model): raise ValueError( 'There are {count} header matches for this list, ' 'the new position cannot be {count} or higher'.format( - count=existing_count)) + count=existing_count)) if value < self.position: # Moving up: header matches between the new position and the # current one must be moved down the list to make room. Those @@ -689,6 +692,7 @@ class HeaderMatch(Model): self._position = value +@public @implementer(IHeaderMatchList) class HeaderMatchList: """See `IHeaderMatchList`.""" diff --git a/src/mailman/model/member.py b/src/mailman/model/member.py index ecd1c3d9e..99f2de9b8 100644 --- a/src/mailman/model/member.py +++ b/src/mailman/model/member.py @@ -17,6 +17,7 @@ """Model for members.""" +from mailman import public from mailman.core.constants import system_preferences from mailman.database.model import Model from mailman.database.transaction import dbconnection @@ -35,15 +36,11 @@ from zope.component import getUtility from zope.event import notify from zope.interface import implementer -__all__ = [ - 'Member', - ] - - uid_factory = UIDFactory(context='members') +@public @implementer(IMember) class Member(Model): """See `IMember`.""" @@ -84,12 +81,12 @@ class Member(Model): list_id).default_member_action else: assert role is MemberRole.nonmember, ( - 'Invalid MemberRole: {0}'.format(role)) + 'Invalid MemberRole: {}'.format(role)) self.moderation_action = getUtility(IListManager).get_by_list_id( list_id).default_nonmember_action def __repr__(self): - return '<Member: {0} on {1} as {2}>'.format( + return '<Member: {} on {} as {}>'.format( self.address, self.mailing_list.fqdn_listname, self.role) @property diff --git a/src/mailman/model/message.py b/src/mailman/model/message.py index c0fb1cd37..c4fe63f1c 100644 --- a/src/mailman/model/message.py +++ b/src/mailman/model/message.py @@ -17,11 +17,7 @@ """Model for messages.""" -__all__ = [ - 'Message', - ] - - +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.interfaces.messages import IMessage @@ -29,7 +25,7 @@ from sqlalchemy import Column, Integer, Unicode from zope.interface import implementer - +@public @implementer(IMessage) class Message(Model): """A message in the message store.""" diff --git a/src/mailman/model/messagestore.py b/src/mailman/model/messagestore.py index 9d0cfbc76..b17118330 100644 --- a/src/mailman/model/messagestore.py +++ b/src/mailman/model/messagestore.py @@ -17,15 +17,11 @@ """Model for message stores.""" -__all__ = [ - 'MessageStore', - ] - - import os import errno import pickle +from mailman import public from mailman.config import config from mailman.database.transaction import dbconnection from mailman.interfaces.messages import IMessageStore @@ -41,7 +37,7 @@ MAX_SPLITS = 2 EMPTYSTRING = '' - +@public @implementer(IMessageStore) class MessageStore: """See `IMessageStore`.""" diff --git a/src/mailman/model/mime.py b/src/mailman/model/mime.py index c02ffb2ea..3bc09a411 100644 --- a/src/mailman/model/mime.py +++ b/src/mailman/model/mime.py @@ -17,11 +17,7 @@ """The content filter.""" -__all__ = [ - 'ContentFilter' - ] - - +from mailman import public from mailman.database.model import Model from mailman.database.types import Enum from mailman.interfaces.mime import IContentFilter, FilterType @@ -30,7 +26,7 @@ from sqlalchemy.orm import relationship from zope.interface import implementer - +@public @implementer(IContentFilter) class ContentFilter(Model): """A single filter criteria.""" diff --git a/src/mailman/model/pending.py b/src/mailman/model/pending.py index 6336ea14c..0e19f0cbf 100644 --- a/src/mailman/model/pending.py +++ b/src/mailman/model/pending.py @@ -17,15 +17,10 @@ """Implementations of the IPendable and IPending interfaces.""" -__all__ = [ - 'Pended', - 'Pendings', - ] - - import json from lazr.config import as_timedelta +from mailman import public from mailman.config import config from mailman.database.model import Model from mailman.database.transaction import dbconnection @@ -42,7 +37,7 @@ from zope.interface.verify import verifyObject token_factory = TokenFactory() - +@public @implementer(IPendedKeyValue) class PendedKeyValue(Model): """A pended key/value pair, tied to a token.""" @@ -59,7 +54,7 @@ class PendedKeyValue(Model): self.value = value - +@public @implementer(IPended) class Pended(Model): """A pended event, tied to a token.""" @@ -72,13 +67,13 @@ class Pended(Model): key_values = relationship('PendedKeyValue', cascade="all, delete-orphan") - +@public @implementer(IPendable) class UnpendedPendable(dict): PEND_TYPE = 'unpended' - +@public @implementer(IPendings) class Pendings: """Implementation of the IPending interface.""" @@ -113,8 +108,8 @@ class Pendings: key = key.decode('utf-8') if isinstance(value, bytes): # Make sure we can turn this back into a bytes. - value = dict(__encoding__='utf-8', - value=value.decode('utf-8')) + value = dict(__encoding__='utf-8', + value=value.decode('utf-8')) keyval = PendedKeyValue(key=key, value=json.dumps(value)) pending.key_values.append(keyval) store.add(pending) @@ -128,7 +123,7 @@ class Pendings: if pendings.count() == 0: return None assert pendings.count() == 1, ( - 'Unexpected token count: {0}'.format(pendings.count())) + 'Unexpected token count: {}'.format(pendings.count())) pending = pendings[0] pendable = UnpendedPendable() # Iterate on PendedKeyValue entries that are associated with the diff --git a/src/mailman/model/preferences.py b/src/mailman/model/preferences.py index ef8f121d6..53bfe6975 100644 --- a/src/mailman/model/preferences.py +++ b/src/mailman/model/preferences.py @@ -17,11 +17,7 @@ """Model for preferences.""" -__all__ = [ - 'Preferences', - ] - - +from mailman import public from mailman.database.model import Model from mailman.database.types import Enum from mailman.interfaces.languages import ILanguageManager @@ -32,7 +28,7 @@ from zope.component import getUtility from zope.interface import implementer - +@public @implementer(IPreferences) class Preferences(Model): """See `IPreferences`.""" @@ -49,7 +45,7 @@ class Preferences(Model): delivery_status = Column(Enum(DeliveryStatus)) def __repr__(self): - return '<Preferences object at {0:#x}>'.format(id(self)) + return '<Preferences object at {:#x}>'.format(id(self)) @property def preferred_language(self): diff --git a/src/mailman/model/requests.py b/src/mailman/model/requests.py index 341233280..f7f42f37e 100644 --- a/src/mailman/model/requests.py +++ b/src/mailman/model/requests.py @@ -17,13 +17,8 @@ """Implementations of the pending requests interfaces.""" -__all__ = [ - 'DataPendable', - 'ListRequests', - ] - - from datetime import timedelta +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import Enum @@ -37,7 +32,7 @@ from zope.component import getUtility from zope.interface import implementer - +@public @implementer(IPendable) class DataPendable(dict): """See `IPendable`.""" @@ -59,7 +54,7 @@ class DataPendable(dict): super().update(clean_mapping) - +@public @implementer(IListRequests) class ListRequests: """See `IListRequests`.""" @@ -144,7 +139,6 @@ class ListRequests: store.delete(request) - class _Request(Model): """Table for mailing list hold requests.""" diff --git a/src/mailman/model/roster.py b/src/mailman/model/roster.py index 450c5ee84..5dc0423b2 100644 --- a/src/mailman/model/roster.py +++ b/src/mailman/model/roster.py @@ -22,18 +22,7 @@ the ones that fit a particular role. These are used as the member, owner, moderator, and administrator roster filters. """ -__all__ = [ - 'AdministratorRoster', - 'DigestMemberRoster', - 'MemberRoster', - 'Memberships', - 'ModeratorRoster', - 'OwnerRoster', - 'RegularMemberRoster', - 'Subscribers', - ] - - +from mailman import public from mailman.database.transaction import dbconnection from mailman.interfaces.member import DeliveryMode, MemberRole from mailman.interfaces.roster import IRoster @@ -43,7 +32,7 @@ from sqlalchemy import or_ from zope.interface import implementer - +@public @implementer(IRoster) class AbstractRoster: """An abstract IRoster class. @@ -139,7 +128,7 @@ class AbstractRoster: return memberships - +@public class MemberRoster(AbstractRoster): """Return all the members of a list.""" @@ -147,7 +136,7 @@ class MemberRoster(AbstractRoster): role = MemberRole.member - +@public class NonmemberRoster(AbstractRoster): """Return all the nonmembers of a list.""" @@ -155,7 +144,7 @@ class NonmemberRoster(AbstractRoster): role = MemberRole.nonmember - +@public class OwnerRoster(AbstractRoster): """Return all the owners of a list.""" @@ -163,7 +152,7 @@ class OwnerRoster(AbstractRoster): role = MemberRole.owner - +@public class ModeratorRoster(AbstractRoster): """Return all the owners of a list.""" @@ -171,7 +160,7 @@ class ModeratorRoster(AbstractRoster): role = MemberRole.moderator - +@public class AdministratorRoster(AbstractRoster): """Return all the administrators of a list.""" @@ -195,7 +184,7 @@ class AdministratorRoster(AbstractRoster): Member.address_id == Address.id).one_or_none() - +@public class DeliveryMemberRoster(AbstractRoster): """Return all the members having a particular kind of delivery.""" @@ -219,13 +208,14 @@ class DeliveryMemberRoster(AbstractRoster): :rtype: generator """ results = store.query(Member).filter_by( - list_id = self._mlist.list_id, - role = MemberRole.member) + list_id=self._mlist.list_id, + role=MemberRole.member) for member in results: if member.delivery_mode in delivery_modes: yield member +@public class RegularMemberRoster(DeliveryMemberRoster): """Return all the regular delivery members of a list.""" @@ -237,7 +227,7 @@ class RegularMemberRoster(DeliveryMemberRoster): yield from self._get_members(DeliveryMode.regular) - +@public class DigestMemberRoster(DeliveryMemberRoster): """Return all the regular delivery members of a list.""" @@ -252,7 +242,7 @@ class DigestMemberRoster(DeliveryMemberRoster): DeliveryMode.summary_digests) - +@public class Subscribers(AbstractRoster): """Return all subscribed members regardless of their role.""" @@ -260,10 +250,10 @@ class Subscribers(AbstractRoster): @dbconnection def _query(self, store): - return store.query(Member).filter_by(list_id = self._mlist.list_id) + return store.query(Member).filter_by(list_id=self._mlist.list_id) - +@public @implementer(IRoster) class Memberships: """A roster of a single user's memberships.""" diff --git a/src/mailman/model/subscriptions.py b/src/mailman/model/subscriptions.py index 43597638f..1591a3adf 100644 --- a/src/mailman/model/subscriptions.py +++ b/src/mailman/model/subscriptions.py @@ -17,11 +17,7 @@ """Subscription services.""" -__all__ = [ - 'SubscriptionService', - ] - - +from mailman import public from mailman.app.membership import delete_member from mailman.database.transaction import dbconnection from mailman.interfaces.listmanager import IListManager, NoSuchListError @@ -38,6 +34,7 @@ from zope.component import getUtility from zope.interface import implementer +@public @implementer(ISubscriptionService) class SubscriptionService: """Subscription services for the REST API.""" diff --git a/src/mailman/model/tests/test_address.py b/src/mailman/model/tests/test_address.py index 2ed74360b..896310796 100644 --- a/src/mailman/model/tests/test_address.py +++ b/src/mailman/model/tests/test_address.py @@ -17,11 +17,6 @@ """Test addresses.""" -__all__ = [ - 'TestAddress', - ] - - import unittest from mailman.email.validate import InvalidEmailAddressError @@ -32,7 +27,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestAddress(unittest.TestCase): """Test addresses.""" @@ -43,8 +37,8 @@ class TestAddress(unittest.TestCase): self._address = self._usermgr.create_address('FPERSON@example.com') def test_invalid_email_string_raises_exception(self): - with self.assertRaises(InvalidEmailAddressError): - Address('not_a_valid_email_string', '') + self.assertRaises(InvalidEmailAddressError, + Address, 'not_a_valid_email_string', '') def test_local_part_differs_only_by_case(self): with self.assertRaises(ExistingAddressError) as cm: diff --git a/src/mailman/model/tests/test_bans.py b/src/mailman/model/tests/test_bans.py index 636ee7e35..c4fa57338 100644 --- a/src/mailman/model/tests/test_bans.py +++ b/src/mailman/model/tests/test_bans.py @@ -17,11 +17,6 @@ """Test Bans and the ban manager.""" -__all__ = [ - 'TestMailingListBans', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -31,7 +26,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestMailingListBans(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_bounce.py b/src/mailman/model/tests/test_bounce.py index d2fd27172..14f39ceaf 100644 --- a/src/mailman/model/tests/test_bounce.py +++ b/src/mailman/model/tests/test_bounce.py @@ -17,11 +17,6 @@ """Test bounce model objects.""" -__all__ = [ - 'TestBounceEvents', - ] - - import unittest from datetime import datetime @@ -34,7 +29,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestBounceEvents(unittest.TestCase): layer = ConfigLayer @@ -70,7 +64,7 @@ Message-Id: <first> self.assertEqual(event.timestamp, datetime(2005, 8, 1, 7, 49, 23)) self.assertEqual(event.message_id, '<first>') self.assertEqual(event.context, BounceContext.normal) - self.assertEqual(event.processed, False) + self.assertFalse(event.processed) def test_unprocessed_events_iterator(self): with transaction(): diff --git a/src/mailman/model/tests/test_domain.py b/src/mailman/model/tests/test_domain.py index e1941744b..3ebcb562e 100644 --- a/src/mailman/model/tests/test_domain.py +++ b/src/mailman/model/tests/test_domain.py @@ -17,12 +17,6 @@ """Test domains.""" -__all__ = [ - 'TestDomainLifecycleEvents', - 'TestDomainManager', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -36,7 +30,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestDomainManager(unittest.TestCase): layer = ConfigLayer @@ -53,9 +46,9 @@ class TestDomainManager(unittest.TestCase): with event_subscribers(self._record_event): domain = self._manager.add('example.org') self.assertEqual(len(self._events), 2) - self.assertTrue(isinstance(self._events[0], DomainCreatingEvent)) + self.assertIsInstance(self._events[0], DomainCreatingEvent) self.assertEqual(self._events[0].mail_host, 'example.org') - self.assertTrue(isinstance(self._events[1], DomainCreatedEvent)) + self.assertIsInstance(self._events[1], DomainCreatedEvent) self.assertEqual(self._events[1].domain, domain) def test_delete_domain_event(self): @@ -65,9 +58,9 @@ class TestDomainManager(unittest.TestCase): with event_subscribers(self._record_event): self._manager.remove('example.org') self.assertEqual(len(self._events), 2) - self.assertTrue(isinstance(self._events[0], DomainDeletingEvent)) + self.assertIsInstance(self._events[0], DomainDeletingEvent) self.assertEqual(self._events[0].domain, domain) - self.assertTrue(isinstance(self._events[1], DomainDeletedEvent)) + self.assertIsInstance(self._events[1], DomainDeletedEvent) self.assertEqual(self._events[1].mail_host, 'example.org') def test_lookup_missing_domain(self): @@ -129,7 +122,7 @@ class TestDomainManager(unittest.TestCase): self.assertEqual( sorted(owner.addresses[0].email for owner in domain.owners), ['anne@example.com', 'bart@example.com']) - def sort_key(owner): + def sort_key(owner): # flake8: noqa return owner.addresses[0].email self.assertEqual(sorted(domain.owners, key=sort_key), [anne, bart]) @@ -172,7 +165,6 @@ class TestDomainManager(unittest.TestCase): ['anne@example.org', 'bart@example.net']) - class TestDomainLifecycleEvents(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_listmanager.py b/src/mailman/model/tests/test_listmanager.py index e26a77419..464ebfc52 100644 --- a/src/mailman/model/tests/test_listmanager.py +++ b/src/mailman/model/tests/test_listmanager.py @@ -17,13 +17,6 @@ """Test the ListManager.""" -__all__ = [ - 'TestListCreation', - 'TestListLifecycleEvents', - 'TestListManager', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -46,7 +39,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestListManager(unittest.TestCase): layer = ConfigLayer @@ -62,9 +54,9 @@ class TestListManager(unittest.TestCase): with event_subscribers(self._record_event): mlist = getUtility(IListManager).create('test@example.com') self.assertEqual(len(self._events), 2) - self.assertTrue(isinstance(self._events[0], ListCreatingEvent)) + self.assertIsInstance(self._events[0], ListCreatingEvent) self.assertEqual(self._events[0].fqdn_listname, 'test@example.com') - self.assertTrue(isinstance(self._events[1], ListCreatedEvent)) + self.assertIsInstance(self._events[1], ListCreatedEvent) self.assertEqual(self._events[1].mailing_list, mlist) def test_delete_list_event(self): @@ -74,9 +66,9 @@ class TestListManager(unittest.TestCase): with event_subscribers(self._record_event): getUtility(IListManager).delete(mlist) self.assertEqual(len(self._events), 2) - self.assertTrue(isinstance(self._events[0], ListDeletingEvent)) + self.assertIsInstance(self._events[0], ListDeletingEvent) self.assertEqual(self._events[0].mailing_list, mlist) - self.assertTrue(isinstance(self._events[1], ListDeletedEvent)) + self.assertIsInstance(self._events[1], ListDeletedEvent) self.assertEqual(self._events[1].fqdn_listname, 'another@example.com') def test_list_manager_list_ids(self): @@ -112,7 +104,6 @@ class TestListManager(unittest.TestCase): self.assertIsNone(list_manager.get('ant@example.com')) - class TestListLifecycleEvents(unittest.TestCase): layer = ConfigLayer @@ -137,8 +128,8 @@ class TestListLifecycleEvents(unittest.TestCase): # We deleted the ant@example.com mailing list. Anne's and Bart's # membership in this list should now be removed, but Anne's membership # in bee@example.com should still exist. - self.assertEqual(service.get_member(anne_ant_id), None) - self.assertEqual(service.get_member(bart_ant_id), None) + self.assertIsNone(service.get_member(anne_ant_id)) + self.assertIsNone(service.get_member(bart_ant_id)) self.assertEqual(service.get_member(anne_bee_id), anne_bee) def test_requests_are_deleted_when_mailing_list_is_deleted(self): @@ -171,11 +162,10 @@ Message-ID: <argon> setattr(self._ant, name, ['test-filter-1', 'test-filter-2']) getUtility(IListManager).delete(self._ant) filters = config.db.store.query(ContentFilter).filter_by( - mailing_list = self._ant) + mailing_list=self._ant) self.assertEqual(filters.count(), 0) - class TestListCreation(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_mailinglist.py b/src/mailman/model/tests/test_mailinglist.py index 67693fb4b..c9aecc93b 100644 --- a/src/mailman/model/tests/test_mailinglist.py +++ b/src/mailman/model/tests/test_mailinglist.py @@ -17,14 +17,6 @@ """Test MailingLists and related model objects..""" -__all__ = [ - 'TestAcceptableAliases', - 'TestDisabledListArchiver', - 'TestListArchiver', - 'TestMailingList', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -96,8 +88,7 @@ class TestMailingList(unittest.TestCase): user.preferred_address = address self._mlist.subscribe(user) # The welcome message was sent to the preferred address. - items = get_queue_messages('virgin') - self.assertEqual(len(items), 1) + items = get_queue_messages('virgin', expected_count=1) self.assertIn('Anne Person <aperson@example.com>', items[0].msg.get_payload()) @@ -204,7 +195,7 @@ class TestHeaderMatch(unittest.TestCase): header_matches = IHeaderMatchList(self._mlist) header_matches.append('header', 'pattern') self.assertEqual(len(self._mlist.header_matches), 1) - self.assertEqual(self._mlist.header_matches[0].chain, None) + self.assertIsNone(self._mlist.header_matches[0].chain) def test_duplicate(self): header_matches = IHeaderMatchList(self._mlist) @@ -241,11 +232,11 @@ class TestHeaderMatch(unittest.TestCase): for match in IHeaderMatchList(self._mlist)] self.assertEqual( matches, [ - ('header', 'pattern', None), - ('subject', 'patt.*', None), - ('from', '.*@example.com', 'discard'), - ('from', '.*@example.org', 'accept'), - ]) + ('header', 'pattern', None), + ('subject', 'patt.*', None), + ('from', '.*@example.com', 'discard'), + ('from', '.*@example.org', 'accept'), + ]) def test_clear(self): header_matches = IHeaderMatchList(self._mlist) @@ -286,21 +277,21 @@ class TestHeaderMatch(unittest.TestCase): header_matches.append('header-3', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ('header-2', 2), - ('header-3', 3), - ]) + ('header-0', 0), + ('header-1', 1), + ('header-2', 2), + ('header-3', 3), + ]) header_match_2 = self._mlist.header_matches[2] self.assertEqual(header_match_2.position, 2) header_match_2.position = 1 self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-2', 1), - ('header-1', 2), - ('header-3', 3), - ]) + ('header-0', 0), + ('header-2', 1), + ('header-1', 2), + ('header-3', 3), + ]) def test_move_down(self): header_matches = IHeaderMatchList(self._mlist) @@ -310,21 +301,21 @@ class TestHeaderMatch(unittest.TestCase): header_matches.append('header-3', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ('header-2', 2), - ('header-3', 3), - ]) + ('header-0', 0), + ('header-1', 1), + ('header-2', 2), + ('header-3', 3), + ]) header_match_1 = self._mlist.header_matches[1] self.assertEqual(header_match_1.position, 1) header_match_1.position = 2 self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-2', 1), - ('header-1', 2), - ('header-3', 3), - ]) + ('header-0', 0), + ('header-2', 1), + ('header-1', 2), + ('header-3', 3), + ]) def test_move_identical(self): header_matches = IHeaderMatchList(self._mlist) @@ -333,19 +324,19 @@ class TestHeaderMatch(unittest.TestCase): header_matches.append('header-2', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ('header-2', 2), - ]) + ('header-0', 0), + ('header-1', 1), + ('header-2', 2), + ]) header_match_1 = self._mlist.header_matches[1] self.assertEqual(header_match_1.position, 1) header_match_1.position = 1 self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ('header-2', 2), - ]) + ('header-0', 0), + ('header-1', 1), + ('header-2', 2), + ]) def test_move_negative(self): header_matches = IHeaderMatchList(self._mlist) @@ -367,16 +358,16 @@ class TestHeaderMatch(unittest.TestCase): header_matches.append('header-1', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ]) + ('header-0', 0), + ('header-1', 1), + ]) header_matches.insert(1, 'header-2', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-2', 1), - ('header-1', 2), - ]) + ('header-0', 0), + ('header-2', 1), + ('header-1', 2), + ]) def test_rebuild_sequence_after_remove(self): header_matches = IHeaderMatchList(self._mlist) @@ -385,16 +376,16 @@ class TestHeaderMatch(unittest.TestCase): header_matches.append('header-2', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-0', 0), - ('header-1', 1), - ('header-2', 2), - ]) + ('header-0', 0), + ('header-1', 1), + ('header-2', 2), + ]) del header_matches[0] self.assertEqual( [(match.header, match.position) for match in header_matches], [ - ('header-1', 0), - ('header-2', 1), - ]) + ('header-1', 0), + ('header-2', 1), + ]) header_matches.remove('header-1', 'pattern') self.assertEqual( [(match.header, match.position) for match in header_matches], diff --git a/src/mailman/model/tests/test_member.py b/src/mailman/model/tests/test_member.py index 03a2ee9a0..f34b2c7cf 100644 --- a/src/mailman/model/tests/test_member.py +++ b/src/mailman/model/tests/test_member.py @@ -17,11 +17,6 @@ """Test members.""" -__all__ = [ - 'TestMember', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -35,7 +30,6 @@ from mailman.utilities.datetime import now from zope.component import getUtility - class TestMember(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_messagestore.py b/src/mailman/model/tests/test_messagestore.py index 998fa36c0..8976fd9bd 100644 --- a/src/mailman/model/tests/test_messagestore.py +++ b/src/mailman/model/tests/test_messagestore.py @@ -17,11 +17,6 @@ """Test the message store.""" -__all__ = [ - 'TestMessageStore', - ] - - import os import unittest @@ -35,7 +30,6 @@ from mailman.utilities.email import add_message_hash from zope.component import getUtility - class TestMessageStore(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_pending.py b/src/mailman/model/tests/test_pending.py index 46b0729bf..feb921796 100644 --- a/src/mailman/model/tests/test_pending.py +++ b/src/mailman/model/tests/test_pending.py @@ -17,11 +17,6 @@ """Test pendings.""" -__all__ = [ - 'TestPendings', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -38,7 +33,6 @@ class SimplePendable(dict): PEND_TYPE = 'simple' - class TestPendings(unittest.TestCase): """Test pendings.""" diff --git a/src/mailman/model/tests/test_requests.py b/src/mailman/model/tests/test_requests.py index 37fc2d659..8525b725a 100644 --- a/src/mailman/model/tests/test_requests.py +++ b/src/mailman/model/tests/test_requests.py @@ -17,11 +17,6 @@ """Test the various pending requests interfaces.""" -__all__ = [ - 'TestRequests', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -31,7 +26,6 @@ from mailman.testing.helpers import specialized_message_from_string as mfs from mailman.testing.layers import ConfigLayer - class TestRequests(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_roster.py b/src/mailman/model/tests/test_roster.py index 8264a7be8..4f6ab590a 100644 --- a/src/mailman/model/tests/test_roster.py +++ b/src/mailman/model/tests/test_roster.py @@ -17,13 +17,6 @@ """Test rosters.""" -__all__ = [ - 'TestMailingListRoster', - 'TestMembershipsRoster', - 'TestUserRoster', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -36,7 +29,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestMailingListRoster(unittest.TestCase): """Test various aspects of a mailing list's roster.""" @@ -129,7 +121,6 @@ class TestMailingListRoster(unittest.TestCase): self.assertEqual(self._mlist.subscribers.member_count, 4) - class TestMembershipsRoster(unittest.TestCase): """Test the memberships roster.""" @@ -207,7 +198,6 @@ class TestMembershipsRoster(unittest.TestCase): self.assertEqual(users[0], self._anne) - class TestUserRoster(unittest.TestCase): """Test aspects of rosters when users are subscribed.""" diff --git a/src/mailman/model/tests/test_subscriptions.py b/src/mailman/model/tests/test_subscriptions.py index 6f9f983d5..6b884b22f 100644 --- a/src/mailman/model/tests/test_subscriptions.py +++ b/src/mailman/model/tests/test_subscriptions.py @@ -17,11 +17,6 @@ """Test the subscription service.""" -__all__ = [ - 'TestSubscriptionService', - ] - - import unittest from mailman.app.lifecycle import create_list diff --git a/src/mailman/model/tests/test_uid.py b/src/mailman/model/tests/test_uid.py index 1c895cf94..088851b6a 100644 --- a/src/mailman/model/tests/test_uid.py +++ b/src/mailman/model/tests/test_uid.py @@ -17,11 +17,6 @@ """Test the UID model class.""" -__all__ = [ - 'TestUID', - ] - - import uuid import unittest @@ -32,7 +27,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestUID(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_user.py b/src/mailman/model/tests/test_user.py index 8648e0fd3..7c8a3581e 100644 --- a/src/mailman/model/tests/test_user.py +++ b/src/mailman/model/tests/test_user.py @@ -17,11 +17,6 @@ """Test users.""" -__all__ = [ - 'TestUser', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -37,7 +32,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestUser(unittest.TestCase): """Test users.""" diff --git a/src/mailman/model/tests/test_usermanager.py b/src/mailman/model/tests/test_usermanager.py index 812a111e4..8855b106a 100644 --- a/src/mailman/model/tests/test_usermanager.py +++ b/src/mailman/model/tests/test_usermanager.py @@ -17,11 +17,6 @@ """Test the IUserManager implementation.""" -__all__ = [ - 'TestUserManager', - ] - - import unittest from mailman.app.lifecycle import create_list @@ -35,7 +30,6 @@ from mailman.utilities.datetime import now from zope.component import getUtility - class TestUserManager(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/tests/test_workflow.py b/src/mailman/model/tests/test_workflow.py index 2edfac69f..4c8c6776f 100644 --- a/src/mailman/model/tests/test_workflow.py +++ b/src/mailman/model/tests/test_workflow.py @@ -17,11 +17,6 @@ """Test the workflow model.""" -__all__ = [ - 'TestWorkflow', - ] - - import unittest from mailman.interfaces.workflow import IWorkflowStateManager @@ -29,7 +24,6 @@ from mailman.testing.layers import ConfigLayer from zope.component import getUtility - class TestWorkflow(unittest.TestCase): layer = ConfigLayer diff --git a/src/mailman/model/uid.py b/src/mailman/model/uid.py index 6f1e37e41..2cf61668f 100644 --- a/src/mailman/model/uid.py +++ b/src/mailman/model/uid.py @@ -17,19 +17,14 @@ """Unique IDs.""" -__all__ = [ - 'UID', - ] - - - +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import UUID from sqlalchemy import Column, Integer - +@public class UID(Model): """Enforce uniqueness of uids through a database table. diff --git a/src/mailman/model/user.py b/src/mailman/model/user.py index 7d74df7a9..a1a61b38b 100644 --- a/src/mailman/model/user.py +++ b/src/mailman/model/user.py @@ -17,12 +17,7 @@ """Model for users.""" -__all__ = [ - 'DomainOwner', - 'User', - ] - - +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import UUID @@ -44,7 +39,7 @@ from zope.interface import implementer uid_factory = UIDFactory(context='users') - +@public @implementer(IUser) class User(Model): """Mailman users.""" @@ -60,7 +55,7 @@ class User(Model): addresses = relationship( 'Address', backref='user', - primaryjoin=(id==Address.user_id)) + primaryjoin=(id == Address.user_id)) _preferred_address_id = Column( Integer, @@ -69,7 +64,7 @@ class User(Model): ondelete='SET NULL')) _preferred_address = relationship( - 'Address', primaryjoin=(_preferred_address_id==Address.id), + 'Address', primaryjoin=(_preferred_address_id == Address.id), post_update=True) preferences_id = Column(Integer, ForeignKey('preferences.id'), index=True) @@ -82,7 +77,7 @@ class User(Model): self._created_on = date_factory.now() user_id = uid_factory.new() assert store.query(User).filter_by(_user_id=user_id).count() == 0, ( - 'Duplicate user id {0}'.format(user_id)) + 'Duplicate user id {}'.format(user_id)) self._user_id = user_id self.display_name = ('' if display_name is None else display_name) if preferences is not None: @@ -180,7 +175,7 @@ class User(Model): return Memberships(self) - +@public class DomainOwner(Model): """Internal table for associating domains to their owners.""" diff --git a/src/mailman/model/usermanager.py b/src/mailman/model/usermanager.py index 8b923f07e..2d3ddaae9 100644 --- a/src/mailman/model/usermanager.py +++ b/src/mailman/model/usermanager.py @@ -17,11 +17,7 @@ """A user manager.""" -__all__ = [ - 'UserManager', - ] - - +from mailman import public from mailman.database.transaction import dbconnection from mailman.interfaces.address import ExistingAddressError from mailman.interfaces.usermanager import IUserManager @@ -34,7 +30,7 @@ from mailman.model.user import User from zope.interface import implementer - +@public @implementer(IUserManager) class UserManager: """See `IUserManager`.""" @@ -108,7 +104,7 @@ class UserManager: @dbconnection def create_address(self, store, email, display_name=None): """See `IUserManager`.""" - addresses = store.query(Address).filter(Address.email==email.lower()) + addresses = store.query(Address).filter(Address.email == email.lower()) if addresses.count() == 1: found = addresses[0] raise ExistingAddressError(found.original_email) diff --git a/src/mailman/model/workflow.py b/src/mailman/model/workflow.py index 937873035..7a0056e5f 100644 --- a/src/mailman/model/workflow.py +++ b/src/mailman/model/workflow.py @@ -17,12 +17,7 @@ """Model for workflow states.""" -__all__ = [ - 'WorkflowState', - 'WorkflowStateManager', - ] - - +from mailman import public from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.interfaces.workflow import IWorkflowState, IWorkflowStateManager @@ -30,7 +25,7 @@ from sqlalchemy import Column, Unicode from zope.interface import implementer - +@public @implementer(IWorkflowState) class WorkflowState(Model): """Workflow states.""" @@ -43,7 +38,7 @@ class WorkflowState(Model): data = Column(Unicode) - +@public @implementer(IWorkflowStateManager) class WorkflowStateManager: """See `IWorkflowStateManager`.""" |
