Source code for parsons.freshdesk.freshdesk

from parsons.utilities import check_env
from parsons.utilities.api_connector import APIConnector
import re
from parsons.etl import Table
import logging

logger = logging.getLogger(__name__)

PAGE_SIZE = 100


[docs]class Freshdesk: """ Instantiate Freshdesk class `Args:` domain: str The subdomain of the Freshdesk account. Not required if ``FRESHDESK_DOMAIN`` env variable set. api_key: str The Freshdesk provided application key. Not required if ``FRESHDESK_API_KEY`` env variable set. `Returns:` Freshdesk class """ def __init__(self, domain, api_key): self.api_key = check_env.check("FRESHDESK_API_KEY", api_key) self.domain = check_env.check("FRESHDESK_DOMAIN", domain) self.uri = f"https://{self.domain}.freshdesk.com/api/v2/" self.client = APIConnector(self.uri, auth=(self.api_key, "x")) def _get_request(self, endpoint, params=None): base_params = {"per_page": PAGE_SIZE} if params: base_params.update(params) r = self.client.request(endpoint, "GET", params=base_params) self.client.validate_response(r) data = r.json() # Paginate while "link" in r.headers.keys(): logger.info(f"Retrieving another page of {PAGE_SIZE} records.") url = re.search("<(.*)>", r.headers["link"]).group(1) r = self.client.request(url, "GET", params=params) self.client.validate_response(r) data.extend(r.json()) return data @staticmethod def _transform_table(tbl, expand_custom_fields=None): if tbl.num_rows > 0: tbl.move_column("id", 0) tbl.sort() if expand_custom_fields: tbl.unpack_dict("custom_fields", prepend=False) return tbl
[docs] def get_tickets( self, ticket_type=None, requester_id=None, requester_email=None, company_id=None, updated_since="2016-01-01", expand_custom_fields=False, ): """ List tickets. See the `API Docs <https://developers.freshdesk.com/api/#list_all_tickets>`_ for more information. .. warning:: Deleted and Spam tickets are not included. However they can be pulled separately by utilizing the ``ticket_type`` parameter. .. warning:: Freshdesk will return a maximum of 9,000 tickets. By default, only tickets created in the past 30 days are returned. To access additional tickets, utilize the ``updated_since`` parameter. `Args:` ticket_type: str Filter by type of ticket to filter by. Valid fields include ``new_and_my_open``, ``watching``, ``spam`` and ``deleted``. requester_id: int Filter by requester id. requester_email: str Filter by requester email. company_id: int Filter by company_id. updated_since: str Earliest date to include in results. expand_custom_fields: boolean Expand nested custom fields to their own columns. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ params = { "filter": ticket_type, "requester_id": requester_id, "requester_email": requester_email, "company_id": company_id, "updated_since": updated_since, } tbl = Table(self._get_request("tickets", params=params)) logger.info(f"Found {tbl.num_rows} tickets.") return self._transform_table(tbl, expand_custom_fields)
[docs] def get_contacts( self, email=None, mobile=None, phone=None, company_id=None, state=None, updated_since=None, expand_custom_fields=None, ): """ Get contacts. See the `API Docs <https://developers.freshdesk.com/api/#list_all_contacts>`_ for more information. `Args:` email: str Filter by email address. mobile: str Filter by mobile phone number. phone: str Filter by phone number. company_id: int Filter by company ID. state: str Filter by state. updated_since: str Earliest date to include in results. expand_custom_fields: boolean Expand nested custom fields to their own columns. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ params = { "email": email, "mobile": mobile, "phone": phone, "company_id": company_id, "state": state, "_updated_since": updated_since, } tbl = Table(self._get_request("contacts", params=params)) logger.info(f"Found {tbl.num_rows} contacts.") return self._transform_table(tbl, expand_custom_fields)
[docs] def get_companies(self, expand_custom_fields=False): """ List companies. See the `API Docs <https://developers.freshdesk.com/api/#list_all_companies>`_ for more information. `Args:` expand_custom_fields: boolean Expand nested custom fields to their own columns. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ tbl = Table(self._get_request("companies")) logger.info(f"Found {tbl.num_rows} companies.") return self._transform_table(tbl, expand_custom_fields)
[docs] def get_agents(self, email=None, mobile=None, phone=None, state=None): """ List agents. See the `API Docs <https://developers.freshdesk.com/api/#list_all_agents>`_ for more information. `Args:` email: str Filter by email address. mobile: str Filter by mobile phone number phone: str Filter by phone number state: str Filter by state `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ params = {"email": email, "mobile": mobile, "phone": phone, "state": state} tbl = Table(self._get_request("agents", params=params)) logger.info(f"Found {tbl.num_rows} agents.") tbl = self._transform_table(tbl) tbl = tbl.unpack_dict("contact", prepend=False) tbl.remove_column("signature") # Removing since raw HTML might cause issues. return tbl