1+ from django .db import transaction
12from django_filters import CharFilter
23from drf_spectacular .utils import extend_schema
34from pulpcore .plugin .models import PulpTemporaryFile
89 OperationPostponedResponse ,
910 SingleArtifactContentUploadViewSet ,
1011)
12+ from rest_framework import status
13+ from rest_framework .decorators import action
14+ from rest_framework .response import Response
1115
1216from pulp_rpm .app import tasks as rpm_tasks
1317from pulp_rpm .app .models import Package
14- from pulp_rpm .app .serializers import MinimalPackageSerializer , PackageSerializer
18+ from pulp_rpm .app .serializers import (
19+ MinimalPackageSerializer ,
20+ PackageSerializer ,
21+ PackageUploadSerializer ,
22+ )
1523
1624
1725class PackageFilter (ContentFilter ):
@@ -68,6 +76,14 @@ class PackageViewSet(SingleArtifactContentUploadViewSet):
6876 "has_required_repo_perms_on_upload:rpm.view_rpmrepository" ,
6977 ],
7078 },
79+ {
80+ "action" : ["upload" ],
81+ "principal" : "authenticated" ,
82+ "effect" : "allow" ,
83+ "condition" : [
84+ "has_model_or_domain_perms:rpm.upload_rpm_packages" ,
85+ ],
86+ },
7187 {
7288 "action" : ["set_label" , "unset_label" ],
7389 "principal" : "authenticated" ,
@@ -80,6 +96,12 @@ class PackageViewSet(SingleArtifactContentUploadViewSet):
8096 "queryset_scoping" : {"function" : "scope_queryset" },
8197 }
8298
99+ LOCKED_ROLES = {
100+ "rpm.rpm_package_uploader" : [
101+ "rpm.upload_rpm_packages" ,
102+ ],
103+ }
104+
83105 @extend_schema (
84106 description = "Trigger an asynchronous task to create an RPM package,"
85107 "optionally create new repository version." ,
@@ -127,3 +149,22 @@ def create(self, request):
127149 },
128150 )
129151 return OperationPostponedResponse (task , request )
152+
153+ @extend_schema (
154+ description = "Synchronously upload an RPM package." ,
155+ request = PackageUploadSerializer ,
156+ responses = {201 : PackageSerializer },
157+ summary = "Upload an RPM package synchronously." ,
158+ )
159+ @action (detail = False , methods = ["post" ], serializer_class = PackageUploadSerializer )
160+ def upload (self , request ):
161+ """Create an RPM package."""
162+ serializer = self .get_serializer (data = request .data )
163+ with transaction .atomic ():
164+ # Create the artifact
165+ serializer .is_valid (raise_exception = True )
166+ # Create the Package
167+ serializer .save ()
168+
169+ headers = self .get_success_headers (serializer .data )
170+ return Response (serializer .data , status = status .HTTP_201_CREATED , headers = headers )
0 commit comments