diff options
| author | Aurélien Bompard | 2015-09-14 11:16:45 +0200 |
|---|---|---|
| committer | Barry Warsaw | 2015-10-20 21:10:35 -0400 |
| commit | 87f2f50b08eb0a7b0a99924b82fd246a6ce10983 (patch) | |
| tree | afed6065fb39fe3fae3b6d82ba97d142ad7b0f0e /src/mailman/model/mailinglist.py | |
| parent | e2f6b111f0bbf2287fbf793cd6f09fb829ee9758 (diff) | |
| download | mailman-87f2f50b08eb0a7b0a99924b82fd246a6ce10983.tar.gz mailman-87f2f50b08eb0a7b0a99924b82fd246a6ce10983.tar.zst mailman-87f2f50b08eb0a7b0a99924b82fd246a6ce10983.zip | |
Diffstat (limited to 'src/mailman/model/mailinglist.py')
| -rw-r--r-- | src/mailman/model/mailinglist.py | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index f7b1cf72c..617109a7e 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -38,8 +38,8 @@ from mailman.interfaces.domain import IDomainManager from mailman.interfaces.languages import ILanguageManager from mailman.interfaces.mailinglist import ( IAcceptableAlias, IAcceptableAliasSet, IListArchiver, IListArchiverSet, - IHeaderMatch, IMailingList, Personalization, ReplyToMunging, - SubscriptionPolicy) + IHeaderMatch, IHeaderMatchSet, IMailingList, Personalization, + ReplyToMunging, SubscriptionPolicy) from mailman.interfaces.member import ( AlreadySubscribedError, MemberRole, MissingPreferredAddressError, SubscriptionEvent) @@ -58,6 +58,7 @@ from sqlalchemy import ( LargeBinary, PickleType, Unicode) from sqlalchemy.event import listen from sqlalchemy.orm import relationship +from sqlalchemy.orm.exc import NoResultFound from urllib.parse import urljoin from zope.component import getUtility from zope.event import notify @@ -638,3 +639,48 @@ class HeaderMatch(Model): header = Column(Unicode) pattern = Column(Unicode) chain = Column(Unicode, nullable=True) + + + +@implementer(IHeaderMatchSet) +class HeaderMatchSet: + """See `IHeaderMatchSet`.""" + + def __init__(self, mailing_list): + self._mailing_list = mailing_list + + @dbconnection + def clear(self, store): + """See `IHeaderMatchSet`.""" + store.query(HeaderMatch).filter( + HeaderMatch.mailing_list == self._mailing_list).delete() + + @dbconnection + def add(self, store, header, pattern, chain=None): + header = header.lower() + existing = store.query(HeaderMatch).filter( + HeaderMatch.mailing_list == self._mailing_list, + HeaderMatch.header == header, + HeaderMatch.pattern == pattern).count() + if existing > 0: + raise ValueError('Pattern already exists') + header_match = HeaderMatch( + mailing_list=self._mailing_list, + header=header, pattern=pattern, chain=chain) + store.add(header_match) + + @dbconnection + def remove(self, store, header, pattern): + header = header.lower() + # Don't just filter and use delete(), or the MailingList.header_matches + # collection will not be updated: + # http://docs.sqlalchemy.org/en/rel_1_0/orm/collections.html#dynamic-relationship-loaders + try: + existing = store.query(HeaderMatch).filter( + HeaderMatch.mailing_list == self._mailing_list, + HeaderMatch.header == header, + HeaderMatch.pattern == pattern).one() + except NoResultFound: + raise ValueError('Pattern does not exist') + else: + self._mailing_list.header_matches.remove(existing) |
