Files
lapp/initialize_data.py
T

104 lines
3.1 KiB
Python

import sqlalchemy as sa
from lapp import create_app
from models import Group, Item, ListOfItems, Shared, User, db
from secrets_config import load_secrets
def has_rows(model):
primary_key = next(iter(model.__table__.primary_key.columns))
return db.session.scalar(sa.select(primary_key).limit(1)) is not None
def initialize(app):
initial_data = load_secrets(app.instance_path)["initial_data"]
with app.app_context():
with db.session.begin():
if has_rows(User):
return False
partially_populated = [
model.__tablename__
for model in (Group, ListOfItems, Item, Shared)
if has_rows(model)
]
if partially_populated:
tables = ", ".join(partially_populated)
raise RuntimeError(
"Refusing to initialize a partially populated database. "
f"These tables contain data while user is empty: {tables}"
)
admin_group = Group(secret=initial_data["admin_group"])
user_group = Group(secret=initial_data["user_group"])
db.session.add_all([admin_group, user_group])
db.session.flush()
admin = User(
name="admin",
group_id=admin_group.id,
is_admin=True,
is_approved=True,
is_private=True,
)
admin.set_password(initial_data["admin_password"])
user = User(
name="ignace",
group_id=user_group.id,
is_admin=False,
is_approved=True,
)
user.set_password(initial_data["user_password"])
db.session.add_all([admin, user])
db.session.flush()
groceries = ListOfItems(
owner_user_id=user.id,
name="Supermarkt",
is_active=True,
)
chores = ListOfItems(
owner_user_id=user.id,
name="Klusjes",
is_active=True,
)
db.session.add_all([groceries, chores])
db.session.flush()
db.session.add_all([
Item(listofitems_id=groceries.id, label="Stokbrood"),
Item(
listofitems_id=groceries.id,
label="Speltbroodje",
category="Brood",
),
Item(
listofitems_id=groceries.id,
label="Boter",
category="Zuivel",
unit="x",
quantity=1,
),
Item(
listofitems_id=groceries.id,
label="Notenbroodjes",
is_checked=True,
),
])
return True
def main():
app = create_app()
if initialize(app):
print("Created initial credentials from instance/secrets.yaml")
else:
print("Database already contains users; no initial data was added")
if __name__ == "__main__":
main()