diff --git a/__manifest__.py b/__manifest__.py index 2e8e924009b061ddad964278021d2b4364b199ed..9fbf30e262998cce9a5adb2ac7aace067a791d2f 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -8,6 +8,7 @@ "depends": [ "partner_event", "website_event_private", + "website_event_questions", "website_event_require_login", ], "data": [ @@ -15,6 +16,8 @@ "data/mail_template_data.xml", # views "views/event_event.xml", + "views/event_question.xml", + "views/event_registration_template.xml", # views menu # wizard ], diff --git a/i18n/fr.po b/i18n/fr.po index ee5d20f4d9f8ea0d186e09a1a7d7e4833a761cf3..b583f89b7644e80feab1e6686e1f5de044bf986f 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -2288,3 +2288,8 @@ msgstr "" "{{ object.event_id.name }}: {{\n" " object.get_date_range_str() }}\n" " " + +#. module: website_event +#: model_terms:ir.ui.view,arch_db:website_event.registration_attendee_details +msgid "Name *" +msgstr "Prénom et Nom *" diff --git a/i18n_extra/fr.po b/i18n_extra/fr.po new file mode 100644 index 0000000000000000000000000000000000000000..9aa9872da01aa50835c83018dd245e6877a5fb08 --- /dev/null +++ b/i18n_extra/fr.po @@ -0,0 +1,20 @@ +# Translation of Odoo Server. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-24 12:20+0000\n" +"PO-Revision-Date: 2024-07-24 14:44+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: website_event +#: model_terms:ir.ui.view,arch_db:website_event.registration_attendee_details +msgid "Name *" +msgstr "Prénom et Nom *" diff --git a/models/__init__.py b/models/__init__.py index fea9a03a87ad814d2124b95cf2e4eec34122881d..065291202736e1298a015bbf2c73c33e7e3f5d99 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,3 +1,4 @@ from . import event_event +from . import event_question_answer from . import event_registration from . import event_type diff --git a/models/event_question_answer.py b/models/event_question_answer.py new file mode 100644 index 0000000000000000000000000000000000000000..d67dd664bbd88cefd15f0f7b75e3d3089fbf6c32 --- /dev/null +++ b/models/event_question_answer.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class EventQuestionAnswer(models.Model): + _inherit = "event.question.answer" + + number_max = fields.Integer( + "Nombre maximum autorisé", + default=0, + help="Laisser 0 pour ne pas limiter le nombre de fois " + "où cette réponse pourra être sélectionnée", + ) + registration_answer_ids = fields.One2many( + string="Réponses enregistrées", + comodel_name="event.registration.answer", + inverse_name="value_answer_id", + ) + answer_number = fields.Integer( + "Nombre de réponses enregistrées", + default=0, + compute="_compute_answers", + readonly=True, + ) + remaining_number = fields.Integer( + "Nombre de réponses restantes", + default=0, + compute="_compute_answers", + readonly=True, + ) + fully_booked = fields.Boolean( + "Complet", default=False, compute="_compute_answers", readonly=True + ) + + @api.depends("number_max", "registration_answer_ids") + def _compute_answers(self): + for answer in self.filtered("number_max"): + answer.answer_number = len(answer.sudo().registration_answer_ids) + answer.remaining_number = answer.number_max - answer.answer_number + answer.fully_booked = answer.remaining_number < 1 diff --git a/views/event_event.xml b/views/event_event.xml index 6ccfe88c27a71a54bfbbaa7c75535d1361db42e1..a00468d24abd2f3f4cabc98aa75bf085a4d072e0 100644 --- a/views/event_event.xml +++ b/views/event_event.xml @@ -67,4 +67,18 @@ </xpath> </field> </record> + <record id="event_questions_answer_max" model="ir.ui.view"> + <field name="name">solagro.event.question.answer.max.seats.form</field> + <field name="model">event.event</field> + <field name="inherit_id" ref="website_event_questions.event_event_view_form" /> + <field name="priority">50</field> + <field name="arch" type="xml"> + <xpath + expr="//page[@name='questions']//field[@name='question_ids']//form//field[@name='name']" + position="after" + > + <field name="number_max" string="Max" /> + </xpath> + </field> + </record> </odoo> diff --git a/views/event_question.xml b/views/event_question.xml new file mode 100644 index 0000000000000000000000000000000000000000..4691c98121037ecc633b3fa8cd762e696d8e8d3f --- /dev/null +++ b/views/event_question.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright (c) 2024- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + --> +<odoo> + <record id="event_question_view_form_inherit" model="ir.ui.view"> + <field name="name">event.question.view.form</field> + <field name="model">event.question</field> + <field + name="inherit_id" + ref="website_event_questions.event_question_view_form" + /> + <field name="priority" eval="8" /> + <field name="arch" type="xml"> + <xpath + expr="//page[@name='answers']//field[@name='answer_ids']/tree/field[@name='name']" + position="after" + > + <field name="number_max" /> + <field name="answer_number" /> + <field name="fully_booked" /> + </xpath> + </field> + </record> +</odoo> diff --git a/views/event_registration_template.xml b/views/event_registration_template.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a8f329acf9b94ef9aa8dce2df4400412e2c3a4b --- /dev/null +++ b/views/event_registration_template.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + +<template + id="registration_event_question_with_max" + inherit_id="website_event_questions.registration_event_question" + name="Registration Event Question with Maximum" + > + <xpath + expr="//t[@t-if="question.question_type == 'simple_choice'"]//t[@t-as='answer']//option" + position="attributes" + > + <attribute + name="t-if" + >(answer.number_max and not answer.fully_booked) or answer.number_max == 0</attribute> + <attribute + name="t-out" + >answer.name + " (" + str(answer.remaining_number) + " restant(es))"</attribute> + </xpath> + <xpath + expr="//t[@t-if="question.question_type == 'simple_choice'"]//t[@t-as='answer']//option" + position="after" + > + <option + t-else="" + t-out="answer.name + ' (Épuisé)'" + disabled="disabled" + value="" + /> + </xpath> +</template> + +</odoo>