You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
4.3 KiB

  1. # Copyright 2014 ABF OSIELL <http://osiell.com>
  2. # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
  3. import datetime
  4. import logging
  5. from odoo import SUPERUSER_ID, _, api, fields, models
  6. from odoo.exceptions import ValidationError
  7. _logger = logging.getLogger(__name__)
  8. class ResUsersRole(models.Model):
  9. _name = "res.users.role"
  10. _inherits = {"res.groups": "group_id"}
  11. _description = "User role"
  12. group_id = fields.Many2one(
  13. comodel_name="res.groups",
  14. required=True,
  15. ondelete="cascade",
  16. readonly=True,
  17. string="Associated group",
  18. )
  19. line_ids = fields.One2many(
  20. comodel_name="res.users.role.line", inverse_name="role_id", string="Role lines"
  21. )
  22. user_ids = fields.One2many(
  23. comodel_name="res.users", string="Users list", compute="_compute_user_ids"
  24. )
  25. group_category_id = fields.Many2one(
  26. related="group_id.category_id",
  27. default=lambda cls: cls.env.ref("base_user_role.ir_module_category_role").id,
  28. string="Associated category",
  29. help="Associated group's category",
  30. readonly=False,
  31. )
  32. @api.depends("line_ids.user_id")
  33. def _compute_user_ids(self):
  34. for role in self:
  35. role.user_ids = role.line_ids.mapped("user_id")
  36. @api.model
  37. def create(self, vals):
  38. new_record = super(ResUsersRole, self).create(vals)
  39. new_record.update_users()
  40. return new_record
  41. def write(self, vals):
  42. # Workaround to solve issue with broken code in odoo that clear the cache
  43. # during the write: see odoo/addons/base/models/res_users.py#L226
  44. groups_vals = {}
  45. for field in self.group_id._fields:
  46. if field in vals:
  47. groups_vals[field] = vals.pop(field)
  48. if groups_vals:
  49. self.group_id.write(groups_vals)
  50. res = super(ResUsersRole, self).write(vals)
  51. self.update_users()
  52. return res
  53. def unlink(self):
  54. users = self.mapped("user_ids")
  55. res = super(ResUsersRole, self).unlink()
  56. users.set_groups_from_roles(force=True)
  57. return res
  58. def update_users(self):
  59. """Update all the users concerned by the roles identified by `ids`."""
  60. users = self.mapped("user_ids")
  61. users.set_groups_from_roles()
  62. return True
  63. @api.model
  64. def cron_update_users(self):
  65. logging.info("Update user roles")
  66. self.search([]).update_users()
  67. class ResUsersRoleLine(models.Model):
  68. _name = "res.users.role.line"
  69. _description = "Users associated to a role"
  70. role_id = fields.Many2one(
  71. comodel_name="res.users.role", required=True, string="Role", ondelete="cascade"
  72. )
  73. user_id = fields.Many2one(
  74. comodel_name="res.users",
  75. required=True,
  76. string="User",
  77. domain=[("id", "!=", SUPERUSER_ID)],
  78. ondelete="cascade",
  79. )
  80. date_from = fields.Date("From")
  81. date_to = fields.Date("To")
  82. is_enabled = fields.Boolean("Enabled", compute="_compute_is_enabled")
  83. company_id = fields.Many2one(
  84. "res.company", "Company", default=lambda self: self.env.user.company_id
  85. )
  86. @api.constrains("user_id", "company_id")
  87. def _check_company(self):
  88. for record in self:
  89. if (
  90. record.company_id
  91. and record.company_id != record.user_id.company_id
  92. and record.company_id not in record.user_id.company_ids
  93. ):
  94. raise ValidationError(
  95. _('User "{}" does not have access to the company "{}"').format(
  96. record.user_id.name, record.company_id.name
  97. )
  98. )
  99. @api.depends("date_from", "date_to")
  100. def _compute_is_enabled(self):
  101. today = datetime.date.today()
  102. for role_line in self:
  103. role_line.is_enabled = True
  104. if role_line.date_from:
  105. date_from = role_line.date_from
  106. if date_from > today:
  107. role_line.is_enabled = False
  108. if role_line.date_to:
  109. date_to = role_line.date_to
  110. if today > date_to:
  111. role_line.is_enabled = False
  112. def unlink(self):
  113. users = self.mapped("user_id")
  114. res = super(ResUsersRoleLine, self).unlink()
  115. users.set_groups_from_roles(force=True)
  116. return res