Changeset 53bb3e5 in OpenWorkouts-current for ow/utilities.py


Ignore:
Timestamp:
Jan 9, 2019, 12:31:33 PM (5 years ago)
Author:
borja <borja@…>
Branches:
current, feature/docs, master
Children:
119412d
Parents:
e3d7b13
Message:

(#13) - fit files parsing + (#26) - generate .gpx from .fit

  • Added fitparse as a new dependency IMPORTANT: please install it in your existing envs:

pip install python-fitparse

  • Added new attribute to workouts to store attached fit files as Blob objects. IMPORTANT: please update any workouts you have in your db, adding the fit_file attribute to them (None by default)
  • Added new module with the code needed to interact with .fit files (parse, gather data, transform to gpx)
  • Added code to "load" a workout from a fit file
  • Added tools and helpers to transform values (meters->kilometers, meters-per-second->kms-per-hour, semicircles-to-degrees, etc)
  • Refactored some imports
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ow/utilities.py

    re3d7b13 r53bb3e5  
    11import re
    2 import datetime
     2from datetime import datetime
     3from decimal import Decimal
     4from shutil import copyfileobj
     5
    36from unidecode import unidecode
    47from xml.dom import minidom
    5 from decimal import Decimal
     8from ZODB.blob import Blob
    69
    710
     
    7982                rfc3339 = trkpt.getElementsByTagName('time')[0].firstChild.data
    8083                try:
    81                     t = datetime.datetime.strptime(
     84                    t = datetime.strptime(
    8285                        rfc3339, '%Y-%m-%dT%H:%M:%S.%fZ')
    8386                except ValueError:
    84                     t = datetime.datetime.strptime(
     87                    t = datetime.strptime(
    8588                        rfc3339, '%Y-%m-%dT%H:%M:%SZ')
    8689
     
    113116                    'cad': cad,
    114117                    'atemp': atemp})
     118
     119
     120def semicircles_to_degrees(semicircles):
     121    return semicircles * (180 / pow(2, 31))
     122
     123
     124def degrees_to_semicircles(degrees):
     125    return degrees * (pow(2, 31) / 180)
     126
     127
     128def miles_to_kms(miles):
     129    factor = 0.62137119
     130    return miles / factor
     131
     132
     133def kms_to_miles(kms):
     134    factor = 0.62137119
     135    return kms * factor
     136
     137
     138def meters_to_kms(meters):
     139    return meters / 1000
     140
     141
     142def kms_to_meters(kms):
     143    return kms * 1000
     144
     145
     146def mps_to_kmph(mps):
     147    """
     148    Transform a value from meters-per-second to kilometers-per-hour
     149    """
     150    return mps * 3.6
     151
     152
     153def kmph_to_mps(kmph):
     154    """
     155    Transform a value from kilometers-per-hour to meters-per-second
     156    """
     157    return kmph * 0.277778
     158
     159
     160def copy_blob(blob):
     161    """
     162    Create a copy of a blob object, returning another blob object that is
     163    the copy of the given blob file.
     164    """
     165    new_blob = Blob()
     166    if getattr(blob, 'file_extension', None):
     167        new_blob.file_extension = blob.file_extension
     168    with blob.open('r') as orig_blob, new_blob.open('w') as dest_blob:
     169        orig_blob.seek(0)
     170        copyfileobj(orig_blob, dest_blob)
     171    return new_blob
     172
     173
     174def create_blob(data, file_extension):
     175    """
     176    Create a ZODB blob file from some data, return the blob object
     177    """
     178    blob = Blob()
     179    blob.file_extension = file_extension
     180    with blob.open('w') as open_blob:
     181        # use .encode() to convert the string to bytes if needed
     182        if not isinstance(data, bytes):
     183            data = data.encode('utf-8')
     184        open_blob.write(data)
     185    return blob
Note: See TracChangeset for help on using the changeset viewer.