diff --git a/src/registrar/models/user.py b/src/registrar/models/user.py index 60b08ddcd..80c972d38 100644 --- a/src/registrar/models/user.py +++ b/src/registrar/models/user.py @@ -470,4 +470,4 @@ class User(AbstractUser): if self.is_org_user(request) and self.has_view_all_domain_requests_portfolio_permission(portfolio): return DomainRequest.objects.filter(portfolio=portfolio).values_list("id", flat=True) else: - return UserDomainRole.objects.filter(user=self).values_list("domain_request_id", flat=True) + return UserDomainRole.objects.filter(user=self).values_list("id", flat=True) diff --git a/src/registrar/tests/test_reports.py b/src/registrar/tests/test_reports.py index ed2b75791..05a3a7599 100644 --- a/src/registrar/tests/test_reports.py +++ b/src/registrar/tests/test_reports.py @@ -6,7 +6,7 @@ from registrar.models import ( Domain, UserDomainRole, ) -from registrar.models import Portfolio +from registrar.models import Portfolio, DraftDomain from registrar.models.user_portfolio_permission import UserPortfolioPermission from registrar.models.utility.portfolio_helper import UserPortfolioRoleChoices from registrar.utility.csv_export import ( @@ -14,6 +14,7 @@ from registrar.utility.csv_export import ( DomainDataType, DomainDataFederal, DomainDataTypeUser, + DomainRequestsDataType, DomainGrowth, DomainManaged, DomainUnmanaged, @@ -394,6 +395,84 @@ class ExportDataTest(MockDbForIndividualTests, MockEppLib): return csv_content + @less_console_noise_decorator + @override_flag("organization_feature", active=True) + def test_domain_request_data_type_user_with_portfolio(self): + """Tests DomainRequestsDataType export with portfolio permissions""" + + # Create a portfolio and assign it to the user + portfolio = Portfolio.objects.create(creator=self.user, organization_name="Testy Test Portfolio") + portfolio_permission, _ = UserPortfolioPermission.objects.get_or_create(portfolio=portfolio, user=self.user) + + # Create DraftDomain objects + dd_1 = DraftDomain.objects.create(name="example1.com") + dd_2 = DraftDomain.objects.create(name="example2.com") + dd_3 = DraftDomain.objects.create(name="example3.com") + + # Create some domain requests + dr_1 = DomainRequest.objects.create(creator=self.user, requested_domain=dd_1, portfolio=portfolio) + dr_2 = DomainRequest.objects.create(creator=self.user, requested_domain=dd_2) + dr_3 = DomainRequest.objects.create(creator=self.user, requested_domain=dd_3, portfolio=portfolio) + + # Set up user permissions + portfolio_permission.roles = [UserPortfolioRoleChoices.ORGANIZATION_ADMIN] + portfolio_permission.save() + portfolio_permission.refresh_from_db() + + # Make a GET request using self.client to get a request object + request = get_wsgi_request_object(client=self.client, user=self.user) + + # Get the CSV content + csv_content = self._run_domain_request_data_type_user_export(request) + print("CSV CONTENT FIRST TIME IS ", csv_content) + + # We expect only domain requests associated with the user's portfolio + self.assertIn(dd_1.name, csv_content) + self.assertIn(dd_3.name, csv_content) + self.assertNotIn(dd_2.name, csv_content) + + # Test the output for readonly admin + portfolio_permission.roles = [UserPortfolioRoleChoices.ORGANIZATION_ADMIN_READ_ONLY] + portfolio_permission.save() + portfolio_permission.refresh_from_db() + + csv_content = self._run_domain_request_data_type_user_export(request) + print("CSV CONTENT SECOND TIME IS ", csv_content) + + self.assertIn(dd_1.name, csv_content) + self.assertIn(dd_3.name, csv_content) + self.assertNotIn(dd_2.name, csv_content) + + portfolio_permission.roles = [UserPortfolioRoleChoices.ORGANIZATION_MEMBER] + portfolio_permission.save() + portfolio_permission.refresh_from_db() + + # Get the CSV content -- Q: no portfolio but dd2 is not displaying correctly + csv_content = self._run_domain_request_data_type_user_export(request) + print("CSV CONTENT THIRD TIME IS ", csv_content) + self.assertNotIn(dd_1.name, csv_content) + self.assertNotIn(dd_3.name, csv_content) + self.assertIn(dd_2.name, csv_content) + + # Clean up the created objects + dr_1.delete() + dr_2.delete() + dr_3.delete() + portfolio.delete() + + def _run_domain_request_data_type_user_export(self, request): + """Helper function to run the exporting_dr_data_to_csv function on DomainRequestsDataType""" + + csv_file = StringIO() + + DomainRequestsDataType.exporting_dr_data_to_csv(csv_file, request=request) + + csv_file.seek(0) + + csv_content = csv_file.read() + + return csv_content + @less_console_noise_decorator def test_domain_data_full(self): """Shows security contacts, filtered by state""" diff --git a/src/registrar/utility/csv_export.py b/src/registrar/utility/csv_export.py index 061dd9e10..89ce42c0c 100644 --- a/src/registrar/utility/csv_export.py +++ b/src/registrar/utility/csv_export.py @@ -605,7 +605,7 @@ class DomainRequestsDataType: return attribute if attribute is not None else default @classmethod - def export_data_to_csv(cls, response, request=None): + def exporting_dr_data_to_csv(cls, response, request=None): import csv writer = csv.writer(response) @@ -645,6 +645,12 @@ class DomainRequestsDataType: ) queryset = cls.get_queryset(request) + # TO REMOVE + print("Queryset IDs:", list(queryset.values_list("id", flat=True))) + # TO REMOVE + for request in queryset: + print("Processing request:", request) + for request in queryset: writer.writerow( [ diff --git a/src/registrar/views/report_views.py b/src/registrar/views/report_views.py index 07c73c611..50f534290 100644 --- a/src/registrar/views/report_views.py +++ b/src/registrar/views/report_views.py @@ -173,9 +173,11 @@ class ExportDataTypeRequests(View): """Returns a domain requests report for a given user on the request""" def get(self, request, *args, **kwargs): + print("ExportDataTypeRequests get method called") response = HttpResponse(content_type="text/csv") response["Content-Disposition"] = 'attachment; filename="domain-requests.csv"' - csv_export.DomainRequestsDataType.export_data_to_csv(response, request=request) + print("!!!!!!!!!!!", dir(csv_export.DomainRequestsDataType)) + csv_export.DomainRequestsDataType.exporting_dr_data_to_csv(response, request=request) return response