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))
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()
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()
def has_data(self): return EventSeries.has_rows()
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})'