From e28858028c8f568ec06e3fef3ce95530d33557e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com> Date: Tue, 10 Sep 2024 18:07:18 +0200 Subject: [PATCH] [ADD] limit on question answers --- __manifest__.py | 3 ++ i18n/fr.po | 5 ++++ i18n_extra/fr.po | 20 +++++++++++++ models/__init__.py | 1 + models/event_question_answer.py | 42 +++++++++++++++++++++++++++ views/event_event.xml | 14 +++++++++ views/event_question.xml | 26 +++++++++++++++++ views/event_registration_template.xml | 33 +++++++++++++++++++++ 8 files changed, 144 insertions(+) create mode 100644 i18n_extra/fr.po create mode 100644 models/event_question_answer.py create mode 100644 views/event_question.xml create mode 100644 views/event_registration_template.xml diff --git a/__manifest__.py b/__manifest__.py index 2e8e924..9fbf30e 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 ee5d20f..b583f89 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 0000000..9aa9872 --- /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 fea9a03..0652912 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 0000000..d67dd66 --- /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 6ccfe88..a00468d 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 0000000..4691c98 --- /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 0000000..6a8f329 --- /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> -- GitLab