Make some forward compatibility changes

This commit is contained in:
Raoul Snyman 2023-08-18 19:28:04 +00:00
parent f82307ab6b
commit 9c9c7880b9
6 changed files with 26 additions and 10 deletions

View File

@ -22,6 +22,8 @@ import base64
from functools import wraps
from flask import Response
from werkzeug import __version__ as wz_version
from werkzeug.datastructures import WWWAuthenticate
from openlp.core.common.registry import Registry
@ -47,7 +49,10 @@ def authenticate():
Sends a 401 response that enables basic auth to be triggered
"""
resp = Response(status=401)
resp.www_authenticate.set_basic('OpenLP Login Required')
if wz_version.startswith('2.4') or wz_version.startswith('3.'):
resp.www_authenticate = WWWAuthenticate('basic', {'realm': 'OpenLP Login Required'})
else:
resp.www_authenticate.set_basic('OpenLP Login Required')
return resp

View File

@ -28,7 +28,7 @@ from pathlib import Path
from typing import Optional, Tuple, Union
from urllib.parse import quote_plus as urlquote
from sqlalchemy import MetaData, create_engine
from sqlalchemy import MetaData, create_engine, __version__ as sqla_version
from sqlalchemy.engine import Engine
from sqlalchemy.engine.url import URL, make_url
from sqlalchemy.exc import OperationalError, ProgrammingError
@ -179,12 +179,16 @@ def init_db(url: str, auto_flush: bool = True, auto_commit: bool = False,
:param base: If using declarative, the base class to bind with
"""
engine = create_engine(url, poolclass=StaticPool)
if sqla_version.startswith('1.'):
session = scoped_session(sessionmaker(autoflush=auto_flush, autocommit=auto_commit, bind=engine))
else:
session = scoped_session(sessionmaker(autoflush=auto_flush, autobegin=True, bind=engine))
if base is None:
metadata = MetaData(bind=engine)
else:
base.metadata.bind = engine
metadata = base.metadata
session = scoped_session(sessionmaker(autoflush=auto_flush, autocommit=auto_commit, bind=engine))
return session, metadata

View File

@ -112,13 +112,13 @@ from typing import Optional
from sqlalchemy import Column, ForeignKey, Table
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import declarative_base, reconstructor, relationship
from sqlalchemy.orm import Session, declarative_base, reconstructor, relationship
from sqlalchemy.sql.expression import func, text
from sqlalchemy.types import Boolean, DateTime, Integer, Unicode, UnicodeText
from openlp.core.common.i18n import get_natural_key, translate
from openlp.core.db.types import PathType
from openlp.core.db.upgrades import init_db
from openlp.core.db.helpers import init_db
Base = declarative_base()
@ -337,6 +337,10 @@ class Song(Base):
return
new_songbook_entry = SongBookEntry()
if session := Session.object_session(self):
# Session is None in the tests
session.add(songbook)
new_songbook_entry.songbook = songbook
new_songbook_entry.entry = entry
self.songbook_entries.append(new_songbook_entry)

View File

@ -117,7 +117,7 @@ using a computer and a display/projector.""",
'QtAwesome',
"qrcode",
'requests',
'SQLAlchemy >= 1.4',
'SQLAlchemy',
'waitress',
'websockets'
],

View File

@ -24,7 +24,7 @@ Package to test the :mod:`~openlp.core.db.helpers` package.
from pathlib import Path
from unittest.mock import MagicMock, patch
from sqlalchemy import MetaData
from sqlalchemy import MetaData, __version__ as sqla_version
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm.scoping import ScopedSession
from sqlalchemy.pool import StaticPool
@ -57,7 +57,10 @@ def test_init_db_calls_correct_functions():
# THEN: We should see the correct function calls
mocked_create_engine.assert_called_with(db_url, poolclass=StaticPool)
MockedMetaData.assert_called_with(bind=mocked_engine)
mocked_sessionmaker.assert_called_with(autoflush=True, autocommit=False, bind=mocked_engine)
if sqla_version.startswith('1.'):
mocked_sessionmaker.assert_called_with(autoflush=True, autocommit=False, bind=mocked_engine)
else:
mocked_sessionmaker.assert_called_with(autoflush=True, autobegin=True, bind=mocked_engine)
mocked_scoped_session.assert_called_with(mocked_sessionmaker_object)
assert session is mocked_scoped_session_object, 'The ``session`` object should be the mock'
assert metadata is mocked_metadata, 'The ``metadata`` object should be the mock'

View File

@ -169,8 +169,8 @@ def test_create_importer(importer: WorshipCenterProImportLogger):
@patch('openlp.plugins.songs.lib.importers.worshipcenterpro.translate')
@patch('openlp.plugins.songs.lib.importers.worshipcenterpro.pyodbc.connect')
@pytest.mark.parametrize('error', [(pyodbc.DatabaseError,), (pyodbc.IntegrityError,), (pyodbc.InternalError,),
(pyodbc.OperationalError,)])
@pytest.mark.parametrize('error', [pyodbc.DatabaseError, pyodbc.IntegrityError, pyodbc.InternalError,
pyodbc.OperationalError])
def test_pyodbc_exception(mocked_pyodbc_connect: MagicMock, mocked_translate: MagicMock,
importer: WorshipCenterProImportLogger, error: Exception):
"""