def get_related_lists(related_module_name, module_api_name, common_api_handler): with Utility.lock: try: is_new_data = False key = (module_api_name + Constants.UNDERSCORE + Constants.RELATED_LISTS).lower() resources_path = os.path.join( Initializer.get_initializer().resource_path, Constants.FIELD_DETAILS_DIRECTORY) if not os.path.exists(resources_path): os.makedirs(resources_path) record_field_details_path = Utility.get_file_name() if not os.path.exists(record_field_details_path) or ( os.path.exists(record_field_details_path) and key not in Initializer.get_json(record_field_details_path) ): is_new_data = True related_list_values = Utility.get_related_list_details( module_api_name) record_field_details_json = Initializer.get_json( record_field_details_path) if os.path.exists( record_field_details_path) else {} record_field_details_json[key] = related_list_values Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) record_field_details_json = Initializer.get_json( record_field_details_path) module_related_list = record_field_details_json[key] if not Utility.check_related_list_exists( related_module_name, module_related_list, common_api_handler) and not is_new_data: del record_field_details_json[key] Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) Utility.get_related_lists(related_module_name, module_api_name, common_api_handler) except SDKException as e: Utility.logger.error(Constants.EXCEPTION + e.__str__()) raise e except Exception as e: sdk_exception = SDKException(cause=e) Utility.logger.error(Constants.EXCEPTION + sdk_exception.__str__()) raise sdk_exception
def delete_fields_file(): """ The method to delete fields JSON File of the current user. Raises: SDKException """ with ModuleFieldsHandler.lock: try: record_field_details_path = os.path.join( ModuleFieldsHandler.__get_directory(), Converter.get_encoded_file_name()) if os.path.exists(record_field_details_path): os.remove(record_field_details_path) except Exception as e: sdk_exception = SDKException(cause=e) ModuleFieldsHandler.logger.info( Constants.DELETE_FIELD_FILE_ERROR + sdk_exception.__str__()) raise sdk_exception
def refresh_all_modules(): """ The method to force-refresh fields of all the available modules. Raises: SDKException """ with ModuleFieldsHandler.lock: try: Utility.refresh_modules() except SDKException as ex: ModuleFieldsHandler.logger.info( Constants.REFRESH_ALL_MODULE_FIELDS_ERROR + ex.__str__()) raise ex except Exception as e: sdk_exception = SDKException(cause=e) ModuleFieldsHandler.logger.info( Constants.REFRESH_ALL_MODULE_FIELDS_ERROR + sdk_exception.__str__()) raise sdk_exception
def api_call(self, class_name, encode_type): """ The method to construct API request and response details. To make the Zoho CRM API calls. Parameters: class_name(str): A str containing the method return type. encode_type(str): A str containing the expected API response content type. Returns: APIResponse: An instance of APIResponse representing the Zoho CRM API response instance Raises: SDKException """ try: from zcrmsdk.src.com.zoho.crm.api.initializer import Initializer except Exception: from ..initializer import Initializer if Initializer.get_initializer() is None: raise SDKException(code=Constants.SDK_UNINITIALIZATION_ERROR, message=Constants.SDK_UNINITIALIZATION_MESSAGE) connector = APIHTTPConnector() try: self.set_api_url(connector) except SDKException as e: CommonAPIHandler.logger.error(Constants.SET_API_URL_EXCEPTION + e.__str__()) raise e except Exception as e: sdk_exception = SDKException(cause=e) CommonAPIHandler.logger.error(Constants.SET_API_URL_EXCEPTION + sdk_exception.__str__()) raise sdk_exception connector.request_method = self.__http_method connector.content_type = self.__content_type if self.__header is not None and len( self.__header.request_headers) > 0: connector.headers = self.__header.request_headers if self.__param is not None and len( self.__param.request_parameters) > 0: connector.parameters = self.__param.request_parameters try: Initializer.get_initializer().token.authenticate(connector) except SDKException as e: CommonAPIHandler.logger.info(Constants.AUTHENTICATION_EXCEPTION + e.__str__()) raise e except Exception as e: sdk_exception = SDKException(cause=e) CommonAPIHandler.logger.error(Constants.AUTHENTICATION_EXCEPTION + sdk_exception.__str__()) raise sdk_exception convert_instance = None if self.__content_type is not None and self.__http_method in [ Constants.REQUEST_METHOD_PATCH, Constants.REQUEST_METHOD_POST, Constants.REQUEST_METHOD_PUT ]: try: convert_instance = self.get_converter_class_instance( self.__content_type.lower()) request = convert_instance.form_request( self.__request, self.__request.__class__.__module__, None, None) except SDKException as e: CommonAPIHandler.logger.info(Constants.FORM_REQUEST_EXCEPTION + e.__str__()) raise e except Exception as e: sdk_exception = SDKException(cause=e) CommonAPIHandler.logger.error( Constants.FORM_REQUEST_EXCEPTION + sdk_exception.__str__()) raise sdk_exception connector.request_body = request try: connector.headers[Constants.ZOHO_SDK] = platform.system( ) + "/" + platform.release( ) + " python/" + platform.python_version( ) + ":" + Constants.SDK_VERSION response = connector.fire_request(convert_instance) return_object = None if Constants.CONTENT_TYPE in response.headers: content_type = response.headers[Constants.CONTENT_TYPE] if ";" in content_type: content_type = content_type.rpartition(";")[0] convert_instance = self.get_converter_class_instance( str(content_type).lower()) return_object = convert_instance.get_wrapped_response( response, class_name) else: CommonAPIHandler.logger.info(response.__str__()) return APIResponse(response.headers, response.status_code, return_object) except SDKException as e: CommonAPIHandler.logger.info(Constants.API_CALL_EXCEPTION + e.__str__()) except Exception as e: sdk_exception = SDKException(cause=e) CommonAPIHandler.logger.error(Constants.API_CALL_EXCEPTION + sdk_exception.__str__()) raise sdk_exception
def get_fields_details(module_api_name): """ This method to get module field data from Zoho CRM. :param module_api_name: A str containing the CRM module API name. :return: A object representing the Zoho CRM module field details. """ import zcrmsdk.src.com.zoho.crm.api.fields as Field fields_details = {} response = Field.FieldsOperations(module_api_name).get_fields() if response is not None: if response.get_status_code() == Constants.NO_CONTENT_STATUS_CODE: return fields_details response_object = response.get_object() if isinstance(response_object, Field.ResponseWrapper): fields = response_object.get_fields() for field in fields: if field.get_api_name() in Constants.KEYS_TO_SKIP: continue field_detail = {} Utility.set_data_type(field_detail, field, module_api_name) fields_details[field.get_api_name()] = field_detail if module_api_name.lower() in Constants.INVENTORY_MODULES: field_detail = { Constants.NAME: Constants.LINE_TAX, Constants.TYPE: Constants.LIST_NAMESPACE, Constants.STRUCTURE_NAME: Constants.LINE_TAX_NAMESPACE } fields_details[Constants.LINE_TAX] = field_detail if module_api_name.lower() == Constants.NOTES: field_detail = { Constants.NAME: Constants.ATTACHMENTS, Constants.TYPE: Constants.LIST_NAMESPACE, Constants.STRUCTURE_NAME: Constants.ATTACHMENTS_NAMESPACE } fields_details[Constants.ATTACHMENTS] = field_detail elif isinstance(response_object, Field.APIException): error_response = { Constants.CODE: response_object.get_code().get_value(), Constants.STATUS: response_object.get_status().get_value(), Constants.MESSAGE: response_object.get_message().get_value() } exception = SDKException(code=Constants.API_EXCEPTION, details=error_response) if Utility.module_api_name.lower() == module_api_name.lower(): raise Utility.logger.error(Constants.API_EXCEPTION, exception.__str__()) else: error_response = { Constants.CODE: response.get_status_code() } raise SDKException(code=Constants.API_EXCEPTION, details=error_response) return fields_details
def get_fields_info(module_api_name, handler_instance=None): """ This method to fetch field details of the current module for the current user and store the result in a JSON file. Parameters: module_api_name (str) : A string containing the CRM module API name. handler_instance (CommonAPIHandler) : A CommonAPIHandler instance. """ try: from zcrmsdk.src.com.zoho.crm.api.initializer import Initializer except Exception: from ..initializer import Initializer last_modified_time = None record_field_details_path = None try: with Utility.lock: if module_api_name is not None and Utility.search_json_details(module_api_name) is not None: return initializer = Initializer.get_initializer() resources_path = os.path.join(initializer.resource_path, Constants.FIELD_DETAILS_DIRECTORY) if not os.path.exists(resources_path): os.makedirs(resources_path) module_api_name = Utility.verify_module_api_name(module_api_name) Utility.set_handler_api_path(module_api_name, handler_instance) if handler_instance is not None and handler_instance.get_module_api_name() is None and module_api_name.lower() not in Constants.SKIP_MODULES: return record_field_details_path = Utility.get_file_name() if os.path.exists(record_field_details_path): Utility.file_exists_flow(module_api_name, record_field_details_path, last_modified_time) elif initializer.sdk_config.get_auto_refresh_fields(): Utility.new_file = True Utility.fill_data_type() if len(Utility.api_supported_modules) == 0: Utility.api_supported_modules = Utility.get_modules(None) record_field_details_json = Initializer.get_json(record_field_details_path) if os.path.exists(record_field_details_path) else {} record_field_details_json[Constants.FIELDS_LAST_MODIFIED_TIME] = time.time() * 1000 if len(Utility.api_supported_modules) > 0: for module in Utility.api_supported_modules: if module.lower() not in record_field_details_json: module_data = Utility.api_supported_modules[module] record_field_details_json[module.lower()] = {} Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) field_details = Utility.get_fields_details(module_data[Constants.API_NAME]) record_field_details_json = Initializer.get_json(record_field_details_path) record_field_details_json[module.lower()] = field_details Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) Utility.new_file = False elif Utility.force_refresh and not Utility.get_modified_modules: Utility.get_modified_modules = True record_field_details_json = {} Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) Utility.modify_fields(record_field_details_path, last_modified_time) Utility.get_modified_modules = False else: Utility.fill_data_type() record_field_details_json = {module_api_name.lower(): {}} Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) field_details = Utility.get_fields_details(module_api_name) record_field_details_json = Initializer.get_json(record_field_details_path) record_field_details_json[module_api_name.lower()] = field_details Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) except Exception as e: if record_field_details_path is not None and os.path.exists(record_field_details_path): try: record_field_details_json = Initializer.get_json(record_field_details_path) if module_api_name is not None and module_api_name.lower() in record_field_details_json: del record_field_details_json[module_api_name.lower()] if Utility.new_file: if Constants.FIELDS_LAST_MODIFIED_TIME in record_field_details_json: del record_field_details_json[Constants.FIELDS_LAST_MODIFIED_TIME] Utility.new_file = False if Utility.get_modified_modules or Utility.force_refresh: Utility.get_modified_modules = False Utility.force_refresh = False if last_modified_time is not None: record_field_details_json[Constants.FIELDS_LAST_MODIFIED_TIME] = last_modified_time Utility.write_to_file(file_path=record_field_details_path, file_contents=record_field_details_json) except Exception as ex: sdk_exception = SDKException(cause=ex) Utility.logger.error(Constants.EXCEPTION + sdk_exception.__str__()) raise sdk_exception if not isinstance(e, SDKException): e = SDKException(cause=e) Utility.logger.info(Constants.EXCEPTION + e.__str__()) raise e
def get_fields_info(module_api_name): """ This method to fetch field details of the current module for the current user and store the result in a JSON file. Parameters: module_api_name (str) : A string containing the CRM module API name. """ try: from zcrmsdk.src.com.zoho.crm.api.initializer import Initializer except Exception: from ..initializer import Initializer last_modified_time = None try: with Utility.lock: resources_path = os.path.join( Initializer.get_initializer().resource_path, Constants.FIELD_DETAILS_DIRECTORY) if not os.path.exists(resources_path): if module_api_name is not None and Utility.search_json_details( module_api_name) is not None: return os.makedirs(resources_path) record_field_details_path = Utility.get_file_name() if os.path.exists(record_field_details_path): record_field_details_json = Initializer.get_json( record_field_details_path) if Initializer.get_initializer( ).sdk_config.get_auto_refresh_fields( ) and not Utility.new_file and not Utility.get_modified_modules and ( Constants.FIELDS_LAST_MODIFIED_TIME not in record_field_details_json or Utility.force_refresh or (time.time() * 1000 - record_field_details_json[ Constants.FIELDS_LAST_MODIFIED_TIME]) > 3600000): Utility.get_modified_modules = True last_modified_time = record_field_details_json[ Constants. FIELDS_LAST_MODIFIED_TIME] if Constants.FIELDS_LAST_MODIFIED_TIME in record_field_details_json else None Utility.modify_fields(record_field_details_path, last_modified_time) Utility.get_modified_modules = False elif not Initializer.get_initializer( ).sdk_config.get_auto_refresh_fields( ) and Utility.force_refresh and not Utility.get_modified_modules: Utility.get_modified_modules = True Utility.modify_fields(record_field_details_path, last_modified_time) Utility.get_modified_modules = False record_field_details_json = Initializer.get_json( record_field_details_path) if module_api_name is None or module_api_name.lower( ) in record_field_details_json: return else: Utility.fill_data_type() record_field_details_json[module_api_name.lower()] = {} Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) field_details = Utility.get_fields_details( module_api_name) record_field_details_json = Initializer.get_json( record_field_details_path) record_field_details_json[ module_api_name.lower()] = field_details Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) elif Initializer.get_initializer( ).sdk_config.get_auto_refresh_fields(): Utility.new_file = True Utility.fill_data_type() module_api_names = Utility.get_modules(None) record_field_details_json = { Constants.FIELDS_LAST_MODIFIED_TIME: time.time() * 1000 } for module in module_api_names: if module.lower() not in record_field_details_json: record_field_details_json[module.lower()] = {} Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) field_details = Utility.get_fields_details(module) record_field_details_json = Initializer.get_json( record_field_details_path) record_field_details_json[ module.lower()] = field_details Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) Utility.new_file = False elif Utility.force_refresh and not Utility.get_modified_modules: Utility.get_modified_modules = True record_field_details_json = {} Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) Utility.modify_fields(record_field_details_path, last_modified_time) Utility.get_modified_modules = False else: Utility.fill_data_type() record_field_details_json = {module_api_name.lower(): {}} Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) field_details = Utility.get_fields_details(module_api_name) record_field_details_json = Initializer.get_json( record_field_details_path) record_field_details_json[ module_api_name.lower()] = field_details Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) except Exception as e: if record_field_details_path is not None and os.path.exists( record_field_details_path): try: record_field_details_json = Initializer.get_json( record_field_details_path) if module_api_name is not None and module_api_name.lower( ) in record_field_details_json: del record_field_details_json[module_api_name.lower()] if Utility.new_file: if Constants.FIELDS_LAST_MODIFIED_TIME in record_field_details_json: del record_field_details_json[ Constants.FIELDS_LAST_MODIFIED_TIME] Utility.new_file = False if Utility.get_modified_modules or Utility.force_refresh: Utility.get_modified_modules = False Utility.force_refresh = False if last_modified_time is not None: record_field_details_json[ Constants. FIELDS_LAST_MODIFIED_TIME] = last_modified_time Utility.write_to_file( file_path=record_field_details_path, file_contents=record_field_details_json) except Exception as ex: sdk_exception = SDKException(cause=ex) Utility.logger.error(Constants.EXCEPTION + sdk_exception.__str__()) raise sdk_exception if not isinstance(e, SDKException): e = SDKException(cause=e) Utility.logger.info(Constants.EXCEPTION + e.__str__()) raise e