diff options
-rw-r--r-- | Mailman/Defaults.py.in | 3 | ||||
-rw-r--r-- | Mailman/Gui/General.py | 7 | ||||
-rw-r--r-- | Mailman/MailList.py | 2 | ||||
-rw-r--r-- | Mailman/Version.py | 2 | ||||
-rw-r--r-- | Mailman/versions.py | 2 | ||||
-rwxr-xr-x | cron/checkdbs | 41 |
6 files changed, 47 insertions, 10 deletions
diff --git a/Mailman/Defaults.py.in b/Mailman/Defaults.py.in index bc1c4538..bb9d4e07 100644 --- a/Mailman/Defaults.py.in +++ b/Mailman/Defaults.py.in @@ -819,6 +819,9 @@ DEFAULT_ADMIN_IMMED_NOTIFY = Yes # Is the list owner notified of subscribes/unsubscribes? DEFAULT_ADMIN_NOTIFY_MCHANGES = No +# Discard held messages after this days +DEFAULT_MAX_DAYS_TO_HOLD = 3 # days + # Should list members, by default, have their posts be moderated? DEFAULT_DEFAULT_MEMBER_MODERATION = No diff --git a/Mailman/Gui/General.py b/Mailman/Gui/General.py index 7cf1ee06..4b587e05 100644 --- a/Mailman/Gui/General.py +++ b/Mailman/Gui/General.py @@ -409,6 +409,13 @@ class General(GUIBase): headers.)""")) ) + # Discard held messages after this number of days + rtn.append( + ('max_days_to_hold', mm_cfg.Number, 7, 0, + _("""Discard held messages older than this number of days. + Use 0 for no automatic discarding.""")) + ) + return rtn def _setValue(self, mlist, property, val, doc): diff --git a/Mailman/MailList.py b/Mailman/MailList.py index 7eee3524..d44350ca 100644 --- a/Mailman/MailList.py +++ b/Mailman/MailList.py @@ -387,6 +387,8 @@ class MailList(HTMLFormatter, Deliverer, ListAdmin, self.encode_ascii_prefixes = 2 # scrub regular delivery self.scrub_nondigest = mm_cfg.DEFAULT_SCRUB_NONDIGEST + # automatic discarding + self.max_days_to_hold = mm_cfg.DEFAULT_MAX_DAYS_TO_HOLD # diff --git a/Mailman/Version.py b/Mailman/Version.py index eebd4094..f7dad1ea 100644 --- a/Mailman/Version.py +++ b/Mailman/Version.py @@ -36,7 +36,7 @@ HEX_VERSION = ((MAJOR_REV << 24) | (MINOR_REV << 16) | (MICRO_REV << 8) | (REL_LEVEL << 4) | (REL_SERIAL << 0)) # config.pck schema version number -DATA_FILE_VERSION = 91 +DATA_FILE_VERSION = 92 # qfile/*.db schema version number QFILE_SCHEMA_VERSION = 3 diff --git a/Mailman/versions.py b/Mailman/versions.py index 02a16e7e..2faee667 100644 --- a/Mailman/versions.py +++ b/Mailman/versions.py @@ -400,6 +400,8 @@ def NewVars(l): add_only_if_missing('filter_filename_extensions', mm_cfg.DEFAULT_FILTER_FILENAME_EXTENSIONS) add_only_if_missing('pass_filename_extensions', []) + # automatic discard + add_only_if_missing('max_days_to_hold', 0) diff --git a/cron/checkdbs b/cron/checkdbs index 1c867c53..e2b2ebfd 100755 --- a/cron/checkdbs +++ b/cron/checkdbs @@ -52,6 +52,8 @@ PROGRAM = sys.argv[0] _ = i18n._ i18n.set_language(mm_cfg.DEFAULT_SERVER_LANGUAGE) +now = time.time() + def usage(code, msg=''): @@ -99,16 +101,24 @@ def main(): if count: i18n.set_language(mlist.preferred_language) realname = mlist.real_name - text = Utils.maketext( - 'checkdbs.txt', - {'count' : count, - 'host_name': mlist.host_name, - 'adminDB' : mlist.GetScriptURL('admindb', absolute=1), - 'real_name': realname, - }, mlist=mlist) - text += '\n' + pending_requests(mlist) + discarded = auto_discard(mlist) + if discarded: + count = count - discarded + text = _( + 'Notice: %(discarded)d old request(s) automatically expired.\n\n') + else: + text = '' + if count: + text += Utils.maketext( + 'checkdbs.txt', + {'count' : count, + 'host_name': mlist.host_name, + 'adminDB' : mlist.GetScriptURL('admindb', absolute=1), + 'real_name': realname, + }, mlist=mlist) + text += '\n' + pending_requests(mlist) subject = _( - '%(count)d %(realname)s moderator request(s) waiting') + '%(realname)s moderator requests notice') msg = Message.UserNotification(mlist.GetOwnerEmail(), mlist.GetBouncesEmail(), subject, text, @@ -121,6 +131,7 @@ def main(): def pending_requests(mlist): + lcset = Utils.GetCharSet(mlist.preferred_language) # Must return a byte string lcset = Utils.GetCharSet(mlist.preferred_language) pending = [] @@ -172,6 +183,18 @@ Cause: %(reason)s""")) utext = unicode(text, incodec, 'replace') return utext.encode(outcodec, 'replace') +def auto_discard(mlist): + # Discard old held messages + discard_count = 0 + expire = mlist.max_days_to_hold * 86400 # days + heldmsgs = mlist.GetHeldMessageIds() + if expire and len(heldmsgs): + for id in heldmsgs: + if now - mlist.GetRecord(id)[0] > expire: + mlist.HandleRequest(id, mm_cfg.DISCARD) + discard_count += 1 + mlist.Save() + return discard_count if __name__ == '__main__': |