diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 6ab48e28d..61d3848bd 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2910,15 +2910,14 @@ class PortfolioAdmin(ListHeaderAdmin): change_form_template = "django/admin/portfolio_change_form.html" fieldsets = [ - # created_on is the created_at field, and portfolio_type is f"{organization_type} - {federal_type}" - (None, {"fields": ["portfolio_type", "organization_name", "creator", "created_on", "notes"]}), - ("Portfolio members", {"fields": ["display_admins", "display_members"]}), - ("Portfolio domains", {"fields": ["domains", "domain_requests"]}), + # created_on is the created_at field + (None, {"fields": ["creator", "created_on", "notes"]}), ("Type of organization", {"fields": ["organization_type", "federal_type"]}), ( "Organization name and mailing address", { "fields": [ + "organization_name", "federal_agency", "state_territory", "address_line1", @@ -2929,6 +2928,8 @@ class PortfolioAdmin(ListHeaderAdmin): ] }, ), + ("Portfolio members", {"fields": ["display_admins", "display_members"]}), + ("Portfolio domains", {"fields": ["domains", "domain_requests"]}), ("Suborganizations", {"fields": ["suborganizations"]}), ("Senior official", {"fields": ["senior_official"]}), ] @@ -2960,6 +2961,10 @@ class PortfolioAdmin(ListHeaderAdmin): readonly_fields = [ # This is the created_at field "created_on", + # Django admin doesn't allow methods to be directly listed in fieldsets. We can + # display the custom methods display_admins amd display_members in the admin form if + # they are readonly. + "federal_type", "domains", "domain_requests", "suborganizations", diff --git a/src/registrar/assets/js/get-gov-admin.js b/src/registrar/assets/js/get-gov-admin.js index fd673878d..032d9f84f 100644 --- a/src/registrar/assets/js/get-gov-admin.js +++ b/src/registrar/assets/js/get-gov-admin.js @@ -860,11 +860,10 @@ function initializeWidgetOnList(list, parentId) { let organizationType = document.getElementById("id_organization_type"); let readonlyOrganizationType = document.querySelector(".field-organization_type .readonly"); - let federalType = document.getElementById("id_federal_type") - if ($federalAgency && (organizationType || readonlyOrganizationType) && federalType) { + if ($federalAgency && (organizationType || readonlyOrganizationType)) { // Attach the change event listener $federalAgency.on("change", function() { - handleFederalAgencyChange($federalAgency, organizationType, readonlyOrganizationType, federalType); + handleFederalAgencyChange($federalAgency, organizationType, readonlyOrganizationType); }); } @@ -880,9 +879,28 @@ function initializeWidgetOnList(list, parentId) { handleStateTerritoryChange(stateTerritory, urbanizationField); }); } + + // Handle hiding the organization name field when the organization_type is federal. + // Run this first one page load, then secondly on a change event. + let organizationNameContainer = document.querySelector(".field-organization_name") + handleOrganizationTypeChange(organizationType, organizationNameContainer); + organizationType.addEventListener("change", function() { + handleOrganizationTypeChange(organizationType, organizationNameContainer); + }); }); - function handleFederalAgencyChange(federalAgency, organizationType, readonlyOrganizationType, federalType) { + function handleOrganizationTypeChange(organizationType, organizationNameContainer) { + if (organizationType && organizationNameContainer) { + let selectedValue = organizationType.value; + if (selectedValue === "federal") { + hideElement(organizationNameContainer); + } else { + showElement(organizationNameContainer); + } + } + } + + function handleFederalAgencyChange(federalAgency, organizationType, readonlyOrganizationType) { // Don't do anything on page load if (isInitialPageLoad) { isInitialPageLoad = false; @@ -923,12 +941,10 @@ function initializeWidgetOnList(list, parentId) { return; } - organizationTypeValue = organizationType ? organizationType.value : readonlyOrganizationType.innerText.toLowerCase(); - // Determine if any changes are necessary to the display of portfolio type or federal type // based on changes to the Federal Agency let federalPortfolioApi = document.getElementById("federal_and_portfolio_types_from_agency_json_url").value; - fetch(`${federalPortfolioApi}?organization_type=${organizationTypeValue}&agency_name=${selectedText}`) + fetch(`${federalPortfolioApi}?&agency_name=${selectedText}`) .then(response => { const statusCode = response.status; return response.json().then(data => ({ statusCode, data })); @@ -938,12 +954,7 @@ function initializeWidgetOnList(list, parentId) { console.error("Error in AJAX call: " + data.error); return; } - if (data.federal_type && selectedText !== "Non-Federal Agency") { - federalType.value = data.federal_type.toLowerCase(); - }else { - federalType.value = ""; - } - updateReadOnly(data.portfolio_type, '.field-portfolio_type'); + updateReadOnly(data.federal_type, '.field-federal_type'); }) .catch(error => console.error("Error fetching federal and portfolio types: ", error)); diff --git a/src/registrar/migrations/0130_create_groups_v17.py b/src/registrar/migrations/0129_create_groups_v17.py similarity index 93% rename from src/registrar/migrations/0130_create_groups_v17.py rename to src/registrar/migrations/0129_create_groups_v17.py index 943507267..7e0ae99ad 100644 --- a/src/registrar/migrations/0130_create_groups_v17.py +++ b/src/registrar/migrations/0129_create_groups_v17.py @@ -25,7 +25,7 @@ def create_groups(apps, schema_editor) -> Any: class Migration(migrations.Migration): dependencies = [ - ("registrar", "0129_portfolio_federal_type"), + ("registrar", "0128_alter_domaininformation_state_territory_and_more"), ] operations = [ diff --git a/src/registrar/migrations/0129_portfolio_federal_type.py b/src/registrar/migrations/0129_portfolio_federal_type.py deleted file mode 100644 index c6d874678..000000000 --- a/src/registrar/migrations/0129_portfolio_federal_type.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.10 on 2024-09-23 15:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("registrar", "0128_alter_domaininformation_state_territory_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="portfolio", - name="federal_type", - field=models.CharField( - blank=True, - choices=[("executive", "Executive"), ("judicial", "Judicial"), ("legislative", "Legislative")], - help_text="Federal agency type (executive, judicial, legislative, etc.)", - max_length=20, - null=True, - ), - ), - ] diff --git a/src/registrar/migrations/0130_alter_portfolio_organization_name.py b/src/registrar/migrations/0130_alter_portfolio_organization_name.py new file mode 100644 index 000000000..f8feaf672 --- /dev/null +++ b/src/registrar/migrations/0130_alter_portfolio_organization_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.10 on 2024-09-25 14:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("registrar", "0129_create_groups_v17"), + ] + + operations = [ + migrations.AlterField( + model_name="portfolio", + name="organization_name", + field=models.CharField(blank=True, null=True), + ), + ] diff --git a/src/registrar/models/portfolio.py b/src/registrar/models/portfolio.py index 0a60d3ec8..7e1bc7616 100644 --- a/src/registrar/models/portfolio.py +++ b/src/registrar/models/portfolio.py @@ -34,7 +34,6 @@ class Portfolio(TimeStampedModel): organization_name = models.CharField( null=True, blank=True, - verbose_name="Portfolio organization", ) organization_type = models.CharField( @@ -58,14 +57,6 @@ class Portfolio(TimeStampedModel): default=FederalAgency.get_non_federal_agency, ) - federal_type = models.CharField( - max_length=20, - choices=BranchChoices.choices, - null=True, - blank=True, - help_text="Federal agency type (executive, judicial, legislative, etc.)", - ) - senior_official = models.ForeignKey( "registrar.SeniorOfficial", on_delete=models.PROTECT, @@ -131,28 +122,16 @@ class Portfolio(TimeStampedModel): if self.state_territory != self.StateTerritoryChoices.PUERTO_RICO and self.urbanization: self.urbanization = None - # Set the federal type field if it doesn't exist already - if self.federal_type is None and self.federal_agency and self.federal_agency.federal_type: - self.federal_type = self.federal_agency.federal_type if self.federal_agency else None - super().save(*args, **kwargs) @property - def portfolio_type(self): - """ - Returns a combination of organization_type / federal_type, seperated by ' - '. - If no federal_type is found, we just return the org type. - """ - return self.get_portfolio_type(self.organization_type, self.federal_type) + def federal_type(self): + """Returns the federal_type value on the underlying federal_agency field""" + return self.get_federal_type(self.federal_agency) @classmethod - def get_portfolio_type(cls, organization_type, federal_type): - org_type_label = cls.OrganizationChoices.get_org_label(organization_type) - agency_type_label = BranchChoices.get_branch_label(federal_type) - if organization_type == cls.OrganizationChoices.FEDERAL and agency_type_label: - return " - ".join([org_type_label, agency_type_label]) - else: - return org_type_label + def get_federal_type(cls, federal_agency): + return federal_agency.federal_type if federal_agency else None # == Getters for domains == # def get_domains(self): diff --git a/src/registrar/views/utility/api_views.py b/src/registrar/views/utility/api_views.py index 430c3416b..7240cf43f 100644 --- a/src/registrar/views/utility/api_views.py +++ b/src/registrar/views/utility/api_views.py @@ -55,11 +55,9 @@ def get_federal_and_portfolio_types_from_federal_agency_json(request): portfolio_type = None agency_name = request.GET.get("agency_name") - organization_type = request.GET.get("organization_type") agency = FederalAgency.objects.filter(agency=agency_name).first() if agency: - federal_type = agency.federal_type - portfolio_type = Portfolio.get_portfolio_type(organization_type, federal_type) + federal_type = Portfolio.get_federal_type(agency) federal_type = BranchChoices.get_branch_label(federal_type) if federal_type else "-" response_data = {