-
Notifications
You must be signed in to change notification settings - Fork 106
/
actions.py
63 lines (54 loc) · 2.3 KB
/
actions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from drf_spectacular.utils import extend_schema
from rest_framework.decorators import action
from pulpcore.app import tasks
from pulpcore.app.models import Content, RepositoryVersion
from pulpcore.app.response import OperationPostponedResponse
from pulpcore.app.serializers import (
AsyncOperationResponseSerializer,
RepositoryAddRemoveContentSerializer,
)
from pulpcore.tasking.tasks import dispatch
__all__ = ["ModifyRepositoryActionMixin"]
class ModifyRepositoryActionMixin:
@extend_schema(
description="Trigger an asynchronous task to create a new repository version.",
summary="Modify Repository Content",
responses={202: AsyncOperationResponseSerializer},
)
@action(detail=True, methods=["post"], serializer_class=RepositoryAddRemoveContentSerializer)
def modify(self, request, pk):
"""
Queues a task that creates a new RepositoryVersion by adding and removing content units
"""
add_content_units = []
remove_content_units = []
repository = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
if "base_version" in request.data:
base_version_pk = self.get_resource(request.data["base_version"], RepositoryVersion).pk
else:
base_version_pk = None
if "add_content_units" in request.data:
for url in request.data["add_content_units"]:
content = self.get_resource(url, Content)
add_content_units.append(content.pk)
if "remove_content_units" in request.data:
for url in request.data["remove_content_units"]:
if url == "*":
remove_content_units = [url]
break
else:
content = self.get_resource(url, Content)
remove_content_units.append(content.pk)
task = dispatch(
tasks.repository.add_and_remove,
[repository],
kwargs={
"repository_pk": pk,
"base_version_pk": base_version_pk,
"add_content_units": add_content_units,
"remove_content_units": remove_content_units,
},
)
return OperationPostponedResponse(task, request)