summaryrefslogtreecommitdiffstats
path: root/django/engagementmanager/cms_client/api.py
blob: a0ca5b1bf7df22b9466576850a812ddb540799c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#  
# ============LICENSE_START========================================== 
# org.onap.vvp/engagementmgr
# ===================================================================
# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
# ===================================================================
#
# Unless otherwise specified, all software contained herein is licensed
# under the Apache License, Version 2.0 (the “License”);
# you may not use this software except in compliance with the License.
# You may obtain a copy of the License at
#
#             http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
#
# Unless otherwise specified, all documentation contained herein is licensed
# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
# you may not use this documentation except in compliance with the License.
# You may obtain a copy of the License at
#
#             https://creativecommons.org/licenses/by/4.0/
#
# Unless required by applicable law or agreed to in writing, documentation
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ============LICENSE_END============================================
#
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
import json

from django.conf import settings
from oauthlib.oauth2 import BackendApplicationClient, TokenExpiredError
from requests_oauthlib import OAuth2Session
from rest_framework.status import HTTP_401_UNAUTHORIZED
from engagementmanager.service.logging_service import LoggingServiceFactory

logger = LoggingServiceFactory.get_logger()


class CMSClient(object):
    """
    ICE CMS (Mezzanine) API Client SDK
    """

    def __init__(self):
        """
        Ice CMS client constructor ->
        :param MZN_ID: from env vars.
        :param MZN_Secret: from env vars.
        """
        super(CMSClient, self).__init__()

        self.client_id = settings.CMS_APP_CLIENT_ID
        self.client_secret = settings.CMS_APP_CLIENT_SECRET
        self.api_url = settings.CMS_URL
        self.token = self.generateToken(self.client_id, self.client_secret)
        self.session = OAuth2Session(self.client_id, token=self.token)

    # PROBLEM TO REMOVE TRY AND CATCH
    def generateToken(self, client_id, client_secret):
        """
        Create oauth2 token by id and secret (via cms server)
        :param client_id: client id (from env vars)
        :param client_secret: client secret (from env vars)
        :return: return the result token.
        """
        token = None

        try:
            client = BackendApplicationClient(client_id=client_id)
            oatuh = OAuth2Session(client=client)
            token = oatuh.fetch_token(token_url=self.api_url + 'oauth2/token/', client_id=client_id,
                                      client_secret=client_secret)
        except Exception as exception:
            logger.error(
                'Could not create CMS token, error message: ' + str(exception))

        return token

    @staticmethod
    def json_serialize(obj):
        """
        Returns JSON serialization of object
        """
        return json.dumps(obj)

    @staticmethod
    def json_deserialize(string):
        """
        Returns deserialization of JSON
        """
        return json.loads(string)

    def get(self, resource, params=None):
        """
        Make a GET HTTP request
        """
        response = None
        try:
            response = self.session.get(self.api_url + resource, params=params)
            if response.status_code == HTTP_401_UNAUTHORIZED:
                logger.error('Token expired (401 status excepted), will renew cms token now')
                self.__init__()
                response = self.session.get(self.api_url + resource, params=params)
        except TokenExpiredError as exception:
            logger.error('Token expired (TokenExpiredError exception excepted),'
                              ' will renew cms token now: ' + str(exception))
            self.__init__()
            response = self.session.get(self.api_url + resource, params=params)
        item = self.json_deserialize(response.content.decode('utf-8'))
        return item

    def get_posts(self, offset=0, limit=10, category="", date_min=""):
        """
        Get published blog posts
        :param date_min: all the posts returned will be after this date
        :param offset: pagination offset
        :param limit: pagination limit
        :param category: the category which the post related to
        :param limit: date_min of posts to return
        :return: list of dicts for most recently published blog posts
        """
        return self.get('posts?offset={}&limit={}&category_name={}&date_min={}'.format(int(offset), int(limit),
                                                                                       category, date_min))['results']

    def get_pages(self, title=""):
        """
        Get all pages and it's children.
        :param title: The title of the page we want
        :return: list of pages by out filters declaration
        """
        return self.get('pages?title={}'.format(title))['results']

    def get_page(self, id):
        """
        Return specific page by id
        :param id: The id of the page we want to require
        :return: the page result
        """
        return self.get('pages/{}'.format(int(id)))

    def search_pages(self, keyword):
        """
        Return pages by keyword contained in title or content
        :param keyword: The keyword which will be searched in title and content
        :return: the pages as result
        """

        return self.get('pages/search/?keyword={}'.format(keyword))