odoo-addon-mail-gateway 16.0.1.0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of odoo-addon-mail-gateway might be problematic. Click here for more details.

Files changed (73) hide show
  1. odoo/addons/mail_gateway/README.rst +100 -0
  2. odoo/addons/mail_gateway/__init__.py +6 -0
  3. odoo/addons/mail_gateway/__manifest__.py +38 -0
  4. odoo/addons/mail_gateway/controllers/__init__.py +2 -0
  5. odoo/addons/mail_gateway/controllers/discuss.py +11 -0
  6. odoo/addons/mail_gateway/controllers/gateway.py +81 -0
  7. odoo/addons/mail_gateway/hooks.py +12 -0
  8. odoo/addons/mail_gateway/i18n/mail_gateway.pot +533 -0
  9. odoo/addons/mail_gateway/models/__init__.py +10 -0
  10. odoo/addons/mail_gateway/models/ir_websocket.py +21 -0
  11. odoo/addons/mail_gateway/models/mail_channel.py +79 -0
  12. odoo/addons/mail_gateway/models/mail_gateway.py +149 -0
  13. odoo/addons/mail_gateway/models/mail_gateway_abstract.py +82 -0
  14. odoo/addons/mail_gateway/models/mail_guest.py +18 -0
  15. odoo/addons/mail_gateway/models/mail_message.py +123 -0
  16. odoo/addons/mail_gateway/models/mail_notification.py +43 -0
  17. odoo/addons/mail_gateway/models/mail_thread.py +85 -0
  18. odoo/addons/mail_gateway/models/res_partner.py +89 -0
  19. odoo/addons/mail_gateway/models/res_users.py +16 -0
  20. odoo/addons/mail_gateway/readme/CONFIGURATION.rst +4 -0
  21. odoo/addons/mail_gateway/readme/CONTRIBUTORS.rst +2 -0
  22. odoo/addons/mail_gateway/readme/CREDITS.rst +1 -0
  23. odoo/addons/mail_gateway/readme/DESCRIPTION.rst +5 -0
  24. odoo/addons/mail_gateway/readme/USAGE.rst +9 -0
  25. odoo/addons/mail_gateway/security/ir.model.access.csv +9 -0
  26. odoo/addons/mail_gateway/security/security.xml +61 -0
  27. odoo/addons/mail_gateway/static/description/icon.png +0 -0
  28. odoo/addons/mail_gateway/static/description/index.html +441 -0
  29. odoo/addons/mail_gateway/static/src/components/chatter/chatter.xml +40 -0
  30. odoo/addons/mail_gateway/static/src/components/composer/composer.xml +24 -0
  31. odoo/addons/mail_gateway/static/src/components/discuss_sidebar/discuss_sidebar.xml +17 -0
  32. odoo/addons/mail_gateway/static/src/components/gateway_follower/gateway_follower.esm.js +31 -0
  33. odoo/addons/mail_gateway/static/src/components/gateway_follower/gateway_follower.scss +12 -0
  34. odoo/addons/mail_gateway/static/src/components/gateway_follower/gateway_follower.xml +30 -0
  35. odoo/addons/mail_gateway/static/src/components/message/message.xml +22 -0
  36. odoo/addons/mail_gateway/static/src/components/message_notification_popover_content/message_notification_popover_content.xml +15 -0
  37. odoo/addons/mail_gateway/static/src/models/channel.esm.js +33 -0
  38. odoo/addons/mail_gateway/static/src/models/channel_member_view.esm.js +39 -0
  39. odoo/addons/mail_gateway/static/src/models/chatter.esm.js +41 -0
  40. odoo/addons/mail_gateway/static/src/models/composer.esm.js +32 -0
  41. odoo/addons/mail_gateway/static/src/models/composer_gateway_follower.esm.js +32 -0
  42. odoo/addons/mail_gateway/static/src/models/composer_view.esm.js +56 -0
  43. odoo/addons/mail_gateway/static/src/models/discuss.esm.js +51 -0
  44. odoo/addons/mail_gateway/static/src/models/discuss_sidebar_category.esm.js +128 -0
  45. odoo/addons/mail_gateway/static/src/models/discuss_sidebar_category_item.esm.js +51 -0
  46. odoo/addons/mail_gateway/static/src/models/gateway.esm.js +16 -0
  47. odoo/addons/mail_gateway/static/src/models/gateway_channel.esm.js +14 -0
  48. odoo/addons/mail_gateway/static/src/models/gateway_channel_view.esm.js +15 -0
  49. odoo/addons/mail_gateway/static/src/models/guest.esm.js +10 -0
  50. odoo/addons/mail_gateway/static/src/models/message.esm.js +76 -0
  51. odoo/addons/mail_gateway/static/src/models/message_action.esm.js +45 -0
  52. odoo/addons/mail_gateway/static/src/models/message_action_list.esm.js +37 -0
  53. odoo/addons/mail_gateway/static/src/models/message_action_view.esm.js +91 -0
  54. odoo/addons/mail_gateway/static/src/models/message_view.esm.js +13 -0
  55. odoo/addons/mail_gateway/static/src/models/messaging_initializer.esm.js +24 -0
  56. odoo/addons/mail_gateway/static/src/models/notification.esm.js +20 -0
  57. odoo/addons/mail_gateway/static/src/models/partner.esm.js +11 -0
  58. odoo/addons/mail_gateway/static/src/models/thread.esm.js +77 -0
  59. odoo/addons/mail_gateway/tests/__init__.py +0 -0
  60. odoo/addons/mail_gateway/tests/common.py +21 -0
  61. odoo/addons/mail_gateway/views/mail_gateway.xml +93 -0
  62. odoo/addons/mail_gateway/views/res_partner_gateway_channel.xml +59 -0
  63. odoo/addons/mail_gateway/wizards/__init__.py +3 -0
  64. odoo/addons/mail_gateway/wizards/mail_guest_manage.py +58 -0
  65. odoo/addons/mail_gateway/wizards/mail_guest_manage.xml +37 -0
  66. odoo/addons/mail_gateway/wizards/mail_message_gateway_link.py +42 -0
  67. odoo/addons/mail_gateway/wizards/mail_message_gateway_link.xml +28 -0
  68. odoo/addons/mail_gateway/wizards/mail_message_gateway_send.py +20 -0
  69. odoo/addons/mail_gateway/wizards/mail_message_gateway_send.xml +39 -0
  70. odoo_addon_mail_gateway-16.0.1.0.0.2.dist-info/METADATA +118 -0
  71. odoo_addon_mail_gateway-16.0.1.0.0.2.dist-info/RECORD +73 -0
  72. odoo_addon_mail_gateway-16.0.1.0.0.2.dist-info/WHEEL +5 -0
  73. odoo_addon_mail_gateway-16.0.1.0.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,45 @@
1
+ /** @odoo-module **/
2
+ import {one} from "@mail/model/model_field";
3
+ import {registerPatch} from "@mail/model/model_core";
4
+
5
+ registerPatch({
6
+ name: "MessageAction",
7
+ fields: {
8
+ messageActionListOwnerAsSendGateway: one("MessageActionList", {
9
+ identifying: true,
10
+ inverse: "actionSendGateway",
11
+ }),
12
+ messageActionListOwnerAsAddToThread: one("MessageActionList", {
13
+ identifying: true,
14
+ inverse: "actionAddToThread",
15
+ }),
16
+ sequence: {
17
+ compute() {
18
+ if (
19
+ this.messageActionListOwner ===
20
+ this.messageActionListOwnerAsSendGateway
21
+ ) {
22
+ return 7;
23
+ }
24
+ if (
25
+ this.messageActionListOwner ===
26
+ this.messageActionListOwnerAsAddToThread
27
+ ) {
28
+ return 8;
29
+ }
30
+ return this._super();
31
+ },
32
+ },
33
+ messageActionListOwner: {
34
+ compute() {
35
+ if (this.messageActionListOwnerAsSendGateway) {
36
+ return this.messageActionListOwnerAsSendGateway;
37
+ }
38
+ if (this.messageActionListOwnerAsAddToThread) {
39
+ return this.messageActionListOwnerAsAddToThread;
40
+ }
41
+ return this._super();
42
+ },
43
+ },
44
+ },
45
+ });
@@ -0,0 +1,37 @@
1
+ /** @odoo-module **/
2
+ import {clear} from "@mail/model/model_field_command";
3
+ import {one} from "@mail/model/model_field";
4
+ import {registerPatch} from "@mail/model/model_core";
5
+
6
+ registerPatch({
7
+ name: "MessageActionList",
8
+ fields: {
9
+ actionSendGateway: one("MessageAction", {
10
+ compute() {
11
+ if (
12
+ this.message &&
13
+ this.message.gateway_channel_data &&
14
+ this.message.gateway_channel_data.partners &&
15
+ Object.keys(this.message.gateway_channel_data.partners).length
16
+ ) {
17
+ return {};
18
+ }
19
+ return clear();
20
+ },
21
+ inverse: "messageActionListOwnerAsSendGateway",
22
+ }),
23
+ actionAddToThread: one("MessageAction", {
24
+ compute() {
25
+ if (
26
+ this.message.gateway_type &&
27
+ !this.message.gatewayThread &&
28
+ this.message.originThread.model === "mail.channel"
29
+ ) {
30
+ return {};
31
+ }
32
+ return clear();
33
+ },
34
+ inverse: "messageActionListOwnerAsAddToThread",
35
+ }),
36
+ },
37
+ });
@@ -0,0 +1,91 @@
1
+ /** @odoo-module **/
2
+ import {registerPatch} from "@mail/model/model_core";
3
+
4
+ registerPatch({
5
+ name: "MessageActionView",
6
+ recordMethods: {
7
+ onClick(ev) {
8
+ if (
9
+ this.messageAction.messageActionListOwner ===
10
+ this.messageAction.messageActionListOwnerAsSendGateway
11
+ ) {
12
+ ev.stopPropagation();
13
+ this.env.services.action.doAction({
14
+ name: this.env._t("Send with gateway"),
15
+ type: "ir.actions.act_window",
16
+ res_model: "mail.message.gateway.send",
17
+ context: {
18
+ ...this.messageAction.messageActionListOwner.message
19
+ .gateway_channel_data,
20
+ default_message_id:
21
+ this.messageAction.messageActionListOwner.message.id,
22
+ },
23
+ views: [[false, "form"]],
24
+ target: "new",
25
+ });
26
+ return;
27
+ }
28
+ if (
29
+ this.messageAction.messageActionListOwner ===
30
+ this.messageAction.messageActionListOwnerAsAddToThread
31
+ ) {
32
+ ev.stopPropagation();
33
+ this.env.services.action.doAction({
34
+ name: this.env._t("Link Message to thread"),
35
+ type: "ir.actions.act_window",
36
+ res_model: "mail.message.gateway.link",
37
+ context: {
38
+ default_message_id:
39
+ this.messageAction.messageActionListOwner.message.id,
40
+ },
41
+ views: [[false, "form"]],
42
+ target: "new",
43
+ });
44
+ return;
45
+ }
46
+ return this._super(...arguments);
47
+ },
48
+ },
49
+ fields: {
50
+ title: {
51
+ compute() {
52
+ if (
53
+ this.messageAction.messageActionListOwner ===
54
+ this.messageAction.messageActionListOwnerAsSendGateway
55
+ ) {
56
+ return this.env._t("Send with gateway");
57
+ }
58
+ if (
59
+ this.messageAction.messageActionListOwner ===
60
+ this.messageAction.messageActionListOwnerAsAddToThread
61
+ ) {
62
+ return this.env._t("Link to thread");
63
+ }
64
+ return this._super();
65
+ },
66
+ },
67
+ classNames: {
68
+ compute() {
69
+ if (
70
+ this.messageAction.messageActionListOwner ===
71
+ this.messageAction.messageActionListOwnerAsSendGateway
72
+ ) {
73
+ return (
74
+ this.paddingClassNames +
75
+ " fa fa-lg fa-share-square-o o_MessageActionView_actionSendGateway"
76
+ );
77
+ }
78
+ if (
79
+ this.messageAction.messageActionListOwner ===
80
+ this.messageAction.messageActionListOwnerAsAddToThread
81
+ ) {
82
+ return (
83
+ this.paddingClassNames +
84
+ " fa fa-lg fa-link o_MessageActionView_actionAddToThread"
85
+ );
86
+ }
87
+ return this._super();
88
+ },
89
+ },
90
+ },
91
+ });
@@ -0,0 +1,13 @@
1
+ /** @odoo-module **/
2
+
3
+ import {registerPatch} from "@mail/model/model_core";
4
+
5
+ registerPatch({
6
+ name: "MessageView",
7
+ recordMethods: {
8
+ onClickGatewayThread(ev) {
9
+ ev.preventDefault();
10
+ this.message.gatewayThread.open();
11
+ },
12
+ },
13
+ });
@@ -0,0 +1,24 @@
1
+ /** @odoo-module **/
2
+
3
+ import {registerPatch} from "@mail/model/model_core";
4
+
5
+ registerPatch({
6
+ name: "MessagingInitializer",
7
+ recordMethods: {
8
+ async _init({gateways}) {
9
+ const discuss = this.messaging.discuss;
10
+ if (gateways) {
11
+ this.messaging.executeGracefully(
12
+ gateways.map((gatewayData) => () => {
13
+ this.messaging.models.DiscussSidebarCategory.insert({
14
+ discussAsGateways: discuss,
15
+ gateway: gatewayData,
16
+ gateway_id: gatewayData.id,
17
+ });
18
+ })
19
+ );
20
+ }
21
+ this._super(...arguments);
22
+ },
23
+ },
24
+ });
@@ -0,0 +1,20 @@
1
+ /** @odoo-module **/
2
+
3
+ import {attr} from "@mail/model/model_field";
4
+ import {registerPatch} from "@mail/model/model_core";
5
+
6
+ registerPatch({
7
+ name: "Notification",
8
+ modelMethods: {
9
+ convertData(data) {
10
+ var data2 = this._super(data);
11
+ data2.gateway_type = data.gateway_type;
12
+ data2.channel_name = data.channel_name;
13
+ return data2;
14
+ },
15
+ },
16
+ fields: {
17
+ channel_name: attr(),
18
+ gateway_type: attr(),
19
+ },
20
+ });
@@ -0,0 +1,11 @@
1
+ /** @odoo-module **/
2
+
3
+ import {many} from "@mail/model/model_field";
4
+ import {registerPatch} from "@mail/model/model_core";
5
+
6
+ registerPatch({
7
+ name: "Partner",
8
+ fields: {
9
+ gateway_channels: many("GatewayChannel", {inverse: "partner"}),
10
+ },
11
+ });
@@ -0,0 +1,77 @@
1
+ /** @odoo-module **/
2
+
3
+ import {many, one} from "@mail/model/model_field";
4
+ import {registerPatch} from "@mail/model/model_core";
5
+
6
+ registerPatch({
7
+ name: "Thread",
8
+ fields: {
9
+ gateway: one("Gateway"),
10
+ messagesAsGatewayThread: many("Message", {
11
+ inverse: "gatewayThread",
12
+ isCausal: true,
13
+ }),
14
+ hasInviteFeature: {
15
+ compute() {
16
+ if (this.channel && this.channel.channel_type === "gateway") {
17
+ return true;
18
+ }
19
+ return this._super();
20
+ },
21
+ },
22
+ hasMemberListFeature: {
23
+ compute() {
24
+ if (this.channel && this.channel.channel_type === "gateway") {
25
+ return true;
26
+ }
27
+ return this._super();
28
+ },
29
+ },
30
+ isChatChannel: {
31
+ compute() {
32
+ if (this.channel && this.channel.channel_type === "gateway") {
33
+ return true;
34
+ }
35
+ return this._super();
36
+ },
37
+ },
38
+ },
39
+ modelMethods: {
40
+ convertData(data) {
41
+ var data2 = this._super(data);
42
+ if (data.gateway_id) {
43
+ data2.gateway = {id: data.gateway_id};
44
+ }
45
+ return data2;
46
+ },
47
+ async searchGatewaysToOpen({limit, searchTerm, gateway_id}) {
48
+ const domain = [
49
+ ["channel_type", "=", "gateway"],
50
+ ["name", "ilike", searchTerm],
51
+ ["gateway_id", "=", gateway_id],
52
+ ];
53
+ const fields = ["channel_type", "name"];
54
+ const channelsData = await this.messaging.rpc({
55
+ model: "mail.channel",
56
+ method: "search_read",
57
+ kwargs: {
58
+ domain,
59
+ fields,
60
+ limit,
61
+ },
62
+ });
63
+ return this.insert(
64
+ channelsData.map((channelData) =>
65
+ this.messaging.models.Thread.convertData({
66
+ channel: {
67
+ channel_type: channelData.channel_type,
68
+ id: channelData.id,
69
+ },
70
+ id: channelData.id,
71
+ name: channelData.name,
72
+ })
73
+ )
74
+ );
75
+ },
76
+ },
77
+ });
File without changes
@@ -0,0 +1,21 @@
1
+ # Copyright 2024 Dixmit
2
+ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
+
4
+ from odoo.tests.common import HttpCase
5
+
6
+
7
+ class MailGatewayTestCase(HttpCase):
8
+ @classmethod
9
+ def setUpClass(cls):
10
+ super().setUpClass()
11
+ cls._setup_env()
12
+
13
+ @classmethod
14
+ def _setup_context(cls):
15
+ return dict(
16
+ cls.env.context, tracking_disable=True, test_queue_job_no_delay=True
17
+ )
18
+
19
+ @classmethod
20
+ def _setup_env(cls):
21
+ cls.env = cls.env(context=cls._setup_context())
@@ -0,0 +1,93 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!-- Copyright 2024 Dixmit
3
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
4
+ <odoo>
5
+ <record model="ir.ui.view" id="mail_gateway_form_view">
6
+ <field name="name">mail.gateway.form</field>
7
+ <field name="model">mail.gateway</field>
8
+ <field name="arch" type="xml">
9
+ <form>
10
+ <header />
11
+ <sheet>
12
+ <div class="oe_button_box" name="button_box">
13
+ <button
14
+ type="object"
15
+ string="Integrate Webhook"
16
+ icon="fa-plug"
17
+ name="set_webhook"
18
+ attrs="{'invisible': ['|', ('can_set_webhook', '=', False), ('integrated_webhook_state', '!=', False)]}"
19
+ />
20
+ <button
21
+ type="object"
22
+ string="Update Webhook"
23
+ name="update_webhook"
24
+ icon="fa-refresh"
25
+ attrs="{'invisible': ['|', ('can_set_webhook', '=', False), ('integrated_webhook_state', '!=', 'integrated')]}"
26
+ />
27
+ <button
28
+ type="object"
29
+ string="Remove Webhook"
30
+ name="remove_webhook"
31
+ icon="fa-remove"
32
+ attrs="{'invisible': [('integrated_webhook_state', '=', False)]}"
33
+ />
34
+ </div>
35
+ <field name="can_set_webhook" invisible="1" />
36
+ <group>
37
+ <field name="name" />
38
+ <field name="token" password="True" />
39
+ <field name="gateway_type" />
40
+ <field name="integrated_webhook_state" />
41
+ <field name="webhook_url" groups="base.group_no_one" />
42
+ <field name="webhook_key" />
43
+ <field name="webhook_secret" password="True" />
44
+ <field name="webhook_user_id" />
45
+ <field name="has_new_channel_security" />
46
+ <field
47
+ name="company_id"
48
+ options="{'no_create': True}"
49
+ groups="base.group_multi_company"
50
+ />
51
+ </group>
52
+ <notebook>
53
+ <page name="member" string="Members">
54
+ <field name="member_ids" />
55
+ </page>
56
+ </notebook>
57
+ </sheet>
58
+ </form>
59
+ </field>
60
+ </record>
61
+ <record model="ir.ui.view" id="mail_gateway_search_view">
62
+ <field name="name">mail.gateway.search</field>
63
+ <field name="model">mail.gateway</field>
64
+ <field name="arch" type="xml">
65
+ <search>
66
+ <field name="name" />
67
+ </search>
68
+ </field>
69
+ </record>
70
+ <record model="ir.ui.view" id="mail_gateway_tree_view">
71
+ <field name="name">mail.gateway.tree</field>
72
+ <field name="model">mail.gateway</field>
73
+ <field name="arch" type="xml">
74
+ <tree>
75
+ <field name="name" />
76
+ <field name="token" />
77
+ </tree>
78
+ </field>
79
+ </record>
80
+ <record model="ir.actions.act_window" id="mail_gateway_act_window">
81
+ <field name="name">Gateway</field>
82
+ <field name="res_model">mail.gateway</field>
83
+ <field name="view_mode">tree,form</field>
84
+ <field name="domain">[]</field>
85
+ <field name="context">{}</field>
86
+ </record>
87
+ <record model="ir.ui.menu" id="mail_gateway_menu">
88
+ <field name="name">Gateway</field>
89
+ <field name="parent_id" ref="base.menu_email" />
90
+ <field name="action" ref="mail_gateway_act_window" />
91
+ <field name="sequence" eval="16" />
92
+ </record>
93
+ </odoo>
@@ -0,0 +1,59 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!-- Copyright 2024 Dixmit
3
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
4
+ <odoo>
5
+
6
+ <record model="ir.ui.view" id="view_res_partner_gateway_channel_form">
7
+ <field name="name">Partner Gateway Channel Form</field>
8
+ <field name="model">res.partner.gateway.channel</field>
9
+ <field name="arch" type="xml">
10
+ <form>
11
+ <sheet>
12
+ <group>
13
+ <field name="partner_id" />
14
+ <field name="gateway_id" />
15
+ <field name="gateway_token" />
16
+ </group>
17
+ </sheet>
18
+ </form>
19
+ </field>
20
+ </record>
21
+
22
+ <record model="ir.ui.view" id="view_res_partner_gateway_channel_tree">
23
+ <field name="name">Partner Gateway Channel Tree</field>
24
+ <field name="model">res.partner.gateway.channel</field>
25
+ <field name="arch" type="xml">
26
+ <tree>
27
+ <field name="partner_id" />
28
+ <field name="gateway_id" />
29
+ <field name="gateway_token" />
30
+ </tree>
31
+ </field>
32
+ </record>
33
+
34
+ <record model="ir.ui.view" id="view_res_partner_gateway_channel_search">
35
+ <field name="name">Partner Gateway Channel Tree</field>
36
+ <field name="model">res.partner.gateway.channel</field>
37
+ <field name="arch" type="xml">
38
+ <search>
39
+ <field name="partner_id" />
40
+ <field name="gateway_id" />
41
+ <field name="gateway_token" />
42
+ </search>
43
+ </field>
44
+ </record>
45
+
46
+ <record model="ir.actions.act_window" id="res_partner_gateway_channel_act_window">
47
+ <field name="name">Gateway Partner Channels</field>
48
+ <field name="res_model">res.partner.gateway.channel</field>
49
+ <field name="view_mode">tree,form</field>
50
+ <field name="domain">[]</field>
51
+ <field name="context">{}</field>
52
+ </record>
53
+ <record model="ir.ui.menu" id="res_partner_gateway_channel_menu">
54
+ <field name="name">Gateway Partner Channels</field>
55
+ <field name="parent_id" ref="base.menu_email" />
56
+ <field name="action" ref="res_partner_gateway_channel_act_window" />
57
+ <field name="sequence" eval="16" />
58
+ </record>
59
+ </odoo>
@@ -0,0 +1,3 @@
1
+ from . import mail_guest_manage
2
+ from . import mail_message_gateway_send
3
+ from . import mail_message_gateway_link
@@ -0,0 +1,58 @@
1
+ # Copyright 2024 Dixmit
2
+ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
+
4
+ from odoo import fields, models
5
+
6
+
7
+ class MailGuestManage(models.TransientModel):
8
+
9
+ _name = "mail.guest.manage"
10
+ _description = "Assign gateway guest to a partner"
11
+
12
+ guest_id = fields.Many2one("mail.guest", required=True)
13
+ partner_id = fields.Many2one("res.partner")
14
+
15
+ def create_partner(self):
16
+ partner = self.env["res.partner"].create(self._get_partner_vals())
17
+ self._merge_partner(partner)
18
+ return partner.get_formview_action()
19
+
20
+ def _get_partner_vals(self):
21
+ return {
22
+ "name": self.guest_id.name,
23
+ }
24
+
25
+ def _merge_partner(self, partner):
26
+ self.env["res.partner.gateway.channel"].create(
27
+ {
28
+ "name": self.guest_id.gateway_id.name,
29
+ "partner_id": partner.id,
30
+ "gateway_id": self.guest_id.gateway_id.id,
31
+ "gateway_token": self.guest_id.gateway_token,
32
+ }
33
+ )
34
+ for member in self.env["mail.channel.member"].search(
35
+ [("guest_id", "=", self.guest_id.id)]
36
+ ):
37
+ self.env["mail.channel.member"].create(
38
+ self._channel_member_vals(member, partner)
39
+ )
40
+ member.unlink()
41
+ self.env["mail.message"].search(
42
+ [("author_guest_id", "=", self.guest_id.id)]
43
+ ).write(
44
+ {
45
+ "author_id": partner.id,
46
+ }
47
+ )
48
+
49
+ def _channel_member_vals(self, member, partner):
50
+ return {
51
+ "guest_id": False,
52
+ "channel_id": member.channel_id.id,
53
+ "partner_id": partner.id,
54
+ }
55
+
56
+ def merge_partner(self):
57
+ self._merge_partner(self.partner_id)
58
+ return self.partner_id.get_formview_action()
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!-- Copyright 2024 Dixmit
3
+ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
4
+ <odoo>
5
+
6
+ <record model="ir.ui.view" id="mail_guest_manage_form_view">
7
+ <field name="model">mail.guest.manage</field>
8
+ <field name="arch" type="xml">
9
+ <form>
10
+ <group>
11
+ <field name="guest_id" force_save="1" readonly="1" />
12
+ <field name="partner_id" />
13
+ </group>
14
+ <footer>
15
+ <button
16
+ name="create_partner"
17
+ string="Create new partner"
18
+ class="btn-primary"
19
+ type="object"
20
+ attrs="{'invisible': [('partner_id', '!=', False)]}"
21
+ />
22
+ <button
23
+ name="merge_partner"
24
+ string="Merge"
25
+ class="btn-primary"
26
+ attrs="{'invisible': [('partner_id', '=', False)]}"
27
+ type="object"
28
+ />
29
+ <button string="Cancel" class="btn-default" special="cancel" />
30
+ </footer>
31
+ </form>
32
+ </field>
33
+ </record>
34
+
35
+
36
+
37
+ </odoo>
@@ -0,0 +1,42 @@
1
+ # Copyright 2024 Dixmit
2
+ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
+
4
+ from odoo import api, fields, models
5
+
6
+
7
+ class MailMessageGatewayLink(models.TransientModel):
8
+
9
+ _name = "mail.message.gateway.link"
10
+ _description = "Link message from gateway"
11
+
12
+ message_id = fields.Many2one("mail.message")
13
+ resource_ref = fields.Reference(
14
+ string="Record reference", selection="_selection_target_model"
15
+ )
16
+
17
+ @api.model
18
+ def _selection_target_model(self):
19
+ models = self.env["ir.model"].search([("is_mail_thread", "=", True)])
20
+ return [(model.model, model.name) for model in models]
21
+
22
+ def link_message(self):
23
+ new_message = self.resource_ref.message_post(
24
+ body=self.message_id.body,
25
+ author_id=self.message_id.author_id.id,
26
+ gateway_type=self.message_id.gateway_type,
27
+ date=self.message_id.date,
28
+ # message_id=update.message.message_id,
29
+ subtype_xmlid="mail.mt_comment",
30
+ message_type="comment",
31
+ attachment_ids=self.message_id.attachment_ids.ids,
32
+ gateway_notifications=[], # Avoid sending notifications
33
+ )
34
+ self.message_id.gateway_message_id = new_message
35
+ self.env["bus.bus"]._sendone(
36
+ self.env.user.partner_id,
37
+ "mail.message/insert",
38
+ {
39
+ "id": self.message_id.id,
40
+ "gateway_thread_data": self.message_id.sudo().gateway_thread_data,
41
+ },
42
+ )