Files
Ai/plant/apps.py
T
2026-05-13 22:28:56 +03:30

113 lines
3.5 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from __future__ import annotations
import re
from functools import cached_property
from django.apps import AppConfig
class PlantConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "plant"
verbose_name = "Plant"
@cached_property
def plant_aliases(self) -> dict[str, str]:
return {
"tomato": "گوجه‌فرنگی",
"cucumber": "خیار",
"pepper": "فلفل دلمه‌ای",
"bell pepper": "فلفل دلمه‌ای",
"carrot": "هویج",
"lettuce": "کاهو",
"potato": "سیب‌زمینی",
"onion": "پیاز",
}
@cached_property
def growth_stage_aliases(self) -> dict[str, str]:
return {
"initial": "initial",
"seedling": "initial",
"establishment": "initial",
"جوانه زنی": "initial",
"جوانه‌زنی": "initial",
"نشا": "initial",
"استقرار": "initial",
"vegetative": "vegetative",
"growth": "vegetative",
"رویشی": "vegetative",
"رشد رویشی": "vegetative",
"flowering": "flowering",
"anthesis": "flowering",
"گلدهی": "flowering",
"گل دهی": "flowering",
"fruiting": "fruiting",
"harvest": "fruiting",
"ripening": "fruiting",
"میوه دهی": "fruiting",
"میوه‌دهی": "fruiting",
"برداشت": "fruiting",
"maturity": "maturity",
"رسیدگی": "maturity",
"بلوغ": "maturity",
}
def _normalize_lookup_value(self, value: str | None) -> str:
text = (value or "").strip().lower()
if not text:
return ""
translation_table = str.maketrans(
{
"ي": "ی",
"ك": "ک",
"ة": "ه",
"أ": "ا",
"إ": "ا",
"ؤ": "و",
"ۀ": "ه",
"": " ",
"-": " ",
"_": " ",
}
)
text = text.translate(translation_table)
text = re.sub(r"\s+", " ", text)
return text.strip()
def resolve_growth_stage(self, growth_stage: str | None) -> str | None:
value = (growth_stage or "").strip()
if not value:
return value
normalized = self._normalize_lookup_value(value)
return self.growth_stage_aliases.get(normalized, value)
def resolve_plant_name(self, plant_name: str | None) -> str | None:
from farm_data.models import PlantCatalogSnapshot
value = (plant_name or "").strip()
if not value:
return value
plant = (
PlantCatalogSnapshot.objects.filter(name=value).first()
or PlantCatalogSnapshot.objects.filter(name__iexact=value).first()
)
if plant is not None:
return plant.name
normalized = self._normalize_lookup_value(value)
alias_target = self.plant_aliases.get(normalized)
if alias_target:
aliased_plant = PlantCatalogSnapshot.objects.filter(name=alias_target).first()
if aliased_plant is not None:
return aliased_plant.name
for plant in PlantCatalogSnapshot.objects.only("name").iterator():
if self._normalize_lookup_value(plant.name) == normalized:
return plant.name
return value