157 lines
5 KiB
Python
157 lines
5 KiB
Python
import logging
|
|
from datetime import datetime
|
|
from datetime import timedelta
|
|
|
|
from odoo import fields
|
|
from odoo.http import request
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def _get_day_names(self, env=None, request_obj=None):
|
|
"""Get translated day names list (0=Monday to 6=Sunday)."""
|
|
req = request_obj or request
|
|
if env is None:
|
|
env = req.env
|
|
|
|
context_lang = env.context.get("lang", "NO_LANG")
|
|
_logger.info("📅 _get_day_names called with context lang: %s", context_lang)
|
|
|
|
group_order_model = env["group.order"]
|
|
fields_def = group_order_model.fields_get(["pickup_day"])
|
|
selection_options = fields_def.get("pickup_day", {}).get("selection", [])
|
|
day_names = [name for value, name in selection_options]
|
|
_logger.info(
|
|
"📅 Returning day names: %s",
|
|
day_names[:3] if len(day_names) >= 3 else day_names,
|
|
)
|
|
return day_names
|
|
|
|
|
|
def _get_next_date_for_weekday(self, weekday_num, start_date=None):
|
|
if start_date is None:
|
|
start_date = datetime.now().date()
|
|
target_weekday = int(weekday_num)
|
|
current_weekday = start_date.weekday()
|
|
days_ahead = target_weekday - current_weekday
|
|
if days_ahead <= 0:
|
|
days_ahead += 7
|
|
return start_date + timedelta(days=days_ahead)
|
|
|
|
|
|
def _slot_time_label(self, slot):
|
|
try:
|
|
if slot.label:
|
|
return slot.label
|
|
sh = float(slot.start_hour or 0.0)
|
|
eh = float(slot.end_hour or 0.0)
|
|
sh_h = int(sh)
|
|
sh_m = int(round((sh - sh_h) * 60))
|
|
eh_h = int(eh)
|
|
eh_m = int(round((eh - eh_h) * 60))
|
|
return f"{sh_h:02d}:{sh_m:02d}-{eh_h:02d}:{eh_m:02d}"
|
|
except Exception as exc:
|
|
_logger.debug(
|
|
"_slot_time_label: failed for slot %s: %s", getattr(slot, "id", None), exc
|
|
)
|
|
return ""
|
|
|
|
|
|
def _format_datetime_to_str(self, dt_val):
|
|
if not dt_val:
|
|
return ""
|
|
try:
|
|
if isinstance(dt_val, str):
|
|
dt = fields.Datetime.to_datetime(dt_val)
|
|
return dt.strftime("%d/%m/%Y")
|
|
if hasattr(dt_val, "strftime"):
|
|
return dt_val.strftime("%d/%m/%Y")
|
|
return str(dt_val)
|
|
except Exception:
|
|
return str(dt_val)
|
|
|
|
|
|
def _format_slot_pickup_info(self, group_order, slot, request_obj=None):
|
|
pickup_day_name = ""
|
|
pickup_date_str = ""
|
|
pickup_day_index = None
|
|
try:
|
|
pickup_day_index = int(slot.weekday)
|
|
except Exception:
|
|
pickup_day_index = None
|
|
|
|
if pickup_day_index is not None:
|
|
try:
|
|
req = request_obj or request
|
|
day_names = _get_day_names(self, env=req.env, request_obj=req)
|
|
pickup_day_name = day_names[pickup_day_index % len(day_names)]
|
|
except Exception:
|
|
pickup_day_name = ""
|
|
|
|
time_label = _slot_time_label(self, slot)
|
|
|
|
dt_val = getattr(group_order, "next_pickup_datetime", None) or getattr(
|
|
group_order, "pickup_date", None
|
|
)
|
|
pickup_date_str = _format_datetime_to_str(self, dt_val)
|
|
|
|
if time_label:
|
|
pickup_day_name = (
|
|
f"{pickup_day_name} {time_label}" if pickup_day_name else time_label
|
|
)
|
|
|
|
return pickup_day_name, pickup_date_str, pickup_day_index
|
|
|
|
|
|
def _format_legacy_pickup_info(self, group_order, is_delivery, request_obj=None):
|
|
pickup_day_name = ""
|
|
pickup_date_str = ""
|
|
pickup_day_index = None
|
|
try:
|
|
pickup_day_index = int(group_order.pickup_day)
|
|
except Exception:
|
|
pickup_day_index = None
|
|
|
|
if pickup_day_index is not None:
|
|
try:
|
|
req = request_obj or request
|
|
day_names = _get_day_names(self, env=req.env, request_obj=req)
|
|
pickup_day_name = day_names[pickup_day_index % len(day_names)]
|
|
except Exception:
|
|
pickup_day_name = ""
|
|
|
|
if group_order.pickup_date:
|
|
if is_delivery:
|
|
if group_order.delivery_date:
|
|
pickup_date_str = group_order.delivery_date.strftime("%d/%m/%Y")
|
|
if pickup_day_index is not None:
|
|
try:
|
|
req = request_obj or request
|
|
day_names = _get_day_names(self, env=req.env, request_obj=req)
|
|
next_day_index = (pickup_day_index + 1) % 7
|
|
pickup_day_name = day_names[next_day_index]
|
|
except Exception:
|
|
pickup_day_name = ""
|
|
else:
|
|
pickup_date_str = group_order.pickup_date.strftime("%d/%m/%Y")
|
|
else:
|
|
pickup_date_str = group_order.pickup_date.strftime("%d/%m/%Y")
|
|
|
|
return pickup_day_name, pickup_date_str, pickup_day_index
|
|
|
|
|
|
def _format_pickup_info(self, group_order, is_delivery, request_obj=None):
|
|
slot = getattr(group_order, "next_pickup_slot_id", False) or False
|
|
if slot:
|
|
return _format_slot_pickup_info(
|
|
self,
|
|
group_order,
|
|
slot,
|
|
request_obj=request_obj,
|
|
)
|
|
return _format_legacy_pickup_info(
|
|
self,
|
|
group_order,
|
|
is_delivery,
|
|
request_obj=request_obj,
|
|
)
|