226 lines
12 KiB
Python
226 lines
12 KiB
Python
# -*- 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)
|