[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'
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')
def onchange_model_id(self):

View File

@@ -10,15 +10,15 @@ _logger = logging.getLogger(__name__)
type_mapping = {
"char": ["char_box", "numerical_box", "date", "datetime", "simple_choice", "multiple_choice"],
"text": ["char_box", "date"],
"html": ["text_box", "numerical_box", "datetime", "simple_choice", "multiple_choice"],
"text": ["char_box", "date", "simple_choice"],
"html": ["text_box", "numerical_box", "datetime", "simple_choice"],
"integer": ["numerical_box"],
"float": ["numerical_box"],
"date": ["date"],
"datetime": ["datetime"],
"many2one": ["simple_choice"],
"many2many": ["multiple_choice"],
"selection": ["char_box"]
"selection": ["char_box", "simple_choice"]
}
@@ -33,7 +33,8 @@ class SurveyRecordCreationFieldValues(models.Model):
field_id = fields.Many2one(
'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_type = fields.Selection(related="field_id.ttype")
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')
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")
def _compute_field_help(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:
record_creation_field_values.allowed_question_ids = None
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:
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
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.answer_value_type == 'record':
if field_value.question_id.answer_values_type == 'record':
record_ids = []
for user_input_line in user_input_lines:
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]
else:
vals[field_value.field_id.name] = record_ids
if field_value.question_id.answer_value_type == 'value':
vals[field_value.field_id.name] = user_input_line.suggested_answer_id.value_char
if field_value.question_id.answer_values_type == 'value':
vals[field_value.field_id.name] = user_input_lines[0].suggested_answer_id.value_char
else:
user_input_line = user_input_lines[0]
vals[field_value.field_id.name] = user_input_line[0][f"value_{user_input_line.answer_type}"]
vals[field_value.field_id.name] = user_input_lines[0][f"value_{user_input_lines[0].answer_type}"]
elif field_value.value_origin == 'other_record':
fields_to_update.append(field_value)
# Create record
record = self.env[model].create(vals)
# check duplicates
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
# update linked records