def test_contribution_msec_updates_on_published_explorations(self): exploration = self.save_new_valid_exploration( self.EXP_ID, self.admin_id, end_state_name='End') init_state_name = exploration.init_state_name exp_services.publish_exploration_and_update_user_profiles( self.admin_id, self.EXP_ID) # Test all owners and editors of exploration after publication have # updated first contribution times in msecs. self.assertIsNotNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) # Test editor of published exploration has updated contribution time. rights_manager.release_ownership_of_exploration( self.admin_id, self.EXP_ID) exp_services.update_exploration( self.editor_id, self.EXP_ID, [{ 'cmd': 'edit_state_property', 'state_name': init_state_name, 'property_name': 'widget_id', 'new_value': 'MultipleChoiceInput' }], 'commit') self.assertIsNotNone(user_services.get_user_settings( self.editor_id).first_contribution_msec)
def test_contribution_msec_updates_on_published_collections(self): self.save_new_valid_collection( self.COL_ID, self.admin_id, title=self.COLLECTION_TITLE, category=self.COLLECTION_CATEGORY, objective=self.COLLECTION_OBJECTIVE, exploration_id=self.EXP_ID) collection_services.publish_collection_and_update_user_profiles( self.admin_id, self.COL_ID) exp_services.publish_exploration_and_update_user_profiles( self.admin_id, self.EXP_ID) # Test all owners and editors of collection after publication have # updated first contribution times. self.assertIsNotNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) # Test editor of published collection has updated # first contribution time. rights_manager.release_ownership_of_collection( self.admin_id, self.COL_ID) collection_services.update_collection( self.editor_id, self.COL_ID, [{ 'cmd': 'edit_collection_property', 'property_name': 'title', 'new_value': 'Some new title' }], 'Changed the title') self.assertIsNotNone(user_services.get_user_settings( self.editor_id).first_contribution_msec)
def test_contribution_msec_updates_on_published_explorations(self): exploration = self.save_new_valid_exploration( self.EXP_ID, self.admin_id, end_state_name='End') init_state_name = exploration.init_state_name # Test that no contribution time is set. job_id = ( user_jobs_one_off.UserFirstContributionMsecOneOffJob.create_new()) user_jobs_one_off.UserFirstContributionMsecOneOffJob.enqueue(job_id) self.process_and_flush_pending_tasks() self.assertIsNone( user_services.get_user_settings( self.admin_id).first_contribution_msec) # Test all owners and editors of exploration after publication have # updated times. exp_services.publish_exploration_and_update_user_profiles( self.admin_id, self.EXP_ID) rights_manager.release_ownership_of_exploration( self.admin_id, self.EXP_ID) exp_services.update_exploration( self.editor_id, self.EXP_ID, [{ 'cmd': 'edit_state_property', 'state_name': init_state_name, 'property_name': 'widget_id', 'new_value': 'MultipleChoiceInput' }], 'commit') job_id = ( user_jobs_one_off.UserFirstContributionMsecOneOffJob.create_new()) user_jobs_one_off.UserFirstContributionMsecOneOffJob.enqueue(job_id) self.process_and_flush_pending_tasks() self.assertIsNotNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) self.assertIsNotNone(user_services.get_user_settings( self.editor_id).first_contribution_msec)
def test_contribution_msec_does_not_update_on_unpublished_explorations(self): self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_EMAIL]) self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME) self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL) exploration = self.save_new_valid_exploration( self.EXP_ID, self.owner_id, end_state_name='End') self.init_state_name = exploration.init_state_name exp_services.publish_exploration_and_update_user_profiles( self.owner_id, self.EXP_ID) # We now manually reset the user's first_contribution_msec to None. # This is to test that the one off job skips over the unpublished # exploration and does not reset the user's first_contribution_msec. user_services._update_first_contribution_msec( self.owner_id, None) rights_manager.unpublish_exploration(self.admin_id, self.EXP_ID) # Test that first contribution time is not set for unpublished # explorations. job_id = user_jobs_one_off.UserFirstContributionMsecOneOffJob.create_new() user_jobs_one_off.UserFirstContributionMsecOneOffJob.enqueue(job_id) self.process_and_flush_pending_tasks() self.assertIsNone(user_services.get_user_settings( self.owner_id).first_contribution_msec)
def test_contribution_msec_does_not_change_if_exp_unpublished(self): self.save_new_valid_exploration( self.EXP_ID, self.owner_id, end_state_name='End') exp_services.publish_exploration_and_update_user_profiles( self.owner_id, self.EXP_ID) rights_manager.unpublish_exploration(self.admin_id, self.EXP_ID) # Test that contribution time is not eliminated if exploration is # unpublished. self.assertIsNotNone(user_services.get_user_settings( self.owner_id).first_contribution_msec)
def test_contribution_msec_does_not_change_if_no_contribution_to_exp(self): self.save_new_valid_exploration( self.EXP_ID, self.admin_id, end_state_name='End') rights_manager.assign_role_for_exploration( self.admin_id, self.EXP_ID, self.editor_id, 'editor') exp_services.publish_exploration_and_update_user_profiles( self.admin_id, self.EXP_ID) # Test that contribution time is not given to an editor that has not # contributed. self.assertIsNotNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) self.assertIsNone(user_services.get_user_settings( self.editor_id).first_contribution_msec)
def test_contribution_msec_does_not_update_until_exploration_is_published(self): self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.signup(self.EDITOR_EMAIL, self.EDITOR_USERNAME) self.editor_id = self.get_user_id_from_email(self.EDITOR_EMAIL) exploration = self.save_new_valid_exploration( self.EXP_ID, self.admin_id, end_state_name='End') self.init_state_name = exploration.init_state_name # Test that saving an exploration does not update first contribution # time. self.assertIsNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) # Test that commit to unpublished exploration does not update # contribution time. exp_services.update_exploration( self.admin_id, self.EXP_ID, [{ 'cmd': 'edit_state_property', 'state_name': self.init_state_name, 'property_name': 'widget_id', 'new_value': 'MultipleChoiceInput' }], '') self.assertIsNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) # Test that another user who commits to unpublished exploration does not # have updated first contribution time. rights_manager.assign_role_for_exploration( self.admin_id, self.EXP_ID, self.editor_id, 'editor') exp_services.update_exploration( self.editor_id, self.EXP_ID, [{ 'cmd': 'rename_state', 'old_state_name': feconf.DEFAULT_INIT_STATE_NAME, 'new_state_name': u'¡Hola! αβγ', }], '') self.assertIsNone(user_services.get_user_settings( self.editor_id).first_contribution_msec) # Test that after an exploration is published, all contributors have # updated first contribution time. exp_services.publish_exploration_and_update_user_profiles( self.admin_id, self.EXP_ID) self.assertIsNotNone(user_services.get_user_settings( self.admin_id).first_contribution_msec) self.assertIsNotNone(user_services.get_user_settings( self.editor_id).first_contribution_msec)
def test_contribution_msec_does_not_update_on_unpublished_explorations(self): self.save_new_valid_exploration( self.EXP_ID, self.owner_id, end_state_name='End') exp_services.publish_exploration_and_update_user_profiles( self.owner_id, self.EXP_ID) # We now manually reset the user's first_contribution_msec to None. # This is to test that the one off job skips over the unpublished # exploration and does not reset the user's first_contribution_msec. user_services._update_first_contribution_msec( # pylint: disable=protected-access self.owner_id, None) rights_manager.unpublish_exploration(self.admin_id, self.EXP_ID) # Test that first contribution time is not set for unpublished # explorations. job_id = user_jobs_one_off.UserFirstContributionMsecOneOffJob.create_new() user_jobs_one_off.UserFirstContributionMsecOneOffJob.enqueue(job_id) self.process_and_flush_pending_tasks() self.assertIsNone(user_services.get_user_settings( self.owner_id).first_contribution_msec)
def test_contribution_msec_does_not_change_if_exploration_unpublished(self): self.signup(self.ADMIN_EMAIL, self.ADMIN_USERNAME) self.admin_id = self.get_user_id_from_email(self.ADMIN_EMAIL) self.set_admins([self.ADMIN_EMAIL]) self.signup(self.OWNER_EMAIL, self.OWNER_USERNAME) self.owner_id = self.get_user_id_from_email(self.OWNER_EMAIL) exploration = self.save_new_valid_exploration( self.EXP_ID, self.owner_id, end_state_name='End') self.init_state_name = exploration.init_state_name exp_services.publish_exploration_and_update_user_profiles( self.owner_id, self.EXP_ID) rights_manager.unpublish_exploration(self.admin_id, self.EXP_ID) # Test that contribution time is not eliminated if exploration is # unpublished. self.assertIsNotNone(user_services.get_user_settings( self.owner_id).first_contribution_msec)
def put(self, exploration_id): """Updates the editing rights for the given exploration.""" exploration = exp_services.get_exploration_by_id(exploration_id) version = self.payload.get('version') _require_valid_version(version, exploration.version) is_public = self.payload.get('is_public') is_publicized = self.payload.get('is_publicized') is_community_owned = self.payload.get('is_community_owned') new_member_username = self.payload.get('new_member_username') new_member_role = self.payload.get('new_member_role') viewable_if_private = self.payload.get('viewable_if_private') if new_member_username: if not rights_manager.Actor( self.user_id).can_modify_roles( rights_manager.ACTIVITY_TYPE_EXPLORATION, exploration_id): raise self.UnauthorizedUserException( 'Only an owner of this exploration can add or change ' 'roles.') new_member_id = user_services.get_user_id_from_username( new_member_username) if new_member_id is None: raise Exception( 'Sorry, we could not find the specified user.') rights_manager.assign_role_for_exploration( self.user_id, exploration_id, new_member_id, new_member_role) elif is_public is not None: exploration = exp_services.get_exploration_by_id(exploration_id) if is_public: try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exp_services.publish_exploration_and_update_user_profiles( self.user_id, exploration_id) exp_services.index_explorations_given_ids([exploration_id]) else: rights_manager.unpublish_exploration( self.user_id, exploration_id) exp_services.delete_documents_from_search_index([ exploration_id]) elif is_publicized is not None: exploration = exp_services.get_exploration_by_id(exploration_id) if is_publicized: try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) rights_manager.publicize_exploration( self.user_id, exploration_id) else: rights_manager.unpublicize_exploration( self.user_id, exploration_id) elif is_community_owned: exploration = exp_services.get_exploration_by_id(exploration_id) try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) rights_manager.release_ownership_of_exploration( self.user_id, exploration_id) elif viewable_if_private is not None: rights_manager.set_private_viewability_of_exploration( self.user_id, exploration_id, viewable_if_private) else: raise self.InvalidInputException( 'No change was made to this exploration.') self.render_json({ 'rights': rights_manager.get_exploration_rights( exploration_id).to_dict() })
def put(self, exploration_id): """Updates the editing rights for the given exploration.""" exploration = exp_services.get_exploration_by_id(exploration_id) version = self.payload.get('version') _require_valid_version(version, exploration.version) is_public = self.payload.get('is_public') is_publicized = self.payload.get('is_publicized') is_community_owned = self.payload.get('is_community_owned') new_member_username = self.payload.get('new_member_username') new_member_role = self.payload.get('new_member_role') viewable_if_private = self.payload.get('viewable_if_private') if new_member_username: if not rights_manager.Actor(self.user_id).can_modify_roles( rights_manager.ACTIVITY_TYPE_EXPLORATION, exploration_id): raise self.UnauthorizedUserException( 'Only an owner of this exploration can add or change ' 'roles.') new_member_id = user_services.get_user_id_from_username( new_member_username) if new_member_id is None: raise Exception('Sorry, we could not find the specified user.') rights_manager.assign_role_for_exploration(self.user_id, exploration_id, new_member_id, new_member_role) elif is_public is not None: exploration = exp_services.get_exploration_by_id(exploration_id) if is_public: try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) exp_services.publish_exploration_and_update_user_profiles( self.user_id, exploration_id) exp_services.index_explorations_given_ids([exploration_id]) else: rights_manager.unpublish_exploration(self.user_id, exploration_id) exp_services.delete_documents_from_search_index( [exploration_id]) elif is_publicized is not None: exploration = exp_services.get_exploration_by_id(exploration_id) if is_publicized: try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) rights_manager.publicize_exploration(self.user_id, exploration_id) else: rights_manager.unpublicize_exploration(self.user_id, exploration_id) elif is_community_owned: exploration = exp_services.get_exploration_by_id(exploration_id) try: exploration.validate(strict=True) except utils.ValidationError as e: raise self.InvalidInputException(e) rights_manager.release_ownership_of_exploration( self.user_id, exploration_id) elif viewable_if_private is not None: rights_manager.set_private_viewability_of_exploration( self.user_id, exploration_id, viewable_if_private) else: raise self.InvalidInputException( 'No change was made to this exploration.') self.render_json({ 'rights': rights_manager.get_exploration_rights(exploration_id).to_dict() })