Пример #1
0
class SalesforceSOAP(object):
    def __init__(self, token):
        self.token = token
        profile = requests.post(token.id_url, data={'access_token': self.token.access_token})
        self.partner_url = profile.json()['urls']['partner'].replace('{version}', '35.0')
        self.client = SforcePartnerClient('integrations/salesforce/partner.wsdl')
        self.force_oauth_login(self.token.access_token, self.partner_url)
        self.merge_batches = []
        self.merge_queue = []
        self.log = open_s3(token.user.email + '-merge_log', 'wb')
        self.log_writer = csv.writer(self.log)
        self.log_writer.writerow(['Record group', 'Record ID', 'Master ID', 'Canonical'])
        self.merge_count = 0

    def refresh_token(self):
        self.token.refresh()
        self.force_oauth_login(self.token.access_token, self.partner_url)

    def force_oauth_login(self, access_token, soap_endpoint):
        self.client._setHeaders('login')
        header = self.client.generateHeader('SessionHeader')
        header.sessionId = access_token
        self.client.setSessionHeader(header)
        self.client._sessionId = access_token
        self.client._setEndpoint(soap_endpoint)

    def append_merge(self, merge_request):
        self.merge_queue.append(merge_request)
        if len(self.merge_queue) > 6:
            self.merge_batches.append(self.merge_queue)
            self.merge_queue = []

    def commit_merges(self):
        if self.merge_queue:
            self.merge_batches.append(self.merge_queue)
        self.merge_queue = []

        for batch in self.merge_batches:
            self.refresh_token()

            try:
                result = self.client.merge(batch)
            except Exception as e:
                print 'SF SOAP merge batch failed with message: {0}'.format(e.message)  # TODO: log this somewhere
                yield []
            else:
                yield result

    def merge_group(self, group, canonical, updateable):
        self.merge_count += 1
        master = self.client.generateObject('Lead')
        master.Id = group[0]['Id'].decode('utf-8')
        for key, value in canonical.viewitems():
            if value and key in updateable:
                value = value.decode('utf-8')
                setattr(master, key, value)
        self.log_writer.writerow([self.merge_count, group[0]['Id'], '', json.dumps(canonical)])
        for i in range(1, len(group), 2):
            merge_request = self.client.generateObject('MergeRequest')
            merge_request.masterRecord = master
            merge_request.recordToMergeIds = [group[i]['Id'].decode('utf-8')]
            self.log_writer.writerow([self.merge_count, group[i]['Id'], master.Id, json.dumps(canonical)])
            try:
                merge_request.recordToMergeIds.append(group[i + 1]['Id'].decode('utf-8'))
                self.log_writer.writerow([self.merge_count, group[i + 1]['Id'], master.Id, json.dumps(canonical)])
            except IndexError:
                pass
            self.append_merge(merge_request)