def _update_exploration_summary(activity_rights): """Updates the exploration summary for the 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. """ # TODO(msl): Get rid of inline imports by refactoring code. from core.domain import exp_services exp_services.regenerate_exploration_and_contributors_summaries( activity_rights.id)
def test_migration_job_skips_deleted_explorations(self): """Tests that the exploration migration job skips deleted explorations and does not attempt to migrate. """ swap_states_schema_41 = self.swap(feconf, 'CURRENT_STATE_SCHEMA_VERSION', 41) swap_exp_schema_46 = self.swap(exp_domain.Exploration, 'CURRENT_EXP_SCHEMA_VERSION', 46) with swap_states_schema_41, swap_exp_schema_46: exploration = exp_domain.Exploration.create_default_exploration( self.NEW_EXP_ID, title=self.EXP_TITLE) exp_services.save_new_exploration(self.albert_id, exploration) # Note: This creates a summary based on the upgraded model (which is # fine). A summary is needed to delete the exploration. exp_services.regenerate_exploration_and_contributors_summaries( self.NEW_EXP_ID) # Delete the exploration before migration occurs. exp_services.delete_exploration(self.albert_id, self.NEW_EXP_ID) # Ensure the exploration is deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): exp_fetchers.get_exploration_by_id(self.NEW_EXP_ID) # Start migration job on sample exploration. job_id = exp_jobs_one_off.ExpSnapshotsMigrationJob.create_new() exp_jobs_one_off.ExpSnapshotsMigrationJob.enqueue(job_id) # This running without errors indicates the deleted exploration is # being ignored, since otherwise exp_fetchers.get_exploration_by_id # (used within the job) will raise an error. self.process_and_flush_pending_mapreduce_tasks() actual_output = ( exp_jobs_one_off.ExpSnapshotsMigrationJob.get_output(job_id)) expected_output_choices = [ '[u\'INFO - Exploration does not exist\', [u\'%s-1\', u\'%s-2\']]' % (self.NEW_EXP_ID, self.NEW_EXP_ID), '[u\'INFO - Exploration does not exist\', [u\'%s-2\', u\'%s-1\']]' % (self.NEW_EXP_ID, self.NEW_EXP_ID) ] self.assertEqual(len(actual_output), 1) self.assertIn(actual_output[0], expected_output_choices) # Ensure the exploration is still deleted. with self.assertRaisesRegexp(Exception, 'Entity .* not found'): exp_fetchers.get_exploration_by_id(self.NEW_EXP_ID)