mirror of https://github.com/OCA/social.git
fixup! [ADD] mail_activity_form
parent
0a34864269
commit
224ac19ab6
|
@ -69,10 +69,35 @@ class MailActivity(models.Model):
|
||||||
"""
|
"""
|
||||||
Update note from template if we're told so
|
Update note from template if we're told so
|
||||||
"""
|
"""
|
||||||
# TODO: extract vals from old note field, apply to type's default
|
result = super().read(fields=fields, load=load)
|
||||||
# description and return as note content
|
|
||||||
# if type.write_date > activity.write_date
|
if (
|
||||||
return super().read(fields=fields, load=load)
|
not fields
|
||||||
|
or "note" in fields
|
||||||
|
and self.env.context.get("_mail_activity_form_update") != self
|
||||||
|
):
|
||||||
|
for this, this_values in zip(
|
||||||
|
self.with_context(_mail_activity_form_update=self), result,
|
||||||
|
):
|
||||||
|
activity_type = this.activity_type_id
|
||||||
|
if (
|
||||||
|
not activity_type.uses_forms
|
||||||
|
or this.write_date > activity_type.write_date
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
# if the type has been updated, return html from type
|
||||||
|
# but with values from current activity
|
||||||
|
fromstring = lxml_html.fromstring
|
||||||
|
template = fromstring(activity_type.default_description)
|
||||||
|
current = fromstring(this_values["note"])
|
||||||
|
this_values["note"] = str(
|
||||||
|
lxml_html.tostring(
|
||||||
|
this._mail_activity_form_update(
|
||||||
|
template, this._mail_activity_form_extract(current),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
|
||||||
def _mail_activity_form_compute(self, raise_on_error=True):
|
def _mail_activity_form_compute(self, raise_on_error=True):
|
||||||
"""
|
"""
|
||||||
|
@ -86,10 +111,10 @@ class MailActivity(models.Model):
|
||||||
vals = self._mail_activity_form_extract(doc, compute=True)
|
vals = self._mail_activity_form_extract(doc, compute=True)
|
||||||
for node in doc.xpath("//*[@%s]" % _compute):
|
for node in doc.xpath("//*[@%s]" % _compute):
|
||||||
if node.get(_id) in vals:
|
if node.get(_id) in vals:
|
||||||
node.text = vals.get(node.get(_id))
|
node.text = str(vals.get(node.get(_id)))
|
||||||
else:
|
else:
|
||||||
node.text = self._mail_activity_form_extract_value(
|
node.text = str(
|
||||||
node, vals, compute=True,
|
self._mail_activity_form_extract_value(node, vals, compute=True,)
|
||||||
)
|
)
|
||||||
self.with_context(_mail_activity_form_compute=self,).write(
|
self.with_context(_mail_activity_form_compute=self,).write(
|
||||||
{"note": lxml_html.tostring(doc)}
|
{"note": lxml_html.tostring(doc)}
|
||||||
|
@ -103,7 +128,9 @@ class MailActivity(models.Model):
|
||||||
if not self.note or not self.activity_type_id.default_description:
|
if not self.note or not self.activity_type_id.default_description:
|
||||||
return
|
return
|
||||||
template_html = lxml_html.fromstring(self.activity_type_id.default_description)
|
template_html = lxml_html.fromstring(self.activity_type_id.default_description)
|
||||||
activity_html = lxml_html.fromstring(self.note)
|
activity_html = lxml_html.fromstring(
|
||||||
|
self.with_context(_mail_activity_form_update=self).note
|
||||||
|
)
|
||||||
_id, _editable, _compute, _type = self._mail_activity_form_attributes()
|
_id, _editable, _compute, _type = self._mail_activity_form_attributes()
|
||||||
different = False
|
different = False
|
||||||
for t, a in itertools.zip_longest(template_html.iter(), activity_html.iter()):
|
for t, a in itertools.zip_longest(template_html.iter(), activity_html.iter()):
|
||||||
|
@ -116,7 +143,7 @@ class MailActivity(models.Model):
|
||||||
break
|
break
|
||||||
|
|
||||||
for attribute in t.attrib:
|
for attribute in t.attrib:
|
||||||
if t.attrib[attribute] != a.attrib[attribute]:
|
if t.attrib[attribute].strip() != a.attrib[attribute].strip():
|
||||||
different = True
|
different = True
|
||||||
|
|
||||||
if different:
|
if different:
|
||||||
|
@ -145,6 +172,18 @@ class MailActivity(models.Model):
|
||||||
"%stype" % self._mail_activity_form_prefix,
|
"%stype" % self._mail_activity_form_prefix,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _mail_activity_form_update(self, html, values):
|
||||||
|
"""
|
||||||
|
Replace the content of all nodes in html with an -id attribute with the
|
||||||
|
value from values of that name, return modified html
|
||||||
|
"""
|
||||||
|
_id, _editable, _compute, _type = self._mail_activity_form_attributes()
|
||||||
|
for node in html.xpath("//*[@%s]" % (_id)):
|
||||||
|
node.text = self._mail_activity_form_format_value(
|
||||||
|
values.get(node.attrib[_id]), node.attrib.get(_type),
|
||||||
|
)
|
||||||
|
return html
|
||||||
|
|
||||||
def _mail_activity_form_extract(self, html, compute=False):
|
def _mail_activity_form_extract(self, html, compute=False):
|
||||||
"""
|
"""
|
||||||
Parse html for nodes marked with {prefix}-editable or -compute
|
Parse html for nodes marked with {prefix}-editable or -compute
|
||||||
|
@ -190,6 +229,12 @@ class MailActivity(models.Model):
|
||||||
raise exceptions.UserError(_("Value type %s is invalid",) % value_type)
|
raise exceptions.UserError(_("Value type %s is invalid",) % value_type)
|
||||||
return _BUILTINS.get(value_type, _BUILTINS["str"])(value)
|
return _BUILTINS.get(value_type, _BUILTINS["str"])(value)
|
||||||
|
|
||||||
|
def _mail_activity_form_format_value(self, value, value_type):
|
||||||
|
"""
|
||||||
|
Format a value for representation
|
||||||
|
"""
|
||||||
|
return str(value)
|
||||||
|
|
||||||
def _mail_activity_form_eval(self, expression, values):
|
def _mail_activity_form_eval(self, expression, values):
|
||||||
"""
|
"""
|
||||||
Evaluate an expression for this activity
|
Evaluate an expression for this activity
|
||||||
|
|
|
@ -62,3 +62,22 @@ class TestMailActivityForm(TransactionCase):
|
||||||
'compute="different"',
|
'compute="different"',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_change_template(self):
|
||||||
|
"""
|
||||||
|
Test that after changing a template, we get the updated version when reading
|
||||||
|
"""
|
||||||
|
cell_template = (
|
||||||
|
'<td %(p)sid="%%s" %(p)stype="float" %(p)seditable="1">%%s</td>'
|
||||||
|
) % {"p": self.env["mail.activity"]._mail_activity_form_prefix}
|
||||||
|
activity = self._create_activity(
|
||||||
|
self.activity_type.default_description.replace(
|
||||||
|
cell_template % ("value1", ""), cell_template % ("value1", "1"),
|
||||||
|
).replace(cell_template % ("value2", ""), cell_template % ("value2", "2"),),
|
||||||
|
)
|
||||||
|
extra_node = "<div>some extra text</div>"
|
||||||
|
self.activity_type.default_description += extra_node
|
||||||
|
updated_note = activity.read(["note"])[0]["note"]
|
||||||
|
self.assertIn(extra_node, updated_note)
|
||||||
|
self.assertIn(cell_template % ("value1", "1.0"), updated_note)
|
||||||
|
self.assertIn(cell_template % ("value2", "2.0"), updated_note)
|
||||||
|
|
Loading…
Reference in New Issue