Exemplo n.º 1
0
    def __init__(self, public_key, secret_key,
                 oauth_access_token=None, oauth_access_token_secret=None,
                 fmt='json', finreport=True, hr=True, mc=True,
                 offers=True, provider=True, task=True, team=True,
                 timereport=True, job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers
            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2
            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2
            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2
            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)
Exemplo n.º 2
0
    def __init__(self, public_key, secret_key,
                 oauth_access_token=None, oauth_access_token_secret=None,
                 format_='json', finreport=True, hr=True, mc=True,
                 provider=True, task=True, team=True,
                 timereport=True, url=True, job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.format_ = format_
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if provider:
            from odesk.routers.provider import Provider
            self.provider = Provider(self)

        if task:
            from odesk.routers.task import Task
            self.task = Task(self)

        if team:
            from odesk.routers.team import Team
            self.team = Team(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if url:
            from odesk.routers.url import Url
            self.url = Url(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)
Exemplo n.º 3
0
    def __init__(self, public_key, secret_key, api_token=None,
                oauth_access_token=None, oauth_access_token_secret=None,
                format='json', auth='simple', finreport=True,
                hr=True, mc=True, oconomy=True, provider=True,
                task=True, team=True, timereport=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.api_token = api_token
        self.format = format

        if auth == 'simple':
            self.auth = Auth(self)
        elif auth == 'oauth':
            from odesk.oauth import OAuth
            self.auth = OAuth(self)
            self.oauth_access_token = oauth_access_token
            self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR
            self.hr = HR(self)

        if mc:
            from odesk.routers.mc import *
            self.mc = MC(self)

        if oconomy:
            from odesk.routers.oconomy import OConomy, NonauthOConomy
            self.oconomy = OConomy(self)
            self.nonauth_oconomy = NonauthOConomy(self)

        if provider:
            from odesk.routers.provider import Provider
            self.provider = Provider(self)

        if task:
            from odesk.routers.task import Task
            self.task = Task(self)

        if team:
            from odesk.routers.team import Team
            self.team = Team(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)
Exemplo n.º 4
0
    def __init__(
        self,
        public_key,
        secret_key,
        oauth_access_token=None,
        oauth_access_token_secret=None,
        fmt="json",
        finreport=True,
        hr=True,
        mc=True,
        offers=True,
        provider=True,
        task=True,
        team=True,
        timereport=True,
        job=True,
    ):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt

        # Catch the warning about
        # """
        # SecurityWarning: Certificate has no `subjectAltName`,
        # falling back to check for a `commonName` for now.
        # This feature is being removed by major browsers
        # and deprecated by RFC 2818.
        # (See https://github.com/shazow/urllib3/issues/497 for details.)
        # """
        # The warning will appear only in logs
        logging.captureWarnings(True)
        self.http = urllib3.PoolManager(cert_reqs="CERT_REQUIRED", ca_certs=ca_certs_locater.get())

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        # Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports

            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3

            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC

            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers

            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2

            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2

            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2

            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport

            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job

            self.job = Job(self)
Exemplo n.º 5
0
class Client(object):
    """
    Main API client with oAuth v1 authorization.

    *Parameters:*
      :public_key:                Public API key

      :secret_key:                API key secret

      :oauth_access_token:        oAuth access token public key

      :oauth_access_token_secret: oAuth access token secret key

      :fmt:                       (optional, default ``json``)
                                  API response format.
                                  Currently only ``'json'`` is supported

      :finreport:                 (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.finreport` router

      :hr:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.hr` router

      :mc:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.mc` router

      :offers:                    (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.offers` router

      :provider:                  (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.provider` router

      :task:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.task` router

      :team:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.team` router

      :timereport:                (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.timereport` router

      :job:                       (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.job` router

    """

    def __init__(
        self,
        public_key,
        secret_key,
        oauth_access_token=None,
        oauth_access_token_secret=None,
        fmt="json",
        finreport=True,
        hr=True,
        mc=True,
        offers=True,
        provider=True,
        task=True,
        team=True,
        timereport=True,
        job=True,
    ):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt

        # Catch the warning about
        # """
        # SecurityWarning: Certificate has no `subjectAltName`,
        # falling back to check for a `commonName` for now.
        # This feature is being removed by major browsers
        # and deprecated by RFC 2818.
        # (See https://github.com/shazow/urllib3/issues/497 for details.)
        # """
        # The warning will appear only in logs
        logging.captureWarnings(True)
        self.http = urllib3.PoolManager(cert_reqs="CERT_REQUIRED", ca_certs=ca_certs_locater.get())

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        # Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports

            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3

            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC

            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers

            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2

            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2

            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2

            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport

            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job

            self.job = Job(self)

    # Shortcuts for HTTP methods
    def get(self, url, data=None):
        return self.read(url, data, method="GET", fmt=self.fmt)

    def post(self, url, data=None):
        return self.read(url, data, method="POST", fmt=self.fmt)

    def put(self, url, data=None):
        return self.read(url, data, method="PUT", fmt=self.fmt)

    def delete(self, url, data=None):
        return self.read(url, data, method="DELETE", fmt=self.fmt)

    # The method that actually makes HTTP requests
    def urlopen(self, url, data=None, method="GET", headers=None):
        """Perform oAuth v1 signed HTTP request.

        *Parameters:*
          :url:         Target url

          :data:        Dictionary with parameters

          :method:      (optional, default ``GET``)
                        HTTP method, possible values:
                          * ``GET``
                          * ``POST``
                          * ``PUT``
                          * ``DELETE``

          :headers:     (optional, default ``{}``)
                        Dictionary with header values

        """

        if headers is None:
            headers = {}

        self.last_method = method
        self.last_url = url
        self.last_data = data

        # TODO: Headers are not supported fully yet
        # instead we pass oauth parameters in querystring
        if method in ("PUT", "DELETE"):
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token, self.oauth_access_token_secret, {}, method
            )  # don't need parameters in url
        else:
            if data is None:
                data = {}
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token, self.oauth_access_token_secret, data, method
            )

        if method == "GET":
            url = "{0}?{1}".format(url, post_data)
            return self.http.urlopen(method, url)
        elif method == "POST":
            return self.http.urlopen(
                method, url, body=post_data, headers={"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"}
            )
        elif method in ("PUT", "DELETE"):
            url = "{0}?{1}".format(url, post_data)
            headers["Content-Type"] = "application/json"
            if data is not None:
                data_json = json.dumps(data)
            else:
                data_json = ""
            return self.http.urlopen(method, url, body=data_json, headers=headers)

        else:
            raise Exception("Wrong http method: {0}. Supported" "methods are: " "GET, POST, PUT, DELETE".format(method))

    def read(self, url, data=None, method="GET", fmt="json"):
        """
        Returns parsed Python object or raises an error.

        *Parameters:*
          :url:       Target url

          :data:      Dictionary with parameters

          :method:    (optional, default ``GET``)
                      HTTP method, possible values:
                        * ``GET``
                        * ``POST``
                        * ``PUT``
                        * ``DELETE``

          :fmt:         (optional, default ``json``)
                        API response format.
                        Currently only ``'json'`` is supported

        """
        assert fmt == "json", "Only JSON format is supported at the moment"

        if "/gds/" not in url:
            url = "{0}.{1}".format(url, fmt)

        logger = logging.getLogger("python-odesk")

        logger.debug("Prepairing to make oDesk call")
        logger.debug("URL: {0}".format(url))
        try:
            logger.debug("Data: {0}".format(json.dumps(data, default=decimal_default)))
        except TypeError:
            logger.debug("Data: {0}".format(str(data)))
        logger.debug("Method: {0}".format(method))
        response = self.urlopen(url, data, method)

        if response.status != 200:
            logger.debug("Error: {0}".format(response))
            raise_http_error(url, response)

        result = response.data
        logger.debug("Response: {0}".format(result))

        if fmt == "json":
            try:
                result = json.loads(result)
            except ValueError:
                # Not a valid json string
                logger.debug("Response is not a valid json string")
                raise IncorrectJsonResponseError(
                    json.dumps({"status": response.status, "body": result}, default=decimal_default)
                )
        return result
Exemplo n.º 6
0
def setup_oauth():
    return OAuth(get_oauth_client())
Exemplo n.º 7
0
class Client(object):
    """
    Main API client with oAuth v1 authorization.

    *Parameters:*
      :public_key:                Public API key

      :secret_key:                API key secret

      :oauth_access_token:        oAuth access token public key

      :oauth_access_token_secret: oAuth access token secret key

      :fmt:                       (optional, default ``json``)
                                  API response format.
                                  Currently only ``'json'`` is supported

      :finreport:                 (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.finreport` router

      :hr:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.hr` router

      :mc:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.mc` router

      :offers:                    (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.offers` router

      :provider:                  (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.provider` router

      :task:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.task` router

      :team:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.team` router

      :timereport:                (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.timereport` router

      :job:                       (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.job` router

    """

    def __init__(self, public_key, secret_key,
                 oauth_access_token=None, oauth_access_token_secret=None,
                 fmt='json', finreport=True, hr=True, mc=True,
                 offers=True, provider=True, task=True, team=True,
                 timereport=True, job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers
            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2
            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2
            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2
            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)

    #Shortcuts for HTTP methods
    def get(self, url, data=None):
        return self.read(url, data, method='GET', fmt=self.fmt)

    def post(self, url, data=None):
        return self.read(url, data, method='POST', fmt=self.fmt)

    def put(self, url, data=None):
        return self.read(url, data, method='PUT', fmt=self.fmt)

    def delete(self, url, data=None):
        return self.read(url, data, method='DELETE', fmt=self.fmt)

    # The method that actually makes HTTP requests
    def urlopen(self, url, data=None, method='GET', headers=None):
        """Perform oAuth v1 signed HTTP request.

        *Parameters:*
          :url:         Target url

          :data:        Dictionary with parameters

          :method:      (optional, default ``GET``)
                        HTTP method, possible values:
                          * ``GET``
                          * ``POST``
                          * ``PUT``
                          * ``DELETE``

          :headers:     (optional, default ``{}``)
                        Dictionary with header values

        """

        if headers is None:
            headers = {}

        self.last_method = method
        self.last_url = url
        self.last_data = data

        # TODO: Headers are not supported fully yet
        # instead we pass oauth parameters in querystring
        if method in ('PUT', 'DELETE'):
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token,
                self.oauth_access_token_secret,
                {}, method)  # don't need parameters in url
        else:
            if data is None:
                data = {}
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token,
                self.oauth_access_token_secret,
                data, method)

        if method == 'GET':
            url = '{0}?{1}'.format(url, post_data)
            return self.http.urlopen(method, url)
        elif method == 'POST':
            return self.http.urlopen(
                method, url, body=post_data,
                headers={'Content-Type':
                         'application/x-www-form-urlencoded;charset=UTF-8'})
        elif method in ('PUT', 'DELETE'):
            url = '{0}?{1}'.format(url, post_data)
            headers['Content-Type'] = 'application/json'
            if data is not None:
                data_json = json.dumps(data)
            else:
                data_json = ''
            return self.http.urlopen(
                method, url, body=data_json, headers=headers)

        else:
            raise Exception('Wrong http method: {0}. Supported'
                            'methods are: '
                            'GET, POST, PUT, DELETE'.format(method))

    def read(self, url, data=None, method='GET', fmt='json'):
        """
        Returns parsed Python object or raises an error.

        *Parameters:*
          :url:       Target url

          :data:      Dictionary with parameters

          :method:    (optional, default ``GET``)
                      HTTP method, possible values:
                        * ``GET``
                        * ``POST``
                        * ``PUT``
                        * ``DELETE``

          :fmt:         (optional, default ``json``)
                        API response format.
                        Currently only ``'json'`` is supported

        """
        assert fmt == 'json', "Only JSON format is supported at the moment"

        if '/gds/' not in url:
            url = '{0}.{1}'.format(url, fmt)

        logger = logging.getLogger('python-odesk')

        logger.debug('Prepairing to make oDesk call')
        logger.debug('URL: {0}'.format(url))
        try:
            logger.debug('Data: {0}'.format(
                json.dumps(data, default=decimal_default)))
        except TypeError:
            logger.debug('Data: {0}'.format(str(data)))
        logger.debug('Method: {0}'.format(method))
        response = self.urlopen(url, data, method)

        if response.status != 200:
            logger.debug('Error: {0}'.format(response))
            raise_http_error(url, response)

        result = response.data
        logger.debug('Response: {0}'.format(result))

        if fmt == 'json':
            try:
                result = json.loads(result)
            except ValueError:
                # Not a valid json string
                logger.debug('Response is not a valid json string')
                raise IncorrectJsonResponseError(
                    json.dumps({'status': response.status, 'body': result},
                               default=decimal_default)
                )
        return result
Exemplo n.º 8
0
class Client(object):
    """
    Main API client with oAuth v1 authorization.

    """

    def __init__(self, public_key, secret_key,
                 oauth_access_token=None, oauth_access_token_secret=None,
                 format_='json', finreport=True, hr=True, mc=True,
                 provider=True, task=True, team=True,
                 timereport=True, url=True, job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.format_ = format_
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if provider:
            from odesk.routers.provider import Provider
            self.provider = Provider(self)

        if task:
            from odesk.routers.task import Task
            self.task = Task(self)

        if team:
            from odesk.routers.team import Team
            self.team = Team(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if url:
            from odesk.routers.url import Url
            self.url = Url(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)

    #Shortcuts for HTTP methods
    def get(self, url, data=None):
        return self.read(url, data, method='GET', format_=self.format_)

    def post(self, url, data=None):
        return self.read(url, data, method='POST', format_=self.format_)

    def put(self, url, data=None):
        return self.read(url, data, method='PUT', format_=self.format_)

    def delete(self, url, data=None):
        return self.read(url, data, method='DELETE', format_=self.format_)

    # The method that actually makes HTTP requests
    def urlopen(self, url, data=None, method='GET', headers=None):

        if data is None:
            data = {}

        if headers is None:
            headers = {}

        self.last_method = method
        self.last_url = url
        self.last_data = data

        # TODO: Headers are not supported fully yet
        # instead we pass oauth parameters in querystring
        post_data = self.auth.get_oauth_params(
            url, self.oauth_access_token,
            self.oauth_access_token_secret,
            data, method)

        if method == 'GET':
            url = '{0}?{1}'.format(url, post_data)
            return self.http.urlopen(method, url)
        elif method == 'POST':
            return self.http.urlopen(
                method, url, body=post_data,
                headers={'Content-Type':
                         'application/x-www-form-urlencoded;charset=UTF-8'})
        elif method in ('PUT', 'DELETE'):
            url = '{0}?{1}'.format(url, post_data)
            headers['Content-Type'] = 'application/json'
            data_json = json.dumps(data)
            return self.http.urlopen(
                method, url, body=data_json, headers=headers)

        else:
            raise Exception('Wrong http method: {0}. Supported'
                            'methods are: '
                            'GET, POST, PUT, DELETE'.format(method))

    def read(self, url, data=None, method='GET', format_='json'):
        """
        Returns parsed Python object or raises an error
        """
        assert format_ == 'json', "Only JSON format is supported at the moment"

        if '/gds/' not in url:
            url = '{0}.{1}'.format(url, format_)

        logger = logging.getLogger('python-odesk')

        logger.debug('Prepairing to make oDesk call')
        logger.debug('URL: {0}'.format(url))
        logger.debug('Data: {0}'.format(json.dumps(data)))
        logger.debug('Method: {0}'.format(method))
        response = self.urlopen(url, data, method)

        if response.status != 200:
            logger.debug('Error: {0}'.format(response))
            raise_http_error(url, response)

        result = response.data
        logger.debug('Response: {0}'.format(result))

        if format_ == 'json':
            try:
                result = json.loads(result)
            except ValueError:
                # Not a valid json string
                logger.debug('Response is not a valid json string')
                pass
        return result
Exemplo n.º 9
0
    def __init__(self,
                 public_key,
                 secret_key,
                 oauth_access_token=None,
                 oauth_access_token_secret=None,
                 fmt='json',
                 finreport=True,
                 hr=True,
                 mc=True,
                 offers=True,
                 provider=True,
                 task=True,
                 team=True,
                 timereport=True,
                 job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers
            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2
            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2
            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2
            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)
Exemplo n.º 10
0
class Client(object):
    """
    Main API client with oAuth v1 authorization.

    *Parameters:*
      :public_key:                Public API key

      :secret_key:                API key secret

      :oauth_access_token:        oAuth access token public key

      :oauth_access_token_secret: oAuth access token secret key

      :fmt:                       (optional, default ``json``)
                                  API response format.
                                  Currently only ``'json'`` is supported

      :finreport:                 (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.finreport` router

      :hr:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.hr` router

      :mc:                        (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.mc` router

      :offers:                    (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.offers` router

      :provider:                  (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.provider` router

      :task:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.task` router

      :team:                      (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.team` router

      :timereport:                (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.timereport` router

      :job:                       (optional, default ``True``)
                                  Whether to attach
                                  :py:mod:`odesk.routers.job` router

    """
    def __init__(self,
                 public_key,
                 secret_key,
                 oauth_access_token=None,
                 oauth_access_token_secret=None,
                 fmt='json',
                 finreport=True,
                 hr=True,
                 mc=True,
                 offers=True,
                 provider=True,
                 task=True,
                 team=True,
                 timereport=True,
                 job=True):

        self.public_key = public_key
        self.secret_key = secret_key
        self.fmt = fmt
        self.http = urllib3.PoolManager()

        self.oauth_access_token = oauth_access_token
        self.oauth_access_token_secret = oauth_access_token_secret

        #Namespaces
        self.auth = OAuth(self)

        if finreport:
            from odesk.routers.finreport import Finreports
            self.finreport = Finreports(self)

        if hr:
            from odesk.routers.hr import HR_V1, HR, HR_V3
            self.hr_v1 = HR_V1(self)
            self.hr = HR(self)
            self.hr_v3 = HR_V3(self)

        if mc:
            from odesk.routers.mc import MC
            self.mc = MC(self)

        if offers:
            from odesk.routers.offers import Offers
            self.offers = Offers(self)

        if provider:
            from odesk.routers.provider import Provider, Provider_V2
            self.provider = Provider(self)
            self.provider_v2 = Provider_V2(self)

        if task:
            from odesk.routers.task import Task, Task_V2
            self.task = Task(self)
            self.task_v2 = Task_V2(self)

        if team:
            from odesk.routers.team import Team, Team_V2
            self.team = Team(self)
            self.team_v2 = Team_V2(self)

        if timereport:
            from odesk.routers.timereport import TimeReport
            self.timereport = TimeReport(self)

        if job:
            from odesk.routers.job import Job
            self.job = Job(self)

    #Shortcuts for HTTP methods
    def get(self, url, data=None):
        return self.read(url, data, method='GET', fmt=self.fmt)

    def post(self, url, data=None):
        return self.read(url, data, method='POST', fmt=self.fmt)

    def put(self, url, data=None):
        return self.read(url, data, method='PUT', fmt=self.fmt)

    def delete(self, url, data=None):
        return self.read(url, data, method='DELETE', fmt=self.fmt)

    # The method that actually makes HTTP requests
    def urlopen(self, url, data=None, method='GET', headers=None):
        """Perform oAuth v1 signed HTTP request.

        *Parameters:*
          :url:         Target url

          :data:        Dictionary with parameters

          :method:      (optional, default ``GET``)
                        HTTP method, possible values:
                          * ``GET``
                          * ``POST``
                          * ``PUT``
                          * ``DELETE``

          :headers:     (optional, default ``{}``)
                        Dictionary with header values

        """

        if headers is None:
            headers = {}

        self.last_method = method
        self.last_url = url
        self.last_data = data

        # TODO: Headers are not supported fully yet
        # instead we pass oauth parameters in querystring
        if method in ('PUT', 'DELETE'):
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token, self.oauth_access_token_secret,
                {}, method)  # don't need parameters in url
        else:
            if data is None:
                data = {}
            post_data = self.auth.get_oauth_params(
                url, self.oauth_access_token, self.oauth_access_token_secret,
                data, method)

        if method == 'GET':
            url = '{0}?{1}'.format(url, post_data)
            return self.http.urlopen(method, url)
        elif method == 'POST':
            return self.http.urlopen(
                method,
                url,
                body=post_data,
                headers={
                    'Content-Type':
                    'application/x-www-form-urlencoded;charset=UTF-8'
                })
        elif method in ('PUT', 'DELETE'):
            url = '{0}?{1}'.format(url, post_data)
            headers['Content-Type'] = 'application/json'
            if data is not None:
                data_json = json.dumps(data)
            else:
                data_json = ''
            return self.http.urlopen(method,
                                     url,
                                     body=data_json,
                                     headers=headers)

        else:
            raise Exception('Wrong http method: {0}. Supported'
                            'methods are: '
                            'GET, POST, PUT, DELETE'.format(method))

    def read(self, url, data=None, method='GET', fmt='json'):
        """
        Returns parsed Python object or raises an error.

        *Parameters:*
          :url:       Target url

          :data:      Dictionary with parameters

          :method:    (optional, default ``GET``)
                      HTTP method, possible values:
                        * ``GET``
                        * ``POST``
                        * ``PUT``
                        * ``DELETE``

          :fmt:         (optional, default ``json``)
                        API response format.
                        Currently only ``'json'`` is supported

        """
        assert fmt == 'json', "Only JSON format is supported at the moment"

        if '/gds/' not in url:
            url = '{0}.{1}'.format(url, fmt)

        logger = logging.getLogger('python-odesk')

        logger.debug('Prepairing to make oDesk call')
        logger.debug('URL: {0}'.format(url))
        try:
            logger.debug('Data: {0}'.format(
                json.dumps(data, default=decimal_default)))
        except TypeError:
            logger.debug('Data: {0}'.format(str(data)))
        logger.debug('Method: {0}'.format(method))
        response = self.urlopen(url, data, method)

        if response.status != 200:
            logger.debug('Error: {0}'.format(response))
            raise_http_error(url, response)

        result = response.data
        logger.debug('Response: {0}'.format(result))

        if fmt == 'json':
            try:
                result = json.loads(result)
            except ValueError:
                # Not a valid json string
                logger.debug('Response is not a valid json string')
                raise IncorrectJsonResponseError(
                    json.dumps({
                        'status': response.status,
                        'body': result
                    },
                               default=decimal_default))
        return result