def get(self, exploration_id): """Handles GET requests.""" collection_id = self.request.get('collection_id') include_system_recommendations = self.request.get( 'include_system_recommendations') try: author_recommended_exp_ids = json.loads(self.request.get( 'stringified_author_recommended_ids')) except Exception: raise self.PageNotFoundException system_recommended_exp_ids = [] next_exp_id = None if collection_id: if self.user_id: next_exp_id = ( collection_services.get_next_exploration_id_to_complete_by_user( # pylint: disable=line-too-long self.user_id, collection_id)) else: collection = collection_services.get_collection_by_id( collection_id) next_exp_id = ( collection.get_next_exploration_id_in_sequence( exploration_id)) elif include_system_recommendations: system_chosen_exp_ids = ( recommendations_services.get_exploration_recommendations( exploration_id)) filtered_exp_ids = list( set(system_chosen_exp_ids) - set(author_recommended_exp_ids)) system_recommended_exp_ids = random.sample( filtered_exp_ids, min(MAX_SYSTEM_RECOMMENDATIONS, len(filtered_exp_ids))) recommended_exp_ids = set( author_recommended_exp_ids + system_recommended_exp_ids) if next_exp_id is not None: recommended_exp_ids.add(next_exp_id) self.values.update({ 'summaries': ( summary_services.get_displayable_exp_summary_dicts_matching_ids( recommended_exp_ids)), }) self.render_json(self.values)
def post(self, exploration_id): """Handles POST requests. Args: exploration_id: str. The ID of the exploration. """ # This will be None if the exploration is not being played within the # context of a collection. collection_id = self.payload.get('collection_id') user_id = self.user_id if self.payload.get('version') is None: raise self.InvalidInputException( 'NONE EXP VERSION: Exploration complete') event_services.CompleteExplorationEventHandler.record( exploration_id, self.payload.get('version'), self.payload.get('state_name'), self.payload.get('session_id'), self.payload.get('client_time_spent_in_secs'), self.payload.get('params'), feconf.PLAY_TYPE_NORMAL) if user_id: learner_progress_services.mark_exploration_as_completed( user_id, exploration_id) if user_id and collection_id: collection_services.record_played_exploration_in_collection_context( user_id, collection_id, exploration_id) next_exp_id_to_complete = ( collection_services.get_next_exploration_id_to_complete_by_user( # pylint: disable=line-too-long user_id, collection_id)) if not next_exp_id_to_complete: learner_progress_services.mark_collection_as_completed( user_id, collection_id) else: learner_progress_services.mark_collection_as_incomplete( user_id, collection_id) self.render_json(self.values)