odoo/ext/3rd-party-addons/connector/models/checkpoint.py

175 lines
6.0 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2013-2017 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
"""
The checkpoint is a model containing records to be reviewed by the end
users. The connectors register records to verify so the user can check
them and flag them as reviewed.
A concrete use case is the import of new products from Magento. Once
they are imported, the user have to configure things like the supplier,
so they appears in this list.
"""
from odoo import models, fields, api, _
class ConnectorCheckpoint(models.Model):
_name = 'connector.checkpoint'
_description = 'Connector Checkpoint'
_inherit = ['mail.thread', 'mail.activity.mixin']
@api.model
def _reference_models(self):
models = self.env['ir.model'].search([('state', '!=', 'manual')])
return [(model.model, model.name)
for model in models
if not model.model.startswith('ir.')]
@api.depends('model_id', 'record_id')
def _compute_record(self):
for check in self:
check.record = check.model_id.model + ',' + str(check.record_id)
@api.depends('model_id', 'record_id')
def _compute_name(self):
for check in self:
model = self.env[check.model_id.model]
check.name = model.browse(check.record_id).display_name
@api.model
def _search_record(self, operator, value):
model_model = self.env['ir.model']
sql = "SELECT DISTINCT model_id FROM connector_checkpoint"
self.env.cr.execute(sql)
model_ids = [row[0] for row in self.env.cr.fetchall()]
models = model_model.browse(model_ids)
ids = set()
for model in models:
model_id = model.id
model_name = model.model
model_obj = self.env[model_name]
results = model_obj.name_search(name=value,
operator=operator)
res_ids = [res[0] for res in results]
checks = self.search([('model_id', '=', model_id),
('record_id', 'in', res_ids)])
ids.update(checks.ids)
if not ids:
return [('id', '=', '0')]
return [('id', 'in', tuple(ids))]
record = fields.Reference(
compute='_compute_record',
selection='_reference_models',
help="The record to review.",
readonly=True,
)
name = fields.Char(
compute='_compute_name',
search='_search_record',
string='Record Name',
help="Name of the record to review",
readonly=True,
)
record_id = fields.Integer(string='Record ID',
required=True,
readonly=True)
model_id = fields.Many2one(comodel_name='ir.model',
string='Model',
required=True,
readonly=True)
backend_id = fields.Reference(
string='Imported from',
selection='_reference_models',
readonly=True,
required=True,
help="The record has been imported from this backend",
index=True,
)
state = fields.Selection(
selection=[('need_review', 'Need Review'),
('reviewed', 'Reviewed')],
string='Status',
required=True,
readonly=True,
default='need_review',
)
@api.multi
def reviewed(self):
return self.write({'state': 'reviewed'})
@api.multi
def _subscribe_users(self):
""" Subscribe all users having the 'Connector Manager' group """
group = self.env.ref('connector.group_connector_manager')
if not group:
return
users = self.env['res.users'].search([('groups_id', '=', group.id)])
self.message_subscribe_users(user_ids=users.ids)
@api.model
def create(self, vals):
record = super(ConnectorCheckpoint, self).create(vals)
record._subscribe_users()
msg = _('A %s needs a review.') % record.model_id.name
record.message_post(body=msg, subtype='mail.mt_comment',)
return record
@api.model
def create_from_name(self, model_name, record_id,
backend_model_name, backend_id):
model_model = self.env['ir.model']
model = model_model.search([('model', '=', model_name)], limit=1)
assert model, "The model %s does not exist" % model_name
backend = backend_model_name + ',' + str(backend_id)
return self.create({'model_id': model.id,
'record_id': record_id,
'backend_id': backend})
@api.model
def _needaction_domain_get(self):
""" Returns the domain to filter records that require an action
:return: domain or False is no action
"""
return [('state', '=', 'need_review')]
def add_checkpoint(env, model_name, record_id,
backend_model_name, backend_id):
checkpoint_model = env['connector.checkpoint']
return checkpoint_model.create_from_name(model_name, record_id,
backend_model_name, backend_id)
class ConnectorCheckpointReview(models.TransientModel):
_name = 'connector.checkpoint.review'
_description = 'Checkpoints Review'
@api.model
def _get_checkpoint_ids(self):
res = False
context = self.env.context
if (context.get('active_model') == 'connector.checkpoint' and
context.get('active_ids')):
res = context['active_ids']
return res
checkpoint_ids = fields.Many2many(
comodel_name='connector.checkpoint',
relation='connector_checkpoint_review_rel',
column1='review_id',
column2='checkpoint_id',
string='Checkpoints',
domain="[('state', '=', 'need_review')]",
default=_get_checkpoint_ids)
@api.multi
def review(self):
self.checkpoint_ids.reviewed()
return {'type': 'ir.actions.act_window_close'}