[MERGE] Chatter, invite: send emails for notifications or invitations contains a link to the document if the user can read it, or a generic link to the portal
Invite wizard: many2many_tags on recipients now show the email of chosen partners crm, task, project_issue: when a message is send from a record, the reply_to address will be the alias of the section or project, if defined. bzr revid: tde@openerp.com-20130104140121-cslebgwtc1i1juv2
This commit is contained in:
commit
d4716db1cc
|
@ -52,7 +52,7 @@ class res_partner(osv.Model):
|
||||||
(not partner.signup_expiration or dt <= partner.signup_expiration)
|
(not partner.signup_expiration or dt <= partner.signup_expiration)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _get_signup_url_for_action(self, cr, uid, ids, action='login', view_type=None, menu_id=None, res_id=None, context=None):
|
def _get_signup_url_for_action(self, cr, uid, ids, action='login', view_type=None, menu_id=None, res_id=None, model=None, context=None):
|
||||||
""" generate a signup url for the given partner ids and action, possibly overriding
|
""" generate a signup url for the given partner ids and action, possibly overriding
|
||||||
the url state components (menu_id, id, view_type) """
|
the url state components (menu_id, id, view_type) """
|
||||||
res = dict.fromkeys(ids, False)
|
res = dict.fromkeys(ids, False)
|
||||||
|
@ -61,6 +61,7 @@ class res_partner(osv.Model):
|
||||||
# when required, make sure the partner has a valid signup token
|
# when required, make sure the partner has a valid signup token
|
||||||
if context and context.get('signup_valid') and not partner.user_ids:
|
if context and context.get('signup_valid') and not partner.user_ids:
|
||||||
self.signup_prepare(cr, uid, [partner.id], context=context)
|
self.signup_prepare(cr, uid, [partner.id], context=context)
|
||||||
|
partner.refresh()
|
||||||
|
|
||||||
# the parameters to encode for the query and fragment part of url
|
# the parameters to encode for the query and fragment part of url
|
||||||
query = {'db': cr.dbname}
|
query = {'db': cr.dbname}
|
||||||
|
@ -78,6 +79,8 @@ class res_partner(osv.Model):
|
||||||
fragment['view_type'] = view_type
|
fragment['view_type'] = view_type
|
||||||
if menu_id:
|
if menu_id:
|
||||||
fragment['menu_id'] = menu_id
|
fragment['menu_id'] = menu_id
|
||||||
|
if model:
|
||||||
|
fragment['model'] = model
|
||||||
if res_id:
|
if res_id:
|
||||||
fragment['id'] = res_id
|
fragment['id'] = res_id
|
||||||
|
|
||||||
|
|
|
@ -966,6 +966,11 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
# Mail Gateway
|
# Mail Gateway
|
||||||
# ----------------------------------------
|
# ----------------------------------------
|
||||||
|
|
||||||
|
def message_get_reply_to(self, cr, uid, ids, context=None):
|
||||||
|
""" Override to get the reply_to of the parent project. """
|
||||||
|
return [lead.section_id.message_get_reply_to()[0] if lead.section_id else False
|
||||||
|
for lead in self.browse(cr, uid, ids, context=context)]
|
||||||
|
|
||||||
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
||||||
""" Overrides mail_thread message_new that is called by the mailgateway
|
""" Overrides mail_thread message_new that is called by the mailgateway
|
||||||
through message_process.
|
through message_process.
|
||||||
|
|
|
@ -75,13 +75,6 @@ class mail_notification(osv.Model):
|
||||||
if not cr.fetchone():
|
if not cr.fetchone():
|
||||||
cr.execute('CREATE INDEX mail_notification_partner_id_read_starred_message_id ON mail_notification (partner_id, read, starred, message_id)')
|
cr.execute('CREATE INDEX mail_notification_partner_id_read_starred_message_id ON mail_notification (partner_id, read, starred, message_id)')
|
||||||
|
|
||||||
def create(self, cr, uid, vals, context=None):
|
|
||||||
""" Override of create to check that we can not create a notification
|
|
||||||
for a message the user can not read. """
|
|
||||||
if self.pool.get('mail.message').check_access_rights(cr, uid, 'read'):
|
|
||||||
return super(mail_notification, self).create(cr, uid, vals, context=context)
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_partners_to_notify(self, cr, uid, message, context=None):
|
def get_partners_to_notify(self, cr, uid, message, context=None):
|
||||||
""" Return the list of partners to notify, based on their preferences.
|
""" Return the list of partners to notify, based on their preferences.
|
||||||
|
|
||||||
|
|
|
@ -21,10 +21,13 @@
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
from openerp import tools
|
from urllib import urlencode
|
||||||
|
from urlparse import urljoin
|
||||||
|
|
||||||
|
from openerp import tools
|
||||||
from openerp import SUPERUSER_ID
|
from openerp import SUPERUSER_ID
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
|
from openerp.osv.orm import except_orm
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
@ -158,7 +161,43 @@ class mail_mail(osv.Model):
|
||||||
:param browse_record mail: mail.mail browse_record
|
:param browse_record mail: mail.mail browse_record
|
||||||
:param browse_record partner: specific recipient partner
|
:param browse_record partner: specific recipient partner
|
||||||
"""
|
"""
|
||||||
return mail.body_html
|
body = mail.body_html
|
||||||
|
# partner is a user, link to a related document (incentive to install portal)
|
||||||
|
if partner and partner.user_ids and mail.model and mail.res_id \
|
||||||
|
and self.check_access_rights(cr, partner.user_ids[0].id, 'read', raise_exception=False):
|
||||||
|
related_user = partner.user_ids[0]
|
||||||
|
try:
|
||||||
|
self.pool.get(mail.model).check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
|
||||||
|
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
|
||||||
|
# the parameters to encode for the query and fragment part of url
|
||||||
|
query = {'db': cr.dbname}
|
||||||
|
fragment = {
|
||||||
|
'login': related_user.login,
|
||||||
|
'model': mail.model,
|
||||||
|
'id': mail.res_id,
|
||||||
|
}
|
||||||
|
url = urljoin(base_url, "?%s#%s" % (urlencode(query), urlencode(fragment)))
|
||||||
|
text = _("""<p>Access this document <a href="%s">directly in OpenERP</a></p>""") % url
|
||||||
|
body = tools.append_content_to_html(body, ("<div><p>%s</p></div>" % text), plaintext=False)
|
||||||
|
except except_orm, e:
|
||||||
|
pass
|
||||||
|
return body
|
||||||
|
|
||||||
|
def send_get_mail_reply_to(self, cr, uid, mail, partner=None, context=None):
|
||||||
|
""" Return a specific ir_email body. The main purpose of this method
|
||||||
|
is to be inherited by Portal, to add a link for signing in, in
|
||||||
|
each notification email a partner receives.
|
||||||
|
|
||||||
|
:param browse_record mail: mail.mail browse_record
|
||||||
|
:param browse_record partner: specific recipient partner
|
||||||
|
"""
|
||||||
|
if mail.reply_to:
|
||||||
|
return mail.reply_to
|
||||||
|
if not mail.model or not mail.res_id:
|
||||||
|
return False
|
||||||
|
if not hasattr(self.pool.get(mail.model), 'message_get_reply_to'):
|
||||||
|
return False
|
||||||
|
return self.pool.get(mail.model).message_get_reply_to(cr, uid, [mail.res_id], context=context)[0]
|
||||||
|
|
||||||
def send_get_email_dict(self, cr, uid, mail, partner=None, context=None):
|
def send_get_email_dict(self, cr, uid, mail, partner=None, context=None):
|
||||||
""" Return a dictionary for specific email values, depending on a
|
""" Return a dictionary for specific email values, depending on a
|
||||||
|
@ -169,6 +208,7 @@ class mail_mail(osv.Model):
|
||||||
"""
|
"""
|
||||||
body = self.send_get_mail_body(cr, uid, mail, partner=partner, context=context)
|
body = self.send_get_mail_body(cr, uid, mail, partner=partner, context=context)
|
||||||
subject = self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context)
|
subject = self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context)
|
||||||
|
reply_to = self.send_get_mail_reply_to(cr, uid, mail, partner=partner, context=context)
|
||||||
body_alternative = tools.html2plaintext(body)
|
body_alternative = tools.html2plaintext(body)
|
||||||
email_to = [partner.email] if partner else tools.email_split(mail.email_to)
|
email_to = [partner.email] if partner else tools.email_split(mail.email_to)
|
||||||
return {
|
return {
|
||||||
|
@ -176,6 +216,7 @@ class mail_mail(osv.Model):
|
||||||
'body_alternative': body_alternative,
|
'body_alternative': body_alternative,
|
||||||
'subject': subject,
|
'subject': subject,
|
||||||
'email_to': email_to,
|
'email_to': email_to,
|
||||||
|
'reply_to': reply_to,
|
||||||
}
|
}
|
||||||
|
|
||||||
def send(self, cr, uid, ids, auto_commit=False, recipient_ids=None, context=None):
|
def send(self, cr, uid, ids, auto_commit=False, recipient_ids=None, context=None):
|
||||||
|
@ -219,7 +260,7 @@ class mail_mail(osv.Model):
|
||||||
body = email.get('body'),
|
body = email.get('body'),
|
||||||
body_alternative = email.get('body_alternative'),
|
body_alternative = email.get('body_alternative'),
|
||||||
email_cc = tools.email_split(mail.email_cc),
|
email_cc = tools.email_split(mail.email_cc),
|
||||||
reply_to = mail.reply_to,
|
reply_to = email.get('reply_to'),
|
||||||
attachments = attachments,
|
attachments = attachments,
|
||||||
message_id = mail.message_id,
|
message_id = mail.message_id,
|
||||||
references = mail.references,
|
references = mail.references,
|
||||||
|
|
|
@ -387,6 +387,18 @@ class mail_thread(osv.AbstractModel):
|
||||||
return [('message_unread', '=', True)]
|
return [('message_unread', '=', True)]
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
#------------------------------------------------------
|
||||||
|
# Email specific
|
||||||
|
#------------------------------------------------------
|
||||||
|
|
||||||
|
def message_get_reply_to(self, cr, uid, ids, context=None):
|
||||||
|
if not self._inherits.get('mail.alias'):
|
||||||
|
return [False for id in ids]
|
||||||
|
return ["%s@%s" % (record['alias_name'], record['alias_domain'])
|
||||||
|
if record.get('alias_domain') and record.get('alias_name')
|
||||||
|
else False
|
||||||
|
for record in self.read(cr, uid, ids, ['alias_name', 'alias_domain'], context=context)]
|
||||||
|
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
# Mail gateway
|
# Mail gateway
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
|
|
|
@ -76,8 +76,6 @@ class invite_wizard(osv.osv_memory):
|
||||||
'subject': 'Invitation to follow %s' % document.name_get()[0][1],
|
'subject': 'Invitation to follow %s' % document.name_get()[0][1],
|
||||||
'body_html': '%s' % wizard.message,
|
'body_html': '%s' % wizard.message,
|
||||||
'auto_delete': True,
|
'auto_delete': True,
|
||||||
'res_id': False,
|
|
||||||
'model': False,
|
|
||||||
}, context=context)
|
}, context=context)
|
||||||
mail_mail.send(cr, uid, [mail_id], recipient_ids=[follower_id], context=context)
|
mail_mail.send(cr, uid, [mail_id], recipient_ids=[follower_id], context=context)
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<field name="res_id" invisible="1"/>
|
<field name="res_id" invisible="1"/>
|
||||||
<field name="partner_ids" widget="many2many_tags_email"
|
<field name="partner_ids" widget="many2many_tags_email"
|
||||||
placeholder="Add contacts to notify..."
|
placeholder="Add contacts to notify..."
|
||||||
context="{'force_email':True}"/>
|
context="{'force_email':True, 'show_email':True}"/>
|
||||||
<field name="message"/>
|
<field name="message"/>
|
||||||
</group>
|
</group>
|
||||||
<footer>
|
<footer>
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
from openerp import SUPERUSER_ID
|
from openerp import SUPERUSER_ID
|
||||||
from openerp.osv import osv
|
from openerp.osv import osv
|
||||||
|
from openerp.osv.orm import except_orm
|
||||||
from openerp.tools import append_content_to_html
|
from openerp.tools import append_content_to_html
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
|
|
||||||
|
@ -35,10 +36,21 @@ class mail_mail(osv.Model):
|
||||||
:param partner: browse_record of the specific recipient partner
|
:param partner: browse_record of the specific recipient partner
|
||||||
:return: the resulting body_html
|
:return: the resulting body_html
|
||||||
"""
|
"""
|
||||||
body = super(mail_mail, self).send_get_mail_body(cr, uid, mail, partner, context=context)
|
partner_obj = self.pool.get('res.partner')
|
||||||
|
body = mail.body_html
|
||||||
if partner:
|
if partner:
|
||||||
context = dict(context or {}, signup_valid=True)
|
contex_signup = dict(context or {}, signup_valid=True)
|
||||||
partner = self.pool.get('res.partner').browse(cr, SUPERUSER_ID, partner.id, context=context)
|
partner = partner_obj.browse(cr, SUPERUSER_ID, partner.id, context=contex_signup)
|
||||||
text = _("""Access your personal documents through <a href="%s">our Customer Portal</a>""") % partner.signup_url
|
text = _("""<p>Access your messages and personal documents through <a href="%s">our Customer Portal</a></p>""") % partner.signup_url
|
||||||
|
# partner is an user: add a link to the document if read access
|
||||||
|
if partner.user_ids and mail.model and mail.res_id \
|
||||||
|
and self.check_access_rights(cr, partner.user_ids[0].id, 'read', raise_exception=False):
|
||||||
|
related_user = partner.user_ids[0]
|
||||||
|
try:
|
||||||
|
self.pool.get(mail.model).check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
|
||||||
|
url = partner_obj._get_signup_url_for_action(cr, related_user.id, [partner.id], action='', res_id=mail.res_id, model=mail.model, context=context)[partner.id]
|
||||||
|
text = _("""<p>Access this document <a href="%s">directly in OpenERP</a></p>""") % url
|
||||||
|
except except_orm, e:
|
||||||
|
pass
|
||||||
body = append_content_to_html(body, ("<div><p>%s</p></div>" % text), plaintext=False)
|
body = append_content_to_html(body, ("<div><p>%s</p></div>" % text), plaintext=False)
|
||||||
return body
|
return body
|
||||||
|
|
|
@ -1166,6 +1166,11 @@ class task(base_stage, osv.osv):
|
||||||
# Mail gateway
|
# Mail gateway
|
||||||
# ---------------------------------------------------
|
# ---------------------------------------------------
|
||||||
|
|
||||||
|
def message_get_reply_to(self, cr, uid, ids, context=None):
|
||||||
|
""" Override to get the reply_to of the parent project. """
|
||||||
|
return [task.project_id.message_get_reply_to()[0] if task.project_id else False
|
||||||
|
for task in self.browse(cr, uid, ids, context=context)]
|
||||||
|
|
||||||
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
||||||
""" Override to updates the document according to the email. """
|
""" Override to updates the document according to the email. """
|
||||||
if custom_values is None: custom_values = {}
|
if custom_values is None: custom_values = {}
|
||||||
|
|
|
@ -481,6 +481,11 @@ class project_issue(base_stage, osv.osv):
|
||||||
# Mail gateway
|
# Mail gateway
|
||||||
# -------------------------------------------------------
|
# -------------------------------------------------------
|
||||||
|
|
||||||
|
def message_get_reply_to(self, cr, uid, ids, context=None):
|
||||||
|
""" Override to get the reply_to of the parent project. """
|
||||||
|
return [issue.project_id.message_get_reply_to()[0] if issue.project_id else False
|
||||||
|
for issue in self.browse(cr, uid, ids, context=context)]
|
||||||
|
|
||||||
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
def message_new(self, cr, uid, msg, custom_values=None, context=None):
|
||||||
""" Overrides mail_thread message_new that is called by the mailgateway
|
""" Overrides mail_thread message_new that is called by the mailgateway
|
||||||
through message_process.
|
through message_process.
|
||||||
|
|
Loading…
Reference in New Issue