|
13 | 13 | from idbutils import JsonFileProcessor |
14 | 14 |
|
15 | 15 | from .garmin_connect_enums import Event, get_summary_sport, get_details_sport |
16 | | -from .garmindb import ActivitiesDb, Activities, StepsActivities, PaddleActivities, CycleActivities |
| 16 | +from .garmindb import ActivitiesDb, Activities, ActivitiesCourses, ActivitiesEvaluations, StepsActivities, PaddleActivities, CycleActivities |
17 | 17 |
|
18 | 18 |
|
19 | 19 | logger = logging.getLogger(__file__) |
@@ -64,20 +64,20 @@ def _process_common(self, json_data): |
64 | 64 | 'stop_long' : self._get_field(json_data, 'endLongitude', float), |
65 | 65 | 'distance' : distance.kms_or_miles(self.measurement_system), |
66 | 66 | 'laps' : self._get_field(json_data, 'lapCount'), |
67 | | - 'avg_hr' : self._get_field(json_data, 'averageHR', float), |
68 | | - 'max_hr' : self._get_field(json_data, 'maxHR', float), |
69 | | - 'calories' : self._get_field(json_data, 'calories', float), |
| 67 | + 'avg_hr' : self._get_field(json_data, 'averageHR', float, 1), |
| 68 | + 'max_hr' : self._get_field(json_data, 'maxHR', float, 1), |
| 69 | + 'calories' : self._get_field(json_data, 'calories', int), |
70 | 70 | 'avg_speed' : avg_speed.kph_or_mph(self.measurement_system) if avg_speed is not None else None, |
71 | 71 | 'max_speed' : max_speed.kph_or_mph(self.measurement_system) if max_speed is not None else None, |
72 | 72 | 'ascent' : ascent.meters_or_feet(self.measurement_system) if ascent is not None else None, |
73 | 73 | 'descent' : descent.meters_or_feet(self.measurement_system) if descent is not None else None, |
74 | 74 | 'max_temperature' : max_temperature.c_or_f(self.measurement_system) if max_temperature is not None else None, |
75 | 75 | 'min_temperature' : min_temperature.c_or_f(self.measurement_system) if min_temperature is not None else None, |
76 | 76 | 'avg_temperature' : avg_temperature.c_or_f(self.measurement_system) if avg_temperature is not None else None, |
77 | | - 'training_effect' : self._get_field(json_data, 'aerobicTrainingEffect', float), |
78 | | - 'anaerobic_training_effect' : self._get_field(json_data, 'anaerobicTrainingEffect', float), |
79 | | - 'max_rr' : self._get_field(json_data, 'maxRespirationRate', float), |
80 | | - 'avg_rr' : self._get_field(json_data, 'avgRespirationRate', float), |
| 77 | + 'training_effect' : self._get_field(json_data, 'aerobicTrainingEffect', float, 1), |
| 78 | + 'anaerobic_training_effect' : self._get_field(json_data, 'anaerobicTrainingEffect', float, 1), |
| 79 | + 'max_rr' : self._get_field(json_data, 'maxRespirationRate', float, 1), |
| 80 | + 'avg_rr' : self._get_field(json_data, 'avgRespirationRate', float, 1), |
81 | 81 | } |
82 | 82 |
|
83 | 83 | def _process_json(self, json_data): |
@@ -114,9 +114,9 @@ def _process_steps_activity(self, activity_id, activity_summary): |
114 | 114 | 'steps' : self._get_field(activity_summary, 'steps', float), |
115 | 115 | 'avg_steps_per_min' : self._get_field(activity_summary, 'averageRunningCadenceInStepsPerMinute', float), |
116 | 116 | 'max_steps_per_min' : self._get_field(activity_summary, 'maxRunningCadenceInStepsPerMinute', float), |
117 | | - 'avg_step_length' : avg_step_length.meters_or_feet(self.measurement_system), |
| 117 | + 'avg_step_length' : avg_step_length.meters_or_feet(self.measurement_system) if avg_step_length else None, |
118 | 118 | 'avg_gct_balance' : self._get_field(activity_summary, 'avgGroundContactBalance', float), |
119 | | - 'avg_vertical_oscillation' : avg_vertical_oscillation.meters_or_feet(self.measurement_system), |
| 119 | + 'avg_vertical_oscillation' : avg_vertical_oscillation.meters_or_feet(self.measurement_system) if avg_vertical_oscillation else None, |
120 | 120 | 'avg_ground_contact_time' : fitfile.conversions.ms_to_dt_time(self._get_field(activity_summary, 'avgGroundContactTime', float)), |
121 | 121 | 'vo2_max' : self._get_field(activity_summary, 'vO2MaxValue', float), |
122 | 122 | } |
@@ -291,39 +291,32 @@ def _process_fitness_equipment(self, sub_sport, activity_id, json_data): |
291 | 291 | root_logger.debug("fitness_equipment (%s) for %d: %r", sub_sport, activity_id, json_data) |
292 | 292 | self._call_process_func(sub_sport.name, None, activity_id, json_data) |
293 | 293 |
|
294 | | - @classmethod |
295 | | - def get_self_eval_feel(cls, value): |
296 | | - """Return the Garmin Connect self evaluation 'How did you feel' label for the activity.""" |
297 | | - levels = [(100, "Very Strong"), (75, "Strong"), (50, "Normal"), (25, "Weak"), (0, "Very Weak")] |
298 | | - for threshold, label in levels: |
299 | | - if value >= threshold: |
300 | | - return label |
301 | | - |
302 | | - @classmethod |
303 | | - def get_self_eval_effort(cls, value): |
304 | | - """Return the Garmin Connect self evaluation perceived effort label for the activity.""" |
305 | | - levels = [(100, "Maximum"), (90, "Extremely Hard"), (70, "Very Hard"), (50, "Hard"), |
306 | | - (40, "Somewhat Hard"), (30, "Moderate"), (20, "Light"), (10, "Very Light"), (0, "None")] |
307 | | - for threshold, label in levels: |
308 | | - if value >= threshold: |
309 | | - return label |
310 | | - |
311 | 294 | def _activities_process_json(self, json_data): |
312 | 295 | activity_id = json_data['activityId'] |
313 | 296 | metadata_dto = json_data['metadataDTO'] |
314 | 297 | summary_dto = json_data['summaryDTO'] |
315 | 298 | sport, sub_sport = get_details_sport(json_data) |
316 | | - self_eval_feel = self._get_field(summary_dto, 'directWorkoutFeel', int) |
317 | | - self_eval_effort = self._get_field(summary_dto, 'directWorkoutRpe', int) |
318 | 299 | activity = { |
319 | 300 | 'activity_id' : activity_id, |
320 | | - 'course_id' : self._get_field(metadata_dto, 'associatedCourseId', int), |
321 | | - 'device_serial_number' : self._get_field(metadata_dto, 'deviceId', int), |
322 | | - 'self_eval_feel' : self.get_self_eval_feel(self_eval_feel) if (self_eval_feel is not None) else None, |
323 | | - 'self_eval_effort' : self.get_self_eval_effort(self_eval_effort) if (self_eval_effort is not None) else None, |
324 | | - 'training_load' : self._get_field(summary_dto, 'activityTrainingLoad', float) |
| 301 | + 'training_load' : self._get_field(summary_dto, 'activityTrainingLoad', float, 1) |
325 | 302 | } |
326 | 303 | activity.update(self._process_common(summary_dto)) |
327 | 304 | Activities.s_insert_or_update(self.garmin_act_db_session, activity, ignore_none=True) |
| 305 | + course_id = self._get_field(metadata_dto, 'associatedCourseId', int) |
| 306 | + if course_id: |
| 307 | + activity_course = { |
| 308 | + 'activity_id' : activity_id, |
| 309 | + 'course_id' : course_id, |
| 310 | + } |
| 311 | + ActivitiesCourses.s_insert_or_update(self.garmin_act_db_session, activity_course, ignore_none=True) |
| 312 | + self_eval_feel = self._get_field(summary_dto, 'directWorkoutFeel', int) |
| 313 | + self_eval_effort = self._get_field(summary_dto, 'directWorkoutRpe', int) |
| 314 | + if self_eval_feel or self_eval_effort: |
| 315 | + evuation = { |
| 316 | + 'activity_id' : activity_id, |
| 317 | + 'self_eval_feel' : fitfile.fields.ActivityEvalFeel.get_self_eval_feel(self_eval_feel) if (self_eval_feel is not None) else None, |
| 318 | + 'self_eval_effort' : fitfile.fields.ActivityEvalEffort.get_self_eval_effort(self_eval_effort) if (self_eval_effort is not None) else None |
| 319 | + } |
| 320 | + ActivitiesEvaluations.s_insert_or_update(self.garmin_act_db_session, evuation) |
328 | 321 | self._call_process_func(sport.name, sub_sport, activity_id, json_data) |
329 | 322 | return 1 |
0 commit comments