跳至內容
選單
此問題已被標幟
1 回覆
1033 瀏覽次數

I have a list, every item contains a list of booked times for an employee. ex: if there are 4 employees, it will 4 items in the list of bookings below.

bookings = [[
            (datetime.datetime(2023, 1, 1, 9, 0), datetime.datetime(2023, 1, 1, 10, 0)),
            (datetime.datetime(2023, 1, 1, 14, 30), datetime.datetime(2023, 1, 1, 16, 0)),
            (datetime.datetime(2023, 1, 1, 18, 30), datetime.datetime(2023, 1, 1, 20, 0))],
            [(datetime.datetime(2023, 1, 1, 15, 0), datetime.datetime(2023, 1, 1, 16, 30)),
            (datetime.datetime(2023, 1, 1, 19, 0), datetime.datetime(2023, 1, 1, 20, 30))
            ],
            [(datetime.datetime(2023, 1, 1, 15, 30), datetime.datetime(2023, 1, 1, 17, 0)),
             (datetime.datetime(2023, 1, 1, 19, 30), datetime.datetime(2023, 1, 1, 21, 0))
            ],
            [(datetime.datetime(2023, 1, 1, 8, 30), datetime.datetime(2023, 1, 1, 9, 0)),
             (datetime.datetime(2023, 1, 1, 14, 30), datetime.datetime(2023, 1, 1, 16, 0)),
            (datetime.datetime(2023, 1, 1, 18, 30), datetime.datetime(2023, 1, 1, 20, 0))
            ]]

As above, I would like to get the time that all employees booked at the same time.

My output above, the same booked time:

[(datetime.datetime(2023, 1, 1, 15, 30), datetime.datetime(2023, 1, 1, 16, 0)),
(datetime.datetime(2023, 1, 1, 19, 30), datetime.datetime(2023, 1, 1, 20, 0))]

Please help to give the solution to resolve the above in Python using odoo 16.

Thank you very much!


頭像
捨棄
最佳答案

you can use the following Python code in Odoo 16:

from functools import reduce

bookings = [
[
(datetime.datetime(2023, 1, 1, 9, 0), datetime.datetime(2023, 1, 1, 10, 0)),
(datetime.datetime(2023, 1, 1, 14, 30), datetime.datetime(2023, 1, 1, 16, 0)),
(datetime.datetime(2023, 1, 1, 18, 30), datetime.datetime(2023, 1, 1, 20, 0))
],
[
(datetime.datetime(2023, 1, 1, 15, 0), datetime.datetime(2023, 1, 1, 16, 30)),
(datetime.datetime(2023, 1, 1, 19, 0), datetime.datetime(2023, 1, 1, 20, 30))
],
[
(datetime.datetime(2023, 1, 1, 15, 30), datetime.datetime(2023, 1, 1, 17, 0)),
(datetime.datetime(2023, 1, 1, 19, 30), datetime.datetime(2023, 1, 1, 21, 0))
],
[
(datetime.datetime(2023, 1, 1, 8, 30), datetime.datetime(2023, 1, 1, 9, 0)),
(datetime.datetime(2023, 1, 1, 14, 30), datetime.datetime(2023, 1, 1, 16, 0)),
(datetime.datetime(2023, 1, 1, 18, 30), datetime.datetime(2023, 1, 1, 20, 0))
]
]

# Find the intersection of all booked time slots
common_slots = reduce(lambda a, b: [x for x in a if any(x[1] >= y[0] and x[0] <= y[1] for y in b)], bookings)

print(common_slots)

This code uses the reduce function along with a lambda function to iteratively find the common time slots among all employee bookings. The lambda function checks if any time slot in the first list is overlapping with any time slot in the second list, and the result is then used as input for the next iteration until the common slots are found.


頭像
捨棄