ae8c74aef98622c5dce1f6121df2c8197adc9393
[audio.git] / src / apiclient / models.py
1 import json
2 from django.db import models
3 from django.contrib.auth.models import User
4 from requests_oauthlib import OAuth2Session
5 from .settings import YOUTUBE_CLIENT_ID, YOUTUBE_CLIENT_SECRET, YOUTUBE_TOKEN_URL
6
7
8 class OAuthConnection(models.Model):
9     user = models.ForeignKey(User, models.CASCADE)
10     access = models.BooleanField(default=False)
11     token = models.CharField(max_length=64, null=True, blank=True)
12     token_secret = models.CharField(max_length=64, null=True, blank=True)
13
14     @classmethod
15     def get(cls, user):
16         try:
17             return cls.objects.get(user=user)
18         except cls.DoesNotExist:
19             o = cls(user=user)
20             o.save()
21             return o
22
23
24 class YouTubeToken(models.Model):
25     token = models.TextField()
26
27     def token_updater(self, token):
28         self.token = json.dumps(token)
29         self.save()
30
31     def get_session(self):
32         return OAuth2Session(
33             client_id=YOUTUBE_CLIENT_ID,
34             auto_refresh_url=YOUTUBE_TOKEN_URL,
35             token=json.loads(self.token),
36             auto_refresh_kwargs={'client_id':YOUTUBE_CLIENT_ID,'client_secret':YOUTUBE_CLIENT_SECRET},
37             token_updater=self.token_updater
38         )
39
40     def call(self, method, url, params=None, data=None, media_data=None):
41         params = params or {}
42         params['uploadType'] = 'resumable'
43
44         session = self.get_session()
45         response = session.request(
46             method=method,
47             url=url,
48             json=data,
49             params=params,
50             headers={
51                 'X-Upload-Content-Length': str(len(media_data)),
52                 'x-upload-content-type': 'application/octet-stream',
53             }
54         )
55         location = response.headers['Location']
56         return session.put(
57             url=location,
58             data=media_data,
59             headers={"Content-Type": "application/octet-stream"},
60         )