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/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 ### 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