# Path: zenpy/lib/exception.py
# class ZenpyException(Exception):
#     """
#     A ``ZenpyException`` is raised for internal errors.
#     """
# 
# Path: zenpy/lib/util.py
# def is_iterable_but_not_string(obj):
#     """
#     Determine whether or not obj is iterable but not a string (eg, a list, set, tuple etc).
#     """
#     return hasattr(obj, '__iter__') and not isinstance(
#         obj, str) and not isinstance(obj, bytes)
# 
# def to_unix_ts(start_time):
#     """Given a datetime object, returns its value as a unix timestamp"""
#     if isinstance(start_time, datetime):
#         if is_timezone_aware(start_time):
#             start_time = start_time.astimezone(pytz.utc)
#         else:
#             log.warning(
#                 "Non timezone-aware datetime object passed to IncrementalEndpoint. "
#                 "The Zendesk API expects UTC time, if this is not the case results will be incorrect!"
#             )
#         unix_time = calendar.timegm(start_time.timetuple())
#     else:
#         unix_time = start_time
# 
#     return int(unix_time)


import logging
from datetime import date
from datetime import datetime
from requests.utils import quote
from zenpy.lib.exception import ZenpyException
from zenpy.lib.util import is_iterable_but_not_string, to_unix_ts
    from urllib import urlencode
    from urlparse import urlunsplit, SplitResult
    from urllib.parse import urlencode
    from urllib.parse import urlunsplit, SplitResult
        params.update(dict(fields="chats(" + f + ")"))

        return Url(self.endpoint, params=params)


class AttachmentEndpoint(BaseEndpoint):
    def __call__(self, **kwargs):
        return Url(self.endpoint,
                   params={k: v
                           for k, v in kwargs.items() if v is not None})


class SearchEndpoint(BaseEndpoint):
    r"""
    The search endpoint accepts all the parameters defined in the Zendesk
    `Search Documentation <https://developer.zendesk.com/rest_api/docs/core/search>`_.
    Zenpy defines several keywords that are mapped to the Zendesk comparison operators:

    +-----------------+------------------+
    | **Keyword**     | **Operator**     |
    +-----------------+------------------+
    | keyword         | : (equality)     |
    +-----------------+------------------+
    | \*_greater_than | > (numeric|type) |
    +-----------------+------------------+
    | \*_less_than    | < (numeric|type) |
    +-----------------+------------------+
    | \*_after        | > (time|date)    |
    +-----------------+------------------+
    | \*_before       | < (time|date)    |

# Path: zenpy/lib/exception.py
# class ZenpyException(Exception):
#     """
#     A ``ZenpyException`` is raised for internal errors.
#     """
# 
# Path: zenpy/lib/util.py
# def is_iterable_but_not_string(obj):
#     """
#     Determine whether or not obj is iterable but not a string (eg, a list, set, tuple etc).
#     """
#     return hasattr(obj, '__iter__') and not isinstance(
#         obj, str) and not isinstance(obj, bytes)
# 
# def to_unix_ts(start_time):
#     """Given a datetime object, returns its value as a unix timestamp"""
#     if isinstance(start_time, datetime):
#         if is_timezone_aware(start_time):
#             start_time = start_time.astimezone(pytz.utc)
#         else:
#             log.warning(
#                 "Non timezone-aware datetime object passed to IncrementalEndpoint. "
#                 "The Zendesk API expects UTC time, if this is not the case results will be incorrect!"
#             )
#         unix_time = calendar.timegm(start_time.timetuple())
#     else:
#         unix_time = start_time
# 
#     return int(unix_time)


# Path: zenpy/lib/endpoint.py
import logging
from datetime import date
from datetime import datetime
from requests.utils import quote
from zenpy.lib.exception import ZenpyException
from zenpy.lib.util import is_iterable_but_not_string, to_unix_ts
    from urllib import urlencode
    from urlparse import urlunsplit, SplitResult
    from urllib.parse import urlencode
    from urllib.parse import urlunsplit, SplitResult

        params.update(dict(fields="chats(" + f + ")"))

        return Url(self.endpoint, params=params)


class AttachmentEndpoint(BaseEndpoint):
    def __call__(self, **kwargs):
        return Url(self.endpoint,
                   params={k: v
                           for k, v in kwargs.items() if v is not None})


class SearchEndpoint(BaseEndpoint):
    r"""
    The search endpoint accepts all the parameters defined in the Zendesk
    `Search Documentation <https://developer.zendesk.com/rest_api/docs/core/search>`_.
    Zenpy defines several keywords that are mapped to the Zendesk comparison operators:

    +-----------------+------------------+
    | **Keyword**     | **Operator**     |
    +-----------------+------------------+
    | keyword         | : (equality)     |
    +-----------------+------------------+
    | \*_greater_than | > (numeric|type) |
    +-----------------+------------------+
    | \*_less_than    | < (numeric|type) |
    +-----------------+------------------+
    | \*_after        | > (time|date)    |
    +-----------------+------------------+
    | \*_before       | < (time|date)    |

    +-----------------+------------------+