Source code for ferrosoft.apps.ferrobase.api.views
from rest_framework import viewsets, permissions, status
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from uuid_extensions import uuid7str
from ferrosoft.apps.ferrobase.api.serializers import (
MaterialSerializer,
BusinessPartnerSerializer,
CountrySerializer,
MeasurementUnitSerializer,
SignupSerializer,
)
from ferrosoft.apps.ferrobase.models import (
Material,
BusinessPartner,
Country,
MeasurementUnit,
Language,
)
from ferrosoft.apps.ferrobase.services.onboarding import SignupRequest
from ferrosoft.apps.ferrobase.services.taskqueue import (
background_task,
wait_for_success,
)
[docs]
class BusinessPartnerViewSet(viewsets.ModelViewSet):
"""Full CRUD REST endpoint for ``BusinessPartner`` records."""
queryset = BusinessPartner.objects.all()
serializer_class = BusinessPartnerSerializer
permission_classes = [permissions.IsAuthenticated]
[docs]
class CountryViewSet(viewsets.ModelViewSet):
"""Full CRUD REST endpoint for ``Country`` catalog entries."""
queryset = Country.objects.all()
serializer_class = CountrySerializer
permission_classes = [permissions.IsAuthenticated]
[docs]
class MaterialViewSet(viewsets.ModelViewSet):
"""Full CRUD REST endpoint for ``Material`` records."""
queryset = Material.objects.all()
serializer_class = MaterialSerializer
permission_classes = [permissions.IsAuthenticated]
[docs]
class MeasurementUnitViewSet(viewsets.ModelViewSet):
"""Full CRUD REST endpoint for ``MeasurementUnit`` records."""
queryset = MeasurementUnit.objects.all()
serializer_class = MeasurementUnitSerializer
permission_classes = [permissions.IsAuthenticated]
[docs]
class SignupView(APIView):
"""Public endpoint that initiates self-service tenant onboarding.
Accepts signup data, dispatches the onboarding task to the background
task queue, waits for its completion, and returns a success flag.
No authentication is required so that prospective users can register.
"""
TASK_RESULT_GROUP = "api_signup_%s"
permission_classes = [permissions.AllowAny]
[docs]
def post(self, request: Request):
"""Handle signup POST request.
Args:
request: DRF request containing email, first_name, last_name,
company, and language fields.
Returns:
Response: ``{"success": True}`` on success, or a 400 response
with validation errors.
"""
serializer = SignupSerializer(data=request.data)
if not serializer.is_valid():
return Response(
{"errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
)
result_group = self.TASK_RESULT_GROUP % uuid7str()
dat = serializer.data
background_task(
"ferrosoft.apps.ferrobase.services.onboarding.initiate_signup",
SignupRequest(
dat["email"],
dat["company"],
dat["first_name"],
dat["last_name"],
Language.get_supported_language(dat["language"]),
),
self.request.build_absolute_uri("/"),
result_group=result_group,
)
success = wait_for_success(result_group=result_group, count=1)
return Response({"success": success})