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)
예제 #2
0
 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)