79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
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.")
|
|
)
|