diff --git a/survey_record_generation/models/survey_question.py b/survey_record_generation/models/survey_question.py
index 59ad7b1..7e0f9ff 100644
--- a/survey_record_generation/models/survey_question.py
+++ b/survey_record_generation/models/survey_question.py
@@ -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):
diff --git a/survey_record_generation/models/survey_record_creation_field_values.py b/survey_record_generation/models/survey_record_creation_field_values.py
index c6c8980..ba0e19d 100644
--- a/survey_record_generation/models/survey_record_creation_field_values.py
+++ b/survey_record_generation/models/survey_record_creation_field_values.py
@@ -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]))
diff --git a/survey_record_generation/models/survey_user_input.py b/survey_record_generation/models/survey_user_input.py
index d498c0f..f510a4c 100644
--- a/survey_record_generation/models/survey_user_input.py
+++ b/survey_record_generation/models/survey_user_input.py
@@ -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
diff --git a/survey_record_generation/views/survey_survey_views.xml b/survey_record_generation/views/survey_survey_views.xml
index 7982fbd..44f3ef1 100644
--- a/survey_record_generation/views/survey_survey_views.xml
+++ b/survey_record_generation/views/survey_survey_views.xml
@@ -21,11 +21,13 @@