ba-thesis/app/withings/models.py

51 lines
1.9 KiB
Python

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()