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 get_event_series(self): self.legacy_event_mapping = {x.legacy_event_id: x.event_id for x in LegacyEventMapping.query} self.attachment_folders = defaultdict(set) folder_query = (AttachmentFolder.find(AttachmentFolder.linked_event_id.in_({e.id for e in self._events_query})) .filter(AttachmentFolder.title.op('~')('^part\d+$')) .options(joinedload('attachments'))) for af in folder_query: self.attachment_folders[af.linked_event_id].add(af) series_list = [] series_map = {} for event in self._events_query: series_ids = {event.id} | set(self._extract_event_ids(event)) series = filter(None, (series_map.get(id_) for id_ in series_ids)) if not series: series_list.append(series_ids) for id_ in series_ids: series_map[id_] = series_ids else: assert len(set(map(frozenset, series))) == 1 if series[0] != series_ids: self.print_warning('Inconsistent series found; merging them', event_id=event.id) self.print_warning('Series IDs: {}'.format(sorted(series[0])), event_id=event.id) self.print_warning('Reachable IDs: {}'.format(sorted(series_ids)), event_id=event.id) series[0] |= series_ids for id_ in series_ids: series_map[id_] = series_ids return series_list
def _folder_from_material(self, material, linked_object): folder = AttachmentFolder(title=convert_to_unicode(material.title).strip() or 'Material', description=convert_to_unicode(material.description), object=linked_object, is_always_visible=not getattr(material._Material__ac, '_hideFromUnauthorizedUsers', False)) self.protection_from_ac(folder, material._Material__ac) return folder
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 test_remove_principal(dummy_user, dummy_event): folder = AttachmentFolder(object=dummy_event, is_default=True) assert not folder.acl_entries entry = folder.update_principal(dummy_user, read_access=True) assert folder.acl_entries == {entry} folder.remove_principal(dummy_user) assert not folder.acl_entries # doesn't do anything but must not fail either folder.remove_principal(dummy_user) assert not folder.acl_entries
def test_update_principal(dummy_user, dummy_event): folder = AttachmentFolder(object=dummy_event, is_default=True) assert not folder.acl_entries # not changing anything -> shouldn't be added to acl entry = folder.update_principal(dummy_user) assert entry is None assert not folder.acl_entries # adding user with read access -> new acl entry since the user isn't in there yet entry = initial_entry = folder.update_principal(dummy_user, read_access=True) assert folder.acl_entries == {entry} # not changing anything on existing principal -> shouldn't modify acl entry = folder.update_principal(dummy_user) assert entry is initial_entry assert folder.acl_entries == {entry} # granting permission which is already present -> shouldn't modify acl entry = folder.update_principal(dummy_user, read_access=True) assert entry is initial_entry assert folder.acl_entries == {entry} # removing read access -> acl entry is removed entry = folder.update_principal(dummy_user, read_access=False) assert entry is None assert not folder.acl_entries