def notify_instant(self, ob, user_id, ob_edited=False): """ send instant notifications because object `ob` was changed by the user `user_id` """ notif_logger.info('Instant notifications on %r', ofs_path(ob)) if not self.config['enable_instant']: return messages_by_email = {} for subscription in fetch_subscriptions(ob, inherit=True): if not subscription.check_permission(ob): continue if subscription.notif_type != 'instant': continue email = subscription.get_email(ob) if email is None: continue notif_logger.info('.. sending notification to %r', email) messages_by_email[email] = { 'ob': ob, 'ob_edited': ob_edited, 'person': user_id, '_lang': subscription.lang, 'subscription': subscription, } template = self._get_template('instant') self._send_notifications(messages_by_email, template)
def _cron_heartbeat(self, when): transaction.commit() # commit earlier stuff; fresh transaction transaction.get().note('notifications cron at %s' % ofs_path(self)) ### daily newsletter ### if self.config['enable_daily']: # calculate the most recent daily newsletter time daily_time = time(hour=self.config['daily_hour']) latest_daily = datetime.combine(when.date(), daily_time) if latest_daily > when: latest_daily -= timedelta(days=1) # check if we should send a daily newsletter prev_daily = self.timestamps.get('daily', when - timedelta(days=1)) if prev_daily < latest_daily < when: self._send_newsletter('daily', prev_daily, when) self.timestamps['daily'] = when ### weekly newsletter ### if self.config['enable_weekly']: # calculate the most recent weekly newsletter time weekly_time = time(hour=self.config['daily_hour']) t = datetime.combine(when.date(), weekly_time) days_delta = self.config['weekly_day'] - t.isoweekday() latest_weekly = t + timedelta(days=days_delta) if latest_weekly > when: latest_weekly -= timedelta(weeks=1) # check if we should send a weekly newsletter prev_weekly = self.timestamps.get('weekly', when - timedelta(weeks=1)) if prev_weekly < latest_weekly < when: self._send_newsletter('weekly', prev_weekly, when) self.timestamps['weekly'] = when ### monthly newsletter ### if self.config['enable_monthly']: # calculate the most recent monthly newsletter time monthly_time = time(hour=self.config['monthly_hour']) the_day = set_day_of_month(when.date(), self.config['monthly_day']) latest_monthly = datetime.combine(the_day, monthly_time) if latest_monthly > when: latest_monthly = minus_one_month(latest_monthly) # check if we should send a monthly newsletter prev_monthly = self.timestamps.get('monthly', minus_one_month(when)) if prev_monthly < latest_monthly < when: self._send_newsletter('monthly', prev_monthly, when) self.timestamps['monthly'] = when transaction.commit() # make sure our timestamp updates are saved
def _send_newsletter(self, notif_type, when_start, when_end): """ Send notifications for the period between `when_start` and `when_end` using the `notif_type` template """ notif_logger.info('Notifications newsletter on site %r, type %r, ' 'from %r to %r', ofs_path(self.getSite()), notif_type, when_start, when_end) objects_by_email = {} langs_by_email = {} subscriptions_by_email = {} for ob in list_modified_objects(self.getSite(), when_start, when_end): notif_logger.info('.. modified object: %r', ofs_path(ob)) for subscription in fetch_subscriptions(ob, inherit=True): if subscription.notif_type != notif_type: continue if not subscription.check_permission(ob): continue email = subscription.get_email(ob) if email is None: continue notif_logger.info('.. .. sending notification to %r', email) objects_by_email.setdefault(email, []).append({'ob': ob}) langs_by_email[email] = subscription.lang subscriptions_by_email[email] = subscription messages_by_email = {} for email in objects_by_email: messages_by_email[email] = { 'objs': objects_by_email[email], '_lang': langs_by_email[email], 'subscription': subscriptions_by_email[email], } template = self._get_template(notif_type) self._send_notifications(messages_by_email, template)
def feedUpdateSubscriber(site, hb): if cooldown('remote channels %r' % ofs_path(site), timedelta(hours=6)): return site.updateRemoteChannels(site.get_site_uid())