def _write_session_entry(self, fit_file, message_fields): activity_id = GarminDB.File.id_from_path(fit_file.filename) sport = message_fields.sport sub_sport = message_fields.sub_sport activity = { 'activity_id' : activity_id, 'start_time' : fit_file.utc_datetime_to_local(message_fields.start_time), 'stop_time' : fit_file.utc_datetime_to_local(message_fields.timestamp), 'elapsed_time' : message_fields.total_elapsed_time, 'moving_time' : self._get_field_value(message_fields, 'total_timer_time'), 'start_lat' : self._get_field_value(message_fields, 'start_position_lat'), 'start_long' : self._get_field_value(message_fields, 'start_position_long'), 'stop_lat' : self._get_field_value(message_fields, 'end_position_lat'), 'stop_long' : self._get_field_value(message_fields, 'end_position_long'), 'distance' : self._get_field_value(message_fields, 'total_distance'), 'cycles' : self._get_field_value(message_fields, 'total_cycles'), 'laps' : self._get_field_value(message_fields, 'num_laps'), 'avg_hr' : self._get_field_value(message_fields, 'avg_heart_rate'), 'max_hr' : self._get_field_value(message_fields, 'max_heart_rate'), 'avg_rr' : self._get_field_value(message_fields, 'avg_respiration_rate'), 'max_rr' : self._get_field_value(message_fields, 'max_respiration_rate'), 'calories' : self._get_field_value(message_fields, 'total_calories'), 'avg_cadence' : self._get_field_value(message_fields, 'avg_cadence'), 'max_cadence' : self._get_field_value(message_fields, 'max_cadence'), 'avg_speed' : self._get_field_value(message_fields, 'avg_speed'), 'max_speed' : self._get_field_value(message_fields, 'max_speed'), 'ascent' : self._get_field_value(message_fields, 'total_ascent'), 'descent' : self._get_field_value(message_fields, 'total_descent'), 'max_temperature' : self._get_field_value(message_fields, 'max_temperature'), 'avg_temperature' : self._get_field_value(message_fields, 'avg_temperature'), 'training_effect' : self._get_field_value(message_fields, 'total_training_effect'), 'anaerobic_training_effect' : self._get_field_value(message_fields, 'total_anaerobic_training_effect') } activity.update(self._plugin_dispatch('write_session_entry', self.garmin_act_db_session, fit_file, activity_id, message_fields)) # json metadata gives better values for sport and subsport, so use existing value if set current = GarminDB.Activities.s_get(self.garmin_act_db_session, activity_id) if current: activity.update(self.__choose_sport(current.sport, current.sub_sport, sport, sub_sport)) root_logger.debug("Updating with %r", activity) current.update_from_dict(activity, ignore_none=True, ignore_zero=True) else: activity.update({'sport': sport.name, 'sub_sport': sub_sport.name}) root_logger.debug("Adding %r", activity) self.garmin_act_db_session.add(GarminDB.Activities(**activity)) if sport is not None: function_name = '_write_' + sport.name + '_entry' try: function = getattr(self, function_name, None) if function is not None: function(fit_file, activity_id, sub_sport, message_fields) else: root_logger.warning("No sport handler for type %s from %s: %s", sport, fit_file.filename, message_fields) except Exception as e: root_logger.error("Exception in %s from %s: %s", function_name, fit_file.filename, e)
def _write_session_entry(self, fit_file, message_dict): activity_id = GarminDB.File.id_from_path(fit_file.filename) sport = message_dict['sport'] sub_sport = message_dict['sub_sport'] activity = { 'activity_id': activity_id, 'start_time': message_dict['start_time'], 'stop_time': message_dict['timestamp'], 'elapsed_time': message_dict['total_elapsed_time'], 'moving_time': self.__get_field_value(message_dict, 'total_timer_time'), 'start_lat': self.__get_field_value(message_dict, 'start_position_lat'), 'start_long': self.__get_field_value(message_dict, 'start_position_long'), 'stop_lat': self.__get_field_value(message_dict, 'end_position_lat'), 'stop_long': self.__get_field_value(message_dict, 'end_position_long'), 'distance': self.__get_field_list_value(message_dict, ['user_distance', 'total_distance']), 'cycles': self.__get_field_value(message_dict, 'total_cycles'), 'laps': self.__get_field_value(message_dict, 'num_laps'), 'avg_hr': self.__get_field_value(message_dict, 'avg_heart_rate'), 'max_hr': self.__get_field_value(message_dict, 'max_heart_rate'), 'calories': self.__get_field_value(message_dict, 'total_calories'), 'avg_cadence': self.__get_field_value(message_dict, 'avg_cadence'), 'max_cadence': self.__get_field_value(message_dict, 'max_cadence'), 'avg_speed': self.__get_field_value(message_dict, 'avg_speed'), 'max_speed': self.__get_field_value(message_dict, 'max_speed'), 'ascent': self.__get_field_value(message_dict, 'total_ascent'), 'descent': self.__get_field_value(message_dict, 'total_descent'), 'max_temperature': self.__get_field_value(message_dict, 'max_temperature'), 'avg_temperature': self.__get_field_value(message_dict, 'avg_temperature'), 'training_effect': self.__get_field_value(message_dict, 'total_training_effect'), 'anaerobic_training_effect': self.__get_field_value(message_dict, 'total_anaerobic_training_effect') } # json metadata gives better values for sport and subsport, so use existing value if set current = GarminDB.Activities.s_get(self.garmin_act_db_session, activity_id) if current: if current.sport is None: if sport != Fit.field_enums.Sport.invalid: current.sport = sport.name if current.sub_sport is None: if sub_sport != Fit.field_enums.SubSport.invalid: current.sub_sport = sub_sport.name current.update_from_dict(activity, ignore_none=True) else: self.garmin_act_db_session.add(GarminDB.Activities(**activity)) function_name = '_write_' + sport.name + '_entry' try: function = getattr(self, function_name, None) if function is not None: function(fit_file, activity_id, sub_sport, message_dict) else: root_logger.warning("No sport handler for type %s from %s: %s", sport, fit_file.filename, message_dict) except Exception as e: root_logger.error("Exception in %s from %s: %s", function_name, fit_file.filename, e)