From 9a982f2fd11f559d30bb9b8fe116552a3cf83ac5 Mon Sep 17 00:00:00 2001 From: SvyatoslavArtymovych Date: Thu, 25 May 2023 14:11:19 +0300 Subject: [PATCH] adding contributor to access group --- app/views/book/settings.py | 19 +- app/views/permission.py | 4 +- .../versions/0fc51411af21_access_groups.py | 170 ++++++++++++++++++ 3 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 migrations/versions/0fc51411af21_access_groups.py diff --git a/app/views/book/settings.py b/app/views/book/settings.py index 3999600..824bf67 100644 --- a/app/views/book/settings.py +++ b/app/views/book/settings.py @@ -32,8 +32,9 @@ def add_contributor(book_id: int): form = f.AddContributorForm() if form.validate_on_submit(): + user_id = form.user_id.data book_contributor = m.BookContributor.query.filter_by( - user_id=form.user_id.data, book_id=book_id + user_id=user_id, book_id=book_id ).first() if book_contributor: log(log.INFO, "Contributor: [%s] already exists", book_contributor) @@ -41,12 +42,22 @@ def add_contributor(book_id: int): return redirect(url_for("book.settings", book_id=book_id)) role = m.BookContributor.Roles(int(form.role.data)) - contributor = m.BookContributor( - user_id=form.user_id.data, book_id=book_id, role=role - ) + contributor = m.BookContributor(user_id=user_id, book_id=book_id, role=role) log(log.INFO, "New contributor [%s]", contributor) contributor.save() + groups = ( + db.session.query(m.AccessGroup) + .filter( + m.BookAccessGroups.book_id == book_id, + m.AccessGroup.id == m.BookAccessGroups.access_group_id, + m.AccessGroup.name == role.name.lower(), + ) + .all() + ) + for group in groups: + m.UserAccessGroups(user_id=user_id, access_group_id=group.id).save() + flash("Contributor was added!", "success") return redirect(url_for("book.settings", book_id=book_id)) else: diff --git a/app/views/permission.py b/app/views/permission.py index 5650bf9..e550e52 100644 --- a/app/views/permission.py +++ b/app/views/permission.py @@ -1,6 +1,6 @@ import json -from flask import redirect, url_for, Blueprint, request, flash +from flask import redirect, url_for, Blueprint, flash from flask_login import current_user from app import forms as f, models as m, db @@ -35,6 +35,6 @@ def set(): flash("User are not contributor of this book!", "danger") return redirect(url_for("book.my_library")) - permissions = json.loads(form.permissions.data) + # permissions = json.loads(form.permissions.data) return {"status": "ok"} diff --git a/migrations/versions/0fc51411af21_access_groups.py b/migrations/versions/0fc51411af21_access_groups.py new file mode 100644 index 0000000..6c185fa --- /dev/null +++ b/migrations/versions/0fc51411af21_access_groups.py @@ -0,0 +1,170 @@ +"""access_groups + +Revision ID: 0fc51411af21 +Revises: 7baa732e01c6 +Create Date: 2023-05-25 12:44:41.843011 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "0fc51411af21" +down_revision = "7baa732e01c6" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "permissions", + sa.Column("access", sa.Integer(), nullable=True), + sa.Column( + "entity_type", + sa.Enum( + "UNKNOWN", + "BOOK", + "COLLECTION", + "SECTION", + "INTERPRETATION", + "COMMENT", + name="entity", + ), + nullable=True, + ), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "access_groups", + sa.Column("name", sa.String(length=32), nullable=False), + sa.Column("book_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["book_id"], + ["books.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "books_access_groups", + sa.Column("book_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["book_id"], + ["books.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "permissions_access_groups", + sa.Column("permission_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["permission_id"], + ["permissions.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "users_access_groups", + sa.Column("user_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["user_id"], + ["users.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "collections_access_groups", + sa.Column("collection_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["collection_id"], + ["collections.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "sections_access_groups", + sa.Column("section_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["section_id"], + ["sections.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "interpretations_access_groups", + sa.Column("interpretation_id", sa.Integer(), nullable=True), + sa.Column("access_group_id", sa.Integer(), nullable=True), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=True), + sa.Column("is_deleted", sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint( + ["access_group_id"], + ["access_groups.id"], + ), + sa.ForeignKeyConstraint( + ["interpretation_id"], + ["interpretations.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("interpretations_access_groups") + op.drop_table("sections_access_groups") + op.drop_table("collections_access_groups") + op.drop_table("users_access_groups") + op.drop_table("permissions_access_groups") + op.drop_table("books_access_groups") + op.drop_table("access_groups") + op.drop_table("permissions") + # ### end Alembic commands ###