def list_tickets(self, **kwargs): """List all tickets, optionally filtered by a view. Specify filters as keyword arguments, such as: filter_name = one of ['new_and_my_open', 'watching', 'spam', 'deleted'] (defaults to 'new_and_my_open') Multiple filters are AND'd together. """ filter_name = 'new_and_my_open' if 'filter_name' in kwargs: filter_name = kwargs['filter_name'] del kwargs['filter_name'] url = 'tickets?filter=%s' % filter_name page = 1 per_page = 100 tickets = [] # Skip pagination by looping over each page and adding tickets while True: this_page = self._api._get(url + '&page=%d&per_page=%d' % (page, per_page), kwargs) tickets += this_page if len(this_page) < per_page: break page += 1 return [Ticket(**t) for t in tickets]
def filter_tickets(self, query, **kwargs): """Filter tickets by a given query string. The query string must be in the format specified in the API documentation at: https://developer.freshdesk.com/api/#filter_tickets query = "(ticket_field:integer OR ticket_field:'string') AND ticket_field:boolean" """ if len(query) > 512: raise AttributeError("Query string can have up to 512 characters") url = "search/tickets?" page = 1 if not "page" in kwargs else kwargs["page"] per_page = 30 tickets = [] while True: this_page = self._api._get( url + 'page={}&query="{}"'.format(page, query), kwargs) this_page = this_page["results"] tickets += this_page if len(this_page) < per_page or page == 10 or "page" in kwargs: break page += 1 return [Ticket(**t) for t in tickets]
def get_ticket(self, ticket_id, include=None): """Fetches the ticket for the given ticket ID""" _ticketcachefile = self._api.ticketid_to_cache_path(ticket_id) new_ticketcachefile = not _ticketcachefile.exists() if new_ticketcachefile or any(x in ['tickets', 'all'] for x in self._api.updatecache): url = 'tickets/%d' % ticket_id if include: url = url + f"?include={include}" try: ticket = self._api._get(url)['ticket'] except FreshserviceNotFound: ticket = None with open(_ticketcachefile, mode='wb') as f: pickle.dump(ticket, f) if new_ticketcachefile: os.chmod(_ticketcachefile, self._api.cachemode) if self._api.cachegroup: shutil.chown(_ticketcachefile, group=self._api.cachegroup) else: with open(_ticketcachefile, mode='rb') as f: ticket = pickle.load(f) if ticket: return Ticket(**ticket) else: return None
def list_tickets(self, max_pages=None, **kwargs): """List all tickets, optionally filtered by a view. Specify filters as keyword arguments, such as: filter_name = one of ['new_and_my_open', 'watching', 'spam', 'deleted', None] (defaults to 'new_and_my_open') Passing None means that no named filter will be passed to Freshservice, which mimics the behavior of the 'all_tickets' filter in v1 of the API. Multiple filters are AND'd together. """ filter_name = 'new_and_my_open' if 'filter_name' in kwargs: filter_name = kwargs['filter_name'] del kwargs['filter_name'] url = 'tickets' if filter_name is not None: url += '?filter=%s&' % filter_name else: url += '?' page = 1 if not 'page' in kwargs else kwargs['page'] per_page = 100 if not 'per_page' in kwargs else kwargs['per_page'] tickets = [] # Skip pagination by looping over each page and adding tickets if 'page' key is not in kwargs. # else return the requested page and break the loop while True: this_page = self._api._get( url + 'page=%d&per_page=%d' % (page, per_page), kwargs)['tickets'] tickets += this_page if len(this_page) < per_page or 'page' in kwargs or ( max_pages is not None and page >= max_pages): break page += 1 all_selected_tickets = [] # Currently we force update cache for all these tickets # TODO: if self._api.updatecache is false, pull all from cache (need # to locally implement filters / views) for ticket in tickets: _ticketcachefile = self._api.ticketid_to_cache_path(ticket['id']) new_ticketcachefile = not _ticketcachefile.exists() with open(_ticketcachefile, mode='wb') as f: pickle.dump(ticket, f) all_selected_tickets.append(Ticket(**ticket)) if new_ticketcachefile: os.chmod(_ticketcachefile, self._api.cachemode) if self._api.cachegroup: shutil.chown(_ticketcachefile, group=self._api.cachegroup) return all_selected_tickets
def get_ticket(self, ticket_id, *include): """ Fetches the ticket for the given ticket ID You can pass strings for the include parameter and they'll be included as include params to the request ex: get_ticket(some_id, "stats", "conversations", "requester", "company") will result in the following request: tickets/[some_id]?include=stats,conversations,requester,company """ url = "tickets/%d%s" % (ticket_id, "?include=%s" % ",".join(include) if include else "") ticket = self._api._get(url) return Ticket(**ticket)
def update_ticket(self, ticket_id, **kwargs): """Updates a ticket from a given ticket ID, and always updates cache""" url = 'tickets/%d' % ticket_id _ticketcachefile = self._api.ticketid_to_cache_path(ticket_id) new_ticketcachefile = not _ticketcachefile.exists() ticket = self._api._put(url, data=json.dumps(kwargs))['ticket'] with open(_ticketcachefile, mode='wb') as f: pickle.dump(ticket, f) if new_ticketcachefile: os.chmod(_ticketcachefile, self._api.cachemode) if self._api.cachegroup: shutil.chown(_ticketcachefile, group=self._api.cachegroup) return Ticket(**ticket)
def create_ticket(self, subject, **kwargs): """Creates a ticket""" url = 'tickets' status = kwargs.get('status', 2) priority = kwargs.get('priority', 1) data = { 'subject': subject, 'status': status, 'priority': priority, } data.update(kwargs) ticket = self._api._post(url, data=json.dumps(data)) return Ticket(**ticket)
def create_ticket(self, subject, **kwargs): """ Creates a ticket To create ticket with attachments, pass a key 'attachments' with value as list of fully qualified file paths in string format. ex: attachments = ('/path/to/attachment1', '/path/to/attachment2') """ url = "tickets" status = kwargs.get("status", 2) priority = kwargs.get("priority", 1) data = { "subject": subject, "status": status, "priority": priority, } data.update(kwargs) if "attachments" in data: ticket = self._create_ticket_with_attachment(url, data) return Ticket(**ticket) ticket = self._api._post(url, data=json.dumps(data)) return Ticket(**ticket)
def create_ticket(self, subject, **kwargs): """ Creates a ticket To create ticket with attachments, pass a key 'attachments' with value as list of fully qualified file paths in string format. ex: attachments = ('/path/to/attachment1', '/path/to/attachment2') """ url = 'tickets' status = kwargs.get('status', 2) # magic default value of 2 = Open priority = kwargs.get('priority', 1) # magic default value of 1 = Low data = { 'subject': subject, 'status': status, 'priority': priority, } data.update(kwargs) if 'attachments' in data: ticket = self._create_ticket_with_attachment(url, data) return Ticket(**ticket) ticket = self._api._post(url, data=json.dumps(data))['ticket'] return Ticket(**ticket)
def create_outbound_email(self, subject, description, email, email_config_id, **kwargs): """Creates an outbound email""" url = 'tickets/outbound_email' priority = kwargs.get('priority', 1) data = { 'subject': subject, 'description': description, 'priority': priority, 'email': email, 'email_config_id': email_config_id, } data.update(kwargs) ticket = self._api._post(url, data=json.dumps(data)) return Ticket(**ticket)
def create_outbound_email(self, subject, description, email, email_config_id, **kwargs): """Creates an outbound email""" url = "tickets/outbound_email" priority = kwargs.get("priority", 1) data = { "subject": subject, "description": description, "priority": priority, "email": email, "email_config_id": email_config_id, } data.update(kwargs) ticket = self._api._post(url, data=json.dumps(data)) return Ticket(**ticket)
def list_tickets(self, **kwargs): """List all tickets, optionally filtered by a view. Specify filters as keyword arguments, such as: filter_name = one of ['new_and_my_open', 'watching', 'spam', 'deleted'] (defaults to 'new_and_my_open') updated_since (Datetime ISO 8601 FORMAT like 2016-09-17) company_id = id of company to search ticket for Multiple filters are AND'd together. """ queryString = "?" filter_name = 'new_and_my_open' if 'filter_name' in kwargs: filter_name = kwargs['filter_name'] del kwargs['filter_name'] if filter_name != '': queryString += 'filter=' + filter_name if 'company_id' in kwargs: queryString += '&' if queryString != '?' else '' queryString += "company_id=" + str(kwargs['company_id']) del kwargs['company_id'] if 'updated_since' in kwargs: queryString += '&' if queryString != '?' else '' queryString += "updated_since=" + str(kwargs['updated_since']) del kwargs['updated_since'] url = 'tickets%s' % (queryString) page = 1 per_page = 100 tickets = [] # Skip pagination by looping over each page and adding tickets while True: this_page = self._api._get( url + '&page=%d&per_page=%d' % (page, per_page), kwargs) tickets += this_page if len(this_page) < per_page: break page += 1 return [Ticket(**t) for t in tickets]
def list_tickets(self, **kwargs): """List all tickets, optionally filtered by a view. Specify filters as keyword arguments, such as: filter_name = one of ['new_and_my_open', 'watching', 'spam', 'deleted', None] (defaults to 'new_and_my_open') Passing None means that no named filter will be passed to Freshdesk, which mimics the behavior of the 'all_tickets' filter in v1 of the API. Multiple filters are AND'd together. """ filter_name = "new_and_my_open" if "filter_name" in kwargs: filter_name = kwargs["filter_name"] del kwargs["filter_name"] url = "tickets" if filter_name is not None: url += "?filter=%s&" % filter_name else: url += "?" if "updated_since" in kwargs: url += "updated_since=%s&" % kwargs["updated_since"] page = kwargs.get("page", 1) per_page = kwargs.get("per_page", 100) tickets = [] # Skip pagination by looping over each page and adding tickets if 'page' key is not in kwargs. # else return the requested page and break the loop while True: this_page = self._api._get( url + "page=%d&per_page=%d" % (page, per_page), kwargs) tickets += this_page if len(this_page) < per_page or "page" in kwargs: break page += 1 return [Ticket(**t) for t in tickets]
def filter_tickets(self, query, **kwargs): """Filter tickets by a given query string. The query string must be in the format specified in the API documentation at: https://developer.freshdesk.com/api/#filter_tickets query = "(ticket_field:integer OR ticket_field:'string') AND ticket_field:boolean" """ url = 'search/tickets?' page = 1 if not 'page' in kwargs else kwargs['page'] per_page = 30 tickets = [] while True: this_page = self._api._get(url + 'page=%d&query=%s' % (page, repr(query)), kwargs) this_page = this_page['results'] tickets += this_page if len(this_page) < per_page or page == 10 or 'page' in kwargs: break page += 1 return [Ticket(**t) for t in tickets]
def list_tickets(self, **kwargs): """List all tickets, optionally filtered by a view. Specify filters as keyword arguments, such as: filter_name = one of ['new_and_my_open', 'watching', 'spam', 'deleted', None] (defaults to 'new_and_my_open') Passing None means that no named filter will be passed to Freshdesk, which mimics the behavior of the 'all_tickets' filter in v1 of the API. Multiple filters are AND'd together. """ filter_name = 'new_and_my_open' if 'filter_name' in kwargs: filter_name = kwargs['filter_name'] del kwargs['filter_name'] url = 'tickets' if filter_name is not None: url += '?filter=%s&' % filter_name else: url += '?' page = 1 per_page = 100 tickets = [] # Skip pagination by looping over each page and adding tickets while True: this_page = self._api._get( url + 'page=%d&per_page=%d' % (page, per_page), kwargs) tickets += this_page if len(this_page) < per_page: break page += 1 return [Ticket(**t) for t in tickets]
def update_ticket(self, ticket_id, **kwargs): """Updates a ticket from a given ticket ID""" url = "tickets/%d" % ticket_id ticket = self._api._put(url, data=json.dumps(kwargs)) return Ticket(**ticket)
def get_ticket(self, ticket_id): """Fetches the ticket for the given ticket ID""" url = "tickets/%d" % ticket_id ticket = self._api._get(url) return Ticket(**ticket)
def merge_ticket(self, dados): """Updates a ticket from a given ticket ID""" url = "tickets/merge" ticket = self._api._put(url, data=dados) return Ticket(**ticket)