Files
fa-agent/finance/management/commands/import_file.py
T
2026-09-26 01:12:10 +08:00

55 lines
2.1 KiB
Python

from pathlib import Path
from django.contrib.auth.models import User
from django.core.files import File
from django.core.management.base import BaseCommand, CommandError
from finance.importing import file_digest, profile_file, suggest_mapping, validate_mapping
from finance.models import Audit, Dataset
class Command(BaseCommand):
help = "Import a local source using reviewed field aliases and lookup rates"
def add_arguments(self, parser):
parser.add_argument("path")
parser.add_argument("--username", required=True)
parser.add_argument("--confirm-mapping", action="store_true")
def handle(self, *args, **options):
user = User.objects.get(username=options["username"])
if user.membership.role != "admin" or user.membership.departments:
raise CommandError("Full administrator required")
path = Path(options["path"])
profile = profile_file(path)
mapping = validate_mapping(suggest_mapping(profile), profile)
if not options["confirm_mapping"]:
self.stdout.write(str(mapping))
self.stdout.write("Review mapping, then rerun with --confirm-mapping")
return
with path.open("rb") as source:
file = File(source, name=path.name)
digest = file_digest(file)
ds = Dataset.objects.filter(organization=user.membership.organization, sha256=digest).first()
if ds:
self.stdout.write(f"Existing version: {ds.pk} {ds.status}")
return
ds = Dataset.objects.create(
organization=user.membership.organization,
created_by=user,
name=path.name,
file=file,
sha256=digest,
mapping=mapping,
profile=profile,
status="queued",
)
Audit.objects.create(
organization=user.membership.organization,
user=user,
action="dataset.cli_import",
resource=str(ds.pk),
details={"mapping": mapping},
)
self.stdout.write(f"{ds.pk}: queued; import_worker will process this version")