diff options
| author | Barry Warsaw | 2015-12-22 14:54:46 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2015-12-22 14:54:46 -0500 |
| commit | c9464cb64f434749fee21e5ebbb15ce3f2fc1691 (patch) | |
| tree | 9b93f9abe3e253210ba0249f284db85c0ee6b914 /src/mailman/handlers | |
| parent | 8e24476848de89302d9b0a8ea91116288201a95d (diff) | |
| download | mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.tar.gz mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.tar.zst mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.zip | |
Refactor bump_digest_number_and_volume() and maybe_send_digest_now() into
their own module inside the mailman.app package. With the latter, remove the
"all lists" functionality and require the mlist argument. We'll handle the
"all lists" use case higher up the stack.
Also, rename the send-digests handler digests since we'll next add the bump
functionality.
Diffstat (limited to 'src/mailman/handlers')
| -rw-r--r-- | src/mailman/handlers/to_digest.py | 101 |
1 files changed, 1 insertions, 100 deletions
diff --git a/src/mailman/handlers/to_digest.py b/src/mailman/handlers/to_digest.py index 1b1ed84f1..fa43de030 100644 --- a/src/mailman/handlers/to_digest.py +++ b/src/mailman/handlers/to_digest.py @@ -19,22 +19,15 @@ __all__ = [ 'ToDigest', - 'bump_digest_number_and_volume', - 'maybe_send_digest_now', ] import os -from mailman.config import config +from mailman.app.digests import maybe_send_digest_now from mailman.core.i18n import _ -from mailman.email.message import Message -from mailman.interfaces.digests import DigestFrequency from mailman.interfaces.handler import IHandler -from mailman.interfaces.listmanager import IListManager -from mailman.utilities.datetime import now as right_now from mailman.utilities.mailbox import Mailbox -from zope.component import getUtility from zope.interface import implementer @@ -58,95 +51,3 @@ class ToDigest: with Mailbox(mailbox_path, create=True) as mbox: mbox.add(msg) maybe_send_digest_now(mlist) - - - -def bump_digest_number_and_volume(mlist): - """Bump the digest number and volume.""" - now = right_now() - if mlist.digest_last_sent_at is None: - # There has been no previous digest. - bump = False - elif mlist.digest_volume_frequency == DigestFrequency.yearly: - bump = (now.year > mlist.digest_last_sent_at.year) - elif mlist.digest_volume_frequency == DigestFrequency.monthly: - # Monthly. - this_month = now.year * 100 + now.month - digest_month = (mlist.digest_last_sent_at.year * 100 + - mlist.digest_last_sent_at.month) - bump = (this_month > digest_month) - elif mlist.digest_volume_frequency == DigestFrequency.quarterly: - # Quarterly. - this_quarter = now.year * 100 + (now.month - 1) // 4 - digest_quarter = (mlist.digest_last_sent_at.year * 100 + - (mlist.digest_last_sent_at.month - 1) // 4) - bump = (this_quarter > digest_quarter) - elif mlist.digest_volume_frequency == DigestFrequency.weekly: - this_week = now.year * 100 + now.isocalendar()[1] - digest_week = (mlist.digest_last_sent_at.year * 100 + - mlist.digest_last_sent_at.isocalendar()[1]) - bump = (this_week > digest_week) - elif mlist.digest_volume_frequency == DigestFrequency.daily: - bump = (now.toordinal() > mlist.digest_last_sent_at.toordinal()) - else: - raise AssertionError( - 'Bad DigestFrequency: {0}'.format( - mlist.digest_volume_frequency)) - if bump: - mlist.volume += 1 - mlist.next_digest_number = 1 - else: - # Just bump the digest number. - mlist.next_digest_number += 1 - mlist.digest_last_sent_at = now - - - -def maybe_send_digest_now(mlist=None, force=False): - """Send this mailing list's digest now. - - If there are any messages in this mailing list's digest, the - digest is sent immediately, regardless of whether the size - threshold has been met. When called through the subcommand - `mailman send_digest` the value of .digest_send_periodic is - consulted. - - :param mlist: The mailing list whose digest should be sent. If this is - None, all mailing lists with non-zero sized digests will have theirs - sent immediately. - :type mlist: IMailingList or None - :param force: Should the digest be sent even if the size threshold hasn't - been met? - :type force: boolean - """ - if mlist is None: - digestable_lists = getUtility(IListManager).mailing_lists - else: - digestable_lists = [mlist] - for mailing_list in digestable_lists: - mailbox_path = os.path.join(mailing_list.data_path, 'digest.mmdf') - # Calculate the current size of the mailbox file. This will not tell - # us exactly how big the resulting MIME and rfc1153 digest will - # actually be, but it's the most easily available metric to decide - # whether the size threshold has been reached. - size = os.path.getsize(mailbox_path) - if (size >= mailing_list.digest_size_threshold * 1024.0 or - (force and size > 0)): - # Send the digest. Because we don't want to hold up this process - # with crafting the digest, we're going to move the digest file to - # a safe place, then craft a fake message for the DigestRunner as - # a trigger for it to build and send the digest. - mailbox_dest = os.path.join( - mailing_list.data_path, - 'digest.{0.volume}.{0.next_digest_number}.mmdf'.format( - mailing_list)) - volume = mailing_list.volume - digest_number = mailing_list.next_digest_number - bump_digest_number_and_volume(mailing_list) - os.rename(mailbox_path, mailbox_dest) - config.switchboards['digest'].enqueue( - Message(), - listid=mailing_list.list_id, - digest_path=mailbox_dest, - volume=volume, - digest_number=digest_number) |
