Exemplo n.º 1
0
 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))
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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
Exemplo n.º 7
0
 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))
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
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()
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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)
Exemplo n.º 14
0
 def _checkParams(self, params):
     RHRemindersBase._checkParams(self, params)
     self.reminder = EventReminder.get_one(request.view_args['reminder_id'])
Exemplo n.º 15
0
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})
Exemplo n.º 16
0
 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))
Exemplo n.º 17
0
 def _checkParams(self, params):
     RHRemindersBase._checkParams(self, params)
     self.reminder = EventReminder.find_one(id=request.view_args['id'], event_id=int(self.event.id))
Exemplo n.º 18
0
 def _checkParams(self, params):
     RHRemindersBase._checkParams(self, params)
     self.reminder = EventReminder.get_one(request.view_args["reminder_id"])
Exemplo n.º 19
0
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()
Exemplo n.º 20
0
 def _checkParams(self, params):
     RHRemindersBase._checkParams(self, params)
     self.reminder = EventReminder.find_one(id=request.view_args['id'])
Exemplo n.º 21
0
 def _process_args(self):
     RHRemindersBase._process_args(self)
     self.reminder = EventReminder.get_or_404(
         request.view_args['reminder_id'])
Exemplo n.º 22
0
 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))
Exemplo n.º 23
0
 def _process_args(self):
     RHRemindersBase._process_args(self)
     self.reminder = EventReminder.get_one(request.view_args['reminder_id'])
Exemplo n.º 24
0
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})
Exemplo n.º 25
0
 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)
Exemplo n.º 26
0
def _event_deleted(event, **kwargs):
    from indico.modules.events.reminders.models.reminders import EventReminder
    EventReminder.find(event_id=int(event.id)).delete()