From 3fd41080a59013acae9aa4c0618a834438d32957 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Tue, 2 Dec 2025 16:16:18 +0000 Subject: [PATCH] Add UserUniqueLogin.ip_address_id column --- warehouse/accounts/models.py | 5 +++ ...dd_useruniquelogin_ip_address_id_column.py | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 warehouse/migrations/versions/df52c3746740_add_useruniquelogin_ip_address_id_column.py diff --git a/warehouse/accounts/models.py b/warehouse/accounts/models.py index b518536e7051..f64bd9f6c10c 100644 --- a/warehouse/accounts/models.py +++ b/warehouse/accounts/models.py @@ -512,6 +512,11 @@ class UserUniqueLogin(db.Model): ) user: Mapped[User] = orm.relationship(back_populates="unique_logins") + ip_address_id: Mapped[int] = mapped_column( + ForeignKey("ip_addresses.id", onupdate="CASCADE", ondelete="CASCADE"), + nullable=True, + index=True, + ) ip_address: Mapped[str] = mapped_column(String, nullable=False) created: Mapped[datetime_now] last_used: Mapped[datetime_now] diff --git a/warehouse/migrations/versions/df52c3746740_add_useruniquelogin_ip_address_id_column.py b/warehouse/migrations/versions/df52c3746740_add_useruniquelogin_ip_address_id_column.py new file mode 100644 index 000000000000..f33fb49a978f --- /dev/null +++ b/warehouse/migrations/versions/df52c3746740_add_useruniquelogin_ip_address_id_column.py @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: Apache-2.0 +""" +Add UserUniqueLogin.ip_address_id column + +Revision ID: df52c3746740 +Revises: a25f3d5186a9 +Create Date: 2025-12-02 16:11:17.059400 +""" + +import sqlalchemy as sa + +from alembic import op + +revision = "df52c3746740" +down_revision = "a25f3d5186a9" + + +def upgrade(): + op.add_column( + "user_unique_logins", sa.Column("ip_address_id", sa.UUID(), nullable=True) + ) + op.create_index( + op.f("ix_user_unique_logins_ip_address_id"), + "user_unique_logins", + ["ip_address_id"], + unique=False, + ) + op.create_foreign_key( + None, + "user_unique_logins", + "ip_addresses", + ["ip_address_id"], + ["id"], + onupdate="CASCADE", + ondelete="CASCADE", + ) + + +def downgrade(): + op.drop_constraint(None, "user_unique_logins", type_="foreignkey") + op.drop_index( + op.f("ix_user_unique_logins_ip_address_id"), table_name="user_unique_logins" + ) + op.drop_column("user_unique_logins", "ip_address_id")