You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.9 KiB
Python

import requests
import frappe
from sps_integration.sps_integration.constants import AUTHORIZATION_URL
import secrets
import json
@frappe.whitelist()
def authenticate(setting_doc_name:str,**kwargs) -> None:
"""
"""
# Maintain Secret State
state = secrets.token_hex(10)
frappe.cache().set_value("state",state)
# Pre-requisites
setting_doc = frappe.get_doc("SPS Integration Settings",setting_doc_name)
setting_doc.state = state
setting_doc.save()
frappe.db.commit()
return AUTHORIZATION_URL(
audience="api://api.spscommerce.com/",
client_id=setting_doc.get_password("client_id"),
redirect_uri = setting_doc.redirect_uri,
response_type = "code",
state = state,
scope = "offline_access"
)
@frappe.whitelist(allow_guest=True)
def redirect_uri(**kwargs) -> None:
"""
"""
code = kwargs.get("code")
state = kwargs.get("state")
frappe.log_error(title="Code",message=f"{code},{state}")
if not state == frappe.cache().get_value("state"):
# frappe.respond_as_webpages()
return
setting_doc = frappe.get_doc("SPS Integration Settings",{"state":state})
# setting_doc.state = ""
# setting_doc.save()
# frappe.db.commit()
client_id = setting_doc.get_password('client_id')
client_secret = setting_doc.get_password('client_secret')
redirect_uri = setting_doc.redirect_uri
api_url = setting_doc.sps_api_uri
grant_type = "authorization_code"
headers = {
'Content-Type': 'application/json'
}
data = {
"client_id":client_id,
"client_secret":client_secret,
"grant_type":grant_type,
"code":code,
"redirect_uri":redirect_uri
}
url = api_url + "oauth/token"
response = requests.post(url = url,data=json.dumps(data),headers = headers)
if response.status_code in [200,201]:
response_json = response.json()
access_token = response_json.get("access_token")
refresh_token = response_json.get("refresh_token")
expires_in_sec = response_json.get('expires_in')
expires_in = frappe.utils.add_to_date(frappe.utils.now_datetime(),seconds=expires_in_sec)
setting_doc.access_token = access_token
setting_doc.refresh_token = refresh_token
setting_doc.expires_on = expires_in
setting_doc.state = ""
setting_doc.save()
frappe.db.commit()
else:
frappe.log_error(title= 'SPS API Error',message =f'Error in Access Token API Call \n\n Response:{response.text}')
# return data
@frappe.whitelist()
def refresh_access_token(setting_doc_name:str) -> None:
"""
"""
setting_doc = frappe.get_doc("SPS Integration Settings",setting_doc_name)
client_id = setting_doc.get_password('client_id')
client_secret = setting_doc.get_password('client_secret')
refresh_token = setting_doc.get_password('refresh_token')
api_url = setting_doc.sps_api_uri
url = api_url + "oauth/token"
headers = {
'Content-Type': 'application/json'
}
data = {
"client_id":client_id,
"client_secret":client_secret,
"grant_type":"refresh_token",
"refresh_token":refresh_token,
}
response = requests.post(url = url,data=json.dumps(data),headers = headers)
frappe.log_error(title="Response",message=f"{response.text}")
if response.status_code in [200,201]:
response_json = response.json()
access_token = response_json.get("access_token")
expires_in_sec = response_json.get('expires_in')
expires_in = frappe.utils.add_to_date(frappe.utils.now_datetime(),seconds=expires_in_sec)
setting_doc.access_token = access_token
setting_doc.expires_on = expires_in
setting_doc.save()
frappe.db.commit()
else:
frappe.log_error(title= 'SPS API Error',message =f'Error in Refreshing access Token \n\n Response:{response.text}')