[IMP] survey_record_generation: feature be able to update existing record
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m38s
Some checks failed
pre-commit / pre-commit (pull_request) Failing after 1m38s
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
@@ -13,16 +12,38 @@ class SurveyRecordCreation(models.Model):
|
||||
|
||||
name = fields.Char('Name')
|
||||
survey_id = fields.Many2one('survey.survey', string="Survey")
|
||||
model_id = fields.Many2one('ir.model', "Model", help="Model of generated record")
|
||||
model_id = fields.Many2one('ir.model', "Model", help="Model of generated record")
|
||||
field_values_ids = fields.One2many('survey.record.creation.field.values', 'survey_record_creation_id', string="Field values")
|
||||
warning_message = fields.Html('Warning message', compute="_compute_warning_message")
|
||||
sequence = fields.Integer("sequence")
|
||||
|
||||
@api.onchange('model_id')
|
||||
update_existing_records = fields.Boolean(
|
||||
string="Update existing records",
|
||||
)
|
||||
field_to_retrieve_existing_records = fields.Many2one(
|
||||
"ir.model.fields",
|
||||
domain="[('id', 'in', allowed_field_ids), ('readonly', '=', False)]",
|
||||
ondelete="cascade",
|
||||
help="Choose the field you want to use to retrieve the existing record. "
|
||||
"WARNING: We update only the first record found.",
|
||||
)
|
||||
allowed_field_ids = fields.Many2many(
|
||||
"ir.model.fields",
|
||||
compute="_compute_allowed_field_ids",
|
||||
store=True,
|
||||
string="Allowed Fields",
|
||||
)
|
||||
|
||||
@api.depends("field_values_ids.field_id")
|
||||
def _compute_allowed_field_ids(self):
|
||||
for record in self:
|
||||
record.allowed_field_ids = record.field_values_ids.mapped("field_id")
|
||||
|
||||
@api.onchange("model_id")
|
||||
def clear_field_values_ids(self):
|
||||
self.field_values_ids = None
|
||||
|
||||
@api.depends('model_id','field_values_ids')
|
||||
@api.depends("model_id","field_values_ids")
|
||||
def _compute_warning_message(self):
|
||||
for record_creation in self:
|
||||
# check if all mandatory fields set
|
||||
@@ -30,14 +51,10 @@ class SurveyRecordCreation(models.Model):
|
||||
required_field_ids = self.model_id.field_id.filtered(lambda f:f.required and "property_" not in f.name)
|
||||
set_field_ids = self.field_values_ids.field_id
|
||||
missing_fields = required_field_ids - set_field_ids
|
||||
|
||||
|
||||
if missing_fields:
|
||||
record_creation.warning_message = _("Some required fields are not set : %s",', '.join([f"<b>{f.field_description}</b> (<i>{f.name}</i>)" for f in missing_fields]))
|
||||
else:
|
||||
record_creation.warning_message = None
|
||||
else:
|
||||
record_creation.warning_message = None
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -64,12 +64,21 @@ class SurveyUserInput(models.Model):
|
||||
|
||||
vals[field_name] = value
|
||||
|
||||
existing_record = self.find_existing_record(record_creation, vals)
|
||||
|
||||
duplicate = self.find_duplicate_if_there_are_fields_with_unicity_check(
|
||||
model, record_creation, vals
|
||||
)
|
||||
|
||||
if duplicate:
|
||||
record = duplicate
|
||||
elif existing_record:
|
||||
vals_with_keys_not_in_record = {
|
||||
k: v
|
||||
for k, v in vals.items()
|
||||
if not getattr(existing_record, k, False)
|
||||
}
|
||||
record = existing_record.write(vals_with_keys_not_in_record)
|
||||
else:
|
||||
if (
|
||||
model == "res.partner"
|
||||
@@ -110,6 +119,20 @@ class SurveyUserInput(models.Model):
|
||||
|
||||
return super()._mark_done()
|
||||
|
||||
def find_existing_record(
|
||||
self, record_creation: "SurveyRecordCreation", vals: dict
|
||||
) -> Any:
|
||||
if record_creation.update_existing_records:
|
||||
model = record_creation.model_id.model
|
||||
search_field = record_creation.field_to_retrieve_existing_records
|
||||
user_answer_value = vals.get(search_field.name)
|
||||
if user_answer_value:
|
||||
return self.env[model].search(
|
||||
[(search_field.name, "=", user_answer_value)], limit=1
|
||||
)
|
||||
|
||||
return None
|
||||
|
||||
def get_value_based_on_value_origin(
|
||||
self,
|
||||
field_value: "SurveyRecordCreationFieldValues",
|
||||
|
||||
Reference in New Issue
Block a user