From 3730d95a6e40193f278d361880c2a7ea57b0a246 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Tue, 7 Oct 2025 13:54:38 +0200 Subject: [PATCH] Add services to limit_osb_services on activation ref #38 --- src/servala/api/views.py | 63 +++++++++++++++------------------- src/tests/test_api_exoscale.py | 6 ++-- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/servala/api/views.py b/src/servala/api/views.py index 8462f66..0aa73a2 100644 --- a/src/servala/api/views.py +++ b/src/servala/api/views.py @@ -1,6 +1,5 @@ import json import logging -from contextlib import suppress from django.conf import settings from django.contrib.auth.decorators import login_not_required @@ -102,45 +101,39 @@ class OSBServiceInstanceView(OSBBasicAuthPermission, View): ) exoscale_origin = get_exoscale_origin() - with suppress(Organization.DoesNotExist): + try: organization = Organization.objects.get( osb_guid=organization_guid, origin=exoscale_origin ) - self._send_service_welcome_email( - request, organization, user, service, service_offering - ) - organization.limit_osb_services.add(service) - return JsonResponse({"message": "Service already enabled"}, status=200) - - odoo_data = { - "company_name": organization_display_name, - "invoice_email": user.email, - } - try: + if service in organization.limit_osb_services.all(): + return JsonResponse({"message": "Service already enabled"}, status=200) + except Organization.DoesNotExist: + odoo_data = { + "company_name": organization_display_name, + "invoice_email": user.email, + } with transaction.atomic(): - billing_entity = BillingEntity.create_from_data( - name=f"{organization_display_name} (Exoscale)", odoo_data=odoo_data - ) - organization = Organization( - name=organization_display_name, - billing_entity=billing_entity, - origin=exoscale_origin, - osb_guid=organization_guid, - ) - organization = Organization.create_organization(organization, user) + try: + billing_entity = BillingEntity.create_from_data( + name=f"{organization_display_name} (Exoscale)", + odoo_data=odoo_data, + ) + organization = Organization( + name=organization_display_name, + billing_entity=billing_entity, + origin=exoscale_origin, + osb_guid=organization_guid, + ) + organization = Organization.create_organization(organization, user) + self._send_invitation_email(request, organization, user) + except Exception: + return JsonResponse({"error": "Internal server error"}, status=500) - self._send_invitation_email(request, organization, user) - self._send_service_welcome_email( - request, organization, user, service, service_offering - ) - - return JsonResponse( - {"message": "Successfully enabled service"}, status=201 - ) - - except Exception as e: - logger.error(f"Error creating organization for Exoscale: {str(e)}") - return JsonResponse({"error": "Internal server error"}, status=500) + organization.limit_osb_services.add(service) + self._send_service_welcome_email( + request, organization, user, service, service_offering + ) + return JsonResponse({"message": "Successfully enabled service"}, status=201) def _send_invitation_email(self, request, organization, user): subject = f"Welcome to Servala - {organization.name}" diff --git a/src/tests/test_api_exoscale.py b/src/tests/test_api_exoscale.py index a14bd44..725eddf 100644 --- a/src/tests/test_api_exoscale.py +++ b/src/tests/test_api_exoscale.py @@ -87,6 +87,7 @@ def test_successful_onboarding_new_organization( assert org.odoo_sale_order_id == 789 assert org.odoo_sale_order_name == "SO001" + assert org.limit_osb_services.all().count() == 1 assert len(mail.outbox) == 2 invitation_email = mail.outbox[0] @@ -107,11 +108,12 @@ def test_duplicate_organization_returns_existing( exoscale_origin, instance_id, ): - Organization.objects.create( + org = Organization.objects.create( name="Existing Org", osb_guid="test-org-guid-123", origin=exoscale_origin, ) + org.limit_osb_services.add(test_service) valid_osb_payload["service_id"] = test_service.osb_service_id valid_osb_payload["plan_id"] = test_service_offering.osb_plan_id @@ -126,7 +128,7 @@ def test_duplicate_organization_returns_existing( response_data = json.loads(response.content) assert response_data["message"] == "Service already enabled" assert Organization.objects.filter(osb_guid="test-org-guid-123").count() == 1 - assert len(mail.outbox) == 1 # Only one email was sent + assert len(mail.outbox) == 0 # No email necessary @pytest.mark.django_db