Example #1
0
def build_workout(self, token, pk, send=False, list=None):

    print('>>> build_workout:', pk)
    client = Client(token)
    user = client.get_athlete()
    strUser = StravaUser.objects.filter(uid=user.id)

    sendProgress(strUser[0].channel_name, 5, list)

    workout = Workout.objects.get(pk=pk)
    types = [
        'time', 'distance', 'latlng', 'altitude', 'heartrate',
        'velocity_smooth'
    ]
    print('WorkoutDetail, workout.actId=', workout.actId)
    activity = get_object_or_404(Activity, id=workout.actId)
    print('WorkoutDetail, activity.stravaId=', activity.stravaId)
    print('Resolution required=', strUser[0].resolution)

    distance = Distance.objects.filter(workout__id=workout.id)
    if not distance.count():
        resolution = 'medium'
        if strUser[0].resolution == 100:
            resolution = 'low'
        elif strUser[0].resolution == 1000:
            resolution = 'medium'
        elif strUser[0].resolution == 10000:
            resolution = 'high'
        print('Get streams begin')
        streams = client.get_activity_streams(activity_id=activity.stravaId,
                                              resolution=resolution,
                                              types=types)
        print('streams=', streams)
        sendProgress(strUser[0].channel_name, 10, list)

        #print('time seq size=',len(streams['time'].data))
        #print('dist seq',streams['distance'].data)
        #print('speed seq',streams['velocity_smooth'].data)
        #print('elevation seq',streams['altitude'].data)
        #print('HR seq',streams['heartrate'].data)
        #print('gps seq',streams['latlng'].data)
        gps = GpsCoord.objects.filter(workout__id=workout.id)
        print('gps first element=', gps.count())
        if not gps.count() and 'latlng' in streams:
            print('empty query, create SQL record')
            objs = [
                GpsCoord(gps_index=i,
                         gps_time=streams['time'].data[i],
                         gps_lat=gps[0],
                         gps_long=gps[1],
                         workout=workout)
                for i, gps in enumerate(streams['latlng'].data)
            ]
            #print ('GPS seq')
            #for i, gps in enumerate(streams['latlng'].data):
            #    print ('gps_index:',i,'gps_lat:',gps[0],'gps_long:',gps[1],'gps_time:',streams['time'].data[i])
            coord = GpsCoord.objects.bulk_create(objs)

        sendProgress(strUser[0].channel_name, 20, list)
        hr = HeartRate.objects.filter(workout__id=workout.id)
        if not hr.count() and 'heartrate' in streams:
            objs = [
                HeartRate(hr_index=i, hr_value=hr, workout=workout)
                for i, hr in enumerate(streams['heartrate'].data)
            ]
            coord = HeartRate.objects.bulk_create(objs)

        sendProgress(strUser[0].channel_name, 25, list)
        if not distance.count() and 'distance' in streams:
            objs = [
                Distance(distance_index=i,
                         distance_value=dist,
                         workout=workout)
                for i, dist in enumerate(streams['distance'].data)
            ]
            coord = Distance.objects.bulk_create(objs)

        speed = Speed.objects.filter(workout__id=workout.id)
        if not speed.count() and 'velocity_smooth' in streams:
            objs = [
                Speed(speed_index=i, speed_value=speed, workout=workout)
                for i, speed in enumerate(streams['velocity_smooth'].data)
            ]
            coord = Speed.objects.bulk_create(objs)

        sendProgress(strUser[0].channel_name, 30, list)
        elevation = Elevation.objects.filter(workout__id=workout.id)
        if not elevation.count() and 'altitude' in streams:
            objs = [
                Elevation(elevation_index=i,
                          elevation_value=elevation,
                          workout=workout)
                for i, elevation in enumerate(streams['altitude'].data)
            ]
            coord = Elevation.objects.bulk_create(objs)

        sendProgress(strUser[0].channel_name, 35, list)
        laps = client.get_activity_laps(activity.stravaId)
        i = 0
        for strLap in laps:
            i += 1
            print('lap=', strLap)
            print('strLap,start_index=', strLap.start_index)
            print('strLap,end_index=', strLap.end_index)
            print('strLap,lap_average_cadence=', strLap.average_cadence)
            print('start_date=', strLap.start_date)
            print('lap_time=', strLap.elapsed_time)
            print('lap_distance=', strLap.distance)
            print('lap_pace_zone=', strLap.pace_zone)
            if strLap.pace_zone is None:
                strLap.pace_zone = 0
            if strLap.average_cadence is None:
                strLap.average_cadence = 0
            lap = Lap.objects.filter(workout__id=workout.id, lap_index=i)
            if not lap.exists():
                lap = Lap.objects.create(
                    lap_index=strLap.lap_index,
                    lap_start_index=strLap.start_index,
                    lap_end_index=strLap.end_index,
                    lap_distance=strLap.distance,
                    lap_time=strLap.elapsed_time,
                    lap_start_date=strLap.start_date,
                    lap_average_speed=strLap.average_speed,
                    lap_average_cadence=strLap.average_cadence,
                    lap_pace_zone=strLap.pace_zone,
                    lap_total_elevation_gain=strLap.total_elevation_gain,
                    workout=workout)
                print('total_elevation_gain=', strLap.total_elevation_gain)
                print('pace_zone=', strLap.pace_zone)

    sendProgress(strUser[0].channel_name, 40, list)
    #workout_sq=Workout.objects.filter(id=workout.id)
    #workout_sq = WorkoutSerializer.setup_eager_loading(workout_sq)
    #serializer = WorkoutSerializer(workout_sq, many=True)
    serializer = WorkoutSerializer(workout)
    #print ('serializer.data size=',sys.getsizeof(serializer.data))
    sendProgress(strUser[0].channel_name, 75, list)
    #print ('jsonData=',workout.jsonData)
    data = ""

    if send:
        data = {'progress': 75, 'workout': serializer.data}
        sendMessage('workout', data, strUser[0].channel_name)

    print('Store Json data ...')
    Workout.objects.filter(id=workout.id).update(
        jsonData=json.dumps(serializer.data))
    Activity.objects.filter(id=activity.id).update(progress=100)
    print('Store Json data done')

    sendProgress(strUser[0].channel_name, 100, list)