mirror of
https://github.com/th3r00t/pyShelf.git
synced 2026-04-28 01:59:35 -04:00
Setup to handle book objects from sqlalchemy.
This commit is contained in:
2
pyShelf.py
vendored
2
pyShelf.py
vendored
@@ -9,7 +9,6 @@ from src.backend.lib.storage import Storage
|
|||||||
from src.backend.pyShelf_MakeCollections import MakeCollections
|
from src.backend.pyShelf_MakeCollections import MakeCollections
|
||||||
from src.backend.pyShelf_ScanLibrary import execute_scan
|
from src.backend.pyShelf_ScanLibrary import execute_scan
|
||||||
from src.frontend.lib.FastAPIServer import FastAPIServer
|
from src.frontend.lib.FastAPIServer import FastAPIServer
|
||||||
from src.frontend.lib.objects import JSInterface
|
|
||||||
# import websockets
|
# import websockets
|
||||||
|
|
||||||
|
|
||||||
@@ -30,7 +29,6 @@ def run_import():
|
|||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
"""Program entrypoint."""
|
"""Program entrypoint."""
|
||||||
JSInterface(config=config).install()
|
|
||||||
Storage(config=config).create_tables()
|
Storage(config=config).create_tables()
|
||||||
_import_thread = Thread(target=run_import)
|
_import_thread = Thread(target=run_import)
|
||||||
_import_thread.start()
|
_import_thread.start()
|
||||||
|
|||||||
24
src/backend/lib/storage.py
vendored
24
src/backend/lib/storage.py
vendored
@@ -164,3 +164,27 @@ class Storage:
|
|||||||
f"Collection {_s} failed: {e}")
|
f"Collection {_s} failed: {e}")
|
||||||
_collections.append(_p)
|
_collections.append(_p)
|
||||||
self.config.logger.info("Finished making collections.")
|
self.config.logger.info("Finished making collections.")
|
||||||
|
|
||||||
|
def get_books(self, collection=None):
|
||||||
|
"""Get books from database.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
collection : str
|
||||||
|
Collection to filter by.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
_result : ScalarResult Object
|
||||||
|
"""
|
||||||
|
session = Session(self.engine)
|
||||||
|
if collection:
|
||||||
|
_result = session.execute(
|
||||||
|
select(Book).join(Collection).where(
|
||||||
|
Collection.collection == collection
|
||||||
|
)
|
||||||
|
).all()
|
||||||
|
else:
|
||||||
|
_result = session.execute(select(Book)).all()
|
||||||
|
session.close()
|
||||||
|
return _result
|
||||||
|
|||||||
19
src/frontend/lib/FastAPIServer.py
vendored
19
src/frontend/lib/FastAPIServer.py
vendored
@@ -1,11 +1,15 @@
|
|||||||
"""pyShelf's main frontend library."""
|
"""pyShelf's main frontend library."""
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
import os
|
||||||
import sass
|
import sass
|
||||||
from fastapi import FastAPI, Request
|
from fastapi import FastAPI, Request
|
||||||
from fastapi.responses import HTMLResponse
|
from fastapi.responses import HTMLResponse
|
||||||
from fastapi.routing import APIRoute
|
from fastapi.routing import APIRoute
|
||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
from fastapi.templating import Jinja2Templates
|
from fastapi.templating import Jinja2Templates
|
||||||
|
from ...backend.lib.storage import Storage
|
||||||
|
from .objects import JSInterface
|
||||||
|
from ...backend.lib.config import Config
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
templates = Jinja2Templates(directory="src/frontend/templates")
|
templates = Jinja2Templates(directory="src/frontend/templates")
|
||||||
@@ -23,6 +27,7 @@ class FastAPIServer():
|
|||||||
self.fe_config = uvicorn.Config(app, port=8080,
|
self.fe_config = uvicorn.Config(app, port=8080,
|
||||||
log_level="info", reload=True)
|
log_level="info", reload=True)
|
||||||
self.fe_server = uvicorn.Server(self.fe_config)
|
self.fe_server = uvicorn.Server(self.fe_config)
|
||||||
|
self.JSInterface: JSInterface = JSInterface(self.config)
|
||||||
self.compile_static_files()
|
self.compile_static_files()
|
||||||
|
|
||||||
def compile_static_files(self):
|
def compile_static_files(self):
|
||||||
@@ -34,6 +39,7 @@ class FastAPIServer():
|
|||||||
with open('src/frontend/static/styles/pyShelf.css', 'w') as _pyShelf:
|
with open('src/frontend/static/styles/pyShelf.css', 'w') as _pyShelf:
|
||||||
_pyShelf.write(_pyShelf_src[0])
|
_pyShelf.write(_pyShelf_src[0])
|
||||||
_pyShelf.close()
|
_pyShelf.close()
|
||||||
|
self.JSInterface.install()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def use_route_names_as_operation_ids(self, app: FastAPI) -> None:
|
def use_route_names_as_operation_ids(self, app: FastAPI) -> None:
|
||||||
@@ -44,15 +50,12 @@ class FastAPIServer():
|
|||||||
|
|
||||||
@app.get("/", response_class=HTMLResponse)
|
@app.get("/", response_class=HTMLResponse)
|
||||||
async def index(request: Request):
|
async def index(request: Request):
|
||||||
|
storage = Storage(Config(os.path.abspath(os.getcwd())))
|
||||||
|
books = storage.get_books()
|
||||||
"""Home page responder."""
|
"""Home page responder."""
|
||||||
return templates.TemplateResponse(
|
# _books = self.storage.get_books()
|
||||||
"index.html",
|
context = {"request": request, "books": books}
|
||||||
{
|
return templates.TemplateResponse("index.html", context )
|
||||||
"request": request,
|
|
||||||
"package": {
|
|
||||||
"test": "This is a test variable"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
@app.get("/users/me")
|
@app.get("/users/me")
|
||||||
async def about_me(self):
|
async def about_me(self):
|
||||||
|
|||||||
7
src/frontend/lib/objects.py
vendored
7
src/frontend/lib/objects.py
vendored
@@ -17,7 +17,14 @@ class JSInterface():
|
|||||||
def install(self):
|
def install(self):
|
||||||
"""Install the JavaScript dependencies."""
|
"""Install the JavaScript dependencies."""
|
||||||
if which("npm"):
|
if which("npm"):
|
||||||
|
self.config.logger.info("Installing JavaScript dependencies...")
|
||||||
run(["npm", "install"], cwd=self.package_json.parent)
|
run(["npm", "install"], cwd=self.package_json.parent)
|
||||||
else:
|
else:
|
||||||
self.config.logger.error("npm is not installed.")
|
self.config.logger.error("npm is not installed.")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
if which("npx"):
|
||||||
|
self.config.logger.info("Compiling TypeScript...")
|
||||||
|
run(["npx", "tsc", "static/script/pyshelf.ts"], cwd=self.package_json.parent)
|
||||||
|
else:
|
||||||
|
self.config.logger.error("npx is not installed.")
|
||||||
|
exit(1)
|
||||||
|
|||||||
21
src/frontend/static/script/pyshelf.js
Normal file
21
src/frontend/static/script/pyshelf.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
function getScreenSize() {
|
||||||
|
return {
|
||||||
|
width: window.innerWidth,
|
||||||
|
height: window.innerHeight
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function sizeMaster() {
|
||||||
|
var size = getScreenSize();
|
||||||
|
var navbar = $('#navbar-main').height();
|
||||||
|
var footer = $('#footer-main').height();
|
||||||
|
var master = $('#master').height(size.height - navbar - footer);
|
||||||
|
}
|
||||||
|
$(document).ready(function () {
|
||||||
|
// Get the current URL
|
||||||
|
var url = window.location.href;
|
||||||
|
// Get the last part of the URL
|
||||||
|
sizeMaster();
|
||||||
|
$(window).on('resize', function () {
|
||||||
|
sizeMaster();
|
||||||
|
});
|
||||||
|
});
|
||||||
24
src/frontend/static/script/pyshelf.ts
vendored
24
src/frontend/static/script/pyshelf.ts
vendored
@@ -4,12 +4,20 @@ function getScreenSize() {
|
|||||||
height: window.innerHeight
|
height: window.innerHeight
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
$(document).ready(function() {
|
|
||||||
// Get the current URL
|
function sizeMaster() {
|
||||||
var url = window.location.href;
|
var size = getScreenSize();
|
||||||
// Get the last part of the URL
|
var navbar = $('#navbar-main').height();
|
||||||
var screenSize = getScreenSize();
|
var footer = $('#footer-main').height();
|
||||||
var x: number = screenSize.width;
|
var master = $('#master').height(size.height - navbar - footer);
|
||||||
var y: number = screenSize.height;
|
|
||||||
console.log(x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Get the current URL
|
||||||
|
var url = window.location.href;
|
||||||
|
// Get the last part of the URL
|
||||||
|
sizeMaster();
|
||||||
|
$(window).on('resize', function() {
|
||||||
|
sizeMaster();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|||||||
7
src/frontend/templates/example.tpl
vendored
Normal file
7
src/frontend/templates/example.tpl
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<!doctype html>
|
||||||
|
{% include 'header.html' %}
|
||||||
|
{% include 'navigation.html' %}
|
||||||
|
<section id="master">
|
||||||
|
{{ package.test }}
|
||||||
|
</section>
|
||||||
|
{% include 'footer.html' %}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<footer class="footer is-dark">
|
<footer class="footer is-dark" id="footer-main">
|
||||||
<a href="https://python.org">
|
<a href="https://python.org">
|
||||||
<img
|
<img
|
||||||
src="{{ url_for('static', path='images/python-logo-transparent.svg') }}"
|
src="{{ url_for('static', path='images/python-logo-transparent.svg') }}"
|
||||||
|
|||||||
@@ -1,7 +1,34 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
{% include 'header.html' %}
|
{% include 'header.html' %}
|
||||||
{% include 'navigation.html' %}
|
{% include 'navigation.html' %}
|
||||||
<section id="master">
|
<section id="master">
|
||||||
{{ package.test }}
|
<div class="container is-dark">
|
||||||
</section>
|
{% for book in books %}
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-image">
|
||||||
|
<figure class="image is-4by3">
|
||||||
|
<img src="{{ book[0].cover }}" alt="{{ book[0].title }}">
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="media">
|
||||||
|
<div class="media-left">
|
||||||
|
<figure class="image is-48x48">
|
||||||
|
<img src="{{ book.image }}" alt="Placeholder image">
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div class="media-content">
|
||||||
|
<p class="title is-4">{{ book[0].title }}</p>
|
||||||
|
<p class="subtitle is-6">{{ book[0].author }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
{{ book[0].description }}
|
||||||
|
<br>
|
||||||
|
<time datetime="2016-1-1">{{ book[0].date }}</time>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
{% include 'footer.html' %}
|
{% include 'footer.html' %}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<nav class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation">
|
<nav id="navbar-main" class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation">
|
||||||
<div class="navbar-brand">
|
<div class="navbar-brand">
|
||||||
<a class="navbar-item" href="https://github.com/th3r00t/pyShelf">
|
<a class="navbar-item" href="https://github.com/th3r00t/pyShelf">
|
||||||
<img src="{{ url_for('static', path='images/svg/logo-no-background-no-border.svg') }}" width="112" height="28" />
|
<img src="{{ url_for('static', path='images/svg/logo-no-background-no-border.svg') }}" width="112" height="28" />
|
||||||
|
|||||||
Reference in New Issue
Block a user