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)