51 lines
1.9 KiB
Python
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()
|