[ADD] helpdesk_ticket_deadline: add a manual deadline on tickets
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m51s
tests / test (pull_request) Successful in 2m22s

This module adds a simple, manually filled ``date_deadline``
Date field, tracked in the chatter, with an overdue flag,
a red kanban decoration and search filters (overdue, due
today, group by deadline).
This commit is contained in:
2026-10-01 17:19:38 +02:00
parent f24d20c9f4
commit b638aa9407
10 changed files with 1009 additions and 0 deletions

View File

@@ -0,0 +1 @@
from . import test_helpdesk_ticket_deadline

View File

@@ -0,0 +1,80 @@
# Copyright 2026 Quentin Mondot
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import timedelta
from odoo import fields
from odoo.tests.common import TransactionCase
class TestHelpdeskTicketDeadline(TransactionCase):
"""Tests for the helpdesk_ticket_deadline module."""
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.HelpdeskTicket = cls.env["helpdesk.ticket"]
def _create_ticket(self, **kwargs):
"""Create a ticket named "Deadline test ticket" with given values.
:param kwargs: extra values passed to ``helpdesk.ticket.create``
:return: the created ``helpdesk.ticket`` record
"""
vals = {"name": "Deadline test ticket", "description": "test"}
vals.update(kwargs)
return self.HelpdeskTicket.create(vals)
def test_field_exists(self):
"""date_deadline is a stored Date field on helpdesk.ticket."""
field = self.HelpdeskTicket._fields["date_deadline"]
self.assertEqual(field.type, "date")
self.assertTrue(field.store)
def test_date_is_stored(self):
"""A deadline set on a ticket is read back unchanged."""
deadline = fields.Date.today() + timedelta(days=3)
ticket = self._create_ticket(date_deadline=deadline)
self.assertEqual(ticket.date_deadline, deadline)
def test_deadline_overdue_past(self):
"""A deadline strictly before today flags the ticket overdue."""
ticket = self._create_ticket(
date_deadline=fields.Date.today() - timedelta(days=1)
)
self.assertTrue(ticket.deadline_overdue)
def test_deadline_overdue_today(self):
"""A deadline set to today is not overdue yet."""
ticket = self._create_ticket(date_deadline=fields.Date.today())
self.assertFalse(ticket.deadline_overdue)
def test_deadline_overdue_future(self):
"""A future deadline is not overdue."""
ticket = self._create_ticket(
date_deadline=fields.Date.today() + timedelta(days=5)
)
self.assertFalse(ticket.deadline_overdue)
def test_deadline_overdue_without_deadline(self):
"""A ticket without a deadline is never overdue."""
ticket = self._create_ticket()
self.assertFalse(ticket.deadline_overdue)
def test_overdue_search_domain(self):
"""Searching date_deadline < today returns only overdue tickets."""
overdue = self._create_ticket(
date_deadline=fields.Date.today() - timedelta(days=2)
)
future = self._create_ticket(
date_deadline=fields.Date.today() + timedelta(days=2)
)
results = self.HelpdeskTicket.search(
[("date_deadline", "<", fields.Date.today())]
)
self.assertIn(overdue, results)
self.assertNotIn(future, results)
def test_deadline_is_tracked(self):
"""date_deadline is flagged as tracked so changes are logged."""
self.assertTrue(self.HelpdeskTicket._fields["date_deadline"].tracking)