elmeg-demo/backend/fix_numeric_slugs.py
fullsizemalt 49e025d3bf
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run
fix: commit all pending changes (home, leaderboard, slug cleanup)
2025-12-24 12:06:35 -08:00

89 lines
3.7 KiB
Python

from sqlmodel import Session, create_engine, select
import os
from models import Show, Song, Venue, Performance, Tour
from slugify import generate_slug, generate_show_slug, generate_performance_slug
# Use environment variable or default to local sqlite for testing
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./database.db")
engine = create_engine(DATABASE_URL)
def fix_numeric_slugs():
with Session(engine) as session:
# 1. Songs
songs = session.exec(select(Song)).all()
for song in songs:
if song.slug and song.slug.isdigit():
old_slug = song.slug
new_slug = generate_slug(song.title)
# Check for collisions
base_slug = new_slug
counter = 1
while session.exec(select(Song).where(Song.slug == new_slug).where(Song.id != song.id)).first():
new_slug = f"{base_slug}-{counter}"
counter += 1
print(f"Updating Song slug: {old_slug} -> {new_slug}")
song.slug = new_slug
session.add(song)
# 2. Venues
venues = session.exec(select(Venue)).all()
for venue in venues:
if venue.slug and venue.slug.isdigit():
old_slug = venue.slug
new_slug = generate_slug(venue.name)
# Check for collisions
base_slug = new_slug
counter = 1
while session.exec(select(Venue).where(Venue.slug == new_slug).where(Venue.id != venue.id)).first():
new_slug = f"{base_slug}-{counter}"
counter += 1
print(f"Updating Venue slug: {old_slug} -> {new_slug}")
venue.slug = new_slug
session.add(venue)
# 3. Shows
shows = session.exec(select(Show)).all()
for show in shows:
if show.slug and show.slug.isdigit():
old_slug = show.slug
venue_name = show.venue.name if (show.venue) else "unknown"
new_slug = generate_show_slug(show.date.strftime("%Y-%m-%d"), venue_name)
# Check for collisions
base_slug = new_slug
counter = 1
while session.exec(select(Show).where(Show.slug == new_slug).where(Show.id != show.id)).first():
new_slug = f"{base_slug}-{counter}"
counter += 1
print(f"Updating Show slug: {old_slug} -> {new_slug}")
show.slug = new_slug
session.add(show)
# 4. Performances (checking just in case)
performances = session.exec(select(Performance)).all()
for perf in performances:
if perf.slug and perf.slug.isdigit():
old_slug = perf.slug
song_title = perf.song.title if perf.song else "unknown"
show_date = perf.show.date.strftime("%Y-%m-%d") if perf.show else "unknown"
new_slug = generate_performance_slug(song_title, show_date)
# Check for collisions
base_slug = new_slug
counter = 1
while session.exec(select(Performance).where(Performance.slug == new_slug).where(Performance.id != perf.id)).first():
new_slug = f"{base_slug}-{counter}"
counter += 1
print(f"Updating Performance slug: {old_slug} -> {new_slug}")
perf.slug = new_slug
session.add(perf)
session.commit()
print("Slug fixation complete.")
if __name__ == "__main__":
fix_numeric_slugs()