diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 215239d66..b0a7e0d45 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -1016,6 +1016,29 @@ class ContactAdmin(ListHeaderAdmin, ImportExportModelAdmin): # Get the filtered values return super().changelist_view(request, extra_context=extra_context) +class SeniorOfficialAdmin(ListHeaderAdmin, ImportExportModelAdmin): + """Custom Senior Official Admin class.""" + + # NOTE: these are just placeholders. Not part of ACs (haven't been defined yet). Update in future tickets. + search_fields = ["first_name", "last_name"] + search_help_text = "Search by first name or last name." + list_display = [ + "last_name", + ] + + # this ordering effects the ordering of results + # in autocomplete_fields for user + ordering = ["first_name", "last_name"] + + fieldsets = [ + ( + None, + {"fields": ["first_name", "last_name", "title", "phone"]}, + ) + ] + + + class WebsiteResource(resources.ModelResource): """defines how each field in the referenced model should be mapped to the corresponding fields in the @@ -1025,6 +1048,7 @@ class WebsiteResource(resources.ModelResource): model = models.Website + class WebsiteAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Custom website admin class.""" @@ -2679,6 +2703,7 @@ admin.site.register(models.DomainRequest, DomainRequestAdmin) admin.site.register(models.TransitionDomain, TransitionDomainAdmin) admin.site.register(models.VerifiedByStaff, VerifiedByStaffAdmin) admin.site.register(models.Portfolio, PortfolioAdmin) +admin.site.register(models.SeniorOfficial, SeniorOfficialAdmin) # Register our custom waffle implementations admin.site.register(models.WaffleFlag, WaffleFlagAdmin) diff --git a/src/registrar/models/__init__.py b/src/registrar/models/__init__.py index b2cffaf32..370eb2fa5 100644 --- a/src/registrar/models/__init__.py +++ b/src/registrar/models/__init__.py @@ -17,6 +17,7 @@ from .transition_domain import TransitionDomain from .verified_by_staff import VerifiedByStaff from .waffle_flag import WaffleFlag from .portfolio import Portfolio +from .senior_official import SeniorOfficial __all__ = [ @@ -38,6 +39,7 @@ __all__ = [ "VerifiedByStaff", "WaffleFlag", "Portfolio", + "SeniorOfficial", ] auditlog.register(Contact) diff --git a/src/registrar/models/portfolio.py b/src/registrar/models/portfolio.py index a05422960..931b56405 100644 --- a/src/registrar/models/portfolio.py +++ b/src/registrar/models/portfolio.py @@ -38,6 +38,14 @@ class Portfolio(TimeStampedModel): default=FederalAgency.get_non_federal_agency, ) + senior_official = models.ForeignKey( + "registrar.SeniorOfficial", + on_delete=models.PROTECT, + help_text="Associated senior official", + unique=False, + default=FederalAgency.get_non_federal_agency, + ) + organization_type = models.CharField( max_length=255, choices=OrganizationChoices.choices, diff --git a/src/registrar/models/senior_official.py b/src/registrar/models/senior_official.py index deb5c0f11..001dee579 100644 --- a/src/registrar/models/senior_official.py +++ b/src/registrar/models/senior_official.py @@ -22,18 +22,18 @@ class SeniorOfficial(TimeStampedModel): first_name = models.CharField( - null=True, - blank=True, + null=False, + blank=False, verbose_name="first name", ) last_name = models.CharField( - null=True, - blank=True, + null=False, + blank=False, verbose_name="last name", ) title = models.CharField( - null=True, - blank=True, + null=False, + blank=False, verbose_name="title / role", ) phone = PhoneNumberField(