[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
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user