42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
from odoo import _, api, fields, models
|
|
from odoo.exceptions import AccessError
|
|
|
|
|
|
class DocumentAccess(models.Model):
|
|
_name = 'documents.access'
|
|
_description = 'Document / Partner'
|
|
_log_access = False
|
|
|
|
document_id = fields.Many2one('documents.document', required=True, ondelete='cascade')
|
|
partner_id = fields.Many2one('res.partner', required=True, ondelete='cascade', index=True)
|
|
role = fields.Selection(
|
|
[('view', 'Viewer'), ('edit', 'Editor')],
|
|
string='Role', required=False, index=True)
|
|
last_access_date = fields.Datetime('Last Accessed On', required=False)
|
|
expiration_date = fields.Datetime('Expiration', index=True)
|
|
|
|
_sql_constraints = [
|
|
('unique_document_access_partner', 'unique(document_id, partner_id)',
|
|
'This partner is already set on this document.'),
|
|
('role_or_last_access_date', 'check (role IS NOT NULL or last_access_date IS NOT NULL)',
|
|
'NULL roles must have a set last_access_date'),
|
|
]
|
|
|
|
def _prepare_create_values(self, vals_list):
|
|
vals_list = super()._prepare_create_values(vals_list)
|
|
documents = self.env['documents.document'].browse(
|
|
[vals['document_id'] for vals in vals_list])
|
|
documents.check_access('write')
|
|
return vals_list
|
|
|
|
def write(self, vals):
|
|
if 'partner_id' in vals or 'document_id' in vals:
|
|
raise AccessError(_('Access documents and partners cannot be changed.'))
|
|
|
|
self.document_id.check_access('write')
|
|
return super().write(vals)
|
|
|
|
@api.autovacuum
|
|
def _gc_expired(self):
|
|
self.search([('expiration_date', '<=', fields.Datetime.now())], limit=1000).unlink()
|