From 70916205eb3134b647504cb926042d54041320f2 Mon Sep 17 00:00:00 2001 From: Kamil Páral Date: Aug 17 2021 11:07:52 +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 with 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 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. 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 --- 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)