# # ============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))