cms.py 1.97 KB
import requests
from settings import conf
from common.redis_cache import redis_handler as rh
from apps.doc.exceptions import CMSException


class CMS:

    def __init__(self):
        self.oauth_url = conf.CMS_OAUTH_URL
        self.url = conf.CMS_URL
        self.oauth_payload = {
            'grant_type': 'client_credentials',
            'client_id': conf.CMS_OAUTH_ID,
            'client_secret': conf.CMS_OAUTH_SECRET,
            'scope': conf.CMS_OAUTH_SCOPE
        }
        self.token_type = 'bearer'
        self.token = None
        self.token_key = 'access_token'
        self.expires_key = 'expires_in'
        self.token_type_key = 'token_type'

    def update_token(self):
        response = requests.post(self.oauth_url, data=self.oauth_payload, files=[], verify=False)
        if response.status_code != 200:
            raise CMSException('CMS Oauth response with code: {0}'.format(response.status_code))
        token = response.json().get(self.token_key)
        if not isinstance(token, str):
            raise CMSException('CMS Oauth can not get token: {0}'.format(response.json()))
        self.token = token
        self.token_type = response.json().get(self.token_type_key, self.token_type)
        expires = response.json().get(self.expires_key, 3600)
        rh.set_cms_token(self.token, expires)

    def get_token(self):
        # if self.token is None:
        self.token = rh.get_cms_token()
        if self.token is None:
            self.update_token()
        return self.token

    def send(self, payload):
        token = self.get_token()
        headers = {
            'Authorization': '{0} {1}'.format(self.token_type.capitalize(), token),
            'Content-Type': 'application/json',
        }
        response = requests.post(self.url, headers=headers, json=payload, verify=False)
        if response.status_code != 200:
            raise CMSException('CMS Oauth response with code: {0}'.format(response.status_code))
        return response.json()


cms = CMS()