Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions survey_question_type_model_selection/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
====================================
Survey model selection question type
====================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:fe3c2db9a4d30bf585e09ebda06f06903385422b6582e9cd6eec923ed3a86f06
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsurvey-lightgray.png?logo=github
:target: https://github.com/OCA/survey/tree/17.0/survey_question_type_model_selection
:alt: OCA/survey
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/survey-17-0/survey-17-0-survey_question_type_model_selection
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/survey&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module add Model selection field question type for attach on survey
page.

**Table of contents**

.. contents::
:local:

Configuration
=============

Once installed from the configuration of the questions, in the options,
you can select the model to apply and also you can add filters.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/survey/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/survey/issues/new?body=module:%20survey_question_type_model_selection%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Tecnativa

Contributors
------------

- `Tecnativa <https://www.tecnativa.com>`__

- Eduardo Ezerouali

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/survey <https://github.com/OCA/survey/tree/17.0/survey_question_type_model_selection>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions survey_question_type_model_selection/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
27 changes: 27 additions & 0 deletions survey_question_type_model_selection/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Copyright 2025 Tecnativa - Eduardo Ezerouali
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Survey model selection question type",
"version": "17.0.1.0.0",
"summary": "This module add model selection field as question type for survey page",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/survey",
"license": "AGPL-3",
"category": "Marketing/Survey",
"depends": ["survey"],
"data": [
"views/survey_question_views.xml",
"views/survey_user_input_line_views.xml",
"views/survey_template.xml",
],
"assets": {
"web.assets_frontend": [
"survey_question_type_model_selection/static/src/js/survey_form_patch.esm.js",
"survey_question_type_model_selection/static/src/js/survey_form_model.esm.js",
"survey_question_type_model_selection/static/src/css/survey_model.scss",
],
"web.assets_tests": [
"survey_question_type_model_selection/static/tests/test_tour_survey_question_model.esm.js",
],
},
}
3 changes: 3 additions & 0 deletions survey_question_type_model_selection/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import survey_question
from . import survey_user_input
from . import survey_user_input_line
36 changes: 36 additions & 0 deletions survey_question_type_model_selection/models/survey_question.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Copyright 2025 Tecnativa - Eduardo Ezerouali
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import ast

from odoo import fields, models


class SurveyQuestion(models.Model):
_inherit = "survey.question"

question_type = fields.Selection(selection_add=[("model", "Model selection")])
question_model_id = fields.Many2one(
string="Applies to",
comodel_name="ir.model",
default=lambda self: self.env["ir.model"]._get_id("res.partner"),
ondelete="cascade",
)
question_model_name = fields.Char(related="question_model_id.model")
question_domain = fields.Char(string="Filter Domain")

def _get_parsed_domain(self):
"""Parse domain string safely into a Python list."""
if not self.question_domain:
return []
try:
domain = ast.literal_eval(self.question_domain)
return domain if isinstance(domain, list) else []
except Exception:
return []

def get_model_options(self):
"""Return Model options filtered by the domain."""
self.ensure_one()
domain = self._get_parsed_domain()
records = self.env[self.question_model_name].sudo().search(domain)
return [(rec.id, rec.display_name, rec._name) for rec in records]
35 changes: 35 additions & 0 deletions survey_question_type_model_selection/models/survey_user_input.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2025 Tecnativa - Eduardo Ezerouali
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models


class SurveyUserInput(models.Model):
_inherit = "survey.user_input"

def _save_lines(self, question, answer, comment=None, overwrite_existing=True):
old_answers = self.env["survey.user_input.line"].search(
[
("user_input_id", "=", self.id),
("question_id", "=", question.id),
]
)
if question.question_type == "model":
if not isinstance(answer, (list | tuple)):
answer = [answer]
if not answer:
answer = [False]
for answer_drop in answer:
old_answers = self._save_line_simple_answer(
question, old_answers, answer_drop
)
else:
super()._save_lines(
question, answer, comment=comment, overwrite_existing=overwrite_existing
)
return True

def _get_line_answer_values(self, question, answer, answer_type):
res = super()._get_line_answer_values(question, answer, answer_type)
if answer_type == "model":
res["value_model"] = answer
return res
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Copyright 2025 Tecnativa - Eduardo Ezerouali
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, fields, models


class SurveyUserInputLine(models.Model):
_inherit = "survey.user_input.line"

answer_type = fields.Selection(
selection_add=[
("model", "Model selection"),
]
)
value_model = fields.Reference(
string="Selection answer", selection="_selection_target_model"
)

def _compute_display_name(self):
for line in self:
if line.answer_type == "model":
line.display_name = line.value_model.display_name
return super()._compute_display_name()

@api.model
def _selection_target_model(self):
return [
(model.model, model.name)
for model in self.env["ir.model"].sudo().search([])
]
3 changes: 3 additions & 0 deletions survey_question_type_model_selection/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
2 changes: 2 additions & 0 deletions survey_question_type_model_selection/readme/CONFIGURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Once installed from the configuration of the questions, in the options,
you can select the model to apply and also you can add filters.
2 changes: 2 additions & 0 deletions survey_question_type_model_selection/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- [Tecnativa](https://www.tecnativa.com)
- Eduardo Ezerouali
1 change: 1 addition & 0 deletions survey_question_type_model_selection/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module add Model selection field question type for attach on survey page.
Loading