diff --git a/.gitignore b/.gitignore index b255847..b53eaff 100755 --- a/.gitignore +++ b/.gitignore @@ -124,3 +124,8 @@ dmypy.json # End of https://www.gitignore.io/api/python 0 +config.backup.json +create_db.sql +uwsgi.ini +installer.log +pyshelf_nginx.conf diff --git a/README.md b/README.md index 9d8fe31..63e3590 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pyShelf 0.3.0 +# pyShelf 0.4.0
Terminal based ebook server. Open source & Lightweight.
@@ -7,22 +7,35 @@ Having used Calibre for hosting my eBook collection in the past, I found myself frustrated having to install X on my server, or manage my library externally, Thus I have decided to spin up my own. ## Current Features +* Custom Installer * Recursive Scanning * Fast database access * Django based frontend * Basic seaching via a SearchVector of author, title, & file_name fields. +* Ebook Downloading ## Currently Supported Formats * epub ## Installation Example -
+pyShelf Installation Video
## Further Installation & Support Information
* [SUPPORT.md](https://github.com/th3r00t/pyShelf/blob/development/.github/SUPPORT.md)
+## 0.4.0 Patch Notes.
+### The Installer Initiative
+
+All work this time around was centered on creating an installer simple and inclusive enough to hopefully enable all
+users to simply set it and forget it. I have debugged as much as I can with my setup. I am performing some simple file finding to determine which system installer is present, and setting it as the installer used by pyShelf.
+
+This setup has been tested and is working flawlessly on arch based distros, and i have done what I can for debian, and centos based distros, If you do encounter installer issues please let me know if it isnt finding the system installer, or possibly isnt passing command line arguments to your installer.
+
+Also it should be noted that I am determining the presence of your postgresql, and nginx servers based on whether or not the
+process is listed in the process list.
+
+At this time I would suggest stopping both your postgresql and nginx servers should you already have them and allowing the installer to do its work generating custom configurations and putting the nginx config files in place (/etc/nginx/sites-available, and symlinked to /etc/nginx/sites-enabled/) None of your existing configurations will be overwritten.
+
## 0.3.0 Patch Notes.
### "And now we search."
@@ -48,25 +61,13 @@ _Before advancing version numbers be sure to set PROJECT_NUMBER in doxygen.conf
## Configuration
-### Nginx
-Included is a default nginx config file {pyshelf_nginx.conf}. This file should be sufficient to get you up and running. You are required to change the location alias's to reflect your pyshelf install folder leaving everything after /frontend intact.
-
-Further resources for nginx setup may be found @ [This nginx, django, & uwsgi, guide](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html)
-
-### uwsgi
-Inside uwsgi.ini you should make changes to reflect your install directory, and the port you wish uwsgi to listen on. Alternativly you can make the requisite changes to listen on a socket instead. This change would also require a change to the pyshelf_nginx.conf file as well.
-
-### pyShelf
-User configuration is contained within config.json in the project root. You must set book_path to the location of your books, and change the database connection details to match your environment.
-
-## Misc
-Django has been implemented to power the frontend experience, and web based database maintenance. A properly configured web server is required for hosting the frontend, and a PostgreSQL server for the database, configuration of these servers is outside of the scope of this readme.
+All configuration is now handled by the installer.
Running via the Django test server might be possible, albeit not recomended.
## In Progress
-* Searching, & further organizational tools.
+* Organizational tools.
* Docker image for those who need it.
* Improved cover image storage, and acquisition.
diff --git a/__init__.py b/__init__.py
deleted file mode 100644
index 9171045..0000000
--- a/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-import sys
-
-sys.path.insert(1, "app/")
-sys.path.insert(2, "frontend/")
diff --git a/config.json b/config.json
index 77f2b02..18a02eb 100644
--- a/config.json
+++ b/config.json
@@ -1,11 +1 @@
-{
- "TITLE": "pyShelf E-Book Server",
- "VERSION": "0.3.0",
- "BOOKPATH": "books/",
- "DB_HOST": "localhost",
- "DB_PORT": "5432",
- "DATABASE": "pyshelf",
- "USER": "pyshelf",
- "PASSWORD": "pyshelf",
- "BOOKSHELF": "data/shelf.json"
-}
+{"TITLE": "pyShelf E-Book Server", "VERSION": "0.3.0", "BOOKPATH": "/home/raelon/Books", "DB_HOST": "localhost", "DB_PORT": "5432", "DATABASE": "pyshelf", "USER": "pyshelf", "PASSWORD": "pyshelf", "BOOKSHELF": "data/shelf.json", "ALLOWED_HOSTS": "*", "hostname": "localhost", "webport": "8000", "wsgiport": "8001"}
diff --git a/docs/html/HTML/index.html b/docs/html/HTML/index.html
index c610c6b..4fe4f22 100644
--- a/docs/html/HTML/index.html
+++ b/docs/html/HTML/index.html
@@ -1,16 +1,16 @@
-| ▼NpyShelf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nsrc | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nbackend | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nlib | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Napi_hooks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CDuckDuckGo | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nconfig | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CConfig | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nlibrary | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CCatalogue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼NpyShelf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CBookDisplay | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CInitFiles | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nstorage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CStorage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Ntests | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nconfig_test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CTestConfig | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nlibrary_test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CTest_Catalogue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CTest_Config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CTestCatalogue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ▼Nsrc | |
| ▼Nbackend | |
| ▼Nlib | |
| ▼Napi_hooks | |
| CDuckDuckGo | |
| ▼Nconfig | |
| CConfig | |
| ▼Ndisplay | |
| CTerminalDisplay | |
| ▼Nlibrary | |
| CCatalogue | |
| ▼NpyShelf | |
| CBookDisplay | |
| CInitFiles | |
| ▼Nstorage | |
| CStorage | |
| ▼Ntests | |
| ▼Nconfig_test | |
| CTestConfig | |
| ▼Nlibrary_test | |
| CTest_Catalogue | |
| CTest_Config | |
| CTestCatalogue |
1.8.16
diff --git a/docs/html/classes.html b/docs/html/classes.html
index 98d2ccf..6f13f38 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -19,7 +19,7 @@
|
-Config (pyShelf.src.backend.lib.config) | +Config (src.backend.lib.config) |
|
-Test_Config (pyShelf.src.backend.tests.library_test) | +Test_Catalogue (src.backend.tests.library_test) | ||
|
-TestCatalogue (pyShelf.src.backend.tests.library_test) | +Test_Config (src.backend.tests.library_test) | |||||
| BookDisplay (pyShelf.src.backend.lib.pyShelf) | -Storage (pyShelf.src.backend.lib.storage) | -TestConfig (pyShelf.src.backend.tests.config_test) | +|||||
| BookDisplay (src.backend.lib.pyShelf) | +Storage (src.backend.lib.storage) | +TestCatalogue (src.backend.tests.library_test) | |||||
|
-DuckDuckGo (pyShelf.src.backend.lib.api_hooks) | +DuckDuckGo (src.backend.lib.api_hooks) |
|
-TestConfig (src.backend.tests.config_test) | +|||
|
|||||||
| Catalogue (pyShelf.src.backend.lib.library) | -Test_Catalogue (pyShelf.src.backend.tests.library_test) | +||||||
| Catalogue (src.backend.lib.library) | +TerminalDisplay (src.backend.lib.display) | ||||||
| InitFiles (pyShelf.src.backend.lib.pyShelf) | +|||||||
| InitFiles (src.backend.lib.pyShelf) | |||||||
1.8.16
diff --git a/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html b/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html
new file mode 100644
index 0000000..92f7c5d
--- /dev/null
+++ b/docs/html/d0/d35/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay.html
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Static Public Member Functions | |
| +def | clear () |
+Public Attributes | |
| + | term |
| + | y |
| + | home |
| + | user |
| + | version |
| + | slogan |
| + | green |
| + | blue |
| + | clr_term |
+ 1.8.16
+
+
+
diff --git a/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html b/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html
new file mode 100644
index 0000000..626db33
--- /dev/null
+++ b/docs/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.pyShelf.InitFiles, including all inherited members.
+| __init__(self, file_array) (defined in src.backend.lib.pyShelf.InitFiles) | src.backend.lib.pyShelf.InitFiles | |
| CreateFile(self, _pointer) | src.backend.lib.pyShelf.InitFiles |
+ 1.8.16
+
+
+
diff --git a/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html
new file mode 100644
index 0000000..d4e8a48
--- /dev/null
+++ b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
Inheritance diagram for src.backend.tests.library_test.Test_Config:+Public Member Functions | |
| +def | __init__ (self) |
| def | open_file (self, root="config.json") |
| def src.backend.tests.library_test.Test_Config.open_file | +( | ++ | self, | +
| + | + | + | _cp = "config.json" |
+
| + | ) | ++ |
Opens config.json and reads in configuration options ++
Reimplemented from src.backend.lib.config.Config.
+ +
+ 1.8.16
+
+
+
diff --git a/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png
new file mode 100644
index 0000000..d263ae1
Binary files /dev/null and b/docs/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png differ
diff --git a/docs/html/d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html b/docs/html/d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html
new file mode 100644
index 0000000..38218c9
--- /dev/null
+++ b/docs/html/d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.config.Config, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html b/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html
new file mode 100644
index 0000000..09af39e
--- /dev/null
+++ b/docs/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.tests.library_test.TestCatalogue, including all inherited members.
+| config (defined in src.backend.tests.library_test.TestCatalogue) | src.backend.tests.library_test.TestCatalogue | static |
| root (defined in src.backend.tests.library_test.TestCatalogue) | src.backend.tests.library_test.TestCatalogue | static |
| test_filter_books(self) (defined in src.backend.tests.library_test.TestCatalogue) | src.backend.tests.library_test.TestCatalogue |
+ 1.8.16
+
+
+
diff --git a/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html b/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html
new file mode 100644
index 0000000..a4a4734
--- /dev/null
+++ b/docs/html/d4/d45/classsrc_1_1backend_1_1lib_1_1display_1_1TerminalDisplay-members.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.display.TerminalDisplay, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html
new file mode 100644
index 0000000..ee4ff15
--- /dev/null
+++ b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
Inheritance diagram for src.backend.lib.library.Catalogue:+Public Member Functions | |
| +def | __init__ (self, config) |
| def | scan_folder (self, _path=None) |
| def | filter_books (self) |
| def | extract_metadata (self, book) |
| def | extract_content (self, book_zip, book) |
| def | extract_cover_html (self, book_zip, book) |
| def | extract_cover_image (self, book_zip, book) |
| def | compare_shelf_current (self) |
| def | import_books (self, list=None) |
+Static Public Member Functions | |
| def | process_book (book) |
+Public Attributes | |
| + | file_list |
| + | opf_regx |
| + | cover_regx |
| + | html_regx |
| + | root_dir |
| + | book_folder |
| + | book_shelf |
| + | books |
| + | db_pointer |
| + | config |
Decodes book metadata for storage +
| def src.backend.lib.library.Catalogue.compare_shelf_current | +( | ++ | self | ) | ++ |
Calls storage system, gets list of books stored and compares against files on disk ++
| def src.backend.lib.library.Catalogue.extract_content | +( | ++ | self, | +
| + | + | + | book_zip, | +
| + | + | + | book | +
| + | ) | ++ |
Opens epub as zip file filters then stores as list any files matching opf_regx ++
| def src.backend.lib.library.Catalogue.extract_cover_html | +( | ++ | self, | +
| + | + | + | book_zip, | +
| + | + | + | book | +
| + | ) | ++ |
Opens epub as zip file filters then stores as list any files matching html_regx ++
| def src.backend.lib.library.Catalogue.extract_cover_image | +( | ++ | self, | +
| + | + | + | book_zip, | +
| + | + | + | book | +
| + | ) | ++ |
Opens epub as zip file filters then stores as list any files matching cover_regx ++
| def src.backend.lib.library.Catalogue.extract_metadata | +( | ++ | self, | +
| + | + | + | book | +
| + | ) | ++ |
Return extracted metadata and cover picture +book['path'] == Full path to ebook file +book['files'] == list of files from self.process_book(book) ++
| def src.backend.lib.library.Catalogue.filter_books | +( | ++ | self | ) | ++ |
Calls scan_folder and filters out book files +Proceeds to call process_book + +:returns self._book_list_expanded: json string containing all book metadata ++
Reimplemented in src.backend.tests.library_test.Test_Catalogue.
+ +| def src.backend.lib.library.Catalogue.import_books | +( | ++ | self, | +
| + | + | + | list = None |
+
| + | ) | ++ |
Main entry point for import operations. +Gets a list of new files via compare_shelf_current. +Iterates over list and inserts new books into database. ++
+
|
+ +static | +
Return dictionary of epub file contents+
| def src.backend.lib.library.Catalogue.scan_folder | +( | ++ | self, | +
| + | + | + | _path = None |
+
| + | ) | ++ |
Scan folder by _path, allows recurisive scanning ++
+ 1.8.16
+
+
+
diff --git a/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png
new file mode 100644
index 0000000..22e8081
Binary files /dev/null and b/docs/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png differ
diff --git a/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html b/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html
new file mode 100644
index 0000000..e6d7d43
--- /dev/null
+++ b/docs/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.tests.library_test.Test_Config, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html b/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html
new file mode 100644
index 0000000..9f0bb13
--- /dev/null
+++ b/docs/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.tests.config_test.TestConfig, including all inherited members.
+| config (defined in src.backend.tests.config_test.TestConfig) | src.backend.tests.config_test.TestConfig | static |
| test_book_dir(self) (defined in src.backend.tests.config_test.TestConfig) | src.backend.tests.config_test.TestConfig | |
| test_title(self) (defined in src.backend.tests.config_test.TestConfig) | src.backend.tests.config_test.TestConfig | |
| test_version(self) (defined in src.backend.tests.config_test.TestConfig) | src.backend.tests.config_test.TestConfig |
+ 1.8.16
+
+
+
diff --git a/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html b/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html
new file mode 100644
index 0000000..ff25948
--- /dev/null
+++ b/docs/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.library.Catalogue, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html b/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html
new file mode 100644
index 0000000..ad47d00
--- /dev/null
+++ b/docs/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| +def | __init__ (self, config) |
| +def | check_ownership (self, table=None) |
| def | create_tables (self) |
| def | insert_book (self, book) |
| def | book_paths_list (self) |
| def | commit (self) |
| def | close (self) |
+Public Attributes | |
| + | sql |
| + | user |
| + | password |
| + | db_host |
| + | db_port |
| + | db |
| + | config |
| + | cursor |
Contains all methods for system storage
| def src.backend.lib.storage.Storage.book_paths_list | +( | ++ | self | ) | ++ |
Get file paths from database for comparison to system files ++
| def src.backend.lib.storage.Storage.close | +( | ++ | self | ) | ++ |
Close database connection ++
| def src.backend.lib.storage.Storage.commit | +( | ++ | self | ) | ++ |
Commit database transactions ++
| def src.backend.lib.storage.Storage.create_tables | +( | ++ | self | ) | ++ |
Create table structure+
| def src.backend.lib.storage.Storage.insert_book | +( | ++ | self, | +
| + | + | + | book | +
| + | ) | ++ |
Insert book in database +:returns: True if succeeds False if not ++
+ 1.8.16
+
+
+
diff --git a/docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html b/docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html
new file mode 100644
index 0000000..7432d9d
--- /dev/null
+++ b/docs/html/d7/d69/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay-members.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.pyShelf.BookDisplay, including all inherited members.
+| __init__(self, **kwargs) | src.backend.lib.pyShelf.BookDisplay | |
| books_per_page (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay | |
| booksPerPage(self, screen_size) | src.backend.lib.pyShelf.BookDisplay | |
| current_page (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay | |
| nextPage(self) | src.backend.lib.pyShelf.BookDisplay | |
| previousPage(self) | src.backend.lib.pyShelf.BookDisplay | |
| screen_size (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay | |
| thumbnail_scale (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay | |
| thumbnail_size (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay | |
| total_pages (defined in src.backend.lib.pyShelf.BookDisplay) | src.backend.lib.pyShelf.BookDisplay |
+ 1.8.16
+
+
+
diff --git a/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html b/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html
new file mode 100644
index 0000000..e86078a
--- /dev/null
+++ b/docs/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| +def | __init__ (self) |
| def | image_result (self, query) |
+Public Attributes | |
| + | url |
duckduckgo related searching
| def src.backend.lib.api_hooks.DuckDuckGo.image_result | +( | ++ | self, | +
| + | + | + | query | +
| + | ) | ++ |
Returns json containing url to image +:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1 ++
+ 1.8.16
+
+
+
diff --git a/docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html b/docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html
new file mode 100644
index 0000000..c978887
--- /dev/null
+++ b/docs/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| +def | test_filter_books (self) |
+Static Public Attributes | |
| + | root = os.path.abspath(os.path.curdir) |
| + | config = Test_Config() |
+ 1.8.16
+
+
+
diff --git a/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html
new file mode 100644
index 0000000..50d33d9
--- /dev/null
+++ b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
Inheritance diagram for src.backend.lib.config.Config:+Public Member Functions | |
| def | __init__ (self, root) |
| def | open_file (self, _cp) |
Main System Configuration +
| def src.backend.lib.config.Config.__init__ | +( | ++ | self, | +
| + | + | + | root | +
| + | ) | ++ |
Initialize main configuration options ++
| def src.backend.lib.config.Config.open_file | +( | ++ | self, | +
| + | + | + | _cp | +
| + | ) | ++ |
Opens config.json and reads in configuration options ++
Reimplemented in src.backend.tests.library_test.Test_Config.
+ +
+ 1.8.16
+
+
+
diff --git a/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png
new file mode 100644
index 0000000..c1f0983
Binary files /dev/null and b/docs/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png differ
diff --git a/docs/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html b/docs/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html
new file mode 100644
index 0000000..50ebda1
--- /dev/null
+++ b/docs/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| +def | __init__ (self, file_array) |
| def | CreateFile (self, _pointer) |
First run file creation operations
| def src.backend.lib.pyShelf.InitFiles.CreateFile | +( | ++ | self, | +
| + | + | + | _pointer | +
| + | ) | ++ |
Checks if file exists and creates it if not ++
+ 1.8.16
+
+
+
diff --git a/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html b/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html
new file mode 100644
index 0000000..fcbeb4b
--- /dev/null
+++ b/docs/html/db/d7d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1BookDisplay.html
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| def | __init__ (self, **kwargs) |
| def | nextPage (self) |
| def | previousPage (self) |
| def | booksPerPage (self, screen_size) |
+Public Attributes | |
| + | books_per_page |
| + | current_page |
| + | thumbnail_size |
| + | thumbnail_scale |
| + | total_pages |
| + | screen_size |
All functions related to displaying book information in the HTML UI
| def src.backend.lib.pyShelf.BookDisplay.__init__ | +( | ++ | self, | +
| + | + | ** | +kwargs | +
| + | ) | ++ |
Initialize class variables +:return: None ++
| def src.backend.lib.pyShelf.BookDisplay.booksPerPage | +( | ++ | self, | +
| + | + | + | screen_size | +
| + | ) | ++ |
## TODO Remove me +Set books per page +:param screen_size: Array containing x,y pixel sizes +:return: self.books_per_page ++
| def src.backend.lib.pyShelf.BookDisplay.nextPage | +( | ++ | self | ) | ++ |
## TODO Remove me +Goto next book page +:return: new current_page ++
| def src.backend.lib.pyShelf.BookDisplay.previousPage | +( | ++ | self | ) | ++ |
## TODO Remove me +Goto previous book page +:return: new current_page ++
+ 1.8.16
+
+
+
diff --git a/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html b/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html
new file mode 100644
index 0000000..f4d2cbe
--- /dev/null
+++ b/docs/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.storage.Storage, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html
new file mode 100644
index 0000000..ba67401
--- /dev/null
+++ b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
Inheritance diagram for src.backend.tests.library_test.Test_Catalogue:+Public Member Functions | |
| +def | __init__ (self) |
| def | filter_books (self) |
| def | scan_folder (self, _path=None) |
| def | extract_metadata (self, book) |
| def | extract_content (self, book_zip, book) |
| def | extract_cover_html (self, book_zip, book) |
| def | extract_cover_image (self, book_zip, book) |
| def | compare_shelf_current (self) |
| def | import_books (self, list=None) |
+Static Public Member Functions | |
| def | process_book (book) |
+Public Attributes | |
| + | book_shelf |
| + | file_list |
| + | opf_regx |
| + | cover_regx |
| + | html_regx |
| + | root_dir |
| + | book_folder |
| + | books |
| + | db_pointer |
| + | config |
+
|
+ +inherited | +
Calls storage system, gets list of books stored and compares against files on disk ++
+
|
+ +inherited | +
Opens epub as zip file filters then stores as list any files matching opf_regx ++
+
|
+ +inherited | +
Opens epub as zip file filters then stores as list any files matching html_regx ++
+
|
+ +inherited | +
Opens epub as zip file filters then stores as list any files matching cover_regx ++
+
|
+ +inherited | +
Return extracted metadata and cover picture +book['path'] == Full path to ebook file +book['files'] == list of files from self.process_book(book) ++
| def src.backend.tests.library_test.Test_Catalogue.filter_books | +( | ++ | self | ) | ++ |
Calls scan_folder and filters out book files +Proceeds to call process_book + +:returns self._book_list_expanded: json string containing all book metadata ++
Reimplemented from src.backend.lib.library.Catalogue.
+ +
+
|
+ +inherited | +
Main entry point for import operations. +Gets a list of new files via compare_shelf_current. +Iterates over list and inserts new books into database. ++
+
|
+ +staticinherited | +
Return dictionary of epub file contents+
+
|
+ +inherited | +
Scan folder by _path, allows recurisive scanning ++
+ 1.8.16
+
+
+
diff --git a/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png
new file mode 100644
index 0000000..2532ba5
Binary files /dev/null and b/docs/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png differ
diff --git a/docs/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html b/docs/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html
new file mode 100644
index 0000000..921410a
--- /dev/null
+++ b/docs/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.tests.library_test.Test_Catalogue, including all inherited members.
+
+ 1.8.16
+
+
+
diff --git a/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html b/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html
new file mode 100644
index 0000000..55b343e
--- /dev/null
+++ b/docs/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
This is the complete list of members for src.backend.lib.api_hooks.DuckDuckGo, including all inherited members.
+| __init__(self) (defined in src.backend.lib.api_hooks.DuckDuckGo) | src.backend.lib.api_hooks.DuckDuckGo | |
| image_result(self, query) | src.backend.lib.api_hooks.DuckDuckGo | |
| url (defined in src.backend.lib.api_hooks.DuckDuckGo) | src.backend.lib.api_hooks.DuckDuckGo |
+ 1.8.16
+
+
+
diff --git a/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html b/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html
new file mode 100644
index 0000000..bc28bae
--- /dev/null
+++ b/docs/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+|
+ pyShelf Open Source Ebook Server
+ 0.4.0
+
+ Open source, console based E-book server
+ |
+
+Public Member Functions | |
| +def | test_book_dir (self) |
| +def | test_title (self) |
| +def | test_version (self) |
+Static Public Attributes | |
| + | config = Config(os.path.abspath(os.path.curdir)) |
+ 1.8.16
+
+
+
diff --git a/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html b/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html
index e0f30e1..308f4df 100644
--- a/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html
+++ b/docs/html/dir_1c7294442ce83d360610449d04c9d7fc.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html b/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html
index 267c996..3129658 100644
--- a/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html
+++ b/docs/html/dir_3f615ade772d23cefe5e20dcb18424a2.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
index aa80e43..7e4182d 100644
--- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
+++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html b/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html
index 7973a41..22365cb 100644
--- a/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html
+++ b/docs/html/dir_9020577e2da81c4cf5a5554c26431f94.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/files.html b/docs/html/files.html
index 44fb9b7..fb05f8e 100644
--- a/docs/html/files.html
+++ b/docs/html/files.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/functions.html b/docs/html/functions.html
index d7ac943..8d4b0b8 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html
index c71a6b5..d375f54 100644
--- a/docs/html/functions_func.html
+++ b/docs/html/functions_func.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html
index bacea1f..9148d1a 100644
--- a/docs/html/hierarchy.html
+++ b/docs/html/hierarchy.html
@@ -19,7 +19,7 @@
1.8.16
diff --git a/docs/html/index.hhc b/docs/html/index.hhc
index d1f6a98..99b5e6b 100644
--- a/docs/html/index.hhc
+++ b/docs/html/index.hhc
@@ -8,165 +8,192 @@
1.8.16
diff --git a/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 b/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3
new file mode 100644
index 0000000..3347e3f
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3
@@ -0,0 +1,50 @@
+.TH "src.backend.lib.api_hooks.DuckDuckGo" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.api_hooks.DuckDuckGo
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self)"
+.br
+.ti -1c
+.RI "def \fBimage_result\fP (self, query)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBurl\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+duckduckgo related searching
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.image_result ( self, query)"
+
+.PP
+.nf
+Returns json containing url to image
+:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_config_Config.3 b/docs/man/man3/src_backend_lib_config_Config.3
new file mode 100644
index 0000000..dbeea06
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_config_Config.3
@@ -0,0 +1,107 @@
+.TH "src.backend.lib.config.Config" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.config.Config
+.SH SYNOPSIS
+.br
+.PP
+.PP
+Inherited by \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&.
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self, root)"
+.br
+.ti -1c
+.RI "def \fBopen_file\fP (self, _cp)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBbook_path\fP"
+.br
+.ti -1c
+.RI "\fBTITLE\fP"
+.br
+.ti -1c
+.RI "\fBVERSION\fP"
+.br
+.ti -1c
+.RI "\fBbook_shelf\fP"
+.br
+.ti -1c
+.RI "\fBcatalogue_db\fP"
+.br
+.ti -1c
+.RI "\fBuser\fP"
+.br
+.ti -1c
+.RI "\fBpassword\fP"
+.br
+.ti -1c
+.RI "\fBdb_host\fP"
+.br
+.ti -1c
+.RI "\fBdb_port\fP"
+.br
+.ti -1c
+.RI "\fBfile_array\fP"
+.br
+.ti -1c
+.RI "\fBroot\fP"
+.br
+.ti -1c
+.RI "\fBauto_scan\fP"
+.br
+.ti -1c
+.RI "\fBallowed_hosts\fP"
+.br
+.ti -1c
+.RI "\fBdb_user\fP"
+.br
+.ti -1c
+.RI "\fBdb_pass\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+Main System Configuration
+
+.fi
+.PP
+
+.SH "Constructor & Destructor Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.config\&.Config\&.__init__ ( self, root)"
+
+.PP
+.nf
+Initialize main configuration options
+
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.config\&.Config\&.open_file ( self, _cp)"
+
+.PP
+.nf
+Opens config.json and reads in configuration options
+
+.fi
+.PP
+
+.PP
+Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&.
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_display_TerminalDisplay.3 b/docs/man/man3/src_backend_lib_display_TerminalDisplay.3
new file mode 100644
index 0000000..e9185af
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_display_TerminalDisplay.3
@@ -0,0 +1,78 @@
+.TH "src.backend.lib.display.TerminalDisplay" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.display.TerminalDisplay
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self)"
+.br
+.ti -1c
+.RI "def \fBscreen\fP (self)"
+.br
+.ti -1c
+.RI "def \fBinstaller\fP (self)"
+.br
+.ti -1c
+.RI "def \fBprompt\fP (self, questions)"
+.br
+.ti -1c
+.RI "def \fBh_rule\fP (self)"
+.br
+.ti -1c
+.RI "def \fBbanner\fP (self)"
+.br
+.ti -1c
+.RI "def \fBbanner_render\fP (self)"
+.br
+.in -1c
+.SS "Static Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fBclear\fP ()"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBterm\fP"
+.br
+.ti -1c
+.RI "\fBy\fP"
+.br
+.ti -1c
+.RI "\fBhome\fP"
+.br
+.ti -1c
+.RI "\fBuser\fP"
+.br
+.ti -1c
+.RI "\fBversion\fP"
+.br
+.ti -1c
+.RI "\fBslogan\fP"
+.br
+.ti -1c
+.RI "\fBgreen\fP"
+.br
+.ti -1c
+.RI "\fBblue\fP"
+.br
+.ti -1c
+.RI "\fBclr_term\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_library_Catalogue.3 b/docs/man/man3/src_backend_lib_library_Catalogue.3
new file mode 100644
index 0000000..2a18f7f
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_library_Catalogue.3
@@ -0,0 +1,187 @@
+.TH "src.backend.lib.library.Catalogue" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.library.Catalogue
+.SH SYNOPSIS
+.br
+.PP
+.PP
+Inherited by \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&.
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self, config)"
+.br
+.ti -1c
+.RI "def \fBscan_folder\fP (self, _path=None)"
+.br
+.ti -1c
+.RI "def \fBfilter_books\fP (self)"
+.br
+.ti -1c
+.RI "def \fBextract_metadata\fP (self, book)"
+.br
+.ti -1c
+.RI "def \fBextract_content\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBextract_cover_html\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBextract_cover_image\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBcompare_shelf_current\fP (self)"
+.br
+.ti -1c
+.RI "def \fBimport_books\fP (self, list=None)"
+.br
+.in -1c
+.SS "Static Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fBprocess_book\fP (book)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBfile_list\fP"
+.br
+.ti -1c
+.RI "\fBopf_regx\fP"
+.br
+.ti -1c
+.RI "\fBcover_regx\fP"
+.br
+.ti -1c
+.RI "\fBhtml_regx\fP"
+.br
+.ti -1c
+.RI "\fBroot_dir\fP"
+.br
+.ti -1c
+.RI "\fBbook_folder\fP"
+.br
+.ti -1c
+.RI "\fBbook_shelf\fP"
+.br
+.ti -1c
+.RI "\fBbooks\fP"
+.br
+.ti -1c
+.RI "\fBdb_pointer\fP"
+.br
+.ti -1c
+.RI "\fBconfig\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+Decodes book metadata for storage
+
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)"
+
+.PP
+.nf
+Calls storage system, gets list of books stored and compares against files on disk
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching opf_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching html_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching cover_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata ( self, book)"
+
+.PP
+.nf
+Return extracted metadata and cover picture
+book['path'] == Full path to ebook file
+book['files'] == list of files from self.process_book(book)
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.filter_books ( self)"
+
+.PP
+.nf
+Calls scan_folder and filters out book files
+Proceeds to call process_book
+
+:returns self._book_list_expanded: json string containing all book metadata
+
+.fi
+.PP
+
+.PP
+Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&.
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fCNone\fP)"
+
+.PP
+.nf
+Main entry point for import operations.
+Gets a list of new files via compare_shelf_current.
+Iterates over list and inserts new books into database.
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.process_book ( book)\fC [static]\fP"
+
+.PP
+.nf
+Return dictionary of epub file contents
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fCNone\fP)"
+
+.PP
+.nf
+Scan folder by _path, allows recurisive scanning
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3 b/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3
new file mode 100644
index 0000000..6f09925
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_pyShelf_BookDisplay.3
@@ -0,0 +1,107 @@
+.TH "src.backend.lib.pyShelf.BookDisplay" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.pyShelf.BookDisplay
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self, **kwargs)"
+.br
+.ti -1c
+.RI "def \fBnextPage\fP (self)"
+.br
+.ti -1c
+.RI "def \fBpreviousPage\fP (self)"
+.br
+.ti -1c
+.RI "def \fBbooksPerPage\fP (self, screen_size)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBbooks_per_page\fP"
+.br
+.ti -1c
+.RI "\fBcurrent_page\fP"
+.br
+.ti -1c
+.RI "\fBthumbnail_size\fP"
+.br
+.ti -1c
+.RI "\fBthumbnail_scale\fP"
+.br
+.ti -1c
+.RI "\fBtotal_pages\fP"
+.br
+.ti -1c
+.RI "\fBscreen_size\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+All functions related to displaying book information in the HTML UI
+.fi
+.PP
+
+.SH "Constructor & Destructor Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.__init__ ( self, ** kwargs)"
+
+.PP
+.nf
+Initialize class variables
+:return: None
+
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.booksPerPage ( self, screen_size)"
+
+.PP
+.nf
+## TODO Remove me
+Set books per page
+:param screen_size: Array containing x,y pixel sizes
+:return: self.books_per_page
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.nextPage ( self)"
+
+.PP
+.nf
+## TODO Remove me
+Goto next book page
+:return: new current_page
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.pyShelf\&.BookDisplay\&.previousPage ( self)"
+
+.PP
+.nf
+## TODO Remove me
+Goto previous book page
+:return: new current_page
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3 b/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3
new file mode 100644
index 0000000..4f528de
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_pyShelf_InitFiles.3
@@ -0,0 +1,42 @@
+.TH "src.backend.lib.pyShelf.InitFiles" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.pyShelf.InitFiles
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self, file_array)"
+.br
+.ti -1c
+.RI "def \fBCreateFile\fP (self, _pointer)"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+First run file creation operations
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.pyShelf\&.InitFiles\&.CreateFile ( self, _pointer)"
+
+.PP
+.nf
+Checks if file exists and creates it if not
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_lib_storage_Storage.3 b/docs/man/man3/src_backend_lib_storage_Storage.3
new file mode 100644
index 0000000..43aebee
--- /dev/null
+++ b/docs/man/man3/src_backend_lib_storage_Storage.3
@@ -0,0 +1,121 @@
+.TH "src.backend.lib.storage.Storage" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.lib.storage.Storage
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self, config)"
+.br
+.ti -1c
+.RI "def \fBcheck_ownership\fP (self, table=None)"
+.br
+.ti -1c
+.RI "def \fBcreate_tables\fP (self)"
+.br
+.ti -1c
+.RI "def \fBinsert_book\fP (self, book)"
+.br
+.ti -1c
+.RI "def \fBbook_paths_list\fP (self)"
+.br
+.ti -1c
+.RI "def \fBcommit\fP (self)"
+.br
+.ti -1c
+.RI "def \fBclose\fP (self)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBsql\fP"
+.br
+.ti -1c
+.RI "\fBuser\fP"
+.br
+.ti -1c
+.RI "\fBpassword\fP"
+.br
+.ti -1c
+.RI "\fBdb_host\fP"
+.br
+.ti -1c
+.RI "\fBdb_port\fP"
+.br
+.ti -1c
+.RI "\fBdb\fP"
+.br
+.ti -1c
+.RI "\fBconfig\fP"
+.br
+.ti -1c
+.RI "\fBcursor\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.PP
+.nf
+Contains all methods for system storage
+.fi
+.PP
+
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.book_paths_list ( self)"
+
+.PP
+.nf
+Get file paths from database for comparison to system files
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.close ( self)"
+
+.PP
+.nf
+Close database connection
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.commit ( self)"
+
+.PP
+.nf
+Commit database transactions
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.create_tables ( self)"
+
+.PP
+.nf
+Create table structure
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.storage\&.Storage\&.insert_book ( self, book)"
+
+.PP
+.nf
+Insert book in database
+:returns: True if succeeds False if not
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_tests_config_test_TestConfig.3 b/docs/man/man3/src_backend_tests_config_test_TestConfig.3
new file mode 100644
index 0000000..bace3ca
--- /dev/null
+++ b/docs/man/man3/src_backend_tests_config_test_TestConfig.3
@@ -0,0 +1,35 @@
+.TH "src.backend.tests.config_test.TestConfig" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.tests.config_test.TestConfig
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fBtest_book_dir\fP (self)"
+.br
+.ti -1c
+.RI "def \fBtest_title\fP (self)"
+.br
+.ti -1c
+.RI "def \fBtest_version\fP (self)"
+.br
+.in -1c
+.SS "Static Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBconfig\fP = \fBConfig\fP(os\&.path\&.abspath(os\&.path\&.curdir))"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3 b/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3
new file mode 100644
index 0000000..90b6072
--- /dev/null
+++ b/docs/man/man3/src_backend_tests_library_test_TestCatalogue.3
@@ -0,0 +1,32 @@
+.TH "src.backend.tests.library_test.TestCatalogue" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.tests.library_test.TestCatalogue
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fBtest_filter_books\fP (self)"
+.br
+.in -1c
+.SS "Static Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBroot\fP = os\&.path\&.abspath(os\&.path\&.curdir)"
+.br
+.ti -1c
+.RI "\fBconfig\fP = \fBTest_Config\fP()"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3 b/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3
new file mode 100644
index 0000000..4149984
--- /dev/null
+++ b/docs/man/man3/src_backend_tests_library_test_Test_Catalogue.3
@@ -0,0 +1,179 @@
+.TH "src.backend.tests.library_test.Test_Catalogue" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.tests.library_test.Test_Catalogue
+.SH SYNOPSIS
+.br
+.PP
+.PP
+Inherits \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&.
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self)"
+.br
+.ti -1c
+.RI "def \fBfilter_books\fP (self)"
+.br
+.ti -1c
+.RI "def \fBscan_folder\fP (self, _path=None)"
+.br
+.ti -1c
+.RI "def \fBextract_metadata\fP (self, book)"
+.br
+.ti -1c
+.RI "def \fBextract_content\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBextract_cover_html\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBextract_cover_image\fP (self, book_zip, book)"
+.br
+.ti -1c
+.RI "def \fBcompare_shelf_current\fP (self)"
+.br
+.ti -1c
+.RI "def \fBimport_books\fP (self, list=None)"
+.br
+.in -1c
+.SS "Static Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fBprocess_book\fP (book)"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBbook_shelf\fP"
+.br
+.ti -1c
+.RI "\fBfile_list\fP"
+.br
+.ti -1c
+.RI "\fBopf_regx\fP"
+.br
+.ti -1c
+.RI "\fBcover_regx\fP"
+.br
+.ti -1c
+.RI "\fBhtml_regx\fP"
+.br
+.ti -1c
+.RI "\fBroot_dir\fP"
+.br
+.ti -1c
+.RI "\fBbook_folder\fP"
+.br
+.ti -1c
+.RI "\fBbooks\fP"
+.br
+.ti -1c
+.RI "\fBdb_pointer\fP"
+.br
+.ti -1c
+.RI "\fBconfig\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)\fC [inherited]\fP"
+
+.PP
+.nf
+Calls storage system, gets list of books stored and compares against files on disk
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)\fC [inherited]\fP"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching opf_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)\fC [inherited]\fP"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching html_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)\fC [inherited]\fP"
+
+.PP
+.nf
+Opens epub as zip file filters then stores as list any files matching cover_regx
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata ( self, book)\fC [inherited]\fP"
+
+.PP
+.nf
+Return extracted metadata and cover picture
+book['path'] == Full path to ebook file
+book['files'] == list of files from self.process_book(book)
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.tests\&.library_test\&.Test_Catalogue\&.filter_books ( self)"
+
+.PP
+.nf
+Calls scan_folder and filters out book files
+Proceeds to call process_book
+
+:returns self._book_list_expanded: json string containing all book metadata
+
+.fi
+.PP
+
+.PP
+Reimplemented from \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&.
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fCNone\fP)\fC [inherited]\fP"
+
+.PP
+.nf
+Main entry point for import operations.
+Gets a list of new files via compare_shelf_current.
+Iterates over list and inserts new books into database.
+
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.process_book ( book)\fC [static]\fP, \fC [inherited]\fP"
+
+.PP
+.nf
+Return dictionary of epub file contents
+.fi
+.PP
+
+.SS "def src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fCNone\fP)\fC [inherited]\fP"
+
+.PP
+.nf
+Scan folder by _path, allows recurisive scanning
+
+.fi
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/man/man3/src_backend_tests_library_test_Test_Config.3 b/docs/man/man3/src_backend_tests_library_test_Test_Config.3
new file mode 100644
index 0000000..4a44df5
--- /dev/null
+++ b/docs/man/man3/src_backend_tests_library_test_Test_Config.3
@@ -0,0 +1,88 @@
+.TH "src.backend.tests.library_test.Test_Config" 3 "Wed Jan 1 2020" "Version 0.4.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src.backend.tests.library_test.Test_Config
+.SH SYNOPSIS
+.br
+.PP
+.PP
+Inherits \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&.
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "def \fB__init__\fP (self)"
+.br
+.ti -1c
+.RI "def \fBopen_file\fP (self, root='config\&.json')"
+.br
+.in -1c
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBbook_path\fP"
+.br
+.ti -1c
+.RI "\fBTITLE\fP"
+.br
+.ti -1c
+.RI "\fBVERSION\fP"
+.br
+.ti -1c
+.RI "\fBbook_shelf\fP"
+.br
+.ti -1c
+.RI "\fBcatalogue_db\fP"
+.br
+.ti -1c
+.RI "\fBuser\fP"
+.br
+.ti -1c
+.RI "\fBpassword\fP"
+.br
+.ti -1c
+.RI "\fBdb_host\fP"
+.br
+.ti -1c
+.RI "\fBdb_port\fP"
+.br
+.ti -1c
+.RI "\fBfile_array\fP"
+.br
+.ti -1c
+.RI "\fBroot\fP"
+.br
+.ti -1c
+.RI "\fBauto_scan\fP"
+.br
+.ti -1c
+.RI "\fBallowed_hosts\fP"
+.br
+.ti -1c
+.RI "\fBdb_user\fP"
+.br
+.ti -1c
+.RI "\fBdb_pass\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+.SH "Member Function Documentation"
+.PP
+.SS "def src\&.backend\&.tests\&.library_test\&.Test_Config\&.open_file ( self, _cp = \fC'config\&.json'\fP)"
+
+.PP
+.nf
+Opens config.json and reads in configuration options
+
+.fi
+.PP
+
+.PP
+Reimplemented from \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&.
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&.
diff --git a/docs/warn.log b/docs/warn.log
index 30ea500..39ffa46 100644
--- a/docs/warn.log
+++ b/docs/warn.log
@@ -1,106 +1,132 @@
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:19: warning: Compound pyShelf::src::backend::tests::library_test::Test_Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:28: warning: Compound pyShelf::src::backend::tests::library_test::TestCatalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:6: warning: Compound pyShelf::src::backend::tests::config_test::TestConfig is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:8: warning: Compound pyShelf::src::backend::tests::library_test::Test_Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:12: warning: Member __init__(self) (function) of class pyShelf::src::backend::lib::api_hooks::DuckDuckGo is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:13: warning: Member url (variable) of class pyShelf::src::backend::lib::api_hooks::DuckDuckGo is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:15: warning: return type of member pyShelf.src.backend.lib.api_hooks.DuckDuckGo.image_result is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member catalogue_db (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member user (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member password (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member db_host (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:31: warning: Member db_port (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:32: warning: Member file_array (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member root (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member auto_scan (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:39: warning: return type of member pyShelf.src.backend.lib.config.Config.open_file is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:22: warning: Member __init__(self, config) (function) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:23: warning: Member file_list (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member opf_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member cover_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member html_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member root_dir (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member book_folder (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:29: warning: Member book_shelf (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member books (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member db_pointer (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member config (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:140: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.compare_shelf_current is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:115: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_content is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:122: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_cover_html is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:129: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_cover_image is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:89: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_metadata is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:52: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.filter_books is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:158: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.import_books is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:73: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.process_book is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.scan_folder is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:45: warning: Member books_per_page (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:46: warning: Member current_page (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:47: warning: Member thumbnail_size (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:48: warning: Member thumbnail_scale (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:49: warning: Member total_pages (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:51: warning: Member screen_size (variable) of class pyShelf::src::backend::lib::pyShelf::BookDisplay is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:40: warning: parameters of member pyShelf.src.backend.lib.pyShelf.BookDisplay.__init__ are not (all) documented
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:73: warning: return type of member pyShelf.src.backend.lib.pyShelf.BookDisplay.booksPerPage is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:55: warning: return type of member pyShelf.src.backend.lib.pyShelf.BookDisplay.nextPage is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:64: warning: return type of member pyShelf.src.backend.lib.pyShelf.BookDisplay.previousPage is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:15: warning: Member __init__(self, file_array) (function) of class pyShelf::src::backend::lib::pyShelf::InitFiles is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:27: warning: return type of member pyShelf.src.backend.lib.pyShelf.InitFiles.CreateFile is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:15: warning: Member __init__(self, db_pointer, config) (function) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:17: warning: Member sql (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:18: warning: Member user (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:19: warning: Member password (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:20: warning: Member db_host (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:21: warning: Member db_port (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:22: warning: Member db (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:25: warning: Member cursor (variable) of class pyShelf::src::backend::lib::storage::Storage is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:58: warning: return type of member pyShelf.src.backend.lib.storage.Storage.book_paths_list is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:81: warning: return type of member pyShelf.src.backend.lib.storage.Storage.close is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:71: warning: return type of member pyShelf.src.backend.lib.storage.Storage.commit is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:28: warning: return type of member pyShelf.src.backend.lib.storage.Storage.create_tables is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:39: warning: return type of member pyShelf.src.backend.lib.storage.Storage.insert_book is not documented
-/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:9: warning: Member test_book_dir(self) (function) of class pyShelf::src::backend::tests::config_test::TestConfig is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:12: warning: Member test_title(self) (function) of class pyShelf::src::backend::tests::config_test::TestConfig is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:15: warning: Member test_version(self) (function) of class pyShelf::src::backend::tests::config_test::TestConfig is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:7: warning: Member config (variable) of class pyShelf::src::backend::tests::config_test::TestConfig is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:20: warning: Member __init__(self) (function) of class pyShelf::src::backend::tests::library_test::Test_Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:24: warning: Member book_shelf (variable) of class pyShelf::src::backend::tests::library_test::Test_Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:23: warning: Member file_list (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member opf_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member cover_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member html_regx (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member root_dir (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member book_folder (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member books (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member db_pointer (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member config (variable) of class pyShelf::src::backend::lib::library::Catalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:140: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.compare_shelf_current is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:115: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_content is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:122: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_cover_html is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:129: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_cover_image is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:89: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.extract_metadata is not documented
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:23: warning: return type of member pyShelf.src.backend.tests.library_test.Test_Catalogue.filter_books is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:158: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.import_books is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:73: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.process_book is not documented
-/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: return type of member pyShelf.src.backend.lib.library.Catalogue.scan_folder is not documented
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:9: warning: Member __init__(self) (function) of class pyShelf::src::backend::tests::library_test::Test_Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member catalogue_db (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member user (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member password (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member db_host (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:31: warning: Member db_port (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:32: warning: Member file_array (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member root (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member auto_scan (variable) of class pyShelf::src::backend::lib::config::Config is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:13: warning: return type of member pyShelf.src.backend.tests.library_test.Test_Config.open_file is not documented
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:32: warning: Member test_filter_books(self) (function) of class pyShelf::src::backend::tests::library_test::TestCatalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:29: warning: Member root (variable) of class pyShelf::src::backend::tests::library_test::TestCatalogue is not documented.
-/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:30: warning: Member config (variable) of class pyShelf::src::backend::tests::library_test::TestCatalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:9: warning: Compound src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:19: warning: Compound src::backend::tests::library_test::Test_Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:8: warning: Compound src::backend::tests::library_test::Test_Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:28: warning: Compound src::backend::tests::library_test::TestCatalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:6: warning: Compound src::backend::tests::config_test::TestConfig is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:12: warning: Member __init__(self) (function) of class src::backend::lib::api_hooks::DuckDuckGo is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:13: warning: Member url (variable) of class src::backend::lib::api_hooks::DuckDuckGo is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/api_hooks.py:15: warning: return type of member src.backend.lib.api_hooks.DuckDuckGo.image_result is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:25: warning: Member catalogue_db (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:26: warning: Member user (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member password (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member db_host (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member db_port (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member file_array (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:33: warning: Member root (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:34: warning: Member auto_scan (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member allowed_hosts (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member db_user (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:38: warning: Member db_pass (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:40: warning: return type of member src.backend.lib.config.Config.open_file is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:10: warning: Member __init__(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:21: warning: Member screen(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:24: warning: Member installer(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:82: warning: Member prompt(self, questions) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:93: warning: Member h_rule(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:96: warning: Member banner(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:106: warning: Member banner_render(self) (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:79: warning: Member clear() (function) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:11: warning: Member term (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:12: warning: Member y (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:13: warning: Member home (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:14: warning: Member user (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:15: warning: Member version (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:16: warning: Member slogan (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:17: warning: Member green (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:18: warning: Member blue (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/display.py:19: warning: Member clr_term (variable) of class src::backend::lib::display::TerminalDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:22: warning: Member __init__(self, config) (function) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:23: warning: Member file_list (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member opf_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member cover_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member html_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member root_dir (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member book_folder (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:29: warning: Member book_shelf (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member books (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member db_pointer (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member config (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:140: warning: return type of member src.backend.lib.library.Catalogue.compare_shelf_current is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:115: warning: return type of member src.backend.lib.library.Catalogue.extract_content is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:122: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_html is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:129: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_image is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:89: warning: return type of member src.backend.lib.library.Catalogue.extract_metadata is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:52: warning: return type of member src.backend.lib.library.Catalogue.filter_books is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:158: warning: return type of member src.backend.lib.library.Catalogue.import_books is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:73: warning: return type of member src.backend.lib.library.Catalogue.process_book is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: return type of member src.backend.lib.library.Catalogue.scan_folder is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:45: warning: Member books_per_page (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:46: warning: Member current_page (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:47: warning: Member thumbnail_size (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:48: warning: Member thumbnail_scale (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:49: warning: Member total_pages (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:51: warning: Member screen_size (variable) of class src::backend::lib::pyShelf::BookDisplay is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:40: warning: parameters of member src.backend.lib.pyShelf.BookDisplay.__init__ are not (all) documented
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:73: warning: return type of member src.backend.lib.pyShelf.BookDisplay.booksPerPage is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:55: warning: return type of member src.backend.lib.pyShelf.BookDisplay.nextPage is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:64: warning: return type of member src.backend.lib.pyShelf.BookDisplay.previousPage is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:15: warning: Member __init__(self, file_array) (function) of class src::backend::lib::pyShelf::InitFiles is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/pyShelf.py:27: warning: return type of member src.backend.lib.pyShelf.InitFiles.CreateFile is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:15: warning: Member __init__(self, config) (function) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:27: warning: Member check_ownership(self, table=None) (function) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:16: warning: Member sql (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:17: warning: Member user (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:18: warning: Member password (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:19: warning: Member db_host (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:20: warning: Member db_port (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:21: warning: Member db (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:24: warning: Member config (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:25: warning: Member cursor (variable) of class src::backend::lib::storage::Storage is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:76: warning: return type of member src.backend.lib.storage.Storage.book_paths_list is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:99: warning: return type of member src.backend.lib.storage.Storage.close is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:89: warning: return type of member src.backend.lib.storage.Storage.commit is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:46: warning: return type of member src.backend.lib.storage.Storage.create_tables is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/storage.py:57: warning: return type of member src.backend.lib.storage.Storage.insert_book is not documented
+/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:9: warning: Member test_book_dir(self) (function) of class src::backend::tests::config_test::TestConfig is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:12: warning: Member test_title(self) (function) of class src::backend::tests::config_test::TestConfig is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:15: warning: Member test_version(self) (function) of class src::backend::tests::config_test::TestConfig is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/config_test.py:7: warning: Member config (variable) of class src::backend::tests::config_test::TestConfig is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:20: warning: Member __init__(self) (function) of class src::backend::tests::library_test::Test_Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:24: warning: Member book_shelf (variable) of class src::backend::tests::library_test::Test_Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:23: warning: Member file_list (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member opf_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member cover_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member html_regx (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member root_dir (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member book_folder (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member books (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member db_pointer (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member config (variable) of class src::backend::lib::library::Catalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:140: warning: return type of member src.backend.lib.library.Catalogue.compare_shelf_current is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:115: warning: return type of member src.backend.lib.library.Catalogue.extract_content is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:122: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_html is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:129: warning: return type of member src.backend.lib.library.Catalogue.extract_cover_image is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:89: warning: return type of member src.backend.lib.library.Catalogue.extract_metadata is not documented
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:23: warning: return type of member src.backend.tests.library_test.Test_Catalogue.filter_books is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:158: warning: return type of member src.backend.lib.library.Catalogue.import_books is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:73: warning: return type of member src.backend.lib.library.Catalogue.process_book is not documented
+/home/raelon/Projects/pyShelf/src/backend/lib/library.py:35: warning: return type of member src.backend.lib.library.Catalogue.scan_folder is not documented
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:9: warning: Member __init__(self) (function) of class src::backend::tests::library_test::Test_Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:20: warning: Member book_path (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:21: warning: Member TITLE (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:22: warning: Member VERSION (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:24: warning: Member book_shelf (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:25: warning: Member catalogue_db (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:26: warning: Member user (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:27: warning: Member password (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:28: warning: Member db_host (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:29: warning: Member db_port (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:30: warning: Member file_array (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:33: warning: Member root (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:34: warning: Member auto_scan (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:36: warning: Member allowed_hosts (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:37: warning: Member db_user (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/lib/config.py:38: warning: Member db_pass (variable) of class src::backend::lib::config::Config is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:13: warning: return type of member src.backend.tests.library_test.Test_Config.open_file is not documented
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:32: warning: Member test_filter_books(self) (function) of class src::backend::tests::library_test::TestCatalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:29: warning: Member root (variable) of class src::backend::tests::library_test::TestCatalogue is not documented.
+/home/raelon/Projects/pyShelf/src/backend/tests/library_test.py:30: warning: Member config (variable) of class src::backend::tests::library_test::TestCatalogue is not documented.
diff --git a/doxygen.conf b/doxygen.conf
index 4ee4fbc..0340ad9 100644
--- a/doxygen.conf
+++ b/doxygen.conf
@@ -38,7 +38,7 @@ PROJECT_NAME = "pyShelf Open Source Ebook Server"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 0.3.0
+PROJECT_NUMBER = 0.4.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/importBooks b/importBooks
index 326e905..b69661a 100755
--- a/importBooks
+++ b/importBooks
@@ -3,6 +3,7 @@
import pathlib
import sys
+from src.backend.lib.storage import Storage
from src.backend.pyShelf_ScanLibrary import execute_scan
PRG_PATH = pathlib.Path.cwd()
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..cda8ef9
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+eval "pip install -r requirements.txt"
+eval python3 installer
diff --git a/installer b/installer
new file mode 100644
index 0000000..71ad7a0
--- /dev/null
+++ b/installer
@@ -0,0 +1,357 @@
+#!/usr/bin/python3
+import json
+import os
+import pathlib
+import platform
+import pprint
+import subprocess as sp
+import sys
+from shutil import copyfile
+
+import psutil
+from src.backend.lib.display import TerminalDisplay
+
+log_file = "installer.log"
+messages = []
+
+
+class Configuration:
+ def __init__(self):
+ self._cp = pathlib.Path("config.json")
+ self._data = self.open_file()
+ self.system = platform.system()
+
+ def open_file(self):
+ """
+ Try to open and then backup the configuration file.
+ Fail and return false if initial configuration is not found.
+ # TODO: More specific error handling
+ """
+ try:
+ with open(str(self._cp), "r") as read_file:
+ data = json.load(read_file)
+ with open("config.backup.json", "w") as backup_file:
+ json.dump(data, backup_file)
+ return data
+ except Exception as e:
+ print(e)
+ return False
+
+ def write_file(self, data):
+ """
+ Write the provided data to the new configuration file
+ """
+ with open(str(self._cp), "w") as write_file:
+ json.dump(data, write_file)
+ return True
+
+
+class RequiredServices:
+ def check_ps(self, service_list):
+ """
+ Check service_list against running processes
+ by calling self.process_list, remove found
+ services from the list and return
+ """
+ # Get the matched processes
+ _matches = self.process_list().intersection(set(service_list))
+ for r in _matches:
+ service_list.remove(r)
+ return service_list
+
+ @staticmethod
+ def process_list():
+ """
+ Iterate running processes returning the name of each
+ make it a set and return
+ """
+ _processes = []
+ for p in psutil.process_iter():
+ _processes.append(p.name())
+ return set(_processes)
+
+ @staticmethod
+ def web_server_found(service_list):
+ # Determine whether or not both possible webservers are missing
+ _c = 0
+ for r in service_list:
+ if r == "nginx" or r == "httpd":
+ _c = _c + 1
+ if _c > 1:
+ return False # Return false if neither are found
+ else:
+ return True # Return true if one is found
+
+ @staticmethod
+ def db_server_found(service_list):
+ _c = 0
+ for r in service_list:
+ if r == "postgres":
+ _c = _c + 1
+ if _c > 0:
+ return False
+ else:
+ return True
+
+
+class SystemInstaller:
+ def __init__(self):
+ self.bin = self.get()
+ self.site_dirs = ["/etc/nginx/sites-available", "/etc/nginx/sites-enabled"]
+ self.nginx_conf = "pyshelf_nginx.conf"
+
+ def get(self):
+ platfrm = platform.platform().split("-")
+ if platfrm[0].lower() == "linux":
+ installers = [
+ {"bin": "apt", "options": [], "search": "search", "install": "install"},
+ {"bin": "pacman", "options": [], "search": "-Ss", "install": "-S"},
+ {"bin": "yum", "options": [], "search": "search", "install": "install"},
+ {"bin": "docker", "options": []},
+ ]
+ _paths = os.environ["PATH"].split(":")
+ for p in _paths:
+ for _installer in installers:
+ _fp = p + "/" + str(_installer["bin"])
+ if os.path.isfile(_fp):
+ global messages
+ messages = messages + [
+ "Found system installer binary " + str(_installer["bin"])
+ ]
+ return _installer
+
+ def copy_config(self, _file=None, _dirs=None):
+ if _file is None:
+ _file = self.nginx_conf
+ if _dirs is None:
+ _dirs = self.site_dirs
+
+ outfile = "/%s" % _file.__str__()
+ if os.path.isdir(_dirs[0]):
+ os.system("sudo cp %s %s" % (_file, _dirs[0] + outfile))
+ else:
+ os.system("sudo mkdir %s" % _dirs[0])
+ os.system("sudo cp %s %s" % (_file, _dirs[0] + outfile))
+ try:
+ if os.path.isdir(_dirs[1]):
+ ln_string = str(_dirs[0] + outfile + " " + _dirs[1] + outfile)
+ os.system("sudo ln -s %s" % ln_string)
+ except Exception as e:
+ pass
+ return True
+
+ def make_nginx_config(self, answers):
+ root = os.path.abspath(".")
+ _fp = "pyshelf_nginx.conf"
+ for r in answers:
+ if r["name"] == "hostname":
+ hostname = r["answer"]
+ elif r["name"] == "webport":
+ port = r["answer"]
+ elif r["name"] == "wsgiport":
+ wsgiport = r["answer"]
+ nginx_conf_str = """
+ # pyshelf_nginx.conf
+ upstream django {server unix://%s/pyshelf_wsgi.sock;}
+ server {
+ listen %s;
+ server_name %s;
+ access_log /var/log/nginx/pyshelf.access.log;
+ error_log /var/log/nginx/pyshelf.error.log;
+ charset utf-8;
+ client_max_body_size 75M;
+ location /media {root %s/src/interface;}
+ location /static {root %s/src/interface;}
+ location /books {internal; alias %s;}
+ location / {uwsgi_pass django; include %s/uwsgi_params;}
+ }
+ """ % (
+ root,
+ port,
+ hostname,
+ root,
+ root,
+ root,
+ root,
+ )
+ with open(_fp, "w") as write_file:
+ write_file.write(nginx_conf_str)
+ global messages
+ messages = messages + ["Generated new pyshelf_nginx.conf", nginx_conf_str]
+
+ def make_wsgi_config(self, answers):
+ root = os.path.abspath(".")
+ _fp = "uwsgi.ini"
+ for r in answers:
+ if r["name"] == "hostname":
+ hostname = r["answer"]
+ elif r["name"] == "wsgiport":
+ wsgiport = r["answer"]
+ wsgi_conf_str = """
+ [uwsgi]
+ chdir=%s/src
+ module=frontend.wsgi
+ master=True
+ pidfile=/tmp/pyShelf.pid
+ vacuum=True
+ socket=%s/pyshelf_wsgi.sock
+ chmod-socket=666
+ """ % (
+ root,
+ root
+ )
+ with open(_fp, "w") as write_file:
+ write_file.write(wsgi_conf_str)
+ global messages
+ messages = messages + ["Generated uwsgi.ini", wsgi_conf_str]
+
+ def log(self):
+ global log_file
+ global messages
+ with open(log_file, "w") as write_file:
+ write_file.write(TerminalDisplay().banner_render())
+ for message in messages:
+ write_file.write(message + "\n")
+ messages = messages + ["Log file written to " + log_file.__str__()]
+
+
+config = Configuration().open_file()
+sysinstall = SystemInstaller()
+installer = sysinstall.bin
+# Get user configuration options
+install_answers = TerminalDisplay().installer()
+for key in install_answers:
+ config[key["name"]] = key["answer"]
+config["USER"] = os.environ["USER"]
+# Write configuration
+Configuration().write_file(config)
+
+# Start checking for our list of required services
+service_list = ["postgres", "nginx", "httpd", "test"]
+req = RequiredServices().check_ps(service_list)
+
+# Does user have either nginx || apache?
+if RequiredServices().web_server_found(req) is False:
+ web_prompt = [
+ {
+ "message": " You must have either apache or nginx\n would you like us to try and install nginx now? > ",
+ "options": "nginx",
+ "name": "NGINX",
+ "answer": None,
+ "default": "no",
+ }
+ ]
+ install_prompt = TerminalDisplay().prompt(web_prompt)
+ if install_prompt[0]["answer"] == "yes":
+ if installer is None:
+ installer = SystemInstaller().bin
+ if installer["bin"] == "pacman":
+ package = "nginx-mainline"
+ else:
+ package = "nginx"
+ options = ""
+ for o in installer["options"]:
+ options = options + " " + o
+ cmd = (
+ "sudo "
+ + installer["bin"]
+ + " "
+ + installer["install"]
+ + " "
+ + options
+ + package
+ )
+ install_status = os.system(cmd)
+ os.system("sudo systemctl start nginx")
+ messages = messages + [
+ "Nginx installed and started",
+ "To enable autostart you must run",
+ " sudo systemctl enable nginx",
+ "\n",
+ ]
+# Does user have postgreSQL?
+if RequiredServices().db_server_found(req) is False:
+ db_prompt = [
+ {
+ "message": " You must have PostgreSQL\n would you like us to try and install it now? > ",
+ "options": "postgres",
+ "name": "postgresql",
+ "answer": None,
+ "default": "no",
+ }
+ ]
+ install_prompt = TerminalDisplay().prompt(db_prompt)
+ if install_prompt[0]["answer"] == "yes":
+ if installer is None:
+ installer = SystemInstaller().bin
+ options = ""
+ for o in installer["options"]:
+ options = options + " " + o
+ package = "postgresql postgresql-contrib"
+ cmd = (
+ "sudo "
+ + installer["bin"]
+ + " "
+ + installer["install"]
+ + " "
+ + options
+ + package
+ )
+ install_status = os.system(cmd)
+ for r in install_answers:
+ if r["name"] == "PASSWORD": sql_pass = r["answer"]
+
+ sql_user = config["USER"]
+ db_name = "pyshelf"
+ psql_cmd = """
+ CREATE DATABASE %s;
+ CREATE USER %s WITH PASSWORD \'%s\';
+ GRANT ALL PRIVILEGES ON DATABASE %s TO %s;
+ """ % (db_name, sql_user, sql_pass, db_name, sql_user)
+ _sql_file = "create_db.sql"
+ with open(_sql_file, "w") as sql_file_open:
+ sql_file_open.write(psql_cmd)
+ sql_file_open.close()
+ os.system("sudo systemctl start postgresql")
+ os.system("sudo -u postgres initdb --locale=en_US.UTF-8 -E UTF8 -D /var/lib/postgres/data")
+ os.system("sudo -u postgres psql -f %s"%_sql_file)
+ messages = messages + [
+ "PostgreSQL installed and started",
+ "To enable autostart you must run",
+ " sudo systemctl enable nginx",
+ "\n",
+ "Database cluster initialized at /var/lib/postgres",
+ "pyShelf database and user created",
+ psql_cmd
+ ]
+
+# Post install configurations
+sysinstall.make_nginx_config(install_answers)
+try:
+ os.chdir("src/")
+ os.system("python manage.py makemigrations")
+ os.system("python manage.py makemigrations interface")
+ os.system("python manage.py migrate")
+ os.system("python manage.py migrate interface")
+ os.chdir("../")
+except Exception as e:
+ print("-"*80)
+ print(" E:"+e)
+try:
+ copy_config = sysinstall.copy_config()
+ if copy_config:
+ messages = messages + ["pyShelf site config copied to sites-available, and symlinked to sites-enabled"]
+except Exception as e:
+ messages = messages + ["nginx site config not copied", "A nginx config for your install has been created \"pyshelf_nginx.conf\""]
+sysinstall.make_wsgi_config(install_answers)
+messages = messages + ["You should now import your books by running importBooks", "You can then start the interface with uwsgi --ini uwsgi.ini"]
+
+# Display end screen
+sysinstall.log()
+TerminalDisplay().clear()
+TerminalDisplay().banner()
+for message in messages:
+ print(" "+message)
+print()
+
+TerminalDisplay().h_rule()
diff --git a/pyproject.toml b/pyproject.toml
index 38d47ab..eaa5fde 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,4 +7,4 @@ use_parentheses = true
# NOTE: the known_third_party setting is managed by
# seed-isort-config and should not be modified directly.
# Any changes made to this setting will be overwritten.
-known_third_party = ["bs4", "django", "interface", "psycopg2", "requests"]
+known_third_party = ["backend", "bs4", "django", "interface", "prompt_toolkit", "psycopg2", "pyfiglet", "requests"]
diff --git a/pyshelf_nginx.conf b/pyshelf_nginx.conf
deleted file mode 100644
index 9820f27..0000000
--- a/pyshelf_nginx.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-# mysite_nginx.conf
-
-# the upstream component nginx needs to connect to
-upstream django {
- # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
- server 127.0.0.1:8001; # for a web port socket (we'll use this first)
-}
-
-# configuration of the server
-server {
- # the port your site will be served on
- listen 8000;
- # the domain name it will serve for
- server_name 127.0.0.1; # substitute your machine's IP address or FQDN
- charset utf-8;
-
- # max upload size
- client_max_body_size 75M; # adjust to taste
-
- # Django media
- location /media {
- alias /home/raelon/Projects/pyShelf/frontend/interface/media; # your Django project's media files - amend as required
- }
-
- location /static {
- alias /home/raelon/Projects/pyShelf/frontend/interface/static; # your Django project's static files - amend as required
- }
-
- location /books {
- internal;
- alias /home/raelon/Projects/pyShelf/books;
- # Absolute location of your ebook files
- }
-
- # Finally, send all non-media requests to the Django server.
- location / {
- uwsgi_pass django;
- include /home/raelon/Projects/pyShelf/uwsgi_params; # the uwsgi_params file you installed
- }
-}
diff --git a/requirements.txt b/requirements.txt
index b2f93d8..dfb1cd5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -15,3 +15,6 @@ toml
uwsgi
django-debug-toolbar
psycopg2-binary
+prompt_toolkit
+psutil
+pyfiglet
diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py
index 1591db6..c36c0c3 100755
--- a/src/backend/lib/config.py
+++ b/src/backend/lib/config.py
@@ -22,8 +22,6 @@ class Config:
self.VERSION = _data["VERSION"]
self.TITLE = self.TITLE + " ver " + self.VERSION
self.book_shelf = _data["BOOKSHELF"]
- # self.catalogue_db = "data/catalogue.db"
- # self.catalogue_db = str(root) + "/" + _data["DATABASE"]
self.catalogue_db = _data["DATABASE"]
self.user = _data["USER"]
self.password = _data["PASSWORD"]
@@ -31,11 +29,14 @@ class Config:
self.db_port = _data["DB_PORT"]
self.file_array = [
self.book_shelf,
- # self.catalogue_db,
]
self.root = root
self.auto_scan = True
+ self.allowed_hosts = _data["ALLOWED_HOSTS"]
+ self.db_user = _data["USER"]
+ self.db_pass = _data["PASSWORD"]
+
def open_file(self, _cp):
"""
Opens config.json and reads in configuration options
diff --git a/src/backend/lib/display.py b/src/backend/lib/display.py
new file mode 100644
index 0000000..41e1bfd
--- /dev/null
+++ b/src/backend/lib/display.py
@@ -0,0 +1,116 @@
+from __future__ import unicode_literals
+
+import os
+
+import pyfiglet
+from prompt_toolkit import prompt as prm
+
+
+class TerminalDisplay:
+ def __init__(self):
+ self.term = True
+ self.w, self.y = os.get_terminal_size()[0], os.get_terminal_size()[1]
+ self.home = os.environ["HOME"]
+ self.user = os.environ["USER"]
+ self.version = "0.4.0"
+ self.slogan = "The Installer Initiative"
+ self.green = "\033[1;32m"
+ self.blue = "\033[94m"
+ self.clr_term = "\033[m"
+
+ def screen(self):
+ return self.term
+
+ def installer(self):
+ questions = [
+ {
+ "message": ' Input the absolute path to your ebooks\n Enter for default "~/Books" > ',
+ "options": "",
+ "name": "BOOKPATH",
+ "answer": None,
+ "default": self.home + "/Books",
+ },
+ {
+ "message": ' Input your PostgreSQL server ip\n Enter for default "localhost" > ',
+ "options": "localhost",
+ "name": "DB_HOST",
+ "answer": None,
+ "default": "localhost",
+ },
+ {
+ "message": ' Input your PostgreSQL server port\n Enter for default "5432" > ',
+ "options": "5432",
+ "name": "DB_PORT",
+ "answer": None,
+ "default": "5432",
+ },
+ {
+ "message": ' Input your PostgreSQL password\n Enter for default "pyshelf" > ',
+ "options": "pyshelf",
+ "name": "PASSWORD",
+ "answer": None,
+ "default": "pyshelf",
+ },
+ {
+ "message": ' Web ui hostname/ip\n Enter for default "localhost" > ',
+ "options": "localhost",
+ "name": "hostname",
+ "answer": None,
+ "default": "localhost",
+ },
+ {
+ "message": ' Web ui port\n Enter for default "8000" > ',
+ "options": "8000",
+ "name": "webport",
+ "answer": None,
+ "default": "8000",
+ },
+ {
+ "message": ' wsgi port\n Enter for default "8001 > ',
+ "options": "8001",
+ "name": "wsgiport",
+ "answer": None,
+ "default": "8001",
+ },
+ ]
+ return self.prompt(questions)
+
+ @staticmethod
+ def clear():
+ os.system("cls" if os.name == "nt" else "clear")
+
+ def prompt(self, questions):
+ self.clear()
+ answers = questions
+ for answer in answers:
+ self.banner()
+ answer["answer"] = prm(answer["message"])
+ if answer["answer"] == "":
+ answer["answer"] = answer["default"]
+ self.clear()
+ return answers
+
+ def h_rule(self):
+ print("\u2501" * self.w)
+
+ def banner(self):
+ self.h_rule()
+ title = pyfiglet.Figlet(font="cyberlarge")
+ print(self.green + title.renderText("pyShelf") + self.clr_term)
+ print(
+ self.blue + " version " + self.version + self.clr_term + " " + self.slogan
+ )
+ self.h_rule()
+ print()
+
+ def banner_render(self):
+ title = pyfiglet.Figlet(font="cyberlarge")
+ _banner = (
+ title.renderText("pyShelf")
+ + "\nversion "
+ + self.version
+ + " "
+ + self.slogan
+ + "\n"
+ )
+ return _banner
diff --git a/src/backend/lib/library.py b/src/backend/lib/library.py
index 94e7c9d..da764ed 100755
--- a/src/backend/lib/library.py
+++ b/src/backend/lib/library.py
@@ -141,7 +141,7 @@ class Catalogue:
"""
Calls storage system, gets list of books stored and compares against files on disk
"""
- db = Storage(self.db_pointer, self.config)
+ db = Storage(self.config)
stored = db.book_paths_list()
db.close()
if self.books is None:
@@ -162,7 +162,7 @@ class Catalogue:
Iterates over list and inserts new books into database.
"""
book_list = self.compare_shelf_current()
- db = Storage(self.db_pointer, self.config)
+ db = Storage(self.config)
for book in book_list:
book = self.process_book(book)
extracted = self.extract_metadata(book)
diff --git a/src/backend/lib/storage.py b/src/backend/lib/storage.py
index b681a10..e193b88 100755
--- a/src/backend/lib/storage.py
+++ b/src/backend/lib/storage.py
@@ -12,8 +12,7 @@ from .config import Config
class Storage:
"""Contains all methods for system storage"""
- def __init__(self, db_pointer, config):
- # self.db_file = db_pointer
+ def __init__(self, config):
self.sql = config.catalogue_db
self.user = config.user
self.password = config.password
@@ -22,8 +21,27 @@ class Storage:
self.db = psycopg2.connect(
database=self.sql, user=self.user, password=self.password, host=self.db_host
)
+ self.config = config
self.cursor = self.db.cursor()
- # self.create_tables()
+
+ def check_ownership(self, table=None):
+ if table is None:
+ table = "books"
+ _q = "SELECT * FROM books"
+ try:
+ self.cursor.execute(_q)
+ except Exception as e:
+ breakpoint()
+ if e.pgcode == "42501":
+ _q = """ALTER TABLE public.books OWNER to pyshelf;"""
+ self.close()
+ set_perms = Storage(self.config)
+ try:
+ set_perms.cursor.execute(_q)
+ set_perms.close()
+ except Exception as e:
+ print(e)
+ set_perms.close()
def create_tables(self):
"""Create table structure"""
diff --git a/src/backend/pyShelf_ScanLibrary.py b/src/backend/pyShelf_ScanLibrary.py
index 904ee3a..9acbf3d 100755
--- a/src/backend/pyShelf_ScanLibrary.py
+++ b/src/backend/pyShelf_ScanLibrary.py
@@ -6,6 +6,7 @@ import time
from .lib.config import Config
from .lib.library import Catalogue
from .lib.pyShelf import InitFiles
+from .lib.storage import Storage
sys.path.append(os.path.abspath("."))
@@ -18,6 +19,8 @@ def execute_scan(root):
_t1 = time.time()
config = Config(root) # Get configuration settings
InitFiles(config.file_array) # Initialize file system
+
+ Storage(config).check_ownership()
catalogue = Catalogue(config) # Open the Catalogue
catalogue.import_books()
_t2 = time.time()
diff --git a/src/frontend/settings.py b/src/frontend/settings.py
index 397f10e..bddbcb7 100755
--- a/src/frontend/settings.py
+++ b/src/frontend/settings.py
@@ -11,7 +11,17 @@ https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
+import sys
+from pathlib import Path
+from backend.lib.config import Config
+
+CUR_DIR = Path.cwd()
+PRG_DIR = CUR_DIR.parts[0:-1]
+PRG_DIR = Path(*PRG_DIR)
+
+
+CONFIG = Config(PRG_DIR)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -25,7 +35,7 @@ SECRET_KEY = "@(9b9jslgg41u1u=mr)-2*-n2x0vef0zsy39*z@sz18&tvow18"
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
-ALLOWED_HOSTS = ["*"]
+ALLOWED_HOSTS = CONFIG.allowed_hosts
# Application definition
@@ -82,7 +92,7 @@ WSGI_APPLICATION = "frontend.wsgi.application"
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
-
+"""
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
@@ -92,7 +102,15 @@ DATABASES = {
# "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
}
}
+"""
+DATABASES = {
+ "default": {
+ "ENGINE": "django.db.backends.postgresql",
+ "NAME": CONFIG.catalogue_db,
+ "PASSWORD": CONFIG.password,
+ }
+}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
diff --git a/src/interface/migrations/0002_auto_20200101_0445.py b/src/interface/migrations/0002_auto_20200101_0445.py
new file mode 100644
index 0000000..d0f105d
--- /dev/null
+++ b/src/interface/migrations/0002_auto_20200101_0445.py
@@ -0,0 +1,14 @@
+# Generated by Django 2.2.7 on 2020-01-01 04:45
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("interface", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(name="books", options={"managed": False},),
+ ]
diff --git a/src/interface/migrations/0003_auto_20200101_0447.py b/src/interface/migrations/0003_auto_20200101_0447.py
new file mode 100644
index 0000000..22d0ea0
--- /dev/null
+++ b/src/interface/migrations/0003_auto_20200101_0447.py
@@ -0,0 +1,14 @@
+# Generated by Django 2.2.7 on 2020-01-01 04:47
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("interface", "0002_auto_20200101_0445"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(name="books", options={},),
+ ]
diff --git a/src/interface/static/admin/css/changelists.css b/src/interface/static/admin/css/changelists.css
index 17690a3..30a6386 100644
--- a/src/interface/static/admin/css/changelists.css
+++ b/src/interface/static/admin/css/changelists.css
@@ -98,7 +98,8 @@
#changelist #toolbar form input[type="submit"] {
border: 1px solid #ccc;
- padding: 2px 10px;
+ font-size: 13px;
+ padding: 4px 8px;
margin: 0;
vertical-align: middle;
background: #fff;
diff --git a/src/interface/static/admin/css/responsive.css b/src/interface/static/admin/css/responsive.css
index 5b0d1ec..b3db28f 100644
--- a/src/interface/static/admin/css/responsive.css
+++ b/src/interface/static/admin/css/responsive.css
@@ -392,6 +392,10 @@ input[type="submit"], button {
color: #ccc;
}
+ .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
+ width: 75%;
+ }
+
.inline-group {
overflow: auto;
}
diff --git a/src/interface/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/src/interface/static/admin/css/vendor/select2/LICENSE-SELECT2.md
index 86c7c29..8cb8a2b 100644
--- a/src/interface/static/admin/css/vendor/select2/LICENSE-SELECT2.md
+++ b/src/interface/static/admin/css/vendor/select2/LICENSE-SELECT2.md
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors
+Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/src/interface/static/admin/css/vendor/select2/select2.css b/src/interface/static/admin/css/vendor/select2/select2.css
index 447b2b8..ce3afd1 100644
--- a/src/interface/static/admin/css/vendor/select2/select2.css
+++ b/src/interface/static/admin/css/vendor/select2/select2.css
@@ -118,12 +118,14 @@
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
+ -webkit-clip-path: inset(50%) !important;
+ clip-path: inset(50%) !important;
height: 1px !important;
- margin: -1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
- width: 1px !important; }
+ width: 1px !important;
+ white-space: nowrap !important; }
.select2-container--default .select2-selection--single {
background-color: #fff;
@@ -420,9 +422,7 @@
color: #555; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
- float: right; }
-
-.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
+ float: right;
margin-left: 5px;
margin-right: auto; }
diff --git a/src/interface/static/admin/css/vendor/select2/select2.min.css b/src/interface/static/admin/css/vendor/select2/select2.min.css
index 76de04d..60d5990 100644
--- a/src/interface/static/admin/css/vendor/select2/select2.min.css
+++ b/src/interface/static/admin/css/vendor/select2/select2.min.css
@@ -1 +1 @@
-.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
+.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
diff --git a/src/interface/static/admin/css/widgets.css b/src/interface/static/admin/css/widgets.css
index d3bd67a..6dbc58e 100644
--- a/src/interface/static/admin/css/widgets.css
+++ b/src/interface/static/admin/css/widgets.css
@@ -263,7 +263,6 @@ p.datetime {
}
.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
- min-width: 0;
margin-left: 5px;
margin-bottom: 4px;
}
diff --git a/src/interface/static/admin/js/SelectFilter2.js b/src/interface/static/admin/js/SelectFilter2.js
index 4221778..46056b8 100644
--- a/src/interface/static/admin/js/SelectFilter2.js
+++ b/src/interface/static/admin/js/SelectFilter2.js
@@ -179,11 +179,11 @@ Requires jQuery, core.js, and SelectBox.js.
// This is much faster in WebKit browsers than the fallback.
field.attr('required', 'required');
any_selected = field.is(':valid');
- field.removeAttr('required');
} catch (e) {
// Browsers that don't support :valid (IE < 10)
any_selected = field.find('option:selected').length > 0;
}
+ field.removeAttr('required');
return any_selected;
},
refresh_icons: function(field_id) {
diff --git a/src/interface/static/admin/js/admin/DateTimeShortcuts.js b/src/interface/static/admin/js/admin/DateTimeShortcuts.js
index 1ee7c2a..f803523 100644
--- a/src/interface/static/admin/js/admin/DateTimeShortcuts.js
+++ b/src/interface/static/admin/js/admin/DateTimeShortcuts.js
@@ -1,4 +1,4 @@
-/*global Calendar, findPosX, findPosY, getStyle, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/
+/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/
// Inserts shortcut buttons after all of the following:
//
//
@@ -197,7 +197,7 @@
// Recalculate the clockbox position
// is it left-to-right or right-to-left layout ?
- if (getStyle(document.body, 'direction') !== 'rtl') {
+ if (window.getComputedStyle(document.body).direction !== 'rtl') {
clock_box.style.left = findPosX(clock_link) + 17 + 'px';
}
else {
@@ -370,7 +370,7 @@
// Recalculate the clockbox position
// is it left-to-right or right-to-left layout ?
- if (getStyle(document.body, 'direction') !== 'rtl') {
+ if (window.getComputedStyle(document.body).direction !== 'rtl') {
cal_box.style.left = findPosX(cal_link) + 17 + 'px';
}
else {
diff --git a/src/interface/static/admin/js/core.js b/src/interface/static/admin/js/core.js
index 4f2fe13..e3ca0b6 100644
--- a/src/interface/static/admin/js/core.js
+++ b/src/interface/static/admin/js/core.js
@@ -74,13 +74,7 @@ function findPosY(obj) {
(function() {
'use strict';
Date.prototype.getTwelveHours = function() {
- var hours = this.getHours();
- if (hours === 0) {
- return 12;
- }
- else {
- return hours <= 12 ? hours : hours - 12;
- }
+ return this.getHours() % 12 || 12;
};
Date.prototype.getTwoDigitMonth = function() {
@@ -107,14 +101,6 @@ function findPosY(obj) {
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
};
- Date.prototype.getHourMinute = function() {
- return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
- };
-
- Date.prototype.getHourMinuteSecond = function() {
- return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
- };
-
Date.prototype.getFullMonthName = function() {
return typeof window.CalendarNamespace === "undefined"
? this.getTwoDigitMonth()
@@ -156,14 +142,6 @@ function findPosY(obj) {
// ----------------------------------------------------------------------------
// String object extensions
// ----------------------------------------------------------------------------
- String.prototype.pad_left = function(pad_length, pad_string) {
- var new_string = this;
- for (var i = 0; new_string.length < pad_length; i++) {
- new_string = pad_string + new_string;
- }
- return new_string;
- };
-
String.prototype.strptime = function(format) {
var split_format = format.split(/[.\-/]/);
var date = this.split(/[.\-/]/);
@@ -193,20 +171,3 @@ function findPosY(obj) {
};
})();
-// ----------------------------------------------------------------------------
-// Get the computed style for and element
-// ----------------------------------------------------------------------------
-function getStyle(oElm, strCssRule) {
- 'use strict';
- var strValue = "";
- if(document.defaultView && document.defaultView.getComputedStyle) {
- strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
- }
- else if(oElm.currentStyle) {
- strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
- return p1.toUpperCase();
- });
- strValue = oElm.currentStyle[strCssRule];
- }
- return strValue;
-}
diff --git a/src/interface/static/admin/js/inlines.min.js b/src/interface/static/admin/js/inlines.min.js
index 65af8eb..0b818ca 100644
--- a/src/interface/static/admin/js/inlines.min.js
+++ b/src/interface/static/admin/js/inlines.min.js
@@ -1,13 +1,10 @@
-var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(b,d,a){b instanceof String&&(b=String(b));for(var c=b.length,f=0;f