updated database libraries (sqlalchemy etc.)

this is working fine, but introduces a sqlalchemy warning
when using config-import:

  /app/mailu/schemas.py:822:
    SAWarning: Identity map already had an identity for (...),
    replacing it with newly flushed object.
    Are there load operations occurring inside of an event handler
    within the flush?
master
Alexander Graf 3 years ago
parent 4669374b9e
commit 73ab4327c2

@ -39,6 +39,8 @@ class IdnaDomain(db.TypeDecorator):
""" """
impl = db.String(80) impl = db.String(80)
cache_ok = True
python_type = str
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
""" encode unicode domain name to punycode """ """ encode unicode domain name to punycode """
@ -48,13 +50,13 @@ class IdnaDomain(db.TypeDecorator):
""" decode punycode domain name to unicode """ """ decode punycode domain name to unicode """
return idna.decode(value) return idna.decode(value)
python_type = str
class IdnaEmail(db.TypeDecorator): class IdnaEmail(db.TypeDecorator):
""" Stores a Unicode string in it's IDNA representation (ASCII only) """ Stores a Unicode string in it's IDNA representation (ASCII only)
""" """
impl = db.String(255) impl = db.String(255)
cache_ok = True
python_type = str
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
""" encode unicode domain part of email address to punycode """ """ encode unicode domain part of email address to punycode """
@ -70,13 +72,13 @@ class IdnaEmail(db.TypeDecorator):
localpart, domain_name = value.rsplit('@', 1) localpart, domain_name = value.rsplit('@', 1)
return f'{localpart}@{idna.decode(domain_name)}' return f'{localpart}@{idna.decode(domain_name)}'
python_type = str
class CommaSeparatedList(db.TypeDecorator): class CommaSeparatedList(db.TypeDecorator):
""" Stores a list as a comma-separated string, compatible with Postfix. """ Stores a list as a comma-separated string, compatible with Postfix.
""" """
impl = db.String impl = db.String
cache_ok = True
python_type = list
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
""" join list of items to comma separated string """ """ join list of items to comma separated string """
@ -91,13 +93,13 @@ class CommaSeparatedList(db.TypeDecorator):
""" split comma separated string to list """ """ split comma separated string to list """
return list(filter(bool, (item.strip() for item in value.split(',')))) if value else [] return list(filter(bool, (item.strip() for item in value.split(',')))) if value else []
python_type = list
class JSONEncoded(db.TypeDecorator): class JSONEncoded(db.TypeDecorator):
""" Represents an immutable structure as a json-encoded string. """ Represents an immutable structure as a json-encoded string.
""" """
impl = db.String impl = db.String
cache_ok = True
python_type = str
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
""" encode data as json """ """ encode data as json """
@ -107,8 +109,6 @@ class JSONEncoded(db.TypeDecorator):
""" decode json to data """ """ decode json to data """
return json.loads(value) if value else None return json.loads(value) if value else None
python_type = str
class Base(db.Model): class Base(db.Model):
""" Base class for all models """ Base class for all models
""" """

@ -145,6 +145,11 @@ class Logger:
if history.has_changes() and history.deleted: if history.has_changes() and history.deleted:
before = history.deleted[-1] before = history.deleted[-1]
after = getattr(target, attr.key) after = getattr(target, attr.key)
# we don't have ordered lists
if isinstance(before, list):
before = set(before)
if isinstance(after, list):
after = set(after)
# TODO: this can be removed when comment is not nullable in model # TODO: this can be removed when comment is not nullable in model
if attr.key == 'comment' and not before and not after: if attr.key == 'comment' and not before and not after:
pass pass

@ -26,8 +26,9 @@ Flask-Login==0.5.0
flask-marshmallow==0.14.0 flask-marshmallow==0.14.0
Flask-Migrate==3.1.0 Flask-Migrate==3.1.0
Flask-Script==2.0.6 Flask-Script==2.0.6
Flask-SQLAlchemy==2.4.0 Flask-SQLAlchemy==2.5.1
Flask-WTF==0.15.1 Flask-WTF==0.15.1
greenlet==1.1.2
gunicorn==20.1.0 gunicorn==20.1.0
html5lib==1.1 html5lib==1.1
idna==3.3 idna==3.3
@ -39,16 +40,16 @@ limits==1.5.1
lockfile==0.12.2 lockfile==0.12.2
Mako==1.1.5 Mako==1.1.5
MarkupSafe==2.0.1 MarkupSafe==2.0.1
marshmallow==3.10.0 marshmallow==3.14.0
marshmallow-sqlalchemy==0.24.1 marshmallow-sqlalchemy==0.26.1
msgpack==1.0.2 msgpack==1.0.2
mysqlclient==1.4.2.post1 mysqlclient==2.0.3
ordered-set==4.0.2 ordered-set==4.0.2
# packaging==20.9 # packaging==20.9
passlib==1.7.4 passlib==1.7.4
# pep517==0.10.0 # pep517==0.10.0
progress==1.6 progress==1.6
psycopg2==2.8.2 psycopg2==2.9.1
pycparser==2.20 pycparser==2.20
Pygments==2.10.0 Pygments==2.10.0
pyOpenSSL==21.0.0 pyOpenSSL==21.0.0
@ -60,7 +61,7 @@ requests==2.26.0
retrying==1.3.3 retrying==1.3.3
# six==1.15.0 # six==1.15.0
socrate==0.2.0 socrate==0.2.0
SQLAlchemy==1.3.3 SQLAlchemy==1.4.26
srslib==0.1.4 srslib==0.1.4
tabulate==0.8.9 tabulate==0.8.9
tenacity==8.0.1 tenacity==8.0.1

Loading…
Cancel
Save