def __init__(self, subdomain=None, email=None, token=None, oauth_token=None, password=None, session=None, timeout=None, ratelimit_budget=None, proactive_ratelimit=None, proactive_ratelimit_request_interval=10, disable_cache=False): """ Python Wrapper for the Zendesk API. There are several ways to authenticate with the Zendesk API: * Email and password * Email and Zendesk API token * Email and OAuth token * Existing authenticated Requests Session object. :param subdomain: your Zendesk subdomain :param email: email address :param token: Zendesk API token :param oauth_token: OAuth token :param password: Zendesk password :param session: existing Requests Session object :param timeout: global timeout on API requests. :param ratelimit_budget: maximum time to spend being rate limited :param proactive_ratelimit: user specified rate limit. :param proactive_ratelimit_request_interval: seconds to wait when over proactive_ratelimit. :param disable_cache: disable caching of objects """ session = self._init_session(email, token, oauth_token, password, session) timeout = timeout or self.DEFAULT_TIMEOUT self.cache = ZenpyCacheManager(disable_cache) config = dict(subdomain=subdomain, session=session, timeout=timeout, ratelimit=int(proactive_ratelimit) if proactive_ratelimit is not None else None, ratelimit_budget=int(ratelimit_budget) if ratelimit_budget is not None else None, ratelimit_request_interval=int( proactive_ratelimit_request_interval), cache=self.cache) self.users = UserApi(config) self.user_fields = Api(config, object_type='user_field') self.groups = GroupApi(config) self.macros = MacroApi(config) self.organizations = OrganizationApi(config) self.organization_memberships = OrganizationMembershipApi(config) self.organization_fields = OrganizationFieldsApi(config) self.tickets = TicketApi(config) self.suspended_tickets = SuspendedTicketApi( config, object_type='suspended_ticket') self.search = Api(config, object_type='results', endpoint=EndpointFactory('search')) self.topics = Api(config, object_type='topic') self.attachments = AttachmentApi(config) self.brands = BrandApi(config, object_type='brand') self.job_status = Api(config, object_type='job_status', endpoint=EndpointFactory('job_statuses')) self.jira_links = JiraLinkApi(config) self.tags = Api(config, object_type='tag') self.satisfaction_ratings = SatisfactionRatingApi(config) self.sharing_agreements = SharingAgreementAPI(config) self.skips = SkipApi(config) self.activities = Api(config, object_type='activity') self.group_memberships = GroupMembershipApi(config) self.end_user = EndUserApi(config) self.ticket_metrics = Api(config, object_type='ticket_metric') self.ticket_metric_events = Api(config, object_type='ticket_metric_events') self.ticket_fields = TicketFieldApi(config) self.ticket_forms = TicketFormApi(config, object_type='ticket_form') self.ticket_import = TicketImportAPI(config) self.requests = RequestAPI(config) self.chats = ChatApi(config, endpoint=EndpointFactory('chats')) self.views = ViewApi(config) self.sla_policies = SlaPolicyApi(config) self.help_center = HelpCentreApi(config) self.recipient_addresses = RecipientAddressApi(config) self.nps = NpsApi(config) self.triggers = TriggerApi(config, object_type='trigger') self.automations = AutomationApi(config, object_type='automation') self.dynamic_content = DynamicContentApi(config) self.targets = TargetApi(config, object_type='target') self.talk = TalkApi(config) self.custom_agent_roles = CustomAgentRolesApi( config, object_type='custom_agent_role')
class Zenpy(object): """""" DEFAULT_TIMEOUT = 60.0 def __init__(self, subdomain=None, email=None, token=None, oauth_token=None, password=None, session=None, timeout=None, ratelimit_budget=None, proactive_ratelimit=None, proactive_ratelimit_request_interval=10, disable_cache=False): """ Python Wrapper for the Zendesk API. There are several ways to authenticate with the Zendesk API: * Email and password * Email and Zendesk API token * Email and OAuth token * Existing authenticated Requests Session object. :param subdomain: your Zendesk subdomain :param email: email address :param token: Zendesk API token :param oauth_token: OAuth token :param password: Zendesk password :param session: existing Requests Session object :param timeout: global timeout on API requests. :param ratelimit_budget: maximum time to spend being rate limited :param proactive_ratelimit: user specified rate limit. :param proactive_ratelimit_request_interval: seconds to wait when over proactive_ratelimit. :param disable_cache: disable caching of objects """ session = self._init_session(email, token, oauth_token, password, session) timeout = timeout or self.DEFAULT_TIMEOUT self.cache = ZenpyCacheManager(disable_cache) config = dict(subdomain=subdomain, session=session, timeout=timeout, ratelimit=int(proactive_ratelimit) if proactive_ratelimit is not None else None, ratelimit_budget=int(ratelimit_budget) if ratelimit_budget is not None else None, ratelimit_request_interval=int( proactive_ratelimit_request_interval), cache=self.cache) self.users = UserApi(config) self.user_fields = Api(config, object_type='user_field') self.groups = GroupApi(config) self.macros = MacroApi(config) self.organizations = OrganizationApi(config) self.organization_memberships = OrganizationMembershipApi(config) self.organization_fields = OrganizationFieldsApi(config) self.tickets = TicketApi(config) self.suspended_tickets = SuspendedTicketApi( config, object_type='suspended_ticket') self.search = Api(config, object_type='results', endpoint=EndpointFactory('search')) self.topics = Api(config, object_type='topic') self.attachments = AttachmentApi(config) self.brands = BrandApi(config, object_type='brand') self.job_status = Api(config, object_type='job_status', endpoint=EndpointFactory('job_statuses')) self.jira_links = JiraLinkApi(config) self.tags = Api(config, object_type='tag') self.satisfaction_ratings = SatisfactionRatingApi(config) self.sharing_agreements = SharingAgreementAPI(config) self.skips = SkipApi(config) self.activities = Api(config, object_type='activity') self.group_memberships = GroupMembershipApi(config) self.end_user = EndUserApi(config) self.ticket_metrics = Api(config, object_type='ticket_metric') self.ticket_metric_events = Api(config, object_type='ticket_metric_events') self.ticket_fields = TicketFieldApi(config) self.ticket_forms = TicketFormApi(config, object_type='ticket_form') self.ticket_import = TicketImportAPI(config) self.requests = RequestAPI(config) self.chats = ChatApi(config, endpoint=EndpointFactory('chats')) self.views = ViewApi(config) self.sla_policies = SlaPolicyApi(config) self.help_center = HelpCentreApi(config) self.recipient_addresses = RecipientAddressApi(config) self.nps = NpsApi(config) self.triggers = TriggerApi(config, object_type='trigger') self.automations = AutomationApi(config, object_type='automation') self.dynamic_content = DynamicContentApi(config) self.targets = TargetApi(config, object_type='target') self.talk = TalkApi(config) self.custom_agent_roles = CustomAgentRolesApi( config, object_type='custom_agent_role') @staticmethod def http_adapter_kwargs(): """ Provides Zenpy's default HTTPAdapter args for those users providing their own adapter. """ return dict( # Transparently retry requests that are safe to retry, with the exception of 429. This is handled # in the Api._call_api() method. max_retries=Retry(total=3, status_forcelist=[ r for r in Retry.RETRY_AFTER_STATUS_CODES if r != 429 ], respect_retry_after_header=False)) def _init_session(self, email, token, oath_token, password, session): if not session: session = requests.Session() # Workaround for possible race condition - https://github.com/kennethreitz/requests/issues/3661 session.mount('https://', HTTPAdapter(**self.http_adapter_kwargs())) if not hasattr(session, 'authorized') or not session.authorized: # session is not an OAuth session that has been authorized, so authorize the session. if not password and not token and not oath_token: raise ZenpyException( "password, token or oauth_token are required!") elif password and token: raise ZenpyException("password and token " "are mutually exclusive!") if password: session.auth = (email, password) elif token: session.auth = ('%s/token' % email, token) elif oath_token: session.headers.update( {'Authorization': 'Bearer %s' % oath_token}) else: raise ZenpyException("Invalid arguments to _init_session()!") headers = {'User-Agent': 'Zenpy/{}'.format(__version__)} session.headers.update(headers) return session def get_cache_names(self): """ Returns a list of current caches """ return self.cache.mapping.keys() def get_cache_max(self, cache_name): """ Returns the maxsize attribute of the named cache """ return self._get_cache(cache_name).maxsize def set_cache_max(self, cache_name, maxsize, **kwargs): """ Sets the maxsize attribute of the named cache """ cache = self._get_cache(cache_name) cache.set_maxsize(maxsize, **kwargs) def get_cache_impl_name(self, cache_name): """ Returns the name of the cache implementation for the named cache """ return self._get_cache(cache_name).impl_name def set_cache_implementation(self, cache_name, impl_name, maxsize, **kwargs): """ Changes the cache implementation for the named cache """ self._get_cache(cache_name).set_cache_impl(impl_name, maxsize, **kwargs) def add_cache(self, object_type, cache_impl_name, maxsize, **kwargs): """ Add a new cache for the named object type and cache implementation """ if object_type not in ZendeskObjectMapping.class_mapping: raise ZenpyException("No such object type: %s" % object_type) self.cache.mapping[object_type] = ZenpyCache(cache_impl_name, maxsize, **kwargs) def delete_cache(self, cache_name): """ Deletes the named cache """ del self.cache.mapping[cache_name] def purge_cache(self, cache_name): """ Purges the named cache. """ self.cache.purge_cache(cache_name) def disable_caching(self): """ Disable caching of objects. """ self.cache.disable() def enable_caching(self): """ Enable caching of objects. """ self.cache.enable() def caching_status(self): """ Returns caching status. """ self.cache.status() def caching_engines(self): """ Returns available caching engines. """ self.cache.get_cache_engines() def _get_cache(self, cache_name): if cache_name not in self.cache.mapping: raise ZenpyException("No such cache - %s" % cache_name) else: return self.cache.mapping[cache_name]