diff --git a/dynamic_csv_importer/README.md b/dynamic_csv_importer/README.md index b2384363..fe046dd5 100644 --- a/dynamic_csv_importer/README.md +++ b/dynamic_csv_importer/README.md @@ -48,6 +48,10 @@ Já na segunda tabela é onde será configurado os dados da importação. Caso tenha selecionado um arquivo por engano, é possivel trocar o arquivo sem ter que fechar e abrir o wizard novamente. +O campo **Criar objeto caso não for encontrado** é para casos onde não há registros +no sistema com os dados informados nas linhas selecionadas como **Identificador**. +Nesses casos, um registro será criado, com os atributos passados como identificadores. + ### Tabela de Importação ### Cada linha dessa tabela é uma coluna do arquivo .csv importado. Logo, se o arquivo @@ -80,11 +84,14 @@ Exemplo: Se a linha 'name' for selecionada como identificadora, na hora de importar, o sistema irá procurar pro um registro do modelo selecionado que tenha o nome igual ao valor passado no arquivo .csv. -Caso nenhum registro for encontrado, um registro será criado, com o atributo -passado como identificador. +**PS: É altamente recomendável selecionar a opção _Campo não nulo_ nesses campos!** +Isso porque não é possivel, e também faz pouco sentido atualizar/criar/identificar +qualquer objeto com valor nulo. **Campo não nulo?**: As linhas que tiverem essa opção selecionada não poderão ter valores vazios. Caso tenha, será mostrado na tela as linhas que tiveram problemas. +É altamente recomendado que selecione essa opção em linhas com informações importantes, +como linhas identificadoras. **Criar caso não encontrar?**: Essa opção permite que o usuário crie um registro com o valor passado caso ele não exista no sistema. diff --git a/dynamic_csv_importer/wizard/dynamic_csv_importer.py b/dynamic_csv_importer/wizard/dynamic_csv_importer.py index 4bf4b4db..322c7c80 100644 --- a/dynamic_csv_importer/wizard/dynamic_csv_importer.py +++ b/dynamic_csv_importer/wizard/dynamic_csv_importer.py @@ -22,12 +22,19 @@ class DynamicCsvImport(models.TransientModel): csv_quote_char = fields.Char( string=u'Quotation Char', size=3, default='"') - table_html = fields.Html(readonly=True) + table_html = fields.Html(readonly="1") coluna_ids = fields.One2many( 'dynamic.import.line', 'importer_id', string="Columns") import_success = fields.Boolean(default=False) + create_if_not_found = fields.Boolean( + default=False, string="Create model object if not found?") + + warnings = fields.Text(string='Warnings', readonly="1") + + has_warning = fields.Boolean(default=False) + @api.onchange('csv_file', 'has_quote_char', 'csv_quote_char', 'model_id', 'csv_delimiter') def _onchange_csv_file(self): @@ -97,9 +104,12 @@ def action_import(self): continue lista.append((object_ids, vals, line)) + # TODO: criar um arquivo .csv com as linhas que deram errado para + # facilitar o processo. if errors: raise UserError(errors) + warnings = "" for item in lista: object_ids = item[0] vals = item[1] @@ -108,6 +118,17 @@ def action_import(self): for obj in object_ids: obj.write(vals) else: + if not self.create_if_not_found: + for ident_line in identification_lines: + if line[ident_line.name]: + warnings += ident_line.name + ': ' + \ + line[ident_line.name] + _(' not found.\ + Line ignored. \n') + else: + warnings += ident_line.name + _(' has no value.\ + Line ignored. \n') + continue + ident_vals, error = self._prepare_vals( line, identification_lines, obj_dict, has_match_obj=False) @@ -127,6 +148,8 @@ def action_import(self): raise UserError(res['messages'][0]['message']) self.import_success = True + self.warnings = warnings + # Maintaining wizard open return { "type": "set_scrollTop", diff --git a/dynamic_csv_importer/wizard/dynamic_csv_importer_view.xml b/dynamic_csv_importer/wizard/dynamic_csv_importer_view.xml index 1421454b..c5e10fe2 100644 --- a/dynamic_csv_importer/wizard/dynamic_csv_importer_view.xml +++ b/dynamic_csv_importer/wizard/dynamic_csv_importer_view.xml @@ -13,6 +13,7 @@ + @@ -58,6 +59,9 @@ + + +