[FIX] survey_record_generation: partner_id/email on survey.user_input could be wrong
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m25s

New version : 16.0.1.0.3

_mark_done() only set partner_id/email when it created a *new* res.partner.
If the answer already had a partner_id/email (e.g. inherited from the Odoo
user logged in when the /survey/start link was opened), that value was kept
even though the record creation matched or created a different, correct
contact from the participant's own answers.

Now we always sync partner_id/email to the res.partner actually matched or created
from the participant's answers.

Add a migration to relink partner_id/email on existing done submissions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-22 15:52:15 +02:00
parent e49803baca
commit 30ea5d4349
4 changed files with 286 additions and 3 deletions

View File

@@ -930,6 +930,71 @@ class TestSurveyRecordCreation(SurveyCase):
partner = self.env["res.partner"].search([("name", "=", "Jean")])
self.assertEqual(self.answer.partner_id, partner)
def test_partner_id_and_email_are_corrected_when_creating_a_new_partner(self):
# A wrong partner_id/email is already set on the answer (e.g.
# inherited from the Odoo user who was logged in when the
# /survey/start link was opened). The record creation must still
# fill partner_id/email with the contact actually created from the
# participant's own answers, overriding that wrong value.
wrong_partner = self.env["res.partner"].create({"name": "Wrong Partner"})
self.answer = self._add_answer(
survey=self.survey, partner=wrong_partner, email="wrong@test.fr"
)
self._add_answer_line(
question=self.question_name, answer=self.answer, answer_value="Jean"
)
self.answer._mark_done()
partner = self.env["res.partner"].search([("name", "=", "Jean")])
self.assertEqual(self.answer.partner_id, partner)
self.assertNotEqual(self.answer.partner_id, wrong_partner)
self.assertEqual(self.answer.email, partner.email)
def test_partner_id_and_email_are_corrected_when_matching_an_existing_partner(self):
# Same as above, but this time the record creation matches an
# already-existing partner (via update_existing_records) instead of
# creating a new one: partner_id/email must still be corrected to
# that matched partner, not left as the wrong pre-existing value.
jean = self.env["res.partner"].create({"name": "Jean", "email": "jean@test.fr"})
wrong_partner = self.env["res.partner"].create({"name": "Wrong Partner"})
self.survey_record_creation.write(
{
"update_existing_records": True,
"field_to_retrieve_existing_records": self.name_field.id,
}
)
self.answer = self._add_answer(
survey=self.survey, partner=wrong_partner, email="wrong@test.fr"
)
self._add_answer_line(
question=self.question_name, answer=self.answer, answer_value="Jean"
)
self.answer._mark_done()
self.assertEqual(self.answer.partner_id, jean)
self.assertEqual(self.answer.email, jean.email)
def test_partner_id_and_email_are_corrected_when_matching_a_duplicate(self):
# Same as above, but through the unicity_check/find_duplicate branch
# instead of update_existing_records.
self.name_survey_record_creation_field_values.unicity_check = True
jean = self.env["res.partner"].create({"name": "Jean", "email": "jean@test.fr"})
wrong_partner = self.env["res.partner"].create({"name": "Wrong Partner"})
self.answer = self._add_answer(
survey=self.survey, partner=wrong_partner, email="wrong@test.fr"
)
self._add_answer_line(
question=self.question_name, answer=self.answer, answer_value="Jean"
)
self.answer._mark_done()
self.assertEqual(self.answer.partner_id, jean)
self.assertEqual(self.answer.email, jean.email)
def test_partner_id_in_survey_input_is_filled_up_by_first_contact_record_creation(self):
# In this test, we verify that when creating several contacts with the same survey,
# the 1st created contact is used to fill up survey_input.partner_id
@@ -976,3 +1041,58 @@ class TestSurveyRecordCreation(SurveyCase):
partner = self.env["res.partner"].search([("name", "=", "Jean")])
self.assertEqual(self.answer.partner_id, partner)
def test_partner_id_is_not_overridden_by_second_contact_record_creation(self):
# When several res.partner record creations run on the same survey,
# partner_id/email must be corrected to match the first contact
# created, and the second contact created must not override that
# choice, even though the answer started with a wrong
# partner_id/email.
self.second_question_name = self._add_question(
page=None,
name="Name of second person",
qtype="char_box",
survey_id=self.survey.id,
sequence=1,
)
self.second_contact_creation = self.env["survey.record.creation"].create(
{
"name": "Contact 2",
"survey_id": self.survey.id,
"model_id": self.res_partner_model.id,
}
)
self.env["survey.record.creation.field.values"].create(
{
"survey_record_creation_id": self.second_contact_creation.id,
"survey_id": self.survey.id,
"model_id": self.res_partner_model.id,
"field_id": self.name_field.id,
"value_origin": "question",
"question_id": self.second_question_name.id,
}
)
wrong_partner = self.env["res.partner"].create({"name": "Wrong Partner"})
self.answer = self._add_answer(
survey=self.survey, partner=wrong_partner, email="wrong@test.fr"
)
self._add_answer_line(
question=self.question_name,
answer=self.answer,
answer_value="Jean",
)
self._add_answer_line(
question=self.second_question_name,
answer=self.answer,
answer_value="Jeanne",
)
self.answer._mark_done()
jean = self.env["res.partner"].search([("name", "=", "Jean")])
jeanne = self.env["res.partner"].search([("name", "=", "Jeanne")])
self.assertEqual(self.answer.partner_id, jean)
self.assertNotEqual(self.answer.partner_id, jeanne)
self.assertEqual(self.answer.email, jean.email)