Source code for ferrosoft.apps.ferromaps.management.commands.store_address_dataset
import csv
from decimal import Decimal
from django.core.management.base import BaseCommand
from ferrosoft.apps.ferrobase.models import CoordinateDecimalField
from ferrosoft.apps.ferromaps.models import GeocodedAddress
from django.db import transaction
[docs]
class Command(BaseCommand):
help = "Load address data from a transformed TSV file into the Address model"
[docs]
def add_arguments(self, parser):
parser.add_argument(
"file",
type=str,
nargs="?",
default="./houses.tsv",
help="The path to the TSV file to load (default: ./houses.tsv)",
)
[docs]
def handle(self, *args, **options):
file_path = options["file"]
batch_size = 10000
objects = []
with open(file_path, "r", encoding="utf-8") as file:
reader = csv.DictReader(file, dialect="excel-tab")
for iteration, row in enumerate(reader, start=1):
address_label = f"{row['street']} {row['house_number']}, {row['postal_code']} {row['city']}"
longitude = CoordinateDecimalField.round(Decimal(row["x"]))
latitude = CoordinateDecimalField.round(Decimal(row["y"]))
objects.append(
GeocodedAddress(
address_label=address_label,
postal_code=row["postal_code"][
: min(20, len(row["postal_code"]))
],
city=row["city"],
longitude=longitude,
latitude=latitude,
country=row["country"],
street=row["street"],
house_no=row["house_number"][
: min(20, len(row["house_number"]))
],
)
)
if len(objects) >= batch_size:
with transaction.atomic():
print(".", end="", flush=True)
GeocodedAddress.objects.bulk_create(objects)
objects.clear()
if objects:
with transaction.atomic():
GeocodedAddress.objects.bulk_create(objects)
self.stdout.write(self.style.SUCCESS("\nSuccessfully loaded address data."))