open-law/app/controllers/breadcrumbs.py

107 lines
3.3 KiB
Python
Raw Normal View History

2023-05-01 14:01:03 +00:00
from flask import url_for
2023-05-01 08:15:57 +00:00
from flask_login import current_user
2023-05-01 14:29:54 +00:00
2023-05-30 14:03:05 +00:00
from app import models as m, db, schema as s
2023-05-01 08:15:57 +00:00
2023-05-30 11:10:04 +00:00
def create_collections_breadcrumb(
bread_crumbs: list[s.BreadCrumb], collection: m.Collection
) -> list[s.BreadCrumb]:
bread_crumbs += [
s.BreadCrumb(
type=s.BreadCrumbType.Collection,
url=url_for("book.collection_view", book_id=collection.book_id)
+ f"#collection-{collection.label}",
2023-05-30 11:10:04 +00:00
label=collection.label,
)
]
if collection.parent and not collection.parent.is_root:
create_collections_breadcrumb(bread_crumbs, collection.parent)
2023-05-01 08:15:57 +00:00
def create_breadcrumbs(
2023-05-30 14:03:05 +00:00
book_id: int, section_id: int = 0, collection_id: int = 0, short=True
2023-05-01 14:01:03 +00:00
) -> list[s.BreadCrumb]:
"""
How breadcrumbs look like:
Book List -> Book Name -> Top Level Collection -> SubCollection -> Section -> Interpretation
- If i am not owner of a book
John's books -> Book Name -> Top Level Collection -> SubCollection -> Section -> Interpretation
- If i am owner
My Books -> Book Title -> Part I -> Chapter X -> Paragraph 1.7 -> By John
"""
2023-05-01 14:01:03 +00:00
crumples: list[s.BreadCrumb] = []
book: m.Book = db.session.get(m.Book, book_id)
if current_user.is_authenticated and book.user_id == current_user.id:
# My Book
crumples += [
s.BreadCrumb(
type=s.BreadCrumbType.MyBookList,
url=url_for("user.profile", user_id=current_user.id),
label="Me",
2023-05-01 14:01:03 +00:00
)
]
else:
# Not mine book
crumples += [
s.BreadCrumb(
type=s.BreadCrumbType.AuthorBookList,
url=url_for("user.profile", user_id=book.owner.id),
label=book.owner.username,
2023-05-01 14:01:03 +00:00
)
]
crumples += [
s.BreadCrumb(
type=s.BreadCrumbType.Collection,
url=url_for("book.collection_view", book_id=book_id),
label=book.label,
)
]
2023-05-30 13:45:32 +00:00
section: m.Section = None
if section_id:
section: m.Section = db.session.get(m.Section, section_id)
if collection_id and not section:
2023-05-30 13:00:13 +00:00
collections_crumbs = []
collection: m.Collection = db.session.get(m.Collection, collection_id)
2023-05-30 13:45:32 +00:00
if not collection.is_root:
create_collections_breadcrumb(collections_crumbs, collection)
collections_crumbs.reverse()
crumples += collections_crumbs
if section:
collections_crumbs = []
collection: m.Collection = db.session.get(m.Collection, section.collection_id)
if not collection.is_root:
create_collections_breadcrumb(collections_crumbs, collection)
collections_crumbs.reverse()
crumples += collections_crumbs
2023-05-09 13:30:44 +00:00
crumples += [
s.BreadCrumb(
type=s.BreadCrumbType.Section,
url=url_for(
"book.interpretation_view",
book_id=book_id,
section_id=section_id,
),
label=section.label,
)
]
2023-05-30 14:03:05 +00:00
if short and len(crumples) > 5:
crumples = (
crumples[:3]
+ [s.BreadCrumb(type=s.BreadCrumbType.Splitter, url="", label="...")]
+ crumples[-2:]
)
2023-05-01 14:01:03 +00:00
return crumples