summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2016-03-25 11:01:46 -0400
committerBarry Warsaw2016-03-25 11:01:46 -0400
commit7fd9e5ab09b0da347da0607b47d2d3838bd80f0c (patch)
treeb150f85e5fc482f45e973a233b5184d3ca4b78a7 /src
parent71ebe367a52316811f570d09f2213c192a47973f (diff)
downloadmailman-7fd9e5ab09b0da347da0607b47d2d3838bd80f0c.tar.gz
mailman-7fd9e5ab09b0da347da0607b47d2d3838bd80f0c.tar.zst
mailman-7fd9e5ab09b0da347da0607b47d2d3838bd80f0c.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/languages/language.py8
-rw-r--r--src/mailman/languages/manager.py10
-rw-r--r--src/mailman/model/address.py11
-rw-r--r--src/mailman/model/autorespond.py9
-rw-r--r--src/mailman/model/bans.py13
-rw-r--r--src/mailman/model/bounce.py3
-rw-r--r--src/mailman/model/digests.py6
-rw-r--r--src/mailman/model/domain.py10
-rw-r--r--src/mailman/model/language.py6
-rw-r--r--src/mailman/model/listmanager.py10
-rw-r--r--src/mailman/model/mailinglist.py54
-rw-r--r--src/mailman/model/member.py11
-rw-r--r--src/mailman/model/message.py8
-rw-r--r--src/mailman/model/messagestore.py8
-rw-r--r--src/mailman/model/mime.py8
-rw-r--r--src/mailman/model/pending.py21
-rw-r--r--src/mailman/model/preferences.py10
-rw-r--r--src/mailman/model/requests.py12
-rw-r--r--src/mailman/model/roster.py40
-rw-r--r--src/mailman/model/subscriptions.py7
-rw-r--r--src/mailman/model/tests/test_address.py10
-rw-r--r--src/mailman/model/tests/test_bans.py6
-rw-r--r--src/mailman/model/tests/test_bounce.py8
-rw-r--r--src/mailman/model/tests/test_domain.py18
-rw-r--r--src/mailman/model/tests/test_listmanager.py24
-rw-r--r--src/mailman/model/tests/test_mailinglist.py107
-rw-r--r--src/mailman/model/tests/test_member.py6
-rw-r--r--src/mailman/model/tests/test_messagestore.py6
-rw-r--r--src/mailman/model/tests/test_pending.py6
-rw-r--r--src/mailman/model/tests/test_requests.py6
-rw-r--r--src/mailman/model/tests/test_roster.py10
-rw-r--r--src/mailman/model/tests/test_subscriptions.py5
-rw-r--r--src/mailman/model/tests/test_uid.py6
-rw-r--r--src/mailman/model/tests/test_user.py6
-rw-r--r--src/mailman/model/tests/test_usermanager.py6
-rw-r--r--src/mailman/model/tests/test_workflow.py6
-rw-r--r--src/mailman/model/uid.py9
-rw-r--r--src/mailman/model/user.py17
-rw-r--r--src/mailman/model/usermanager.py10
-rw-r--r--src/mailman/model/workflow.py11
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`."""