Skip to content
Snippets Groups Projects
Commit 1034f5389225 authored by Houzefa Abbasbhay's avatar Houzefa Abbasbhay :slight_smile:
Browse files

Links between Xbus messages & source records

parent 4d7dff21b69b
No related branches found
No related tags found
No related merge requests found
......@@ -47,7 +47,7 @@
)
@api.multi
def send_items(self, event_type, items, chunking="legacy"):
def send_items(self, event_type, items, chunking="legacy", record=None):
"""Send the data to Xbus, inside one event with the specified event
type.
......@@ -59,6 +59,10 @@
:param chunking: a default chunking to use to split big items.
:type chunking: String. Values ("auto", "legacy", "single").
:param record: A record this message is for. Allows navigating between
records and their Xbus messages. Optional.
:type record: Odoo record set.
:return: The new job.
:rtype: Odoo "xbus.emitter.job" record set.
"""
......@@ -69,6 +73,16 @@
# from various places so safer / easier right here than upstream.
emitter_context = get_clean_context(self)
job_values = {
"emitter_id": self.id,
"event_type": event_type,
"items": json.dumps(items),
"chunking": chunking,
}
if record:
job_values.update(
{"record_id": record.id, "record_model": record._name}
)
emitter_job = (
self.env["xbus.emitter.job"]
.with_context(emitter_context)
......@@ -72,14 +86,7 @@
emitter_job = (
self.env["xbus.emitter.job"]
.with_context(emitter_context)
.create(
{
"emitter_id": self.id,
"event_type": event_type,
"items": json.dumps(items),
"chunking": chunking,
}
)
.create(job_values)
)
self._send_notification()
......@@ -98,7 +105,7 @@
self.env.cr.execute(
"NOTIFY %s, '%s'"
% (
self.env["xbus.emitter.job"]._table, # channel
self.id, # payload
)
self.env["xbus.emitter.job"]._table,
self.id,
) # channel # payload
)
......@@ -21,7 +21,9 @@
import logging
from datetime import datetime, timedelta
from odoo import api, fields, models
from odoo import api, exceptions, fields, models
from ..util.odoo_context import get_clean_context
log = logging.getLogger(__name__)
......@@ -63,6 +65,18 @@
required=True,
)
# Similar to a reference field, can point to any model. Optional.
record_id = fields.Integer(
string="Record ID",
help="The record this message is for.",
readonly=True,
)
record_model = fields.Char(
string="Record model",
help="The record this message is for.",
readonly=True,
)
state = fields.Selection(
selection=[
("to_send", "To send"),
......@@ -138,3 +152,31 @@
)
log.info("%s, %s", len(jobs), jobs)
jobs.unlink()
@api.multi
def open_source_record(self):
"""Return a view display action to open the source record defined in
record_id/_model.
:rtype: Dictionary.
"""
self.ensure_one()
record_id = self.record_id
record_model = self.record_model
if not record_id or not record_model:
raise exceptions.Warning("Source record undefined.")
record = self.env[record_model].browse(record_id)
if not record:
raise exceptions.Warning("Source record missing.")
return {
"context": get_clean_context(self),
"name": record.display_name,
"res_id": record.id,
"res_model": record._name,
"type": "ir.actions.act_window",
"view_mode": "form",
"view_type": "form",
}
......@@ -132,3 +132,21 @@
class_.autovacuum()
self.assertEqual(3, len(class_.search([])))
def test_open_source_record(self):
"""Add an Xbus message with a linked source record; ensure we can then
open it.
"""
# Some of this gets tested in test_xbus_emitter.
job = self.env.ref("xbus_emitter.default_xbus_emitter").send_items(
"test-event", {"foo": "bar"}, record=self.env.user
)
self.assertTrue(job)
self.assertEqual(job.record_id, self.env.user.id)
self.assertEqual(job.record_model, "res.users")
display_action = job.open_source_record()
self.assertTrue(display_action)
self.assertEqual(display_action["res_id"], self.env.user.id)
self.assertEqual(display_action["res_model"], "res.users")
......@@ -48,7 +48,24 @@
<form>
<sheet>
<div class="oe_left oe_title">
<h1>
<field name="event_type" />
</h1>
</div>
<div name="button_box" class="oe_right oe_button_box">
<button name="open_source_record" type="object"
class="oe_inline oe_stat_button" icon="fa-link"
attrs="{'invisible': [('record_model', '=', False)]}">
<div class="o_stat_info">
<span class="o_stat_value">1</span>
<span class="o_stat_text">Record</span>
</div>
</button>
</div>
<group col="3">
<group>
<field name="emitter_id" />
......@@ -51,6 +68,5 @@
<group col="3">
<group>
<field name="emitter_id" />
<field name="event_type" />
<field name="state" />
......@@ -56,4 +72,6 @@
<field name="state" />
<field name="record_model" />
<field name="record_id" />
</group>
<group>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment