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=&quot;question.question_type == 'simple_choice'&quot;]//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=&quot;question.question_type == 'simple_choice'&quot;]//t[@t-as='answer']//option"
+            position="after"
+        >
+        <option
+                t-else=""
+                t-out="answer.name + ' (Épuisé)'"
+                disabled="disabled"
+                value=""
+            />
+    </xpath>
+</template>
+
+</odoo>
-- 
GitLab