Skip to content

Commit acdda41

Browse files
author
GuillermoNforgeflow
committed
[ADD]mail_notify_employee_leave
1 parent f752a76 commit acdda41

File tree

15 files changed

+814
-0
lines changed

15 files changed

+814
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
.. image:: https://odoo-community.org/readme-banner-image
2+
:target: https://odoo-community.org/get-involved?utm_source=readme
3+
:alt: Odoo Community Association
4+
5+
==========================
6+
Mail Notify Employee Leave
7+
==========================
8+
9+
..
10+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
11+
!! This file is generated by oca-gen-addon-readme !!
12+
!! changes will be overwritten. !!
13+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14+
!! source digest: sha256:5f7b7a7481f72c60524273bb94fd697a975d3547b0b94c1f823902dfdaf99387
15+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16+
17+
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
18+
:target: https://odoo-community.org/page/development-status
19+
:alt: Beta
20+
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
21+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
22+
:alt: License: AGPL-3
23+
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmail-lightgray.png?logo=github
24+
:target: https://github.com/OCA/mail/tree/17.0/mail_notify_employee_leave
25+
:alt: OCA/mail
26+
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
27+
:target: https://translation.odoo-community.org/projects/mail-17-0/mail-17-0-mail_notify_employee_leave
28+
:alt: Translate me on Weblate
29+
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
30+
:target: https://runboat.odoo-community.org/builds?repo=OCA/mail&target_branch=17.0
31+
:alt: Try me on Runboat
32+
33+
|badge1| |badge2| |badge3| |badge4| |badge5|
34+
35+
This module automatically notifies users when they mention or assign a
36+
colleague who is out of office. The notification includes the expected
37+
return date of the absent user and is sent only once per day per user.
38+
39+
**Table of contents**
40+
41+
.. contents::
42+
:local:
43+
44+
Bug Tracker
45+
===========
46+
47+
Bugs are tracked on `GitHub Issues <https://github.com/OCA/mail/issues>`_.
48+
In case of trouble, please check there if your issue has already been reported.
49+
If you spotted it first, help us to smash it by providing a detailed and welcomed
50+
`feedback <https://github.com/OCA/mail/issues/new?body=module:%20mail_notify_employee_leave%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
51+
52+
Do not contact contributors directly about support or help with technical issues.
53+
54+
Credits
55+
=======
56+
57+
Authors
58+
-------
59+
60+
* ForgeFlow
61+
62+
Contributors
63+
------------
64+
65+
- `ForgeFlow <https://www.forgeflow.com>`__:
66+
67+
- Guillermo Navas <guillermo.navas@forgeflow.com>
68+
69+
Maintainers
70+
-----------
71+
72+
This module is maintained by the OCA.
73+
74+
.. image:: https://odoo-community.org/logo.png
75+
:alt: Odoo Community Association
76+
:target: https://odoo-community.org
77+
78+
OCA, or the Odoo Community Association, is a nonprofit organization whose
79+
mission is to support the collaborative development of Odoo features and
80+
promote its widespread use.
81+
82+
This module is part of the `OCA/mail <https://github.com/OCA/mail/tree/17.0/mail_notify_employee_leave>`_ project on GitHub.
83+
84+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Copyright 2026 ForgeFlow S.L.
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3+
4+
{
5+
"name": "Mail Notify Employee Leave",
6+
"summary": """
7+
Notifies users when they mention or assign someone who is out of office.
8+
""",
9+
"version": "17.0.1.0.0",
10+
"license": "AGPL-3",
11+
"author": "ForgeFlow, Odoo Community Association (OCA)",
12+
"website": "https://github.com/OCA/mail",
13+
"depends": ["mail", "hr_holidays"],
14+
"data": [
15+
"security/ir.model.access.csv",
16+
],
17+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * mail_notify_employee_leave
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 17.0+e\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"POT-Creation-Date: 2026-02-27 12:29+0000\n"
10+
"PO-Revision-Date: 2026-02-27 12:29+0000\n"
11+
"Last-Translator: \n"
12+
"Language-Team: \n"
13+
"MIME-Version: 1.0\n"
14+
"Content-Type: text/plain; charset=UTF-8\n"
15+
"Content-Transfer-Encoding: \n"
16+
"Plural-Forms: \n"
17+
18+
#. module: mail_notify_employee_leave
19+
#. odoo-python
20+
#: code:addons/mail_notify_employee_leave/models/mail_thread.py:0
21+
#, python-format
22+
msgid "%(name)s is out of office, expected back on %(date)s."
23+
msgstr "%(name)s estará ausente hasta %(date)s."
24+
25+
#. module: mail_notify_employee_leave
26+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__absent_user_id
27+
msgid "Absent User"
28+
msgstr "Usuario ausente"
29+
30+
#. module: mail_notify_employee_leave
31+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__create_uid
32+
msgid "Created by"
33+
msgstr ""
34+
35+
#. module: mail_notify_employee_leave
36+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__create_date
37+
msgid "Created on"
38+
msgstr ""
39+
40+
#. module: mail_notify_employee_leave
41+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__date
42+
msgid "Date"
43+
msgstr "Fecha"
44+
45+
#. module: mail_notify_employee_leave
46+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__display_name
47+
msgid "Display Name"
48+
msgstr ""
49+
50+
#. module: mail_notify_employee_leave
51+
#: model:ir.model,name:mail_notify_employee_leave.model_mail_thread
52+
msgid "Email Thread"
53+
msgstr "Hilo de correo electrónico"
54+
55+
#. module: mail_notify_employee_leave
56+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__id
57+
msgid "ID"
58+
msgstr ""
59+
60+
#. module: mail_notify_employee_leave
61+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__write_uid
62+
msgid "Last Updated by"
63+
msgstr ""
64+
65+
#. module: mail_notify_employee_leave
66+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__write_date
67+
msgid "Last Updated on"
68+
msgstr ""
69+
70+
#. module: mail_notify_employee_leave
71+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_user_absence_notification__notified_user_id
72+
msgid "Notified User"
73+
msgstr "Usuario notificado"
74+
75+
#. module: mail_notify_employee_leave
76+
#: model:ir.model,name:mail_notify_employee_leave.model_user_absence_notification
77+
msgid "Track daily absence notifications"
78+
msgstr "Registro diario de notificaciones de ausencia"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from . import mail_thread
2+
from . import user_absence_notification
3+
from . import hr_leave
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from odoo import models
2+
3+
4+
class HrLeave(models.Model):
5+
_inherit = "hr.leave"
6+
7+
def _validate_leave_request(self):
8+
"""
9+
Override _validate_leave_request to skip absence notifications when
10+
approving leaves. The context flag 'skip_absence_notification' prevents
11+
_notify_thread from sending messages,
12+
"""
13+
if not self.env.context.get("skip_absence_notification"):
14+
return super(
15+
HrLeave, self.with_context(skip_absence_notification=True)
16+
)._validate_leave_request()
17+
return super()._validate_leave_request()
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from odoo import _, fields, models
2+
3+
4+
class MailThread(models.AbstractModel):
5+
_inherit = "mail.thread"
6+
7+
def _notify_thread(self, message, msg_vals=False, **kwargs):
8+
"""
9+
Alert the current user when a partner affected by the message is linked
10+
is out of office. It ensures that each absent employee triggers only
11+
one notification per user per day by recording notifications in
12+
'user.absence.notification' and sending an internal message with the
13+
employee's expected return date.
14+
"""
15+
recipients_data = super()._notify_thread(message, msg_vals=msg_vals, **kwargs)
16+
17+
if self.env.context.get("skip_absence_notification"):
18+
return recipients_data
19+
20+
affected_partner_ids = msg_vals.get("partner_ids", []) if msg_vals else []
21+
22+
for partner_id in affected_partner_ids:
23+
partner = self.env["res.partner"].browse(partner_id)
24+
employee = self.env["hr.employee"].search(
25+
[("user_id.partner_id", "=", partner.id)], limit=1
26+
)
27+
if employee and employee.is_absent:
28+
today = fields.Date.today()
29+
already_notified = self.env["user.absence.notification"].search(
30+
[
31+
("absent_user_id", "=", employee.id),
32+
("notified_user_id", "=", self.env.user.id),
33+
("date", "=", today),
34+
]
35+
)
36+
if already_notified:
37+
continue
38+
39+
self.env["user.absence.notification"].create(
40+
{
41+
"absent_user_id": employee.id,
42+
"notified_user_id": self.env.user.id,
43+
"date": today,
44+
}
45+
)
46+
body = _("%(name)s is out of office, expected back on %(date)s.") % {
47+
"name": employee.name,
48+
"date": employee.leave_date_to,
49+
}
50+
self.message_notify(
51+
partner_ids=[self.env.user.partner_id.id],
52+
body=body,
53+
subject="User out of office",
54+
subtype_xmlid="mail.mt_note",
55+
notify_author=True,
56+
)
57+
58+
return recipients_data
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from odoo import fields, models
2+
3+
4+
class UserAbsenceNotification(models.Model):
5+
"""
6+
This model stores daily records of absence notifications sent to users.
7+
It ensures that each user receives only one notification per absent
8+
employee per day.
9+
Fields:
10+
- absent_user_id: the employee who is currently out of office
11+
- notified_user_id: the user who received the notification
12+
- date: the date the notification was sent
13+
"""
14+
15+
_name = "user.absence.notification"
16+
_description = "Track daily absence notifications"
17+
18+
absent_user_id = fields.Many2one("hr.employee", string="Absent User", required=True)
19+
notified_user_id = fields.Many2one(
20+
"res.users", string="Notified User", required=True
21+
)
22+
date = fields.Date(required=True)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[build-system]
2+
requires = ["whool"]
3+
build-backend = "whool.buildapi"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- [ForgeFlow](https://www.forgeflow.com):
2+
- Guillermo Navas \<<guillermo.navas@forgeflow.com>\>

0 commit comments

Comments
 (0)