From 9fafc0b2285ac3493b250209dee4ef75218422f8 Mon Sep 17 00:00:00 2001 From: Mike Date: Thu, 7 Nov 2019 22:48:42 -0500 Subject: [PATCH] first stage of dynamic UI --- config.py | 1 + lib/display.py | 102 +++++++++++++++++++++++++++++++++++++ lib/pyShelf.py | 38 +++++++++----- main.py | 4 +- static/css/.#main.css | 1 - tests/.#test_bookserver.py | 1 - tests/.#test_library.py | 1 - tests/test_bookserver.py | 15 ++++-- 8 files changed, 141 insertions(+), 22 deletions(-) create mode 100644 lib/display.py delete mode 120000 static/css/.#main.css delete mode 120000 tests/.#test_bookserver.py delete mode 120000 tests/.#test_library.py diff --git a/config.py b/config.py index 01ae613..f5c146f 100755 --- a/config.py +++ b/config.py @@ -2,6 +2,7 @@ class Config: """Main System Configuration""" def __init__(self): self.book_path = "books/" + self.TITLE = "pyShelf E-Book Server" self.book_shelf = "data/shelf.json" self.catalogue_db = "data/catalogue.db" self.file_array = [ diff --git a/lib/display.py b/lib/display.py new file mode 100644 index 0000000..5c37a4a --- /dev/null +++ b/lib/display.py @@ -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 = """ + + + + + + + + %s + + """ % self.TITLE + return _head + + def app_Headers(self): + """ + App specific headers + :returns _head: HTML render of application specific headers + """ + _head = """ + +
+
+

pyShelf

+

class=\"app_subhdr shadow\">Open Source E-book Server

+
+ """ + 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 = """ +
+
+ %s +
+
+
+ %s +
+
+
+ """ %(nav, shelf) + return _body + + def app_footer(self): + """ + Main interface footer; Closes HTML + :returns _footer: HTML render of page footer + """ + _footer = """ +
+
+ +
+
+
+ + + """ + 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 diff --git a/lib/pyShelf.py b/lib/pyShelf.py index 7052955..3a09991 100755 --- a/lib/pyShelf.py +++ b/lib/pyShelf.py @@ -65,11 +65,15 @@ class RequestHandler(BaseHTTPRequestHandler): try: serve_file.close() except Exception: pass + class BookDisplay: """All functions related to displaying book information in the HTML UI""" def __init__(self): - """Initialize class variables""" + """ + Initialize class variables + :return: None + """ self.books_per_page = None self.current_page = 0 self.thumbnail_size = [200, 300] @@ -77,22 +81,39 @@ class BookDisplay: self.total_pages = None def nextPage(self): - """Goto next book page""" + """ + Goto next book page + :return: new current_page + """ self.current_page += 1 return self.current_page def previousPage(self): + """ + Goto previous book page + :return: new current_page + """ self.current_page -= 1 return self.current_page 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 y = (self.thumbnail_size[1] * self.thumbnail_scale) + 10 self.books_per_page = int(screen_size[0]//x) * int(screen_size[1]//y) + return self.books_per_page class BookServer: - """HTTP Frontend""" + """ + HTTP server functions required to display e-books + """ + def __init__(self): # TODO Get server Ip Address self.server_address = ('', 8000) @@ -107,17 +128,8 @@ class BookServer: else: self.close_prompt() - def run(self, test=0): + def run(self): """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: print("Server running @ http://127.0.0.1:8000") self.httpd.serve_forever() diff --git a/main.py b/main.py index 1e0acfb..c8f3f6f 100755 --- a/main.py +++ b/main.py @@ -5,12 +5,14 @@ from config import Config from lib.library import Catalogue from lib.pyShelf import InitFiles from lib.pyShelf import BookServer - +from lib.pyShelf import BookDisplay +from lib.display import Frontend # sys.path.insert(1, 'lib/') config = Config() # Get configuration settings InitFiles(config.file_array) # Initialize file system Catalogue = Catalogue() # Open the Catalogue +UI = Frontend() Server = BookServer() # new_books = Catalogue.new_files() Catalogue.import_books() # Filter Your books diff --git a/static/css/.#main.css b/static/css/.#main.css deleted file mode 120000 index 2efe4f5..0000000 --- a/static/css/.#main.css +++ /dev/null @@ -1 +0,0 @@ -raelon@golumnsec.2706:1573068976 \ No newline at end of file diff --git a/tests/.#test_bookserver.py b/tests/.#test_bookserver.py deleted file mode 120000 index 2efe4f5..0000000 --- a/tests/.#test_bookserver.py +++ /dev/null @@ -1 +0,0 @@ -raelon@golumnsec.2706:1573068976 \ No newline at end of file diff --git a/tests/.#test_library.py b/tests/.#test_library.py deleted file mode 120000 index 2efe4f5..0000000 --- a/tests/.#test_library.py +++ /dev/null @@ -1 +0,0 @@ -raelon@golumnsec.2706:1573068976 \ No newline at end of file diff --git a/tests/test_bookserver.py b/tests/test_bookserver.py index 5534af7..72400fc 100644 --- a/tests/test_bookserver.py +++ b/tests/test_bookserver.py @@ -2,16 +2,21 @@ import sys import unittest from lib.pyShelf import BookDisplay, BookServer - +from lib.display import Frontend sys.path.insert(0, '../lib') sys.path.insert(1, '../') class BookServerTest(unittest.TestCase): - def test_bookserver(self): - server = BookServer() - self.assertTrue(server.run()) + def __init__(self): + self.dimensions = [900, 450] def test_booksPerPage(self): - x, y = 900, 450 + x, y = self.dimensions[0], self.dimensions[1] 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)