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
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}')
|
|
|
|
|
|
|