From 9101de9b41efe96f4f5c4692c5beba208dd61dd1 Mon Sep 17 00:00:00 2001 From: Kamil Páral Date: Aug 17 2021 13:18:36 +0000 Subject: fix testsuite failing with SQLAlchemy < 1.4 The new SQLAlchemy naming convention fails with SQLAlchemy < 1.4 when executed on SQLite (used in the test suite). The reason is that SQLite doesn't support Boolean type natively, and SQLAlchemy automatically tries to create a constraint, but that fails without a constraint name specified. SQLAlchemy 1.4 resolves this issue by not creating constraints at all (for non-native types). You can read more about it here: https://github.com/pallets/flask-sqlalchemy/pull/886 https://docs.sqlalchemy.org/en/14/core/constraints.html#configuring-naming-for-boolean-enum-and-other-schema-types https://docs.sqlalchemy.org/en/14/changelog/migration_14.html#enum-and-boolean-datatypes-no-longer-default-to-create-constraint Since we need to support SQLAlchemy 1.3 at the moment (in Fedora 33 and 34), out of several solutions I decided to name constraints for all Boolean types (the names are then used by the naming convention, they doesn't override it). I also specified that the constraint *should* be created (no reason not to create it, when we have it named already). Otherwise the contraints would stop being created once upgraded to SQLAlchemy >= 1.4. Fixes: https://pagure.io/fedora-qa/blockerbugs/issue/197 Merges: https://pagure.io/fedora-qa/blockerbugs/pull-request/199 --- diff --git a/blockerbugs/models/bug.py b/blockerbugs/models/bug.py index 7e9b86a..9a9d95e 100644 --- a/blockerbugs/models/bug.py +++ b/blockerbugs/models/bug.py @@ -45,23 +45,23 @@ class Bug(BaseModel): status = db.Column(db.String(80), unique=False) """E.g. 'NEW' or 'ASSIGNED'""" component = db.Column(db.String(80), unique=False) - active = db.Column(db.Boolean) + active = db.Column(db.Boolean(create_constraint=True, name='active_bool')) """An alias for 'open', i.e. `True` when open, `False` when closed""" last_bug_sync = db.Column(db.DateTime) - needinfo = db.Column(db.Boolean) + needinfo = db.Column(db.Boolean(create_constraint=True, name='needinfo_bool')) needinfo_requestee = db.Column(db.String(1024), unique=False) last_whiteboard_change = db.Column(db.DateTime) """The time when we detected a blocker/FE keyword change. It doesn't really mark *any* whiteboard change, just for those tracked keywords.""" - proposed_blocker = db.Column(db.Boolean) - proposed_fe = db.Column(db.Boolean) - rejected_blocker = db.Column(db.Boolean) - rejected_fe = db.Column(db.Boolean) - accepted_blocker = db.Column(db.Boolean) - accepted_0day = db.Column(db.Boolean) - accepted_prevrel = db.Column(db.Boolean) - accepted_fe = db.Column(db.Boolean) - prioritized = db.Column(db.Boolean) + proposed_blocker = db.Column(db.Boolean(create_constraint=True, name='proposed_blocker_bool')) + proposed_fe = db.Column(db.Boolean(create_constraint=True, name='proposed_fe_bool')) + rejected_blocker = db.Column(db.Boolean(create_constraint=True, name='rejected_blocker_bool')) + rejected_fe = db.Column(db.Boolean(create_constraint=True, name='rejected_fe_bool')) + accepted_blocker = db.Column(db.Boolean(create_constraint=True, name='accepted_blocker_bool')) + accepted_0day = db.Column(db.Boolean(create_constraint=True, name='accepted_0day_bool')) + accepted_prevrel = db.Column(db.Boolean(create_constraint=True, name='accepted_prevrel_bool')) + accepted_fe = db.Column(db.Boolean(create_constraint=True, name='accepted_fe_bool')) + prioritized = db.Column(db.Boolean(create_constraint=True, name='prioritized_bool')) milestone_id = db.Column(db.Integer, db.ForeignKey('milestone.id')) milestone: Optional['model_milestone.Milestone'] = db.relationship( 'Milestone', back_populates='bugs') diff --git a/blockerbugs/models/criterion.py b/blockerbugs/models/criterion.py index 79a806f..347373a 100644 --- a/blockerbugs/models/criterion.py +++ b/blockerbugs/models/criterion.py @@ -29,7 +29,7 @@ class Criterion(BaseModel): id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.DateTime, unique=False) criterion = db.Column(db.String(4096), unique=False) - current = db.Column(db.Boolean) + current = db.Column(db.Boolean(create_constraint=True, name='current_bool')) milestone_id = db.Column(db.Integer, db.ForeignKey('milestone.id')) milestone: 'model_milestone.Milestone' = db.relationship('Milestone', back_populates='criteria') number = db.Column(db.Integer, unique=False) diff --git a/blockerbugs/models/milestone.py b/blockerbugs/models/milestone.py index 318dc5e..4ad9c7e 100644 --- a/blockerbugs/models/milestone.py +++ b/blockerbugs/models/milestone.py @@ -44,10 +44,10 @@ class Milestone(BaseModel): """A bugzilla ticket number representing the tracker for blockers""" fe_tracker = db.Column(db.Integer, unique=True) """A bugzilla ticket number representing the tracker for freeze exceptions""" - active = db.Column(db.Boolean) + active = db.Column(db.Boolean(create_constraint=True, name='active_bool')) """Only active milestones are synced and displayed""" last_bug_sync = db.Column(db.DateTime) - current = db.Column(db.Boolean) + current = db.Column(db.Boolean(create_constraint=True, name='current_bool')) """Current milestone is the most relevant one currently. Usually it is the nearest milestone in the future. There should be at most one milestone marked as current.""" bugs: list['bug.Bug'] = db.relationship('Bug', back_populates='milestone', lazy='dynamic') diff --git a/blockerbugs/models/release.py b/blockerbugs/models/release.py index 2050cf8..ddbbded 100644 --- a/blockerbugs/models/release.py +++ b/blockerbugs/models/release.py @@ -32,9 +32,10 @@ class Release(BaseModel): id = db.Column(db.Integer, primary_key=True) number = db.Column(db.Integer) """E.g. 35 (for Fedora 35)""" - active = db.Column(db.Boolean) + active = db.Column(db.Boolean(create_constraint=True, name='active_bool')) """Only active releases are synced and displayed""" - discussions_closed = db.Column(db.Boolean) + discussions_closed = db.Column(db.Boolean(create_constraint=True, + name='discussions_closed_bool')) """This is used for past (historical) releases. If this is `True`, all discussion tickets (as in `Bug.discussion_link`) have been closed ("cleaned up").""" last_update_sync: datetime = db.Column(db.DateTime) diff --git a/blockerbugs/models/update.py b/blockerbugs/models/update.py index 7d36885..02b2501 100644 --- a/blockerbugs/models/update.py +++ b/blockerbugs/models/update.py @@ -32,7 +32,7 @@ class Update(BaseModel): stable_karma = db.Column(db.Integer, unique=False) status = db.Column(db.String(80), unique=False) request = db.Column(db.String(80), unique=False, nullable=True) - pending = db.Column(db.Boolean, unique=False) + pending = db.Column(db.Boolean(create_constraint=True, name='pending_bool'), unique=False) date_submitted = db.Column(db.DateTime) date_pushed_testing = db.Column(db.DateTime, nullable=True) date_pushed_stable = db.Column(db.DateTime, nullable=True)