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:
AutonetSellCar Deploy
2026-01-03 20:30:06 +09:00
parent 77e707167f
commit 2d7e144a21

View File

@@ -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()