示例#1
0
    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
示例#2
0
    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
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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
示例#7
0
    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