mirror of
https://github.com/logos-co/open-law.git
synced 2025-02-03 10:35:41 +00:00
customized admin panel
This commit is contained in:
parent
c13ad15301
commit
298096e126
@ -91,9 +91,15 @@ def create_app(environment="development"):
|
|||||||
return render_template("error.html", error=exc), exc.code
|
return render_template("error.html", error=exc), exc.code
|
||||||
|
|
||||||
# flask admin
|
# flask admin
|
||||||
from app.controllers.flask_admin_customization import (
|
from app.controllers.admin import (
|
||||||
CustomAdminIndexView,
|
CustomAdminIndexView,
|
||||||
ProtectedModelView,
|
UsersView,
|
||||||
|
BooksView,
|
||||||
|
CollectionsView,
|
||||||
|
SectionsView,
|
||||||
|
InterpretationView,
|
||||||
|
CommentView,
|
||||||
|
TagView,
|
||||||
)
|
)
|
||||||
|
|
||||||
app.config["FLASK_ADMIN_SWATCH"] = "Flatly"
|
app.config["FLASK_ADMIN_SWATCH"] = "Flatly"
|
||||||
@ -105,20 +111,20 @@ def create_app(environment="development"):
|
|||||||
)
|
)
|
||||||
|
|
||||||
for view in [
|
for view in [
|
||||||
ProtectedModelView(m.User, db.session, name="User", endpoint="/user_"),
|
UsersView(m.User, db.session, name="User", endpoint="/user_"),
|
||||||
ProtectedModelView(m.Book, db.session, name="Book", endpoint="/book_"),
|
BooksView(m.Book, db.session, name="Book", endpoint="/book_"),
|
||||||
ProtectedModelView(
|
CollectionsView(
|
||||||
m.Collection, db.session, name="Collection", endpoint="/collection_"
|
m.Collection, db.session, name="Collection", endpoint="/collection_"
|
||||||
),
|
),
|
||||||
ProtectedModelView(m.Section, db.session, name="Section", endpoint="/section_"),
|
SectionsView(m.Section, db.session, name="Section", endpoint="/section_"),
|
||||||
ProtectedModelView(
|
InterpretationView(
|
||||||
m.Interpretation,
|
m.Interpretation,
|
||||||
db.session,
|
db.session,
|
||||||
name="Interpretation",
|
name="Interpretation",
|
||||||
endpoint="/interpretation_",
|
endpoint="/interpretation_",
|
||||||
),
|
),
|
||||||
ProtectedModelView(m.Comment, db.session, name="Comment", endpoint="/comment_"),
|
CommentView(m.Comment, db.session, name="Comment", endpoint="/comment_"),
|
||||||
ProtectedModelView(m.Tag, db.session, name="Tag", endpoint="/tag_"),
|
TagView(m.Tag, db.session, name="Tag", endpoint="/tag_"),
|
||||||
]:
|
]:
|
||||||
admin.add_view(view)
|
admin.add_view(view)
|
||||||
|
|
||||||
|
10
app/controllers/admin/__init__.py
Normal file
10
app/controllers/admin/__init__.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# flake8: noqa F401
|
||||||
|
from .custom_admin_index_view import CustomAdminIndexView
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
from .user import UsersView
|
||||||
|
from .book import BooksView
|
||||||
|
from .collection import CollectionsView
|
||||||
|
from .section import SectionsView
|
||||||
|
from .interpretation import InterpretationView
|
||||||
|
from .comment import CommentView
|
||||||
|
from .tag import TagView
|
46
app/controllers/admin/book.py
Normal file
46
app/controllers/admin/book.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import delete_nested_book_entities
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class BooksView(ProtectedModelView):
|
||||||
|
column_list = ("id", "label", "about", "is_deleted", "user_id", "created_at")
|
||||||
|
column_labels = dict(user_id="Created by")
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_book_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Book and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
56
app/controllers/admin/collection.py
Normal file
56
app/controllers/admin/collection.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import (
|
||||||
|
delete_nested_collection_entities,
|
||||||
|
)
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class CollectionsView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"label",
|
||||||
|
"about",
|
||||||
|
"is_root",
|
||||||
|
"is_leaf",
|
||||||
|
"position",
|
||||||
|
"is_deleted",
|
||||||
|
"created_at",
|
||||||
|
)
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_collection_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Collection and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
54
app/controllers/admin/comment.py
Normal file
54
app/controllers/admin/comment.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import (
|
||||||
|
delete_nested_comment_entities,
|
||||||
|
)
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class CommentView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"text",
|
||||||
|
"approved",
|
||||||
|
"edited",
|
||||||
|
"is_deleted",
|
||||||
|
"created_at",
|
||||||
|
)
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_comment_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Section and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
53
app/controllers/admin/interpretation.py
Normal file
53
app/controllers/admin/interpretation.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import (
|
||||||
|
delete_nested_interpretation_entities,
|
||||||
|
)
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class InterpretationView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"plain_text",
|
||||||
|
"approved",
|
||||||
|
"is_deleted",
|
||||||
|
"created_at",
|
||||||
|
)
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_interpretation_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Section and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
11
app/controllers/admin/protected_model_view.py
Normal file
11
app/controllers/admin/protected_model_view.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from flask_admin.contrib.sqla import ModelView
|
||||||
|
from flask_login import current_user
|
||||||
|
|
||||||
|
|
||||||
|
class ProtectedModelView(ModelView):
|
||||||
|
action_disallowed_list = ["delete"]
|
||||||
|
column_default_sort = "id"
|
||||||
|
can_create = False
|
||||||
|
|
||||||
|
def is_accessible(self):
|
||||||
|
return current_user.is_super_user
|
53
app/controllers/admin/section.py
Normal file
53
app/controllers/admin/section.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import (
|
||||||
|
delete_nested_section_entities,
|
||||||
|
)
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class SectionsView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"label",
|
||||||
|
"position",
|
||||||
|
"is_deleted",
|
||||||
|
"created_at",
|
||||||
|
)
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_section_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Section and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
51
app/controllers/admin/tag.py
Normal file
51
app/controllers/admin/tag.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
from flask_admin.base import expose
|
||||||
|
from flask_admin.helpers import get_redirect_target, flash_errors
|
||||||
|
from flask import redirect, flash
|
||||||
|
from flask_admin.babel import gettext
|
||||||
|
|
||||||
|
from app.controllers.delete_nested_book_entities import (
|
||||||
|
delete_nested_comment_entities,
|
||||||
|
)
|
||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class TagView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"name",
|
||||||
|
"created_at",
|
||||||
|
)
|
||||||
|
|
||||||
|
@expose("/delete/", methods=("POST",))
|
||||||
|
def delete_view(self):
|
||||||
|
return_url = get_redirect_target() or self.get_url(".index_view")
|
||||||
|
|
||||||
|
if not self.can_delete:
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
form = self.delete_form()
|
||||||
|
|
||||||
|
if self.validate_form(form):
|
||||||
|
# id is InputRequired()
|
||||||
|
id = form.id.data
|
||||||
|
|
||||||
|
model = self.get_one(id)
|
||||||
|
|
||||||
|
if model is None:
|
||||||
|
flash(gettext("Record does not exist."), "error")
|
||||||
|
return redirect(return_url)
|
||||||
|
|
||||||
|
model.is_deleted = True
|
||||||
|
delete_nested_comment_entities(model)
|
||||||
|
model.save()
|
||||||
|
flash(
|
||||||
|
gettext(
|
||||||
|
"Section and nested entities were successfully deleted.",
|
||||||
|
),
|
||||||
|
"success",
|
||||||
|
)
|
||||||
|
return redirect(return_url)
|
||||||
|
else:
|
||||||
|
flash_errors(form, message="Failed to delete record. %(error)s")
|
||||||
|
|
||||||
|
return redirect(return_url)
|
11
app/controllers/admin/user.py
Normal file
11
app/controllers/admin/user.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from .protected_model_view import ProtectedModelView
|
||||||
|
|
||||||
|
|
||||||
|
class UsersView(ProtectedModelView):
|
||||||
|
column_list = (
|
||||||
|
"id",
|
||||||
|
"username",
|
||||||
|
"is_activated",
|
||||||
|
"wallet_id",
|
||||||
|
"is_super_user",
|
||||||
|
)
|
@ -1,3 +0,0 @@
|
|||||||
# flake8: noqa F401
|
|
||||||
from .custom_admin_index_view import CustomAdminIndexView
|
|
||||||
from .protected_model_view import ProtectedModelView
|
|
@ -1,36 +0,0 @@
|
|||||||
from flask_admin.contrib.sqla import ModelView
|
|
||||||
from flask_login import current_user
|
|
||||||
from flask import redirect, url_for, flash
|
|
||||||
from app.logger import log
|
|
||||||
|
|
||||||
|
|
||||||
class ProtectedModelView(ModelView):
|
|
||||||
def is_accessible(self):
|
|
||||||
return current_user.is_super_user
|
|
||||||
|
|
||||||
def inaccessible_callback(self, name, **kwargs):
|
|
||||||
# redirect to login page if user doesn't have access
|
|
||||||
return redirect(url_for("main.index"))
|
|
||||||
|
|
||||||
def delete_model(self, model):
|
|
||||||
"""
|
|
||||||
Delete model.
|
|
||||||
:param model:
|
|
||||||
Model to delete
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
self.on_model_delete(model)
|
|
||||||
# Add your custom logic here and don't forget to commit any changes e.g.
|
|
||||||
# self.session.commit()
|
|
||||||
except Exception as ex:
|
|
||||||
if not self.handle_view_exception(ex):
|
|
||||||
flash("Failed to delete record.", "danger")
|
|
||||||
log(log.WARNING, "Failed to delete record.Because [%s]", ex)
|
|
||||||
|
|
||||||
self.session.rollback()
|
|
||||||
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self.after_model_delete(model)
|
|
||||||
|
|
||||||
return True
|
|
Loading…
x
Reference in New Issue
Block a user