def testLinkModificationsOnlyAffectCorrectAvatar(self): self._createDummies() avatar_links.init_links(self._avatar1, client=self._redis, assumeEvents=True) avatar_links.init_links(self._avatar2, client=self._redis, assumeEvents=True) # No change may touch other avatars links = avatar_links.get_links(self._avatar2, client=self._redis) avatar_links.add_link(self._avatar1, self._event1, 'foo', client=self._redis) self.assertEqual( links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.del_link(self._avatar1, self._event4, 'conference_manager', client=self._redis) self.assertEqual( links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.del_link(self._avatar1, self._event4, 'conference_participant', client=self._redis) self.assertEqual( links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.delete_avatar(self._avatar1, client=self._redis) self.assertEqual( links, avatar_links.get_links(self._avatar2, client=self._redis))
def testDeleteAvatar(self): self._createDummies() avatar_links.init_links(self._avatar1, client=self._redis, assumeEvents=True) keys = frozenset(self._redis.keys()) links = avatar_links.get_links(self._avatar1, client=self._redis) avatar_links.init_links(self._avatar2, client=self._redis, assumeEvents=True) avatar_links.delete_avatar(self._avatar2, client=self._redis) self.assertEqual(keys, frozenset(self._redis.keys())) self.assertEqual(links, avatar_links.get_links(self._avatar1, client=self._redis))
def testLinkModificationsOnlyAffectCorrectAvatar(self): self._createDummies() avatar_links.init_links(self._avatar1, client=self._redis, assumeEvents=True) avatar_links.init_links(self._avatar2, client=self._redis, assumeEvents=True) # No change may touch other avatars links = avatar_links.get_links(self._avatar2, client=self._redis) avatar_links.add_link(self._avatar1, self._event1, 'foo', client=self._redis) self.assertEqual(links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.del_link(self._avatar1, self._event4, 'conference_manager', client=self._redis) self.assertEqual(links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.del_link(self._avatar1, self._event4, 'conference_participant', client=self._redis) self.assertEqual(links, avatar_links.get_links(self._avatar2, client=self._redis)) avatar_links.delete_avatar(self._avatar1, client=self._redis) self.assertEqual(links, avatar_links.get_links(self._avatar2, client=self._redis))
def _getAnswer(self): avatar_links.delete_avatar(self._user) # clean start avatar_links.init_links(self._user)
def split_avatars(file): """Step 2: Split the merged avatars - run this on the POST-MERGE database""" data = json.load(file) if len(data) != 2: echo('Invalid data: Expected two items, found {}'.format(len(data))) raise click.Abort() avatars = [AvatarHolder().getById(x['id']) for x in data] if avatars.count(None) != 1: echo( 'Expected exactly one unreferenced avatar, got {}'.format(avatars)) raise click.Abort() if avatars[0] is None: orig = avatars[1] orig_data = data[1] merged_data = data[0] else: orig = avatars[0] orig_data = data[0] merged_data = data[1] merged = [av for av in orig._mergeFrom if av.getId() == merged_data['id']] if len(merged) != 1: echo("Avatars don't seem to be merged into each other") raise click.Abort() merged = merged[0] if merged not in orig._mergeFrom or merged._mergeTo != orig: echo("Avatars don't seem to be merged into each other") raise click.Abort() # Remove merge references orig._mergeFrom.remove(merged) merged._mergeTo = None # Clean secondary emails orig.setSecondaryEmails(orig_data['secondary_emails']) merged.setSecondaryEmails(merged_data['secondary_emails']) # Clean identities for identity in merged.getIdentityList(create_identities=True): orig.removeIdentity(identity) identity.setUser(merged) # Re-index the avatars # noinspection PyCallByClass ObjectHolder.add(AvatarHolder(), merged) for index in {'organisation', 'email', 'name', 'surName', 'status'}: IndexesHolder().getById(index).unindexUser(orig) IndexesHolder().getById(index).indexUser(orig) IndexesHolder().getById(index).indexUser(merged) # Restore links for the merged avatar for key, links in merged_data['links'].iteritems(): objtype, role = key.split('.') for link in links: # TODO: Add extra items here as necessary (use show_links to check if anything is missing)! if objtype == 'conference': event = ConferenceHolder().getById(link, quiet=True) if event is None: echo('Event not found: {}'.format(link)) continue if event not in set(orig.linkedTo[objtype][role]): echo('{!r} not linked to avatar via {}'.format(event, key)) continue if role == 'access': event.revokeAccess(orig) event.grantAccess(merged) else: echo('Unexpected link type: {}'.format(key)) raise click.Abort() # print 'Updated {} - {!r}'.format(key, event) elif objtype == 'contribution': event_id, contrib_id = link event = ConferenceHolder().getById(event_id) if event is None: echo('Event not found: {}'.format(event_id)) continue contrib = event.getContributionById(contrib_id) if contrib is None: echo('Contrib not found: {}.{}'.format( event_id, contrib_id)) continue if contrib not in set(orig.linkedTo[objtype][role]): echo('{} not linked to avatar via {}'.format(contrib, key)) continue if role == 'submission': contrib.revokeSubmission(orig) contrib.grantSubmission(merged) elif role == 'manager': contrib.revokeModification(orig) contrib.grantModification(merged) else: echo('Unexpected link type: {}'.format(key)) raise click.Abort() # print 'Updated {} - {}'.format(key, contrib) else: # This results in inconsistent data in redis, but since we flush the redis # links after a successful merge, that's not an issue. Also, we only reach # this branch if someone is using different versions of this script... echo('Unexpected link type: {}'.format(key)) raise click.Abort() if not click.confirm('Do you want to commit the changes now?'): transaction.abort( ) # not really necessary, but let's stay on the safe side raise click.Abort() transaction.commit() # Refresh redis links avatar_links.delete_avatar(orig) avatar_links.delete_avatar(merged) avatar_links.init_links(orig) avatar_links.init_links(merged) # Delete suggestions suggestions.delete_avatar(orig) suggestions.delete_avatar(merged)
def split_avatars(file): """Step 2: Split the merged avatars - run this on the POST-MERGE database""" data = json.load(file) if len(data) != 2: echo('Invalid data: Expected two items, found {}'.format(len(data))) raise click.Abort() avatars = [AvatarHolder().getById(x['id']) for x in data] if avatars.count(None) != 1: echo('Expected exactly one unreferenced avatar, got {}'.format(avatars)) raise click.Abort() if avatars[0] is None: orig = avatars[1] orig_data = data[1] merged_data = data[0] else: orig = avatars[0] orig_data = data[0] merged_data = data[1] merged = [av for av in orig._mergeFrom if av.getId() == merged_data['id']] if len(merged) != 1: echo("Avatars don't seem to be merged into each other") raise click.Abort() merged = merged[0] if merged not in orig._mergeFrom or merged._mergeTo != orig: echo("Avatars don't seem to be merged into each other") raise click.Abort() # Remove merge references orig._mergeFrom.remove(merged) merged._mergeTo = None # Clean secondary emails orig.setSecondaryEmails(orig_data['secondary_emails']) merged.setSecondaryEmails(merged_data['secondary_emails']) # Clean identities for identity in merged.getIdentityList(create_identities=True): orig.removeIdentity(identity) identity.setUser(merged) # Re-index the avatars # noinspection PyCallByClass ObjectHolder.add(AvatarHolder(), merged) for index in {'organisation', 'email', 'name', 'surName', 'status'}: IndexesHolder().getById(index).unindexUser(orig) IndexesHolder().getById(index).indexUser(orig) IndexesHolder().getById(index).indexUser(merged) # Restore links for the merged avatar for key, links in merged_data['links'].iteritems(): objtype, role = key.split('.') for link in links: # TODO: Add extra items here as necessary (use show_links to check if anything is missing)! if objtype == 'conference': event = ConferenceHolder().getById(link, quiet=True) if event is None: echo('Event not found: {}'.format(link)) continue if event not in set(orig.linkedTo[objtype][role]): echo('{!r} not linked to avatar via {}'.format(event, key)) continue if role == 'access': event.revokeAccess(orig) event.grantAccess(merged) else: echo('Unexpected link type: {}'.format(key)) raise click.Abort() # print 'Updated {} - {!r}'.format(key, event) elif objtype == 'contribution': event_id, contrib_id = link event = ConferenceHolder().getById(event_id) if event is None: echo('Event not found: {}'.format(event_id)) continue contrib = event.getContributionById(contrib_id) if contrib is None: echo('Contrib not found: {}.{}'.format(event_id, contrib_id)) continue if contrib not in set(orig.linkedTo[objtype][role]): echo('{} not linked to avatar via {}'.format(contrib, key)) continue if role == 'submission': contrib.revokeSubmission(orig) contrib.grantSubmission(merged) elif role == 'manager': contrib.revokeModification(orig) contrib.grantModification(merged) else: echo('Unexpected link type: {}'.format(key)) raise click.Abort() # print 'Updated {} - {}'.format(key, contrib) else: # This results in inconsistent data in redis, but since we flush the redis # links after a successful merge, that's not an issue. Also, we only reach # this branch if someone is using different versions of this script... echo('Unexpected link type: {}'.format(key)) raise click.Abort() if not click.confirm('Do you want to commit the changes now?'): transaction.abort() # not really necessary, but let's stay on the safe side raise click.Abort() transaction.commit() # Refresh redis links avatar_links.delete_avatar(orig) avatar_links.delete_avatar(merged) avatar_links.init_links(orig) avatar_links.init_links(merged) # Delete suggestions suggestions.delete_avatar(orig) suggestions.delete_avatar(merged)