def on_post(self, request, response): try: validator = Validator(send=as_boolean, bump=as_boolean, periodic=as_boolean, _optional=('send', 'bump', 'periodic')) values = validator(request) except ValueError as error: bad_request(response, str(error)) return if values.get('send', False) and values.get('periodic', False): # Send and periodic and mutually exclusive options. bad_request(response, 'send and periodic options are mutually exclusive') return if len(values) == 0: # There's nothing to do, but that's okay. okay(response) return if values.get('bump', False): bump_digest_number_and_volume(self._mlist) if values.get('send', False): maybe_send_digest_now(self._mlist, force=True) if values.get('periodic', False) and self._mlist.digest_send_periodic: maybe_send_digest_now(self._mlist, force=True) accepted(response)
def digests(ctx, list_ids, send, bump, dry_run, verbose, periodic): # send and periodic options are mutually exclusive, if they both are # specified, exit. if send and periodic: print(_('--send and --periodic flags cannot be used together'), file=sys.stderr) exit(1) list_manager = getUtility(IListManager) if list_ids: lists = [] for spec in list_ids: # We'll accept list-ids or fqdn list names. if '@' in spec: mlist = list_manager.get(spec) else: mlist = list_manager.get_by_list_id(spec) if mlist is None: print(_('No such list found: $spec'), file=sys.stderr) else: lists.append(mlist) else: lists = list(list_manager.mailing_lists) if bump: for mlist in lists: if verbose: print( _('\ $mlist.list_id is at volume $mlist.volume, number \ ${mlist.next_digest_number}')) if not dry_run: bump_digest_number_and_volume(mlist) if verbose: print( _('\ $mlist.list_id bumped to volume $mlist.volume, number \ ${mlist.next_digest_number}')) if send: for mlist in lists: if verbose: print( _('\ $mlist.list_id sent volume $mlist.volume, number ${mlist.next_digest_number}')) if not dry_run: maybe_send_digest_now(mlist, force=True) if periodic: for mlist in lists: if mlist.digest_send_periodic: if verbose: print( _('\ $mlist.list_id sent volume $mlist.volume, number ${mlist.next_digest_number}')) if not dry_run: maybe_send_digest_now(mlist, force=True)
def process(self, mlist, msg, msgdata): """See `IHandler`.""" # Short-circuit if digests are not enabled or if this message already # is a digest. if not mlist.digests_enabled or msgdata.get('isdigest'): return # Open the mailbox that will be used to collect the current digest. mailbox_path = os.path.join(mlist.data_path, 'digest.mmdf') # Lock the mailbox and append the message. with Mailbox(mailbox_path, create=True) as mbox: mbox.add(msg) maybe_send_digest_now(mlist)
def test_dont_send_digest_under_threshold(self): # Put a few messages in the digest. self._to_digest(3) # Set the size threshold high enough to not trigger a send. self._mlist.digest_size_threshold = 100 maybe_send_digest_now(self._mlist) self._runner.run() # A digest is still being collected, but none have been sent. get_queue_messages('digest', expected_count=0) self.assertGreater(os.path.getsize(self._mailbox_path), 0) self.assertLess(os.path.getsize(self._mailbox_path), 100 * 1024.0) get_queue_messages('virgin', expected_count=0)
def test_send_digest_over_threshold(self): # Put a few messages in the digest. self._to_digest(3) # Set the size threshold low enough to trigger a send. self._mlist.digest_size_threshold = 0.1 maybe_send_digest_now(self._mlist) self._runner.run() # There are no digests in flight now, and a single digest message has # been sent. get_queue_messages('digest', expected_count=0) self.assertFalse(os.path.exists(self._mailbox_path)) items = get_queue_messages('virgin', expected_count=1) digest_contents = str(items[0].msg) self.assertIn('Subject: message 1', digest_contents) self.assertIn('Subject: message 2', digest_contents)
def on_post(self, request, response): try: validator = Validator(send=as_boolean, bump=as_boolean, _optional=('send', 'bump')) values = validator(request) except ValueError as error: bad_request(response, str(error)) return if len(values) == 0: # There's nothing to do, but that's okay. okay(response) return if values.get('bump', False): bump_digest_number_and_volume(self._mlist) if values.get('send', False): maybe_send_digest_now(self._mlist, force=True) accepted(response)
def on_post(self, request, response): try: validator = Validator( send=as_boolean, bump=as_boolean, _optional=('send', 'bump')) values = validator(request) except ValueError as error: bad_request(response, str(error)) return if len(values) == 0: # There's nothing to do, but that's okay. okay(response) return if values.get('bump', False): bump_digest_number_and_volume(self._mlist) if values.get('send', False): maybe_send_digest_now(self._mlist, force=True) accepted(response)
def process(self, args): """See `ICLISubCommand`.""" list_manager = getUtility(IListManager) if args.lists: lists = [] for spec in args.lists: # We'll accept list-ids or fqdn list names. if '@' in spec: mlist = list_manager.get(spec) else: mlist = list_manager.get_by_list_id(spec) if mlist is None: print(_('No such list found: $spec'), file=sys.stderr) else: lists.append(mlist) else: lists = list(list_manager.mailing_lists) if args.bump: for mlist in lists: if args.verbose: print( _('\ $mlist.list_id is at volume $mlist.volume, number \ ${mlist.next_digest_number}')) if not args.dry_run: bump_digest_number_and_volume(mlist) if args.verbose: print( _('\ $mlist.list_id bumped to volume $mlist.volume, number \ ${mlist.next_digest_number}')) if args.send: for mlist in lists: if args.verbose: print( _('\ $mlist.list_id sent volume $mlist.volume, number ${mlist.next_digest_number}')) if not args.dry_run: maybe_send_digest_now(mlist, force=True)
def digests(ctx, list_ids, send, bump, dry_run, verbose): list_manager = getUtility(IListManager) if list_ids: lists = [] for spec in list_ids: # We'll accept list-ids or fqdn list names. if '@' in spec: mlist = list_manager.get(spec) else: mlist = list_manager.get_by_list_id(spec) if mlist is None: print(_('No such list found: $spec'), file=sys.stderr) else: lists.append(mlist) else: lists = list(list_manager.mailing_lists) if bump: for mlist in lists: if verbose: print( _('\ $mlist.list_id is at volume $mlist.volume, number \ ${mlist.next_digest_number}')) if not dry_run: bump_digest_number_and_volume(mlist) if verbose: print( _('\ $mlist.list_id bumped to volume $mlist.volume, number \ ${mlist.next_digest_number}')) if send: for mlist in lists: if verbose: print( _('\ $mlist.list_id sent volume $mlist.volume, number ${mlist.next_digest_number}')) if not dry_run: maybe_send_digest_now(mlist, force=True)
def process(self, args): """See `ICLISubCommand`.""" list_manager = getUtility(IListManager) if args.lists: lists = [] for spec in args.lists: # We'll accept list-ids or fqdn list names. if '@' in spec: mlist = list_manager.get(spec) else: mlist = list_manager.get_by_list_id(spec) if mlist is None: print(_('No such list found: $spec'), file=sys.stderr) else: lists.append(mlist) else: lists = list(list_manager.mailing_lists) if args.bump: for mlist in lists: if args.verbose: print(_('\ $mlist.list_id is at volume $mlist.volume, number \ ${mlist.next_digest_number}')) if not args.dry_run: bump_digest_number_and_volume(mlist) if args.verbose: print(_('\ $mlist.list_id bumped to volume $mlist.volume, number \ ${mlist.next_digest_number}')) if args.send: for mlist in lists: if args.verbose: print(_('\ $mlist.list_id sent volume $mlist.volume, number ${mlist.next_digest_number}')) if not args.dry_run: maybe_send_digest_now(mlist, force=True)