From d3abdb10c49e91b82b732a5e72a598a87a6492f7 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Wed, 5 Mar 2025 15:09:37 +0100 Subject: [PATCH] check availabilities before dispatching --- src/leave.py | 12 ++++++++++++ src/main.py | 38 +++++++++++++++++++++++++++++++++++--- src/model.py | 6 +++++- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/leave.py diff --git a/src/leave.py b/src/leave.py new file mode 100644 index 0000000..f0dfecd --- /dev/null +++ b/src/leave.py @@ -0,0 +1,12 @@ +from dataclasses import dataclass +from model import OdooModel +from datetime import datetime + + +@dataclass +class Leave(OdooModel): + _name = "hr.leave.report.calendar" + + start_datetime: datetime + stop_datetime: datetime + employee_id: str diff --git a/src/main.py b/src/main.py index 7ddce16..9773102 100644 --- a/src/main.py +++ b/src/main.py @@ -8,6 +8,8 @@ from collections import defaultdict from typing import Dict, List, Optional from config import vfyd_tags, team from tasks import Task +from leave import Leave +import re console = console.Console() @@ -35,21 +37,51 @@ def cli() -> None: def dispatch(): """Randomly distribute unassigned tasks among team members.""" + client = odoo_client.OdooClient() + today = datetime.now().strftime("%Y-%m-%d") + domain = [ + ("start_datetime", "<=", today), + ("stop_datetime", ">=", today), + ] + domain.extend(["|"] * (len(team) - 1)) + domain.extend( + [("employee_id.name", "=ilike", f"%({employee})") for employee in team] + ) + leaves = client.web_search_read(Leave, domain) + + team_availability = dict() + for employee in team: + team_availability[employee] = (True, True) + + for leave in leaves: + employee = re.search(r"\((.*?)\)", leave.employee_id).group(1).lower() + is_morning = leave.start_datetime.hour < 11 + is_afternoon = leave.stop_datetime.hour >= 14 + if is_morning: + team_availability[employee] = (False, team_availability[employee][1]) + if is_afternoon: + team_availability[employee] = (team_availability[employee][0], False) + + available_employees = [ + employee + for employee, availability in team_availability.items() + if availability[0] or availability[1] + ] + domain = [ ("stage_id", "=", 194), ("user_ids", "=", False), ("project_id", "=", 49), ("tag_ids", "not in", vfyd_tags), ] - client = odoo_client.OdooClient() records = client.web_search_read(Task, domain) random.shuffle(records) dispatch = defaultdict(list) out = defaultdict(list) for idx, task in enumerate(records): - dispatch[team[idx % len(team)]].append(task.id) - out[team[idx % len(team)]].append(task) + dispatch[available_employees[idx % len(available_employees)]].append(task.id) + out[available_employees[idx % len(available_employees)]].append(task) save_dispatch(dispatch) for key, tasks in out.items(): diff --git a/src/model.py b/src/model.py index 1a997b2..7050006 100644 --- a/src/model.py +++ b/src/model.py @@ -1,5 +1,6 @@ from typing import Dict, Self, Any, get_origin from dataclasses import fields, Field +from datetime import datetime class OdooModel: @@ -15,7 +16,7 @@ class OdooModel: }, }, } - elif field_type in {str, int, bool}: + elif field_type in {str, int, bool, datetime}: return {f.name: {}} else: raise NotImplementedError(f"Unsupported field type: {field_type}") @@ -34,6 +35,9 @@ class OdooModel: if f.init and f.name in record: value = record[f.name] + if f.type is datetime: + value = datetime.strptime(value, "%Y-%m-%d %H:%M:%S") + if f.name.endswith("_id"): if f.type is str: value = value["display_name"]