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]
Beispiel #2
0
    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]
Beispiel #3
0
 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
Beispiel #4
0
    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
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #8
0
    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)
Beispiel #9
0
    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)
Beispiel #10
0
 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)
Beispiel #11
0
 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)
Beispiel #12
0
    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]
Beispiel #13
0
    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]
Beispiel #14
0
    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]
Beispiel #15
0
    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]
Beispiel #16
0
 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)
Beispiel #17
0
 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)
Beispiel #18
0
    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)