def _update_collection_summary(activity_rights): """Updates the collection summary for the given activity associated with the given rights object. The ID of rights object is the same as the ID of associated activity. Args: activity_rights: ActivityRights. The rights object for the given activity. """ from core.domain import collection_services collection_services.regenerate_collection_and_contributors_summaries( activity_rights.id)
def test_migration_job_skips_deleted_collection(self): """Tests that the collection migration job skips deleted collection and does not attempt to migrate. """ collection = collection_domain.Collection.create_default_collection( self.COLLECTION_ID, title='A title', category='A Category', objective='An Objective') collection_services.save_new_collection(self.albert_id, collection) # Note: This creates a summary based on the upgraded model (which is # fine). A summary is needed to delete the collection. collection_services.regenerate_collection_and_contributors_summaries( self.COLLECTION_ID) # Delete the exploration before migration occurs. collection_services.delete_collection(self.albert_id, self.COLLECTION_ID) # Ensure the exploration is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): collection_services.get_collection_by_id(self.COLLECTION_ID) # Start migration job on sample collection. job_id = ( collection_jobs_one_off.CollectionMigrationOneOffJob.create_new()) collection_jobs_one_off.CollectionMigrationOneOffJob.enqueue(job_id) # This running without errors indicates the deleted collection is # being ignored. self.process_and_flush_pending_mapreduce_tasks() # Ensure the exploration is still deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): collection_services.get_collection_by_id(self.COLLECTION_ID) output = (collection_jobs_one_off.CollectionMigrationOneOffJob. get_output(job_id)) expected = [[ u'collection_deleted', [u'Encountered 1 deleted collections.'] ]] self.assertEqual(expected, [ast.literal_eval(x) for x in output])