Ejemplo n.º 1
0
def insertWorkoutsIntoDb(start_date, end_date):
    """
    Inserts all workouts from start_date to end_date into workout table

    Args:
        start_date (datetime): Start Datetime object
        end_date (datetime): End Datetime object

    Returns:
        int: number of workouts inserted into the database
    """
    athletes = db_functions.dbSelect(sql.getAllActiveAthletesSQL())
    datesList = getListOfStartEndDates(start_date, end_date, MAX_DAYS)
    workoutsList = list()

    for athlete in athletes:
        athlete_num_workouts = 0
        for date_period in datesList:
            currWorkouts = api_service.getDBWorkoutsUsingAPI(
                athlete.id, date_period)
            workoutsList += currWorkouts
            athlete_num_workouts += len(currWorkouts)
        log.info("{} workouts found for {} from {} to {}".format(
            athlete_num_workouts, athlete['name'], start_date, end_date))

    log.info("Wrong num HR zones: {}".format(
        InvalidZoneAthletes.wrongNumHrZones))
    log.info("Wrong num power zones: {}".format(
        InvalidZoneAthletes.wrongNumPowerZones))
    log.info("Reverse HR zones: {}".format(InvalidZoneAthletes.reverseHrZones))
    log.info("Reverse Power zones: {}".format(
        InvalidZoneAthletes.reversePowerZones))
    db_functions.dbInsert(workoutsList)
    return len(workoutsList)
Ejemplo n.º 2
0
def updateWorkouts(lastUpdatedTime):
    """
    Driver for updating workouts in the database

    Arguments:
        lastUpdatedTime {datetime} -- Will check for changes in workouts between this date and now, and
        update the database accordingly
    """
    log.info("Updating workouts...")

    active_athletes = db_functions.dbSelect(sql.getAllActiveAthletesSQL())

    total_num_deleted, total_num_modified = 0, 0
    for athlete in active_athletes:
        response_json = api_requester.getWorkoutsChangedSince(
            athlete['id'], lastUpdatedTime)
        num_deleted, num_modified = db_updater.processWorkoutUpdateJSON(response_json)
        total_num_deleted += num_deleted
        total_num_modified += num_modified

    log.info("Wrong num HR zones: {}".format(InvalidZoneAthletes.wrongNumHrZones))
    log.info("Wrong num power zones: {}".format(InvalidZoneAthletes.wrongNumPowerZones))
    log.info("Reverse HR zones: {}".format(InvalidZoneAthletes.reverseHrZones))
    log.info("Reverse Power zones: {}".format(InvalidZoneAthletes.reversePowerZones))
    log.info("Deleted {num_deleted} workouts and modified {num_modified} workouts since {lastUpdatedTime}."
             .format(num_deleted=total_num_deleted, num_modified=total_num_modified, lastUpdatedTime=lastUpdatedTime))
Ejemplo n.º 3
0
def updateWorkoutsIfNecessary():
    """
    Checks if the workouts need to be updated, and if so updates them.
    """
    lastUpdatedTime = db_functions.dbSelect(sql.getOldestLastWorkoutTimeSQL())[
        0]['last_updated_workouts']
    if lastUpdatedTime is None:
        lastUpdatedTime = DEFAULT_LAST_UPDATED_TIME  # Use default datetime if None
    else:
        lastUpdatedTime = datetime.strptime(
            lastUpdatedTime, "%Y-%m-%d %H:%M:%S.%f")  # Format time
    needToUpdate = hasExpired(lastUpdatedTime)
    if needToUpdate:
        updateWorkouts(lastUpdatedTime)
        updateAthletesWorkoutsTime()
Ejemplo n.º 4
0
def getValidTokenForAthlete(whoopAthleteId):
    auth_token = db_functions.dbSelect(
        sql.getAuthorizationTokenSQL(whoopAthleteId))
    return auth_token[0].authorizationToken
Ejemplo n.º 5
0
def getHoursForAllAthletes(start_date, end_date):
    """
    Main driver function for getting the hours table

    Arguments:
        start_date {str} -- Formatted MM/DD/YYYY
        end_date {str} -- Formatted MM/DD/YYYY

    Returns:
        JSON object - Json object with an array of athletes, along with their hours, and
        the total number of hours for all athletes.
    """

    # Run SQL query against DB for hours
    result = db_functions.dbSelect(sql.getAllHoursSQL(start_date, end_date))
    prescribed = db_functions.dbSelect(sql.getPrescribedDataSQL(start_date, end_date))[0]
    if result is None:
        raise Exception("Get data call returned none.")

    # Parses sql rows into list of objects formatted for UI
    athleteHourList = list()
    rank = 1
    total_hours = 0
    # List of lists with each inner list containing sum of all percentages and number of percentages, so at the end can determine average
    zoneAverages = [
        [0, 0],
        [0, 0],
        [0, 0],
        [0, 0],
        [0, 0]
    ]
    tp_scores = list()

    for row in result:
        hr_zones, power_zones = getZonePercents(row)
        if len(prescribed) == 0:
            tp_score = getTpScore(row, None)
        else:
            tp_score = getTpScore(row, prescribed)
        tp_scores.append(tp_score)
        athlete_info = {
            "rank": rank,
            "name": row['name'],
            "zone1": hr_zones['hrZone1Percent'],
            "zone2": hr_zones['hrZone2Percent'],
            "zone3": hr_zones['hrZone3Percent'],
            "zone4": hr_zones['hrZone4Percent'],
            "zone5": hr_zones['hrZone5Percent'],
            "rounded_hours": row['hours'],
            "tp_score": round(tp_score, 0)
        }
        if(hr_zones['hrZone1Percent'] is not '-'):
            zoneAverages[0][0] += hr_zones['hrZone1Percent']
            zoneAverages[0][1] += 1
        if(hr_zones['hrZone2Percent'] is not '-'):
            zoneAverages[1][0] += hr_zones['hrZone2Percent']
            zoneAverages[1][1] += 1
        if(hr_zones['hrZone3Percent'] is not '-'):
            zoneAverages[2][0] += hr_zones['hrZone3Percent']
            zoneAverages[2][1] += 1
        if(hr_zones['hrZone4Percent'] is not '-'):
            zoneAverages[3][0] += hr_zones['hrZone4Percent']
            zoneAverages[3][1] += 1
        if(hr_zones['hrZone1Percent'] is not '-'):
            zoneAverages[4][0] += hr_zones['hrZone5Percent']
            zoneAverages[4][1] += 1
        athleteHourList.append(athlete_info)
        hours = row['hours']
        if hours:
            total_hours += row['hours']
        rank += 1

    avgZone1 = round(zoneAverages[0][0]/zoneAverages[0][1], 1) if zoneAverages[0][1] is not 0 else None
    avgZone2 = round(zoneAverages[1][0]/zoneAverages[1][1], 1) if zoneAverages[1][1] is not 0 else None
    avgZone3 = round(zoneAverages[2][0]/zoneAverages[2][1], 1) if zoneAverages[2][1] is not 0 else None
    avgZone4 = round(zoneAverages[3][0]/zoneAverages[3][1], 1) if zoneAverages[3][1] is not 0 else None
    avgZone5 = round(zoneAverages[4][0]/zoneAverages[4][1], 1) if zoneAverages[4][1] is not 0 else None
    avgTpScore = round(sum(tp_scores)/len(tp_scores), 0)
    jsonToReturn = {
        "athlete_list": athleteHourList,
        "total_hours": round(total_hours, 2),
        "average_tp_score": avgTpScore,
        "average_zones": {
            "avgZone1": avgZone1,
            "avgZone2": avgZone2,
            "avgZone3": avgZone3,
            "avgZone4": avgZone4,
            "avgZone5": avgZone5
        }
    }
    return jsonToReturn
Ejemplo n.º 6
0
def getWorkoutObjectFromJSON(workout_json, zones_json):
    """
    Converts a json object to a db.Model Workout object

    Returns:
        [type] -- [description]
    """

    athleteName = dbSelect(getAthleteNameFromId(
        workout_json['AthleteId']))[0][0]
    workoutTitle = workout_json.get('Title', None)
    workoutType = workout_json.get('WorkoutType', None)
    hrZones, powerZones = getTimeInZones(athleteName, workoutType, zones_json)

    isTeamLift = determineIsTeamLift(workoutTitle)
    isTeamCore = determineIsTeamCore(workoutTitle)

    return Workout(
        id=workout_json.get('Id', None),
        athleteId=workout_json.get('AthleteId', None),
        completed=workout_json.get('Completed', None),
        distance=workout_json.get('Distance', None),
        distancePlanned=workout_json.get('DistancePlanned', None),
        distanceCustomized=workout_json.get('DistanceCustomized', None),
        lastModifiedDate=tryParse(workout_json.get('LastModifiedDate', None)),
        startTime=tryParse(workout_json.get('StartTime', None)),
        startTimePlanned=tryParse(workout_json.get('StartTimePlanned', None)),
        title=workout_json.get('Title', None),
        totalTime=workout_json.get('TotalTime', None),
        totalTimePlanned=workout_json.get('TotalTimePlanned', None),
        workoutDay=tryParse(workout_json.get('WorkoutDay', None)),
        workoutType=workout_json.get('WorkoutType', None),
        cadenceAverage=workout_json.get('CadenceAverage', None),
        cadenceMaximum=workout_json.get('CadenceMaximum', None),
        calories=workout_json.get('Calories', None),
        caloriesPlanned=workout_json.get('CaloriesPlanned', None),
        elevationAverage=workout_json.get('ElevationAverage', None),
        elevationGain=workout_json.get('ElevationGain', None),
        elevationGainPlanned=workout_json.get('ElevationGainPlanned', None),
        elevationLoss=workout_json.get('ElevationLoss', None),
        elevationMaximum=workout_json.get('ElevationMaximum', None),
        elevationMinimum=workout_json.get('ElevationMinimum', None),
        energy=workout_json.get('Energy', None),
        energyPlanned=workout_json.get('EnergyPlanned', None),
        heartRateAverage=workout_json.get('HeartRateAverage', None),
        heartRateMaximum=workout_json.get('HeartRateMaximum', None),
        heartRateMinimum=workout_json.get('HeartRateMinimum', None),
        iF=workout_json.get('IF', None),
        iFPlanned=workout_json.get('IFPlanned', None),
        normalizedPower=workout_json.get('NormalizedPower', None),
        normalizedSpeed=workout_json.get('NormalizedSpeed', None),
        powerAverage=workout_json.get('PowerAverage', None),
        powerMaximum=workout_json.get('PowerMaximum', None),
        tags=tryListConvert(workout_json.get('Tags', None)),
        tempAvg=workout_json.get('TempAvg', None),
        tempMax=workout_json.get('TempMax', None),
        tempMin=workout_json.get('TempMin', None),
        torqueAverage=workout_json.get('TorqueAverage', None),
        torqueMaximum=workout_json.get('TorqueMaximum', None),
        tssActual=workout_json.get('TssActual', None),
        tssCalculationMethod=workout_json.get('TssCalculationMethod', None),
        tssPlanned=workout_json.get('TssPlanned', None),
        velocityAverage=workout_json.get('VelocityAverage', None),
        velocityMaximum=workout_json.get('VelocityMaximum', None),
        velocityPlanned=workout_json.get('VelocityPlanned', None),
        description=workout_json.get('Description', None),
        feeling=workout_json.get('Feeling', None),
        preActivityComment=workout_json.get('PreActivityComment', None),
        rpe=workout_json.get('Rpe', None),
        structure=workout_json.get('Structure', None),
        workoutFileFormats=workout_json.get('WorkoutFileFormats', None),
        hrZone1Time=hrZones[0],
        hrZone2Time=hrZones[1],
        hrZone3Time=hrZones[2],
        hrZone4Time=hrZones[3],
        hrZone5Time=hrZones[4],
        powerZone1Time=powerZones[0],
        powerZone2Time=powerZones[1],
        powerZone3Time=powerZones[2],
        powerZone4Time=powerZones[3],
        powerZone5Time=powerZones[4],
        isTeamLift=isTeamLift,
        isTeamCore=isTeamCore)