mirror of
https://github.com/th3r00t/pyShelf.git
synced 2026-04-28 01:59:35 -04:00
first stage of dynamic UI
This commit is contained in:
@@ -2,6 +2,7 @@ class Config:
|
|||||||
"""Main System Configuration"""
|
"""Main System Configuration"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.book_path = "books/"
|
self.book_path = "books/"
|
||||||
|
self.TITLE = "pyShelf E-Book Server"
|
||||||
self.book_shelf = "data/shelf.json"
|
self.book_shelf = "data/shelf.json"
|
||||||
self.catalogue_db = "data/catalogue.db"
|
self.catalogue_db = "data/catalogue.db"
|
||||||
self.file_array = [
|
self.file_array = [
|
||||||
|
|||||||
102
lib/display.py
Normal file
102
lib/display.py
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import cgi
|
||||||
|
import sys
|
||||||
|
|
||||||
|
sys.path.insert(0, '../')
|
||||||
|
from config import Config
|
||||||
|
|
||||||
|
|
||||||
|
class Frontend():
|
||||||
|
"""Dynamic frontend display functions"""
|
||||||
|
|
||||||
|
def __init__(self, dimensions=[0, 0]):
|
||||||
|
"""
|
||||||
|
:param dimensions: array containing screen size [x, y]
|
||||||
|
"""
|
||||||
|
self.dimensions = dimensions
|
||||||
|
self.TITLE = Config().TITLE
|
||||||
|
|
||||||
|
def html_Headers(self):
|
||||||
|
"""
|
||||||
|
HTML headers
|
||||||
|
:returns _head: HTML render of page headers
|
||||||
|
"""
|
||||||
|
_head = """
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang=\"en\">
|
||||||
|
<head>
|
||||||
|
<meta charset=\"utf-8\">
|
||||||
|
<meta http-equiv=\"X-UA-Compatible\" content=\"IE-edge\">
|
||||||
|
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
|
||||||
|
<link type=\"text/css\" rel=\"stylesheet\" href=\"/css/main.css\" />
|
||||||
|
<title>%s</title>
|
||||||
|
</head>
|
||||||
|
""" % self.TITLE
|
||||||
|
return _head
|
||||||
|
|
||||||
|
def app_Headers(self):
|
||||||
|
"""
|
||||||
|
App specific headers
|
||||||
|
:returns _head: HTML render of application specific headers
|
||||||
|
"""
|
||||||
|
_head = """
|
||||||
|
<body>
|
||||||
|
<div id=\"app\">
|
||||||
|
<div class=\"app_header\">
|
||||||
|
<h1 class=\"app_hdr shadow\">pyShelf</h1>
|
||||||
|
<h2> class=\"app_subhdr shadow\">Open Source E-book Server</h2>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
return _head
|
||||||
|
|
||||||
|
def app_body(self, nav, shelf):
|
||||||
|
"""
|
||||||
|
Main interface body, and navigation
|
||||||
|
:param nav: nav[] system navigation list
|
||||||
|
:param shelf: shelf[0{path:"",title:"",cover:"",author:""}]
|
||||||
|
:returns _body: HTML render of page body
|
||||||
|
"""
|
||||||
|
_body = """
|
||||||
|
<div class=\"app_body\">
|
||||||
|
<div class=\"left_col\">
|
||||||
|
%s
|
||||||
|
</div>
|
||||||
|
<div class=\"shelf\">
|
||||||
|
<div class=\"shelf_contents\">
|
||||||
|
%s
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
""" %(nav, shelf)
|
||||||
|
return _body
|
||||||
|
|
||||||
|
def app_footer(self):
|
||||||
|
"""
|
||||||
|
Main interface footer; Closes HTML
|
||||||
|
:returns _footer: HTML render of page footer
|
||||||
|
"""
|
||||||
|
_footer = """
|
||||||
|
<div class=\"app_footer\">
|
||||||
|
<div class=\"python_logo\">
|
||||||
|
<img src=\"/img/py.png\" id=\"python_logo\" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
"""
|
||||||
|
return _footer
|
||||||
|
|
||||||
|
def compile(self, nav, shelf):
|
||||||
|
"""
|
||||||
|
Compiles user interface
|
||||||
|
:returns _ui: Compiled HTML for page layout
|
||||||
|
"""
|
||||||
|
_head = self.html_Headers() + self.app_Headers()
|
||||||
|
_body = self.app_body(nav, shelf)
|
||||||
|
_foot = self.app_footer()
|
||||||
|
try:
|
||||||
|
_ui = _head + _body + _foot
|
||||||
|
return _ui
|
||||||
|
except Exception as e:
|
||||||
|
return e
|
||||||
@@ -65,11 +65,15 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||||||
try: serve_file.close()
|
try: serve_file.close()
|
||||||
except Exception: pass
|
except Exception: pass
|
||||||
|
|
||||||
|
|
||||||
class BookDisplay:
|
class BookDisplay:
|
||||||
"""All functions related to displaying book information in the HTML UI"""
|
"""All functions related to displaying book information in the HTML UI"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Initialize class variables"""
|
"""
|
||||||
|
Initialize class variables
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
self.books_per_page = None
|
self.books_per_page = None
|
||||||
self.current_page = 0
|
self.current_page = 0
|
||||||
self.thumbnail_size = [200, 300]
|
self.thumbnail_size = [200, 300]
|
||||||
@@ -77,22 +81,39 @@ class BookDisplay:
|
|||||||
self.total_pages = None
|
self.total_pages = None
|
||||||
|
|
||||||
def nextPage(self):
|
def nextPage(self):
|
||||||
"""Goto next book page"""
|
"""
|
||||||
|
Goto next book page
|
||||||
|
:return: new current_page
|
||||||
|
"""
|
||||||
self.current_page += 1
|
self.current_page += 1
|
||||||
return self.current_page
|
return self.current_page
|
||||||
|
|
||||||
def previousPage(self):
|
def previousPage(self):
|
||||||
|
"""
|
||||||
|
Goto previous book page
|
||||||
|
:return: new current_page
|
||||||
|
"""
|
||||||
self.current_page -= 1
|
self.current_page -= 1
|
||||||
return self.current_page
|
return self.current_page
|
||||||
|
|
||||||
def booksPerPage(self, screen_size):
|
def booksPerPage(self, screen_size):
|
||||||
|
"""
|
||||||
|
Set books per page
|
||||||
|
|
||||||
|
:param screen_size: Array containing x,y pixel sizes
|
||||||
|
:return: self.books_per_page
|
||||||
|
"""
|
||||||
x = (self.thumbnail_size[0] * self.thumbnail_scale) + 10
|
x = (self.thumbnail_size[0] * self.thumbnail_scale) + 10
|
||||||
y = (self.thumbnail_size[1] * self.thumbnail_scale) + 10
|
y = (self.thumbnail_size[1] * self.thumbnail_scale) + 10
|
||||||
self.books_per_page = int(screen_size[0]//x) * int(screen_size[1]//y)
|
self.books_per_page = int(screen_size[0]//x) * int(screen_size[1]//y)
|
||||||
|
return self.books_per_page
|
||||||
|
|
||||||
|
|
||||||
class BookServer:
|
class BookServer:
|
||||||
"""HTTP Frontend"""
|
"""
|
||||||
|
HTTP server functions required to display e-books
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# TODO Get server Ip Address
|
# TODO Get server Ip Address
|
||||||
self.server_address = ('', 8000)
|
self.server_address = ('', 8000)
|
||||||
@@ -107,17 +128,8 @@ class BookServer:
|
|||||||
else:
|
else:
|
||||||
self.close_prompt()
|
self.close_prompt()
|
||||||
|
|
||||||
def run(self, test=0):
|
def run(self):
|
||||||
"""Start HTTP Server"""
|
"""Start HTTP Server"""
|
||||||
self.httpd = HTTPServer(self.server_address, self.handler)
|
|
||||||
if test != 0:
|
|
||||||
try:
|
|
||||||
self.httpd.serve_forever()
|
|
||||||
self.httpd.handle_request()
|
|
||||||
self.close()
|
|
||||||
return True
|
|
||||||
except Exception:
|
|
||||||
return False
|
|
||||||
try:
|
try:
|
||||||
print("Server running @ http://127.0.0.1:8000")
|
print("Server running @ http://127.0.0.1:8000")
|
||||||
self.httpd.serve_forever()
|
self.httpd.serve_forever()
|
||||||
|
|||||||
4
main.py
4
main.py
@@ -5,12 +5,14 @@ from config import Config
|
|||||||
from lib.library import Catalogue
|
from lib.library import Catalogue
|
||||||
from lib.pyShelf import InitFiles
|
from lib.pyShelf import InitFiles
|
||||||
from lib.pyShelf import BookServer
|
from lib.pyShelf import BookServer
|
||||||
|
from lib.pyShelf import BookDisplay
|
||||||
|
from lib.display import Frontend
|
||||||
# sys.path.insert(1, 'lib/')
|
# sys.path.insert(1, 'lib/')
|
||||||
|
|
||||||
config = Config() # Get configuration settings
|
config = Config() # Get configuration settings
|
||||||
InitFiles(config.file_array) # Initialize file system
|
InitFiles(config.file_array) # Initialize file system
|
||||||
Catalogue = Catalogue() # Open the Catalogue
|
Catalogue = Catalogue() # Open the Catalogue
|
||||||
|
UI = Frontend()
|
||||||
Server = BookServer()
|
Server = BookServer()
|
||||||
# new_books = Catalogue.new_files()
|
# new_books = Catalogue.new_files()
|
||||||
Catalogue.import_books() # Filter Your books
|
Catalogue.import_books() # Filter Your books
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
raelon@golumnsec.2706:1573068976
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
raelon@golumnsec.2706:1573068976
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
raelon@golumnsec.2706:1573068976
|
|
||||||
@@ -2,16 +2,21 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from lib.pyShelf import BookDisplay, BookServer
|
from lib.pyShelf import BookDisplay, BookServer
|
||||||
|
from lib.display import Frontend
|
||||||
sys.path.insert(0, '../lib')
|
sys.path.insert(0, '../lib')
|
||||||
sys.path.insert(1, '../')
|
sys.path.insert(1, '../')
|
||||||
|
|
||||||
class BookServerTest(unittest.TestCase):
|
class BookServerTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_bookserver(self):
|
def __init__(self):
|
||||||
server = BookServer()
|
self.dimensions = [900, 450]
|
||||||
self.assertTrue(server.run())
|
|
||||||
|
|
||||||
def test_booksPerPage(self):
|
def test_booksPerPage(self):
|
||||||
x, y = 900, 450
|
x, y = self.dimensions[0], self.dimensions[1]
|
||||||
self.assertGreater(BookDisplay().booksPerPage([x,y]), 0)
|
self.assertGreater(BookDisplay().booksPerPage([x,y]), 0)
|
||||||
|
|
||||||
|
def test_Frontend(self):
|
||||||
|
x, y = self.dimensions[0], self.dimensions[1]
|
||||||
|
ui = Frontend([x, y]).compile("TestCase", "Test Shelf")
|
||||||
|
print(ui)
|
||||||
|
self.assertNotEqual(ui, False)
|
||||||
|
|||||||
Reference in New Issue
Block a user