from __future__ import annotations from pathlib import Path from urllib.parse import urlparse from django.db.models import Q from django.core.management.base import BaseCommand, CommandError from apps.jobs.models import JobPosting from apps.jobs.services.scoring import rescore_jobs_with_profiles from apps.jobs.services.geocoding import import_csv_geodata, validate_csv_geodata class Command(BaseCommand): help = "Importeer een lokaal Belgische postcodetabelbestand (CSV) als geocodebron." def add_arguments(self, parser): parser.add_argument("path", help="Pad naar CSV met postcode/gemeente-rijen.") parser.add_argument("--source-name", default="local", help="Bronnaam voor deze dataset.") parser.add_argument( "--dataset-version", default="manual", help="Versie/identificatie van deze bron.", ) parser.add_argument( "--license-name", default="", help="Optionele licentienaam voor bronmetadata." ) parser.add_argument( "--license-url", default="", help="Optionele licentielink voor bronmetadata." ) parser.add_argument( "--validate-only", action="store_true", help="Alleen valideren, niet importeren." ) parser.add_argument( "--replace", action="store_true", help="Bestaande lookuprecords voor bron+versie eerst wissen.", ) @staticmethod def _validate_metadata(license_name: str, license_url: str) -> None: if bool(license_name) != bool(license_url): raise CommandError( "Vul --license-name en --license-url altijd samen in of laat beide leeg." ) if license_url: parsed = urlparse(license_url) if not parsed.scheme or not parsed.netloc: raise CommandError("license-url moet een geldige absolute URL zijn.") def handle(self, *args, **options): path = Path(options["path"]) self._validate_metadata(options["license_name"], options["license_url"]) count, _ = validate_csv_geodata(path) if options["validate_only"]: self.stdout.write(self.style.SUCCESS(f"Validatie geslaagd ({count} rijen).")) return imported, postalcodes, municipalities = import_csv_geodata( path, source_name=options["source_name"], source_version=options["dataset_version"], source_license_name=options["license_name"], source_license_url=options["license_url"], replace=options["replace"], ) self.stdout.write( self.style.SUCCESS(f"Geocodebron geimporteerd ({imported} lookuprijen) uit {path}.") ) jobs_to_rescore = JobPosting.objects.filter(status=JobPosting.Status.ACTIVE).filter( Q(postal_code__in=postalcodes) | Q(municipality__in=municipalities) ) if jobs_to_rescore.exists(): scored = rescore_jobs_with_profiles(jobs_to_rescore) self.stdout.write( self.style.NOTICE(f"{scored} scoreregels herberekend voor aangepaste geodata.") )