Skip to content

Commit e1b15da

Browse files
author
Hadrien Huvelle
committed
Store postlogistic token in carrier to avoid renew it for each jobs
1 parent 1eabb08 commit e1b15da

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed

delivery_carrier_label_batch/data/queue.job.function.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<odoo>
22
<record id="job_delivery_carrier_batch_send_to_shipper" model="queue.job.function">
33
<field name="model_id" ref="model_stock_picking" />
4-
<field name="method">send_to_shipper</field>
4+
<field name="method">model_delivery_carrier_label_generate</field>
55
<field name="channel_id" ref="channel_delivery_carrier_batch" />
66
</record>
77
<record

delivery_carrier_label_batch/wizard/generate_labels.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import logging
55
from itertools import groupby
66

7+
from psycopg2 import OperationalError
8+
79
from odoo import api, exceptions, fields, models
810
from odoo.tools.safe_eval import safe_eval
911

1012
from odoo.addons.queue_job.delay import chain
1113
from odoo.addons.queue_job.delay import group as job_group
14+
from odoo.addons.queue_job.exception import RetryableJobError
1215

1316
from ..pdf_utils import assemble_pdf
1417
from ..zpl_utils import assemble_zpl2, assemble_zpl2_single_images
@@ -72,10 +75,23 @@ def _do_generate_labels(self, group):
7275
jobs = []
7376
for pack, picking, _label in group:
7477
_logger.debug("Generating label for pack %s", pack.name)
75-
job = picking.delayable().send_to_shipper()
78+
job = self.delayable().retriable_send_to_shipper(picking)
7679
jobs.append(job)
7780
return jobs
7881

82+
def retriable_send_to_shipper(self, picking):
83+
"""Wrapper to call send_to_shipper in a retriable way"""
84+
self.ensure_one()
85+
try:
86+
picking.send_to_shipper()
87+
except OperationalError as oe:
88+
_logger.error("Error sending to shipper: %s", oe.diag)
89+
raise RetryableJobError(
90+
oe.diag,
91+
seconds=3,
92+
# ignore_retry=True,
93+
) from oe
94+
7995
def _generate_all_labels(self, batch):
8096
self.ensure_one()
8197

delivery_postlogistics/models/delivery_carrier.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ class DeliveryCarrier(models.Model):
3030
postlogistics_client_secret = fields.Char(
3131
string="Client Secret", groups="base.group_system"
3232
)
33+
34+
postlogistics_token = fields.Char(string="Access Token", groups="base.group_system")
35+
postlogistics_token_expiry = fields.Datetime(
36+
string="Access Token Expiry", groups="base.group_system"
37+
)
38+
3339
postlogistics_logo = fields.Binary(
3440
string="Company Logo on Post labels",
3541
help="Optional company logo to show on label.\n"

delivery_postlogistics/postlogistics/web_service.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ class PostlogisticsWebService:
6060
6161
"""
6262

63-
access_token = False
64-
access_token_expiry = False
6563
_lock = threading.Lock()
6664

6765
def __init__(self, company):
@@ -267,6 +265,15 @@ def _request_access_token(cls, delivery_carrier):
267265
)
268266
)
269267

268+
sql = (
269+
f"SELECT id FROM {delivery_carrier._table} WHERE ID = %s FOR UPDATE NOWAIT"
270+
)
271+
272+
# this may raise an OperationalError if the lock cannot be acquired
273+
delivery_carrier.env.cr.execute(
274+
sql, (delivery_carrier.id,), log_exceptions=False
275+
)
276+
270277
response = requests.post(
271278
url=authentication_url,
272279
headers={"content-type": "application/x-www-form-urlencoded"},
@@ -299,19 +306,30 @@ def _request_access_token(cls, delivery_carrier):
299306
@classmethod
300307
def get_access_token(cls, picking_carrier):
301308
"""Threadsafe access to token"""
309+
302310
with cls._lock:
303311
now = datetime.now()
304312

305-
if cls.access_token:
313+
# ensure token exists and is not expired
314+
if (
315+
picking_carrier.postlogistics_token
316+
and picking_carrier.postlogistics_token_expiry
317+
):
306318
# keep a safe margin on the expiration
307-
expiry = cls.access_token_expiry - timedelta(seconds=5)
319+
expiry = picking_carrier.postlogistics_token_expiry - timedelta(
320+
seconds=5
321+
)
308322
if now < expiry:
309-
return cls.access_token
323+
return picking_carrier.postlogistics_token
310324

325+
# obtain a new token if needed
311326
response = cls._request_access_token(picking_carrier)
312-
cls.access_token = response.get("access_token", False)
327+
picking_carrier.postlogistics_token = response.get("access_token", False)
328+
picking_carrier.postlogistics_token_expiry = now + timedelta(
329+
seconds=response["expires_in"]
330+
)
313331

314-
if not (cls.access_token):
332+
if not (picking_carrier.postlogistics_token):
315333
raise UserError(
316334
picking_carrier.env._(
317335
"Authorization Required\n\n"
@@ -321,8 +339,10 @@ def get_access_token(cls, picking_carrier):
321339
)
322340
)
323341

324-
cls.access_token_expiry = now + timedelta(seconds=response["expires_in"])
325-
return cls.access_token
342+
picking_carrier.postlogistics_token_expiry = now + timedelta(
343+
seconds=response["expires_in"]
344+
)
345+
return picking_carrier.postlogistics_token
326346

327347
def generate_label(self, picking, packages):
328348
"""Generate a label for a picking

0 commit comments

Comments
 (0)