[IMP] survey_record_generation: add unicity check

This commit is contained in:
clementthomas
2025-02-21 16:30:20 +01:00
parent bf78651b31
commit 2acd034934
4 changed files with 36 additions and 13 deletions

View File

@@ -11,7 +11,7 @@ class SurveyQuestion(models.Model):
_inherit = 'survey.question' _inherit = 'survey.question'
model_id = fields.Many2one('ir.model', string="Model") model_id = fields.Many2one('ir.model', string="Model")
answer_values_type = fields.Selection([('no', 'No values'),('value','Value'),('record','Record')]) answer_values_type = fields.Selection([('no', 'No values'),('value','Value'),('record','Record')], string="Associate value to answer", default="no", required=True)
@api.onchange('model_id') @api.onchange('model_id')
def onchange_model_id(self): def onchange_model_id(self):

View File

@@ -10,15 +10,15 @@ _logger = logging.getLogger(__name__)
type_mapping = { type_mapping = {
"char": ["char_box", "numerical_box", "date", "datetime", "simple_choice", "multiple_choice"], "char": ["char_box", "numerical_box", "date", "datetime", "simple_choice", "multiple_choice"],
"text": ["char_box", "date"], "text": ["char_box", "date", "simple_choice"],
"html": ["text_box", "numerical_box", "datetime", "simple_choice", "multiple_choice"], "html": ["text_box", "numerical_box", "datetime", "simple_choice"],
"integer": ["numerical_box"], "integer": ["numerical_box"],
"float": ["numerical_box"], "float": ["numerical_box"],
"date": ["date"], "date": ["date"],
"datetime": ["datetime"], "datetime": ["datetime"],
"many2one": ["simple_choice"], "many2one": ["simple_choice"],
"many2many": ["multiple_choice"], "many2many": ["multiple_choice"],
"selection": ["char_box"] "selection": ["char_box", "simple_choice"]
} }
@@ -33,7 +33,8 @@ class SurveyRecordCreationFieldValues(models.Model):
field_id = fields.Many2one( field_id = fields.Many2one(
'ir.model.fields', 'ir.model.fields',
domain="[('model_id','=',model_id),('readonly','=',False),('ttype','in',['char','selection','text','html','integer','float','date','datetime','many2one','many2many'])]") domain="[('model_id','=',model_id),('readonly','=',False),('ttype','in',['char','selection','text','html','integer','float','date','datetime','many2one','many2many'])]",
ondelete="cascade")
field_relation = fields.Char(related='field_id.relation') field_relation = fields.Char(related='field_id.relation')
field_type = fields.Selection(related="field_id.ttype") field_type = fields.Selection(related="field_id.ttype")
field_help = fields.Html('Help', compute="_compute_field_help") field_help = fields.Html('Help', compute="_compute_field_help")
@@ -64,6 +65,8 @@ class SurveyRecordCreationFieldValues(models.Model):
allowed_question_ids = fields.Many2many('survey.question', compute='_compute_allowed_question_ids') allowed_question_ids = fields.Many2many('survey.question', compute='_compute_allowed_question_ids')
question_id = fields.Many2one('survey.question', string="Question", domain="[('id','in',allowed_question_ids)]") question_id = fields.Many2one('survey.question', string="Question", domain="[('id','in',allowed_question_ids)]")
unicity_check = fields.Boolean('Unicity constraint', help="On record creation, if another record exists with same value, record will not be created.")
@api.depends("field_id") @api.depends("field_id")
def _compute_field_help(self): def _compute_field_help(self):
for record in self: for record in self:
@@ -79,7 +82,10 @@ class SurveyRecordCreationFieldValues(models.Model):
if not record_creation_field_values.survey_id or not record_creation_field_values.field_id: if not record_creation_field_values.survey_id or not record_creation_field_values.field_id:
record_creation_field_values.allowed_question_ids = None record_creation_field_values.allowed_question_ids = None
return return
question_domain = [('survey_id','=',record_creation_field_values.survey_id.id),'|','&',('answer_values_type','=','record'),('model_id','=',record_creation_field_values.field_id.relation),('answer_values_type','=','value')] question_domain = [('survey_id','=',record_creation_field_values.survey_id.id)]
if record_creation_field_values.field_id.ttype in ['many2one','many2many']:
question_domain.extend(['|','&',('answer_values_type','=','record'),('model_id','=',record_creation_field_values.field_id.relation),('answer_values_type','=','value')])
if record_creation_field_values.field_id.ttype in type_mapping: if record_creation_field_values.field_id.ttype in type_mapping:
question_domain.append(('question_type','in',type_mapping[record_creation_field_values.field_id.ttype])) question_domain.append(('question_type','in',type_mapping[record_creation_field_values.field_id.ttype]))

View File

@@ -22,8 +22,11 @@ class SurveyUserInput(models.Model):
# find user_input_lines of the question # find user_input_lines of the question
user_input_lines = [user_input_line for user_input_line in user_input.user_input_line_ids if user_input_line.question_id == field_value.question_id] user_input_lines = [user_input_line for user_input_line in user_input.user_input_line_ids if user_input_line.question_id == field_value.question_id]
if not user_input_lines:
continue
if field_value.question_id.question_type in ['simple_choice', 'multiple_choice','matrix']: if field_value.question_id.question_type in ['simple_choice', 'multiple_choice','matrix']:
if field_value.question_id.answer_value_type == 'record': if field_value.question_id.answer_values_type == 'record':
record_ids = [] record_ids = []
for user_input_line in user_input_lines: for user_input_line in user_input_lines:
if user_input_line.suggested_answer_id and user_input_line.suggested_answer_id.record_id: if user_input_line.suggested_answer_id and user_input_line.suggested_answer_id.record_id:
@@ -32,16 +35,28 @@ class SurveyUserInput(models.Model):
vals[field_value.field_id.name] = record_ids[0] vals[field_value.field_id.name] = record_ids[0]
else: else:
vals[field_value.field_id.name] = record_ids vals[field_value.field_id.name] = record_ids
if field_value.question_id.answer_value_type == 'value': if field_value.question_id.answer_values_type == 'value':
vals[field_value.field_id.name] = user_input_line.suggested_answer_id.value_char vals[field_value.field_id.name] = user_input_lines[0].suggested_answer_id.value_char
else: else:
user_input_line = user_input_lines[0] vals[field_value.field_id.name] = user_input_lines[0][f"value_{user_input_lines[0].answer_type}"]
vals[field_value.field_id.name] = user_input_line[0][f"value_{user_input_line.answer_type}"]
elif field_value.value_origin == 'other_record': elif field_value.value_origin == 'other_record':
fields_to_update.append(field_value) fields_to_update.append(field_value)
# Create record # check duplicates
record = self.env[model].create(vals) uniq_fields = [field_value.field_id.name for field_value in record_creation.field_values_ids.filtered(lambda r:r.unicity_check)]
duplicate = None
if uniq_fields:
uniq_domain = []
for uniq_field in uniq_fields:
uniq_domain.append((uniq_field,'=',vals[uniq_field]))
duplicate = self.env[model].search(uniq_domain, limit=1)
if duplicate:
record = duplicate
else:
# Create record
record = self.env[model].create(vals)
created_records[record_creation.id] = record created_records[record_creation.id] = record
# update linked records # update linked records

View File

@@ -21,11 +21,13 @@
<tree> <tree>
<field name="field_id" /> <field name="field_id" />
<field name="displayed_value" /> <field name="displayed_value" />
<field name="unicity_check" />
</tree> </tree>
<form> <form>
<group> <group>
<field name="model_id" invisible="1" /> <field name="model_id" invisible="1" />
<field name="field_id" /> <field name="field_id" />
<field name="unicity_check" />
<field name="field_relation" invisible="1" /> <field name="field_relation" invisible="1" />
<field name="field_type" invisible="1" /> <field name="field_type" invisible="1" />
<div colspan="2"> <div colspan="2">