updated model and initialization

This commit is contained in:
2026-07-19 11:29:10 +02:00
parent 0c03348c88
commit 2dcc7ebbf9
3 changed files with 101 additions and 45 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ list app
install install
1. clone repo 1. clone repo
2. create subfolder "instance" to store database file 2. create subfolder "instance" to store database file
3. for an initial instance: run python3 initialze_data.py, with the python from the virtual-env 3. for an initial instance, run `.venv/bin/python initialize_data.py`
4. add the below config to your apache2 enabled site 4. add the below config to your apache2 enabled site
## Secrets and configuration ## Secrets and configuration
+96 -40
View File
@@ -1,47 +1,103 @@
from lapp import create_app
import sqlalchemy as sa import sqlalchemy as sa
from models import db, User, ListOfItems, Shared, Item, Group
from lapp import create_app
from models import Group, Item, ListOfItems, Shared, User, db
from secrets_config import load_secrets from secrets_config import load_secrets
if __name__ == "__main__":
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() app = create_app()
app.app_context().push() if initialize(app):
query = sa.select(User)
users = db.session.scalars(query).all()
if len(users) == 0:
initial_data = load_secrets(app.instance_path)["initial_data"]
admin_group_secret = initial_data["admin_group"]
user_group_secret = initial_data["user_group"]
admin_password = initial_data["admin_password"]
user_password = initial_data["user_password"]
g = Group(secret=admin_group_secret)
db.session.add(g)
g = Group(secret=user_group_secret)
db.session.add(g)
admin = User(name="admin", group_id=1, is_admin=True, is_approved=True, is_private=True)
admin.set_password(admin_password)
db.session.add(admin)
user1 = User(name="ignace", group_id=2, is_admin=False, is_approved=True)
user1.set_password(user_password)
db.session.add(user1)
db.session.commit()
print("Created initial credentials from instance/secrets.yaml") print("Created initial credentials from instance/secrets.yaml")
else:
print("Database already contains users; no initial data was added")
lol1 = ListOfItems(owner_user_id = user1.id, name="Supermarkt", is_active=True)
db.session.add(lol1)
lol2 = ListOfItems(owner_user_id = user1.id, name="Klusjes", is_active=True)
db.session.add(lol2)
db.session.commit()
item1 = Item(listofitems_id=lol1.id, label="Stokbrood") if __name__ == "__main__":
item2 = Item(listofitems_id=lol1.id, label="Speltbroodje", category="Brood") main()
item3 = Item(listofitems_id=lol1.id, label="Boter", category="Zuivel", unit='x', quantity=1)
item4 = Item(listofitems_id=lol1.id, label="Notenbroodjes", is_checked=True)
db.session.add(item1)
db.session.add(item2)
db.session.add(item3)
db.session.add(item4)
db.session.commit()
+4 -4
View File
@@ -8,7 +8,7 @@ db = SQLAlchemy() # Create the extension object
class User(UserMixin, db.Model): class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) updated_at = db.Column(db.TIMESTAMP, default=datetime.now, onupdate=datetime.now, nullable=False)
group_id = db.Column(db.Integer, default=0, nullable=False) group_id = db.Column(db.Integer, default=0, nullable=False)
name = db.Column(db.String(40), unique=True, nullable=False) name = db.Column(db.String(40), unique=True, nullable=False)
password_hash = db.Column(db.String(256)) password_hash = db.Column(db.String(256))
@@ -78,7 +78,7 @@ class ListOfItems(db.Model):
) )
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) updated_at = db.Column(db.TIMESTAMP, default=datetime.now, onupdate=datetime.now, nullable=False)
owner_user_id = db.Column(db.Integer, nullable=False) owner_user_id = db.Column(db.Integer, nullable=False)
name = db.Column(db.String(40), nullable=False) name = db.Column(db.String(40), nullable=False)
is_active = db.Column(db.Boolean, default=False) is_active = db.Column(db.Boolean, default=False)
@@ -109,7 +109,7 @@ class ListOfItems(db.Model):
class Item(db.Model): class Item(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) updated_at = db.Column(db.TIMESTAMP, default=datetime.now, onupdate=datetime.now, nullable=False)
listofitems_id = db.Column(db.Integer, nullable=False) listofitems_id = db.Column(db.Integer, nullable=False)
label = db.Column(db.String(40), nullable=False) label = db.Column(db.String(40), nullable=False)
quantity = db.Column(db.Integer, default=0) quantity = db.Column(db.Integer, default=0)
@@ -132,5 +132,5 @@ class Shared(db.Model):
class Group(db.Model): class Group(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) updated_at = db.Column(db.TIMESTAMP, default=datetime.now, onupdate=datetime.now, nullable=False)
secret = db.Column(db.String(128)) secret = db.Column(db.String(128))