Esempio n. 1
0
    def _create_series(self, data):
        @materialize_iterable(dict)
        def _copy_person_link_data(link_data):
            # Copy person link data since we would otherwise end up
            # adding the EventPersons of the first event in all other
            # events of the series.
            for link, submitter in link_data.iteritems():
                link_copy = EventPersonLink(
                    **{
                        col: getattr(link, col)
                        for col in get_simple_column_attrs(EventPersonLink)
                    })
                link_copy.person = EventPerson(
                    **{
                        col: getattr(link.person, col)
                        for col in get_simple_column_attrs(EventPerson)
                    })
                link_copy.person.user = link.person.user
                yield link_copy, submitter

        occurrences = data.pop('occurrences')
        if len(occurrences) > 1:
            data['series'] = EventSeries()
        for occ in occurrences:
            start_dt = occ[0]
            end_dt = start_dt + occ[1]
            yield self._create_event(
                dict(data,
                     person_link_data=_copy_person_link_data(
                         data['person_link_data']),
                     start_dt=start_dt,
                     end_dt=end_dt))
Esempio n. 2
0
 def migrate_event_series(self):
     self.print_step("Migrating event series")
     all_series = self.get_event_series()
     all_series_ids = set(chain.from_iterable(all_series))
     events = {
         e.id: e
         for e in Event.find(Event.id.in_(all_series_ids)).options(
             load_only('id', 'series_id'))
     }
     for series in committing_iterator(
             verbose_iterator(all_series, len(all_series), lambda x: 0,
                              lambda x: '')):
         series &= events.viewkeys()
         if len(series) < 2:
             self.print_warning('Skipping single-event series: {}'.format(
                 sorted(series)))
             continue
         es = EventSeries(show_sequence_in_title=False)
         for id_ in series:
             events[id_].series = es
         if not self.quiet:
             self.print_success(repr(series))
     AttachmentFolder.find(
         AttachmentFolder.title.op('~')('^part\d+$')).update(
             {AttachmentFolder.is_deleted: True}, synchronize_session=False)
     db.session.commit()
Esempio n. 3
0
 def migrate(self):
     all_series = self.get_event_series()
     all_series_ids = set(chain.from_iterable(all_series))
     events = {e.id: e for e in Event.find(Event.id.in_(all_series_ids)).options(load_only('id', 'series_id'))}
     for series in all_series:
         series &= set(events)
         if len(series) < 2:
             self.print_warning('Skipping single-event series: {}'.format(sorted(series)))
             continue
         es = EventSeries(show_sequence_in_title=False)
         for id_ in series:
             events[id_].series = es
         if not self.quiet:
             self.print_success(repr(series))
     (AttachmentFolder.query
      .filter(AttachmentFolder.title.op('~')('^part\d+$'))
      .update({AttachmentFolder.is_deleted: True}, synchronize_session=False))
     db.session.commit()
Esempio n. 4
0
 def has_data(self):
     return EventSeries.has_rows()
Esempio n. 5
0
        click.secho('Events not found:', fg='red', bold=True)
        for event_id in missing:
            click.echo(f'- {event_id}')
        sys.exit(1)
    elif conflict := [e for e in events if e.series]:
        click.secho('Events already assigned to a series:',
                    fg='red',
                    bold=True)
        for event in conflict:
            click.echo(format_event(event))
        sys.exit(1)

    click.echo('Selected events:')
    for event in events:
        click.echo(format_event(event))

    click.confirm('Create series?', default=True, abort=True)

    series = EventSeries(events=events,
                         show_sequence_in_title=show_sequence_in_title,
                         show_links=show_links)
    db.session.commit()

    click.secho(f'Series successfully created (id={series.id}).',
                fg='green',
                bold=True)


def format_event(event):
    return f'- {event.id}: [{event.start_dt_local.date()}] {event.title} ({event.external_url})'
Esempio n. 6
0
 def has_data(self):
     return EventSeries.has_rows()