diff options
author | 2017-09-28 10:03:40 -0700 | |
---|---|---|
committer | 2017-09-28 10:14:55 -0700 | |
commit | bd886d918ef2adbabd16c61fdd2e47984e21dfd7 (patch) | |
tree | d41683dffa58fd698df450d148fab3cc2521b0c5 /django/engagementmanager/cms_client/api.py | |
parent | 474554adad912f3edb7ddc3ad14406abb369fb3c (diff) |
initial seed code commit VVP-5
Change-Id: I6560c87ef48a6d0d1fe8197c7c6439c7e6ad653f
Signed-off-by: Paul McGoldrick <paul.mcgoldrick@att.com>
Diffstat (limited to 'django/engagementmanager/cms_client/api.py')
-rwxr-xr-x | django/engagementmanager/cms_client/api.py | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/django/engagementmanager/cms_client/api.py b/django/engagementmanager/cms_client/api.py new file mode 100755 index 0000000..a0ca5b1 --- /dev/null +++ b/django/engagementmanager/cms_client/api.py @@ -0,0 +1,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)) |