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,109 +466,102 @@ def auto_extract_terms(db: Session = Depends(get_db)):
|
||||
from ..models import Car, CarMaker, CarModel
|
||||
|
||||
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
|
||||
makers = db.query(CarMaker).all()
|
||||
for maker in makers:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == maker.name,
|
||||
Translation.category == "maker"
|
||||
).first()
|
||||
if not existing:
|
||||
if maker.name:
|
||||
defaults = get_default_translation(maker.name, "maker")
|
||||
trans = Translation(
|
||||
source_text=maker.name,
|
||||
category="maker",
|
||||
text_en=defaults.get("en") or maker.name_en or maker.name,
|
||||
text_mn=defaults.get("mn") or maker.name,
|
||||
text_ru=defaults.get("ru") or maker.name
|
||||
add_translation(
|
||||
maker.name,
|
||||
"maker",
|
||||
defaults.get("en") or maker.name_en or maker.name,
|
||||
defaults.get("mn") or maker.name,
|
||||
defaults.get("ru") or maker.name
|
||||
)
|
||||
db.add(trans)
|
||||
added_count += 1
|
||||
|
||||
# Extract models
|
||||
models = db.query(CarModel).all()
|
||||
for model in models:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == model.name,
|
||||
Translation.category == "model"
|
||||
).first()
|
||||
if not existing:
|
||||
# Models usually keep their original names (Sonata, K5, etc.)
|
||||
trans = Translation(
|
||||
source_text=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
|
||||
if model.name:
|
||||
defaults = get_default_translation(model.name, "model")
|
||||
add_translation(
|
||||
model.name,
|
||||
"model",
|
||||
defaults.get("en") or model.name_en or model.name,
|
||||
defaults.get("mn") or model.name_en or model.name,
|
||||
defaults.get("ru") or model.name_en or model.name
|
||||
)
|
||||
db.add(trans)
|
||||
added_count += 1
|
||||
|
||||
# Extract unique fuels
|
||||
fuels = db.query(Car.fuel).distinct().filter(Car.fuel.isnot(None)).all()
|
||||
for (fuel,) in fuels:
|
||||
if fuel:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == fuel,
|
||||
Translation.category == "fuel"
|
||||
).first()
|
||||
if not existing:
|
||||
defaults = get_default_translation(fuel, "fuel")
|
||||
trans = Translation(
|
||||
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
|
||||
add_translation(
|
||||
fuel,
|
||||
"fuel",
|
||||
defaults.get("en") or fuel,
|
||||
defaults.get("mn") or fuel,
|
||||
defaults.get("ru") or fuel
|
||||
)
|
||||
db.add(trans)
|
||||
added_count += 1
|
||||
|
||||
# Extract unique transmissions
|
||||
transmissions = db.query(Car.transmission).distinct().filter(Car.transmission.isnot(None)).all()
|
||||
for (trans_type,) in transmissions:
|
||||
if trans_type:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == trans_type,
|
||||
Translation.category == "transmission"
|
||||
).first()
|
||||
if not existing:
|
||||
defaults = get_default_translation(trans_type, "transmission")
|
||||
trans = Translation(
|
||||
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
|
||||
add_translation(
|
||||
trans_type,
|
||||
"transmission",
|
||||
defaults.get("en") or trans_type,
|
||||
defaults.get("mn") or trans_type,
|
||||
defaults.get("ru") or trans_type
|
||||
)
|
||||
db.add(trans)
|
||||
added_count += 1
|
||||
|
||||
# Extract unique colors
|
||||
colors = db.query(Car.color).distinct().filter(Car.color.isnot(None)).all()
|
||||
for (color,) in colors:
|
||||
if color:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == color,
|
||||
Translation.category == "color"
|
||||
).first()
|
||||
if not existing:
|
||||
defaults = get_default_translation(color, "color")
|
||||
trans = Translation(
|
||||
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
|
||||
add_translation(
|
||||
color,
|
||||
"color",
|
||||
defaults.get("en") or color,
|
||||
defaults.get("mn") or color,
|
||||
defaults.get("ru") or color
|
||||
)
|
||||
db.add(trans)
|
||||
added_count += 1
|
||||
|
||||
# Extract unique car_names and auto-translate
|
||||
car_names = db.query(Car.car_name).distinct().filter(Car.car_name.isnot(None)).all()
|
||||
for (car_name,) in car_names:
|
||||
if car_name:
|
||||
key = (car_name, "car_name")
|
||||
if key not in added_keys:
|
||||
existing = db.query(Translation).filter(
|
||||
Translation.source_text == car_name,
|
||||
Translation.category == "car_name"
|
||||
@@ -587,6 +580,7 @@ def auto_extract_terms(db: Session = Depends(get_db)):
|
||||
text_ru=translated_ru
|
||||
)
|
||||
db.add(trans)
|
||||
added_keys.add(key)
|
||||
added_count += 1
|
||||
|
||||
db.commit()
|
||||
|
||||
Reference in New Issue
Block a user