Django ZoHo Python SDK v2 CRM Инициализация проблемы - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь интегрировать ZoHo CRM v2 SDK с моим приложением Django. На сервере запуска Django я могу получить токены доступа и использовать метод refresh и сохранить их в файле zcrm_oauthtokens.pkl. Затем SDK автоматически обновляет токен доступа, используя токен обновления, поэтому здесь нет проблем. Однако на моем производственном сервере (heroku) я получаю это сообщение об ошибке:

2019-01-16T11:07:22.314759+00:00 app[web.1]: 2019-01-16 11:07:22,314    - Client_Library_OAUTH - ERROR - Exception occured while fetching oauthtoken from db; Exception Message::'NoneType' object has no attribute 'accessToken'

Мне кажется, что токены сохраняются в файл, но когда sdk пытается получить к ним доступ, он ищет их в БД, а не в файле, указанном в token_persistence_path.

В моем settings.py у меня есть это:

ZOHO_CLIENT_ID = config('ZOHO_CLIENT_ID')
ZOHO_CLIENT_SECRET = config('ZOHO_CLIENT_SECRET')
ZOHO_REDIRECT_URI = config('ZOHO_REDIRECT_URI')
ZOHO_CURRENT_USER_EMAIL = 'jamesalexander@mylastwill.co.uk'
ZOHO_PATH = os.path.join(BASE_DIR, 'wills_online', 'zoho')

zoho_config = {'apiBaseUrl': "https://www.zohoapis.com",
               'currentUserEmail': ZOHO_CURRENT_USER_EMAIL,
               'client_id': ZOHO_CLIENT_ID,
               'client_secret': ZOHO_CLIENT_SECRET,
               'redirect_uri': ZOHO_REDIRECT_URI,
               'token_persistence_path': ZOHO_PATH}

и в файле представлений у меня есть это:

from zcrmsdk import *
import logging
from django.shortcuts import HttpResponse
from wills.models import PersonalDetails, ZoHoRecord, WillDocument
from wills_online.decorators import start_new_thread
from wills_online.settings import zoho_config
logger = logging.getLogger(__name__)


class ZohoRunOnce:
    def __init__(self):
        self.already_run = False

    def run_once(self):
        if not self.already_run:
            print('zoho init run once')
            ZCRMRestClient.initialize(zoho_config)
            self.already_run = True

zoho_init = ZohoRunOnce()
zoho_init.run_once()
print(zoho_config['token_persistence_path'])


def zoho_callback():
    return HttpResponse(200)

@start_new_thread
def zoho_personal_details(request):
    """ updates or create a user account on zoho on profile completion """

    personal_details_ob = PersonalDetails.objects.get(user=request.user)
    zoho_ob = ZoHoRecord.objects.get(user=request.user)

    try:
        if zoho_ob.account:
            record = ZCRMRecord.get_instance('Accounts', zoho_ob.account)
            record.set_field_value('Account_Name', request.user.email)
            record.set_field_value('Name', personal_details_ob.full_name)
            record.set_field_value('Email', request.user.email)
            record.set_field_value('Address_Line_1', personal_details_ob.address_line_1)
            record.set_field_value('Address_Line_2', personal_details_ob.address_line_2)
            record.set_field_value('Post_Town', personal_details_ob.post_town)
            record.set_field_value('Post_Code', personal_details_ob.post_code)
            record.set_field_value('Dob_Day', personal_details_ob.dob_day)
            record.set_field_value('Dob_Month', personal_details_ob.dob_month)
            record.set_field_value('Dob_Year', personal_details_ob.dob_year)
            record.set_field_value('Gender', personal_details_ob.sex)
            record.set_field_value('Marital_Status', personal_details_ob.marital_status)
            record.set_field_value('Partner_Name', personal_details_ob.partner_full_name)
            record.set_field_value('Partner_Gender', personal_details_ob.partner_gender)
            record.set_field_value('Partner_Email', personal_details_ob.partner_email)
            record.set_field_value('Children', personal_details_ob.children)
            record.set_field_value('Pets', personal_details_ob.pets)
            record.update()
        else:
            user = ZCRMUser.get_instance(name='James Alexander')
            record = ZCRMRecord.get_instance('Accounts')
            record.set_field_value('Account_Owner', user)
            record.set_field_value('Account_Name', request.user.email)
            record.set_field_value('Name', personal_details_ob.full_name)
            record.set_field_value('Email', request.user.email)
            record.set_field_value('Address_Line_1', personal_details_ob.address_line_1)
            record.set_field_value('Address_Line_2', personal_details_ob.address_line_2)
            record.set_field_value('Post_Town', personal_details_ob.post_town)
            record.set_field_value('Post_Code', personal_details_ob.post_code)
            record.set_field_value('Dob_Day', personal_details_ob.dob_day)
            record.set_field_value('Dob_Month', personal_details_ob.dob_month)
            record.set_field_value('Dob_Year', personal_details_ob.dob_year)
            record.set_field_value('Gender', personal_details_ob.sex)
            record.set_field_value('Marital_Status', personal_details_ob.marital_status)
            record.set_field_value('Partner_Name', personal_details_ob.partner_full_name)
            record.set_field_value('Partner_Gender', personal_details_ob.partner_gender)
            record.set_field_value('Partner_Email', personal_details_ob.partner_email)
            record.set_field_value('Children', personal_details_ob.children)
            record.set_field_value('Pets', personal_details_ob.pets)
            response = record.create()
            # save account id to db for future updates
            zoho_ob.account = response.details['id']
            zoho_ob.save()

    except ZCRMException as ex:
        logger.log(1, ex.status_code)
        logger.log(1, ex.error_message)
        logger.log(1, ex.error_details)
        logger.log(1, ex.error_content)
        print(ex.status_code)
        print(ex.error_message)
        print(ex.error_content)
        print(ex.error_details)

Я попытался запустить ZCRMRestClient.initialize (zoho_config) в settings.py, но безуспешно.

Мой метод получения токена доступа и обновления, который, кажется, работает:

import os
import pprint
from sys import argv

import django
import requests
import zcrmsdk
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wills_online.settings')
django.setup()


def zoho_refresh_token(code):
    """ supply a self client token from the zoho api credentials from web site """

    zoho_config = {"apiBaseUrl": "https://www.zohoapis.com",
               "currentUserEmail": settings.ZOHO_CURRENT_USER_EMAIL,
               "client_id": settings.ZOHO_CLIENT_ID,
               "client_secret": settings.ZOHO_CLIENT_SECRET,
               "redirect_uri": settings.ZOHO_REDIRECT_URI,
               "token_persistence_path": settings.ZOHO_PATH}

pprint.pprint(zoho_config)

print('working')
address = f'https://accounts.zoho.com/oauth/v2/token?code={code}&redirect_uri={settings.ZOHO_REDIRECT_URI}&client_id={settings.ZOHO_CLIENT_ID}&client_secret={settings.ZOHO_CLIENT_SECRET}&grant_type=authorization_code'
response = requests.post(address)
data = response.json()
pprint.pprint(data)
zcrmsdk.ZCRMRestClient.initialize(zoho_config)
oauth_client = zcrmsdk.ZohoOAuth.get_client_instance()
refresh_token = data['refresh_token']
print(type(refresh_token))
oauth_client.generate_access_token_from_refresh_token(refresh_token, settings.ZOHO_CURRENT_USER_EMAIL)

print(refresh_token)
print('finished')

если имя == ' main ': zoho_refresh_token (ARGV [1])

Это сводит меня с ума. Помощь будет принята с благодарностью. Это мой первый пост, так что давай, лол.

...