from datetime import timedelta import logging from django.db import models from django.contrib.auth.models import User from django.conf import settings from django.utils import timezone import requests class AccessToken(models.Model): account = models.OneToOneField("ApiAccount", on_delete=models.CASCADE, primary_key=True) value = models.CharField(max_length=256, verbose_name="Withings API Access Token") expires = models.DateTimeField(verbose_name="Time of expiration") class RefreshToken(models.Model): account = models.OneToOneField("ApiAccount", on_delete=models.CASCADE, primary_key=True) value = models.CharField(max_length=256, verbose_name="Withings API Refresh Token") expires = models.DateTimeField(verbose_name="Time of expiration") class ApiAccount(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) userid = models.PositiveIntegerField(verbose_name="Withings API User ID") def refresh_tokens(self): data = { 'action': 'requesttoken', 'client_id': settings.WITHINGS_CONFIG['CLIENT_ID'], 'client_secret': settings.WITHINGS_CONFIG['CLIENT_SECRET'], 'grant_type': 'refresh_token', 'refresh_token': self.refreshtoken.value } response = requests.post( url=settings.WITHINGS_CONFIG['ENDPOINT_URL_OAUTH2'], json=data ) if response is not None: response.raise_for_status() response_data = response.json() now = timezone.now() self.accesstoken.value = response_data['body']['access_token'] self.accesstoken.expires = now + timedelta(seconds=response_data['body']['expires_in']) self.refreshtoken.value = response_data['body']['refresh_token'] self.refreshtoken.expires = now + timedelta(days=365) self.accesstoken.save() self.refreshtoken.save()