From 5297d7c80d31f40e8ee654e90daf2dbcddb06018 Mon Sep 17 00:00:00 2001 From: Carlo Zamagni Date: Fri, 15 Nov 2013 12:45:05 +0100 Subject: [PATCH 1/3] added methods to retrieve logged body measurements: https://wiki.fitbit.com/display/API/API-Get-Body-Fat https://wiki.fitbit.com/display/API/API-Get-Body-Weight --- fitbit/api.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/fitbit/api.py b/fitbit/api.py index 03e33bd..257ea23 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -185,6 +185,9 @@ def __init__(self, consumer_key, consumer_secret, system=US, **kwargs): setattr(self, 'delete_%s' % resource, curry( self._DELETE_COLLECTION_RESOURCE, resource)) + for parameter in ['weight', 'fat']: + setattr(self, 'get_body_%s' % parameter, curry(self._LOGGED_RESOURCE, parameter)) + for qualifier in self._qualifiers: setattr(self, '%s_activities' % qualifier, curry(self.activity_stats, qualifier=qualifier)) setattr(self, '%s_foods' % qualifier, curry(self._food_stats, @@ -247,6 +250,44 @@ def user_profile_update(self, data): self.API_VERSION) return self.make_request(url, data) + def _LOGGED_RESOURCE(self, resource, date=None, period=None, end_date=None, user_id=None): + """ + Get logged entries for weight and fat: + + https://wiki.fitbit.com/display/API/API-Get-Body-Fat + GET //user/-/body/log/fat/date/. + GET //user/-/body/log/fat/date//. + GET //user/-/body/log/fat/date//. + + https://wiki.fitbit.com/display/API/API-Get-Body-Weight + GET //user/-/body/log/weight/date/. + GET //user/-/body/log/weight/date//. + GET //user/-/body/log/weight/date//. + """ + if not date: + date = datetime.date.today() + + if period is None and end_date is None: + url = "%s/%s/user/%s/body/log/%s/date/%s.json" % ( + self.API_ENDPOINT, + self.API_VERSION, + user_id, + resource, + date, + ) + if end_date is not None or period is not None: + to = end_date if end_date is not None else period + url = "%s/%s/user/%s/body/log/%s/date/%s/%s.json" % ( + self.API_ENDPOINT, + self.API_VERSION, + user_id, + resource, + date, + to, + ) + + return self.make_request(url) + def _COLLECTION_RESOURCE(self, resource, date=None, user_id=None, data=None): """ From 3a2258b3ba803fdc8446429a0f5cc61d05765c16 Mon Sep 17 00:00:00 2001 From: Carlo Zamagni Date: Wed, 20 Nov 2013 16:44:21 +0100 Subject: [PATCH 2/3] fixed generic user_id --- fitbit/api.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fitbit/api.py b/fitbit/api.py index 257ea23..fee9ccd 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -267,6 +267,9 @@ def _LOGGED_RESOURCE(self, resource, date=None, period=None, end_date=None, user if not date: date = datetime.date.today() + if not user_id: + user_id = '-' + if period is None and end_date is None: url = "%s/%s/user/%s/body/log/%s/date/%s.json" % ( self.API_ENDPOINT, From e37acd51ffaac4e09864a934b3c9f3012937c237 Mon Sep 17 00:00:00 2001 From: Chris Streeter Date: Fri, 27 Dec 2013 12:35:48 -0800 Subject: [PATCH 3/3] Correctly pass headers on in requests. If we don't do this, then we do not correctly pass the Accept-Language header, which means units are wrong when setting parameters. --- fitbit/api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fitbit/api.py b/fitbit/api.py index fee9ccd..1c40df9 100644 --- a/fitbit/api.py +++ b/fitbit/api.py @@ -53,11 +53,13 @@ def make_request(self, url, data={}, method=None, **kwargs): """ if not method: method = 'POST' if data else 'GET' + headers = kwargs.pop('headers', {}) request = oauth.Request.from_consumer_and_token(self._consumer, self._token, http_method=method, http_url=url, parameters=data) request.sign_request(self._signature_method, self._consumer, self._token) + headers.update(request.to_header()) response = self._request(method, url, data=data, - headers=request.to_header()) + headers=headers) if response.status_code == 401: raise HTTPUnauthorized(response)