From 2e2cdeccdbedd3e3888b448f2d252f949c0bdb76 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 25 Mar 2015 01:45:01 +0200 Subject: [PATCH] [IMP] "move back" feature --- mail_move_message_models.py | 105 ++++++++++++++++++++++++++++++++---- mail_move_message_views.xml | 24 ++++++--- 2 files changed, 111 insertions(+), 18 deletions(-) diff --git a/mail_move_message_models.py b/mail_move_message_models.py index ec74bad..5e8f580 100644 --- a/mail_move_message_models.py +++ b/mail_move_message_models.py @@ -6,10 +6,36 @@ class wizard(models.TransientModel): message_id = fields.Many2one('mail.message', string='Message') message_body = fields.Html(related='message_id.body', string='Message to move', readonly=True) + message_moved_by_message_id = fields.Many2one('mail.message', related='message_id.moved_by_message_id', string='Moved with', readonly=True) + message_moved_by_user_id = fields.Many2one('res.users', related='message_id.moved_by_user_id', string='Moved by', readonly=True) parent_id = fields.Many2one('mail.message', string='Search by name') model_id = fields.Many2one('ir.model', string='Record type') res_id = fields.Integer('Record ID') record_url = fields.Char('Link to record', readonly=True) + can_move = fields.Boolean('Can move', compute='get_can_move') + move_back = fields.Boolean('Move to origin') + + @api.depends('message_id') + @api.one + def get_can_move(self): + # message was not moved before OR message is a top message of previous move + self.can_move = not self.message_id.moved_by_message_id or self.message_id.moved_by_message_id.id == self.message_id.id + + @api.onchange('move_back') + def on_change_move_back(self): + if not self.move_back: + return + self.parent_id = self.message_id.moved_from_parent_id + self.res_id = self.message_id.moved_from_res_id + model = self.message_id.moved_from_model + self.model_id = model and self.env['ir.model'].search([('model','=', model)]) + @api.onchange('parent_id', 'res_id', 'model_id') + def update_move_back(self): + model = self.message_id.moved_from_model + model_id = model and self.env['ir.model'].search([('model','=', model)]) + self.move_back = self.parent_id == self.message_id.moved_from_parent_id \ + and self.res_id == self.message_id.moved_from_res_id \ + and (self.model_id == model_id or (not self.model_id and not model_id)) @api.onchange('parent_id') def on_change_parent_id(self): @@ -45,6 +71,20 @@ class wizard(models.TransientModel): self.pool['mail.thread'].check_mail_message_access(cr, uid, mids, operation, model_obj=model_obj, context=context) @api.multi + def open_moved_by_message_id(self): + message_id = None + for r in self: + message_id = r.message_moved_by_message_id.id + return { + 'type': 'ir.actions.act_window', + 'res_model': 'mail_move_message.wizard', + 'view_mode': 'form', + 'view_type': 'form', + 'views': [[False, 'form']], + 'target': 'new', + 'context': {'default_message_id': message_id}, + } + @api.multi def move(self): for r in self: r.check_access() @@ -52,16 +92,8 @@ class wizard(models.TransientModel): if not (r.parent_id.model == r.model_id.model and r.parent_id.res_id == r.res_id): r.parent_id = None - ids = [r.message_id.id] - while True: - new_ids = self.env['mail.message'].search([('parent_id', 'in', ids), ('id', 'not in', ids)]).ids - if new_ids: - ids = ids + new_ids - continue - break - r.message_id.sudo().write({'parent_id': r.parent_id.id}) - self.env['mail.message'].sudo().search([('id', 'in', ids)]).write({'res_id': r.res_id, 'model': r.model_id.model}) - + r.message_id.move(r.parent_id.id, r.res_id, r.model_id.model, r.move_back) + if not ( r.model_id and r.res_id ): obj = self.pool.get('ir.model.data').get_object_reference(self._cr, SUPERUSER_ID, 'mail', 'mail_archivesfeeds')[1] return { @@ -83,6 +115,59 @@ class wizard(models.TransientModel): class mail_message(models.Model): _inherit = 'mail.message' + moved_from_res_id = fields.Integer('Related Document ID (Original)') + moved_from_model = fields.Char('Related Document Model (Original)') + moved_from_parent_id = fields.Many2one('mail.message', 'Parent Message (Original)', ondelete='set null') + moved_by_message_id = fields.Many2one('mail.message', 'Moved by message', ondelete='set null', help='Top message, that initate moving this message') + moved_by_user_id = fields.Many2one('res.users', 'Moved by user', ondelete='set null') + all_child_ids = fields.One2many('mail.message', string='All childs', compute='_get_all_childs', help='all childs, including subchilds') + + @api.one + def _get_all_childs(self, include_myself=True): + ids = [] + if include_myself: + ids.append(self.id) + while True: + new_ids = self.search([('parent_id', 'in', ids), ('id', 'not in', ids)]).ids + if new_ids: + ids = ids + new_ids + continue + break + self.all_child_ids = ids + + @api.one + def move(self, parent_id, res_id, model, move_back): + moved_by_message_id = self.id + moved_by_user_id = self.env.user.id + first_move = not self.moved_by_user_id + vals = {'parent_id': parent_id, + 'moved_by_user_id': moved_by_user_id} + if first_move: + # moved_from_* variables contain not last, but original + # reference + vals['moved_from_parent_id'] = self.parent_id.id + elif move_back: + # clear moved_from_* variabls if we move everything back + vals['moved_from_parent_id'] = None + + self.write(vals) + for r in self.all_child_ids: + vals = {'res_id': res_id, + 'model': model, + 'moved_by_user_id': moved_by_user_id, + 'moved_by_message_id': moved_by_message_id} + if move_back: + vals['moved_by_user_id'] = None + vals['moved_by_message_id'] = None + + if not r.moved_by_user_id or r.id == self.id and first_move: + vals['moved_from_res_id'] = r.res_id + vals['moved_from_model'] = r.model + elif move_back: + vals['moved_from_res_id'] = None + vals['moved_from_model'] = None + r.write(vals) + def name_get(self, cr, uid, ids, context=None): if not (context or {}).get('extended_name'): return super(mail_message, self).name_get(cr, uid, ids, context=context) diff --git a/mail_move_message_views.xml b/mail_move_message_views.xml index b74818b..6b04644 100644 --- a/mail_move_message_views.xml +++ b/mail_move_message_views.xml @@ -13,21 +13,29 @@ mail_move_message.wizard
- - - - + + +

You cannot move this message. It was already moved with a message bellow. Open one and apply changes there.

+ + + +