Add --continue-on-error option to import_drops command for error handling
This commit is contained in:
parent
97df0b342b
commit
207b41ec49
1 changed files with 81 additions and 17 deletions
|
|
@ -69,6 +69,11 @@ class Command(BaseCommand):
|
||||||
default="processed",
|
default="processed",
|
||||||
help="Subdirectory to move processed files to",
|
help="Subdirectory to move processed files to",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--continue-on-error",
|
||||||
|
action="store_true",
|
||||||
|
help="Continue processing if an error occurs.",
|
||||||
|
)
|
||||||
|
|
||||||
def handle(self, **options) -> None:
|
def handle(self, **options) -> None:
|
||||||
"""Execute the command.
|
"""Execute the command.
|
||||||
|
|
@ -79,33 +84,88 @@ class Command(BaseCommand):
|
||||||
Raises:
|
Raises:
|
||||||
CommandError: If the file/directory doesn't exist, isn't a JSON file,
|
CommandError: If the file/directory doesn't exist, isn't a JSON file,
|
||||||
or has an invalid JSON structure.
|
or has an invalid JSON structure.
|
||||||
|
ValueError: If the JSON file has an invalid structure.
|
||||||
|
TypeError: If the JSON file has an invalid structure.
|
||||||
|
AttributeError: If the JSON file has an invalid structure.
|
||||||
|
KeyError: If the JSON file has an invalid structure.
|
||||||
|
IndexError: If the JSON file has an invalid structure.
|
||||||
"""
|
"""
|
||||||
paths: list[str] = options["paths"]
|
paths: list[str] = options["paths"]
|
||||||
processed_dir: str = options["processed_dir"]
|
processed_dir: str = options["processed_dir"]
|
||||||
|
continue_on_error: bool = options["continue_on_error"]
|
||||||
|
|
||||||
for p in paths:
|
for p in paths:
|
||||||
|
try:
|
||||||
path: Path = Path(p)
|
path: Path = Path(p)
|
||||||
processed_path: Path = path / processed_dir
|
processed_path: Path = path / processed_dir
|
||||||
processed_path.mkdir(exist_ok=True)
|
processed_path.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
self.validate_path(path)
|
||||||
|
self.process_drops(continue_on_error=continue_on_error, path=path, processed_path=processed_path)
|
||||||
|
|
||||||
|
except CommandError as e:
|
||||||
|
if not continue_on_error:
|
||||||
|
raise
|
||||||
|
self.stdout.write(self.style.ERROR(f"Error processing path {p}: {e}"))
|
||||||
|
except (ValueError, TypeError, AttributeError, KeyError, IndexError):
|
||||||
|
if not continue_on_error:
|
||||||
|
raise
|
||||||
|
self.stdout.write(self.style.ERROR(f"Data error processing path {p}"))
|
||||||
|
self.stdout.write(self.style.ERROR(traceback.format_exc()))
|
||||||
|
|
||||||
|
def process_drops(self, *, continue_on_error: bool, path: Path, processed_path: Path) -> None:
|
||||||
|
"""Process drops from a file or directory.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
continue_on_error: Continue processing if an error occurs.
|
||||||
|
path: The path to process.
|
||||||
|
processed_path: Name of subdirectory to move processed files to.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
CommandError: If the file/directory doesn't exist, isn't a JSON file,
|
||||||
|
or has an invalid JSON structure.
|
||||||
|
"""
|
||||||
|
if path.is_file():
|
||||||
|
self._process_file(file_path=path, processed_path=processed_path)
|
||||||
|
elif path.is_dir():
|
||||||
|
self._process_directory(
|
||||||
|
directory=path,
|
||||||
|
processed_path=processed_path,
|
||||||
|
continue_on_error=continue_on_error,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
msg: str = f"Path {path} is neither a file nor a directory"
|
||||||
|
raise CommandError(msg)
|
||||||
|
|
||||||
|
def validate_path(self, path: Path) -> None:
|
||||||
|
"""Validate that the path exists.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The path to validate.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
CommandError: If the path does not exist.
|
||||||
|
"""
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
msg: str = f"Path {path} does not exist"
|
msg: str = f"Path {path} does not exist"
|
||||||
raise CommandError(msg)
|
raise CommandError(msg)
|
||||||
|
|
||||||
if path.is_file():
|
def _process_directory(self, *, directory: Path, processed_path: Path, continue_on_error: bool) -> None:
|
||||||
self._process_file(file_path=path, processed_path=processed_path)
|
|
||||||
elif path.is_dir():
|
|
||||||
self._process_directory(directory=path, processed_path=processed_path)
|
|
||||||
else:
|
|
||||||
msg = f"Path {path} is neither a file nor a directory"
|
|
||||||
raise CommandError(msg)
|
|
||||||
|
|
||||||
def _process_directory(self, directory: Path, processed_path: Path) -> None:
|
|
||||||
"""Process all JSON files in a directory using parallel processing.
|
"""Process all JSON files in a directory using parallel processing.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
directory: Path to the directory.
|
directory: Path to the directory.
|
||||||
processed_path: Name of subdirectory to move processed files to.
|
processed_path: Name of subdirectory to move processed files to.
|
||||||
|
continue_on_error: Continue processing if an error occurs.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
CommandError: If the file/directory doesn't exist, isn't a JSON file,
|
||||||
|
or has an invalid JSON structure.
|
||||||
|
ValueError: If the JSON file has an invalid structure.
|
||||||
|
TypeError: If the JSON file has an invalid structure.
|
||||||
|
AttributeError: If the JSON file has an invalid structure.
|
||||||
|
KeyError: If the JSON file has an invalid structure.
|
||||||
|
IndexError: If the JSON file has an invalid structure.
|
||||||
"""
|
"""
|
||||||
json_files: list[Path] = list(directory.glob("*.json"))
|
json_files: list[Path] = list(directory.glob("*.json"))
|
||||||
if not json_files:
|
if not json_files:
|
||||||
|
|
@ -120,8 +180,12 @@ class Command(BaseCommand):
|
||||||
try:
|
try:
|
||||||
self._process_file(json_file, processed_path)
|
self._process_file(json_file, processed_path)
|
||||||
except CommandError as e:
|
except CommandError as e:
|
||||||
|
if not continue_on_error:
|
||||||
|
raise
|
||||||
self.stdout.write(self.style.ERROR(f"Error processing {json_file}: {e}"))
|
self.stdout.write(self.style.ERROR(f"Error processing {json_file}: {e}"))
|
||||||
except (ValueError, TypeError, AttributeError, KeyError, IndexError):
|
except (ValueError, TypeError, AttributeError, KeyError, IndexError):
|
||||||
|
if not continue_on_error:
|
||||||
|
raise
|
||||||
self.stdout.write(self.style.ERROR(f"Data error processing {json_file}"))
|
self.stdout.write(self.style.ERROR(f"Data error processing {json_file}"))
|
||||||
self.stdout.write(self.style.ERROR(traceback.format_exc()))
|
self.stdout.write(self.style.ERROR(traceback.format_exc()))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue