From cf946004c0d11c1637fad2d68f5a042f734b5eda Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Wed, 3 Apr 2024 06:49:29 -0400 Subject: [PATCH 01/12] added user request details below creator in django admin --- src/registrar/models/user.py | 18 ++++++++++++++++++ .../admin/includes/detail_table_fieldset.html | 4 ++++ .../admin/includes/user_detail_list.html | 12 ++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/registrar/templates/django/admin/includes/user_detail_list.html diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index bf904a044..5085c0b94 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -67,6 +67,24 @@ class User(AbstractUser): def is_restricted(self): return self.status == self.RESTRICTED + def get_approved_domains_count(self): + """Return count of approved domains""" + allowed_states = ['unknown', 'dns needed', 'ready', 'on hold'] + approved_domains_count = self.domains.filter(state__in=allowed_states).count() + return approved_domains_count + + def get_active_requests_count(self): + """Return count of active requests""" + allowed_states = ['submitted', 'in review', 'action needed'] + active_requests_count = self.domain_requests_created.filter(status__in=allowed_states).count() + return active_requests_count + + def get_rejected_requests_count(self): + """Return count of rejected or ineligible requests""" + allowed_states = ['rejected', 'ineligible'] + rejected_requests_count = self.domain_requests_created.filter(status__in=allowed_states).count() + return rejected_requests_count + @classmethod def needs_identity_verification(cls, email, uuid): """A method used by our oidc classes to test whether a user needs email/uuid verification diff --git a/src/registrar/templates/django/admin/includes/detail_table_fieldset.html b/src/registrar/templates/django/admin/includes/detail_table_fieldset.html index 47145faf2..2c3b76253 100644 --- a/src/registrar/templates/django/admin/includes/detail_table_fieldset.html +++ b/src/registrar/templates/django/admin/includes/detail_table_fieldset.html @@ -65,6 +65,10 @@ This is using a custom implementation fieldset.html (see admin/fieldset.html) {% include "django/admin/includes/contact_detail_list.html" with user=original.creator no_title_top_padding=field.is_readonly %} +
+ + {% include "django/admin/includes/user_detail_list.html" with user=original.creator no_title_top_padding=field.is_readonly %} +
{% elif field.field.name == "submitter" %}
diff --git a/src/registrar/templates/django/admin/includes/user_detail_list.html b/src/registrar/templates/django/admin/includes/user_detail_list.html new file mode 100644 index 000000000..9daa8a0ee --- /dev/null +++ b/src/registrar/templates/django/admin/includes/user_detail_list.html @@ -0,0 +1,12 @@ +{% load i18n static %} + +
+ + {# Approved domains #} + Approved domains: {{ user.get_approved_domains_count }}
+ {# Active requests #} + Active requests: {{ user.get_active_requests_count }}
+ {# Rejected or ineligible requests #} + Rejected or ineligible: {{ user.get_rejected_requests_count }}
+ +
From 8bea5fd0c474933596f687c1df7469c2a794d187 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Fri, 5 Apr 2024 14:31:16 -0400 Subject: [PATCH 02/12] wip --- src/registrar/models/user.py | 10 ++++--- .../admin/includes/user_detail_list.html | 28 +++++++++++++------ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 5085c0b94..e2b3840a6 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -80,10 +80,12 @@ class User(AbstractUser): return active_requests_count def get_rejected_requests_count(self): - """Return count of rejected or ineligible requests""" - allowed_states = ['rejected', 'ineligible'] - rejected_requests_count = self.domain_requests_created.filter(status__in=allowed_states).count() - return rejected_requests_count + """Return count of rejected requests""" + return self.domain_requests_created.filter(status='rejected').count() + + def get_ineligible_requests_count(self): + """Return count of ineligible requests""" + return self.domain_requests_created.filter(status='ineligible').count() @classmethod def needs_identity_verification(cls, email, uuid): diff --git a/src/registrar/templates/django/admin/includes/user_detail_list.html b/src/registrar/templates/django/admin/includes/user_detail_list.html index 9daa8a0ee..522dfe3c4 100644 --- a/src/registrar/templates/django/admin/includes/user_detail_list.html +++ b/src/registrar/templates/django/admin/includes/user_detail_list.html @@ -1,12 +1,22 @@ {% load i18n static %} -
+{% with approved_domains_count=user.get_approved_domains_count %} + {% with active_requests_count=user.get_active_requests_count %} + {% with rejected_requests_count=user.get_rejected_requests_count %} + {% with ineligible_requests_count=user.get_ineligible_requests_count %} +
    - {# Approved domains #} - Approved domains: {{ user.get_approved_domains_count }}
    - {# Active requests #} - Active requests: {{ user.get_active_requests_count }}
    - {# Rejected or ineligible requests #} - Rejected or ineligible: {{ user.get_rejected_requests_count }}
    - -
+ {# Approved domains #} +
  • Approved domains: {{ approved_domains_count }}
  • + {# Active requests #} +
  • Active requests: {{ active_requests_count }}
  • + {# Rejected requests #} +
  • Rejected requests: {{ rejected_requests_count }}
  • + {# Ineligible requests #} +
  • Ineligible requests: {{ ineligible_requests_count }}
  • + + + {% endwith %} + {% endwith %} + {% endwith %} +{% endwith %} From 7e70bb848783a530fc2af8c4f1031c13247e5456 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Mon, 8 Apr 2024 11:00:49 -0400 Subject: [PATCH 03/12] conditional display of user detail counts --- .../admin/includes/user_detail_list.html | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/registrar/templates/django/admin/includes/user_detail_list.html b/src/registrar/templates/django/admin/includes/user_detail_list.html index 522dfe3c4..be233af8e 100644 --- a/src/registrar/templates/django/admin/includes/user_detail_list.html +++ b/src/registrar/templates/django/admin/includes/user_detail_list.html @@ -4,18 +4,26 @@ {% with active_requests_count=user.get_active_requests_count %} {% with rejected_requests_count=user.get_rejected_requests_count %} {% with ineligible_requests_count=user.get_ineligible_requests_count %} -
      - - {# Approved domains #} -
    • Approved domains: {{ approved_domains_count }}
    • - {# Active requests #} -
    • Active requests: {{ active_requests_count }}
    • - {# Rejected requests #} -
    • Rejected requests: {{ rejected_requests_count }}
    • - {# Ineligible requests #} -
    • Ineligible requests: {{ ineligible_requests_count }}
    • - -
    + {% if approved_domains_count|add:active_requests_count|add:rejected_requests_count|add:ineligible_requests_count > 0 %} +
      + {% if approved_domains_count > 0 %} + {# Approved domains #} +
    • Approved domains: {{ approved_domains_count }}
    • + {% endif %} + {% if active_requests_count > 0 %} + {# Active requests #} +
    • Active requests: {{ active_requests_count }}
    • + {% endif %} + {% if rejected_requests_count > 0 %} + {# Rejected requests #} +
    • Rejected requests: {{ rejected_requests_count }}
    • + {% endif %} + {% if ineligible_requests_count > 0 %} + {# Ineligible requests #} +
    • Ineligible requests: {{ ineligible_requests_count }}
    • + {% endif %} +
    + {% endif %} {% endwith %} {% endwith %} {% endwith %} From 2c1844c7381b8a04e690bf8bb00929c46c15ab6f Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Mon, 8 Apr 2024 11:04:48 -0400 Subject: [PATCH 04/12] formatting changes --- src/registrar/models/user.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index e2b3840a6..830cac944 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -69,24 +69,24 @@ class User(AbstractUser): def get_approved_domains_count(self): """Return count of approved domains""" - allowed_states = ['unknown', 'dns needed', 'ready', 'on hold'] + allowed_states = ["unknown", "dns needed", "ready", "on hold"] approved_domains_count = self.domains.filter(state__in=allowed_states).count() return approved_domains_count - + def get_active_requests_count(self): """Return count of active requests""" - allowed_states = ['submitted', 'in review', 'action needed'] + allowed_states = ["submitted", "in review", "action needed"] active_requests_count = self.domain_requests_created.filter(status__in=allowed_states).count() return active_requests_count - + def get_rejected_requests_count(self): """Return count of rejected requests""" - return self.domain_requests_created.filter(status='rejected').count() + return self.domain_requests_created.filter(status="rejected").count() def get_ineligible_requests_count(self): """Return count of ineligible requests""" - return self.domain_requests_created.filter(status='ineligible').count() - + return self.domain_requests_created.filter(status="ineligible").count() + @classmethod def needs_identity_verification(cls, email, uuid): """A method used by our oidc classes to test whether a user needs email/uuid verification From d145389d9561baded4c6bab93763725356e2830f Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Mon, 8 Apr 2024 11:51:00 -0400 Subject: [PATCH 05/12] test cases written --- src/registrar/tests/test_models.py | 77 ++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index c7fe5f94c..3c8d8b05b 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -1004,6 +1004,8 @@ class TestUser(TestCase): Domain.objects.all().delete() DomainInvitation.objects.all().delete() DomainInformation.objects.all().delete() + DomainRequest.objects.all().delete() + DraftDomain.objects.all().delete() TransitionDomain.objects.all().delete() User.objects.all().delete() UserDomainRole.objects.all().delete() @@ -1060,6 +1062,81 @@ class TestUser(TestCase): # Domain Invitation, then save routine should be called exactly once save_mock.assert_called_once() + def test_approved_domains_count(self): + """Test that the correct approved domain count is returned for a user""" + # with no associated approved domains, expect this to return 0 + self.assertEquals(self.user.get_approved_domains_count(), 0) + # with one approved domain, expect this to return 1 + UserDomainRole.objects.get_or_create(user=self.user, domain=self.domain, role=UserDomainRole.Roles.MANAGER) + self.assertEquals(self.user.get_approved_domains_count(), 1) + # with one approved domain, expect this to return 1 (domain2 is deleted, so not considered approved) + domain2, _ = Domain.objects.get_or_create(name="igorville2.gov", state=Domain.State.DELETED) + UserDomainRole.objects.get_or_create(user=self.user, domain=domain2, role=UserDomainRole.Roles.MANAGER) + self.assertEquals(self.user.get_approved_domains_count(), 1) + # with two approved domains, expect this to return 2 + domain3, _ = Domain.objects.get_or_create(name="igorville3.gov", state=Domain.State.DNS_NEEDED) + UserDomainRole.objects.get_or_create(user=self.user, domain=domain3, role=UserDomainRole.Roles.MANAGER) + self.assertEquals(self.user.get_approved_domains_count(), 2) + # with three approved domains, expect this to return 3 + domain4, _ = Domain.objects.get_or_create(name="igorville4.gov", state=Domain.State.ON_HOLD) + UserDomainRole.objects.get_or_create(user=self.user, domain=domain4, role=UserDomainRole.Roles.MANAGER) + self.assertEquals(self.user.get_approved_domains_count(), 3) + # with four approved domains, expect this to return 4 + domain5, _ = Domain.objects.get_or_create(name="igorville5.gov", state=Domain.State.READY) + UserDomainRole.objects.get_or_create(user=self.user, domain=domain5, role=UserDomainRole.Roles.MANAGER) + self.assertEquals(self.user.get_approved_domains_count(), 4) + + def test_active_requests_count(self): + """Test that the correct active domain requests count is returned for a user""" + # with no associated active requests, expect this to return 0 + self.assertEquals(self.user.get_active_requests_count(), 0) + # with one active request, expect this to return 1 + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville1.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.SUBMITTED + ) + self.assertEquals(self.user.get_active_requests_count(), 1) + # with two active requests, expect this to return 2 + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville2.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.IN_REVIEW + ) + self.assertEquals(self.user.get_active_requests_count(), 2) + # with three active requests, expect this to return 3 + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville3.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.ACTION_NEEDED + ) + self.assertEquals(self.user.get_active_requests_count(), 3) + # with three active requests, expect this to return 3 (STARTED is not considered active) + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville4.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.STARTED + ) + self.assertEquals(self.user.get_active_requests_count(), 3) + + def test_rejected_requests_count(self): + """Test that the correct rejected domain requests count is returned for a user""" + # with no associated rejected requests, expect this to return 0 + self.assertEquals(self.user.get_rejected_requests_count(), 0) + # with one rejected request, expect this to return 1 + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville1.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.REJECTED + ) + self.assertEquals(self.user.get_rejected_requests_count(), 1) + + def test_ineligible_requests_count(self): + """Test that the correct ineligible domain requests count is returned for a user""" + # with no associated ineligible requests, expect this to return 0 + self.assertEquals(self.user.get_ineligible_requests_count(), 0) + # with one ineligible request, expect this to return 1 + draft_domain, _ = DraftDomain.objects.get_or_create(name="igorville1.gov") + DomainRequest.objects.create( + creator=self.user, requested_domain=draft_domain, status=DomainRequest.DomainRequestStatus.INELIGIBLE + ) + self.assertEquals(self.user.get_ineligible_requests_count(), 1) + class TestContact(TestCase): def setUp(self): From a257e843af611e17108abc88f33bdea14901d15f Mon Sep 17 00:00:00 2001 From: Rachid Mrad Date: Mon, 8 Apr 2024 15:27:32 -0400 Subject: [PATCH 06/12] styling --- src/registrar/assets/sass/_theme/_admin.scss | 11 +++++++++++ .../django/admin/includes/user_detail_list.html | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index 658ae5ca8..407163fff 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -435,3 +435,14 @@ address.dja-address-contact-list { color: var(--link-fg); } } + +.dja-status-list { + border-top: solid 1px var(--border-color); + margin-left: 0 !important; + padding-left: 0 !important; + padding-top: 15px; + li { + line-height: 1.15; + font-family: "Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !important; + } +} diff --git a/src/registrar/templates/django/admin/includes/user_detail_list.html b/src/registrar/templates/django/admin/includes/user_detail_list.html index be233af8e..829af933a 100644 --- a/src/registrar/templates/django/admin/includes/user_detail_list.html +++ b/src/registrar/templates/django/admin/includes/user_detail_list.html @@ -5,7 +5,7 @@ {% with rejected_requests_count=user.get_rejected_requests_count %} {% with ineligible_requests_count=user.get_ineligible_requests_count %} {% if approved_domains_count|add:active_requests_count|add:rejected_requests_count|add:ineligible_requests_count > 0 %} -
      +
        {% if approved_domains_count > 0 %} {# Approved domains #}
      • Approved domains: {{ approved_domains_count }}
      • From 14cfaa7f4c80bddd4def274ce9d8e423165af64d Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Wed, 10 Apr 2024 13:19:19 -0400 Subject: [PATCH 07/12] changed strings to constants --- src/registrar/models/user.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 830cac944..1ca2412ca 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -9,6 +9,7 @@ from .domain_invitation import DomainInvitation from .transition_domain import TransitionDomain from .verified_by_staff import VerifiedByStaff from .domain import Domain +from .domain_request import DomainRequest from phonenumber_field.modelfields import PhoneNumberField # type: ignore @@ -69,23 +70,27 @@ class User(AbstractUser): def get_approved_domains_count(self): """Return count of approved domains""" - allowed_states = ["unknown", "dns needed", "ready", "on hold"] + allowed_states = [Domain.State.UNKNOWN, Domain.State.DNS_NEEDED, Domain.State.READY, Domain.State.ON_HOLD] approved_domains_count = self.domains.filter(state__in=allowed_states).count() return approved_domains_count def get_active_requests_count(self): """Return count of active requests""" - allowed_states = ["submitted", "in review", "action needed"] + allowed_states = [ + DomainRequest.DomainRequestStatus.SUBMITTED, + DomainRequest.DomainRequestStatus.IN_REVIEW, + DomainRequest.DomainRequestStatus.ACTION_NEEDED, + ] active_requests_count = self.domain_requests_created.filter(status__in=allowed_states).count() return active_requests_count def get_rejected_requests_count(self): """Return count of rejected requests""" - return self.domain_requests_created.filter(status="rejected").count() + return self.domain_requests_created.filter(status=DomainRequest.DomainRequestStatus.REJECTED).count() def get_ineligible_requests_count(self): """Return count of ineligible requests""" - return self.domain_requests_created.filter(status="ineligible").count() + return self.domain_requests_created.filter(status=DomainRequest.DomainRequestStatus.INELIGIBLE).count() @classmethod def needs_identity_verification(cls, email, uuid): From 0db398321b08f8f2625dd9823d3976d4949b31a4 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Wed, 10 Apr 2024 13:51:35 -0400 Subject: [PATCH 08/12] added unit test --- src/registrar/tests/test_admin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 41700c0ae..73913abc2 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -1553,6 +1553,10 @@ class TestDomainRequestAdmin(MockEppLib): # Test for the copy link self.assertContains(response, "usa-button__clipboard", count=4) + # Test that Creator counts display properly + self.assertNotContains(response, "Approved domains") + self.assertContains(response, "Active requests") + def test_save_model_sets_restricted_status_on_user(self): with less_console_noise(): # make sure there is no user with this email From 4297ed0d9d0043156f91a3e6203d8ff2e5197a96 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Thu, 11 Apr 2024 05:41:19 -0400 Subject: [PATCH 09/12] made css changes --- src/registrar/assets/sass/_theme/_admin.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index d4eeaf990..27fce0136 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -539,10 +539,11 @@ address.dja-address-contact-list { .dja-status-list { border-top: solid 1px var(--border-color); margin-left: 0 !important; + margin-top: 10px; padding-left: 0 !important; - padding-top: 15px; + padding-top: 10px; li { - line-height: 1.15; + line-height: 1.5; font-family: "Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !important; } } From 41406a76ea54364b5cf2dead56425d2e16048dd2 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Thu, 11 Apr 2024 13:41:01 -0400 Subject: [PATCH 10/12] aligned spacing --- src/registrar/assets/sass/_theme/_admin.scss | 3 ++- .../templates/django/admin/includes/contact_detail_list.html | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index 27fce0136..4b69dc8e3 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -539,12 +539,13 @@ address.dja-address-contact-list { .dja-status-list { border-top: solid 1px var(--border-color); margin-left: 0 !important; - margin-top: 10px; padding-left: 0 !important; padding-top: 10px; li { line-height: 1.5; font-family: "Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !important; + padding-top: 0; + padding-bottom: 0; } } diff --git a/src/registrar/templates/django/admin/includes/contact_detail_list.html b/src/registrar/templates/django/admin/includes/contact_detail_list.html index 8ad6fb96d..b5ccb5a42 100644 --- a/src/registrar/templates/django/admin/includes/contact_detail_list.html +++ b/src/registrar/templates/django/admin/includes/contact_detail_list.html @@ -1,6 +1,6 @@ {% load i18n static %} -
        +
        {% if show_formatted_name %} {% if contact.get_formatted_name %} From 1fa0e63126eb6f2052a02d2ff1209939f544a9ff Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Fri, 12 Apr 2024 10:47:12 -0400 Subject: [PATCH 11/12] simplified contact detail list template --- src/registrar/models/contact.py | 8 ++++++++ src/registrar/models/user.py | 8 ++++++++ .../django/admin/includes/contact_detail_list.html | 4 ++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/registrar/models/contact.py b/src/registrar/models/contact.py index d3de5a293..0b097974e 100644 --- a/src/registrar/models/contact.py +++ b/src/registrar/models/contact.py @@ -93,6 +93,14 @@ class Contact(TimeStampedModel): names = [n for n in [self.first_name, self.middle_name, self.last_name] if n] return " ".join(names) if names else "Unknown" + def has_contact_info(self): + has_contact_info = ( + self.title or + self.email or + self.phone + ) + return has_contact_info + def save(self, *args, **kwargs): # Call the parent class's save method to perform the actual save super().save(*args, **kwargs) diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 1ca2412ca..7e9cdf73e 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -92,6 +92,14 @@ class User(AbstractUser): """Return count of ineligible requests""" return self.domain_requests_created.filter(status=DomainRequest.DomainRequestStatus.INELIGIBLE).count() + def has_contact_info(self): + has_contact_info = ( + self.contact.title or + self.email.title or + self.contact.phone + ) + return has_contact_info + @classmethod def needs_identity_verification(cls, email, uuid): """A method used by our oidc classes to test whether a user needs email/uuid verification diff --git a/src/registrar/templates/django/admin/includes/contact_detail_list.html b/src/registrar/templates/django/admin/includes/contact_detail_list.html index b5ccb5a42..0ac9c4c49 100644 --- a/src/registrar/templates/django/admin/includes/contact_detail_list.html +++ b/src/registrar/templates/django/admin/includes/contact_detail_list.html @@ -1,6 +1,6 @@ {% load i18n static %} -
        +
        {% if show_formatted_name %} {% if contact.get_formatted_name %} @@ -10,7 +10,7 @@ {% endif %} {% endif %} - {% if user.title or user.contact.title or user.email or user.contact.email or user.phone or user.contact.phone %} + {% if user.has_contact_info %} {# Title #} {% if user.title or user.contact.title %} {% if user.contact.title %} From 673c092ea9f9f8e6fda5b893e2fe679a2ca7b085 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Fri, 12 Apr 2024 11:50:24 -0400 Subject: [PATCH 12/12] updated tests --- src/registrar/models/contact.py | 7 +------ src/registrar/models/user.py | 7 +------ src/registrar/tests/test_models.py | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/registrar/models/contact.py b/src/registrar/models/contact.py index 0b097974e..c5cb03a6e 100644 --- a/src/registrar/models/contact.py +++ b/src/registrar/models/contact.py @@ -94,12 +94,7 @@ class Contact(TimeStampedModel): return " ".join(names) if names else "Unknown" def has_contact_info(self): - has_contact_info = ( - self.title or - self.email or - self.phone - ) - return has_contact_info + return bool(self.title or self.email or self.phone) def save(self, *args, **kwargs): # Call the parent class's save method to perform the actual save diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 7e9cdf73e..2688ef57f 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -93,12 +93,7 @@ class User(AbstractUser): return self.domain_requests_created.filter(status=DomainRequest.DomainRequestStatus.INELIGIBLE).count() def has_contact_info(self): - has_contact_info = ( - self.contact.title or - self.email.title or - self.contact.phone - ) - return has_contact_info + return bool(self.contact.title or self.contact.email or self.contact.phone) @classmethod def needs_identity_verification(cls, email, uuid): diff --git a/src/registrar/tests/test_models.py b/src/registrar/tests/test_models.py index 3c8d8b05b..d6a561c7f 100644 --- a/src/registrar/tests/test_models.py +++ b/src/registrar/tests/test_models.py @@ -1137,6 +1137,16 @@ class TestUser(TestCase): ) self.assertEquals(self.user.get_ineligible_requests_count(), 1) + def test_has_contact_info(self): + """Test that has_contact_info properly returns""" + # test with a user with contact info defined + self.assertTrue(self.user.has_contact_info()) + # test with a user without contact info defined + self.user.contact.title = None + self.user.contact.email = None + self.user.contact.phone = None + self.assertFalse(self.user.has_contact_info()) + class TestContact(TestCase): def setUp(self): @@ -1238,3 +1248,13 @@ class TestContact(TestCase): # test for a contact which is assigned as an authorizing official on a domain request self.assertFalse(self.contact_as_ao.has_more_than_one_join("authorizing_official")) self.assertTrue(self.contact_as_ao.has_more_than_one_join("submitted_domain_requests")) + + def test_has_contact_info(self): + """Test that has_contact_info properly returns""" + # test with a contact with contact info defined + self.assertTrue(self.contact.has_contact_info()) + # test with a contact without contact info defined + self.contact.title = None + self.contact.email = None + self.contact.phone = None + self.assertFalse(self.contact.has_contact_info())