Adding slugs, refactoring
This commit is contained in:
+12
-21
@@ -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
@@ -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
@@ -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),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user