[MERGE] forward port branch saas-14 up to d171f282c3
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
|
||||
from datetime import date, datetime, timedelta
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo import api, exceptions, fields, models, _
|
||||
|
||||
|
||||
class MailActivityType(models.Model):
|
||||
@@ -102,20 +102,65 @@ class MailActivity(models.Model):
|
||||
self.summary = self.activity_type_id.summary
|
||||
self.date_deadline = (datetime.now() + timedelta(days=self.activity_type_id.days))
|
||||
|
||||
@api.multi
|
||||
def _check_access(self, operation):
|
||||
""" Rule to access activities
|
||||
|
||||
* create: check write rights on related document;
|
||||
* write: rule OR write rights on document;
|
||||
* unlink: rule OR write rights on document;
|
||||
"""
|
||||
self.check_access_rights(operation, raise_exception=True) # will raise an AccessError
|
||||
|
||||
if operation in ('write', 'unlink'):
|
||||
try:
|
||||
self.check_access_rule(operation)
|
||||
except exceptions.AccessError:
|
||||
pass
|
||||
else:
|
||||
return
|
||||
|
||||
doc_operation = 'read' if operation == 'read' else 'write'
|
||||
activity_to_documents = dict()
|
||||
for activity in self.sudo():
|
||||
activity_to_documents.setdefault(activity.res_model, list()).append(activity.res_id)
|
||||
for model, res_ids in activity_to_documents.items():
|
||||
self.env[model].check_access_rights(doc_operation, raise_exception=True)
|
||||
try:
|
||||
self.env[model].browse(res_ids).check_access_rule(doc_operation)
|
||||
except exceptions.AccessError:
|
||||
raise exceptions.AccessError(
|
||||
_('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') %
|
||||
(self._description, operation))
|
||||
|
||||
@api.model
|
||||
def create(self, values):
|
||||
activity = super(MailActivity, self).create(values)
|
||||
self.env[activity.res_model].browse(activity.res_id).message_subscribe(partner_ids=[activity.user_id.partner_id.id])
|
||||
return activity
|
||||
# already compute default values to be sure those are computed using the current user
|
||||
values_w_defaults = self.default_get(self._fields.keys())
|
||||
values_w_defaults.update(values)
|
||||
|
||||
# continue as sudo because activities are somewhat protected
|
||||
activity = super(MailActivity, self.sudo()).create(values_w_defaults)
|
||||
activity_user = activity.sudo(self.env.user)
|
||||
activity_user._check_access('create')
|
||||
self.env[activity_user.res_model].browse(activity_user.res_id).message_subscribe(partner_ids=[activity_user.user_id.partner_id.id])
|
||||
return activity_user
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
res = super(MailActivity, self).write(values)
|
||||
self._check_access('write')
|
||||
res = super(MailActivity, self.sudo()).write(values)
|
||||
|
||||
if values.get('user_id'):
|
||||
for activity in self:
|
||||
self.env[activity.res_model].browse(activity.res_id).message_subscribe(partner_ids=[activity.user_id.partner_id.id])
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
self._check_access('unlink')
|
||||
return super(MailActivity, self.sudo()).unlink()
|
||||
|
||||
@api.multi
|
||||
def action_done(self):
|
||||
message = self.env['mail.message']
|
||||
|
||||
@@ -96,6 +96,7 @@ class Message(models.Model):
|
||||
tracking_value_ids = fields.One2many(
|
||||
'mail.tracking.value', 'mail_message_id',
|
||||
string='Tracking values',
|
||||
groups="base.group_no_one",
|
||||
help='Tracked values are stored in a separate model. This field allow to reconstruct '
|
||||
'the tracking and to generate statistics on the model.')
|
||||
# mail gateway
|
||||
@@ -279,7 +280,7 @@ class Message(models.Model):
|
||||
# 1. Aggregate partners (author_id and partner_ids), attachments and tracking values
|
||||
partners = self.env['res.partner'].sudo()
|
||||
attachments = self.env['ir.attachment']
|
||||
trackings = self.env['mail.tracking.value']
|
||||
message_ids = message_tree.keys()
|
||||
for key, message in message_tree.iteritems():
|
||||
if message.author_id:
|
||||
partners |= message.author_id
|
||||
@@ -291,8 +292,6 @@ class Message(models.Model):
|
||||
partners |= message.needaction_partner_ids
|
||||
if message.attachment_ids:
|
||||
attachments |= message.attachment_ids
|
||||
if message.tracking_value_ids:
|
||||
trackings |= message.tracking_value_ids
|
||||
# Read partners as SUPERUSER -> message being browsed as SUPERUSER it is already the case
|
||||
partners_names = partners.name_get()
|
||||
partner_tree = dict((partner[0], partner) for partner in partners_names)
|
||||
@@ -307,13 +306,18 @@ class Message(models.Model):
|
||||
}) for attachment in attachments_data)
|
||||
|
||||
# 3. Tracking values
|
||||
tracking_tree = dict((tracking.id, {
|
||||
'id': tracking.id,
|
||||
'changed_field': tracking.field_desc,
|
||||
'old_value': tracking.get_old_display_value()[0],
|
||||
'new_value': tracking.get_new_display_value()[0],
|
||||
'field_type': tracking.field_type,
|
||||
}) for tracking in trackings)
|
||||
tracking_values = self.env['mail.tracking.value'].sudo().search([('mail_message_id', 'in', message_ids)])
|
||||
message_to_tracking = dict()
|
||||
tracking_tree = dict.fromkeys(tracking_values.ids, False)
|
||||
for tracking in tracking_values:
|
||||
message_to_tracking.setdefault(tracking.mail_message_id.id, list()).append(tracking.id)
|
||||
tracking_tree[tracking.id] = {
|
||||
'id': tracking.id,
|
||||
'changed_field': tracking.field_desc,
|
||||
'old_value': tracking.get_old_display_value()[0],
|
||||
'new_value': tracking.get_new_display_value()[0],
|
||||
'field_type': tracking.field_type,
|
||||
}
|
||||
|
||||
# 4. Update message dictionaries
|
||||
for message_dict in messages:
|
||||
@@ -340,9 +344,9 @@ class Message(models.Model):
|
||||
if attachment.id in attachments_tree:
|
||||
attachment_ids.append(attachments_tree[attachment.id])
|
||||
tracking_value_ids = []
|
||||
for tracking_value in message.tracking_value_ids:
|
||||
if tracking_value.id in tracking_tree:
|
||||
tracking_value_ids.append(tracking_tree[tracking_value.id])
|
||||
for tracking_value_id in message_to_tracking.get(message_id, list()):
|
||||
if tracking_value_id in tracking_tree:
|
||||
tracking_value_ids.append(tracking_tree[tracking_value_id])
|
||||
|
||||
message_dict.update({
|
||||
'author_id': author,
|
||||
@@ -721,7 +725,12 @@ class Message(models.Model):
|
||||
if 'record_name' not in values and 'default_record_name' not in self.env.context:
|
||||
values['record_name'] = self._get_record_name(values)
|
||||
|
||||
# delegate creation of tracking after the create as sudo to avoid access rights issues
|
||||
tracking_values_cmd = values.pop('tracking_value_ids', False)
|
||||
message = super(Message, self).create(values)
|
||||
if tracking_values_cmd:
|
||||
message.sudo().write({'tracking_value_ids': tracking_values_cmd})
|
||||
|
||||
message._invalidate_documents()
|
||||
|
||||
if not self.env.context.get('message_create_from_mail_mail'):
|
||||
|
||||
@@ -61,7 +61,7 @@ class Partner(models.Model):
|
||||
record_name = message.record_name
|
||||
|
||||
tracking = []
|
||||
for tracking_value in message.tracking_value_ids:
|
||||
for tracking_value in self.env['mail.tracking.value'].sudo().search([('mail_message_id', '=', message.id)]):
|
||||
tracking.append((tracking_value.field_desc,
|
||||
tracking_value.get_old_display_value()[0],
|
||||
tracking_value.get_new_display_value()[0]))
|
||||
|
||||
Reference in New Issue
Block a user