diff --git a/auth.py b/auth.py index 620ce75..4a2dbbb 100644 --- a/auth.py +++ b/auth.py @@ -94,6 +94,7 @@ def login(): def register(): if request.method == "POST": name = request.form["name"].strip() + group = request.form["group"] password = request.form["password"] existing_user = User.query.filter_by(name=name).first() @@ -101,7 +102,7 @@ def register(): return render_template("register.html", error="That name is already registered.") user = User(name=name) - group_id = user.set_group_id(password) + group_id = user.set_group_id(group) if group_id == 0: return render_template("register.html", error="Unknown registration key.") diff --git a/groups.py b/groups.py new file mode 100644 index 0000000..d8b85ee --- /dev/null +++ b/groups.py @@ -0,0 +1,28 @@ +from flask import Blueprint, render_template, request +from models import db +from models import Group +from flask_login import login_required, current_user + +groups_bp = Blueprint("groups", __name__) + +@groups_bp.route("/groups", methods=["GET", "POST"]) +@login_required +def groups(): + if not current_user.is_admin: + return "Forbidden", 403 + error = "" + + if request.method == "POST": + secret = request.form["secret"].strip() + if not secret: + error = "Group secret is required." + elif Group.query.filter_by(secret=secret).first(): + error = "That group already exists." + else: + group = Group(secret=secret) + db.session.add(group) + db.session.commit() + + return render_template("groups.html", + groups=Group.query.order_by(Group.id).all(), + error=error) diff --git a/initialize_data.py b/initialize_data.py index e64a954..9a7691f 100644 --- a/initialize_data.py +++ b/initialize_data.py @@ -1,6 +1,6 @@ from lapp import create_app import sqlalchemy as sa -from models import db, User, ListOfItems, Shared, Item +from models import db, User, ListOfItems, Shared, Item, Group if __name__ == "__main__": app = create_app() @@ -9,10 +9,14 @@ if __name__ == "__main__": users = db.session.scalars(query).all() print(users) if len(users) == 0: - admin = User(name="admin", is_admin=True, is_approved=True, is_private=True) + g = Group(secret="This is the group just for the admin") + db.session.add(g) + g = Group(secret="GroupForIgnaceAndLoversThatDoGroceries") + db.session.add(g) + admin = User(name="admin", group_id=1, is_admin=True, is_approved=True, is_private=True) admin.set_password("suy2025") db.session.add(admin) - user1 = User(name="ignace", is_admin=False, is_approved=True) + user1 = User(name="ignace", group_id=2, is_admin=False, is_approved=True) user1.set_password("xanderj2") db.session.add(user1) db.session.commit() diff --git a/lapp.py b/lapp.py index 9f5a9ed..18fe530 100644 --- a/lapp.py +++ b/lapp.py @@ -7,6 +7,7 @@ from admin import admin_bp from lists import lists_bp from items import items_bp from api import api_bp +from groups import groups_bp login_manager = LoginManager() @@ -24,6 +25,7 @@ def create_app(): app.register_blueprint(lists_bp) app.register_blueprint(items_bp) app.register_blueprint(api_bp) + app.register_blueprint(groups_bp) with app.app_context(): db.create_all() diff --git a/show_db.py b/show_db.py new file mode 100644 index 0000000..288c50b --- /dev/null +++ b/show_db.py @@ -0,0 +1,84 @@ +from lapp import create_app +from models import db +from models import Group, Item, ListOfItems, Shared, User + + +def print_section(title): + print() + print("=" * len(title)) + print(title) + print("=" * len(title)) + + +def print_model_rows(model, columns): + primary_key = next(iter(model.__table__.primary_key.columns)) + rows = model.query.order_by(primary_key).all() + if not rows: + print("(empty)") + return + + for row in rows: + values = [] + for column in columns: + values.append(f"{column}={getattr(row, column)!r}") + print(", ".join(values)) + + +def main(): + app = create_app() + with app.app_context(): + print(f"Database: {app.config['SQLALCHEMY_DATABASE_URI']}") + + print_section("Users") + print_model_rows(User, [ + "id", + "updated_at", + "group_id", + "name", + "password_hash", + "is_admin", + "is_approved", + "is_private", + "is_guest", + ]) + + print_section("Groups") + print_model_rows(Group, [ + "id", + "updated_at", + "secret", + ]) + + print_section("Lists") + print_model_rows(ListOfItems, [ + "id", + "updated_at", + "owner_user_id", + "name", + "is_active", + ]) + + print_section("Items") + print_model_rows(Item, [ + "id", + "updated_at", + "listofitems_id", + "label", + "quantity", + "unit", + "label_alt1", + "label_alt2", + "is_checked", + "is_suggestion", + "category", + ]) + + print_section("Shares") + print_model_rows(Shared, [ + "user_id", + "listofitem_id", + ]) + + +if __name__ == "__main__": + main() diff --git a/templates/groups.html b/templates/groups.html new file mode 100644 index 0000000..6083517 --- /dev/null +++ b/templates/groups.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} +{% block content %} +