Adding slugs, refactoring

This commit is contained in:
evilchili
2024-01-28 22:14:50 -08:00
parent 64451ddf8b
commit 8f17ddfb05
10 changed files with 151 additions and 58 deletions
+12 -21
View File
@@ -1,5 +1,3 @@
import base64
import hashlib
import logging
from ttfrog.db import db, session
@@ -18,17 +16,6 @@ data = {
}
def slug_from_rec(rec):
"""
Create a uniquish slug from a dictionary.
"""
sha1bytes = hashlib.sha1(str(rec).encode())
return '-'.join([
base64.urlsafe_b64encode(sha1bytes.digest()).decode("ascii")[:10],
rec.get('name', '') # will need to normalize this for URLs
])
def bootstrap():
"""
Initialize the database with source data. Idempotent; will skip anything that already exists.
@@ -39,13 +26,17 @@ def bootstrap():
logging.debug("No bootstrap data for table {table_name}; skipping.")
continue
for rec in data[table_name]:
if 'slug' in table.columns:
rec['slug'] = slug_from_rec(rec)
stmt = table.insert().values(**rec).prefix_with("OR IGNORE")
result = session.execute(stmt)
session.commit()
last_id = result.inserted_primary_key[0]
if last_id == 0:
result, error = db.execute(stmt)
if error:
raise RuntimeError(error)
rec['id'] = result.inserted_primary_key[0]
if rec['id'] == 0:
logging.info(f"Skipped existing {table_name} {rec}")
else:
logging.info(f"Created {table_name} {result.inserted_primary_key[0]}: {rec}")
continue
if 'slug' in table.columns:
rec['slug'] = db.slugify(rec)
db.update(table, **rec)
logging.info(f"Created {table_name} {rec}")
+32 -6
View File
@@ -1,8 +1,12 @@
from functools import cached_property
import base64
import hashlib
import logging
from functools import cached_property
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.exc import IntegrityError
from ttfrog.path import database
from ttfrog.db.schema import metadata
@@ -32,17 +36,39 @@ class SQLDatabaseManager:
def query(self, *args, **kwargs):
return self.DBSession.query(*args, **kwargs)
def execute(self, statement) -> tuple:
logging.debug(statement)
result = None
error = None
try:
result = self.DBSession.execute(statement)
self.DBSession.commit()
except IntegrityError as exc:
logging.error(exc)
error = "An error occurred when saving changes."
return result, error
def insert(self, table, **kwargs) -> tuple:
stmt = table.insert().values(**kwargs)
return self.execute(stmt)
def update(self, table, **kwargs):
stmt = table.update().values(**kwargs)
logging.debug(stmt)
result = self.DBSession.execute(stmt)
self.DBSession.commit()
return result
primary_key = kwargs.pop('id')
stmt = table.update().values(**kwargs).where(table.columns.id == primary_key)
return self.execute(stmt)
def init_model(self, engine=None):
metadata.create_all(bind=engine or self.engine)
return self.DBSession
def slugify(self, rec: dict) -> str:
"""
Create a uniquish slug from a dictionary.
"""
sha1bytes = hashlib.sha1(str(rec['id']).encode())
return base64.urlsafe_b64encode(sha1bytes.digest()).decode("ascii")[:10]
def __getattr__(self, name: str):
try:
return self.tables[name]
+2 -1
View File
@@ -14,7 +14,8 @@ metadata = MetaData()
Ancestry = Table(
"ancestry",
metadata,
Column("name", String, primary_key=True),
Column("id", Integer, primary_key=True, autoincrement=True),
Column("name", String, index=True, unique=True),
Column("slug", String, index=True, unique=True),
Column("description", UnicodeText),
)