diff --git a/addons/event_sale/__manifest__.py b/addons/event_sale/__manifest__.py index 3c10cd21b4d..2b08fa36c0a 100644 --- a/addons/event_sale/__manifest__.py +++ b/addons/event_sale/__manifest__.py @@ -23,7 +23,6 @@ this event. 'views/event_ticket_views.xml', 'views/event_registration_views.xml', 'views/event_views.xml', - 'views/product_views.xml', 'views/sale_order_views.xml', 'data/event_sale_data.xml', 'data/mail_data.xml', diff --git a/addons/event_sale/data/event_sale_data.xml b/addons/event_sale/data/event_sale_data.xml index 2fedfd9b289..20efe656cb9 100644 --- a/addons/event_sale/data/event_sale_data.xml +++ b/addons/event_sale/data/event_sale_data.xml @@ -8,7 +8,6 @@ 30.0 - 10.0 @@ -16,10 +15,7 @@ order - service + event - - - diff --git a/addons/event_sale/models/event_ticket.py b/addons/event_sale/models/event_ticket.py index da142f973c9..278cd105cca 100644 --- a/addons/event_sale/models/event_ticket.py +++ b/addons/event_sale/models/event_ticket.py @@ -18,7 +18,7 @@ class EventTemplateTicket(models.Model): # product product_id = fields.Many2one( 'product.product', string='Product', required=True, - domain=[("event_ok", "=", True)], default=_default_product_id) + domain=[("detailed_type", "=", "event")], default=_default_product_id) price = fields.Float( string='Price', compute='_compute_price', digits='Product Price', readonly=False, store=True) diff --git a/addons/event_sale/models/product.py b/addons/event_sale/models/product.py index da6b544c5ea..7574c088747 100644 --- a/addons/event_sale/models/product.py +++ b/addons/event_sale/models/product.py @@ -6,29 +6,22 @@ from odoo import api, fields, models class ProductTemplate(models.Model): _inherit = 'product.template' - event_ok = fields.Boolean(string='Is an Event Ticket', help="If checked this product automatically " - "creates an event registration at the sales order confirmation.") + detailed_type = fields.Selection(selection_add=[ + ('event', 'Event Ticket'), + ], ondelete={'event': 'set default'}) - @api.onchange('event_ok') - def _onchange_event_ok(self): - if self.event_ok: - self.type = 'service' + @api.onchange('detailed_type') + def _onchange_type_event(self): + if self.detailed_type == 'event': self.invoice_policy = 'order' - def _compute_show_service_fields(self): - super()._compute_show_service_fields() - for record in self: - record.show_service_fields |= record.type == 'event' + def _detailed_type_mapping(self): + type_mapping = super()._detailed_type_mapping() + type_mapping['event'] = 'service' + return type_mapping class Product(models.Model): _inherit = 'product.product' event_ticket_ids = fields.One2many('event.event.ticket', 'product_id', string='Event Tickets') - - @api.onchange('event_ok') - def _onchange_event_ok(self): - """ Redirection, inheritance mechanism hides the method on the model """ - if self.event_ok: - self.type = 'service' - self.invoice_policy = 'order' diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index 60b84a2eaf0..7e12b878747 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -66,7 +66,12 @@ class SaleOrderLine(models.Model): event_ticket_id = fields.Many2one( 'event.event.ticket', string='Event Ticket', help="Choose an event ticket and it will automatically create a registration for this event ticket.") - event_ok = fields.Boolean(related='product_id.event_ok', readonly=True) + event_ok = fields.Boolean(compute='_compute_event_ok') + + @api.depends('product_id.detailed_type') + def _compute_event_ok(self): + for record in self: + record.event_ok = record.product_id.detailed_type == 'event' @api.depends('state', 'event_id') def _compute_product_uom_readonly(self): diff --git a/addons/event_sale/static/src/js/event_configurator_controller.js b/addons/event_sale/static/src/js/event_configurator_controller.js index 3ae81387b78..884a7067224 100644 --- a/addons/event_sale/static/src/js/event_configurator_controller.js +++ b/addons/event_sale/static/src/js/event_configurator_controller.js @@ -5,7 +5,7 @@ var FormController = require('web.FormController'); /** * This controller is overridden to allow configuring sale_order_lines through a popup - * window when a product with 'event_ok' is selected. + * window when a product with 'detailed_type' == 'event' is selected. * * This allows keeping an editable list view for sales order and remove the noise of * those 2 fields ('event_id' + 'event_ticket_id') diff --git a/addons/event_sale/static/src/js/event_configurator_widget.js b/addons/event_sale/static/src/js/event_configurator_widget.js index eff0edd3a99..7d2f130c66a 100644 --- a/addons/event_sale/static/src/js/event_configurator_widget.js +++ b/addons/event_sale/static/src/js/event_configurator_widget.js @@ -54,9 +54,9 @@ ProductConfiguratorWidget.include({ return this._rpc({ model: 'product.product', method: 'read', - args: [productId, ['event_ok']], + args: [productId, ['detailed_type']], }).then(function (result) { - if (Array.isArray(result) && result.length && result[0].event_ok) { + if (Array.isArray(result) && result.length && result[0].detailed_type === 'event') { self._openEventConfigurator({ default_product_id: productId }, diff --git a/addons/event_sale/static/tests/event_configurator.test.js b/addons/event_sale/static/tests/event_configurator.test.js index 9ed0c98c9ff..e919db12e89 100644 --- a/addons/event_sale/static/tests/event_configurator.test.js +++ b/addons/event_sale/static/tests/event_configurator.test.js @@ -27,18 +27,18 @@ odoo.define('event.configurator.tests', function (require) { 'product.product': { fields: { id: {type: 'integer'}, - event_ok: {type: 'boolean'}, + detailed_type: {type: 'selection'}, rent_ok: {type: 'boolean'}//sale_rental purposes }, records: [{ id: 1, display_name: "Customizable Event", - event_ok: true, + detailed_type: 'event', rent_ok: false//sale_rental purposes }, { id: 2, display_name: "Desk", - event_ok: false, + detailed_type: 'service', rent_ok: false//sale_rental purposes }] }, @@ -85,9 +85,9 @@ odoo.define('event.configurator.tests', function (require) { data: this.data, arch: getArch(), mockRPC: function (route, params) { - if (params.method === 'read' && params.args[1][0] === 'event_ok') { + if (params.method === 'read' && params.args[1][0] === 'detailed_type') { assert.ok(true); - return Promise.resolve([{event_ok: false}]); + return Promise.resolve([{detailed_type: 'service'}]); } return this._super.apply(this, arguments); }, @@ -114,9 +114,9 @@ odoo.define('event.configurator.tests', function (require) { data: this.data, arch: getArch(), mockRPC: function (route, params) { - if (params.method === 'read' && params.args[1][0] === 'event_ok') { + if (params.method === 'read' && params.args[1][0] === 'detailed_type') { assert.ok(true); - return Promise.resolve([{event_ok: true}]); + return Promise.resolve([{detailed_type: 'event'}]); } return this._super.apply(this, arguments); }, diff --git a/addons/event_sale/tests/common.py b/addons/event_sale/tests/common.py index bc4be1d8f20..cf75273e000 100644 --- a/addons/event_sale/tests/common.py +++ b/addons/event_sale/tests/common.py @@ -15,7 +15,6 @@ class TestEventSaleCommon(TestEventCommon, TestSalesCommon): 'name': 'Test Registration Product', 'description_sale': 'Mighty Description', 'list_price': 10, - 'event_ok': True, 'standard_price': 30.0, - 'type': 'service', + 'detailed_type': 'event', }) diff --git a/addons/event_sale/tests/test_event_sale.py b/addons/event_sale/tests/test_event_sale.py index b4d5bd9e23e..68346f72eb4 100644 --- a/addons/event_sale/tests/test_event_sale.py +++ b/addons/event_sale/tests/test_event_sale.py @@ -17,8 +17,7 @@ class TestEventSale(TestEventSaleCommon): product = cls.env['product.product'].create({ 'name': 'Event', - 'type': 'service', - 'event_ok': True, + 'detailed_type': 'event', }) cls.user_salesperson = mail_new_test_user(cls.env, login='user_salesman', groups='sales_team.group_sale_salesman') diff --git a/addons/event_sale/views/event_ticket_views.xml b/addons/event_sale/views/event_ticket_views.xml index 8f94a01f61b..da52876287c 100644 --- a/addons/event_sale/views/event_ticket_views.xml +++ b/addons/event_sale/views/event_ticket_views.xml @@ -43,7 +43,7 @@ Sales End - + @@ -57,7 +57,7 @@ - + @@ -98,4 +98,3 @@ - diff --git a/addons/event_sale/views/product_views.xml b/addons/event_sale/views/product_views.xml deleted file mode 100644 index bae39fba451..00000000000 --- a/addons/event_sale/views/product_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - product.template.event.form.inherit - product.template - - - - - - - - - - diff --git a/addons/test_event_full/tests/common.py b/addons/test_event_full/tests/common.py index c93396d8255..0f5b152364b 100644 --- a/addons/test_event_full/tests/common.py +++ b/addons/test_event_full/tests/common.py @@ -24,9 +24,8 @@ class TestEventFullCommon(TestEventCrmCommon, TestSalesCommon, EventDtPatcher, M 'name': 'Test Registration Product', 'description_sale': 'Mighty Description', 'list_price': 10, - 'event_ok': True, 'standard_price': 30.0, - 'type': 'service', + 'detailed_type': 'event', }) cls.website = cls.env['website'].search([ @@ -138,9 +137,8 @@ class TestWEventCommon(HttpCaseWithUserDemo, HttpCaseWithUserPortal, EventDtPatc 'default_code': 'EVENT_REG', 'description_sale': 'Mighty Description', 'list_price': 10, - 'event_ok': True, 'standard_price': 30.0, - 'type': 'service', + 'detailed_type': 'event', }) self.event_tag_category_1 = self.env['event.tag.category'].create({ diff --git a/addons/website_event_sale/models/product_pricelist.py b/addons/website_event_sale/models/product_pricelist.py index 5b0d4465759..b6fcbb48fdc 100644 --- a/addons/website_event_sale/models/product_pricelist.py +++ b/addons/website_event_sale/models/product_pricelist.py @@ -11,8 +11,8 @@ class PricelistItem(models.Model): msg = '' if self.applied_on == '3_global' or self.applied_on == '2_product_category': msg = _("A pricelist item with a positive min. quantity will not be applied to the event tickets products.") - elif ((self.applied_on == '1_product' and self.product_tmpl_id.event_ok) or - (self.applied_on == '0_product_variant' and self.product_id.event_ok)): + elif ((self.applied_on == '1_product' and self.product_tmpl_id.type == 'event') or + (self.applied_on == '0_product_variant' and self.product_id.type == 'event')): msg = _("A pricelist item with a positive min. quantity cannot be applied to this event tickets product.") if msg: return {'warning': diff --git a/addons/website_event_sale/models/website.py b/addons/website_event_sale/models/website.py index d1bf0a4f449..5250d6d0ed3 100644 --- a/addons/website_event_sale/models/website.py +++ b/addons/website_event_sale/models/website.py @@ -8,4 +8,4 @@ class Website(models.Model): def sale_product_domain(self): # remove product event from the website content grid and list view (not removed in detail view) - return ['&'] + super(Website, self).sale_product_domain() + [('event_ok', '=', False)] + return ['&'] + super(Website, self).sale_product_domain() + [('type', '!=', 'event')]