def fitbitComplete(request): code = request.GET.get('code') # print(code) fitConnect = Fitbit() token = fitConnect.GetAccessToken(code) headers = { 'Authorization': 'Bearer %s' % token['access_token'] } final_url = 'https://' + fitConnect.API_SERVER + '/1/user/-/body/weight/date/today/30d.json' try: resp = requests.get(final_url, headers=headers) data = resp.json() print(data) for content_data in data['body-weight']: weight = WeightEntry() weight.user = request.user weight.weight=content_data['value'] weight.date = dateutil.parser.parse(content_data['dateTime']) try: weight.save() except Exception as e: pass except Exception as e: pass return HttpResponseRedirect(reverse('core:dashboard'))
def add_excersise(request, response_activity, weight): entry = WeightEntry() entry.weight = weight entry.user = request.user entry.date = datetime.date.today() entry.save() messages.success( request, _('Successfully synced weight data.')) if not ExerciseCategory.objects.filter(name='Fitbit'): fitbit_category = ExerciseCategory() fitbit_category.name = 'Fitbit' fitbit_category.save() for detail in response_activity.json()['activities']: name = detail['name'] description = detail['description'] exercise = Exercise() exercise.name_original = name exercise.name = name exercise.category = ExerciseCategory.objects.get( name='Fitbit') exercise.description = description exercise.language = Language.objects.get( short_name='en') exercise.save()
def test_last_weight_entry(self): ''' Tests that the last weight entry is correctly returned ''' self.user_login('test') user = User.objects.get(pk=2) entry = WeightEntry() entry.date = datetime.datetime.today() entry.user = user entry.weight = 100 entry.save() self.assertEqual(user.userprofile.weight, 100) entry.weight = 150 entry.save() self.assertEqual(user.userprofile.weight, 150)
def user_bodyweight(self, weight): ''' Create a new weight entry as needed ''' if (not WeightEntry.objects.filter(user=self.user).exists() or (datetime.date.today() - WeightEntry.objects.filter(user=self.user).latest().date > datetime.timedelta(days=3))): entry = WeightEntry() entry.weight = weight entry.user = self.user entry.date = datetime.date.today() entry.save() # Update the last entry else: entry = WeightEntry.objects.filter(user=self.user).latest() entry.weight = weight entry.save() return entry
def fitbit(request): ''' method driving fitbit integration ''' template_data = {} fitbit_id = os.getenv('CLIENT_ID') fitbit_secret_key = os.getenv('SECRET_KEY') callback_url = os.getenv('CALLBACK_URL') fitbit_scope = 'weight' url_params = '&response_type=code&scope={}&redirect_uri={}'.format( fitbit_scope, callback_url) fitbit_url = 'https://www.fitbit.com/oauth2/authorize?client_id={}'.format( fitbit_id) get_fitbit = fitbit_url + url_params if 'code' in request.GET: # get the code returned from the code = request.GET.get('code', '') client_secret = '{}:{}'.format(fitbit_id, fitbit_secret_key) # Convert client secret key to bytes then to base64 for fitbit token client_secret = client_secret.encode('utf-8') b64_code = base64.b64encode(client_secret).decode('utf-8') # custom headers for fitbit headers = { 'Authorization': 'Basic {}'.format(b64_code), 'Content-Type': 'application/x-www-form-urlencoded' } # parameters for fitbit api request params = { 'client_id': fitbit_id, 'client_secret': fitbit_secret_key, 'code': code, 'grant_type': 'authorization_code', 'redirect_uri': callback_url } # retrieve fitbit access_token post_fitbit = requests.post('https://api.fitbit.com/oauth2/token', params, headers=headers).json() if 'access_token' in post_fitbit: headers['Authorization'] = 'Bearer {}'.format( post_fitbit["access_token"]) user_id = post_fitbit['user_id'] period = '1w' base_date = datetime.datetime.today().strftime('%Y-%m-%d') # get request to retrieve weight data for the user get_weight_params = '/body/log/weight/date/{}/{}.json'.format( base_date, period) get_weight_url = 'https://api.fitbit.com/1/user/{}'.format(user_id) get_weight = get_weight_url + get_weight_params get_weight_data = requests.get(get_weight, headers=headers).json() print('-----wqertyuioertyu', get_weight_data) # save fitbit data into the database if 'weight' in get_weight_data: try: for weight in get_weight_data['weight']: weight_entry = WeightEntry() weight_entry.user = request.user weight_entry.weight = weight['weight'] weight_entry.date = weight['date'] weight_entry.save() messages.success(request, _('Successfully added weight data.')) except IntegrityError as e: messages.success(request, _('Weight data already added.')) template_data.update({'fit_link': get_fitbit}) return render(request, 'user/fitbit.html', template_data)