Features: 1) Add support for authorization code grant type in the Amo gateway.
Fixes: 1) Improve validation logic to ensure only one default CRM provider within the model. Extra: 1) Replace CRM object string representation to use `name` instead of `crm_lead_id`; 2) Refactor token caching to improve reliability and readability.
This commit is contained in:
parent
3769482f56
commit
0ca0756e50
2 changed files with 19 additions and 14 deletions
|
|
@ -25,11 +25,9 @@ class AmoCRM:
|
||||||
|
|
||||||
self.client_id = self.instance.authentication.get("client_id")
|
self.client_id = self.instance.authentication.get("client_id")
|
||||||
self.client_secret = self.instance.authentication.get("client_secret")
|
self.client_secret = self.instance.authentication.get("client_secret")
|
||||||
|
self.authorization_code = self.instance.authentication.get("authorization_code")
|
||||||
self.refresh_token = cache.get("amo_refresh_token")
|
self.refresh_token = cache.get("amo_refresh_token")
|
||||||
|
|
||||||
self.redirect_uri = self.instance.attributes.get("redirect_uri")
|
|
||||||
self.pipeline_id = self.instance.attributes.get("pipeline_id")
|
|
||||||
self.stage_map = self.instance.attributes.get("stage_map")
|
|
||||||
self.responsible_user_id = self.instance.attributes.get("responsible_user_id")
|
self.responsible_user_id = self.instance.attributes.get("responsible_user_id")
|
||||||
|
|
||||||
self.fns_api_key = self.instance.attributes.get("fns_api_key")
|
self.fns_api_key = self.instance.attributes.get("fns_api_key")
|
||||||
|
|
@ -39,7 +37,7 @@ class AmoCRM:
|
||||||
self.base,
|
self.base,
|
||||||
self.client_id,
|
self.client_id,
|
||||||
self.client_secret,
|
self.client_secret,
|
||||||
self.redirect_uri,
|
self.authorization_code,
|
||||||
self.fns_api_key,
|
self.fns_api_key,
|
||||||
]
|
]
|
||||||
):
|
):
|
||||||
|
|
@ -53,17 +51,20 @@ class AmoCRM:
|
||||||
payload = {
|
payload = {
|
||||||
"client_id": self.client_id,
|
"client_id": self.client_id,
|
||||||
"client_secret": self.client_secret,
|
"client_secret": self.client_secret,
|
||||||
"grant_type": "refresh_token",
|
|
||||||
"refresh_token": self.refresh_token,
|
|
||||||
"redirect_uri": self.redirect_uri,
|
|
||||||
}
|
}
|
||||||
|
if self.refresh_token:
|
||||||
|
payload["grant_type"] = "refresh_token"
|
||||||
|
payload["refresh_token"] = self.refresh_token
|
||||||
|
else:
|
||||||
|
payload["grant_type"] = "authorization_code"
|
||||||
|
payload["code"] = self.authorization_code
|
||||||
r = requests.post(f"{self.base}/oauth2/access_token", json=payload, timeout=15)
|
r = requests.post(f"{self.base}/oauth2/access_token", json=payload, timeout=15)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
data = r.json()
|
data = r.json()
|
||||||
self._cached_token = data["access_token"]
|
self.access_token = data["access_token"]
|
||||||
self._cached_expiry = time.time() + int(data.get("expires_in", 900))
|
cache.set("amo_refresh_token", data["refresh_token"], 604800)
|
||||||
self.refresh_token = data.get("refresh_token", self.refresh_token)
|
self.refresh_token = data["refresh_token"]
|
||||||
return self._cached_token
|
return self.access_token
|
||||||
|
|
||||||
def _headers(self) -> dict:
|
def _headers(self) -> dict:
|
||||||
return {"Authorization": f"Bearer {self._token()}", "Content-Type": "application/json"}
|
return {"Authorization": f"Bearer {self._token()}", "Content-Type": "application/json"}
|
||||||
|
|
|
||||||
|
|
@ -1969,10 +1969,14 @@ class CustomerRelationshipManagementProvider(ExportModelOperationsMixin("crm_pro
|
||||||
default = BooleanField(default=False)
|
default = BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.crm_lead_id
|
return self.name
|
||||||
|
|
||||||
def save(self, **kwargs):
|
def save(self, **kwargs):
|
||||||
if self.objects.filter(default=True).exists():
|
if self.default:
|
||||||
|
qs = type(self).objects.all()
|
||||||
|
if self.pk:
|
||||||
|
qs = qs.exclude(pk=self.pk)
|
||||||
|
if qs.filter(default=True).exists():
|
||||||
raise ValueError(_("you can only have one default CRM provider"))
|
raise ValueError(_("you can only have one default CRM provider"))
|
||||||
super().save(**kwargs)
|
super().save(**kwargs)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue