# -*- coding: utf-8 -*- from odoo import models, fields, api, _ from datetime import datetime class BaseAutomation(models.Model): _inherit = 'base.automation' # إضافة خيار الإشعار send_notify = fields.Boolean(string='Send Notify', help="Send Notifications Within The System") notify_title = fields.Char(string='Notification Title', related='model_id.name') notify_note = fields.Char(string='Notification Note') notify_summary = fields.Char(string='Notification Message') notify_to_groups_ids = fields.Many2many( comodel_name='res.groups', relation='automation_notifications_to_groups_rel', string='TO Notify Groups' ) notify_cc_groups_ids = fields.Many2many( comodel_name='res.groups', relation='automation_notifications_cc_groups_rel', string='CC Notify Groups' ) hr_notifys = fields.Boolean( string='HR Notifys', help="Send Notifications HR Modules Depend on (Employee Id) only" ) direct_manager_notify = fields.Boolean(string='Direct Manager Notify', help="Notify direct manager") department_manager_notify = fields.Boolean(string='Department Manager Notify', help="Notify department manager") employee_notify = fields.Boolean(string='Employee Notify', help="Notify employee") ceo_notify = fields.Boolean(string='CEO Manager', help="Notify CEO") hr_manager_notify = fields.Boolean(string='HR Manager', help="Notify HR manager") hr_email_notify = fields.Boolean(string='HR E-Mail', help="Notify HR email") services_manager_id = fields.Boolean(string='Services Manager', help="Notify services manager") it_manager_id = fields.Boolean(string='IT Manager', help="Notify IT manager") admin_manager_id = fields.Boolean(string='Admin Affairs Manager', help="Notify admin manager") financial_manager_id = fields.Boolean(string='Financial Manager', help="Notify financial manager") cyber_security_id = fields.Boolean(string='Cyber Security', help="Notify cyber security") def check_record_access(self, user_id, record, mode='read'): try: record.with_user(user_id).check_access_rule(mode) return True except: return False def access_users(self, groups, record): users = [] for group in groups: for user in group.users: if user.partner_id.email not in users and \ self.check_record_access(user_id=user.id, record=record, mode='read') and \ user.partner_id.email: if self.hr_notifys: if hasattr(record, 'employee_id') and record.employee_id: emp = record.employee_id.sudo() if self.direct_manager_notify and user.id == emp.parent_id.user_id.id: users.append(user.partner_id.email) elif self.department_manager_notify and user.id == emp.coach_id.user_id.id: users.append(user.partner_id.email) elif self.employee_notify and user.id == emp.user_id.id: users.append(user.partner_id.email) elif self.ceo_notify and user.id == emp.company_id.general_supervisor_id.user_id.id: users.append(user.partner_id.email) elif self.hr_manager_notify and user.id == emp.company_id.hr_manager_id.user_id.id: users.append(user.partner_id.email) elif self.services_manager_id and user.id == emp.company_id.services_manager_id.user_id.id: users.append(user.partner_id.email) elif self.it_manager_id and user.id == emp.company_id.it_manager_id.user_id.id: users.append(user.partner_id.email) elif self.admin_manager_id and user.id == emp.company_id.admin_manager_id.user_id.id: users.append(user.partner_id.email) elif self.financial_manager_id and user.id == emp.company_id.financial_manager_id.user_id.id: users.append(user.partner_id.email) elif self.cyber_security_id and user.id == emp.company_id.cyber_security_id.user_id.id: users.append(user.partner_id.email) elif self.hr_email_notify and emp.company_id.hr_email and emp.company_id.hr_email not in users: users.append(emp.company_id.hr_email) else: users.append(user.partner_id.email) else: users.append(user.partner_id.email) return ",".join(users) def access_users_ids(self, groups, record): processed_users = set() for group in groups: for user in group.users: if user.id not in processed_users and \ self.check_record_access(user_id=user.id, record=record, mode='read'): if self.hr_notifys: if hasattr(record, 'employee_id') and record.employee_id: emp = record.employee_id.sudo() if self.direct_manager_notify and user.id == emp.parent_id.user_id.id: processed_users.add(user.id) elif self.department_manager_notify and user.id == emp.coach_id.user_id.id: processed_users.add(user.id) elif self.employee_notify and user.id == emp.user_id.id: processed_users.add(user.id) elif self.ceo_notify and user.id == emp.company_id.general_supervisor_id.user_id.id: processed_users.add(user.id) elif self.hr_manager_notify and user.id == emp.company_id.hr_manager_id.user_id.id: processed_users.add(user.id) elif self.services_manager_id and user.id == emp.company_id.services_manager_id.user_id.id: processed_users.add(user.id) elif self.it_manager_id and user.id == emp.company_id.it_manager_id.user_id.id: processed_users.add(user.id) elif self.admin_manager_id and user.id == emp.company_id.admin_manager_id.user_id.id: processed_users.add(user.id) elif self.financial_manager_id and user.id == emp.company_id.financial_manager_id.user_id.id: processed_users.add(user.id) elif self.cyber_security_id and user.id == emp.company_id.cyber_security_id.user_id.id: processed_users.add(user.id) else: processed_users.add(user.id) else: processed_users.add(user.id) return list(processed_users) def get_notify_message(self, record): user_ids = self.access_users_ids(self.notify_to_groups_ids, record) today = datetime.today() for user in user_ids: data = { 'res_id': record.id, 'res_model_id': self.env['ir.model'].search([('model', '=', record._name)]).id, 'user_id': user, 'summary': _(self.name or 'Notification'), 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, 'date_deadline': today } self.env['mail.activity'].create(data) if self.hr_notifys: if not user_ids and self.notify_to_groups_ids: if hasattr(record, 'employee_id') and record.employee_id: hr_manager_user = record.employee_id.sudo().company_id.hr_manager_id.user_id.id data = { 'res_id': record.id, 'res_model_id': self.env['ir.model'].search([('model', '=', record._name)]).id, 'user_id': hr_manager_user, 'summary': _(self.name or 'Notification'), 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, 'date_deadline': today } self.env['mail.activity'].create(data) def get_mail_to(self, record): users = self.access_users(self.notify_to_groups_ids, record) if self.hr_notifys: if not users and self.notify_to_groups_ids: if hasattr(record, 'employee_id') and record.employee_id: hr_manager_mail = record.employee_id.sudo().company_id.hr_manager_id.user_id.partner_id.email users = hr_manager_mail return users def get_mail_cc(self, record): users = self.access_users(self.notify_cc_groups_ids, record) if self.hr_notifys: if not users and self.notify_cc_groups_ids: if hasattr(record, 'employee_id') and record.employee_id: hr_mail = record.employee_id.sudo().company_id.hr_email users = hr_mail return users def _process(self, records, domain_post=None): result = super()._process(records, domain_post) if self.send_notify: for record in records: self.get_notify_message(record) return result class MailActivity(models.Model): _inherit = 'mail.activity' def action_notify(self): if not self: return original_context = self.env.context body_template = self.env.ref('mail.message_activity_assigned') for activity in self: if activity.user_id.lang: self = self.with_context(lang=activity.user_id.lang) body_template = body_template.with_context(lang=activity.user_id.lang) activity = activity.with_context(lang=activity.user_id.lang) model_description = self.env['ir.model']._get(activity.res_model).display_name body = body_template._render( { 'activity': activity, 'model_description': model_description, 'access_link': self.env['mail.thread']._notify_get_action_link( 'view', model=activity.res_model, res_id=activity.res_id ), }, engine='ir.qweb', minimal_qcontext=True ) record = self.env[activity.res_model].browse(activity.res_id) if activity.user_id: record.message_post( body=body, subject=_('%(activity_name)s: %(summary)s assigned to you', activity_name=activity.res_name, summary=activity.summary or activity.activity_type_id.name ), partner_ids=activity.user_id.partner_id.ids, email_layout_xmlid='system_notification.mail_notification_odex', message_type='notification' ) body_template = body_template.with_context(original_context) self = self.with_context(original_context)