diff --git a/src/backend/lib/config.py b/src/backend/lib/config.py
index 026feb8..2bacdfd 100755
--- a/src/backend/lib/config.py
+++ b/src/backend/lib/config.py
@@ -1,5 +1,6 @@
import json
import pathlib
+import re
from loguru import logger
@@ -14,10 +15,10 @@ class Config:
"""
Initialize main configuration options
"""
+ self.root = root
self._fp = "config.json"
self._cp = pathlib.Path.joinpath(root, self._fp)
self._data = self.open_file()
- self.root = root
self.logger = self.get_logger()
self.book_path = self._data["BOOKPATH"]
self.TITLE = self._data["TITLE"]
@@ -53,5 +54,10 @@ class Config:
data = json.load(read_file)
return data
+ def path(self):
+ rstr = "pyShelf/src"
+ r = re.template(rstr)
+ _pathre = re.match("pyShelf/src")
+
def django_secret(self):
pass
diff --git a/src/backend/lib/pyShelf.py b/src/backend/lib/pyShelf.py
index f211e28..8a7da21 100755
--- a/src/backend/lib/pyShelf.py
+++ b/src/backend/lib/pyShelf.py
@@ -1,17 +1,18 @@
#!/usr/bin/env python3
import asyncio
import os
+import sys
import time
import websockets
from .config import Config
+from .library import Catalogue
from .storage import Storage
class InitFiles:
"""First run file creation operations"""
-
def __init__(self, file_array):
for _pointer in file_array:
time.sleep(1)
@@ -35,18 +36,40 @@ class Server:
:TODO: Document this
"""
- def __init__(self):
- self.loop = asyncio.get_event_loop()
+ async def __init__(self, root):
+ self.root = root
+ self.config = Config(self.root)
self.instance = None
+ self.serve = await websockets.serve(socketio, "127.0.0.1", 1337)
- async def entrypoint(self, websocket, path):
- _str = await websocket.recv()
- greeting = f"{_str}"
- await websocket.send(greeting)
+ async def __aexit__(self, *args, **kwargs):
+ await self.serve.__aexit__(*args, **kwargs)
- async def start(self):
- try:
- self.instance = await websockets.serve(self.entrypoint, "localhost", 1337)
- return True
- except Exception:
- raise
+ async def runImport(self):
+ _start_time = time.time()
+ InitFiles(self.config.file_array)
+ _storage = Storage(self.config)
+ _storage.check_ownership()
+ Catalogue(self.config).import_books()
+ _storage.make_collections()
+ _total_time = round(time.time() - _start_time)
+
+ async def socketio(self, websocket, path):
+ async for message in websocket:
+ if message == "ping":
+ config.logger.info("<< Ping")
+ tx = self.pong()
+ elif message == "importBooks":
+ config.logger.info("Starting Import")
+ tx = "Starting Import . . ."
+ await websocket.send(tx)
+ await runImport()
+ tx = "complete"
+ await websocket.send(tx)
+
+ def pong(self):
+ self.config.logger.info(">> Pong")
+ return "pong"
+
+ def start(self):
+ asyncio.get_event_loop().run_until_complete(self.serve)
diff --git a/src/interface/static/js/pyshelf_ux.js b/src/interface/static/js/pyshelf_ux.js
index dd714f1..468281a 100755
--- a/src/interface/static/js/pyshelf_ux.js
+++ b/src/interface/static/js/pyshelf_ux.js
@@ -172,6 +172,14 @@ $(document).ready(function(){
});
$(document).on('click', '.logout-btn', function(){window.location.href = '/logout'});
$(document).on('click', '.import-btn', async function(){
+ $.ajax({
+ type: "GET", url: "/live", data: {hook: 'import_books'},
+ success: function (response) {
+ },
+ error: function (response) {
+ customlog(["Failure", response]);
+ }
+ });
let connection = await ImportBooks(server);
popover.html('
');
let psout = $('#psout')
@@ -286,7 +294,7 @@ function OpenSocket(address) {
ping(connection)
};
connection.onmessage = function(rcvd){
- sock_rx(rcvd)
+ sock_rx(rcvd)
};
resolve(connection);
});
diff --git a/src/interface/views.py b/src/interface/views.py
index 6117653..f58cdcb 100755
--- a/src/interface/views.py
+++ b/src/interface/views.py
@@ -1,13 +1,14 @@
+import asyncio
import json
import os
+import socket
+import threading
import time
-import asyncio
-
from base64 import b64decode, b64encode
from pathlib import Path
from backend.lib.config import Config
-
+from backend.lib.pyShelf import Server
from django.conf import settings
from django.contrib import auth
from django.contrib.auth import authenticate, get_user_model, login, logout
@@ -23,7 +24,7 @@ from .forms import SignUpForm, UserLoginForm
from .models import Books, Collections, Favorites, Navigation, User
config = Config(Path("../"))
-
+server = None
def index(request, query=None, _set=1, _limit=None, _order='title'):
@@ -76,7 +77,7 @@ def userlogin(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
- if user is not None:
+ if user is not None:
login(request, user)
user.save()
return redirect('home')
@@ -89,8 +90,8 @@ def userlogout(request):
return redirect('home')
-def home(request, query=None, _set=1, _limit=None, _order='title'):
- """
+def home(request, query=None, _set=1, _limit=None, _order='title'):
+ """
Reset Search Queries & Return Home
"""
_payload = payload(request, query, _set, _limit, _order, reset=True)
@@ -148,7 +149,7 @@ def show_collection(request, query, _set, _limit=None, _order='title', **kwargs)
_bookstats = len(Collections().generic_search(query))
if (_r_len): _btotal = str(_r_len)
else: _btotal = str(_bookstats)
-
+
return render(
request,
"index.html",
@@ -235,7 +236,7 @@ def book_set(request, _order, _limit=None, _set=1, _flip=False, **kwargs):
_set_min = _set_max - _limit
if _flip:
books = BookObject.order_by(_order).reverse()[_set_min:_set_max]
- else:
+ else:
books = BookObject.order_by(_order)[_set_min:_set_max]
return mark_favorites(request, books)
@@ -410,14 +411,28 @@ def live(request, **kwargs):
return JsonResponse({"data": html})
elif hook == "import_books":
+ """TODO: Spawn websocket server"""
breakpoint()
- filename = "../data/{}-{}.sock".format(request.user.username, time.strftime("%H:%M:%S"))
- catalogue = ACatalogue()
- async def responder(socket):
- await catalogue.import_books(socket=socket)
- return JsonResponse({"data": filename})
- asyncio.run(responder(filename))
-
+ ###################################################
+ # async def responder(socket): #
+ # await catalogue.import_books(socket=socket) #
+ # return JsonResponse({"data": None}) #
+ # pass #
+ # asyncio.run(responder(None)) #
+ ###################################################
+ def test_connection(host):
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
+ s.connect(host)
+ s.sendall(b"ping")
+ data = s.recv(1024)
+ return data
+ _host = ("127.0.0.1", 1337)
+ try:
+ _server_response = test_connection(_host)
+ except ConnectionRefusedError as e:
+ config.logger.info(e)
+ if e.errno == 111:
+ request.server = Server(Path.absolute(Path.cwd().parent)).start()
else: return JsonResponse(err_txt, status=404)
@@ -494,7 +509,7 @@ def payload(request, query, _set, _limit, _order, **kwargs):
_r = book_set(request, _order, _limit, _set, False, **kwargs)
else: _r = book_set(request, _order, _limit, _set, True, **kwargs)
_r_len, _search = None, None
-
+
_bookstats = Books.objects.all().count()
if (_r_len): _btotal = str(_r_len)
else: _btotal = str(_bookstats)
@@ -513,3 +528,6 @@ def payload(request, query, _set, _limit, _order, **kwargs):
"SearchLen": _r_len,
"Order": _order,
}
+
+def start_server(request, **kwargs):
+ pass