def test_deleted_relationships(db, dummy_event): event = dummy_event assert not event.contributions assert not event.sessions s = Session(event=event, title='s') sd = Session(event=event, title='sd', is_deleted=True) c = Contribution(event=event, title='c', session=sd, duration=timedelta(minutes=30)) cd = Contribution(event=event, title='cd', session=sd, duration=timedelta(minutes=30), is_deleted=True) sc = SubContribution(contribution=c, title='sc', duration=timedelta(minutes=10)) scd = SubContribution(contribution=c, title='scd', duration=timedelta(minutes=10), is_deleted=True) db.session.flush() db.session.expire_all() # reload all the objects from the db event = Event.get(event.id) s = Session.get(s.id) sd = Session.get(sd.id) c = Contribution.get(c.id) cd = Contribution.get(cd.id) sc = SubContribution.get(sc.id) scd = SubContribution.get(scd.id) # deleted items should not be in the lists assert event.sessions == [s] assert event.contributions == [c] assert sd.contributions == [c] assert c.subcontributions == [sc] # the other direction should work fine even in case of deletion assert s.event == event assert sd.event == event assert c.event == event assert cd.event == event assert sc.contribution == c assert scd.contribution == c
def test_acls(dummy_event, dummy_contribution, dummy_user, create_user, obj_type): from .schemas import ACLSchema class TestSchema(ACLSchema, mm.Schema): pass if obj_type == 'event': obj = dummy_event elif obj_type == 'contrib': obj = dummy_contribution elif obj_type == 'subcontrib': obj = SubContribution(contribution=dummy_contribution, title='Test', duration=timedelta(minutes=10)) elif obj_type == 'attachment': folder = AttachmentFolder(title='Dummy Folder', description='a dummy folder') obj = Attachment(folder=folder, user=dummy_user, title='Dummy Attachment', type=AttachmentType.link, link_url='https://example.com') obj.folder.object = dummy_event elif obj_type == 'note': obj = EventNote(object=dummy_event) obj.create_revision(RenderMode.html, 'this is a dummy note', dummy_user) def assert_acl(expected_read_acl): __tracebackhide__ = True data = schema.dump(obj) read_acl = data['_access'].pop('read', None) assert data == { '_access': { 'delete': ['IndicoAdmin'], 'owner': ['IndicoAdmin'], 'update': ['IndicoAdmin'] } } if read_acl is not None: read_acl = set(read_acl) assert read_acl == expected_read_acl schema = TestSchema() user = create_user(1, email='*****@*****.**') # everything is public assert_acl(None) # event is protected and the acl is empty (nobody has regular access) dummy_event.protection_mode = ProtectionMode.protected assert_acl({'IndicoAdmin'}) # user on the acl has access dummy_event.update_principal(user, read_access=True) assert_acl({'IndicoAdmin', 'User:1'})
def create_subcontribution(contrib, data): subcontrib = SubContribution() subcontrib.populate_from_dict(data) contrib.subcontributions.append(subcontrib) db.session.flush() signals.event.subcontribution_created.send(subcontrib) logger.info('Subcontribution %s created by %s', subcontrib, session.user) subcontrib.event_new.log(EventLogRealm.management, EventLogKind.positive, 'Subcontributions', 'Subcontribution "{}" has been created'.format(subcontrib.title), session.user) return subcontrib
def _clone_subcontribs(self, subcontribs): attrs = get_simple_column_attrs(SubContribution) for old_subcontrib in subcontribs: subcontrib = SubContribution() subcontrib.populate_from_attrs(old_subcontrib, attrs) subcontrib.references = list(self._clone_references(SubContributionReference, old_subcontrib.references)) subcontrib.person_links = list(self._clone_person_links(SubContributionPersonLink, old_subcontrib.person_links)) self._subcontrib_map[old_subcontrib] = subcontrib yield subcontrib
def _create_subcontribution(contribution, title, duration=timedelta(minutes=10), **kwargs): entry = SubContribution(contribution=contribution, title=title, duration=duration, **kwargs) db.session.add(entry) db.session.flush() return entry
def _migrate_subcontribution(self, old_contrib, old_subcontrib, position): subcontrib = SubContribution(position=position, friendly_id=position, duration=old_subcontrib.duration, title=convert_to_unicode(old_subcontrib.title), description=convert_to_unicode(old_subcontrib.description), render_mode=RenderMode.html) if not self.quiet: self.print_info(' %[cyan!]SubContribution%[reset] {}'.format(subcontrib.title)) self.event_ns.legacy_subcontribution_map[old_subcontrib] = subcontrib subcontrib.legacy_mapping = LegacySubContributionMapping(event_new=self.event, legacy_contribution_id=old_contrib.id, legacy_subcontribution_id=old_subcontrib.id) subcontrib.references = list(self._process_references(SubContributionReference, old_subcontrib)) subcontrib.person_links = list(self._migrate_subcontribution_person_links(old_subcontrib)) return subcontrib
def create_subcontribution(contrib, data): subcontrib = SubContribution() subcontrib.populate_from_dict(data) contrib.subcontributions.append(subcontrib) db.session.flush() signals.event.subcontribution_created.send(subcontrib) logger.info('Subcontribution %s created by %s', subcontrib, session.user) subcontrib.event.log( EventLogRealm.management, LogKind.positive, 'Subcontributions', f'Subcontribution "{subcontrib.title}" has been created', session.user, meta={'subcontribution_id': subcontrib.id}) return subcontrib
def test_access_speakers_subcontrib(dummy_contribution, dummy_user, dummy_event): set_feature_enabled(dummy_event, 'registration', True) menu_entry = MenuEntry(event=dummy_event, type=MenuEntryType.page, access=MenuEntryAccess.speakers) person = EventPerson.create_from_user(dummy_user, dummy_event) assert not menu_entry.can_access(dummy_user) subcontrib = SubContribution(contribution=dummy_contribution, title='sc', duration=timedelta(minutes=10)) subcontrib_person_link = SubContributionPersonLink(person=person) subcontrib.person_links.append(subcontrib_person_link) assert menu_entry.can_access(dummy_user) dummy_contribution.is_deleted = True assert not menu_entry.can_access(dummy_user) dummy_contribution.is_deleted = False subcontrib.is_deleted = True assert not menu_entry.can_access(dummy_user)
def test_dump_event_note(db, dummy_user, dummy_event, dummy_contribution, link_type): from .schemas import EventNoteRecordSchema if link_type == 'event': ids = {} note = EventNote(object=dummy_event) url = '/event/0/note/' elif link_type == 'contrib': ids = {'contribution_id': dummy_contribution.id} note = EventNote(object=dummy_contribution) url = f'/event/0/contributions/{dummy_contribution.id}/note/' elif link_type == 'subcontrib': subcontribution = SubContribution(contribution=dummy_contribution, title='Dummy Subcontribution', duration=timedelta(minutes=10)) db.session.flush() ids = { 'contribution_id': subcontribution.contribution_id, 'subcontribution_id': subcontribution.id, } note = EventNote(object=subcontribution) url = f'/event/0/contributions/{dummy_contribution.id}/subcontributions/{subcontribution.id}/note/' note.create_revision(RenderMode.html, 'this is a dummy <strong>note</strong>', dummy_user) db.session.flush() category_id = dummy_event.category_id schema = EventNoteRecordSchema(context={'schema': 'test-notes'}) assert schema.dump(note) == { '$schema': 'test-notes', '_access': { 'delete': ['IndicoAdmin'], 'owner': ['IndicoAdmin'], 'update': ['IndicoAdmin'], }, '_data': { 'content': 'this is a dummy note', 'site': 'http://localhost', 'title': note.object.title, 'persons': { 'name': 'Guinea Pig' } }, 'category_id': category_id, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'modified_dt': note.current_revision.created_dt.isoformat(), 'event_id': 0, 'note_id': note.id, 'type': 'event_note', 'url': f'http://localhost{url}', **ids }
def test_dump_subcontribution(db, dummy_user, dummy_event, dummy_contribution, create_entry, scheduled): from .schemas import SubContributionRecordSchema extra = {} if scheduled: create_entry(dummy_contribution, utc.localize(datetime(2020, 4, 20, 4, 20))) extra = { 'start_dt': dummy_contribution.start_dt.isoformat(), 'end_dt': dummy_contribution.end_dt.isoformat(), } subcontribution = SubContribution( contribution=dummy_contribution, title='Dummy Subcontribution', description='A dummy <strong>subcontribution</strong>', duration=timedelta(minutes=10)) person = EventPerson.create_from_user(dummy_user, dummy_event) subcontribution.person_links.append( SubContributionPersonLink(person=person)) db.session.flush() category_id = dummy_contribution.event.category_id schema = SubContributionRecordSchema( context={'schema': 'test-subcontribs'}) assert schema.dump(subcontribution) == { '$schema': 'test-subcontribs', '_access': { 'delete': ['IndicoAdmin'], 'owner': ['IndicoAdmin'], 'update': ['IndicoAdmin'], }, '_data': { 'description': 'A dummy subcontribution', 'location': { 'address': '', 'room_name': '', 'venue_name': '' }, 'persons': [{ 'name': 'Guinea Pig' }], 'site': 'http://localhost', 'title': 'Dummy Subcontribution', }, 'category_id': category_id, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'contribution_id': dummy_contribution.id, 'duration': 10, 'event_id': 0, 'subcontribution_id': subcontribution.id, 'type': 'subcontribution', 'url': f'http://localhost/event/0/contributions/{dummy_contribution.id}/subcontributions/{subcontribution.id}', **extra }
def test_dump_event_note(db, dummy_user, dummy_event, dummy_contribution, link_type): from indico.modules.search.schemas import EventNoteSchema if link_type == 'event': ids = {'contribution_id': None, 'subcontribution_id': None} note = EventNote(object=dummy_event) url = '/event/0/note/' elif link_type == 'contrib': ids = { 'contribution_id': dummy_contribution.id, 'subcontribution_id': None } note = EventNote(object=dummy_contribution) url = f'/event/0/contributions/{dummy_contribution.id}/note/' elif link_type == 'subcontrib': subcontribution = SubContribution(contribution=dummy_contribution, title='Dummy Subcontribution', duration=timedelta(minutes=10)) db.session.flush() ids = { 'contribution_id': subcontribution.contribution_id, 'subcontribution_id': subcontribution.id, } note = EventNote(object=subcontribution) url = f'/event/0/contributions/{dummy_contribution.id}/subcontributions/{subcontribution.id}/note/' note.create_revision(RenderMode.html, 'this is a dummy note', dummy_user) db.session.flush() category_id = dummy_event.category_id schema = EventNoteSchema() assert schema.dump(note) == { 'content': 'this is a dummy note', 'user': { 'affiliation': None, 'name': 'Guinea Pig' }, 'category_id': category_id, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'modified_dt': note.current_revision.created_dt.isoformat(), 'event_id': 0, 'note_id': note.id, 'title': note.object.title, 'type': 'event_note', 'url': url, **ids }
def test_dump_subcontribution(db, dummy_user, dummy_event, dummy_contribution, create_entry, scheduled): from indico.modules.search.schemas import SubContributionSchema extra = {'start_dt': None, 'end_dt': None} if scheduled: create_entry(dummy_contribution, utc.localize(datetime(2020, 4, 20, 4, 20))) extra = { 'start_dt': dummy_contribution.start_dt.isoformat(), 'end_dt': dummy_contribution.end_dt.isoformat(), } subcontribution = SubContribution(contribution=dummy_contribution, title='Dummy Subcontribution', description='A dummy subcontribution', duration=timedelta(minutes=10)) person = EventPerson.create_from_user(dummy_user, dummy_event) subcontribution.person_links.append( SubContributionPersonLink(person=person)) db.session.flush() category_id = dummy_contribution.event.category_id schema = SubContributionSchema() assert schema.dump(subcontribution) == { 'description': 'A dummy subcontribution', 'location': { 'address': '', 'room_name': '', 'venue_name': '' }, 'persons': [{ 'affiliation': None, 'name': 'Guinea Pig' }], 'title': 'Dummy Subcontribution', 'category_id': category_id, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'contribution_id': dummy_contribution.id, 'duration': 10, 'event_id': 0, 'subcontribution_id': subcontribution.id, 'type': 'subcontribution', 'url': f'/event/0/contributions/{dummy_contribution.id}/subcontributions/{subcontribution.id}', **extra }