diff --git a/cps/clean_html.py b/cps/clean_html.py index fc4fe6d1..c687f154 100644 --- a/cps/clean_html.py +++ b/cps/clean_html.py @@ -35,7 +35,7 @@ def clean_string(unsafe_text, book_id=0): try: if bleach: allowed_tags = list(ALLOWED_TAGS) - allowed_tags.extend(["p", "span", "div", "pre", "h1", "h2", "h3", "h4", "h5", "h6"]) + allowed_tags.extend(["p", "span", "div", "pre", "br", "h1", "h2", "h3", "h4", "h5", "h6"]) safe_text = clean_html(unsafe_text, tags=set(allowed_tags)) else: safe_text = clean_html(unsafe_text) diff --git a/cps/editbooks.py b/cps/editbooks.py index f1f3e083..5e10d6ed 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -1288,7 +1288,6 @@ def handle_author_on_edit(book, author_name, update_stored=True): # handle author(s) input_authors = prepare_authors(author_name, config.get_book_path(), config.config_use_google_drive) - # change |= modify_database_object(input_authors, book.authors, db.Authors, calibre_db.session, 'author') # Search for each author if author is in database, if not, author name and sorted author name is generated new # everything then is assembled for sorted author field in database sort_authors_list = list() @@ -1368,9 +1367,7 @@ def add_objects(db_book_object, db_object, db_session, db_type, add_elements): for add_element in add_elements: # check if an element with that name exists changed = True - # db_session.query(db.Tags).filter((func.lower(db.Tags.name).ilike("GĂȘnOt"))).all() db_element = db_session.query(db_object).filter((func.lower(db_filter).ilike(add_element))).all() - # db_element = db_session.query(db_object).filter(func.lower(db_filter) == add_element.lower()).first() # if no element is found add it if not db_element: if db_type == 'author': @@ -1387,15 +1384,10 @@ def add_objects(db_book_object, db_object, db_session, db_type, add_elements): db_book_object.append(new_element) else: if len(db_element) == 1: - #db_no_case = db_session.query(db_object).filter(db_filter == add_element).first() - #if db_no_case: - # check for new case of element db_element = create_objects_for_addition(db_element[0], add_element, db_type) else: db_el = db_session.query(db_object).filter(db_filter == add_element).first() db_element = db_element[0] if not db_el else db_el - #else: - # db_element = create_objects_for_addition(db_element, add_element, db_type) # add element to book db_book_object.append(db_element) diff --git a/cps/gevent_wsgi.py b/cps/gevent_wsgi.py index cd9614c9..ab988401 100644 --- a/cps/gevent_wsgi.py +++ b/cps/gevent_wsgi.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - +from datetime import datetime from gevent.pywsgi import WSGIHandler @@ -27,4 +27,26 @@ class MyWSGIHandler(WSGIHandler): env['RAW_URI'] = path return env + def format_request(self): + now = datetime.now().replace(microsecond=0) + length = self.response_length or '-' + if self.time_finish: + delta = '%.6f' % (self.time_finish - self.time_start) + else: + delta = '-' + forwarded = self.environ.get('HTTP_X_FORWARDED_FOR', None) + if forwarded: + client_address = forwarded + else: + client_address = self.client_address[0] if isinstance(self.client_address, tuple) else self.client_address + return '%s - - [%s] "%s" %s %s %s' % ( + client_address or '-', + now, + self.requestline or '', + # Use the native string version of the status, saved so we don't have to + # decode. But fallback to the encoded 'status' in case of subclasses + # (Is that really necessary? At least there's no overhead.) + (self._orig_status or self.status or '000').split()[0], + length, + delta) diff --git a/cps/server.py b/cps/server.py index 1fdc048f..dca407a7 100644 --- a/cps/server.py +++ b/cps/server.py @@ -21,7 +21,6 @@ import os import errno import signal import socket -import asyncio try: from gevent.pywsgi import WSGIServer diff --git a/cps/tornado_wsgi.py b/cps/tornado_wsgi.py index c1571ece..f2aae6dd 100644 --- a/cps/tornado_wsgi.py +++ b/cps/tornado_wsgi.py @@ -22,6 +22,7 @@ import tornado from tornado import escape from tornado import httputil from tornado.ioloop import IOLoop +from tornado.log import access_log from typing import List, Tuple, Optional, Callable, Any, Dict, Text from types import TracebackType @@ -96,5 +97,26 @@ class MyWSGIContainer(WSGIContainer): except TypeError as e: environ = WSGIContainer.environ(request) environ['RAW_URI'] = request.path + self.env = environ return environ + def _log(self, status_code: int, request: httputil.HTTPServerRequest) -> None: + if status_code < 400: + log_method = access_log.info + elif status_code < 500: + log_method = access_log.warning + else: + log_method = access_log.error + request_time = 1000.0 * request.request_time() + assert request.method is not None + assert request.uri is not None + ip = self.env.get("HTTP_FORWARD_FOR", None) or request.remote_ip + summary = ( + request.method # type: ignore[operator] + + " " + + request.uri + + " (" + + ip + + ")" + ) + log_method("%d %s %.2fms", status_code, summary, request_time)