94 lines
3.5 KiB
Python
94 lines
3.5 KiB
Python
import pandas as pd
|
|
from django.core.management.base import BaseCommand
|
|
from apps.herd.models import Rancher
|
|
from apps.herd.models import Herd
|
|
from apps.authentication.models import Province, City, Organization
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Import Rancher and Herd data from Excel"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('excel_path', type=str)
|
|
|
|
def handle(self, *args, **options):
|
|
path = options['excel_path']
|
|
df = pd.read_excel(path)
|
|
records = df.to_dict(orient='records')
|
|
|
|
self.stdout.write(self.style.SUCCESS(f"{len(records)} records loaded."))
|
|
|
|
ranchers_to_create = []
|
|
herds_to_create = []
|
|
|
|
province_cache = {p.id: p for p in Province.objects.all()}
|
|
city_cache = {c.id: c for c in City.objects.all()}
|
|
org_cache = {o.id: o for o in Organization.objects.all()}
|
|
|
|
for r in records:
|
|
full_name = str(r.get("fullname") or "").strip()
|
|
first_name = full_name.split(" ")[0] if full_name else ""
|
|
last_name = " ".join(full_name.split(" ")[1:]) if len(full_name.split(" ")) > 1 else ""
|
|
|
|
# province = province_cache.get((Province.objects.get(name=r.get("province"))).id)
|
|
province = Province.objects.get(id=1)
|
|
city = City.objects.get(id=1)
|
|
|
|
rancher = Rancher(
|
|
first_name=first_name,
|
|
last_name=last_name,
|
|
mobile=r.get("mobile"),
|
|
national_code=r.get("national_id"),
|
|
address="",
|
|
province=province,
|
|
city=city,
|
|
without_herd=not bool(r.get("herd_code"))
|
|
)
|
|
ranchers_to_create.append(rancher)
|
|
|
|
# ذخیرهی دامداران
|
|
Rancher.objects.bulk_create(ranchers_to_create, batch_size=10000)
|
|
self.stdout.write(self.style.SUCCESS(f"✅ Created {len(ranchers_to_create)} ranchers."))
|
|
|
|
# بازیابی مجدد همهی دامداران برای نگاشت herd
|
|
rancher_cache = {r.national_code: r for r in Rancher.objects.all()}
|
|
|
|
for r in records:
|
|
if not r.get("herd_code"):
|
|
print("not herd code")
|
|
continue
|
|
|
|
province = Province.objects.get(id=1)
|
|
city = City.objects.get(id=1)
|
|
coop = Organization.objects.get(id=1)
|
|
print(f"province {province}")
|
|
print(f"city {city}")
|
|
print(f"coop {coop}")
|
|
|
|
key = r.get("national_id")
|
|
print(f'key {key}')
|
|
rancher = Rancher.objects.get(national_code=key)
|
|
print(f'ranchers {rancher}')
|
|
if not rancher:
|
|
print("not rancher")
|
|
continue
|
|
|
|
herd = Herd(
|
|
code=r.get("herd_code"),
|
|
name=r.get("herd_name"),
|
|
rancher=rancher,
|
|
province=province,
|
|
city=city,
|
|
postal=r.get("postal_code"),
|
|
institution=r.get("unit_id"),
|
|
epidemiologic=r.get("epidemiological_code"),
|
|
cooperative=coop,
|
|
heavy_livestock_number=r.get("heavy_livestock") or 0,
|
|
light_livestock_number=r.get("light_livestock") or 0,
|
|
)
|
|
print(herd)
|
|
herds_to_create.append(herd)
|
|
print(herds_to_create)
|
|
|
|
Herd.objects.bulk_create(herds_to_create, batch_size=10000)
|
|
self.stdout.write(self.style.SUCCESS(f"✅ Created {len(herds_to_create)} herds.")) |