diff options
Diffstat (limited to 'src/mailman/model/mailinglist.py')
| -rw-r--r-- | src/mailman/model/mailinglist.py | 107 |
1 files changed, 61 insertions, 46 deletions
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index a0239caa9..e9601e412 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -28,8 +28,8 @@ __all__ = [ import os from storm.locals import ( - And, Bool, DateTime, Float, Int, Pickle, RawStr, Reference, ReferenceSet, - Store, TimeDelta, Unicode) + And, Bool, DateTime, Float, Int, Pickle, RawStr, Reference, Store, + TimeDelta, Unicode) from urlparse import urljoin from zope.component import getUtility from zope.event import notify @@ -47,7 +47,7 @@ from mailman.interfaces.digests import DigestFrequency from mailman.interfaces.domain import IDomainManager from mailman.interfaces.languages import ILanguageManager from mailman.interfaces.mailinglist import ( - IAcceptableAlias, IAcceptableAliasSet, IArchiverList, IListArchiverSet, + IAcceptableAlias, IAcceptableAliasSet, IListArchiver, IListArchiverSet, IMailingList, Personalization, ReplyToMunging) from mailman.interfaces.member import ( AlreadySubscribedError, MemberRole, MissingPreferredAddressError, @@ -67,19 +67,6 @@ from mailman.utilities.string import expand SPACE = ' ' UNDERSCORE = '_' -@implementer(IArchiverList) -class ArchiverList(Model): - __storm_primary__ = "mailing_list_id", "archiver_name" - mailing_list_id = Int() - archiver_name = Unicode() - archiver_enabled = Bool() - - def __init__(self, mailing_list_id, archiver_name): - self.mailing_list_id = mailing_list_id - self.archiver_name = archiver_name - self.archiver_enabled = False - - @implementer(IMailingList) @@ -91,7 +78,6 @@ class MailingList(Model): # XXX denotes attributes that should be part of the public interface but # are currently missing. - archivers = ReferenceSet(id, ArchiverList.mailing_list_id) # List identity list_name = Unicode() mail_host = Unicode() @@ -553,39 +539,68 @@ class AcceptableAliasSet: for alias in aliases: yield alias.alias -@implementer(IListArchiverSet) -class ListArchiverSet: - def __init__(self, mailing_list): - self._mailing_list = mailing_list - self.lazyAdd() - def getAll(self): - entries = Store.of(self._mailing_list).find(ArchiverList, ArchiverList.mailing_list_id == self._mailing_list.id) - all_in_config = {archiver.name for archiver in config.archivers} - ret = {} - for entry in entries: - if entry.archiver_name in all_in_config: - ret[entry.archiver_name] = int(entry.archiver_enabled) - return ret + +@implementer(IListArchiver) +class ListArchiver(Model): + """See `IListArchiver`.""" + + id = Int(primary=True) + + mailing_list_id = Int() + mailing_list = Reference(mailing_list_id, MailingList.id) + name = Unicode() + _is_enabled = Bool() + + def __init__(self, mailing_list, archiver_name, system_archiver): + self.mailing_list = mailing_list + self.name = archiver_name + self._is_enabled = system_archiver.is_enabled - def set(self, archiver, is_enabled): - bool_enabled = (int(is_enabled) != 0) - self.get(archiver).set(archiver_enabled=bool_enabled) + @property + def system_archiver(self): + for archiver in config.archivers: + if archiver.name == self.name: + return archiver + return None + + @property + def is_enabled(self): + return self.system_archiver.is_enabled and self._is_enabled - def isEnabled(self, archiverName): - return self.get(archiverName).one().archiver_enabled + @is_enabled.setter + def is_enabled(self, value): + self._is_enabled = value - def get(self, archiverName): - return Store.of(self._mailing_list).find(ArchiverList, - (ArchiverList.mailing_list_id == self._mailing_list.id) & (ArchiverList.archiver_name == archiverName)) - def lazyAdd(self): - names = [] +@implementer(IListArchiverSet) +class ListArchiverSet: + def __init__(self, mailing_list): + self._mailing_list = mailing_list + system_archivers = {} for archiver in config.archivers: - count = self.get(archiver.name).count() - names.append((archiver.name, count)) - if not count: - entry = ArchiverList(self._mailing_list.id, archiver.name) - Store.of(self._mailing_list).add(entry) - Store.of(self._mailing_list).commit() + system_archivers[archiver.name] = archiver + # Add any system enabled archivers which aren't already associated + # with the mailing list. + store = Store.of(self._mailing_list) + for archiver_name in system_archivers: + exists = store.find( + ListArchiver, + And(ListArchiver.mailing_list == mailing_list, + ListArchiver.name == archiver_name)).one() + if exists is None: + store.add(ListArchiver(mailing_list, archiver_name, + system_archivers[archiver_name])) + + @property + def archivers(self): + entries = Store.of(self._mailing_list).find( + ListArchiver, ListArchiver.mailing_list == self._mailing_list) + for entry in entries: + yield entry + def get(self, archiver_name): + return Store.of(self._mailing_list).find( + ListArchiver, + And(ListArchiver.mailing_list == self._mailing_list, + ListArchiver.name == archiver_name)).one() |
