Add services to limit_osb_services on activation

ref #38
This commit is contained in:
Tobias Kunze 2025-10-07 13:54:38 +02:00
parent df3e3d5f0c
commit 3730d95a6e
2 changed files with 32 additions and 37 deletions

View file

@ -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}"

View file

@ -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