mirror of https://gitlab.com/openlp/openlp.git
Merge branch 'fix-other-sqlalchemy-problems' into 'master'
Make some forward compatibility changes See merge request openlp/openlp!648
This commit is contained in:
commit
5be8bd0075
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
2
setup.py
2
setup.py
|
@ -117,7 +117,7 @@ using a computer and a display/projector.""",
|
|||
'QtAwesome',
|
||||
"qrcode",
|
||||
'requests',
|
||||
'SQLAlchemy >= 1.4',
|
||||
'SQLAlchemy',
|
||||
'waitress',
|
||||
'websockets'
|
||||
],
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue