-
-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathcomputational_result.py
More file actions
125 lines (94 loc) · 3.94 KB
/
Copy pathcomputational_result.py
File metadata and controls
125 lines (94 loc) · 3.94 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
##
# Contains ComputationalResultListView, ComputationalResultDetailView, and needed serializers
##
from django.core.exceptions import ValidationError
from rest_framework import generics, serializers
from django_filters.rest_framework import DjangoFilterBackend
from data_refinery_api.exceptions import InvalidFilters
from data_refinery_api.utils import check_filters
from data_refinery_api.views.relation_serializers import (
ComputationalResultAnnotationRelationSerializer,
ComputedFileRelationSerializer,
ComputedFileWithUrlRelationSerializer,
OrganismIndexRelationSerializer,
ProcessorRelationSerializer,
)
from data_refinery_common.models import APIToken, ComputationalResult
##
# Serializers
##
class ComputationalResultSerializer(serializers.ModelSerializer):
annotations = ComputationalResultAnnotationRelationSerializer(
many=True, source="computationalresultannotation_set"
)
processor = ProcessorRelationSerializer(many=False)
organism_index = OrganismIndexRelationSerializer(many=False)
files = ComputedFileRelationSerializer(many=True, source="computedfile_set")
class Meta:
model = ComputationalResult
fields = (
"id",
"commands",
"processor",
"is_ccdl",
"annotations",
"files",
"organism_index",
"time_start",
"time_end",
"created_at",
"last_modified_at",
)
read_only_fields = fields
class ComputationalResultWithUrlSerializer(ComputationalResultSerializer):
files = ComputedFileWithUrlRelationSerializer(many=True, source="computedfile_set")
class DetailedComputationalResultSerializer(ComputationalResultSerializer):
processor = ProcessorRelationSerializer(many=False)
organism_index = OrganismIndexRelationSerializer(many=False)
class DetailedComputationalResultWithUrlSerializer(ComputationalResultWithUrlSerializer):
processor = ProcessorRelationSerializer(many=False)
organism_index = OrganismIndexRelationSerializer(many=False)
##
# Views
##
class ComputationalResultListView(generics.ListAPIView):
"""
computational_result_list
This lists all `ComputationalResult`. Each one contains meta-information about the output of a computer process. (Ex Salmon).
This can return valid S3 urls if a valid [token](#tag/token) is sent in the header `HTTP_API_KEY`.
"""
queryset = ComputationalResult.public_objects.all()
filter_backends = (DjangoFilterBackend,)
filterset_fields = ["processor__id"]
def get_serializer_class(self):
token_id = self.request.META.get("HTTP_API_KEY", None)
try:
# Verify that a token with that id exists
APIToken.objects.get(id=token_id, is_activated=True)
return ComputationalResultWithUrlSerializer
except (APIToken.DoesNotExist, ValidationError):
return ComputationalResultSerializer
def get_queryset(self):
invalid_filters = check_filters(self)
if invalid_filters:
raise InvalidFilters(invalid_filters=invalid_filters)
return self.queryset
def filter_queryset(self, queryset):
filter_dict = self.request.query_params.dict()
filter_dict.pop("limit", None)
filter_dict.pop("offset", None)
return queryset.filter(**filter_dict)
class ComputationalResultDetailView(generics.RetrieveAPIView):
"""
Retrieves a computational result by its ID
"""
lookup_field = "id"
queryset = ComputationalResult.public_objects.all()
def get_serializer_class(self):
token_id = self.request.META.get("HTTP_API_KEY", None)
try:
# Verify that a token with that id exists
APIToken.objects.get(id=token_id, is_activated=True)
return DetailedComputationalResultWithUrlSerializer
except (APIToken.DoesNotExist, ValidationError):
return DetailedComputationalResultSerializer