|
| 1 | +from django.db import transaction |
1 | 2 | from django_filters import CharFilter |
2 | 3 | from drf_spectacular.utils import extend_schema |
3 | 4 | from pulpcore.plugin.models import PulpTemporaryFile |
|
8 | 9 | OperationPostponedResponse, |
9 | 10 | SingleArtifactContentUploadViewSet, |
10 | 11 | ) |
| 12 | +from rest_framework import status |
| 13 | +from rest_framework.decorators import action |
| 14 | +from rest_framework.response import Response |
11 | 15 |
|
12 | 16 | from pulp_rpm.app import tasks as rpm_tasks |
13 | 17 | from 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 | +) |
15 | 23 |
|
16 | 24 |
|
17 | 25 | class PackageFilter(ContentFilter): |
@@ -68,6 +76,14 @@ class PackageViewSet(SingleArtifactContentUploadViewSet): |
68 | 76 | "has_required_repo_perms_on_upload:rpm.view_rpmrepository", |
69 | 77 | ], |
70 | 78 | }, |
| 79 | + { |
| 80 | + "action": ["upload"], |
| 81 | + "principal": "authenticated", |
| 82 | + "effect": "allow", |
| 83 | + "condition": [ |
| 84 | + "has_model_or_domain_perms:rpm.upload_rpm_packages", |
| 85 | + ], |
| 86 | + }, |
71 | 87 | { |
72 | 88 | "action": ["set_label", "unset_label"], |
73 | 89 | "principal": "authenticated", |
@@ -127,3 +143,22 @@ def create(self, request): |
127 | 143 | }, |
128 | 144 | ) |
129 | 145 | return OperationPostponedResponse(task, request) |
| 146 | + |
| 147 | + @extend_schema( |
| 148 | + description="Synchronously upload an RPM package.", |
| 149 | + request=PackageUploadSerializer, |
| 150 | + responses={201: PackageSerializer}, |
| 151 | + summary="Upload an RPM package synchronously.", |
| 152 | + ) |
| 153 | + @action(detail=False, methods=["post"], serializer_class=PackageUploadSerializer) |
| 154 | + def upload(self, request): |
| 155 | + """Create an RPM package.""" |
| 156 | + serializer = self.get_serializer(data=request.data) |
| 157 | + with transaction.atomic(): |
| 158 | + # Create the artifact |
| 159 | + serializer.is_valid(raise_exception=True) |
| 160 | + # Create the Package |
| 161 | + serializer.save() |
| 162 | + |
| 163 | + headers = self.get_success_headers(serializer.data) |
| 164 | + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) |
0 commit comments