def add_superset_exercise_to_workout(self, workout, first_exercise, first_exercise_filter): if not self.supersetting: return _, reps = get_reps_sets_from_volume_info(self.second_volume_info) second_exercise = self._select_superset_exercise(first_exercise) if second_exercise: workout.add_superset_to_exercise(first_exercise, second_exercise, reps) self._discard_exercise_from_filters(second_exercise, first_exercise_filter)
def _add_exercises_for_component(workout_component_id, exercise_filter, user, workout, force_one=False, rollback_filter_generator=tuple()): component_filter = exercise_filter.copy().for_workout_component(workout_component_id) initial_state_filter = component_filter.copy() if len(component_filter.query) == 0: user.workout_logger.log_dead_end_for_component(workout_component_id) raise DeadEndException("No Exercises Available") super_set_manager = SuperSetManager(workout_component_id, user, component_filter) initial_count = component_filter.count() component_filter = super_set_manager.get_updated_exercise_filter() user.workout_logger.log_super_set_filter_update(component_filter, initial_count) volume_info = super_set_manager.get_volume_info_first_exercise() num_exercises = random.randint(volume_info.min_exercises, volume_info.max_exercises) if not force_one: user.workout_logger.log_num_exercises(volume_info, num_exercises, workout_component_id) if force_one: current_count = len(workout.get_exercise_ids_used(workout_component_id=workout_component_id)) if current_count >= volume_info.max_exercises: raise MaxVolumeReached("Max Volume Reached") num_exercises = 1 user.workout_logger.log_component_filter(workout_component_id, component_filter) previous_exercise = None count_for_current_muscle_group = 0 exercises_this_component = [] for _ in xrange(num_exercises): if float(count_for_current_muscle_group) / num_exercises >= user.get_exhaustion_percent(): user.workout_logger.log_muscle_exhausted() previous_exercise = None count_for_current_muscle_group = 0 sets, reps = get_reps_sets_from_volume_info(volume_info) try: exercise = _select_exercise(component_filter.copy(), previous_exercise=previous_exercise, logger=user.workout_logger) except NoExercisesAvailableException: user.workout_logger.log_retry_select_exercise() previous_exercise = None count_for_current_muscle_group = 0 try: exercise = _select_exercise(component_filter.copy(), retry_mode=True, logger=user.workout_logger) except NoExercisesAvailableException: continue except DeadEndException: # FIXME: This is insane. Sorry. # SBL this isn't working yet because it's possible to get the # same workout in a row here for rollback_filter in rollback_filter_generator: super_set_manager = SuperSetManager(workout_component_id, user, rollback_filter) rollback_filter = super_set_manager.get_updated_exercise_filter() subtracted_exercises = initial_state_filter.query - component_filter.query rollback_filter.query -= subtracted_exercises component_filter = rollback_filter try: exercise = _select_exercise(component_filter.copy(), retry_mode=True, logger=user.workout_logger) break except (DeadEndException, NoExercisesAvailableException): continue workout.add_exercise_set_collection(exercise, sets, reps) component_filter.discard_exercise_id(exercise.id) component_filter.discard_mutually_exclusive(exercise.id) super_set_manager.add_superset_exercise_to_workout(workout, exercise, component_filter) if workout_component_id == WorkoutComponent.RESISTANCE: previous_exercise = exercise count_for_current_muscle_group += 1 exercises_this_component.append(exercise) if _max_exercises_reached_for_muscle_group_id(user, exercises_this_component, exercise.muscle_group_id): user.workout_logger.log_muscle_max_reached(exercise.muscle_group_id) previous_exercise = None component_filter.discard_muscle_group_id(exercise.muscle_group_id) discarded_exercises = initial_state_filter.query - component_filter.query exercise_filter.query -= discarded_exercises