예제 #1
0
    def authenticate(self, **kwargs):
        self.__login_api = LoginWithSoapAPI(
            self.httplib,
            self.url_resources,
            **kwargs)

        return self.__login_api.authenticate()
class SalesforceSoapAPI(SalesforceAPI):
    def __init__(self, httplib, url_resources, auth=None):
        super(SalesforceSoapAPI, self).__init__(url_resources, httplib, auth)

        self.__login_api = None

    def authenticate(self, **kwargs):
        self.__login_api = LoginWithSoapAPI(self.httplib, self.url_resources,
                                            **kwargs)

        return self.__login_api.authenticate()

    @utils.authenticate
    def query(self, query_string):
        return self.post(query_string, SalesforceSoapAPI.Action.QUERY)

    @utils.authenticate
    def query_all(self, query_string):
        response = self.post(query_string, SalesforceSoapAPI.Action.QUERYALL)
        xml_resp_value = xml.dom.minidom.parseString(response.text)

        def do_query_all(xml_response_value):
            done = utils.get_element_by_name(xml_response_value, 'done')

            if done:
                return response
            else:
                query_locator = utils.get_element_by_name(
                    xml_response_value, 'queryLocator')

                result = self.query_more(query_locator)
                xml_result_value = xml.dom.minidom.parseString(result.text)

                done = utils.get_element_by_name(xml_result_value, 'done')
                total_size = utils.get_element_by_name(xml_result_value,
                                                       'totalSize')
                records = utils.get_element_by_name(xml_result_value,
                                                    'records')

                xml_response_value.getElementsByTagName('done').item(
                    0).firstChild.nodeValue = done
                xml_response_value.getElementsByTagName('totalSize').item(
                    0).firstChild.nodeValue += total_size
                xml_response_value.getElementsByTagName('records').appendChild(
                    records)

                return do_query_all(xml_response_value)

        return do_query_all(xml_resp_value)

    @utils.authenticate
    def query_more(self, query_string):
        return self.post(query_string, SalesforceSoapAPI.Action.QUERYMORE)

    @utils.authenticate
    def search(self, search_string):
        return self.post(search_string, SalesforceSoapAPI.Action.SEARCH)

    @utils.authenticate
    def quick_search(self, search_string):
        return self.search('FIND {%s}' % search_string)

    @utils.authenticate
    def post(self, data, action):
        body = ''

        if action == SalesforceSoapAPI.Action.QUERY:
            body = query_body = utils.get_soap_query_body(data)

        elif action == SalesforceSoapAPI.Action.QUERYMORE:
            body = utils.get_soap_query_more_body(data)

        elif action == SalesforceSoapAPI.Action.QUERYALL:
            body = utils.get_soap_query_body(data)

        elif action == SalesforceSoapAPI.Action.SEARCH:
            body = utils.get_soap_search_body(data)

        else:
            raise ValueError("'action' " + action + " is not supported!")

        request_body = utils.soap_request_header().format(
            access_token=self.auth.access_token, method=action, request=body)

        post_url = self.url_resources.get_full_resource_url(
            self.auth.instance_url)

        return self.__send_request('POST', post_url, action, data=request_body)

    @utils.authenticate
    def get(self, get_url, params=None):
        pass

    @utils.authenticate
    def __getattr__(self, name):
        if not name[0].isalpha():
            return object.__getattribute__(self, name)

        return SoapSObject(name, self.httplib, self.auth, self.url_resources)

    def __getstate__(self):
        return self.__dict__

    def __setstate__(self, d):
        self.__dict__.update(d)

    def __send_request(self, method, url, action, **kwargs):
        headers = utils.xml_content_headers(len(kwargs['data']), action)

        request_url = utils.get_request_url(
            url, self.auth.instance_url, self.url_resources.get_resource_url())

        return utils.send_request(method, self.httplib, request_url, headers,
                                  **kwargs)

    class Action(object):
        QUERY = 'query'
        QUERYALL = 'queryAll'
        QUERYMORE = 'queryMore'
        SEARCH = 'search'
class SalesforceSoapAPI(SalesforceAPI):
    def __init__(self,
                 httplib,
                 url_resources,
                 auth=None):
        super(SalesforceSoapAPI, self).__init__(url_resources, httplib, auth)

        self.__login_api = None

    def authenticate(self, **kwargs):
        self.__login_api = LoginWithSoapAPI(
            self.httplib,
            self.url_resources,
            **kwargs)

        return self.__login_api.authenticate()

    @utils.authenticate
    def query(self, query_string):
        return self.post(query_string, SalesforceSoapAPI.Action.QUERY)

    @utils.authenticate
    def query_all(self, query_string):
        response = self.post(query_string, SalesforceSoapAPI.Action.QUERYALL)
        xml_resp_value = xml.dom.minidom.parseString(response.text.encode('utf-8'))

        def do_query_all(xml_response_value):
            done = utils.get_element_by_name(xml_response_value, 'done')

            if done:
                return response
            else:
                query_locator = utils.get_element_by_name(xml_response_value, 'queryLocator')

                result = self.query_more(query_locator)
                xml_result_value = xml.dom.minidom.parseString(result.text.encode('utf-8'))

                done = utils.get_element_by_name(xml_result_value, 'done')
                total_size = utils.get_element_by_name(xml_result_value, 'totalSize')
                records = utils.get_element_by_name(xml_result_value, 'records')

                xml_response_value.getElementsByTagName('done').item(0).firstChild.nodeValue = done
                xml_response_value.getElementsByTagName('totalSize').item(0).firstChild.nodeValue += total_size
                xml_response_value.getElementsByTagName('records').appendChild(records)

                return do_query_all(xml_response_value)

        return do_query_all(xml_resp_value)

    @utils.authenticate
    def query_more(self, query_string):
        return self.post(query_string, SalesforceSoapAPI.Action.QUERYMORE)

    @utils.authenticate
    def search(self, search_string):
        return self.post(search_string, SalesforceSoapAPI.Action.SEARCH)

    @utils.authenticate
    def quick_search(self, search_string):
        return self.search('FIND {%s}' % search_string)

    @utils.authenticate
    def post(self, data, action):
        body = ''

        if action == SalesforceSoapAPI.Action.QUERY:
            body = utils.get_soap_query_body(data)

        elif action == SalesforceSoapAPI.Action.QUERYMORE:
            body = utils.get_soap_query_more_body(data)

        elif action == SalesforceSoapAPI.Action.QUERYALL:
            body = utils.get_soap_query_body(data)

        elif action == SalesforceSoapAPI.Action.SEARCH:
            body = utils.get_soap_search_body(data)

        else:
            raise ValueError("'action' " + action + " is not supported!")

        request_body = utils.soap_request_header().format(
            access_token=self.auth.access_token,
            method=action,
            request=body)

        post_url = self.url_resources.get_full_resource_url(
            self.auth.instance_url)

        return self.__send_request('POST',
                                   post_url,
                                   action,
                                   data=request_body)

    @utils.authenticate
    def get(self, get_url, params=None):
        pass

    @utils.authenticate
    def __getattr__(self, name):
        if not name[0].isalpha():
            return object.__getattribute__(self, name)

        return SoapSObject(name,
                           self.httplib,
                           self.auth,
                           self.url_resources)

    def __getstate__(self):
        return self.__dict__

    def __setstate__(self, d):
        self.__dict__.update(d)

    def __send_request(self, method, url, action, **kwargs):
        headers = utils.xml_content_headers(len(kwargs['data']), action)

        request_url = utils.get_request_url(url, self.auth.instance_url, self.url_resources.get_resource_url())

        return utils.send_request(method,
                                  self.httplib,
                                  request_url,
                                  headers,
                                  **kwargs)

    class Action(object):
        QUERY = 'query'
        QUERYALL = 'queryAll'
        QUERYMORE = 'queryMore'
        SEARCH = 'search'