Пример #1
0
 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)
Пример #2
0
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