This commit is contained in:
xoliqberdiyev
2026-04-18 16:48:32 +05:00
parent 965328edd4
commit 182b2483bf
9 changed files with 23124 additions and 22 deletions

View File

@@ -0,0 +1,144 @@
import json
import os
from django.core.management.base import BaseCommand
from django.db import transaction
from core.apps.shared.models import RegionModel, DistrictModel, VillageModel
class Command(BaseCommand):
help = "Import regions, districts, and neighborhoods from JSON files."
def add_arguments(self, parser):
parser.add_argument('--path', type=str, default='JSON/', help='Path to JSON files directory')
def transliterate_uz_to_en(self, text):
"""Simple transliteration for English names"""
if not text:
return ""
mapping = {
"o'": "o", "O'": "O",
"g'": "g", "G'": "G",
"sh": "sh", "Sh": "Sh",
"ch": "ch", "Ch": "Ch",
"ng": "ng", "Ng": "Ng",
"q": "q", "Q": "Q",
"yo": "yo", "Yo": "Yo",
"yu": "yu", "Yu": "Yu",
"ya": "ya", "Ya": "Ya",
"ye": "ye", "Ye": "Ye",
"o": "o", "O": "O",
"g": "g", "G": "G",
}
res = text
for k, v in mapping.items():
res = res.replace(k, v)
replacements = {
"viloyati": "Region",
"viloyat": "Region",
"tumani": "District",
"tuman": "District",
"shahri": "City",
"shahar": "City",
"Respublikasi": "Republic",
}
for k, v in replacements.items():
res = res.replace(k, v)
res = res.replace(k.capitalize(), v)
return res.strip()
def handle(self, *args, **options):
path = options['path']
regions_file = os.path.join(path, 'regions.json')
districts_file = os.path.join(path, 'districts.json')
villages_file = os.path.join(path, 'villages.json')
try:
with transaction.atomic():
# 1. Import Regions
self.stdout.write("Importing Regions...")
if os.path.exists(regions_file):
with open(regions_file, 'r', encoding='utf-8-sig') as f:
regions_data = json.load(f)
for item in regions_data:
name_uz = item.get('name_uz', '')
name_ru = item.get('name_ru', '') or name_uz
name_en = self.transliterate_uz_to_en(name_uz)
# Use get_or_create to avoid duplicates if ID matches or name matches
# Actually, it's better to use our own internal IDs if we want to link them
# But since many JSON files use these IDs, we'll store them as a reference or use them directly if we reset the DB
region, created = RegionModel.objects.update_or_create(
id=item['id'],
defaults={
'name_uz': name_uz,
'name_ru': name_ru,
'name_en': name_en,
}
)
# 2. Import Districts
self.stdout.write("Importing Districts...")
if os.path.exists(districts_file):
with open(districts_file, 'r', encoding='utf-8-sig') as f:
districts_data = json.load(f)
for item in districts_data:
name_uz = item.get('name_uz', '')
name_ru = item.get('name_ru', '') or name_uz
name_en = self.transliterate_uz_to_en(name_uz)
region_id = item.get('region_id')
if not RegionModel.objects.filter(id=region_id).exists():
self.stdout.write(self.style.WARNING(f"Region {region_id} not found for district {name_uz}"))
continue
DistrictModel.objects.update_or_create(
id=item['id'],
defaults={
'region_id': region_id,
'name_uz': name_uz,
'name_ru': name_ru,
'name_en': name_en,
}
)
# 3. Import Neighborhoods (Villages)
self.stdout.write("Importing Neighborhoods (Villages)...")
if os.path.exists(villages_file):
with open(villages_file, 'r', encoding='utf-8-sig') as f:
villages_data = json.load(f)
count = 0
total = len(villages_data)
for item in villages_data:
name_uz = item.get('name_uz', '')
name_ru = item.get('name_ru', '') or name_uz
name_en = self.transliterate_uz_to_en(name_uz)
district_id = item.get('district_id')
if not DistrictModel.objects.filter(id=district_id).exists():
continue
NeighborhoodModel.objects.update_or_create(
id=item['id'],
defaults={
'district_id': district_id,
'name_uz': name_uz,
'name_ru': name_ru,
'name_en': name_en,
}
)
count += 1
if count % 1000 == 0:
self.stdout.write(f"Processed {count}/{total} neighborhoods...")
self.stdout.write(self.style.SUCCESS("Import completed successfully!"))
except Exception as e:
self.stdout.write(self.style.ERROR(f"Error: {str(e)}"))