def clone(self, new_event, options): from indico.modules.events.reminders.models.reminders import EventReminder if 'reminders' not in options: return attrs = get_simple_column_attrs(EventReminder) - { 'created_dt', 'scheduled_dt', 'is_sent' } attrs |= {'creator_id'} for old_reminder in self.find_reminders(): scheduled_dt = new_event.getStartDate( ) - old_reminder.event_start_delta # Skip anything that's would have been sent on a past date. # We ignore the time on purpose so cloning an event shortly before will # still trigger a reminder that's just a few hours overdue. if scheduled_dt.date() < now_utc().date(): logger.info( 'Not cloning reminder {} which would trigger at {}'.format( old_reminder, scheduled_dt)) continue reminder = EventReminder( event=new_event, **{attr: getattr(old_reminder, attr) for attr in attrs}) reminder.scheduled_dt = scheduled_dt db.session.add(reminder) db.session.flush() logger.info( 'Added reminder during event cloning: {}'.format(reminder))
def migrate(self): for alarm in self.conf.alarmList.itervalues(): if not getattr(alarm, 'startDateTime', None): self.print_error('Alarm has no start time') continue start_dt = self._naive_to_aware(alarm.startDateTime).replace(second=0, microsecond=0) if not hasattr(alarm, 'status'): # Those ancient alarms can be safely assumed to be sent is_sent = True else: is_sent = alarm.status not in {1, 2} # not spooled/queued is_overdue = False if not is_sent and start_dt < ALARM_SENT_THRESHOLD: is_sent = True is_overdue = True recipients = filter(None, {convert_to_unicode(x).strip().lower() for x in alarm.toAddr}) reminder = EventReminder(event=self.event, creator=self.system_user, created_dt=alarm.createdOn, scheduled_dt=start_dt, is_sent=is_sent, event_start_delta=getattr(alarm, '_relative', None), recipients=recipients, send_to_participants=alarm.toAllParticipants, include_summary=alarm.confSumary, reply_to_address=convert_to_unicode(alarm.fromAddr).strip().lower(), message=convert_to_unicode(alarm.note).strip()) db.session.add(reminder) status = ('%[red!]OVERDUE%[reset]' if is_overdue else '%[green!]SENT%[reset]' if is_sent else '%[yellow]PENDING%[reset]') self.print_success('%[cyan]{}%[reset] {}'.format(reminder.scheduled_dt, status))
def send_event_reminders(): reminders = EventReminder.find_all(~EventReminder.is_sent, ~Event.is_deleted, EventReminder.scheduled_dt <= now_utc(), _join=EventReminder.event) for reminder in reminders: logger.info('Sending event reminder: %s', reminder) reminder.send() db.session.commit()
def _process(self): reminders = EventReminder.find(event_id=self.event.id).order_by( EventReminder.scheduled_dt.desc()).all() tz = get_timezone(DisplayTZ(conf=self.event).getDisplayTZ()) return WPReminders.render_template('reminders.html', self.event, event=self.event, reminders=reminders, timezone=tz)
def _event_data_changed(event, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder query = EventReminder.find(EventReminder.event_id == int(event.id), EventReminder.is_relative, ~EventReminder.is_sent) for reminder in query: new_dt = event.getStartDate() - reminder.event_start_delta if reminder.scheduled_dt != new_dt: logger.info('Changing start time of {} to {}'.format(reminder, new_dt)) reminder.scheduled_dt = new_dt
def clone(self, new_event, options): from indico.modules.events.reminders.models.reminders import EventReminder if 'reminders' not in options: return attrs = get_simple_column_attrs(EventReminder) - {'created_dt', 'scheduled_dt', 'is_sent'} attrs |= {'creator_id'} for old_reminder in self.find_reminders(): scheduled_dt = new_event.getStartDate() - old_reminder.event_start_delta # Skip anything that's would have been sent on a past date. # We ignore the time on purpose so cloning an event shortly before will # still trigger a reminder that's just a few hours overdue. if scheduled_dt.date() < now_utc().date(): logger.info('Not cloning reminder {} which would trigger at {}'.format(old_reminder, scheduled_dt)) continue reminder = EventReminder(event=new_event, **{attr: getattr(old_reminder, attr) for attr in attrs}) reminder.scheduled_dt = scheduled_dt db.session.add(reminder) db.session.flush() logger.info('Added reminder during event cloning: {}'.format(reminder))
def _event_data_changed(event, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder query = EventReminder.find(EventReminder.event_id == int(event.id), EventReminder.is_relative, ~EventReminder.is_sent) for reminder in query: new_dt = event.getStartDate() - reminder.event_start_delta if reminder.scheduled_dt != new_dt: logger.info('Changing start time of {} to {}'.format( reminder, new_dt)) reminder.scheduled_dt = new_dt
def send_event_reminders(): reminders = EventReminder.find_all(~EventReminder.is_sent, EventReminder.scheduled_dt <= now_utc()) try: for reminder in reminders: logger.info('Sending event reminder: {}'.format(reminder)) reminder.send() finally: # If we fail at any point during the loop, we'll still commit # the is_sent change for already-sent reminders instead of # sending them over and over and thus spamming people. db.session.commit() DBMgr.getInstance().commit() # only needed for event email logs
def migrate_event_alarms(self): print cformat('%{white!}migrating event alarms/reminders') sent_threshold = now_utc() - timedelta(days=1) for event, alarm in committing_iterator(self._iter_alarms()): if is_legacy_id(event.id): print cformat( '%{red!}!!!%{reset} ' '%{white!}{:6s}%{reset} %{yellow!}Event has non-numeric/broken ID' ).format(event.id) continue elif not alarm.startDateTime: print cformat( '%{red!}!!!%{reset} ' '%{white!}{:6s}%{reset} %{yellow!}Alarm has no start time' ).format(event.id) continue start_dt = self._dt_with_tz(alarm.startDateTime).replace( second=0, microsecond=0) if not hasattr(alarm, 'status'): # Those ancient alarms can be safely assumed to be sent is_sent = True else: is_sent = alarm.status not in {1, 2} # not spooled/queued is_overdue = False if not is_sent and start_dt < sent_threshold: is_sent = True is_overdue = True recipients = filter( None, {convert_to_unicode(x).strip().lower() for x in alarm.toAddr}) reminder = EventReminder( event_id=int(event.id), creator_id=Config.getInstance().getJanitorUserId(), created_dt=alarm.createdOn, scheduled_dt=start_dt, is_sent=is_sent, event_start_delta=getattr(alarm, '_relative', None), recipients=recipients, send_to_participants=alarm.toAllParticipants, include_summary=alarm.confSumary, reply_to_address=convert_to_unicode( alarm.fromAddr).strip().lower(), message=convert_to_unicode(alarm.note).strip()) db.session.add(reminder) status = (cformat('%{red!}OVERDUE%{reset}') if is_overdue else cformat('%{green!}SENT%{reset}') if is_sent else cformat('%{yellow}PENDING%{reset}')) print cformat( '%{green}+++%{reset} ' '%{white!}{:6s}%{reset} %{cyan}{}%{reset} {}').format( event.id, reminder.scheduled_dt, status)
def send_event_reminders(): reminders = EventReminder.find_all(~EventReminder.is_sent, ~Event.is_deleted, EventReminder.scheduled_dt <= now_utc(), _join=EventReminder.event_new) try: for reminder in reminders: logger.info('Sending event reminder: %s', reminder) reminder.send() finally: # If we fail at any point during the loop, we'll still commit # the is_sent change for already-sent reminders instead of # sending them over and over and thus spamming people. db.session.commit()
def _process(self): form = ReminderForm(event=self.event, schedule_type='relative', attach_ical=True) if form.validate_on_submit(): reminder = EventReminder(creator=session.user, event=self.event) form.populate_obj(reminder, existing_only=True) db.session.add(reminder) db.session.flush() if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder created by %s: %s', session.user, reminder) flash(_('A reminder at {} has been created.') .format(format_datetime(reminder.scheduled_dt)), 'success') return jsonify_data(flash=False) return jsonify_template('events/reminders/edit_reminder.html', event=self.event, reminder=None, form=form)
def _process(self): form = ReminderForm(event=self.event, schedule_type='relative') if form.validate_on_submit(): reminder = EventReminder(creator=session.user, event=self.event) form.populate_obj(reminder, existing_only=True) db.session.add(reminder) db.session.flush() if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder created by %s: %s', session.user, reminder) flash( _("A reminder at {} has been created.").format( format_datetime(reminder.scheduled_dt)), 'success') return redirect(url_for('.list', self.event)) return WPReminders.render_template( 'edit_reminder.html', self.event, event=self.event, reminder=None, form=form, widget_attrs=form.default_widget_attrs)
def _checkParams(self, params): RHRemindersBase._checkParams(self, params) self.reminder = EventReminder.get_one(request.view_args['reminder_id'])
def _merge_users(target, source, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder EventReminder.find(creator_id=source.id).update({EventReminder.creator_id: target.id})
def find_reminders(self): from indico.modules.events.reminders.models.reminders import EventReminder return EventReminder.find(EventReminder.is_relative, EventReminder.event_id == int(self.event.id))
def _checkParams(self, params): RHRemindersBase._checkParams(self, params) self.reminder = EventReminder.find_one(id=request.view_args['id'], event_id=int(self.event.id))
def _checkParams(self, params): RHRemindersBase._checkParams(self, params) self.reminder = EventReminder.get_one(request.view_args["reminder_id"])
def _event_deleted(event, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder if event.has_legacy_id: return EventReminder.find(event_id=int(event.id)).delete()
def _checkParams(self, params): RHRemindersBase._checkParams(self, params) self.reminder = EventReminder.find_one(id=request.view_args['id'])
def _process_args(self): RHRemindersBase._process_args(self) self.reminder = EventReminder.get_or_404( request.view_args['reminder_id'])
def _process_args(self): RHRemindersBase._process_args(self) self.reminder = EventReminder.get_one(request.view_args['reminder_id'])
def _merge_users(target, source, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder EventReminder.find(creator_id=source.id).update( {EventReminder.creator_id: target.id})
def _process(self): reminders = EventReminder.find(event_id=self.event.id).order_by(EventReminder.scheduled_dt.desc()).all() tz = get_timezone(DisplayTZ(conf=self.event).getDisplayTZ()) return WPReminders.render_template('reminders.html', self.event, event=self.event, reminders=reminders, timezone=tz)
def _event_deleted(event, **kwargs): from indico.modules.events.reminders.models.reminders import EventReminder EventReminder.find(event_id=int(event.id)).delete()