diff options
-rw-r--r-- | ishtar_common/data_importer.py | 64 | ||||
-rw-r--r-- | ishtar_common/management/commands/ishtar_import.py | 15 | ||||
-rw-r--r-- | ishtar_common/models_imports.py | 4 |
3 files changed, 60 insertions, 23 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 46658f43d..0572a30a5 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -44,6 +44,7 @@ from ishtar_common.utils import ( get_current_profile, get_file_from_link, update_data, + BColors ) @@ -898,14 +899,25 @@ class Importer(object): self.errors.append((idx_line, None, msg)) return item - def post_import(self): + def post_import(self, verbose=False): related_list = {} if self.import_instance and not self.line_to_process: self.import_instance.state = "PP" self.import_instance.imported_line_numbers = "" self.import_instance.save() self.timestamp = int(datetime.datetime.now().timestamp()) - for cls_pk, idx_line in self.post_save_items.items(): + items = self.post_save_items.items() + start = datetime.datetime.now() + total = len(items) + for cls_pk, idx_line in items: + if verbose: + txt = BColors.OKBLUE + f"\r\t- post-import: {idx_line + 1}/{total}" + left = self._get_eta(idx_line, total, start) + if left: + txt += f" ({left} seconds left)" + txt += BColors.ENDC + sys.stdout.write(txt) + sys.stdout.flush() if self.import_instance and not self.line_to_process: self.import_instance.add_imported_line(idx_line) cls, pk = cls_pk @@ -923,6 +935,12 @@ class Importer(object): if hasattr(item, "fix"): # post save/m2m specific fix item.fix() + if verbose: + elapsed = datetime.datetime.now() - start + txt = BColors.OKBLUE + f"\r\t- import: {total} items post treated in {elapsed}\n" + txt += BColors.ENDC + sys.stdout.write(txt) + sys.stdout.flush() for cls, pk in related_list.keys(): try: item = cls.objects.get(pk=pk) @@ -990,6 +1008,7 @@ class Importer(object): user=None, line_to_process=None, simulate=False, + verbose=False ): if initialize: self.initialize( @@ -997,7 +1016,7 @@ class Importer(object): ) self.simulate = simulate self.line_to_process = line_to_process - return self._importation(table) + return self._importation(table, verbose=verbose) def get_current_values(self, obj): return obj @@ -1059,7 +1078,16 @@ class Importer(object): current_data = current_data[key] return data - def _importation(self, table): + def _get_eta(self, idx_line, total, start): + left = None + if idx_line > 10: + elapsed = datetime.datetime.now() - start + time_by_item = elapsed / idx_line + if time_by_item: + left = ((total - idx_line) * time_by_item).seconds + return left + + def _importation(self, table, verbose=False): self.match_table = {} table = list(table) if not table or not table[0]: @@ -1093,35 +1121,33 @@ class Importer(object): self.now = datetime.datetime.now() start = datetime.datetime.now() total = len(table) - if self.output == "cli": - sys.stdout.write("\n") results = [] for idx_line, line in enumerate(table): self.idx_line = idx_line + if verbose: + left = self._get_eta(idx_line, total, start) + txt = BColors.OKBLUE + f"\r\t- import: {idx_line + 1}/{total}" + if left: + txt += f" ({left} seconds left)" + sys.stdout.write(txt + BColors.ENDC) + sys.stdout.flush() if self.line_to_process is not None: if self.line_to_process != idx_line: continue if idx_line > self.line_to_process: return results - if self.output == "cli": - left = None - if idx_line > 10: - ellapsed = datetime.datetime.now() - start - time_by_item = ellapsed / idx_line - if time_by_item: - left = ((total - idx_line) * time_by_item).seconds - txt = "\r* %d/%d" % (idx_line + 1, total) - if left: - txt += " (%d seconds left)" % left - sys.stdout.write(txt.encode("utf-8")) - sys.stdout.flush() try: results.append(self._line_processing(idx_line, line)) except ImporterError as import_error: msg = str(import_error) if not any(1 for error in self.IGNORE_ERRORS if error in msg): self.errors.append((idx_line, None, msg)) - self.post_import() + if verbose: + elapsed = datetime.datetime.now() - start + txt = BColors.OKBLUE + f"\r\t- import: {total} items imported in {elapsed}\n" + sys.stdout.write(txt + BColors.ENDC) + sys.stdout.flush() + self.post_import(verbose=verbose) for item in self.to_be_close: item.close() return results diff --git a/ishtar_common/management/commands/ishtar_import.py b/ishtar_common/management/commands/ishtar_import.py index 011af2f8c..3698cfa98 100644 --- a/ishtar_common/management/commands/ishtar_import.py +++ b/ishtar_common/management/commands/ishtar_import.py @@ -4,6 +4,7 @@ from django.core.management.base import BaseCommand, CommandError from ishtar_common import models, models_imports +from ishtar_common.utils import BColors class Command(BaseCommand): @@ -16,10 +17,14 @@ class Command(BaseCommand): parser.add_argument('command', choices=["list", "analyse", "import", "archive"]) parser.add_argument('import_id', nargs='?', default=None) + parser.add_argument( + "--quiet", dest="quiet", action="store_true", help="Quiet output" + ) def handle(self, *args, **options): command = options['command'] import_id = options['import_id'] + quiet = options.get("quiet", False) if command != "list" and not import_id: raise CommandError("With {} <import_id> is mandatory".format( command)) @@ -39,7 +44,7 @@ class Command(BaseCommand): self.stdout.flush() return try: - imp = models.Import.objects.get(pk=args[1]) + imp = models.Import.objects.get(pk=import_id) except (ValueError, models.Import.DoesNotExist): raise CommandError("{} is not a valid import ID".format(args[0])) if command == 'analyse': @@ -47,9 +52,11 @@ class Command(BaseCommand): self.stdout.write("* {} analysed\n".format(imp)) self.stdout.flush() elif command == 'import': - self.stdout.write("* import {}\n".format(imp)) - imp.importation() - self.stdout.write("* {} imported\n".format(imp)) + if not quiet: + self.stdout.write(BColors.OKGREEN + f"* import {imp}{BColors.ENDC}\n") + imp.importation(verbose=not quiet) + if not quiet: + self.stdout.write(BColors.OKGREEN + f"* {imp} imported{BColors.ENDC}\n") self.stdout.flush() elif command == 'archive': imp.archive() diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 2b181165b..836676c03 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -2622,6 +2622,7 @@ class Import(BaseImport): simulate=False, return_importer_and_data=False, request=None, + verbose=False ): self.state = "IP" self.end_date = datetime.datetime.now() @@ -2636,6 +2637,7 @@ class Import(BaseImport): user=self.user, line_to_process=line_to_process, simulate=simulate, + verbose=verbose ) except IOError: error_message = str(_("Error on imported file: {}")).format( @@ -2802,6 +2804,8 @@ class Import(BaseImport): if not self.error_file or not self.error_file.path: ImportLineError.objects.filter(import_item=self).delete() return + if not os.path.isfile(self.error_file.path): + return with open(self.error_file.path, "r") as error_file: reader = csv.reader(error_file) for idx, line in enumerate(reader): |