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 @@ +
+