From 6196118b808c82d76b5325f74012ce8948fad01a Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Fri, 1 May 2026 13:12:46 -0400 Subject: [PATCH 1/2] the suggested fix Signed-off-by: Adrian Edwards --- collectoss/application/db/models/augur_data.py | 2 +- .../contributor_interfaceable/contributor_interface.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/collectoss/application/db/models/augur_data.py b/collectoss/application/db/models/augur_data.py index 88440411d..7ea85eefc 100644 --- a/collectoss/application/db/models/augur_data.py +++ b/collectoss/application/db/models/augur_data.py @@ -780,7 +780,7 @@ class ContributorRepo(Base): class ContributorsAlias(Base): __tablename__ = "contributors_aliases" __table_args__ = ( - UniqueConstraint("alias_email"), + UniqueConstraint("cntrb_id","alias_email", name="cntrb-email-insert-unique"), { "schema": "augur_data", "comment": "Every open source user may have more than one email used to make contributions over time. CollectOSS selects the first email it encounters for a user as its “canonical_email”. \n\nThe canonical_email is also added to the contributors_aliases table, with the canonical_email and alias_email being identical. Using this strategy, an email search will only need to join the alias table for basic email information, and can then more easily map the canonical email from each alias row to the same, more detailed information in the contributors table for a user. ", diff --git a/collectoss/tasks/github/facade_github/contributor_interfaceable/contributor_interface.py b/collectoss/tasks/github/facade_github/contributor_interfaceable/contributor_interface.py index 3f9ec0a7d..1e064f033 100644 --- a/collectoss/tasks/github/facade_github/contributor_interfaceable/contributor_interface.py +++ b/collectoss/tasks/github/facade_github/contributor_interfaceable/contributor_interface.py @@ -186,7 +186,7 @@ def insert_alias(logger, contributor, email): alias_clean = clean_dict(alias) # Insert new alias - bulk_insert_dicts(logger, alias_clean, ContributorsAlias, ['alias_email']) + bulk_insert_dicts(logger, alias_clean, ContributorsAlias, ['cntrb_id','alias_email']) return From 0e312c64fcda2b9db97b3f5ffc2bda4fdf4c17e2 Mon Sep 17 00:00:00 2001 From: Adrian Edwards Date: Mon, 4 May 2026 14:25:09 -0400 Subject: [PATCH 2/2] migration to adjust the schema Signed-off-by: Adrian Edwards --- .../41_fix_alias_email_constraints.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 collectoss/application/schema/alembic/versions/41_fix_alias_email_constraints.py diff --git a/collectoss/application/schema/alembic/versions/41_fix_alias_email_constraints.py b/collectoss/application/schema/alembic/versions/41_fix_alias_email_constraints.py new file mode 100644 index 000000000..33514cab0 --- /dev/null +++ b/collectoss/application/schema/alembic/versions/41_fix_alias_email_constraints.py @@ -0,0 +1,30 @@ +"""fix alias email constraints + +Revision ID: 41 +Revises: 40 +Create Date: 2026-05-04 14:23:57.315794 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '41' +down_revision = '40' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('contributor-alias-unique'), 'contributors_aliases', schema='augur_data', type_='unique') + op.create_unique_constraint('cntrb-email-insert-unique', 'contributors_aliases', ['cntrb_id', 'alias_email'], schema='augur_data') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint('cntrb-email-insert-unique', 'contributors_aliases', schema='augur_data', type_='unique') + op.create_unique_constraint(op.f('contributor-alias-unique'), 'contributors_aliases', ['alias_email'], schema='augur_data') + # ### end Alembic commands ###