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})