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 @@ ...@@ -47,7 +47,7 @@
) )
@api.multi @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 """Send the data to Xbus, inside one event with the specified event
type. type.
...@@ -59,6 +59,10 @@ ...@@ -59,6 +59,10 @@
:param chunking: a default chunking to use to split big items. :param chunking: a default chunking to use to split big items.
:type chunking: String. Values ("auto", "legacy", "single"). :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. :return: The new job.
:rtype: Odoo "xbus.emitter.job" record set. :rtype: Odoo "xbus.emitter.job" record set.
""" """
...@@ -69,6 +73,16 @@ ...@@ -69,6 +73,16 @@
# from various places so safer / easier right here than upstream. # from various places so safer / easier right here than upstream.
emitter_context = get_clean_context(self) 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 = ( emitter_job = (
self.env["xbus.emitter.job"] self.env["xbus.emitter.job"]
.with_context(emitter_context) .with_context(emitter_context)
...@@ -72,14 +86,7 @@ ...@@ -72,14 +86,7 @@
emitter_job = ( emitter_job = (
self.env["xbus.emitter.job"] self.env["xbus.emitter.job"]
.with_context(emitter_context) .with_context(emitter_context)
.create( .create(job_values)
{
"emitter_id": self.id,
"event_type": event_type,
"items": json.dumps(items),
"chunking": chunking,
}
)
) )
self._send_notification() self._send_notification()
...@@ -98,7 +105,7 @@ ...@@ -98,7 +105,7 @@
self.env.cr.execute( self.env.cr.execute(
"NOTIFY %s, '%s'" "NOTIFY %s, '%s'"
% ( % (
self.env["xbus.emitter.job"]._table, # channel self.env["xbus.emitter.job"]._table,
self.id, # payload self.id,
) ) # channel # payload
) )
...@@ -21,7 +21,9 @@ ...@@ -21,7 +21,9 @@
import logging import logging
from datetime import datetime, timedelta 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__) log = logging.getLogger(__name__)
...@@ -63,6 +65,18 @@ ...@@ -63,6 +65,18 @@
required=True, 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( state = fields.Selection(
selection=[ selection=[
("to_send", "To send"), ("to_send", "To send"),
...@@ -138,3 +152,31 @@ ...@@ -138,3 +152,31 @@
) )
log.info("%s, %s", len(jobs), jobs) log.info("%s, %s", len(jobs), jobs)
jobs.unlink() 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 @@ ...@@ -132,3 +132,21 @@
class_.autovacuum() class_.autovacuum()
self.assertEqual(3, len(class_.search([]))) 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 @@ ...@@ -48,7 +48,24 @@
<form> <form>
<sheet> <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 col="3">
<group> <group>
<field name="emitter_id" /> <field name="emitter_id" />
...@@ -51,6 +68,5 @@ ...@@ -51,6 +68,5 @@
<group col="3"> <group col="3">
<group> <group>
<field name="emitter_id" /> <field name="emitter_id" />
<field name="event_type" />
<field name="state" /> <field name="state" />
...@@ -56,4 +72,6 @@ ...@@ -56,4 +72,6 @@
<field name="state" /> <field name="state" />
<field name="record_model" />
<field name="record_id" />
</group> </group>
<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