diff --git a/ansible_ai_connect/ai/api/telemetry/tests/test_api_telemetry_settings_views.py b/ansible_ai_connect/ai/api/telemetry/tests/test_api_telemetry_settings_views.py index 161ab2442..9ab65697a 100644 --- a/ansible_ai_connect/ai/api/telemetry/tests/test_api_telemetry_settings_views.py +++ b/ansible_ai_connect/ai/api/telemetry/tests/test_api_telemetry_settings_views.py @@ -27,7 +27,7 @@ IsOrganisationLightspeedSubscriber, ) from ansible_ai_connect.ai.api.tests.test_views import WisdomServiceAPITestCaseBase -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import APIVersionTestCaseBase @@ -71,7 +71,7 @@ def test_get_settings_without_org_id(self, *args): @patch.object(feature_flags, "LDClient") def test_get_settings_when_undefined(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) with self.assertLogs(logger="root", level="DEBUG") as log: @@ -85,9 +85,9 @@ def test_get_settings_when_undefined(self, LDClient, *args): @patch.object(feature_flags, "LDClient") def test_get_settings_when_defined(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=True)[ - 0 - ] + self.user.organization = ExternalOrganization.objects.get_or_create( + id=123, telemetry_opt_out=True + )[0] self.client.force_authenticate(user=self.user) with self.assertLogs(logger="root", level="DEBUG") as log: @@ -115,7 +115,7 @@ def test_set_settings_without_org_id(self, *args): @patch.object(feature_flags, "LDClient") def test_set_settings_with_valid_value(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) # Settings should initially be False r = self.client.get(self.api_version_reverse("telemetry_settings")) @@ -150,7 +150,7 @@ def test_set_settings_with_valid_value(self, LDClient, *args): @patch.object(feature_flags, "LDClient") def test_set_settings_throws_exception(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) with patch("django.db.models.base.Model.save", side_effect=DatabaseError()): @@ -168,7 +168,7 @@ def test_set_settings_throws_exception(self, LDClient, *args): @patch.object(feature_flags, "LDClient") def test_set_settings_throws_validation_exception(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) with self.assertLogs(logger="root", level="DEBUG") as log: @@ -187,7 +187,7 @@ class TestTelemetrySettingsViewAsNonSubscriber( APIVersionTestCaseBase, WisdomServiceAPITestCaseBase ): def test_get_settings_as_non_subscriber(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) r = self.client.get(self.api_version_reverse("telemetry_settings")) self.assertEqual(r.status_code, HTTPStatus.FORBIDDEN) diff --git a/ansible_ai_connect/ai/api/tests/test_chat_view.py b/ansible_ai_connect/ai/api/tests/test_chat_view.py index 1d002b1c4..19f448214 100644 --- a/ansible_ai_connect/ai/api/tests/test_chat_view.py +++ b/ansible_ai_connect/ai/api/tests/test_chat_view.py @@ -41,7 +41,7 @@ ) from ansible_ai_connect.ai.api.model_pipelines.tests import mock_pipeline_config from ansible_ai_connect.main import ssl_manager -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomServiceAPITestCaseBase, @@ -114,7 +114,7 @@ class TestChatView(APIVersionTestCaseBase, WisdomServiceAPITestCaseBase): def setUp(self): super().setUp() - (org, _) = Organization.objects.get_or_create(id=123, telemetry_opt_out=False) + (org, _) = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False) self.user.organization = org self.user.rh_internal = True @@ -307,7 +307,7 @@ def test_chat_with_system_prompt_override(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -390,7 +390,7 @@ def test_operational_telemetry_limit_exceeded(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_anonymizer(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -414,7 +414,7 @@ def test_operational_telemetry_anonymizer(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_with_system_prompt_override(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -450,7 +450,7 @@ def test_operational_telemetry_with_system_prompt_override(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_with_no_tools_option(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -491,7 +491,7 @@ def test_chat_rate_limit(self): email=email, password=password, ) - (org, _) = Organization.objects.get_or_create(id=123, telemetry_opt_out=False) + (org, _) = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False) self.user2.organization = org self.user2.rh_internal = True # Call chart API five times using self.user2 @@ -507,7 +507,7 @@ def test_chat_rate_limit(self): def test_operational_telemetry_excludes_chat_prompt_by_default(self): """Test that chat_prompt is excluded from telemetry by default (via allow list)""" self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -538,7 +538,7 @@ def test_not_rh_internal_user(self): self.user2 = get_user_model().objects.create_user( username=username, ) - self.user2.organization = Organization.objects.get_or_create( + self.user2.organization = ExternalOrganization.objects.get_or_create( id=123, telemetry_opt_out=False )[0] self.user2.rh_internal = False @@ -553,7 +553,7 @@ class TestStreamingChatView(APIVersionTestCaseBase, WisdomServiceAPITestCaseBase def setUp(self): super().setUp() - (org, _) = Organization.objects.get_or_create(id=123, telemetry_opt_out=False) + (org, _) = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False) self.user.organization = org self.user.rh_internal = True @@ -663,7 +663,7 @@ def test_chat_internal_server_exception(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -723,7 +723,7 @@ def test_operational_telemetry_limit_exceeded(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_anonymizer(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -747,7 +747,7 @@ def test_operational_telemetry_anonymizer(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_with_system_prompt_override(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -781,7 +781,7 @@ def test_operational_telemetry_with_system_prompt_override(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_operational_telemetry_with_no_tools_option(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with ( patch.object( @@ -821,7 +821,7 @@ def test_chat_rate_limit(self): email=email, password=password, ) - (org, _) = Organization.objects.get_or_create(id=123, telemetry_opt_out=False) + (org, _) = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False) self.user2.organization = org self.user2.rh_internal = True # Call chart API five times using self.user2 @@ -839,7 +839,7 @@ def test_not_rh_internal_user(self): self.user2 = get_user_model().objects.create_user( username=username, ) - self.user2.organization = Organization.objects.get_or_create( + self.user2.organization = ExternalOrganization.objects.get_or_create( id=123, telemetry_opt_out=False )[0] self.user2.rh_internal = False diff --git a/ansible_ai_connect/ai/api/tests/test_completion_wca_view.py b/ansible_ai_connect/ai/api/tests/test_completion_wca_view.py index 94941e80a..4c43d2043 100644 --- a/ansible_ai_connect/ai/api/tests/test_completion_wca_view.py +++ b/ansible_ai_connect/ai/api/tests/test_completion_wca_view.py @@ -51,7 +51,7 @@ from ansible_ai_connect.ai.api.model_pipelines.wca.pipelines_saas import ( WCASaaSCompletionsPipeline, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomAppsBackendMocking, @@ -96,7 +96,7 @@ def stub_wca_client( @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -124,7 +124,7 @@ def test_wca_completion(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_wca_completion_seated_user_missing_api_key(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -185,7 +185,7 @@ def test_wca_completion_user_not_linked_to_org(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_missing_model_id(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -212,7 +212,7 @@ def test_wca_completion_seated_user_missing_model_id(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_garbage_model_id(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -240,7 +240,7 @@ def test_wca_completion_seated_user_garbage_model_id(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_not_quite_valid_model_id(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -274,7 +274,7 @@ def test_wca_completion_seated_user_not_quite_valid_model_id(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_invalid_model_id_for_api_key(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -300,7 +300,7 @@ def test_wca_completion_seated_user_invalid_model_id_for_api_key(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_empty_response(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -326,7 +326,7 @@ def test_wca_completion_seated_user_empty_response(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_cloudflare_rejection(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -355,7 +355,7 @@ def test_wca_completion_seated_user_cloudflare_rejection(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_hap_filter_rejection(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -383,7 +383,7 @@ def test_wca_completion_seated_user_hap_filter_rejection(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_wml_api_call_failed(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -412,7 +412,7 @@ def test_wca_completion_wml_api_call_failed(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_trial_expired_rejection(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -436,7 +436,7 @@ def test_wca_completion_seated_user_trial_expired_rejection(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_trial_expired(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -462,7 +462,7 @@ def test_wca_completion_seated_user_trial_expired(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_seated_user_model_id_error(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -490,7 +490,7 @@ def test_wca_completion_seated_user_model_id_error(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_timeout_single_task(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -514,7 +514,7 @@ def test_wca_completion_timeout_single_task(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_timeout_multi_task(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -547,7 +547,7 @@ def test_wca_completion_timeout_multi_task(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_wca_completion_timed_out(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -586,7 +586,7 @@ def test_wca_completion_timed_out(self): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_wca_completion_request_id_correlation_failure(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -636,7 +636,7 @@ def test_wca_completion_segment_event_with_invalid_model_id_error( self, mock_send_segment_event ): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) stub = self.stub_wca_client( @@ -670,7 +670,7 @@ def test_wca_completion_segment_event_with_invalid_model_id_error( @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_completion_wca_instance_deleted(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -703,7 +703,7 @@ def test_wca_completion_wca_instance_deleted(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_inference_failed(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() @@ -732,7 +732,7 @@ def test_wca_inference_failed(self): @override_settings(ENABLE_ARI_POSTPROCESS=False) def test_wca_validation_failed(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) model_client, model_input = self.stub_wca_client() diff --git a/ansible_ai_connect/ai/api/tests/test_feedback_view.py b/ansible_ai_connect/ai/api/tests/test_feedback_view.py index 49478881a..7a9010c7c 100644 --- a/ansible_ai_connect/ai/api/tests/test_feedback_view.py +++ b/ansible_ai_connect/ai/api/tests/test_feedback_view.py @@ -30,7 +30,7 @@ from ansible_ai_connect.ai.api.model_pipelines.wca.pipelines_saas import ( WCASaaSCompletionsPipeline, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomServiceAPITestCaseBase, @@ -50,7 +50,7 @@ class TestFeedbackView(APIVersionTestCaseBase, WisdomServiceAPITestCaseBase): def setUp(self): super().setUp() - (org, _) = Organization.objects.get_or_create(id=123, telemetry_opt_out=False) + (org, _) = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False) self.user.organization = org def test_feedback_full_payload(self): @@ -423,7 +423,7 @@ def test_feedback_chatbot(self): } } self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) with self.assertLogs(logger="root", level="DEBUG") as log: r = self.client.post(self.api_version_reverse("feedback"), payload, format="json") diff --git a/ansible_ai_connect/ai/api/tests/test_views.py b/ansible_ai_connect/ai/api/tests/test_views.py index 0c840b171..ba8052913 100644 --- a/ansible_ai_connect/ai/api/tests/test_views.py +++ b/ansible_ai_connect/ai/api/tests/test_views.py @@ -87,7 +87,7 @@ from ansible_ai_connect.ai.api.serializers import CompletionRequestSerializer from ansible_ai_connect.healthcheck.backends import HealthCheckSummary from ansible_ai_connect.main.tests.test_views import create_user_with_provider -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomAppsBackendMocking, @@ -203,7 +203,7 @@ class TestContentMatchesWCAView( ): def test_wca_contentmatch_single_task(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) payload = { "suggestions": [ @@ -295,7 +295,7 @@ def test_wca_contentmatch_single_task(self): def test_wca_contentmatch_multi_task(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) payload = { "suggestions": [ @@ -395,7 +395,7 @@ def test_wca_contentmatch_multi_task(self): def test_wca_contentmatch_with_custom_model_id(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) payload = { "suggestions": [ @@ -452,7 +452,7 @@ def test_wca_contentmatch_with_custom_model_id(self): def test_wca_contentmatch_without_custom_model_id(self): self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) payload = { "suggestions": [ @@ -518,7 +518,7 @@ def setUp(self): super().setUp() self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) self.payload = { @@ -699,7 +699,7 @@ def setUp(self): super().setUp() self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=1)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=1)[0] self.client.force_authenticate(user=self.user) self.payload = { @@ -1735,7 +1735,7 @@ def setUp(self): self.aap_user.save() def tearDown(self): - Organization.objects.filter(id=1981).delete() + ExternalOrganization.objects.filter(id=1981).delete() self.aap_user.delete() super().tearDown() @@ -1808,7 +1808,7 @@ def setUp(self): self.aap_user.save() def tearDown(self): - Organization.objects.filter(id=1981).delete() + ExternalOrganization.objects.filter(id=1981).delete() self.aap_user.delete() super().tearDown() diff --git a/ansible_ai_connect/ai/api/utils/segment_analytics_telemetry.py b/ansible_ai_connect/ai/api/utils/segment_analytics_telemetry.py index e5541bf1d..56af7c03d 100644 --- a/ansible_ai_connect/ai/api/utils/segment_analytics_telemetry.py +++ b/ansible_ai_connect/ai/api/utils/segment_analytics_telemetry.py @@ -23,7 +23,7 @@ base_send_segment_event, send_segment_event, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.users.models import User logger = logging.getLogger(__name__) @@ -73,7 +73,7 @@ def send_segment_analytics_event( ) return - organization: Organization = user.organization + organization: ExternalOrganization = user.organization if not organization: logger.info("Analytics telemetry not active, because of no organization assigned for user.") return diff --git a/ansible_ai_connect/ai/api/utils/tests/test_segment_analytics_telemetry.py b/ansible_ai_connect/ai/api/utils/tests/test_segment_analytics_telemetry.py index 628d11601..c70e35872 100644 --- a/ansible_ai_connect/ai/api/utils/tests/test_segment_analytics_telemetry.py +++ b/ansible_ai_connect/ai/api/utils/tests/test_segment_analytics_telemetry.py @@ -30,7 +30,7 @@ send_segment_analytics_error_event, send_segment_analytics_event, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization @override_settings(DEPLOYMENT_MODE="saas") @@ -43,13 +43,13 @@ def setUpClass(cls): def setUp(self): super().setUp() self.user.rh_user_has_seat = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.organization.telemetry_opt_out = False self.user.organization.save() feature_flags.FeatureFlags.instance = None def tearDown(self): - Organization.objects.filter(id=123).delete() + ExternalOrganization.objects.filter(id=123).delete() super().tearDown() @staticmethod diff --git a/ansible_ai_connect/ai/api/wca/api_key_views.py b/ansible_ai_connect/ai/api/wca/api_key_views.py index 2a712315b..2ae1f7a23 100644 --- a/ansible_ai_connect/ai/api/wca/api_key_views.py +++ b/ansible_ai_connect/ai/api/wca/api_key_views.py @@ -45,7 +45,7 @@ from ansible_ai_connect.ai.api.serializers import WcaKeyRequestSerializer from ansible_ai_connect.ai.api.utils.segment import send_segment_event from ansible_ai_connect.ai.api.views import ServiceUnavailable -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.users.signals import ( user_delete_wca_api_key, user_delete_wca_model_id, @@ -138,7 +138,7 @@ def post(self, request, *args, **kwargs): # See https://issues.redhat.com/browse/AAP-16009 if not request._request.user.organization: return Response(status=HTTP_400_BAD_REQUEST) - organization: Organization = request._request.user.organization + organization: ExternalOrganization = request._request.user.organization try: # Extract API Key from request @@ -293,7 +293,7 @@ def get(self, request, *args, **kwargs): # See https://issues.redhat.com/browse/AAP-16009 if not request._request.user.organization: return Response(status=HTTP_400_BAD_REQUEST) - organization: Organization = request._request.user.organization + organization: ExternalOrganization = request._request.user.organization try: # Validate API Key _md = apps.get_app_config("ai").get_model_pipeline(MetaData) diff --git a/ansible_ai_connect/ai/api/wca/model_id_views.py b/ansible_ai_connect/ai/api/wca/model_id_views.py index 2fee74c7e..b48a7c1fa 100644 --- a/ansible_ai_connect/ai/api/wca/model_id_views.py +++ b/ansible_ai_connect/ai/api/wca/model_id_views.py @@ -55,7 +55,7 @@ ) from ansible_ai_connect.ai.api.serializers import WcaModelIdRequestSerializer from ansible_ai_connect.ai.api.utils.segment import send_segment_event -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.users.signals import user_set_wca_model_id UNKNOWN_MODEL_ID = "Unknown" @@ -246,7 +246,7 @@ def do_validated_operation(request, api_key_provider, model_id_provider, on_succ # See https://issues.redhat.com/browse/AAP-16009 if not request._request.user.organization: return Response(status=HTTP_400_BAD_REQUEST) - organization: Organization = request._request.user.organization + organization: ExternalOrganization = request._request.user.organization try: api_key = api_key_provider(organization.id) model_id = model_id_provider(organization.id) diff --git a/ansible_ai_connect/ai/api/wca/tests/test_api_key_views.py b/ansible_ai_connect/ai/api/wca/tests/test_api_key_views.py index 628023a3c..11c9fdbea 100644 --- a/ansible_ai_connect/ai/api/wca/tests/test_api_key_views.py +++ b/ansible_ai_connect/ai/api/wca/tests/test_api_key_views.py @@ -38,7 +38,7 @@ IsOrganisationLightspeedSubscriber, IsWCASaaSModelPipeline, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomAppsBackendMocking, @@ -100,7 +100,7 @@ def test_permission_classes(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_get_key_when_undefined(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) mock_secret_manager.get_secret = Mock(return_value=None) @@ -120,7 +120,7 @@ def test_get_key_when_defined_seated_user(self, *args): self._test_get_key_when_defined(True) def _test_get_key_when_defined(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) @@ -136,7 +136,7 @@ def _test_get_key_when_defined(self, has_seat): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_get_key_when_defined_throws_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) mock_secret_manager.get_secret.side_effect = WcaSecretManagerError("Test") @@ -168,7 +168,7 @@ def test_set_key_with_valid_value_seated_user(self, *args): self._test_set_key_with_valid_value(True) def _test_set_key_with_valid_value(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) @@ -212,7 +212,7 @@ def _test_set_key_with_valid_value(self, has_seat): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_key_with_invalid_value(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() @@ -240,7 +240,7 @@ def test_set_key_with_invalid_value(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_key_throws_secret_manager_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) @@ -259,7 +259,7 @@ def test_set_key_throws_secret_manager_exception(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_key_throws_http_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) self.client.force_authenticate(user=self.user) @@ -275,7 +275,7 @@ def test_set_key_throws_http_exception(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_key_throws_validation_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) with self.assertLogs(logger="root", level="DEBUG") as log: @@ -297,7 +297,7 @@ def test_delete_key_without_org_id(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_delete_key(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() @@ -369,7 +369,7 @@ def delete_secret(*args, **kwargs): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_delete_key_with_model_id_deletion_error(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() @@ -419,7 +419,7 @@ def delete_secret(*args, **kwargs): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_delete_key_with_api_key_deletion_error(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() @@ -469,7 +469,7 @@ def delete_secret(*args, **kwargs): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_delete_key_with_no_model_id(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() @@ -517,7 +517,7 @@ def get_secret(*args, **kwargs): ) def test_delete_key_with_no_key_no_model_id(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) @@ -543,7 +543,7 @@ def get_secret(*args, **kwargs): @patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=False) class TestWCAApiKeyViewAsNonSubscriber(APIVersionTestCaseBase, WisdomServiceAPITestCaseBaseOIDC): def test_get_api_key_as_non_subscriber(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) r = self.client.get(self.api_version_reverse("wca_api_key")) self.assertEqual(r.status_code, HTTPStatus.FORBIDDEN) @@ -595,7 +595,7 @@ def test_validate_key_with_valid_value_seated_user(self, *args): self._test_validate_key_with_valid_value(True) def _test_validate_key_with_valid_value(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() _md = apps.get_app_config("ai").get_model_pipeline(MetaData) @@ -612,7 +612,7 @@ def _test_validate_key_with_valid_value(self, has_seat): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_key_with_missing_value(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) mock_secret_manager.get_secret = Mock(return_value=None) @@ -624,7 +624,7 @@ def test_validate_key_with_missing_value(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_key_with_invalid_value(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) self.client.force_authenticate(user=self.user) @@ -639,7 +639,7 @@ def test_validate_key_with_invalid_value(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_key_throws_http_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] _md = apps.get_app_config("ai").get_model_pipeline(MetaData) mock_model_meta_data: WCASaaSMetaData = cast(WCASaaSMetaData, _md) self.client.force_authenticate(user=self.user) diff --git a/ansible_ai_connect/ai/api/wca/tests/test_model_id_views.py b/ansible_ai_connect/ai/api/wca/tests/test_model_id_views.py index 1ed00151a..cb3d277dc 100644 --- a/ansible_ai_connect/ai/api/wca/tests/test_model_id_views.py +++ b/ansible_ai_connect/ai/api/wca/tests/test_model_id_views.py @@ -40,7 +40,7 @@ IsWCASaaSModelPipeline, ) from ansible_ai_connect.ai.api.tests.test_views import WisdomServiceAPITestCaseBase -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomAppsBackendMocking, @@ -110,7 +110,7 @@ def test_permission_classes(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_get_model_id_when_undefined(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) mock_secret_manager.get_secret.return_value = None @@ -130,7 +130,7 @@ def test_get_model_id_when_defined_seated_user(self, *args): self._test_get_model_id_when_defined(True) def _test_get_model_id_when_defined(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) @@ -150,7 +150,7 @@ def _test_get_model_id_when_defined(self, has_seat): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_get_model_id_when_defined_throws_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) mock_secret_manager.get_secret.side_effect = WcaSecretManagerError("Test") @@ -184,7 +184,7 @@ def test_set_model_id_seated_user(self, *args): self._test_set_model_id(True) def _test_set_model_id(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( @@ -251,7 +251,7 @@ def _test_set_model_id(self, has_seat): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_model_id_not_valid(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions @@ -282,7 +282,7 @@ def test_set_model_id_not_valid(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_model_id_throws_secret_manager_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_secret_manager.save_secret.side_effect = WcaSecretManagerError("Test") @@ -299,7 +299,7 @@ def test_set_model_id_throws_secret_manager_exception(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_model_id_throws_validation_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_secret_manager.save_secret.side_effect = WcaSecretManagerError("Test") @@ -315,7 +315,7 @@ def test_set_model_id_throws_validation_exception(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_set_model_id_empty_response(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions @@ -347,7 +347,7 @@ class TestWCAModelIdViewAsNonSubscriber( APIVersionTestCaseBase, WisdomAppsBackendMocking, WisdomServiceAPITestCaseBase ): def test_get_model_id_as_non_subscriber(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) r = self.client.get(self.api_version_reverse("wca_model_id")) self.assertEqual(r.status_code, HTTPStatus.FORBIDDEN) @@ -381,7 +381,7 @@ def tearDown(self): super().tearDown() def test_validate(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions @@ -406,7 +406,7 @@ def test_validate_error_no_org_id(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_no_api_key(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) @@ -426,7 +426,7 @@ def mock_get_secret_no_api_key(*args, **kwargs): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_no_model_id(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() self.client.force_authenticate(user=self.user) @@ -453,7 +453,7 @@ def test_validate_ok_seated_user(self, *args): self._test_validate_ok(True) def _test_validate_ok(self, has_seat): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.user.rh_user_has_seat = has_seat mock_secret_manager = apps.get_app_config("ai").get_wca_secret_manager() mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( @@ -498,7 +498,7 @@ def mock_get_secret_side_effect(*args, **kwargs): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_wrong_model_id(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) @@ -513,7 +513,7 @@ def test_validate_error_wrong_model_id(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_api_key_not_found(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) @@ -530,7 +530,7 @@ def test_validate_error_api_key_not_found(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_user_trial_expired(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) @@ -551,7 +551,7 @@ def test_validate_error_user_trial_expired(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_model_id_bad_request(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) @@ -568,7 +568,7 @@ def test_validate_error_model_id_bad_request(self, *args): @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_model_id_exception(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) @@ -585,7 +585,7 @@ def test_validate_error_model_id_exception(self, *args): @override_settings(WCA_SECRET_DUMMY_SECRETS="123:my-model-id") @override_settings(SEGMENT_WRITE_KEY="DUMMY_KEY_VALUE") def test_validate_error_model_id_empty_response(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] mock_wca_client: ModelPipelineCompletions = apps.get_app_config("ai").get_model_pipeline( ModelPipelineCompletions ) diff --git a/ansible_ai_connect/main/settings/base.py b/ansible_ai_connect/main/settings/base.py index af2ca681a..79b0bda27 100644 --- a/ansible_ai_connect/main/settings/base.py +++ b/ansible_ai_connect/main/settings/base.py @@ -77,9 +77,9 @@ "ansible_ai_connect.healthcheck", "oauth2_provider", "import_export", - "ansible_base.rbac", "ansible_base.resource_registry", "ansible_base.jwt_consumer", + "ansible_base.rbac", ] MIDDLEWARE = [ diff --git a/ansible_ai_connect/main/tests/test_console_views.py b/ansible_ai_connect/main/tests/test_console_views.py index 9b72fb684..691765417 100644 --- a/ansible_ai_connect/main/tests/test_console_views.py +++ b/ansible_ai_connect/main/tests/test_console_views.py @@ -25,7 +25,7 @@ IsOrganisationAdministrator, IsOrganisationLightspeedSubscriber, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import WisdomServiceAPITestCaseBaseOIDC @@ -81,7 +81,7 @@ def test_permission_classes(self, *args): @patch.object(IsOrganisationAdministrator, "has_permission", return_value=True) @patch.object(IsOrganisationLightspeedSubscriber, "has_permission", return_value=True) def test_extra_data(self, *args): - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) response = self.client.get(reverse("console")) self.assertIsInstance(response.context_data, dict) @@ -93,7 +93,7 @@ def test_extra_data(self, *args): @patch.object(feature_flags, "LDClient") def test_extra_data_telemetry_feature(self, LDClient, *args): LDClient.return_value.variation.return_value = True - self.user.organization = Organization.objects.get_or_create(id=123)[0] + self.user.organization = ExternalOrganization.objects.get_or_create(id=123)[0] self.client.force_authenticate(user=self.user) response = self.client.get(reverse("console")) self.assertIsInstance(response.context_data, dict) diff --git a/ansible_ai_connect/main/tests/test_views.py b/ansible_ai_connect/main/tests/test_views.py index 6837cb65e..7741fc767 100644 --- a/ansible_ai_connect/main/tests/test_views.py +++ b/ansible_ai_connect/main/tests/test_views.py @@ -33,7 +33,7 @@ ) from ansible_ai_connect.main.settings.base import SOCIAL_AUTH_OIDC_KEY from ansible_ai_connect.main.views import LoginView -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, create_user_with_provider, @@ -365,7 +365,7 @@ def tearDown(self): self.non_rh_test_user.delete() self.test_group.delete() self.non_rh_user_with_subscription.delete() - Organization.objects.filter(id=12345).delete() + ExternalOrganization.objects.filter(id=12345).delete() def test_chatbot_view_with_anonymous_user(self): r = self.client.get(reverse("chatbot")) diff --git a/ansible_ai_connect/organizations/migrations/0005_rename_organization_to_externalorganization.py b/ansible_ai_connect/organizations/migrations/0005_rename_organization_to_externalorganization.py new file mode 100644 index 000000000..bd23ddd7e --- /dev/null +++ b/ansible_ai_connect/organizations/migrations/0005_rename_organization_to_externalorganization.py @@ -0,0 +1,17 @@ +# Generated migration to rename Organization model to ExternalOrganization + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("organizations", "0004_organization_enable_anonymization"), + ] + + operations = [ + migrations.RenameModel( + old_name="Organization", + new_name="ExternalOrganization", + ), + ] diff --git a/ansible_ai_connect/organizations/migrations/tests/test_0002_user_organization_fix_id.py b/ansible_ai_connect/organizations/migrations/tests/test_0002_user_organization_fix_id.py index 8379c088e..fa3a3eef4 100644 --- a/ansible_ai_connect/organizations/migrations/tests/test_0002_user_organization_fix_id.py +++ b/ansible_ai_connect/organizations/migrations/tests/test_0002_user_organization_fix_id.py @@ -14,7 +14,7 @@ def assert_organization_relationship(self): self.assertIsNotNone(users[0].organization) self.assertEqual(123, users[0].organization.id) - organization_new = self.new_state.apps.get_model("organizations", "Organization") + organization_new = self.new_state.apps.get_model("organizations", "ExternalOrganization") organizations = organization_new.objects.all() self.assertEqual(1, len(organizations)) self.assertTrue(hasattr(users[0], "organization")) diff --git a/ansible_ai_connect/organizations/models.py b/ansible_ai_connect/organizations/models.py index d5e66bdf1..7d575ec05 100644 --- a/ansible_ai_connect/organizations/models.py +++ b/ansible_ai_connect/organizations/models.py @@ -31,7 +31,7 @@ def get_feature_flags(): return FeatureFlags() -class Organization(models.Model): +class ExternalOrganization(models.Model): id = models.IntegerField(primary_key=True) telemetry_opt_out = models.BooleanField(default=False, db_column="telemetry_opt_out") enable_anonymization = models.BooleanField(default=True) diff --git a/ansible_ai_connect/organizations/serializers.py b/ansible_ai_connect/organizations/serializers.py index 83941c8de..afd8f2d59 100644 --- a/ansible_ai_connect/organizations/serializers.py +++ b/ansible_ai_connect/organizations/serializers.py @@ -14,11 +14,11 @@ from rest_framework import serializers -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization class OrganizationSerializer(serializers.ModelSerializer): class Meta: - model = Organization + model = ExternalOrganization fields = ["id", "name", "has_api_key", "has_telemetry_opt_out"] diff --git a/ansible_ai_connect/organizations/tests/test_organizations.py b/ansible_ai_connect/organizations/tests/test_organizations.py index e82ccfdd9..070877686 100644 --- a/ansible_ai_connect/organizations/tests/test_organizations.py +++ b/ansible_ai_connect/organizations/tests/test_organizations.py @@ -16,7 +16,7 @@ from django.test import TestCase, override_settings -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import WisdomServiceAPITestCaseBaseOIDC @@ -38,11 +38,13 @@ def check_flag(self, flag=None, query_dict=None): class TestOrganization(TestCase): def test_org_with_telemetry_schema_2_opted_in(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False)[ + 0 + ] self.assertFalse(organization.has_telemetry_opt_out) def test_org_with_telemetry_schema_2_opted_out(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] self.assertTrue(organization.has_telemetry_opt_out) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -50,7 +52,7 @@ def test_org_with_telemetry_schema_2_opted_out(self): "ansible_ai_connect.organizations.models.get_feature_flags", get_feature_flags_that_say_True ) def test_org_with_telemetry_schema_2_opted_in_with_feature_flag_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] self.assertTrue(organization.has_telemetry_opt_out) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -59,7 +61,7 @@ def test_org_with_telemetry_schema_2_opted_in_with_feature_flag_override(self): get_feature_flags_that_say_False, ) def test_org_with_telemetry_schema_2_opted_in_with_feature_flag_no_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=True)[0] self.assertTrue(organization.has_telemetry_opt_out) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -67,7 +69,9 @@ def test_org_with_telemetry_schema_2_opted_in_with_feature_flag_no_override(self "ansible_ai_connect.organizations.models.get_feature_flags", get_feature_flags_that_say_True ) def test_org_with_telemetry_schema_2_opted_out_with_feature_flag_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False)[ + 0 + ] self.assertFalse(organization.has_telemetry_opt_out) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -76,7 +80,9 @@ def test_org_with_telemetry_schema_2_opted_out_with_feature_flag_override(self): get_feature_flags_that_say_False, ) def test_org_with_telemetry_schema_2_opted_out_with_feature_flag_no_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False)[ + 0 + ] self.assertFalse(organization.has_telemetry_opt_out) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -84,7 +90,9 @@ def test_org_with_telemetry_schema_2_opted_out_with_feature_flag_no_override(sel "ansible_ai_connect.organizations.models.get_feature_flags", get_feature_flags_that_say_True ) def test_org_with_unlimited_access_allowed_with_feature_flag_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False)[ + 0 + ] self.assertTrue(organization.is_subscription_check_should_be_bypassed) @override_settings(LAUNCHDARKLY_SDK_KEY="dummy_key") @@ -93,7 +101,9 @@ def test_org_with_unlimited_access_allowed_with_feature_flag_override(self): get_feature_flags_that_say_False, ) def test_org_with_no_unlimited_access_allowed_with_feature_flag_no_override(self): - organization = Organization.objects.get_or_create(id=123, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=123, telemetry_opt_out=False)[ + 0 + ] self.assertFalse(organization.is_subscription_check_should_be_bypassed) @@ -101,10 +111,14 @@ def test_org_with_no_unlimited_access_allowed_with_feature_flag_no_override(self class TestOrganizationAPIKey(WisdomServiceAPITestCaseBaseOIDC): @override_settings(WCA_SECRET_DUMMY_SECRETS="1981:valid") def test_org_has_api_key(self): - organization = Organization.objects.get_or_create(id=1981, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=1981, telemetry_opt_out=False)[ + 0 + ] self.assertTrue(organization.has_api_key) @override_settings(WCA_SECRET_DUMMY_SECRETS="") def test_org_does_not_have_api_key(self): - organization = Organization.objects.get_or_create(id=1981, telemetry_opt_out=False)[0] + organization = ExternalOrganization.objects.get_or_create(id=1981, telemetry_opt_out=False)[ + 0 + ] self.assertFalse(organization.has_api_key) diff --git a/ansible_ai_connect/test_utils.py b/ansible_ai_connect/test_utils.py index cb3f977ab..75f964cf2 100644 --- a/ansible_ai_connect/test_utils.py +++ b/ansible_ai_connect/test_utils.py @@ -34,7 +34,7 @@ from ansible_ai_connect.ai.api.utils import segment_analytics_telemetry from ansible_ai_connect.ai.api.utils.version import api_version_reverse -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.users.constants import USER_SOCIAL_AUTH_PROVIDER_OIDC from ansible_ai_connect.users.models import Plan @@ -51,7 +51,9 @@ def create_user( org_opt_out: bool = False, **kwargs, ): - (org, _) = Organization.objects.get_or_create(id=rh_org_id, telemetry_opt_out=org_opt_out) + (org, _) = ExternalOrganization.objects.get_or_create( + id=rh_org_id, telemetry_opt_out=org_opt_out + ) kwargs.setdefault("username", "u" + "".join(random.choices(string.digits, k=5))) kwargs.setdefault("password", "secret") kwargs.setdefault("email", kwargs["username"] + "@example.com") @@ -232,7 +234,7 @@ def setUp(self): cache.clear() def tearDown(self): - Organization.objects.filter(id=1).delete() + ExternalOrganization.objects.filter(id=1).delete() self.user.delete() super().tearDown() diff --git a/ansible_ai_connect/users/authentication.py b/ansible_ai_connect/users/authentication.py index e73b32022..c2ad73499 100644 --- a/ansible_ai_connect/users/authentication.py +++ b/ansible_ai_connect/users/authentication.py @@ -10,3 +10,7 @@ def authenticate(self, request): user.aap_user = True user.save() return userdata + + def process_permissions(self): + # Prevent processing of RBAC permissions + pass diff --git a/ansible_ai_connect/users/management/commands/createtoken.py b/ansible_ai_connect/users/management/commands/createtoken.py index c66c44e10..051e1fbce 100644 --- a/ansible_ai_connect/users/management/commands/createtoken.py +++ b/ansible_ai_connect/users/management/commands/createtoken.py @@ -23,7 +23,7 @@ from oauth2_provider.models import AccessToken from oauthlib.common import generate_token -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization class Command(BaseCommand): @@ -78,7 +78,9 @@ def handle( commercial_terms_accepted=n, ) if organization_id: - u.organization = Organization.objects.get_or_create(id=organization_id)[0] + u.organization = ExternalOrganization.objects.get_or_create(id=organization_id)[ + 0 + ] u.save() else: raise CommandError(f"Cannot find user {username}") diff --git a/ansible_ai_connect/users/management/commands/tests/test_createtoken.py b/ansible_ai_connect/users/management/commands/tests/test_createtoken.py index 40dbef7c0..4baa8acc5 100644 --- a/ansible_ai_connect/users/management/commands/tests/test_createtoken.py +++ b/ansible_ai_connect/users/management/commands/tests/test_createtoken.py @@ -22,7 +22,7 @@ from django.test import TestCase from oauth2_provider.models import AccessToken -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization class TestCreateToken(TestCase): @@ -30,7 +30,7 @@ def tearDown(self): User = get_user_model() AccessToken.objects.filter(token="test-token").delete() User.objects.filter(username="my-test-token-user").delete() - Organization.objects.filter(id=12345).delete() + ExternalOrganization.objects.filter(id=12345).delete() def call_command(self, *args, **kwargs): out = StringIO() diff --git a/ansible_ai_connect/users/migrations/0018_remove_team_relationships.py b/ansible_ai_connect/users/migrations/0018_remove_team_relationships.py new file mode 100644 index 000000000..7274be2da --- /dev/null +++ b/ansible_ai_connect/users/migrations/0018_remove_team_relationships.py @@ -0,0 +1,25 @@ +# Generated by Django makemigrations after removing Team.admins, Team.users, and Team.team_parents + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("users", "0017_alter_user_options_team"), + ] + + operations = [ + migrations.RemoveField( + model_name="team", + name="admins", + ), + migrations.RemoveField( + model_name="team", + name="team_parents", + ), + migrations.RemoveField( + model_name="team", + name="users", + ), + ] diff --git a/ansible_ai_connect/users/models.py b/ansible_ai_connect/users/models.py index d7040a045..6e82aa913 100644 --- a/ansible_ai_connect/users/models.py +++ b/ansible_ai_connect/users/models.py @@ -26,7 +26,7 @@ from django_deprecate_fields import deprecate_field from django_prometheus.models import ExportModelOperationsMixin -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from .constants import USER_SOCIAL_AUTH_PROVIDER_AAP, USER_SOCIAL_AUTH_PROVIDER_OIDC @@ -57,7 +57,7 @@ class User(ExportModelOperationsMixin("user"), AbstractUser): commercial_terms_accepted = models.DateTimeField(default=None, null=True) organization_id = deprecate_field(models.IntegerField(default=None, null=True)) organization = NonClashingForeignKey( - Organization, + ExternalOrganization, default=None, null=True, on_delete=models.CASCADE, @@ -182,7 +182,6 @@ class Team(AbstractTeam): """A Team compatible with Django Ansible Base Teams""" resource = AnsibleResourceField(primary_key_field="id") - team_parents = models.ManyToManyField("Team", related_name="team_children", blank=True) ignore_relations = [] @@ -190,17 +189,3 @@ class Meta: app_label = "users" ordering = ["id"] abstract = False - - users = models.ManyToManyField( - User, - related_name="teams", - blank=True, - help_text="The list of users on this team", - ) - - admins = models.ManyToManyField( - User, - related_name="teams_administered", - blank=True, - help_text="The list of admins for this team", - ) diff --git a/ansible_ai_connect/users/pipeline.py b/ansible_ai_connect/users/pipeline.py index bc5505b32..45b6c6f31 100644 --- a/ansible_ai_connect/users/pipeline.py +++ b/ansible_ai_connect/users/pipeline.py @@ -22,7 +22,7 @@ from social_django.models import UserSocialAuth from ansible_ai_connect.ai.api.utils.segment import send_segment_group -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.users.constants import RHSSO_LIGHTSPEED_SCOPE logger = logging.getLogger(__name__) @@ -126,7 +126,9 @@ def redhat_organization(backend, user, response, *args, **kwargs): else: logger.error("AUTHZ_DUMMY_RH_ORG_ADMINS has an invalid format.") - user.organization = Organization.objects.get_or_create(id=int(payload["organization"]["id"]))[0] + user.organization = ExternalOrganization.objects.get_or_create( + id=int(payload["organization"]["id"]) + )[0] user.save() send_segment_group( f"rhsso-{user.organization.id}", "Red Hat Organization", user.organization.id, user diff --git a/ansible_ai_connect/users/tests/test_users.py b/ansible_ai_connect/users/tests/test_users.py index becdcdd29..484af55ba 100644 --- a/ansible_ai_connect/users/tests/test_users.py +++ b/ansible_ai_connect/users/tests/test_users.py @@ -30,7 +30,7 @@ IsOrganisationAdministrator, IsOrganisationLightspeedSubscriber, ) -from ansible_ai_connect.organizations.models import Organization +from ansible_ai_connect.organizations.models import ExternalOrganization from ansible_ai_connect.test_utils import ( APIVersionTestCaseBase, WisdomAppsBackendMocking, @@ -119,7 +119,7 @@ def test_rh_user_has_seat_with_no_seat_checker(self): @override_settings(DEPLOYMENT_MODE="saas") def test_rh_user_in_unlimited_org(self): user = create_user(provider=USER_SOCIAL_AUTH_PROVIDER_OIDC) - org = Organization(None, None) + org = ExternalOrganization(None, None) org.is_subscription_check_should_be_bypassed = True user.organization = org self.assertTrue(user.rh_org_has_subscription)