@@ -543,3 +543,79 @@ def delete_exporter(self, request, id, exporter_id):
543543 project = self .get_object ()
544544 models .Exporter .objects .filter (project = project , pk = exporter_id ).delete ()
545545 return Response (status = HTTPStatus .NO_CONTENT )
546+
547+
548+ @extend_schema_view (
549+ list = extend_schema (
550+ summary = "List Services" ,
551+ description = "Retrieve a list of all services." ,
552+ ),
553+ retrieve = extend_schema (
554+ summary = "Retrieve Service" ,
555+ description = "Retrieve detailed information about a specific service." ,
556+ ),
557+ create = extend_schema (summary = "Create Service" , description = "Create a new service." ),
558+ update = extend_schema (summary = "Update Service" , description = "Update an existing service." ),
559+ partial_update = extend_schema (
560+ summary = "Partially Update Service" , description = "Partially update an existing service."
561+ ),
562+ destroy = extend_schema (summary = "Delete Service" , description = "Delete an existing service." ),
563+ )
564+ @extend_schema (tags = ["Service" ])
565+ class ServiceViewSet (NotifierMixin , RuleMixin , viewsets .ModelViewSet ):
566+ model = "Service"
567+ queryset = models .Service .objects .all ()
568+ filterset_class = filters .ServiceFilterV2
569+ serializer_class = serializers .ServiceSerializer
570+ lookup_value_regex = "[^/]+"
571+ lookup_field = "id"
572+ pagination_class = PromgenPagination
573+
574+ def get_serializer_class (self ):
575+ if self .action == "list" :
576+ return serializers .ServiceV2Serializer
577+ if self .action == "retrieve" :
578+ return serializers .ServiceV2Serializer
579+ if self .action == "create" :
580+ return serializers .ServiceV2Serializer
581+ if self .action == "update" :
582+ return serializers .ServiceUpdateSerializer
583+ if self .action == "partial_update" :
584+ return serializers .ServiceUpdateSerializer
585+ return serializers .ServiceV2Serializer
586+
587+ @extend_schema (
588+ summary = "List Projects" ,
589+ description = "Retrieve all projects associated with the specified service." ,
590+ responses = serializers .ProjectV2Serializer (many = True ),
591+ )
592+ @action (detail = True , methods = ["get" ], pagination_class = None , filterset_class = None )
593+ def projects (self , request , id ):
594+ service = self .get_object ()
595+ return Response (
596+ serializers .ProjectV2Serializer (service .project_set .all (), many = True ).data
597+ )
598+
599+ @extend_schema (
600+ summary = "Register Project" ,
601+ description = "Register a new project for the specified service." ,
602+ request = serializers .ProjectUpdateSerializer ,
603+ responses = {201 : serializers .ProjectV2Serializer },
604+ )
605+ @projects .mapping .post
606+ def register_project (self , request , id ):
607+ serializer = serializers .ProjectUpdateSerializer (data = request .data )
608+ serializer .is_valid (raise_exception = True )
609+ service = self .get_object ()
610+
611+ attributes = {"service" : service }
612+
613+ for field in serializer .fields :
614+ value = serializer .validated_data .get (field )
615+ if value is not None :
616+ attributes [field ] = value
617+
618+ project , _ = models .Project .objects .get_or_create (** attributes )
619+ return Response (
620+ serializers .ProjectV2Serializer (project ).data , status = HTTPStatus .CREATED
621+ )
0 commit comments