175 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			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'}
 |