Browse Source

Merge branch '8.0' into 9.0

Conflicts:
	_web_last_viewed_records/__openerp__.py
	mail_move_message/__openerp__.py
	reminder_base/__openerp__.py
pull/2/head
Ivan Yelizariev 9 years ago
parent
commit
f1067657b6
  1. 1
      __init__.py
  2. 5
      __openerp__.py
  3. 1
      controllers/__init__.py
  4. 55
      controllers/main.py
  5. 9
      data/mail_move_message_data.xml
  6. 5
      doc/changelog.rst
  7. 168
      i18n/mail_move_message.pot
  8. 160
      i18n/sl.po
  9. 210
      mail_move_message_models.py
  10. 86
      mail_move_message_views.xml
  11. BIN
      static/description/inbox-move.png
  12. 4
      static/src/css/mail_move_message.css
  13. 56
      static/src/js/mail_move_message.js

1
__init__.py

@ -1 +1,2 @@
import controllers
import mail_move_message_models import mail_move_message_models

5
__openerp__.py

@ -1,15 +1,16 @@
{ {
'name' : 'Mail relocation', 'name' : 'Mail relocation',
'version' : '1.0.1',
'version' : '1.0.2',
'author' : 'IT-Projects LLC, Ivan Yelizariev', 'author' : 'IT-Projects LLC, Ivan Yelizariev',
'category' : 'Social Network', 'category' : 'Social Network',
'website' : 'https://yelizariev.github.io', 'website' : 'https://yelizariev.github.io',
'price': 9.00, 'price': 9.00,
'currency': 'EUR', 'currency': 'EUR',
'depends' : ['mail'],
'depends' : ['mail', 'web_polymorphic_field'],
'images': ['images/inbox.png'], 'images': ['images/inbox.png'],
'data':[ 'data':[
'mail_move_message_views.xml', 'mail_move_message_views.xml',
'data/mail_move_message_data.xml',
], ],
'qweb': [ 'qweb': [
'static/src/xml/mail_move_message_main.xml', 'static/src/xml/mail_move_message_main.xml',

1
controllers/__init__.py

@ -0,0 +1 @@
import main

55
controllers/main.py

@ -0,0 +1,55 @@
from openerp.addons.web.controllers.main import DataSet
from openerp.tools.translate import _
from openerp import http
from openerp.http import request
class DataSetCustom(DataSet):
def _extend_name(self, model, records):
cr, uid, context = request.cr, request.uid, request.context
Model = request.registry[model]
fields = Model.fields_get(cr, uid, False, context)
contact_field = False
for n, f in fields.iteritems():
if f['type'] == 'many2one' and f['relation'] == 'res.partner':
contact_field = n
break
partner_info = {}
if contact_field:
partner_info = Model.read(cr, uid, [r[0] for r in records], [contact_field], context)
partner_info = dict([(p['id'], p[contact_field]) for p in partner_info])
res = []
for r in records:
if partner_info.get(r[0]):
res.append((r[0], _('%s [%s] ID %s') % (r[1], partner_info.get(r[0])[1], r[0])))
else:
res.append((r[0], _('%s ID %s') % (r[1], r[0])))
return res
@http.route('/web/dataset/call_kw/<model>/name_search', type='json', auth="user")
def name_search(self, model, method, args, kwargs):
context = kwargs.get('context')
if context and context.get('extended_name_with_contact'):
#add order by ID desc
cr, uid = request.cr, request.uid
Model = request.registry[model]
search_args = list(kwargs.get('args') or [])
limit = int(kwargs.get('limit') or 100)
operator = kwargs.get('operator')
name = kwargs.get('name')
if Model._rec_name and (not name == '' and operator == 'ilike'):
search_args += [(Model._rec_name, operator, name)]
ids = Model.search(cr, uid, search_args, limit=limit, order='id desc', context=context)
res = Model.name_get(cr, uid, ids, context)
return self._extend_name(model, res)
return self._call_kw(model, method, args, kwargs)
@http.route('/web/dataset/call_kw/<model>/name_get', type='json', auth="user")
def name_get(self, model, method, args, kwargs):
res = self._call_kw(model, method, args, kwargs)
context = kwargs.get('context')
if context and context.get('extended_name_with_contact'):
res = self._extend_name(model, res)
return res

9
data/mail_move_message_data.xml

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<record id="mail_relocation_models" model="ir.config_parameter">
<field name="key">mail_relocation_models</field>
<field name="value">crm.lead,project.task</field>
</record>
</data>
</openerp>

5
doc/changelog.rst

@ -3,6 +3,11 @@
Changelog Changelog
========= =========
`1.0.2`
-------
- big improvements in interface
`1.0.1` `1.0.1`
------- -------

168
i18n/mail_move_message.pot

@ -0,0 +1,168 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_move_message
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-11 06:53+0000\n"
"PO-Revision-Date: 2015-08-11 06:53+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Cancel"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,create_uid:0
msgid "Created by"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,create_date:0
msgid "Created on"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,id:0
msgid "ID"
msgstr ""
#. module: mail_move_message
#: field:mail.message,is_moved:0
msgid "Is moved"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,record_url:0
msgid "Link to record"
msgstr ""
#. module: mail_move_message
#: model:ir.model,name:mail_move_message.model_mail_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
#: field:mail_move_message.wizard,message_id:0
msgid "Message"
msgstr ""
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Move"
msgstr ""
#. module: mail_move_message
#: help:mail_move_message.wizard,move_back:0
msgid "Move message and submessages to original place"
msgstr ""
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Move Message"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,move_back:0
msgid "Move to origin"
msgstr ""
#. module: mail_move_message
#. openerp-web
#: code:addons/mail_move_message/static/src/xml/mail_move_message_main.xml:5
#, python-format
msgid "Move to thread"
msgstr ""
#. module: mail_move_message
#: field:mail.message,moved_by_message_id:0
msgid "Moved by message"
msgstr ""
#. module: mail_move_message
#: field:mail.message,moved_by_user_id:0
msgid "Moved by user"
msgstr ""
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Open message"
msgstr ""
#. module: mail_move_message
#: field:mail.message,moved_from_parent_id:0
msgid "Parent Message (Original)"
msgstr ""
#. module: mail_move_message
#: code:addons/mail_move_message/mail_move_message_models.py:107
#, python-format
msgid "Record"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,res_id:0
msgid "Record ID"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,model_id:0
msgid "Record type"
msgstr ""
#. module: mail_move_message
#: field:mail.message,moved_from_res_id:0
msgid "Related Document ID (Original)"
msgstr ""
#. module: mail_move_message
#: field:mail.message,moved_from_model:0
msgid "Related Document Model (Original)"
msgstr ""
#. module: mail_move_message
#. openerp-web
#: code:addons/mail_move_message/static/src/js/mail_move_message.js:17
#, python-format
msgid "Relocate Message"
msgstr ""
#. module: mail_move_message
#: field:mail_move_message.wizard,parent_id:0
msgid "Search by name"
msgstr ""
#. module: mail_move_message
#: help:mail.message,moved_by_message_id:0
msgid "Top message, that initate moving this message"
msgstr ""
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "You cannot move this message. It was already moved with a message bellow. Open one and apply changes there."
msgstr ""
#. module: mail_move_message
#: help:mail_move_message.wizard,model_id:0
msgid "List available Models is configured at Settings\Technical\Emails\Mail Relocation. Empty for unassigned email"
msgstr ""
#. module: mail_move_message
#: help:mail_move_message.wizard,filter_by_partner:0
msgid "Show only records with the same partner as email author"
msgstr ""

160
i18n/sl.po

@ -0,0 +1,160 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_move_message
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-11 06:53+0000\n"
"PO-Revision-Date: 2015-08-11 08:58+0200\n"
"Last-Translator: Matjaz Mozetic <m.mozetic@matmoz.si>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
"Language: sl\n"
"X-Generator: Poedit 1.8.2\n"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Cancel"
msgstr "Preklic"
#. module: mail_move_message
#: field:mail_move_message.wizard,create_uid:0
msgid "Created by"
msgstr "Ustvaril"
#. module: mail_move_message
#: field:mail_move_message.wizard,create_date:0
msgid "Created on"
msgstr "Ustvarjeno"
#. module: mail_move_message
#: field:mail_move_message.wizard,id:0
msgid "ID"
msgstr "ID"
#. module: mail_move_message
#: field:mail.message,is_moved:0
msgid "Is moved"
msgstr "Je premaknjeno"
#. module: mail_move_message
#: field:mail_move_message.wizard,write_uid:0
msgid "Last Updated by"
msgstr "Zadnjič posodobil"
#. module: mail_move_message
#: field:mail_move_message.wizard,write_date:0
msgid "Last Updated on"
msgstr "Zadnjič posodobljeno"
#. module: mail_move_message
#: field:mail_move_message.wizard,record_url:0
msgid "Link to record"
msgstr "Povezava do zapisa"
#. module: mail_move_message
#: model:ir.model,name:mail_move_message.model_mail_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
#: field:mail_move_message.wizard,message_id:0
msgid "Message"
msgstr "Sporočilo"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Move"
msgstr "Premik"
#. module: mail_move_message
#: help:mail_move_message.wizard,move_back:0
msgid "Move message and submessages to original place"
msgstr "Premik sporočila in podrejenih sporočil na izvorno mesto"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Move Message"
msgstr "Premik sporočila"
#. module: mail_move_message
#: field:mail_move_message.wizard,move_back:0
msgid "Move to origin"
msgstr "Premik na izvor"
#. module: mail_move_message
#. openerp-web
#: code:addons/mail_move_message/static/src/xml/mail_move_message_main.xml:5
#, python-format
msgid "Move to thread"
msgstr "Premik v nit"
#. module: mail_move_message
#: field:mail.message,moved_by_message_id:0
msgid "Moved by message"
msgstr "Premaknjeno s sporočilom"
#. module: mail_move_message
#: field:mail.message,moved_by_user_id:0
msgid "Moved by user"
msgstr "Premaknil uporabnik"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "Open message"
msgstr "Odpri sporočilo"
#. module: mail_move_message
#: field:mail.message,moved_from_parent_id:0
msgid "Parent Message (Original)"
msgstr "Nadrejeno sporočilo (original)"
#. module: mail_move_message
#: code:addons/mail_move_message/mail_move_message_models.py:107
#, python-format
msgid "Record"
msgstr "Zapis"
#. module: mail_move_message
#: field:mail_move_message.wizard,res_id:0
msgid "Record ID"
msgstr "ID zapisa"
#. module: mail_move_message
#: field:mail_move_message.wizard,model_id:0
msgid "Record type"
msgstr "Tip zapisa"
#. module: mail_move_message
#: field:mail.message,moved_from_res_id:0
msgid "Related Document ID (Original)"
msgstr "ID povezanega dokumenta (original)"
#. module: mail_move_message
#: field:mail.message,moved_from_model:0
msgid "Related Document Model (Original)"
msgstr "Model povezanega dokumenta (original)"
#. module: mail_move_message
#. openerp-web
#: code:addons/mail_move_message/static/src/js/mail_move_message.js:17
#, python-format
msgid "Relocate Message"
msgstr "Premik sporočila"
#. module: mail_move_message
#: field:mail_move_message.wizard,parent_id:0
msgid "Search by name"
msgstr "Iskanje po nazivu"
#. module: mail_move_message
#: help:mail.message,moved_by_message_id:0
msgid "Top message, that initate moving this message"
msgstr "Zgornje sporočilo, ki je sprožilo premik tega sporočila"
#. module: mail_move_message
#: view:mail_move_message.wizard:mail_move_message.view_wizard
msgid "You cannot move this message. It was already moved with a message bellow. Open one and apply changes there."
msgstr "Tega sporočila ne morete premakniti, ker je bilo že premaknjeno s spodnjim sporočilom. Tam lahko uveljavljate spremembe."

210
mail_move_message_models.py

@ -1,20 +1,77 @@
from lxml import etree
from openerp import api, models, fields, SUPERUSER_ID from openerp import api, models, fields, SUPERUSER_ID
from openerp.tools import email_split
from openerp.tools.translate import _ from openerp.tools.translate import _
class wizard(models.TransientModel): class wizard(models.TransientModel):
_name = 'mail_move_message.wizard' _name = 'mail_move_message.wizard'
def _model_selection(self):
selection = []
config_parameters = self.env['ir.config_parameter']
model_names = config_parameters.get_param('mail_relocation_models')
model_names = model_names.split(',') if model_names else []
if 'default_message_id' in self.env.context:
message = self.env['mail.message'].browse(self.env.context['default_message_id'])
if message.model and message.model not in model_names:
model_names.append(message.model)
if message.moved_from_model and message.moved_from_model not in model_names:
model_names.append(message.moved_from_model)
if model_names:
selection = [(m.model, m.display_name) for m in self.env['ir.model'].search([('model', 'in', model_names)])]
return selection
@api.model
def default_get(self, fields_list):
res = super(wizard, self).default_get(fields_list)
model_fields = self.fields_get()
if model_fields['model']['selection']:
res['model'] = model_fields['model']['selection'] and model_fields['model']['selection'][0][0]
if 'message_id' in res:
message = self.env['mail.message'].browse(res['message_id'])
email_from = message.email_from
parts = email_split(email_from.replace(' ',','))
if parts:
email = parts[0]
name = email_from[:email_from.index(email)].replace('"', '').replace('<', '').strip() or email_from
else:
name, email = email_from
res['message_name_from'] = name
res['message_email_from'] = email
res['partner_id'] = message.author_id.id
if message.author_id and self.env.uid not in [u.id for u in message.author_id.user_ids]:
res['filter_by_partner'] = True
if message.author_id and res.get('model'):
res_id = self.env[res['model']].search([], order='id desc', limit=1)
res['res_id'] = res_id and res_id[0].id
res['uid'] = self.env.uid
return res
message_id = fields.Many2one('mail.message', string='Message') message_id = fields.Many2one('mail.message', string='Message')
message_body = fields.Html(related='message_id.body', string='Message to move', readonly=True) message_body = fields.Html(related='message_id.body', string='Message to move', readonly=True)
message_from = fields.Char(related='message_id.email_from', string='From', 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_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) message_moved_by_user_id = fields.Many2one('res.users', related='message_id.moved_by_user_id', string='Moved by', readonly=True)
message_is_moved = fields.Boolean(string='Is Moved', related='message_id.is_moved', readonly=True) message_is_moved = fields.Boolean(string='Is Moved', related='message_id.is_moved', 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)
parent_id = fields.Many2one('mail.message', string='Search by name', )
model = fields.Selection(_model_selection, string='Model')
res_id = fields.Integer(string='Record')
can_move = fields.Boolean('Can move', compute='get_can_move') can_move = fields.Boolean('Can move', compute='get_can_move')
move_back = fields.Boolean('Move to origin', help='Move message and submessages to original place')
move_back = fields.Boolean('MOVE TO ORIGIN', help='Move message and submessages to original place')
partner_id = fields.Many2one('res.partner', string='Author')
filter_by_partner = fields.Boolean('Filter Records by partner')
message_email_from = fields.Char()
message_name_from = fields.Char()
# FIXME message_to_read should be True even if current message or any his childs are unread
message_to_read = fields.Boolean(related='message_id.to_read')
uid = fields.Integer()
@api.depends('message_id') @api.depends('message_id')
@api.one @api.one
@ -27,33 +84,45 @@ class wizard(models.TransientModel):
if not self.move_back: if not self.move_back:
return return
self.parent_id = self.message_id.moved_from_parent_id 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 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')
if self.message_id.is_moved:
self.model = model
self.res_id = self.message_id.moved_from_res_id
@api.onchange('parent_id', 'res_id', 'model')
def update_move_back(self): def update_move_back(self):
model = self.message_id.moved_from_model 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 \ 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.res_id == self.message_id.moved_from_res_id \
and (self.model_id == model_id or (not self.model_id and not model_id))
and (self.model == model or (not self.model and not model))
@api.onchange('parent_id') @api.onchange('parent_id')
def on_change_parent_id(self): def on_change_parent_id(self):
if self.parent_id and self.parent_id.model: if self.parent_id and self.parent_id.model:
self.model_id = self.env['ir.model'].search([('model', '=', self.parent_id.model)])[0]
self.model = self.parent_id.model
self.res_id = self.parent_id.res_id self.res_id = self.parent_id.res_id
else: else:
self.model_id = None
self.model = None
self.res_id = None self.res_id = None
@api.onchange('model_id', 'res_id')
def on_change_res(self):
if not ( self.model_id and self.res_id ):
self.record_url = ''
return
self.record_url = '/web#id=%s&model=%s' % (self.res_id, self.model_id.model)
@api.onchange('model', 'filter_by_partner', 'partner_id')
def on_change_partner(self):
domain = {'res_id': []}
if self.model and self.filter_by_partner and self.partner_id:
fields = self.env[self.model].fields_get(False)
contact_field = False
for n, f in fields.iteritems():
if f['type'] == 'many2one' and f['relation'] == 'res.partner':
contact_field = n
break
if contact_field:
domain['res_id'] = [(contact_field, '=', self.partner_id.id)]
if self.model:
res_id = self.env[self.model].search(domain['res_id'], order='id desc', limit=1)
self.res_id = res_id and res_id[0].id
else:
self.res_id = None
return {'domain': domain}
@api.one @api.one
def check_access(self): def check_access(self):
@ -62,9 +131,9 @@ class wizard(models.TransientModel):
operation = 'write' operation = 'write'
context = self._context context = self._context
if not ( self.model_id and self.res_id ):
if not ( self.model and self.res_id ):
return True return True
model_obj = self.pool[self.model_id.model]
model_obj = self.pool[self.model]
mids = model_obj.exists(cr, uid, [self.res_id]) mids = model_obj.exists(cr, uid, [self.res_id])
if hasattr(model_obj, 'check_mail_message_access'): if hasattr(model_obj, 'check_mail_message_access'):
model_obj.check_mail_message_access(cr, uid, mids, operation, context=context) model_obj.check_mail_message_access(cr, uid, mids, operation, context=context)
@ -85,17 +154,20 @@ class wizard(models.TransientModel):
'target': 'new', 'target': 'new',
'context': {'default_message_id': message_id}, 'context': {'default_message_id': message_id},
} }
@api.multi @api.multi
def move(self): def move(self):
for r in self: for r in self:
r.check_access() r.check_access()
if r.parent_id:
if not (r.parent_id.model == r.model_id.model and
if not r.parent_id or not (r.parent_id.model == r.model and
r.parent_id.res_id == r.res_id): r.parent_id.res_id == r.res_id):
r.parent_id = None
r.message_id.move(r.parent_id.id, r.res_id, r.model_id.model, r.move_back)
#link with the first message of record
parent = self.env['mail.message'].search([('model','=',r.model), ('res_id','=',r.res_id)], order='id', limit=1)
r.parent_id = parent.id or None
if not ( r.model_id and r.res_id ):
r.message_id.move(r.parent_id.id, r.res_id, r.model, r.move_back)
if not ( r.model and r.res_id ):
obj = self.pool.get('ir.model.data').get_object_reference(self._cr, SUPERUSER_ID, 'mail', 'mail_archivesfeeds')[1] obj = self.pool.get('ir.model.data').get_object_reference(self._cr, SUPERUSER_ID, 'mail', 'mail_archivesfeeds')[1]
return { return {
'type' : 'ir.actions.client', 'type' : 'ir.actions.client',
@ -107,12 +179,48 @@ class wizard(models.TransientModel):
'name': _('Record'), 'name': _('Record'),
'view_type': 'form', 'view_type': 'form',
'view_mode': 'form', 'view_mode': 'form',
'res_model': r.model_id.model,
'res_model': r.model,
'res_id': r.res_id, 'res_id': r.res_id,
'views': [(False, 'form')], 'views': [(False, 'form')],
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
} }
@api.one
def delete(self):
self.message_id.unlink()
return {}
@api.model
def create_partner(self, message_id, relation, partner_id, message_name_from, message_email_from):
model = self.env[relation]
message = self.env['mail.message'].browse(message_id)
if not partner_id and message_name_from:
partner_id = self.env['res.partner'].with_context({'update_message_author': True}).create({
'name': message_name_from,
'email': message_email_from
}).id
context = {'partner_id': partner_id}
if model._rec_name:
context.update({'default_%s' % model._rec_name: message.subject})
fields = model.fields_get()
contact_field = False
for n, f in fields.iteritems():
if f['type'] == 'many2one' and f['relation'] == 'res.partner':
contact_field = n
break
if contact_field:
context.update({'default_%s' % contact_field: partner_id})
return context
@api.one
def read_close(self):
self.message_id.set_message_read(True)
self.message_id.child_ids.set_message_read(True)
return {'type': 'ir.actions.act_window_close'}
class mail_message(models.Model): class mail_message(models.Model):
_inherit = 'mail.message' _inherit = 'mail.message'
@ -193,3 +301,51 @@ class mail_message(models.Model):
res = super(mail_message, self)._message_read_dict(cr, uid, message, parent_id, context) res = super(mail_message, self)._message_read_dict(cr, uid, message, parent_id, context)
res['is_moved'] = message.is_moved res['is_moved'] = message.is_moved
return res return res
class mail_move_message_configuration(models.TransientModel):
_name = 'mail_move_message.config.settings'
_inherit = 'res.config.settings'
model_ids = fields.Many2many(comodel_name='ir.model', string='Models')
@api.model
def get_default_model_ids(self, fields):
config_parameters = self.env['ir.config_parameter']
model_obj = self.env['ir.model']
model_names = config_parameters.get_param('mail_relocation_models')
if not model_names:
return {}
model_names = model_names.split(',')
model_ids = model_obj.search([('model', 'in', model_names)])
return {'model_ids': [m.id for m in model_ids]}
@api.multi
def set_model_ids(self):
config_parameters = self.env['ir.config_parameter']
model_names = ''
for record in self:
model_names = ','.join([m.model for m in record.model_ids])
config_parameters.set_param('mail_relocation_models', model_names)
class res_partner(models.Model):
_inherit = 'res.partner'
@api.model
def create(self, vals):
res = super(res_partner, self).create(vals)
if 'update_message_author' in self.env.context and 'email' in vals:
mail_message_obj = self.env['mail.message']
# Escape special SQL characters in email_address to avoid invalid matches
email_address = (vals['email'].replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_'))
email_brackets = "<%s>" % email_address
messages = mail_message_obj.search([
'|',
('email_from', '=ilike', email_address),
('email_from', 'ilike', email_brackets),
('author_id', '=', False)
])
if messages:
messages.sudo().write({'author_id': res.id})
return res

86
mail_move_message_views.xml

@ -13,8 +13,13 @@
<field name="model">mail_move_message.wizard</field> <field name="model">mail_move_message.wizard</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Move Message"> <form string="Move Message">
<field name="can_move" invisible="1"/> <field name="can_move" invisible="1"/>
<field name="message_is_moved" invisible="1"/> <field name="message_is_moved" invisible="1"/>
<field name="message_name_from" invisible="1"/>
<field name="message_email_from" invisible="1"/>
<field name="message_to_read" invisible="1"/>
<field name="uid" invisible="1"/>
<p attrs="{'invisible':[('can_move', '!=', False)]}">You cannot move this message. It was already moved with a message bellow. Open one and apply changes there.</p> <p attrs="{'invisible':[('can_move', '!=', False)]}">You cannot move this message. It was already moved with a message bellow. Open one and apply changes there.</p>
<group attrs="{'invisible':[('can_move', '!=', False)]}"> <group attrs="{'invisible':[('can_move', '!=', False)]}">
@ -22,23 +27,88 @@
<field name="message_moved_by_user_id"/> <field name="message_moved_by_user_id"/>
<button name="open_moved_by_message_id" string="Open message" type="object" class="oe_highlight"/> <button name="open_moved_by_message_id" string="Open message" type="object" class="oe_highlight"/>
</group> </group>
<group attrs="{'invisible':[('can_move', '=', False)]}" col="4">
<field name="move_back" attrs="{'invisible':[('message_is_moved','=',False)]}" colspan="4"/>
<field name="parent_id" domain="[('parent_id','=', False)]" context="{'extended_name':1}" colspan="4"/>
<field name="model_id" colspan="2" />
<field name="res_id" colspan="2"/>
<field name="record_url" colspan="4" widget="url"/>
<group attrs="{'invisible':[('can_move', '=', False)]}" colspan="2">
<label for="model"/>
<div>
<field name="model" widget="polymorphic" polymorphic="res_id" class="oe_inline"/>
</div>
<label for="filter_by_partner"/>
<div>
<field name="filter_by_partner"/>
<field name="partner_id" style="width:50%"/>
<button string="Create Partner" attrs="{'invisible':[('partner_id','!=',False)]}" class="oe_highlight" special="quick_create" field="partner_id" context="{'force_email':True,'default_email':message_email_from,'default_name':message_name_from, 'update_message_author':True}"/>
</div>
<label for="res_id"/>
<div>
<field name="res_id" context="{'extended_name_with_contact':1}" widget="many2one" attrs="{'readonly': [('model','=',False)]}" style="width:50%"/>
<button string="Create new record" name="create_record" type="object" class="oe_highlight" attrs="{'invisible':['|',('model','=',False)]}" special="quick_create" field="res_id" use_for_mail_move_message="True"/>
</div>
<label for="move_back" attrs="{'invisible':[('message_is_moved','=',False)]}"/>
<div attrs="{'invisible':[('message_is_moved','=',False)]}">
<field name="move_back"/>
</div>
</group> </group>
<button name="move" string="Move" type="object" class="oe_highlight" attrs="{'invisible':[('can_move', '=', False)]}"/> <button name="move" string="Move" type="object" class="oe_highlight" attrs="{'invisible':[('can_move', '=', False)]}"/>
<button string="Cancel" class="" special="cancel" />
<button string="Close" class="" special="cancel" />
<separator string="Message"/> <separator string="Message"/>
<div>
<group>
<field name="message_from"/>
<field name="message_id" invisible="1"/> <field name="message_id" invisible="1"/>
</group>
<div class="openerp mail_move_message">
<div class="oe_mail">
<div class="oe_msg">
<div class="oe_msg_content">
<div class="oe_msg_body">
<!-- use built-in css for messages -->
<field name="message_body"/> <field name="message_body"/>
</div> </div>
</div>
</div>
</div>
</div>
<footer>
<button name="read_close" string="Mark as read and Close" type="object" class="oe_highlight"/> or
<button special="cancel" string="Close" class="oe_link"/>
<button name="delete" string="Delete message" type="object" class="oe_highlight oe_right" confirm="Do you really want to delete this message?" attrs="{'invisible':[('uid','!=',1)]}"/>
</footer>
</form> </form>
</field> </field>
</record> </record>
<!-- Relocation config wizard -->
<record id="view_mail_move_message_config_settings" model="ir.ui.view">
<field name="name">relocation settings</field>
<field name="model">mail_move_message.config.settings</field>
<field name="arch" type="xml">
<form string="Configure Mail Relocation" class="oe_form_configuration">
<header>
<button string="Apply" type="object" name="execute" class="oe_highlight"/>
or
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
</header>
<div name="general">
<separator string="Models"/>
<field name="model_ids" widget="many2many_tags"/>
</div>
</form>
</field>
</record>
<record id="action_mail_move_message_config" model="ir.actions.act_window">
<field name="name">Mail Relocation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mail_move_message.config.settings</field>
<field name="view_id" ref="view_mail_move_message_config_settings"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
<!-- Add menu entry in Settings/Email -->
<menuitem name="Mail Relocation" id="menu_mail_move_message" parent="base.menu_email" sequence="99" action="action_mail_move_message_config"/>
</data> </data>
</openerp> </openerp>

BIN
static/description/inbox-move.png

Before

Width: 750  |  Height: 400  |  Size: 90 KiB

After

Width: 1054  |  Height: 562  |  Size: 85 KiB

4
static/src/css/mail_move_message.css

@ -7,3 +7,7 @@
color: #ffa1a1; color: #ffa1a1;
text-shadow: 0px 1px #ff0000,0px -1px #ff0000, -1px 0px #ff0000, 1px 0px #ff0000, 0px 3px 3px rgba(0,0,0,0.1); text-shadow: 0px 1px #ff0000,0px -1px #ff0000, -1px 0px #ff0000, 1px 0px #ff0000, 0px 3px 3px rgba(0,0,0,0.1);
} }
.openerp.mail_move_message{
width: 864px;
}

56
static/src/js/mail_move_message.js

@ -10,6 +10,7 @@ openerp.mail_move_message = function (session) {
this.$('.oe_move').on('click', this.on_move_message) this.$('.oe_move').on('click', this.on_move_message)
}, },
on_move_message: function(event){ on_move_message: function(event){
var self = this;
var context = { var context = {
'default_message_id': this.id 'default_message_id': this.id
} }
@ -24,7 +25,11 @@ openerp.mail_move_message = function (session) {
context: context, context: context,
}; };
this.do_action(action);
self.do_action(action, {
'on_close': function(){
self.check_for_rerender();
}
});
} }
}) })
@ -34,4 +39,53 @@ openerp.mail_move_message = function (session) {
this.is_moved = datasets.is_moved || false; this.is_moved = datasets.is_moved || false;
} }
}) })
session.web.form.WidgetButton.include({
on_click: function() {
if(this.node.attrs.special == 'quick_create'){
var self = this;
var related_field = this.field_manager.fields[this.node.attrs['field']];
var context_built = $.Deferred();
if(this.node.attrs.use_for_mail_move_message) {
var model = new session.web.Model(this.view.dataset.model);
var partner_id = self.field_manager.fields['partner_id'].get_value();
var message_name_from = self.field_manager.fields['message_name_from'].get_value();
var message_email_from = self.field_manager.fields['message_email_from'].get_value();
context_built = model.call('create_partner', [self.view.dataset.context.default_message_id,
related_field.field.relation, partner_id, message_name_from, message_email_from]);
}
else {
context_built.resolve(this.build_context());
}
$.when(context_built).pipe(function (context) {
if(self.node.attrs.use_for_mail_move_message) {
self.field_manager.fields['partner_id'].set_value(context['partner_id']);
}
var pop = new session.web.form.FormOpenPopup(this);
pop.show_element(
related_field.field.relation,
false,
context,
{
title: _t("Create new record"),
}
);
pop.on('closed', self, function () {
self.force_disabled = false;
self.check_disable();
});
pop.on('create_completed', self, function(id) {
related_field.set_value(id);
if(self.field_manager.fields['filter_by_partner']) {
self.field_manager.fields['filter_by_partner'].set_value(true);
}
});
});
}
else {
this._super.apply(this, arguments);
}
},
});
} }
Loading…
Cancel
Save