mirror of https://github.com/logos-co/open-law.git
Merge pull request #18 from Simple2B/kostia/feature/sections_routing_and_pagination
Kostia/feature/sections routing and pagination
This commit is contained in:
commit
0a8e145d2b
|
@ -23,6 +23,7 @@ def create_app(environment="development"):
|
||||||
user_blueprint,
|
user_blueprint,
|
||||||
book_blueprint,
|
book_blueprint,
|
||||||
home_blueprint,
|
home_blueprint,
|
||||||
|
section_blueprint,
|
||||||
)
|
)
|
||||||
from app.models import (
|
from app.models import (
|
||||||
User,
|
User,
|
||||||
|
@ -50,6 +51,7 @@ def create_app(environment="development"):
|
||||||
app.register_blueprint(user_blueprint)
|
app.register_blueprint(user_blueprint)
|
||||||
app.register_blueprint(book_blueprint)
|
app.register_blueprint(book_blueprint)
|
||||||
app.register_blueprint(home_blueprint)
|
app.register_blueprint(home_blueprint)
|
||||||
|
app.register_blueprint(section_blueprint)
|
||||||
|
|
||||||
# Set up flask login.
|
# Set up flask login.
|
||||||
@login_manager.user_loader
|
@login_manager.user_loader
|
||||||
|
|
|
@ -32,5 +32,20 @@ class Section(BaseModel):
|
||||||
path += self.label
|
path += self.label
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
@property
|
||||||
|
def book_id(self):
|
||||||
|
_book_id = self.version.book_id
|
||||||
|
return _book_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sub_collection_id(self):
|
||||||
|
parent = self.collection
|
||||||
|
grand_parent = parent.parent
|
||||||
|
if grand_parent.is_root:
|
||||||
|
_sub_collection_id = parent.id
|
||||||
|
else:
|
||||||
|
_sub_collection_id = grand_parent.id
|
||||||
|
return _sub_collection_id
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<{self.id}: {self.label}>"
|
return f"<{self.id}: {self.label}>"
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="md:mr-64 relative overflow-x-auto shadow-md sm:rounded-lg mt-1">
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<div class="p-5 flex border-b-2 border-gray-200 border-solid dark:border-gray-700 text-gray-900 dark:text-white dark:divide-gray-700">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-8 h-8"> <path stroke-linecap="round" stroke-linejoin="round" d="M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9" /> </svg>
|
||||||
|
<h1 class="text-2xl font-extrabold dark:text-white ml-4">Sections</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<dl
|
||||||
|
class="w-md md:w-full text-gray-900 divide-y divide-gray-200 dark:text-white dark:divide-gray-700">
|
||||||
|
{% for section in sections %}
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a
|
||||||
|
href="{{url_for('book.interpretation_view',book_id=section.book_id,collection_id=section.collection_id,sub_collection_id=section.sub_collection_id, section_id=section.id)}}">
|
||||||
|
<dl
|
||||||
|
class="bg-white dark:bg-gray-900 max-w-full p-3 text-gray-900 divide-y divide-gray-200 dark:text-white dark:divide-gray-700 m-3 border-2 border-gray-200 border-solid rounded-lg dark:border-gray-700">
|
||||||
|
<div class="flex flex-col pb-3 p-3 w-full">
|
||||||
|
<dt
|
||||||
|
class="flex w-full mb-1 text-gray-500 md:text-lg dark:text-gray-400 flex-col">
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<p>{{ section.path }}</p>
|
||||||
|
<div class="flex ml-auto align-center justify-center space-x-3">
|
||||||
|
<span class="space-x-0.5 flex items-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 22 22"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-4 h-4 inline-flex mr-1">
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z" />
|
||||||
|
</svg>
|
||||||
|
<p>55</p>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="space-x-0.5 flex items-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 22 22"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke="currentColor"
|
||||||
|
class="w-4 h-4 inline-flex mr-1">
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
|
||||||
|
</svg>
|
||||||
|
<p>55</p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</dt>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% if page.pages > 1 %}
|
||||||
|
<div class="container content-center mt-3 flex bg-white dark:bg-gray-800">
|
||||||
|
<nav aria-label="Page navigation example" class="mx-auto">
|
||||||
|
<ul class="inline-flex items-center -space-x-px">
|
||||||
|
<li>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page=1&q={{page.query}}" class="block px-3 py-2 ml-0 leading-tight text-gray-500 bg-white border border-gray-300 rounded-l-lg hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
|
||||||
|
<span class="sr-only">First</span>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5"> <path fill-rule="evenodd" d="M15.79 14.77a.75.75 0 01-1.06.02l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 111.04 1.08L11.832 10l3.938 3.71a.75.75 0 01.02 1.06zm-6 0a.75.75 0 01-1.06.02l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 111.04 1.08L5.832 10l3.938 3.71a.75.75 0 01.02 1.06z" clip-rule="evenodd" /> </svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page={{page.page-1 if page.page > 1 else 1}}&q={{page.query}}" class="block px-3 py-2 ml-0 leading-tight text-gray-500 bg-white border border-gray-300 rounded-l-lg hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
|
||||||
|
<span class="sr-only">Previous</span>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5"> <path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" /> </svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% for p in page.pages_for_links %}
|
||||||
|
<li>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% if p == page.page %}
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page={{p}}&q={{page.query}}" aria-current="page" class="z-10 px-3 py-2 leading-tight text-blue-600 border border-blue-300 bg-blue-50 hover:bg-blue-100 hover:text-blue-700 dark:border-gray-700 dark:bg-gray-700 dark:text-white">{{p}}</a>
|
||||||
|
{% else %}
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page={{p}}&q={{page.query}}" class="px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">{{p}}</a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page={{page.page+1 if page.page < page.pages else page.pages}}&q={{page.query}}" class="block px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 rounded-r-lg hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<span class="sr-only">Next</span>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5"> <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" /> </svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<a href="{{ url_for('section.get_all') }}?page={{page.pages}}&q={{page.query}}" class="block px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 rounded-r-lg hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<span class="sr-only">Last</span>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5"> <path fill-rule="evenodd" d="M10.21 14.77a.75.75 0 01.02-1.06L14.168 10 10.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" /> <path fill-rule="evenodd" d="M4.21 14.77a.75.75 0 01.02-1.06L8.168 10 4.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" /> </svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% endblock %}
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
{% block scripts %}
|
||||||
|
{% endblock %}
|
|
@ -4,3 +4,4 @@ from .main import main_blueprint
|
||||||
from .user import bp as user_blueprint
|
from .user import bp as user_blueprint
|
||||||
from .book import bp as book_blueprint
|
from .book import bp as book_blueprint
|
||||||
from .home import bp as home_blueprint
|
from .home import bp as home_blueprint
|
||||||
|
from .section import bp as section_blueprint
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
from flask import (
|
||||||
|
Blueprint,
|
||||||
|
render_template,
|
||||||
|
request,
|
||||||
|
)
|
||||||
|
|
||||||
|
from app.controllers import create_pagination
|
||||||
|
from app import models as m
|
||||||
|
|
||||||
|
|
||||||
|
bp = Blueprint("section", __name__, url_prefix="/section")
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/all", methods=["GET"])
|
||||||
|
def get_all():
|
||||||
|
q = request.args.get("q", type=str, default=None)
|
||||||
|
section: m.Section = m.Section.query.order_by(m.Section.id)
|
||||||
|
if q:
|
||||||
|
section = section.filter(m.Section.label.like(f"{q}"))
|
||||||
|
|
||||||
|
pagination = create_pagination(total=section.count())
|
||||||
|
|
||||||
|
return render_template(
|
||||||
|
"section/all.html",
|
||||||
|
sections=section.paginate(page=pagination.page, per_page=pagination.per_page),
|
||||||
|
page=pagination,
|
||||||
|
search_query=q,
|
||||||
|
all_books=True,
|
||||||
|
)
|
Loading…
Reference in New Issue