diff --git a/dys_connector/dys_api_manager.py b/dys_connector/dys_api_manager.py index a2c95c2..fb1f500 100644 --- a/dys_connector/dys_api_manager.py +++ b/dys_connector/dys_api_manager.py @@ -1,11 +1,13 @@ +import json import logging - import requests -import json +import dys_connector.exceptions as dys_exc + from enum import Enum -from dys_connector.exceptions import * from dys_connector.dto import VerificationType +DEFAULT_HEADER = "application/json" + # Used endpoints of DYS ENDPOINTS = { "COPY": "/api/v2.0/document/copy/{cid}", @@ -52,7 +54,7 @@ class DYSManager: Logo IDM token for Authentication & Authorization """ - def __init__(self, dys_base_url, idm_token): + def __init__(self, dys_base_url, idm_token, corid=None): if None in (dys_base_url, idm_token): raise ValueError("DYS Base Url or IDM Token cannot be None!") if dys_base_url[-1] == '/': @@ -62,6 +64,7 @@ def __init__(self, dys_base_url, idm_token): self.HEADERS = { "Authorization": "Bearer " + self.TOKEN, } + self.corid = corid def get_url(self, task: str): """ @@ -75,18 +78,22 @@ def get_url(self, task: str): @staticmethod def check_dys_exception(response: requests.Response): code = response.status_code - logging.debug(code) - logging.debug(response.text) + + if int(code / 100) == 2: + logging.debug({'status_code': code, 'dys_response': response.text}) + else: + logging.error({'status_code': code, 'dys_response': response.text}) + if code == 400: - raise DysBadRequestError() + raise dys_exc.DysBadRequestError() elif code == 401: - raise DysUnauthorizedError() + raise dys_exc.DysUnauthorizedError() elif code == 500: - raise DysInternalServerError() + raise dys_exc.DysInternalServerError() elif code == 502: - raise DysBadGatewayError() + raise dys_exc.DysBadGatewayError() elif int(code / 100) != 2: - raise DysHttpException(status_code=code) + raise dys_exc.DysHttpException(status_code=code) def make_dys_request(self, method: str, url: str, headers=None, **kwargs): """ @@ -97,8 +104,15 @@ def make_dys_request(self, method: str, url: str, headers=None, **kwargs): :param kwargs: (optional) Optional parameters of request method. Ex: data, files etc. :return: :class:`Response ` object """ + log = {**{'method': method, 'url': url}, **kwargs} if not headers: headers = self.HEADERS.copy() + if self.corid: + headers.update({'corid': self.corid}) + log.update({'corid': self.corid}) + + logging.info(log) + response = requests.request(method, url, headers=headers, **kwargs) self.check_dys_exception(response) return response @@ -131,7 +145,7 @@ def post_folder(self, parent_folder_cid: str, folder_name: str): """ url = self.get_url("UPLOAD_FOLDER") + "?parentFolderCid=" + parent_folder_cid + "&folderName=" + folder_name headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json;charset=UTF-8" + headers["Content-Type"] = f"{DEFAULT_HEADER};charset=UTF-8" response = self.make_dys_request("POST", url, headers=headers) value_parent = json.loads(response.text) return value_parent["cid"] @@ -163,7 +177,7 @@ def get_dir_structure(self, folder_cid: str, _from: int = 0, _to: int = 10000, url = self.get_url( "DIR_STRUCTURE") + f'?folderCid={folder_cid}&from={_from}&size={_to}&containerType={cont_type.name} ' headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json" + headers["Content-Type"] = DEFAULT_HEADER res = self.make_dys_request("GET", url, headers=headers) dir_list = json.loads(res.text) return dir_list @@ -176,7 +190,7 @@ def get_doc_metadata(self, doc_cid: str): """ url = self.get_url("GET_DOC_META").format(cid=doc_cid) headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json" + headers["Content-Type"] = DEFAULT_HEADER res = json.loads(self.make_dys_request("GET", url, headers=headers).text) metadata = res["varValues"] return metadata @@ -193,7 +207,7 @@ def update_metadata(self, doc_cid: str, metadata: dict, doc_type_id: str): pay_dict = {"documentTypeIds": [], "tagIds": [doc_type_id], "varValues": metadata} payload = json.dumps(pay_dict).encode("utf-8") headers = { - "Content-Type": "application/json;charset=UTF-8", + "Content-Type": f"{DEFAULT_HEADER};charset=UTF-8", "Authorization": "Bearer " + self.TOKEN, } res = self.make_dys_request("PUT", url, headers=headers, data=payload) @@ -207,18 +221,32 @@ def get_document_without_content(self, doc_cid: str): """ url = self.get_url("GET_DOC_INFO").format(cid=doc_cid) headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json" + headers["Content-Type"] = DEFAULT_HEADER res = self.make_dys_request("GET", url, headers=headers) document = json.loads(res.text) return document + def get_external_share(self, doc_cid: str, hide_name: bool = True) -> list: + """ + Get existing external share url for a document. + :param doc_cid: Document Cid + :param hide_name: bool: Hide document name on external share. + :return: External share url string + """ + url = self.get_url("EXTERNAL_SHARE").format(cid=doc_cid) + headers = self.HEADERS.copy() + headers["Content-Type"] = f"{DEFAULT_HEADER};charset=UTF-8" + response = self.make_dys_request("GET", url, headers=headers) + value = json.loads(response.text) + return list(map(lambda link: link + "&hideName={}".format(hide_name), (item['shareLink'] for item in value))) + def generate_external_share(self, doc_cid: str, hide_name: bool = True, role_id_list: list = [], disposable: bool = False, download_disabled: bool = False, duration_day: int = 0, idm_external_share: bool = True, - verification_type: int = VerificationType.NONE + verification_type = VerificationType.NONE ): """ Generate external share url for a document. @@ -231,13 +259,10 @@ def generate_external_share(self, doc_cid: str, hide_name: bool = True, :param idm_external_share: IDM External Share defaults to True :param verification_type: :return: External share url string - - Args: - role_id_list: """ url = self.get_url("EXTERNAL_SHARE").format(cid=doc_cid) headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json;charset=UTF-8" + headers["Content-Type"] = f"{DEFAULT_HEADER};charset=UTF-8" payload = { "authorizationRoleList": role_id_list, "cancelled": "false", @@ -268,7 +293,7 @@ def get_document_content(self, doc_cid: str) -> str: """ url = self.get_url("DOC_CONTENT").format(cid=doc_cid) headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json" + headers["Content-Type"] = DEFAULT_HEADER response = self.make_dys_request("GET", url, headers=headers) value = response.text return value @@ -284,9 +309,9 @@ def copy_document(self, doc_cid: str, parent_folder_cid: str = None, x_lang: str comes with Copy of or - Kopya :return: Cid of the new document. """ - url = end_point = self.get_url("COPY").format(cid=doc_cid) + url = self.get_url("COPY").format(cid=doc_cid) headers = self.HEADERS.copy() - headers["Content-Type"] = "application/json" + headers["Content-Type"] = DEFAULT_HEADER if x_lang: headers["X-Lang"] = x_lang params = {"addCopyOfPrefix": add_copy_of_prefix} @@ -337,6 +362,6 @@ def clear_directory(self, cid: str) -> str: for item in dir_list: try: self.delete(item["cid"]) - except Exception as e: - raise DysClearDirectoryItemDeleteException() + except Exception: + raise dys_exc.DysClearDirectoryItemDeleteException() return cid diff --git a/setup.py b/setup.py index 7a6b648..7dc9f89 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup, find_packages import pathlib -VERSION = '0.2.13' +VERSION = '0.2.17' DESCRIPTION = 'Logo DYS Connector API Python Implementation' # The directory containing this file