Coverage for crunch/django/app/views.py: 100.00%

130 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-10-01 13:43 +0000

1from django.http import HttpResponse 

2from django.views.generic import ListView, DetailView, CreateView, UpdateView 

3from django.contrib.auth.mixins import PermissionRequiredMixin 

4from rest_framework import viewsets 

5from rest_framework import permissions 

6from rest_framework.views import APIView 

7from rest_framework.response import Response 

8from rest_framework import generics 

9from . import models, serializers 

10 

11 

12###################################################### 

13## Project Views 

14###################################################### 

15 

16class ProjectListView(PermissionRequiredMixin, ListView): 

17 model = models.Project 

18 paginate_by = 50 

19 permission_required = "crunch.view_project" 

20 

21 

22class ProjectDetailView(PermissionRequiredMixin, DetailView): 

23 model = models.Project 

24 permission_required = "crunch.view_project" 

25 # lookup_field = 'slug' 

26 

27 

28class ProjectCreateView(PermissionRequiredMixin, CreateView): 

29 model = models.Project 

30 permission_required = "crunch.add_project" 

31 

32 

33class ProjectUpdateView(PermissionRequiredMixin, UpdateView): 

34 model = models.Project 

35 template_name = "crunch/form.html" 

36 # form_class = ProjectForm 

37 permission_required = "crunch.update_project" 

38 extra_context = dict( 

39 form_title="Update Project", 

40 ) 

41 

42 

43class ProjectAPI(viewsets.ModelViewSet): 

44 """ 

45 API endpoint that allows projects to be viewed or edited. 

46 """ 

47 queryset = models.Project.objects.all() 

48 serializer_class = serializers.ProjectSerializer 

49 permission_classes = [permissions.DjangoModelPermissions] 

50 lookup_field = 'slug' 

51 

52 

53###################################################### 

54## Dataset Views 

55###################################################### 

56 

57 

58class DatasetDetailView(PermissionRequiredMixin, DetailView): 

59 model = models.Dataset 

60 permission_required = "crunch.view_dataset" 

61 lookup_field = 'slug' 

62 

63 

64class DatasetAPI(viewsets.ModelViewSet): 

65 """ 

66 API endpoint that allows datasets to be viewed or edited. 

67 """ 

68 queryset = models.Dataset.objects.all() 

69 serializer_class = serializers.DatasetSerializer 

70 permission_classes = [permissions.DjangoModelPermissions] 

71 lookup_field = 'slug' 

72 

73 

74class DatasetCreateView(PermissionRequiredMixin, CreateView): 

75 model = models.Dataset 

76 permission_required = "crunch.add_dataset" 

77 

78 

79class DatasetUpdateView(PermissionRequiredMixin, UpdateView): 

80 model = models.Dataset 

81 template_name = "crunch/form.html" 

82 # form_class = DatasetForm 

83 permission_required = "crunch.update_dataset" 

84 extra_context = dict( 

85 form_title="Update Dataset", 

86 ) 

87 

88 

89class ProjectNextDatasetReference(APIView): 

90 """ 

91 Retuns the study accession ID and the batch index to process next for a particular project. 

92 """ 

93 permission_classes = [permissions.IsAuthenticated] # should be 'view_dataset' 

94 

95 def get(self, request, format=None, slug=None): 

96 assert slug is not None 

97 project = models.Project.objects.get(slug=slug) 

98 dataset = project.next_unprocessed_dataset() 

99 

100 dataset_reference = dict(project=dataset.parent.slug, dataset=dataset.slug) if dataset else dict(project="", dataset="") 

101 serializer = serializers.DatasetReferenceSerializer(dataset_reference) 

102 return Response(serializer.data) 

103 

104 

105class NextDatasetReference(APIView): 

106 """ 

107 Retuns the study accession ID and the batch index to process next. 

108 """ 

109 permission_classes = [permissions.IsAuthenticated] # should be 'view_dataset' 

110 

111 def get(self, request, format=None): 

112 dataset = models.Dataset.next_unprocessed() 

113 

114 dataset_reference = dict(project=dataset.parent.slug, dataset=dataset.slug) if dataset else dict(project="", dataset="") 

115 serializer = serializers.DatasetReferenceSerializer(dataset_reference) 

116 return Response(serializer.data) 

117 

118 

119class StatusListCreateAPIView(generics.ListCreateAPIView): 

120 queryset = models.Status.objects.all() 

121 serializer_class = serializers.StatusSerializer 

122 

123 def perform_create(self, serializer): 

124 serializer.save( 

125 site_user=self.request.user, 

126 ) 

127 

128 

129###################################################### 

130## Item Views 

131###################################################### 

132 

133class ItemDetailView(PermissionRequiredMixin, DetailView): 

134 model = models.Item 

135 permission_required = "crunch.view_item" 

136 lookup_field = 'slug' 

137 

138 

139class ItemCreateView(PermissionRequiredMixin, CreateView): 

140 model = models.Item 

141 permission_required = "crunch.add_item" 

142 

143 

144class ItemUpdateView(PermissionRequiredMixin, UpdateView): 

145 model = models.Item 

146 template_name = "crunch/form.html" 

147 # form_class = ItemForm 

148 permission_required = "crunch.update_item" 

149 extra_context = dict( 

150 form_title="Update Item", 

151 ) 

152 

153 

154class ItemMapView(ItemDetailView): 

155 def get(self, request, slug) -> HttpResponse: 

156 item = self.get_object() 

157 map = item.map() 

158 html = map.to_html(as_string=True) if map else "<p>No map available</p>" 

159 return HttpResponse(html) 

160 

161 

162class ItemAPI(viewsets.ModelViewSet): 

163 """ 

164 API endpoint that allows items to be viewed or edited. 

165 """ 

166 queryset = models.Item.objects.all() 

167 serializer_class = serializers.ItemSerializer 

168 permission_classes = [permissions.DjangoModelPermissions] 

169 lookup_field = 'slug' 

170 

171 

172###################################################### 

173## Attribute Views 

174###################################################### 

175 

176class CharAttributeAPI(viewsets.ModelViewSet): 

177 queryset = models.CharAttribute.objects.all() 

178 serializer_class = serializers.CharAttributeSerializer 

179 permission_classes = [permissions.DjangoModelPermissions] 

180 

181 

182class FloatAttributeAPI(viewsets.ModelViewSet): 

183 queryset = models.FloatAttribute.objects.all() 

184 serializer_class = serializers.FloatAttributeSerializer 

185 permission_classes = [permissions.DjangoModelPermissions] 

186 

187 

188class IntegerAttributeAPI(viewsets.ModelViewSet): 

189 queryset = models.IntegerAttribute.objects.all() 

190 serializer_class = serializers.IntegerAttributeSerializer 

191 permission_classes = [permissions.DjangoModelPermissions] 

192 

193 

194class FilesizeAttributeAPI(viewsets.ModelViewSet): 

195 queryset = models.FilesizeAttribute.objects.all() 

196 serializer_class = serializers.FilesizeAttributeSerializer 

197 permission_classes = [permissions.DjangoModelPermissions] 

198 

199 

200class BooleanAttributeAPI(viewsets.ModelViewSet): 

201 queryset = models.BooleanAttribute.objects.all() 

202 serializer_class = serializers.BooleanAttributeSerializer 

203 permission_classes = [permissions.DjangoModelPermissions] 

204 

205 

206class FloatAttributeAPI(viewsets.ModelViewSet): 

207 queryset = models.FloatAttribute.objects.all() 

208 serializer_class = serializers.FloatAttributeSerializer 

209 permission_classes = [permissions.DjangoModelPermissions] 

210 

211 

212class URLAttributeAPI(viewsets.ModelViewSet): 

213 queryset = models.URLAttribute.objects.all() 

214 serializer_class = serializers.URLAttributeSerializer 

215 permission_classes = [permissions.DjangoModelPermissions] 

216 

217 

218class LatLongAttributeAPI(viewsets.ModelViewSet): 

219 queryset = models.LatLongAttribute.objects.all() 

220 serializer_class = serializers.LatLongAttributeSerializer 

221 permission_classes = [permissions.DjangoModelPermissions] 

222 

223 

224class DateTimeAttributeAPI(viewsets.ModelViewSet): 

225 queryset = models.DateTimeAttribute.objects.all() 

226 serializer_class = serializers.DateTimeAttributeSerializer 

227 permission_classes = [permissions.DjangoModelPermissions] 

228 

229 

230class DateAttributeAPI(viewsets.ModelViewSet): 

231 queryset = models.DateAttribute.objects.all() 

232 serializer_class = serializers.DateAttributeSerializer 

233 permission_classes = [permissions.DjangoModelPermissions]