From 8a4a0430078300844d68881007ee8f491422fe19 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Tue, 18 Nov 2025 20:50:21 +0000 Subject: [PATCH] Add indicators for unique login expiration status --- tests/unit/test_filters.py | 6 ++++++ warehouse/admin/templates/admin/users/detail.html | 12 ++++++++++++ warehouse/utils/__init__.py | 7 ++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_filters.py b/tests/unit/test_filters.py index 717bfcf2f7ad..954e10dbd68d 100644 --- a/tests/unit/test_filters.py +++ b/tests/unit/test_filters.py @@ -24,6 +24,12 @@ def test_now(): assert now() <= datetime.datetime.now() +def test_now_with_timezone(): + assert isinstance(now(tz=True), datetime.datetime) + assert now(tz=True).tzinfo is not None + assert now(tz=True) < datetime.datetime.now(datetime.UTC) + + def test_camo_url(): request = pretend.stub( registry=pretend.stub( diff --git a/warehouse/admin/templates/admin/users/detail.html b/warehouse/admin/templates/admin/users/detail.html index 2c05a372fc48..d461eed18b44 100644 --- a/warehouse/admin/templates/admin/users/detail.html +++ b/warehouse/admin/templates/admin/users/detail.html @@ -1002,6 +1002,7 @@

Unique logins

Created IP address Status + Expired? Device Information @@ -1011,6 +1012,17 @@

Unique logins

{{ login.created }} {{ login.ip_address }} {{ login.status.value }} + + {% if login.status.value == 'pending' %} + {% if login.expires < now(tz=True) %} + 🔴 + {% else %} + 🟠 + {% endif %} + {% elif login.status.value == 'confirmed' %} + 🟢 + {% endif %} + {{ login.device_information }} {% endfor %} diff --git a/warehouse/utils/__init__.py b/warehouse/utils/__init__.py index ac1cd0544ebc..64132b13a7f6 100644 --- a/warehouse/utils/__init__.py +++ b/warehouse/utils/__init__.py @@ -3,9 +3,10 @@ import datetime -def now() -> datetime.datetime: - """Return the current datetime in UTC without a timezone.""" - return datetime.datetime.now(datetime.UTC).replace(tzinfo=None) +def now(tz=False) -> datetime.datetime: + """Return the current datetime in UTC with or without a timezone.""" + now = datetime.datetime.now(datetime.UTC) + return now if tz else now.replace(tzinfo=None) def dotted_navigator(path):