From d31e7820e495ea40f99849cfd0b9f9e01e78415f Mon Sep 17 00:00:00 2001 From: David Date: Wed, 10 Jan 2024 18:22:41 +0100 Subject: [PATCH 1/7] [ADD] survey_partner_representative: New module Do surveys on behalf of others. TT46965 --- survey_partner_representative/README.rst | 117 +++++ survey_partner_representative/__init__.py | 2 + survey_partner_representative/__manifest__.py | 25 + .../controllers/__init__.py | 1 + .../controllers/main.py | 22 + .../survey_partner_representative_demo.xml | 43 ++ .../models/__init__.py | 3 + .../models/survey_representative_mixin.py | 29 ++ .../models/survey_survey.py | 18 + .../models/survey_user_input.py | 30 ++ .../readme/CONFIGURE.md | 8 + .../readme/CONTEXT.md | 4 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 1 + survey_partner_representative/readme/USAGE.md | 4 + ...survey_partner_representative_security.xml | 9 + .../static/description/index.html | 458 ++++++++++++++++++ .../tests/survey_representative_tour.esm.js | 45 ++ .../tests/__init__.py | 2 + survey_partner_representative/tests/models.py | 6 + .../test_survey_partner_representative.py | 98 ++++ .../tests/test_survey_representative_mixin.py | 50 ++ .../views/survey_survey_views.xml | 12 + .../views/survey_user_input_views.xml | 15 + 24 files changed, 1005 insertions(+) create mode 100644 survey_partner_representative/README.rst create mode 100644 survey_partner_representative/__init__.py create mode 100644 survey_partner_representative/__manifest__.py create mode 100644 survey_partner_representative/controllers/__init__.py create mode 100644 survey_partner_representative/controllers/main.py create mode 100644 survey_partner_representative/demo/survey_partner_representative_demo.xml create mode 100644 survey_partner_representative/models/__init__.py create mode 100644 survey_partner_representative/models/survey_representative_mixin.py create mode 100644 survey_partner_representative/models/survey_survey.py create mode 100644 survey_partner_representative/models/survey_user_input.py create mode 100644 survey_partner_representative/readme/CONFIGURE.md create mode 100644 survey_partner_representative/readme/CONTEXT.md create mode 100644 survey_partner_representative/readme/CONTRIBUTORS.md create mode 100644 survey_partner_representative/readme/DESCRIPTION.md create mode 100644 survey_partner_representative/readme/USAGE.md create mode 100644 survey_partner_representative/security/survey_partner_representative_security.xml create mode 100644 survey_partner_representative/static/description/index.html create mode 100644 survey_partner_representative/static/tests/survey_representative_tour.esm.js create mode 100644 survey_partner_representative/tests/__init__.py create mode 100644 survey_partner_representative/tests/models.py create mode 100644 survey_partner_representative/tests/test_survey_partner_representative.py create mode 100644 survey_partner_representative/tests/test_survey_representative_mixin.py create mode 100644 survey_partner_representative/views/survey_survey_views.xml create mode 100644 survey_partner_representative/views/survey_user_input_views.xml diff --git a/survey_partner_representative/README.rst b/survey_partner_representative/README.rst new file mode 100644 index 00000000..1026faf7 --- /dev/null +++ b/survey_partner_representative/README.rst @@ -0,0 +1,117 @@ +============================= +Survey Partner Representative +============================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:32924103c7ee99139f60cb1d89ae02a2085ced8d944a379da91f5d3a2426cf11 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/15.0/survey_partner_representative + :alt: OCA/survey +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/survey-15-0/survey-15-0-survey_partner_representative + :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=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Do surveys on behalf of others. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +When we have the modules ``survey_contact_generation``, +``survey_sale_generation`` or ``survey_crm_generation`` a salesman or a +portal users could want to act as a representative of another using the +surveys that generate those documents as an entry point. + +Configuration +============= + +Users that can make surveys on behalf of others need to have the +*Representative on surveys* special permission. + +If you want to allow that a survey is filled on behalf of others by the +authorized users: + +1. Go to *Surveys > Surveys* and choose the survey you want to + configure. +2. Go to the *Options* tab and in the *Candidates* section set the + *Allow Partner Representing* option on. + +Usage +===== + +A user acting on behalf of other can start a new survey from the share +link: + +- On the survey backend form, click on *Share* and copy the survey URL. +- Paste it in your browser and fill the survey with needed data. + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__ + + - David Vidal + +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. + +.. |maintainer-chienandalu| image:: https://github.com/chienandalu.png?size=40px + :target: https://github.com/chienandalu + :alt: chienandalu + +Current `maintainer `__: + +|maintainer-chienandalu| + +This module is part of the `OCA/survey `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/survey_partner_representative/__init__.py b/survey_partner_representative/__init__.py new file mode 100644 index 00000000..91c5580f --- /dev/null +++ b/survey_partner_representative/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/survey_partner_representative/__manifest__.py b/survey_partner_representative/__manifest__.py new file mode 100644 index 00000000..6cbe77a1 --- /dev/null +++ b/survey_partner_representative/__manifest__.py @@ -0,0 +1,25 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Survey Partner Representative", + "summary": "Fill the survey on behalf of others", + "version": "15.0.1.0.0", + "development_status": "Beta", + "category": "Marketing/Survey", + "website": "https://github.com/OCA/survey", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["chienandalu"], + "license": "AGPL-3", + "depends": ["survey"], + "data": [ + "security/survey_partner_representative_security.xml", + "views/survey_survey_views.xml", + "views/survey_user_input_views.xml", + ], + "demo": ["demo/survey_partner_representative_demo.xml"], + "assets": { + "web.assets_tests": [ + "/survey_partner_representative/static/tests/survey_representative_tour.esm.js", + ], + }, +} diff --git a/survey_partner_representative/controllers/__init__.py b/survey_partner_representative/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/survey_partner_representative/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/survey_partner_representative/controllers/main.py b/survey_partner_representative/controllers/main.py new file mode 100644 index 00000000..8cc14874 --- /dev/null +++ b/survey_partner_representative/controllers/main.py @@ -0,0 +1,22 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.http import request + +from odoo.addons.survey.controllers.main import Survey + + +class Survey(Survey): + def _check_validity( + self, survey_token, answer_token, ensure_token=True, check_partner=True + ): + """Avoid partner mismatching error""" + survey_sudo, _answer_sudo = self._fetch_from_access_token( + survey_token, answer_token + ) + if survey_sudo.allow_partner_representing and request.env.user.has_group( + "survey_partner_representative.partner_representative" + ): + check_partner = False + return super()._check_validity( + survey_token, answer_token, ensure_token, check_partner + ) diff --git a/survey_partner_representative/demo/survey_partner_representative_demo.xml b/survey_partner_representative/demo/survey_partner_representative_demo.xml new file mode 100644 index 00000000..e3a28cab --- /dev/null +++ b/survey_partner_representative/demo/survey_partner_representative_demo.xml @@ -0,0 +1,43 @@ + + + + Meal preferences + 80e5f1e2-1a9d-4c51-8e23-4abc7534 + public + + + + + 0 + Name + char_box + + + + + 1 + Email + char_box + + + + 4 + What would you like for dinner? + simple_choice + + + + 1 + Meat + + + + 2 + Fish + + + + 3 + Vegan + + diff --git a/survey_partner_representative/models/__init__.py b/survey_partner_representative/models/__init__.py new file mode 100644 index 00000000..ca3515f3 --- /dev/null +++ b/survey_partner_representative/models/__init__.py @@ -0,0 +1,3 @@ +from . import survey_representative_mixin +from . import survey_survey +from . import survey_user_input diff --git a/survey_partner_representative/models/survey_representative_mixin.py b/survey_partner_representative/models/survey_representative_mixin.py new file mode 100644 index 00000000..b40570b0 --- /dev/null +++ b/survey_partner_representative/models/survey_representative_mixin.py @@ -0,0 +1,29 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class SurveyRepresentativeMixin(models.AbstractModel): + """This abstract is handy when we have a generated record that is linked to a + user input. This way, we can compute the represetative partner right away""" + + _name = "survey.representative.mixin" + _description = "Use this mixin in models that have a linked survey input" + + survey_user_input_id = fields.Many2one( + comodel_name="survey.user_input", readonly=True + ) + survey_representative_partner_id = fields.Many2one( + comodel_name="res.partner", + compute="_compute_survey_representative_partner_id", + store=True, + readonly=False, + ) + + @api.depends("survey_user_input_id") + def _compute_survey_representative_partner_id(self): + """Users can set the field independently of the answer, but the answer rules""" + for record in self: + record.survey_representative_partner_id = ( + self.survey_user_input_id.representative_partner_id + ) diff --git a/survey_partner_representative/models/survey_survey.py b/survey_partner_representative/models/survey_survey.py new file mode 100644 index 00000000..09fefd62 --- /dev/null +++ b/survey_partner_representative/models/survey_survey.py @@ -0,0 +1,18 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class SurveySurvey(models.Model): + _inherit = "survey.survey" + + allow_partner_representing = fields.Boolean( + help="A user with the proper permissions, could do the survey on behalf of other" + ) + + def _create_answer(self, *args, **kwargs): + """Inject the context so the partner representation is only done on a normal + survey workflow""" + if self.allow_partner_representing: + self = self.with_context(survey_partner_representative=True) + return super()._create_answer(*args, **kwargs) diff --git a/survey_partner_representative/models/survey_user_input.py b/survey_partner_representative/models/survey_user_input.py new file mode 100644 index 00000000..6b9aac51 --- /dev/null +++ b/survey_partner_representative/models/survey_user_input.py @@ -0,0 +1,30 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class SurveyUserInput(models.Model): + _inherit = "survey.user_input" + + representative_partner_id = fields.Many2one( + comodel_name="res.partner", + help="This partner filled this survey on behalf of other", + readonly=True, + ) + + @api.model_create_multi + def create(self, vals_list): + """Remove the user information so the survey is made anonymously""" + answers = super().create(vals_list) + if ( + self.env.context.get("survey_partner_representative") + and self.env.user.has_group( + "survey_partner_representative.partner_representative" + ) + and all(answers.survey_id.mapped("allow_partner_representing")) + ): + answers.partner_id = False + answers.email = False + answers.nickname = False + answers.representative_partner_id = self.env.user.partner_id + return answers diff --git a/survey_partner_representative/readme/CONFIGURE.md b/survey_partner_representative/readme/CONFIGURE.md new file mode 100644 index 00000000..51f818b2 --- /dev/null +++ b/survey_partner_representative/readme/CONFIGURE.md @@ -0,0 +1,8 @@ +Users that can make surveys on behalf of others need to have the +*Representative on surveys* special permission. + +If you want to allow that a survey is filled on behalf of others by the authorized users: + +1. Go to *Surveys > Surveys* and choose the survey you want to configure. +2. Go to the *Options* tab and in the *Candidates* section set the *Allow Partner Representing* + option on. diff --git a/survey_partner_representative/readme/CONTEXT.md b/survey_partner_representative/readme/CONTEXT.md new file mode 100644 index 00000000..6a7b0a8f --- /dev/null +++ b/survey_partner_representative/readme/CONTEXT.md @@ -0,0 +1,4 @@ +When we have the modules `survey_contact_generation`, `survey_sale_generation` or +`survey_crm_generation` a salesman or a portal users could want to act as a +representative of another using the surveys that generate those documents as an entry +point. diff --git a/survey_partner_representative/readme/CONTRIBUTORS.md b/survey_partner_representative/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..59e234a1 --- /dev/null +++ b/survey_partner_representative/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com) + + - David Vidal diff --git a/survey_partner_representative/readme/DESCRIPTION.md b/survey_partner_representative/readme/DESCRIPTION.md new file mode 100644 index 00000000..bf387523 --- /dev/null +++ b/survey_partner_representative/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Do surveys on behalf of others. diff --git a/survey_partner_representative/readme/USAGE.md b/survey_partner_representative/readme/USAGE.md new file mode 100644 index 00000000..f7e06afd --- /dev/null +++ b/survey_partner_representative/readme/USAGE.md @@ -0,0 +1,4 @@ +A user acting on behalf of other can start a new survey from the share link: + +- On the survey backend form, click on *Share* and copy the survey URL. +- Paste it in your browser and fill the survey with needed data. diff --git a/survey_partner_representative/security/survey_partner_representative_security.xml b/survey_partner_representative/security/survey_partner_representative_security.xml new file mode 100644 index 00000000..3bb1f3ed --- /dev/null +++ b/survey_partner_representative/security/survey_partner_representative_security.xml @@ -0,0 +1,9 @@ + + + + + Representative on surveys + + + diff --git a/survey_partner_representative/static/description/index.html b/survey_partner_representative/static/description/index.html new file mode 100644 index 00000000..7190d870 --- /dev/null +++ b/survey_partner_representative/static/description/index.html @@ -0,0 +1,458 @@ + + + + + + +Survey Partner Representative + + + +
+

Survey Partner Representative

+ + +

Beta License: AGPL-3 OCA/survey Translate me on Weblate Try me on Runboat

+

Do surveys on behalf of others.

+

Table of contents

+ +
+

Use Cases / Context

+

When we have the modules survey_contact_generation, +survey_sale_generation or survey_crm_generation a salesman or a +portal users could want to act as a representative of another using the +surveys that generate those documents as an entry point.

+
+
+

Configuration

+

Users that can make surveys on behalf of others need to have the +Representative on surveys special permission.

+

If you want to allow that a survey is filled on behalf of others by the +authorized users:

+
    +
  1. Go to Surveys > Surveys and choose the survey you want to +configure.
  2. +
  3. Go to the Options tab and in the Candidates section set the +Allow Partner Representing option on.
  4. +
+
+
+

Usage

+

A user acting on behalf of other can start a new survey from the share +link:

+
    +
  • On the survey backend form, click on Share and copy the survey URL.
  • +
  • Paste it in your browser and fill the survey with needed data.
  • +
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainer:

+

chienandalu

+

This module is part of the OCA/survey project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/survey_partner_representative/static/tests/survey_representative_tour.esm.js b/survey_partner_representative/static/tests/survey_representative_tour.esm.js new file mode 100644 index 00000000..c11d34f9 --- /dev/null +++ b/survey_partner_representative/static/tests/survey_representative_tour.esm.js @@ -0,0 +1,45 @@ +/** @odoo-module */ + +import tour from "web_tour.tour"; + +tour.register( + "test_survey_representative", + { + test: true, + url: "/survey/start/80e5f1e2-1a9d-4c51-8e23-4abc7534", + }, + [ + { + content: "Click on Start", + trigger: "button.btn:contains('Start Survey')", + }, + { + content: "Name", + trigger: "div.js_question-wrapper:contains('Name') input", + run: "text Mr. Odoo", + }, + { + content: "Email", + trigger: "div.js_question-wrapper:contains('Email') input", + run: "text mrodoo@test.com", + }, + { + content: "What meal?", + trigger: + "div.js_question-wrapper:contains('What would you like for dinner') label:contains('Meat') i", + run: function () { + $( + "div.js_question-wrapper:contains('What would you like for dinner') label:contains('Meat') i" + ).prop("checked", true); + }, + }, + { + content: "Click Submit", + trigger: "button[value='finish']", + }, + { + content: "Thank you", + trigger: "h1:contains('Thank you!')", + }, + ] +); diff --git a/survey_partner_representative/tests/__init__.py b/survey_partner_representative/tests/__init__.py new file mode 100644 index 00000000..ac4183dd --- /dev/null +++ b/survey_partner_representative/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_survey_partner_representative +from . import test_survey_representative_mixin diff --git a/survey_partner_representative/tests/models.py b/survey_partner_representative/tests/models.py new file mode 100644 index 00000000..44c975c6 --- /dev/null +++ b/survey_partner_representative/tests/models.py @@ -0,0 +1,6 @@ +from odoo import models + + +class ResPartner(models.Model): + _inherit = ["res.partner", "survey.representative.mixin"] + _name = "res.partner" diff --git a/survey_partner_representative/tests/test_survey_partner_representative.py b/survey_partner_representative/tests/test_survey_partner_representative.py new file mode 100644 index 00000000..ff8c571f --- /dev/null +++ b/survey_partner_representative/tests/test_survey_partner_representative.py @@ -0,0 +1,98 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import HttpCase, tagged + +from odoo.addons.survey.tests.common import SurveyCase + + +@tagged("-at_install", "post_install") +class SurveyRepresentativeCase(SurveyCase, HttpCase): + def setUp(self): + """We run the tour in the setup so we can share the tests case with other + modules""" + super().setUp() + self.portal_partner = self.env.ref("base.partner_demo_portal") + self.portal_user = self.env.ref("base.demo_user0") + self.representative_group = self.env.ref( + "survey_partner_representative.partner_representative" + ) + self.survey = self.env.ref( + "survey_partner_representative.survey_representative_demo" + ) + + def _do_survey(self): + """Run the survey common method""" + initial_user_inputs = self.survey.user_input_ids + self.start_tour( + f"/survey/start/{self.survey.access_token}", + "test_survey_representative", + login="portal", + ) + self.user_input = self.survey.user_input_ids - initial_user_inputs + + +@tagged("-at_install", "post_install") +class SurveyRepresentativeTests(SurveyRepresentativeCase): + def test_not_survey_representative_not_allowed_partner(self): + """A survey that can't be filled by representatives and a user who doesn't + have the permissions""" + self._do_survey() + self.assertEqual( + self.user_input.partner_id, + self.portal_partner, + "The partner should be the one filling the survey", + ) + self.assertEqual( + self.user_input.representative_partner_id, + self.env["res.partner"], + "The representative partner should be empty", + ) + + def test_survey_allowed_representative_not_allowed_partner(self): + """A survey that can be filled by representatives and a user who doesn't have + the permissions""" + self.survey.allow_partner_representing = True + self._do_survey() + self.assertEqual( + self.user_input.partner_id, + self.portal_partner, + "The partner should be the one filling the survey", + ) + self.assertEqual( + self.user_input.representative_partner_id, + self.env["res.partner"], + "The representative partner should be empty", + ) + + def test_survey_not_representative_not_allowed_partner(self): + """A survey that can't be filled by representatives and a user who has + the permissions""" + self.representative_group.users |= self.portal_user + self._do_survey() + self.assertEqual( + self.user_input.partner_id, + self.portal_partner, + "The partner should be the one filling the survey", + ) + self.assertEqual( + self.user_input.representative_partner_id, + self.env["res.partner"], + "The representative partner should be empty", + ) + + def test_survey_allowd_representative_allowed_partner(self): + """A survey that can't be filled by representatives and a user who has + the permissions""" + self.representative_group.users |= self.portal_user + self.survey.allow_partner_representing = True + self._do_survey() + self.assertEqual( + self.user_input.partner_id, + self.env["res.partner"], + "he partner should be empty", + ) + self.assertEqual( + self.user_input.representative_partner_id, + self.portal_partner, + "The representative partner should the one filling the survey", + ) diff --git a/survey_partner_representative/tests/test_survey_representative_mixin.py b/survey_partner_representative/tests/test_survey_representative_mixin.py new file mode 100644 index 00000000..846a0594 --- /dev/null +++ b/survey_partner_representative/tests/test_survey_representative_mixin.py @@ -0,0 +1,50 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo_test_helper import FakeModelLoader + +from odoo.tests import tagged + +from .test_survey_partner_representative import SurveyRepresentativeCase + + +@tagged("-at_install", "post_install") +class SurveyRepresentativeMixinCase(SurveyRepresentativeCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .models import ResPartner + + cls.loader.update_registry((ResPartner,)) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + super().tearDownClass() + + def test_create_partner_representative_mixin(self): + self.representative_group.users |= self.portal_user + self.survey.allow_partner_representing = True + self._do_survey() + self.assertEqual( + self.user_input.partner_id, + self.env["res.partner"], + "he partner should be empty", + ) + self.assertEqual( + self.user_input.representative_partner_id, + self.portal_partner, + "The representative partner should the one filling the survey", + ) + partner = self.env["res.partner"].create( + { + "name": "Test generated partner representative", + "survey_user_input_id": self.user_input.id, + } + ) + self.assertEqual( + partner.survey_representative_partner_id, + self.portal_partner, + "The representative partner should the one filling the survey", + ) diff --git a/survey_partner_representative/views/survey_survey_views.xml b/survey_partner_representative/views/survey_survey_views.xml new file mode 100644 index 00000000..e71887fe --- /dev/null +++ b/survey_partner_representative/views/survey_survey_views.xml @@ -0,0 +1,12 @@ + + + + survey.survey + + + + + + + + diff --git a/survey_partner_representative/views/survey_user_input_views.xml b/survey_partner_representative/views/survey_user_input_views.xml new file mode 100644 index 00000000..145961f0 --- /dev/null +++ b/survey_partner_representative/views/survey_user_input_views.xml @@ -0,0 +1,15 @@ + + + + survey.user_input + + + + + + + + From 53bff124e0bfa7592ba29505277fee203b799373 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 16 Jan 2024 07:28:04 +0000 Subject: [PATCH 2/7] [UPD] Update survey_partner_representative.pot --- .../i18n/survey_partner_representative.pot | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 survey_partner_representative/i18n/survey_partner_representative.pot diff --git a/survey_partner_representative/i18n/survey_partner_representative.pot b/survey_partner_representative/i18n/survey_partner_representative.pot new file mode 100644 index 00000000..1251c51f --- /dev/null +++ b/survey_partner_representative/i18n/survey_partner_representative.pot @@ -0,0 +1,117 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * survey_partner_representative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: survey_partner_representative +#: model:ir.model.fields,help:survey_partner_representative.field_survey_survey__allow_partner_representing +msgid "" +"A user with the proper permissions, could do the survey on behalf of other" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_survey__allow_partner_representing +msgid "Allow Partner Representing" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q1 +msgid "Email" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug2 +msgid "Fish" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q0 +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q1 +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q5 +msgid "If other, please specify:" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.survey,title:survey_partner_representative.survey_representative_demo +msgid "Meal preferences" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug1 +msgid "Meat" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q0 +msgid "Name" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_user_input__representative_partner_id +msgid "Representative Partner" +msgstr "" + +#. module: survey_partner_representative +#: model:res.groups,name:survey_partner_representative.partner_representative +msgid "Representative on surveys" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_survey +msgid "Survey" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_representative_partner_id +msgid "Survey Representative Partner" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_user_input +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_user_input_id +msgid "Survey User Input" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q0 +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q1 +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q5 +msgid "The answer you entered is not valid." +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,help:survey_partner_representative.field_survey_user_input__representative_partner_id +msgid "This partner filled this survey on behalf of other" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q0 +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q1 +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q5 +msgid "This question requires an answer." +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_representative_mixin +msgid "Use this mixin in models that have a linked survey input" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug3 +msgid "Vegan" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q5 +msgid "What would you like for dinner?" +msgstr "" From 2065d6d81ab7b75a90f0e3638cb660c8f1075d88 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Jan 2024 07:31:04 +0000 Subject: [PATCH 3/7] [BOT] post-merge updates --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 survey_partner_representative/static/description/icon.png diff --git a/survey_partner_representative/static/description/icon.png b/survey_partner_representative/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 387d7e84d2eeeb82827404f61324316ded9e85b1 Mon Sep 17 00:00:00 2001 From: David Vidal Date: Wed, 17 Jan 2024 09:45:43 +0000 Subject: [PATCH 4/7] Added translation using Weblate (Spanish) --- survey_partner_representative/i18n/es.po | 118 +++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 survey_partner_representative/i18n/es.po diff --git a/survey_partner_representative/i18n/es.po b/survey_partner_representative/i18n/es.po new file mode 100644 index 00000000..273ed2eb --- /dev/null +++ b/survey_partner_representative/i18n/es.po @@ -0,0 +1,118 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * survey_partner_representative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: survey_partner_representative +#: model:ir.model.fields,help:survey_partner_representative.field_survey_survey__allow_partner_representing +msgid "" +"A user with the proper permissions, could do the survey on behalf of other" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_survey__allow_partner_representing +msgid "Allow Partner Representing" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q1 +msgid "Email" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug2 +msgid "Fish" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q0 +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q1 +#: model:survey.question,comments_message:survey_partner_representative.survey_representative_q5 +msgid "If other, please specify:" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.survey,title:survey_partner_representative.survey_representative_demo +msgid "Meal preferences" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug1 +msgid "Meat" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q0 +msgid "Name" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_user_input__representative_partner_id +msgid "Representative Partner" +msgstr "" + +#. module: survey_partner_representative +#: model:res.groups,name:survey_partner_representative.partner_representative +msgid "Representative on surveys" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_survey +msgid "Survey" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_representative_partner_id +msgid "Survey Representative Partner" +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_user_input +#: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_user_input_id +msgid "Survey User Input" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q0 +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q1 +#: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q5 +msgid "The answer you entered is not valid." +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model.fields,help:survey_partner_representative.field_survey_user_input__representative_partner_id +msgid "This partner filled this survey on behalf of other" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q0 +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q1 +#: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q5 +msgid "This question requires an answer." +msgstr "" + +#. module: survey_partner_representative +#: model:ir.model,name:survey_partner_representative.model_survey_representative_mixin +msgid "Use this mixin in models that have a linked survey input" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug3 +msgid "Vegan" +msgstr "" + +#. module: survey_partner_representative +#: model:survey.question,title:survey_partner_representative.survey_representative_q5 +msgid "What would you like for dinner?" +msgstr "" From cebbafd6b988ed1ae7e1a37ef139929d0adf9cbc Mon Sep 17 00:00:00 2001 From: David Vidal Date: Wed, 17 Jan 2024 09:46:38 +0000 Subject: [PATCH 5/7] Translated using Weblate (Spanish) Currently translated at 100.0% (19 of 19 strings) Translation: survey-15.0/survey-15.0-survey_partner_representative Translate-URL: https://translation.odoo-community.org/projects/survey-15-0/survey-15-0-survey_partner_representative/es/ --- survey_partner_representative/i18n/es.po | 40 +++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/survey_partner_representative/i18n/es.po b/survey_partner_representative/i18n/es.po index 273ed2eb..f7cc818b 100644 --- a/survey_partner_representative/i18n/es.po +++ b/survey_partner_representative/i18n/es.po @@ -6,113 +6,117 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-01-17 12:36+0000\n" +"Last-Translator: David Vidal \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: survey_partner_representative #: model:ir.model.fields,help:survey_partner_representative.field_survey_survey__allow_partner_representing msgid "" "A user with the proper permissions, could do the survey on behalf of other" msgstr "" +"Un usuario con los permisos pertinentes puede hacer la encuesta por otro" #. module: survey_partner_representative #: model:ir.model.fields,field_description:survey_partner_representative.field_survey_survey__allow_partner_representing msgid "Allow Partner Representing" -msgstr "" +msgstr "Permitir representación de contacto" #. module: survey_partner_representative #: model:survey.question,title:survey_partner_representative.survey_representative_q1 msgid "Email" -msgstr "" +msgstr "Correo electrónico" #. module: survey_partner_representative #: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug2 msgid "Fish" -msgstr "" +msgstr "Pescado" #. module: survey_partner_representative #: model:survey.question,comments_message:survey_partner_representative.survey_representative_q0 #: model:survey.question,comments_message:survey_partner_representative.survey_representative_q1 #: model:survey.question,comments_message:survey_partner_representative.survey_representative_q5 msgid "If other, please specify:" -msgstr "" +msgstr "Si es otra, especifique por favor:" #. module: survey_partner_representative #: model:survey.survey,title:survey_partner_representative.survey_representative_demo msgid "Meal preferences" -msgstr "" +msgstr "Preferencias para la comida" #. module: survey_partner_representative #: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug1 msgid "Meat" -msgstr "" +msgstr "Carne" #. module: survey_partner_representative #: model:survey.question,title:survey_partner_representative.survey_representative_q0 msgid "Name" -msgstr "" +msgstr "Nombre" #. module: survey_partner_representative #: model:ir.model.fields,field_description:survey_partner_representative.field_survey_user_input__representative_partner_id msgid "Representative Partner" -msgstr "" +msgstr "Contacto representante" #. module: survey_partner_representative #: model:res.groups,name:survey_partner_representative.partner_representative msgid "Representative on surveys" -msgstr "" +msgstr "Representante en encuestas" #. module: survey_partner_representative #: model:ir.model,name:survey_partner_representative.model_survey_survey msgid "Survey" -msgstr "" +msgstr "Encuesta" #. module: survey_partner_representative #: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_representative_partner_id msgid "Survey Representative Partner" -msgstr "" +msgstr "Contacto representante en la encuesta" #. module: survey_partner_representative #: model:ir.model,name:survey_partner_representative.model_survey_user_input #: model:ir.model.fields,field_description:survey_partner_representative.field_survey_representative_mixin__survey_user_input_id msgid "Survey User Input" -msgstr "" +msgstr "Respuesta de usuario" #. module: survey_partner_representative #: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q0 #: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q1 #: model:survey.question,validation_error_msg:survey_partner_representative.survey_representative_q5 msgid "The answer you entered is not valid." -msgstr "" +msgstr "La respuesta que ha introducido no es válida." #. module: survey_partner_representative #: model:ir.model.fields,help:survey_partner_representative.field_survey_user_input__representative_partner_id msgid "This partner filled this survey on behalf of other" -msgstr "" +msgstr "Este contacto relleno la encuesta en representación de otro" #. module: survey_partner_representative #: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q0 #: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q1 #: model:survey.question,constr_error_msg:survey_partner_representative.survey_representative_q5 msgid "This question requires an answer." -msgstr "" +msgstr "Esta pregunta requiere una respuesta." #. module: survey_partner_representative #: model:ir.model,name:survey_partner_representative.model_survey_representative_mixin msgid "Use this mixin in models that have a linked survey input" msgstr "" +"Utilice este mixin en modelos que tengan ligada una respuesta de encuesta" #. module: survey_partner_representative #: model:survey.question.answer,value:survey_partner_representative.survey_representative_q5_sug3 msgid "Vegan" -msgstr "" +msgstr "Vegano" #. module: survey_partner_representative #: model:survey.question,title:survey_partner_representative.survey_representative_q5 msgid "What would you like for dinner?" -msgstr "" +msgstr "¿Qué le gustaría para cenar?" From 484ae5cc878f87ef44d02c32e95e2be7ec5bdfa3 Mon Sep 17 00:00:00 2001 From: pilarvargas-tecnativa Date: Wed, 15 Jan 2025 18:30:16 +0100 Subject: [PATCH 6/7] [IMP] survey_partner_representative: pre-commit auto fixes --- survey_partner_representative/pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 survey_partner_representative/pyproject.toml diff --git a/survey_partner_representative/pyproject.toml b/survey_partner_representative/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/survey_partner_representative/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" From 1ed5639703bd691f8c39d411a89b5fe5acdb796e Mon Sep 17 00:00:00 2001 From: pilarvargas-tecnativa Date: Mon, 27 Jan 2025 11:43:46 +0100 Subject: [PATCH 7/7] [MIG] survey_partner_representative: Migration to version 17.0 TT51953 --- survey_partner_representative/README.rst | 12 ++++----- survey_partner_representative/__manifest__.py | 2 +- .../controllers/main.py | 2 +- .../models/survey_representative_mixin.py | 2 +- .../models/survey_survey.py | 7 ++--- .../models/survey_user_input.py | 2 +- .../readme/CONFIGURE.md | 2 +- ...survey_partner_representative_security.xml | 2 +- .../static/description/index.html | 20 +++++++------- .../tests/survey_representative_tour.esm.js | 27 +++++++++++-------- .../views/survey_survey_views.xml | 4 +-- .../views/survey_user_input_views.xml | 2 +- test-requirements.txt | 1 + 13 files changed, 47 insertions(+), 38 deletions(-) create mode 100644 test-requirements.txt diff --git a/survey_partner_representative/README.rst b/survey_partner_representative/README.rst index 1026faf7..1e56d12f 100644 --- a/survey_partner_representative/README.rst +++ b/survey_partner_representative/README.rst @@ -17,13 +17,13 @@ Survey Partner Representative :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/15.0/survey_partner_representative + :target: https://github.com/OCA/survey/tree/17.0/survey_partner_representative :alt: OCA/survey .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/survey-15-0/survey-15-0-survey_partner_representative + :target: https://translation.odoo-community.org/projects/survey-17-0/survey-17-0-survey_partner_representative :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=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/survey&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -54,7 +54,7 @@ authorized users: 1. Go to *Surveys > Surveys* and choose the survey you want to configure. -2. Go to the *Options* tab and in the *Candidates* section set the +2. Go to the *Options* tab and in the *Participants* section set the *Allow Partner Representing* option on. Usage @@ -72,7 +72,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -112,6 +112,6 @@ Current `maintainer `__: |maintainer-chienandalu| -This module is part of the `OCA/survey `_ project on GitHub. +This module is part of the `OCA/survey `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/survey_partner_representative/__manifest__.py b/survey_partner_representative/__manifest__.py index 6cbe77a1..c6df8890 100644 --- a/survey_partner_representative/__manifest__.py +++ b/survey_partner_representative/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Survey Partner Representative", "summary": "Fill the survey on behalf of others", - "version": "15.0.1.0.0", + "version": "17.0.1.0.0", "development_status": "Beta", "category": "Marketing/Survey", "website": "https://github.com/OCA/survey", diff --git a/survey_partner_representative/controllers/main.py b/survey_partner_representative/controllers/main.py index 8cc14874..2632465d 100644 --- a/survey_partner_representative/controllers/main.py +++ b/survey_partner_representative/controllers/main.py @@ -9,7 +9,7 @@ class Survey(Survey): def _check_validity( self, survey_token, answer_token, ensure_token=True, check_partner=True ): - """Avoid partner mismatching error""" + # Avoid partner mismatching error survey_sudo, _answer_sudo = self._fetch_from_access_token( survey_token, answer_token ) diff --git a/survey_partner_representative/models/survey_representative_mixin.py b/survey_partner_representative/models/survey_representative_mixin.py index b40570b0..c84ffdd1 100644 --- a/survey_partner_representative/models/survey_representative_mixin.py +++ b/survey_partner_representative/models/survey_representative_mixin.py @@ -25,5 +25,5 @@ def _compute_survey_representative_partner_id(self): """Users can set the field independently of the answer, but the answer rules""" for record in self: record.survey_representative_partner_id = ( - self.survey_user_input_id.representative_partner_id + record.survey_user_input_id.representative_partner_id ) diff --git a/survey_partner_representative/models/survey_survey.py b/survey_partner_representative/models/survey_survey.py index 09fefd62..af861fa2 100644 --- a/survey_partner_representative/models/survey_survey.py +++ b/survey_partner_representative/models/survey_survey.py @@ -7,12 +7,13 @@ class SurveySurvey(models.Model): _inherit = "survey.survey" allow_partner_representing = fields.Boolean( - help="A user with the proper permissions, could do the survey on behalf of other" + help="A user with the proper permissions, could do the survey on " + "behalf of other" ) def _create_answer(self, *args, **kwargs): - """Inject the context so the partner representation is only done on a normal - survey workflow""" + # Inject the context so the partner representation is only done on a normal + # survey workflow if self.allow_partner_representing: self = self.with_context(survey_partner_representative=True) return super()._create_answer(*args, **kwargs) diff --git a/survey_partner_representative/models/survey_user_input.py b/survey_partner_representative/models/survey_user_input.py index 6b9aac51..b57a8362 100644 --- a/survey_partner_representative/models/survey_user_input.py +++ b/survey_partner_representative/models/survey_user_input.py @@ -14,7 +14,7 @@ class SurveyUserInput(models.Model): @api.model_create_multi def create(self, vals_list): - """Remove the user information so the survey is made anonymously""" + # Remove the user information so the survey is made anonymously answers = super().create(vals_list) if ( self.env.context.get("survey_partner_representative") diff --git a/survey_partner_representative/readme/CONFIGURE.md b/survey_partner_representative/readme/CONFIGURE.md index 51f818b2..1cf1fd27 100644 --- a/survey_partner_representative/readme/CONFIGURE.md +++ b/survey_partner_representative/readme/CONFIGURE.md @@ -4,5 +4,5 @@ Users that can make surveys on behalf of others need to have the If you want to allow that a survey is filled on behalf of others by the authorized users: 1. Go to *Surveys > Surveys* and choose the survey you want to configure. -2. Go to the *Options* tab and in the *Candidates* section set the *Allow Partner Representing* +2. Go to the *Options* tab and in the *Participants* section set the *Allow Partner Representing* option on. diff --git a/survey_partner_representative/security/survey_partner_representative_security.xml b/survey_partner_representative/security/survey_partner_representative_security.xml index 3bb1f3ed..3e46a87e 100644 --- a/survey_partner_representative/security/survey_partner_representative_security.xml +++ b/survey_partner_representative/security/survey_partner_representative_security.xml @@ -1,7 +1,7 @@ - + Representative on surveys diff --git a/survey_partner_representative/static/description/index.html b/survey_partner_representative/static/description/index.html index 7190d870..16aae856 100644 --- a/survey_partner_representative/static/description/index.html +++ b/survey_partner_representative/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,7 +369,7 @@

Survey Partner Representative

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:32924103c7ee99139f60cb1d89ae02a2085ced8d944a379da91f5d3a2426cf11 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/survey Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/survey Translate me on Weblate Try me on Runboat

Do surveys on behalf of others.

Table of contents

@@ -402,7 +402,7 @@

Configuration

  1. Go to Surveys > Surveys and choose the survey you want to configure.
  2. -
  3. Go to the Options tab and in the Candidates section set the +
  4. Go to the Options tab and in the Participants section set the Allow Partner Representing option on.
@@ -420,7 +420,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 to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -443,13 +443,15 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

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.

Current maintainer:

chienandalu

-

This module is part of the OCA/survey project on GitHub.

+

This module is part of the OCA/survey project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/survey_partner_representative/static/tests/survey_representative_tour.esm.js b/survey_partner_representative/static/tests/survey_representative_tour.esm.js index c11d34f9..ac3751aa 100644 --- a/survey_partner_representative/static/tests/survey_representative_tour.esm.js +++ b/survey_partner_representative/static/tests/survey_representative_tour.esm.js @@ -1,28 +1,33 @@ /** @odoo-module */ -import tour from "web_tour.tour"; +import {registry} from "@web/core/registry"; -tour.register( - "test_survey_representative", - { - test: true, - url: "/survey/start/80e5f1e2-1a9d-4c51-8e23-4abc7534", - }, - [ +registry.category("web_tour.tours").add("test_survey_representative", { + test: true, + url: "/survey/start/80e5f1e2-1a9d-4c51-8e23-4abc7534", + steps: () => [ { content: "Click on Start", - trigger: "button.btn:contains('Start Survey')", + trigger: 'button.btn:contains("Start")', }, { content: "Name", trigger: "div.js_question-wrapper:contains('Name') input", run: "text Mr. Odoo", }, + { + content: "Submit and go to Next Page", + trigger: 'button[value="next"]', + }, { content: "Email", trigger: "div.js_question-wrapper:contains('Email') input", run: "text mrodoo@test.com", }, + { + content: "Submit and go to Next Page", + trigger: 'button[value="next"]', + }, { content: "What meal?", trigger: @@ -41,5 +46,5 @@ tour.register( content: "Thank you", trigger: "h1:contains('Thank you!')", }, - ] -); + ], +}); diff --git a/survey_partner_representative/views/survey_survey_views.xml b/survey_partner_representative/views/survey_survey_views.xml index e71887fe..60e01b9b 100644 --- a/survey_partner_representative/views/survey_survey_views.xml +++ b/survey_partner_representative/views/survey_survey_views.xml @@ -2,9 +2,9 @@ survey.survey - + - + diff --git a/survey_partner_representative/views/survey_user_input_views.xml b/survey_partner_representative/views/survey_user_input_views.xml index 145961f0..80872a42 100644 --- a/survey_partner_representative/views/survey_user_input_views.xml +++ b/survey_partner_representative/views/survey_user_input_views.xml @@ -7,7 +7,7 @@ diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000..66bc2cba --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo_test_helper