haikal/load_json_data.py
2025-08-27 13:04:41 +03:00

223 lines
8.9 KiB
Python

import os
import django
import json
from django.utils.text import slugify
from tqdm import tqdm
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "car_inventory.settings")
django.setup()
from inventory.models import (
CarMake,
CarModel,
CarSerie,
CarTrim,
CarEquipment,
CarSpecification,
CarSpecificationValue,
CarOption,
CarOptionValue,
)
def run():
with open("database_export.json", "r") as file:
data = json.load(file)
print("Starting data loading...")
def generate_unique_slug(model, field_value, slug_field="slug"):
base_slug = slugify(field_value)
slug = base_slug
counter = 1
while model.objects.filter(**{slug_field: slug}).exists():
slug = f"{base_slug}-{counter}"
counter += 1
return slug
# Step 1: Insert CarMake
for item in tqdm(data["car_make"], desc="Inserting CarMake"):
if not CarMake.objects.filter(id_car_make=item["id_car_make"]).exists():
unique_slug = generate_unique_slug(CarMake, item["name"])
CarMake.objects.create(
id_car_make=item["id_car_make"],
name=item["name"],
# Uncomment if needed:
# arabic_name=item.get("arabic_name", ""),
# logo=item.get("Logo", ""),
# is_sa_import=item.get("is_sa_import", False),
slug=unique_slug,
)
# Step 2: Insert CarModel
for item in tqdm(data["car_model"], desc="Inserting CarModel"):
if not CarModel.objects.filter(id_car_model=item["id_car_model"]).exists():
# Check if related make exists
if CarMake.objects.filter(id_car_make=item["id_car_make"]).exists():
unique_slug = generate_unique_slug(CarModel, item["name"])
CarModel.objects.create(
id_car_model=item["id_car_model"],
id_car_make_id=item["id_car_make"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
slug=unique_slug,
)
# Step 3: Insert CarSerie
for item in tqdm(data["car_serie"], desc="Inserting CarSerie"):
if not CarSerie.objects.filter(id_car_serie=item["id_car_serie"]).exists():
# Check if related model exists
if CarModel.objects.filter(id_car_model=item["id_car_model"]).exists():
unique_slug = generate_unique_slug(CarSerie, item["name"])
CarSerie.objects.create(
id_car_serie=item["id_car_serie"],
id_car_model_id=item["id_car_model"],
name=item["serie_name"],
# arabic_name=item.get("arabic_name", ""),
year_begin=item.get("year_begin"),
year_end=item.get("year_end"),
generation_name=item.get("generation_name", ""),
slug=unique_slug,
)
# Step 4: Insert CarTrim
for item in tqdm(data["car_trim"], desc="Inserting CarTrim"):
if not CarTrim.objects.filter(id_car_trim=item["id_car_trim"]).exists():
# Check if related serie exists
if CarSerie.objects.filter(id_car_serie=item["id_car_serie"]).exists():
unique_slug = generate_unique_slug(CarTrim, item["name"])
CarTrim.objects.create(
id_car_trim=item["id_car_trim"],
id_car_serie_id=item["id_car_serie"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
start_production_year=item["start_production_year"],
end_production_year=item["end_production_year"],
slug=unique_slug,
)
# Step 5: Insert CarEquipment
for item in tqdm(data["car_equipment"], desc="Inserting CarEquipment"):
if not CarEquipment.objects.filter(
id_car_equipment=item["id_car_equipment"]
).exists():
if CarTrim.objects.filter(id_car_trim=item["id_car_trim"]).exists():
unique_slug = generate_unique_slug(CarEquipment, item["name"])
CarEquipment.objects.create(
id_car_equipment=item["id_car_equipment"],
id_car_trim_id=item["id_car_trim"],
name=item["name"],
year_begin=item.get("year"),
slug=unique_slug,
)
# Step 6: Insert CarSpecification (Parent specifications first)
parent_specs = [
item for item in data["car_specification"] if item["id_parent"] is None
]
child_specs = [
item for item in data["car_specification"] if item["id_parent"] is not None
]
for item in tqdm(parent_specs, desc="Inserting Parent CarSpecifications"):
if not CarSpecification.objects.filter(
id_car_specification=item["id_car_specification"]
).exists():
CarSpecification.objects.create(
id_car_specification=item["id_car_specification"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
id_parent_id=None,
)
for item in tqdm(child_specs, desc="Inserting Child CarSpecifications"):
if not CarSpecification.objects.filter(
id_car_specification=item["id_car_specification"]
).exists():
# Check if parent exists
if CarSpecification.objects.filter(
id_car_specification=item["id_parent"]
).exists():
CarSpecification.objects.create(
id_car_specification=item["id_car_specification"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
id_parent_id=item["id_parent"],
)
# Step 7: Insert CarSpecificationValue
for item in tqdm(
data["car_specification_value"], desc="Inserting CarSpecificationValue"
):
if not CarSpecificationValue.objects.filter(
id_car_specification_value=item["id_car_specification_value"]
).exists():
# Check if related objects exist
if (
CarTrim.objects.filter(id_car_trim=item["id_car_trim"]).exists()
and CarSpecification.objects.filter(
id_car_specification=item["id_car_specification"]
).exists()
):
CarSpecificationValue.objects.create(
id_car_specification_value=item["id_car_specification_value"],
id_car_trim_id=item["id_car_trim"],
id_car_specification_id=item["id_car_specification"],
value=item["value"],
unit=item.get("unit", ""),
)
# Step 8: Insert CarOption (Parent options first)
parent_options = [item for item in data["car_option"] if item["id_parent"] is None]
child_options = [
item for item in data["car_option"] if item["id_parent"] is not None
]
for item in tqdm(parent_options, desc="Inserting Parent CarOptions"):
if not CarOption.objects.filter(id_car_option=item["id_car_option"]).exists():
CarOption.objects.create(
id_car_option=item["id_car_option"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
id_parent_id=None,
)
for item in tqdm(child_options, desc="Inserting Child CarOptions"):
if not CarOption.objects.filter(id_car_option=item["id_car_option"]).exists():
# Check if parent exists
if CarOption.objects.filter(id_car_option=item["id_parent"]).exists():
CarOption.objects.create(
id_car_option=item["id_car_option"],
name=item["name"],
# arabic_name=item.get("arabic_name", ""),
id_parent_id=item["id_parent"],
)
# Step 9: Insert CarOptionValue
for item in tqdm(data["car_option_value"], desc="Inserting CarOptionValue"):
if not CarOptionValue.objects.filter(
id_car_option_value=item["id_car_option_value"]
).exists():
# Check if related objects exist
if (
CarEquipment.objects.filter(
id_car_equipment=item["id_car_equipment"]
).exists()
and CarOption.objects.filter(
id_car_option=item["id_car_option"]
).exists()
):
CarOptionValue.objects.create(
id_car_option_value=item["id_car_option_value"],
id_car_option_id=item["id_car_option"],
id_car_equipment_id=item["id_car_equipment"],
is_base=item["is_base"],
)
print("Data population completed successfully.")
if __name__ == "__main__":
run()