diff --git a/event_sale_reservation/README.rst b/event_sale_reservation/README.rst index f9686f7b0..c524b559f 100644 --- a/event_sale_reservation/README.rst +++ b/event_sale_reservation/README.rst @@ -14,13 +14,13 @@ Sell event reservations :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fevent-lightgray.png?logo=github - :target: https://github.com/OCA/event/tree/13.0/event_sale_reservation + :target: https://github.com/OCA/event/tree/15.0/event_sale_reservation :alt: OCA/event .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/event-13-0/event-13-0-event_sale_reservation + :target: https://translation.odoo-community.org/projects/event-15-0/event-15-0-event_sale_reservation :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/199/13.0 + :target: https://runbot.odoo-community.org/runbot/199/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -66,9 +66,7 @@ increase it. To create an event reservation product: #. Go to *Sales > Products > Products*. -#. Create one. -#. Set its basic info (name, price...) and go to *Sales* tab. -#. Under *Events*, tick *Is an event reservation*. +#. Create one and set *Product Type* to *Event Reservation*. #. Select one *Event type for reservations*. #. Save. @@ -128,7 +126,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -168,6 +166,6 @@ Current `maintainer `__: |maintainer-Yajo| -This module is part of the `OCA/event `_ project on GitHub. +This module is part of the `OCA/event `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/event_sale_reservation/__manifest__.py b/event_sale_reservation/__manifest__.py index c1d6603c3..d9ca97f89 100644 --- a/event_sale_reservation/__manifest__.py +++ b/event_sale_reservation/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Sell event reservations", "summary": "Allow selling event registrations before the event exists", - "version": "13.0.1.0.0", + "version": "15.0.1.0.0", "development_status": "Beta", "category": "Marketing", "website": "https://github.com/OCA/event", diff --git a/event_sale_reservation/i18n/es.po b/event_sale_reservation/i18n/es.po index d8829a93f..21d887263 100644 --- a/event_sale_reservation/i18n/es.po +++ b/event_sale_reservation/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-02-05 16:33+0000\n" -"PO-Revision-Date: 2021-02-05 16:37+0000\n" +"POT-Creation-Date: 2023-02-13 10:08+0000\n" +"PO-Revision-Date: 2023-02-13 11:09+0100\n" "Last-Translator: Jairo Llopis \n" "Language-Team: \n" "Language: es_ES\n" @@ -15,10 +15,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0.1\n" #. module: event_sale_reservation -#: model:ir.actions.act_window,name:event_sale_reservation.act_event_registration_from_so +#: model:ir.model.fields,help:event_sale_reservation.field_product_product__detailed_type +#: model:ir.model.fields,help:event_sale_reservation.field_product_template__detailed_type +msgid "" +"A storable product is a product for which you manage stock. The Inventory " +"app has to be installed.\n" +"A consumable product is a product for which stock is not managed.\n" +"A service is a non-material product you provide." +msgstr "" + +#. module: event_sale_reservation +#: code:addons/event_sale_reservation/models/sale_order.py:0 +#, python-format msgid "Attendees" msgstr "Asistentes" @@ -53,11 +64,6 @@ msgstr "Editar detalles del asistente al confirmar la venta" msgid "Edit Attendee Line on Sales Confirmation" msgstr "Editar la línea del asistente al confirmar la venta" -#. module: event_sale_reservation -#: model:ir.model,name:event_sale_reservation.model_event_type -msgid "Event Category" -msgstr "Categoría de eventos" - #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order_line__event_registration_count msgid "Event Registration Count" @@ -68,6 +74,16 @@ msgstr "Cuenta de registros a eventos" msgid "Event Reservation Type" msgstr "Categoría de evento de la reserva" +#. module: event_sale_reservation +#: model:ir.model.fields.selection,name:event_sale_reservation.selection__product_template__detailed_type__event_reservation +msgid "Event Resevation" +msgstr "" + +#. module: event_sale_reservation +#: model:ir.model,name:event_sale_reservation.model_event_type +msgid "Event Template" +msgstr "Plantilla de producto" + #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order__event_registration_count #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order_line__event_registration_ids @@ -92,16 +108,6 @@ msgstr "Categoría de evento de reserva" msgid "Event type for reservations" msgstr "Categoría de evento para las reservas" -#. module: event_sale_reservation -#: model:ir.model.fields,help:event_sale_reservation.field_product_product__event_reservation_ok -#: model:ir.model.fields,help:event_sale_reservation.field_product_template__event_reservation_ok -msgid "" -"If checked, this product enables selling event reservations even before an " -"event of the specified type has been scheduled." -msgstr "" -"Si se activa, este producto permite vender reservas a eventos incluso antes " -"de que un evento de la categoría especificada se haya programado." - #. module: event_sale_reservation #: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form msgid "" @@ -132,12 +138,6 @@ msgstr "" "Indica cuántas reservas a eventos todavía no están vinculadas a ningún " "registro." -#. module: event_sale_reservation -#: model:ir.model.fields,field_description:event_sale_reservation.field_product_product__event_reservation_ok -#: model:ir.model.fields,field_description:event_sale_reservation.field_product_template__event_reservation_ok -msgid "Is an event reservation" -msgstr "Es una reserva de evento" - #. module: event_sale_reservation #: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form msgid "Next" @@ -148,20 +148,17 @@ msgstr "Siguiente" msgid "Pending event reservations" msgstr "Reservas pendientes a eventos" -#. module: event_sale_reservation -#: code:addons/event_sale_reservation/models/product_template.py:38 -#, python-format -msgid "" -"Product %(name)s cannot be both an event ticket and an event reservation." -msgstr "" -"El producto %(name)s no puede ser al mismo tiempo un ticket y una reserva de " -"eventos." - #. module: event_sale_reservation #: model:ir.model,name:event_sale_reservation.model_product_template msgid "Product Template" msgstr "Plantilla de producto" +#. module: event_sale_reservation +#: model:ir.model.fields,field_description:event_sale_reservation.field_product_product__detailed_type +#: model:ir.model.fields,field_description:event_sale_reservation.field_product_template__detailed_type +msgid "Product Type" +msgstr "Tipo de producto" + #. module: event_sale_reservation #: model:ir.actions.act_window,name:event_sale_reservation.action_registration_editor_reservations #: model_terms:ir.ui.view,arch_db:event_sale_reservation.view_sale_order_form_inherit_event @@ -169,30 +166,25 @@ msgid "Register in event" msgstr "Registrar en evento" #. module: event_sale_reservation -#: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form -msgid "Register reservations" -msgstr "Registrar reservas" - -#. module: event_sale_reservation -#: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form -msgid "Registrations" -msgstr "Registros" +#: model:ir.model.fields,field_description:event_sale_reservation.field_event_type__reserved_sale_order_line_ids +msgid "Reserved sale order lines" +msgstr "" #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_event_type__seats_reservation_total msgid "Reserved seats" msgstr "Plazas reservadas" -#. module: event_sale_reservation -#: model:ir.model,name:event_sale_reservation.model_sale_order -msgid "Sale Order" -msgstr "Pedido de venta" - #. module: event_sale_reservation #: model:ir.model,name:event_sale_reservation.model_sale_report msgid "Sales Analysis Report" msgstr "Informe de análisis de ventas" +#. module: event_sale_reservation +#: model:ir.model,name:event_sale_reservation.model_sale_order +msgid "Sales Order" +msgstr "Pedido de venta" + #. module: event_sale_reservation #: model:ir.model,name:event_sale_reservation.model_sale_order_line msgid "Sales Order Line" @@ -212,7 +204,7 @@ msgid "Type of events that can be reserved by buying this product" msgstr "Categoría de eventos que se pueden reservar al comprar este producto" #. module: event_sale_reservation -#: code:addons/event_sale_reservation/models/product_template.py:46 +#: code:addons/event_sale_reservation/models/product_template.py:0 #, python-format msgid "You must indicate event type for %(name)s." msgstr "Debe indicar la categoría de evento para %(name)s." diff --git a/event_sale_reservation/i18n/event_sale_reservation.pot b/event_sale_reservation/i18n/event_sale_reservation.pot index 9c318db3b..249dec909 100644 --- a/event_sale_reservation/i18n/event_sale_reservation.pot +++ b/event_sale_reservation/i18n/event_sale_reservation.pot @@ -4,8 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-02-13 10:08+0000\n" +"PO-Revision-Date: 2023-02-13 10:08+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -13,6 +15,15 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: event_sale_reservation +#: model:ir.model.fields,help:event_sale_reservation.field_product_product__detailed_type +#: model:ir.model.fields,help:event_sale_reservation.field_product_template__detailed_type +msgid "" +"A storable product is a product for which you manage stock. The Inventory app has to be installed.\n" +"A consumable product is a product for which stock is not managed.\n" +"A service is a non-material product you provide." +msgstr "" + #. module: event_sale_reservation #: code:addons/event_sale_reservation/models/sale_order.py:0 #, python-format @@ -49,11 +60,6 @@ msgstr "" msgid "Edit Attendee Line on Sales Confirmation" msgstr "" -#. module: event_sale_reservation -#: model:ir.model,name:event_sale_reservation.model_event_type -msgid "Event Category" -msgstr "" - #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order_line__event_registration_count msgid "Event Registration Count" @@ -64,6 +70,16 @@ msgstr "" msgid "Event Reservation Type" msgstr "" +#. module: event_sale_reservation +#: model:ir.model.fields.selection,name:event_sale_reservation.selection__product_template__detailed_type__event_reservation +msgid "Event Resevation" +msgstr "" + +#. module: event_sale_reservation +#: model:ir.model,name:event_sale_reservation.model_event_type +msgid "Event Template" +msgstr "" + #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order__event_registration_count #: model:ir.model.fields,field_description:event_sale_reservation.field_sale_order_line__event_registration_ids @@ -88,14 +104,6 @@ msgstr "" msgid "Event type for reservations" msgstr "" -#. module: event_sale_reservation -#: model:ir.model.fields,help:event_sale_reservation.field_product_product__event_reservation_ok -#: model:ir.model.fields,help:event_sale_reservation.field_product_template__event_reservation_ok -msgid "" -"If checked, this product enables selling event reservations even before an " -"event of the specified type has been scheduled." -msgstr "" - #. module: event_sale_reservation #: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form msgid "" @@ -117,12 +125,6 @@ msgid "" "registration." msgstr "" -#. module: event_sale_reservation -#: model:ir.model.fields,field_description:event_sale_reservation.field_product_product__event_reservation_ok -#: model:ir.model.fields,field_description:event_sale_reservation.field_product_template__event_reservation_ok -msgid "Is an event reservation" -msgstr "" - #. module: event_sale_reservation #: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form msgid "Next" @@ -134,15 +136,14 @@ msgid "Pending event reservations" msgstr "" #. module: event_sale_reservation -#: code:addons/event_sale_reservation/models/product_template.py:0 -#, python-format -msgid "" -"Product %(name)s cannot be both an event ticket and an event reservation." +#: model:ir.model,name:event_sale_reservation.model_product_template +msgid "Product Template" msgstr "" #. module: event_sale_reservation -#: model:ir.model,name:event_sale_reservation.model_product_template -msgid "Product Template" +#: model:ir.model.fields,field_description:event_sale_reservation.field_product_product__detailed_type +#: model:ir.model.fields,field_description:event_sale_reservation.field_product_template__detailed_type +msgid "Product Type" msgstr "" #. module: event_sale_reservation @@ -151,16 +152,6 @@ msgstr "" msgid "Register in event" msgstr "" -#. module: event_sale_reservation -#: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form -msgid "Register reservations" -msgstr "" - -#. module: event_sale_reservation -#: model_terms:ir.ui.view,arch_db:event_sale_reservation.registration_editor_reservations_view_form -msgid "Registrations" -msgstr "" - #. module: event_sale_reservation #: model:ir.model.fields,field_description:event_sale_reservation.field_event_type__reserved_sale_order_line_ids msgid "Reserved sale order lines" diff --git a/event_sale_reservation/migrations/15.0.1.0.0/post-migration.py b/event_sale_reservation/migrations/15.0.1.0.0/post-migration.py new file mode 100644 index 000000000..50074b310 --- /dev/null +++ b/event_sale_reservation/migrations/15.0.1.0.0/post-migration.py @@ -0,0 +1,12 @@ +# Copyright 2023 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.logged_query( + env.cr, + """UPDATE product_product SET detailed_type = 'event_reservation' + WHERE event_reservation_ok IS TRUE""", + ) diff --git a/event_sale_reservation/models/event_type.py b/event_sale_reservation/models/event_type.py index 7a3aff973..75908bd5d 100644 --- a/event_sale_reservation/models/event_type.py +++ b/event_sale_reservation/models/event_type.py @@ -24,14 +24,14 @@ def _seats_reservation_domain(self): return [ ("event_reservation_type_id", "in", self.ids), ("order_id.state", "in", ("sale", "done")), - ("product_id.event_reservation_ok", "=", True), + ("product_id.detailed_type", "=", "event_reservation"), ] @api.depends( "reserved_sale_order_line_ids.event_registration_count", "reserved_sale_order_line_ids.event_reservation_type_id", "reserved_sale_order_line_ids.order_id.state", - "reserved_sale_order_line_ids.product_id.event_reservation_ok", + "reserved_sale_order_line_ids.product_id.detailed_type", "reserved_sale_order_line_ids.product_uom_qty", ) def _compute_reservations_total(self): @@ -53,6 +53,6 @@ def action_open_sale_orders(self): sol = self.env["sale.order.line"].search( self._seats_reservation_domain(), ) - result = self.env["ir.actions.act_window"].for_xml_id("sale", "action_orders") + result = self.env["ir.actions.act_window"]._for_xml_id("sale.action_orders") result["domain"] = [("order_line", "in", sol.ids)] return result diff --git a/event_sale_reservation/models/product_template.py b/event_sale_reservation/models/product_template.py index 46e497d00..11abede4e 100644 --- a/event_sale_reservation/models/product_template.py +++ b/event_sale_reservation/models/product_template.py @@ -1,21 +1,20 @@ # Copyright 2021 Tecnativa - Jairo Llopis +# Copyright 2023 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models -from ..exceptions import ReservationWithoutEventTypeError, TicketAndReservationError +from ..exceptions import ReservationWithoutEventTypeError -class Product(models.Model): +class ProductTemplate(models.Model): _inherit = "product.template" - event_reservation_ok = fields.Boolean( - index=True, - string="Is an event reservation", - help=( - "If checked, this product enables selling event reservations " - "even before an event of the specified type has been scheduled." - ), + detailed_type = fields.Selection( + selection_add=[ + ("event_reservation", "Event Resevation"), + ], + ondelete={"event_reservation": "set service"}, ) event_reservation_type_id = fields.Many2one( comodel_name="event.type", @@ -24,7 +23,12 @@ class Product(models.Model): help="Type of events that can be reserved by buying this product", ) - @api.constrains("event_ok", "event_reservation_ok") + def _detailed_type_mapping(self): + type_mapping = super()._detailed_type_mapping() + type_mapping["event_reservation"] = "service" + return type_mapping + + @api.constrains("detailed_type") def _check_event_reservation(self): """Event reservation products checks. @@ -32,16 +36,8 @@ def _check_event_reservation(self): - An event reservation must have an event type attached. """ for one in self: - if not one.event_reservation_ok: + if one.detailed_type != "event_reservation": continue - if one.event_ok: - raise TicketAndReservationError( - _( - "Product %(name)s cannot be both an event ticket and " - "an event reservation." - ) - % {"name": one.display_name} - ) if not one.event_reservation_type_id: raise ReservationWithoutEventTypeError( _("You must indicate event type for %(name)s.") diff --git a/event_sale_reservation/models/sale_order.py b/event_sale_reservation/models/sale_order.py index 4e92b4e30..2dd4263c6 100644 --- a/event_sale_reservation/models/sale_order.py +++ b/event_sale_reservation/models/sale_order.py @@ -26,7 +26,7 @@ def _compute_event_reservations_pending(self): """Know how many pending event reservations are linked to this SO.""" for one in self: reservation_lines = one.order_line.filtered( - "product_id.event_reservation_ok" + lambda x: x.product_id.detailed_type == "event_reservation" ) reserved = sum(reservation_lines.mapped("product_uom_qty")) registered = sum(reservation_lines.mapped("event_registration_count")) diff --git a/event_sale_reservation/readme/USAGE.rst b/event_sale_reservation/readme/USAGE.rst index 34a87759b..42ab56bd0 100644 --- a/event_sale_reservation/readme/USAGE.rst +++ b/event_sale_reservation/readme/USAGE.rst @@ -10,9 +10,7 @@ increase it. To create an event reservation product: #. Go to *Sales > Products > Products*. -#. Create one. -#. Set its basic info (name, price...) and go to *Sales* tab. -#. Under *Events*, tick *Is an event reservation*. +#. Create one and set *Product Type* to *Event Reservation*. #. Select one *Event type for reservations*. #. Save. diff --git a/event_sale_reservation/static/description/index.html b/event_sale_reservation/static/description/index.html index 0040c60d2..cc18a2bc5 100644 --- a/event_sale_reservation/static/description/index.html +++ b/event_sale_reservation/static/description/index.html @@ -3,7 +3,7 @@ - + Sell event reservations