oca-ocb-test/odoo-bringout-oca-ocb-test_mail/test_mail/models/mail_test_access.py
Ernad Husremovic d9452d2060 19.0 vanilla
2026-03-09 09:32:39 +01:00

94 lines
3.6 KiB
Python

from odoo import fields, models, tools
class MailTestAccess(models.Model):
""" Test access on mail models without depending on real models like channel
or partner which have their own set of ACLs. Public, portal and internal
have access to this model depending on 'access' field, allowing to check
ir.rule usage. """
_description = 'Mail Access Test'
_name = 'mail.test.access'
_inherit = ['mail.thread.blacklist']
_mail_post_access = 'write' # default value but ease mock
_order = 'id DESC'
_primary_email = 'email_from'
name = fields.Char()
email_from = fields.Char()
phone = fields.Char()
customer_id = fields.Many2one('res.partner', 'Customer')
access = fields.Selection(
[
('public', 'public'),
('logged', 'Logged'),
('logged_ro', 'Logged readonly for portal'),
('followers', 'Followers'),
('internal', 'Internal'),
('internal_ro', 'Internal readonly'),
('admin', 'Admin'),
],
name='Access', default='public')
def _mail_get_partner_fields(self, introspect_fields=False):
return ['customer_id']
class MailTestAccessCusto(models.Model):
""" Test access on mail models without depending on real models like channel
or partner which have their own set of ACLs. """
_description = 'Mail Access Test with Custo'
_name = 'mail.test.access.custo'
_inherit = ['mail.thread.blacklist', 'mail.activity.mixin']
_mail_post_access = 'write' # default value but ease mock
_order = 'id DESC'
_primary_email = 'email_from'
name = fields.Char()
email_from = fields.Char()
phone = fields.Char()
customer_id = fields.Many2one('res.partner', 'Customer')
is_locked = fields.Boolean()
is_readonly = fields.Boolean()
def _mail_get_partner_fields(self, introspect_fields=False):
return ['customer_id']
def _mail_get_operation_for_mail_message_operation(self, message_operation):
# customize message creation: only unlocked, except admins
if message_operation == "create" and not self.env.user._is_admin():
return dict.fromkeys(self.filtered(lambda r: not r.is_locked), 'read')
# customize read: read access on unlocked, write access on locked
elif message_operation == "read":
return {
record: 'write' if record.is_locked else 'read'
for record in self
}
return super()._mail_get_operation_for_mail_message_operation(message_operation)
class MailTestAccessPublic(models.Model):
"""A model inheriting from mail.thread with public read and write access
to test some public and guest interactions."""
_description = "Access Test Public"
_name = "mail.test.access.public"
_inherit = ["mail.thread"]
name = fields.Char("Name")
customer_id = fields.Many2one('res.partner', 'Customer')
email = fields.Char('Email')
mobile = fields.Char('Mobile')
is_locked = fields.Boolean()
def _mail_get_partner_fields(self, introspect_fields=False):
return ['customer_id']
def _get_customer_information(self):
email_key_to_values = super()._get_customer_information()
for record in self.filtered('email'):
# do not fill Falsy with random data, unless monorecord (= always correct)
if not tools.email_normalize(record.email) and len(self) > 1:
continue
values = email_key_to_values.setdefault(record.email, {})
if not values.get('phone'):
values['phone'] = record.mobile
return email_key_to_values