[IMP]survey_record_generation:show alerte when deleting a crm tag used in lead record creation
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m42s
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m42s
This commit is contained in:
@@ -11,7 +11,7 @@ Allow to create record of any model when sending the form :
|
|||||||
* Associate question with fields
|
* Associate question with fields
|
||||||
* For x2m fields : Associate values to questions
|
* For x2m fields : Associate values to questions
|
||||||
""",
|
""",
|
||||||
"version": "16.0.1.0.2",
|
"version": "16.0.1.0.3",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"author": "Elabore",
|
"author": "Elabore",
|
||||||
"website": "https://www.elabore.coop",
|
"website": "https://www.elabore.coop",
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
from . import base
|
||||||
from . import survey_question_answer
|
from . import survey_question_answer
|
||||||
from . import survey_question
|
from . import survey_question
|
||||||
from . import survey_record_creation_field_values
|
from . import survey_record_creation_field_values
|
||||||
|
|||||||
65
survey_record_generation/models/base.py
Normal file
65
survey_record_generation/models/base.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
from odoo import models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class Base(models.AbstractModel):
|
||||||
|
_inherit = 'base'
|
||||||
|
|
||||||
|
def unlink(self):
|
||||||
|
if not self.env.context.get('module_uninstall'):
|
||||||
|
self._check_survey_record_creation_references()
|
||||||
|
return super().unlink()
|
||||||
|
|
||||||
|
def _check_survey_record_creation_references(self):
|
||||||
|
if not self or self._name in (
|
||||||
|
'survey.record.creation.field.values',
|
||||||
|
'survey.record.creation.field.values.x2m',
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
FieldValues = self.env['survey.record.creation.field.values'].sudo()
|
||||||
|
if not FieldValues.search_count([('field_id.relation', '=', self._name)], limit=1):
|
||||||
|
return
|
||||||
|
|
||||||
|
references = [f"{self._name},{record.id}" for record in self]
|
||||||
|
|
||||||
|
used_in_m2o = FieldValues.search([
|
||||||
|
('fixed_value_many2one', 'in', references),
|
||||||
|
])
|
||||||
|
used_in_m2m = self.env['survey.record.creation.field.values.x2m'].sudo().search([
|
||||||
|
('value_reference', 'in', references),
|
||||||
|
])
|
||||||
|
|
||||||
|
if not used_in_m2o and not used_in_m2m:
|
||||||
|
return
|
||||||
|
|
||||||
|
usages = set()
|
||||||
|
for fv in used_in_m2o:
|
||||||
|
usages.add((
|
||||||
|
fv.survey_id.display_name or '',
|
||||||
|
fv.field_id.field_description or fv.field_id.name or '',
|
||||||
|
fv.fixed_value_many2one.display_name or '',
|
||||||
|
))
|
||||||
|
for fvx in used_in_m2m:
|
||||||
|
parent = fvx.survey_record_creation_field_values_id
|
||||||
|
usages.add((
|
||||||
|
parent.survey_id.display_name or '',
|
||||||
|
parent.field_id.field_description or parent.field_id.name or '',
|
||||||
|
fvx.value_reference.display_name or '',
|
||||||
|
))
|
||||||
|
|
||||||
|
usage_lines = '\n'.join(
|
||||||
|
'- ' + _(
|
||||||
|
'Survey "%(survey)s", field "%(field)s" (value: %(value)s)',
|
||||||
|
survey=survey, field=field, value=value,
|
||||||
|
)
|
||||||
|
for survey, field, value in sorted(usages)
|
||||||
|
)
|
||||||
|
|
||||||
|
raise UserError(_(
|
||||||
|
'Cannot delete this record because it is used as a default value '
|
||||||
|
'in the following survey record creation configurations:\n\n'
|
||||||
|
'%(usages)s\n\n'
|
||||||
|
'Please update or remove the corresponding survey configuration first.',
|
||||||
|
usages=usage_lines,
|
||||||
|
))
|
||||||
@@ -32,8 +32,9 @@ class SurveyQuestion(models.Model):
|
|||||||
|
|
||||||
def fill(self):
|
def fill(self):
|
||||||
for question in self:
|
for question in self:
|
||||||
if question.model_id:
|
if question.suggested_answer_ids:
|
||||||
new_suggested_answer_ids = [Command.clear()]
|
question.suggested_answer_ids = [Command.clear()]
|
||||||
|
elif question.model_id:
|
||||||
record_model = question.model_id.model
|
record_model = question.model_id.model
|
||||||
|
|
||||||
if question.fill_domain:
|
if question.fill_domain:
|
||||||
@@ -43,7 +44,11 @@ class SurveyQuestion(models.Model):
|
|||||||
|
|
||||||
records = self.env[record_model].search(domain)
|
records = self.env[record_model].search(domain)
|
||||||
|
|
||||||
new_suggested_answer_ids += [Command.create({'value':record.display_name, 'record_id':f"{record_model},{record.id}"
|
question.suggested_answer_ids = [
|
||||||
}) for record in records]
|
Command.create({
|
||||||
question.suggested_answer_ids = new_suggested_answer_ids
|
'value': record.display_name,
|
||||||
|
'record_id': f"{record_model},{record.id}",
|
||||||
|
})
|
||||||
|
for record in records
|
||||||
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
from . import test_survey_record_creation
|
from . import test_survey_record_creation
|
||||||
|
from . import test_referenced_record_protection
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
from odoo.exceptions import UserError
|
||||||
|
from odoo.addons.survey.tests.common import SurveyCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestReferencedRecordProtection(SurveyCase):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.survey = self.env["survey.survey"].create({"title": "Test Survey"})
|
||||||
|
self.res_partner_model = self.env["ir.model"]._get("res.partner")
|
||||||
|
self.survey_record_creation = self.env["survey.record.creation"].create(
|
||||||
|
{
|
||||||
|
"name": "Contact",
|
||||||
|
"survey_id": self.survey.id,
|
||||||
|
"model_id": self.res_partner_model.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_unlink_blocked_when_referenced_via_many2one(self):
|
||||||
|
title = self.env["res.partner.title"].create({"name": "Mister"})
|
||||||
|
title_field = self.env["ir.model.fields"].search(
|
||||||
|
[("model", "=", "res.partner"), ("name", "=", "title")]
|
||||||
|
)
|
||||||
|
self.env["survey.record.creation.field.values"].create(
|
||||||
|
{
|
||||||
|
"survey_record_creation_id": self.survey_record_creation.id,
|
||||||
|
"field_id": title_field.id,
|
||||||
|
"value_origin": "fixed",
|
||||||
|
"fixed_value_many2one": f"res.partner.title,{title.id}",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(UserError) as ctx:
|
||||||
|
title.unlink()
|
||||||
|
self.assertIn("Test Survey", str(ctx.exception))
|
||||||
|
self.assertIn("Mister", str(ctx.exception))
|
||||||
|
|
||||||
|
def test_unlink_blocked_when_referenced_via_many2many(self):
|
||||||
|
category = self.env["res.partner.category"].create({"name": "Adult"})
|
||||||
|
category_field = self.env["ir.model.fields"].search(
|
||||||
|
[("model", "=", "res.partner"), ("name", "=", "category_id")]
|
||||||
|
)
|
||||||
|
field_values = self.env["survey.record.creation.field.values"].create(
|
||||||
|
{
|
||||||
|
"survey_record_creation_id": self.survey_record_creation.id,
|
||||||
|
"field_id": category_field.id,
|
||||||
|
"value_origin": "fixed",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.env["survey.record.creation.field.values.x2m"].create(
|
||||||
|
{
|
||||||
|
"survey_record_creation_field_values_id": field_values.id,
|
||||||
|
"value_reference": f"res.partner.category,{category.id}",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(UserError) as ctx:
|
||||||
|
category.unlink()
|
||||||
|
self.assertIn("Test Survey", str(ctx.exception))
|
||||||
|
self.assertIn("Adult", str(ctx.exception))
|
||||||
|
|
||||||
|
def test_unlink_allowed_when_not_referenced(self):
|
||||||
|
title = self.env["res.partner.title"].create({"name": "Sir"})
|
||||||
|
# No survey config references this title
|
||||||
|
title.unlink()
|
||||||
|
self.assertFalse(title.exists())
|
||||||
|
|
||||||
|
def test_unlink_allowed_after_removing_survey_config(self):
|
||||||
|
title = self.env["res.partner.title"].create({"name": "Mister"})
|
||||||
|
title_field = self.env["ir.model.fields"].search(
|
||||||
|
[("model", "=", "res.partner"), ("name", "=", "title")]
|
||||||
|
)
|
||||||
|
field_values = self.env["survey.record.creation.field.values"].create(
|
||||||
|
{
|
||||||
|
"survey_record_creation_id": self.survey_record_creation.id,
|
||||||
|
"field_id": title_field.id,
|
||||||
|
"value_origin": "fixed",
|
||||||
|
"fixed_value_many2one": f"res.partner.title,{title.id}",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
field_values.unlink()
|
||||||
|
title.unlink()
|
||||||
|
self.assertFalse(title.exists())
|
||||||
|
|
||||||
|
def test_unlink_allowed_during_module_uninstall(self):
|
||||||
|
title = self.env["res.partner.title"].create({"name": "Mister"})
|
||||||
|
title_field = self.env["ir.model.fields"].search(
|
||||||
|
[("model", "=", "res.partner"), ("name", "=", "title")]
|
||||||
|
)
|
||||||
|
self.env["survey.record.creation.field.values"].create(
|
||||||
|
{
|
||||||
|
"survey_record_creation_id": self.survey_record_creation.id,
|
||||||
|
"field_id": title_field.id,
|
||||||
|
"value_origin": "fixed",
|
||||||
|
"fixed_value_many2one": f"res.partner.title,{title.id}",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
title.with_context(module_uninstall=True).unlink()
|
||||||
|
self.assertFalse(title.exists())
|
||||||
Reference in New Issue
Block a user