Fix duplicate key error in translations auto-extract
- Add tracking set to prevent duplicate entries within same batch - Refactor to use helper function for consistent duplicate checking 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -466,128 +466,122 @@ def auto_extract_terms(db: Session = Depends(get_db)):
|
|||||||
from ..models import Car, CarMaker, CarModel
|
from ..models import Car, CarMaker, CarModel
|
||||||
|
|
||||||
added_count = 0
|
added_count = 0
|
||||||
|
# Track already added entries in this batch to avoid duplicates
|
||||||
|
added_keys = set()
|
||||||
|
|
||||||
|
def add_translation(source_text: str, category: str, text_en: str, text_mn: str, text_ru: str):
|
||||||
|
nonlocal added_count
|
||||||
|
key = (source_text, category)
|
||||||
|
if key in added_keys:
|
||||||
|
return # Skip duplicate in same batch
|
||||||
|
|
||||||
|
existing = db.query(Translation).filter(
|
||||||
|
Translation.source_text == source_text,
|
||||||
|
Translation.category == category
|
||||||
|
).first()
|
||||||
|
if not existing:
|
||||||
|
trans = Translation(
|
||||||
|
source_text=source_text,
|
||||||
|
category=category,
|
||||||
|
text_en=text_en,
|
||||||
|
text_mn=text_mn,
|
||||||
|
text_ru=text_ru
|
||||||
|
)
|
||||||
|
db.add(trans)
|
||||||
|
added_keys.add(key)
|
||||||
|
added_count += 1
|
||||||
|
|
||||||
# Extract makers
|
# Extract makers
|
||||||
makers = db.query(CarMaker).all()
|
makers = db.query(CarMaker).all()
|
||||||
for maker in makers:
|
for maker in makers:
|
||||||
existing = db.query(Translation).filter(
|
if maker.name:
|
||||||
Translation.source_text == maker.name,
|
|
||||||
Translation.category == "maker"
|
|
||||||
).first()
|
|
||||||
if not existing:
|
|
||||||
defaults = get_default_translation(maker.name, "maker")
|
defaults = get_default_translation(maker.name, "maker")
|
||||||
trans = Translation(
|
add_translation(
|
||||||
source_text=maker.name,
|
maker.name,
|
||||||
category="maker",
|
"maker",
|
||||||
text_en=defaults.get("en") or maker.name_en or maker.name,
|
defaults.get("en") or maker.name_en or maker.name,
|
||||||
text_mn=defaults.get("mn") or maker.name,
|
defaults.get("mn") or maker.name,
|
||||||
text_ru=defaults.get("ru") or maker.name
|
defaults.get("ru") or maker.name
|
||||||
)
|
)
|
||||||
db.add(trans)
|
|
||||||
added_count += 1
|
|
||||||
|
|
||||||
# Extract models
|
# Extract models
|
||||||
models = db.query(CarModel).all()
|
models = db.query(CarModel).all()
|
||||||
for model in models:
|
for model in models:
|
||||||
existing = db.query(Translation).filter(
|
if model.name:
|
||||||
Translation.source_text == model.name,
|
defaults = get_default_translation(model.name, "model")
|
||||||
Translation.category == "model"
|
add_translation(
|
||||||
).first()
|
model.name,
|
||||||
if not existing:
|
"model",
|
||||||
# Models usually keep their original names (Sonata, K5, etc.)
|
defaults.get("en") or model.name_en or model.name,
|
||||||
trans = Translation(
|
defaults.get("mn") or model.name_en or model.name,
|
||||||
source_text=model.name,
|
defaults.get("ru") or model.name_en or model.name
|
||||||
category="model",
|
|
||||||
text_en=model.name_en or model.name,
|
|
||||||
text_mn=model.name_en or model.name,
|
|
||||||
text_ru=model.name_en or model.name
|
|
||||||
)
|
)
|
||||||
db.add(trans)
|
|
||||||
added_count += 1
|
|
||||||
|
|
||||||
# Extract unique fuels
|
# Extract unique fuels
|
||||||
fuels = db.query(Car.fuel).distinct().filter(Car.fuel.isnot(None)).all()
|
fuels = db.query(Car.fuel).distinct().filter(Car.fuel.isnot(None)).all()
|
||||||
for (fuel,) in fuels:
|
for (fuel,) in fuels:
|
||||||
if fuel:
|
if fuel:
|
||||||
existing = db.query(Translation).filter(
|
defaults = get_default_translation(fuel, "fuel")
|
||||||
Translation.source_text == fuel,
|
add_translation(
|
||||||
Translation.category == "fuel"
|
fuel,
|
||||||
).first()
|
"fuel",
|
||||||
if not existing:
|
defaults.get("en") or fuel,
|
||||||
defaults = get_default_translation(fuel, "fuel")
|
defaults.get("mn") or fuel,
|
||||||
trans = Translation(
|
defaults.get("ru") or fuel
|
||||||
source_text=fuel,
|
)
|
||||||
category="fuel",
|
|
||||||
text_en=defaults.get("en") or fuel,
|
|
||||||
text_mn=defaults.get("mn") or fuel,
|
|
||||||
text_ru=defaults.get("ru") or fuel
|
|
||||||
)
|
|
||||||
db.add(trans)
|
|
||||||
added_count += 1
|
|
||||||
|
|
||||||
# Extract unique transmissions
|
# Extract unique transmissions
|
||||||
transmissions = db.query(Car.transmission).distinct().filter(Car.transmission.isnot(None)).all()
|
transmissions = db.query(Car.transmission).distinct().filter(Car.transmission.isnot(None)).all()
|
||||||
for (trans_type,) in transmissions:
|
for (trans_type,) in transmissions:
|
||||||
if trans_type:
|
if trans_type:
|
||||||
existing = db.query(Translation).filter(
|
defaults = get_default_translation(trans_type, "transmission")
|
||||||
Translation.source_text == trans_type,
|
add_translation(
|
||||||
Translation.category == "transmission"
|
trans_type,
|
||||||
).first()
|
"transmission",
|
||||||
if not existing:
|
defaults.get("en") or trans_type,
|
||||||
defaults = get_default_translation(trans_type, "transmission")
|
defaults.get("mn") or trans_type,
|
||||||
trans = Translation(
|
defaults.get("ru") or trans_type
|
||||||
source_text=trans_type,
|
)
|
||||||
category="transmission",
|
|
||||||
text_en=defaults.get("en") or trans_type,
|
|
||||||
text_mn=defaults.get("mn") or trans_type,
|
|
||||||
text_ru=defaults.get("ru") or trans_type
|
|
||||||
)
|
|
||||||
db.add(trans)
|
|
||||||
added_count += 1
|
|
||||||
|
|
||||||
# Extract unique colors
|
# Extract unique colors
|
||||||
colors = db.query(Car.color).distinct().filter(Car.color.isnot(None)).all()
|
colors = db.query(Car.color).distinct().filter(Car.color.isnot(None)).all()
|
||||||
for (color,) in colors:
|
for (color,) in colors:
|
||||||
if color:
|
if color:
|
||||||
existing = db.query(Translation).filter(
|
defaults = get_default_translation(color, "color")
|
||||||
Translation.source_text == color,
|
add_translation(
|
||||||
Translation.category == "color"
|
color,
|
||||||
).first()
|
"color",
|
||||||
if not existing:
|
defaults.get("en") or color,
|
||||||
defaults = get_default_translation(color, "color")
|
defaults.get("mn") or color,
|
||||||
trans = Translation(
|
defaults.get("ru") or color
|
||||||
source_text=color,
|
)
|
||||||
category="color",
|
|
||||||
text_en=defaults.get("en") or color,
|
|
||||||
text_mn=defaults.get("mn") or color,
|
|
||||||
text_ru=defaults.get("ru") or color
|
|
||||||
)
|
|
||||||
db.add(trans)
|
|
||||||
added_count += 1
|
|
||||||
|
|
||||||
# Extract unique car_names and auto-translate
|
# Extract unique car_names and auto-translate
|
||||||
car_names = db.query(Car.car_name).distinct().filter(Car.car_name.isnot(None)).all()
|
car_names = db.query(Car.car_name).distinct().filter(Car.car_name.isnot(None)).all()
|
||||||
for (car_name,) in car_names:
|
for (car_name,) in car_names:
|
||||||
if car_name:
|
if car_name:
|
||||||
existing = db.query(Translation).filter(
|
key = (car_name, "car_name")
|
||||||
Translation.source_text == car_name,
|
if key not in added_keys:
|
||||||
Translation.category == "car_name"
|
existing = db.query(Translation).filter(
|
||||||
).first()
|
Translation.source_text == car_name,
|
||||||
if not existing:
|
Translation.category == "car_name"
|
||||||
# Auto-translate car name by translating each component
|
).first()
|
||||||
translated_en = translate_car_name(car_name, "en", db)
|
if not existing:
|
||||||
translated_mn = translate_car_name(car_name, "mn", db)
|
# Auto-translate car name by translating each component
|
||||||
translated_ru = translate_car_name(car_name, "ru", db)
|
translated_en = translate_car_name(car_name, "en", db)
|
||||||
|
translated_mn = translate_car_name(car_name, "mn", db)
|
||||||
|
translated_ru = translate_car_name(car_name, "ru", db)
|
||||||
|
|
||||||
trans = Translation(
|
trans = Translation(
|
||||||
source_text=car_name,
|
source_text=car_name,
|
||||||
category="car_name",
|
category="car_name",
|
||||||
text_en=translated_en,
|
text_en=translated_en,
|
||||||
text_mn=translated_mn,
|
text_mn=translated_mn,
|
||||||
text_ru=translated_ru
|
text_ru=translated_ru
|
||||||
)
|
)
|
||||||
db.add(trans)
|
db.add(trans)
|
||||||
added_count += 1
|
added_keys.add(key)
|
||||||
|
added_count += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user