diff --git a/cps/logger.py b/cps/logger.py index 9aa076d4..7ce2dbc2 100644 --- a/cps/logger.py +++ b/cps/logger.py @@ -29,7 +29,7 @@ from .constants import CONFIG_DIR as _CONFIG_DIR ACCESS_FORMATTER_GEVENT = Formatter("%(message)s") ACCESS_FORMATTER_TORNADO = Formatter("[%(asctime)s] %(message)s") -FORMATTER = Formatter("[%(asctime)s] %(levelname)5s {%(name)s:%(lineno)d} %(message)s") +FORMATTER = Formatter("[%(asctime)s] %(levelname)5s {%(filename)s:%(lineno)d} %(message)s") DEFAULT_LOG_LEVEL = logging.INFO DEFAULT_LOG_FILE = os.path.join(_CONFIG_DIR, "calibre-web.log") DEFAULT_ACCESS_LOG = os.path.join(_CONFIG_DIR, "access.log") @@ -42,18 +42,12 @@ logging.addLevelName(logging.CRITICAL, "CRIT") class _Logger(logging.Logger): - def error_or_exception(self, message, stacklevel=2, *args, **kwargs): + def error_or_exception(self, message, stacklevel=1, *args, **kwargs): is_debug = self.getEffectiveLevel() <= logging.DEBUG - if sys.version_info > (3, 7): - if is_debug: - self.exception(message, stacklevel=stacklevel, *args, **kwargs) - else: - self.error(message, stacklevel=stacklevel, *args, **kwargs) + if not is_debug: + self.exception(message, stacklevel=stacklevel, *args, **kwargs) else: - if is_debug: - self.exception(message, stack_info=True, *args, **kwargs) - else: - self.error(message, *args, **kwargs) + self.error(message, stacklevel=stacklevel, *args, **kwargs) def debug_no_auth(self, message, *args, **kwargs): message = message.strip("\r\n") diff --git a/cps/tasks/mail.py b/cps/tasks/mail.py index 1fbcd9d2..7206b732 100644 --- a/cps/tasks/mail.py +++ b/cps/tasks/mail.py @@ -35,7 +35,7 @@ from cps.embed_helper import do_calibre_export from cps import logger, config from cps import gdriveutils from cps.string_helper import strip_whitespaces -import uuid + log = logger.create() @@ -56,7 +56,7 @@ class EmailBase: def send(self, strg): """Send `strg' to the server.""" - log.debug_no_auth('send: {}'.format(strg[:300])) + log.debug_no_auth('send: {}'.format(strg[:300]), stacklevel=2) if hasattr(self, 'sock') and self.sock: try: if self.transferSize: @@ -169,14 +169,14 @@ class TaskEmail(CalibreTask): else: self.send_gmail_email(msg) except MemoryError as e: - log.error_or_exception(e, stacklevel=3) + log.error_or_exception(e, stacklevel=2) self._handleError('MemoryError sending e-mail: {}'.format(str(e))) except (smtplib.SMTPRecipientsRefused) as e: - log.error_or_exception(e, stacklevel=3) + log.error_or_exception(e, stacklevel=2) self._handleError('Smtplib Error sending e-mail: {}'.format( (list(e.args[0].values())[0][1]).decode('utf-8)').replace("\n", '. '))) except (smtplib.SMTPException, smtplib.SMTPAuthenticationError) as e: - log.error_or_exception(e, stacklevel=3) + log.error_or_exception(e, stacklevel=2) if hasattr(e, "smtp_error"): text = e.smtp_error.decode('utf-8').replace("\n", '. ') elif hasattr(e, "message"): @@ -187,10 +187,10 @@ class TaskEmail(CalibreTask): text = '' self._handleError('Smtplib Error sending e-mail: {}'.format(text)) except (socket.error) as e: - log.error_or_exception(e, stacklevel=3) + log.error_or_exception(e, stacklevel=2) self._handleError('Socket Error sending e-mail: {}'.format(e.strerror)) except Exception as ex: - log.error_or_exception(ex, stacklevel=3) + log.error_or_exception(ex, stacklevel=2) self._handleError('Error sending e-mail: {}'.format(ex)) def send_standard_email(self, msg): @@ -273,7 +273,7 @@ class TaskEmail(CalibreTask): if config.config_binariesdir and config.config_embed_metadata: os.remove(datafile) except IOError as e: - log.error_or_exception(e, stacklevel=3) + log.error_or_exception(e, stacklevel=2) log.error('The requested file could not be read. Maybe wrong permissions?') return None return data diff --git a/cps/web.py b/cps/web.py index 3fa620a8..0d9a6cf2 100644 --- a/cps/web.py +++ b/cps/web.py @@ -60,7 +60,7 @@ from .services.worker import WorkerThread from .tasks_status import render_task_status from .usermanagement import user_login_required from .string_helper import strip_whitespaces - +import traceback feature_support = { 'ldap': bool(services.ldap), @@ -808,6 +808,10 @@ def render_archived_books(page, sort_param): @web.route('/page/') @login_required_if_no_ano def index(page): + try: + x = 7/0 + except Exception: + log.error("test", stacklevel=1) sort_param = (request.args.get('sort') or 'stored').lower() return render_books_list("newest", sort_param, 1, page) diff --git a/optional-requirements.txt b/optional-requirements.txt index 1726847f..027389d7 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,11 +1,11 @@ # GDrive Integration google-api-python-client>=1.7.11,<2.200.0 -gevent>20.6.0,<24.3.0 +gevent>20.6.0,<24.12.0 greenlet>=0.4.17,<3.2.0 httplib2>=0.9.2,<0.23.0 oauth2client>=4.0.0,<4.1.4 uritemplate>=3.0.0,<4.2.0 -pyasn1-modules>=0.0.8,<0.5.0 +pyasn1-modules>=0.0.8,<0.7.0 pyasn1>=0.1.9,<0.7.0 PyDrive2>=1.3.1,<1.22.0 PyYAML>=3.12,<6.1 @@ -17,23 +17,23 @@ google-api-python-client>=1.7.11,<2.200.0 # goodreads goodreads>=0.3.2,<0.4.0 -python-Levenshtein>=0.12.0,<0.27.0 +python-Levenshtein>=0.12.0,<0.28.0 # ldap login python-ldap>=3.0.0,<3.5.0 Flask-SimpleLDAP>=1.4.0,<2.1.0 # oauth -Flask-Dance>=2.0.0,<7.1.0 +Flask-Dance>=2.0.0,<7.2.0 SQLAlchemy-Utils>=0.33.5,<0.42.0 # metadata extraction rarfile>=3.2,<5.0 scholarly>=1.2.0,<1.8 -markdown2>=2.0.0,<2.5.0 -html2text>=2020.1.16,<2024.2.26 +markdown2>=2.0.0,<2.6.0 +html2text>=2020.1.16,<2025.2.26 python-dateutil>=2.1,<2.10.0 -beautifulsoup4>=4.0.1,<4.13.0 +beautifulsoup4>=4.0.1,<4.14.0 faust-cchardet>=2.1.18,<2.1.20 py7zr>=0.15.0,<0.21.0 mutagen>=1.40.0,<1.50.0 diff --git a/pyproject.toml b/pyproject.toml index 49f2d915..4b86b0fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,12 +12,11 @@ classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: GNU Affero General Public License v3", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Operating System :: OS Independent", ] keywords = [ diff --git a/requirements.txt b/requirements.txt index 3f4efbc6..ad47f363 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,26 +1,26 @@ -APScheduler>=3.6.3,<3.11.0 +APScheduler>=3.6.3,<3.12.0 Babel>=1.3,<3.0 Flask-Babel>=3.0.0,<4.1.0 Flask-Principal>=0.3.2,<0.5.1 -Flask>=1.0.2,<3.1.0 +Flask>=1.0.2,<3.2.0 iso-639>=0.4.5,<0.5.0;python_version<'3.12' pycountry>=20.0.0,<25.0.0;python_version>='3.12' -PyPDF>=3.15.6,<5.1.0 +PyPDF>=3.15.6,<5.5.0 pytz>=2016.10 requests>=2.32.0,<2.33.0 SQLAlchemy>=1.3.0,<2.1.0 -tornado>=6.3,<6.5 +tornado>=6.4.2,<6.6 Wand>=0.4.4,<0.7.0 unidecode>=0.04.19,<1.4.0 -lxml>=4.9.1,<5.3.0 +lxml>=4.9.1,<5.4.0 flask-wtf>=0.14.2,<1.3.0 chardet>=3.0.0,<5.3.0 netifaces-plus>=0.12.0,<0.13.0 urllib3>=1.22,<3.0 -Flask-Limiter>=2.3.0,<3.9.0 -regex>=2022.3.2,<2024.6.25 +Flask-Limiter>=2.3.0,<3.13.0 +regex>=2022.3.2,<2025.3.20 bleach>=6.0.0,<6.2.0 python-magic>=0.4.27,<0.5.0 python-magic-bin>=0.4.0,<0.5.0;sys_platform=='win32' flask-httpAuth>=4.4.0,<5.0.0 -cryptography>=30.0.0,<44.0.0 +cryptography>=43.0.4,<45.0.0