Skip to content

Commit 0f4095c

Browse files
authored
Merge pull request #624 from jbernal0019/master
Make fields read-only in the serializers' constructors
2 parents ef8e709 + 8f513b7 commit 0f4095c

File tree

15 files changed

+127
-160
lines changed

15 files changed

+127
-160
lines changed

chris_backend/filebrowser/serializers.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ class Meta:
183183
fields = ('url', 'id', 'permission', 'folder_id', 'folder_path', 'group_id',
184184
'group_name', 'folder', 'group', 'grp_name')
185185

186+
def __init__(self, *args, **kwargs):
187+
super().__init__(*args, **kwargs)
188+
189+
if self.instance is not None: # on update
190+
self.fields['grp_name'].read_only = True # set to read-only before validation
191+
186192
def create(self, validated_data):
187193
"""
188194
Overriden to handle the error when trying to create a permission for a group that
@@ -248,6 +254,12 @@ class Meta:
248254
fields = ('url', 'id', 'permission', 'folder_id', 'folder_path', 'user_id',
249255
'user_username', 'folder', 'user', 'username')
250256

257+
def __init__(self, *args, **kwargs):
258+
super().__init__(*args, **kwargs)
259+
260+
if self.instance is not None: # on update
261+
self.fields['username'].read_only = True # set to read-only before validation
262+
251263
def create(self, validated_data):
252264
"""
253265
Overriden to handle the error when trying to create a permission for a user that
@@ -311,6 +323,12 @@ class Meta:
311323
'new_file_path', 'owner_username', 'file_resource', 'parent_folder',
312324
'group_permissions', 'user_permissions', 'owner')
313325

326+
def __init__(self, *args, **kwargs):
327+
super().__init__(*args, **kwargs)
328+
329+
if self.instance is not None: # on update
330+
self.fields['fname'].read_only = True # set to read-only before validation
331+
314332
def update(self, instance, validated_data):
315333
"""
316334
Overriden to grant or remove public access to the file and/or move it to a new
@@ -414,6 +432,12 @@ class Meta:
414432
fields = ('url', 'id', 'permission', 'file_id', 'file_fname', 'group_id',
415433
'group_name', 'file', 'group', 'grp_name')
416434

435+
def __init__(self, *args, **kwargs):
436+
super().__init__(*args, **kwargs)
437+
438+
if self.instance is not None: # on update
439+
self.fields['grp_name'].read_only = True # set to read-only before validation
440+
417441
def get_file_fname(self, obj) -> str:
418442
return obj.file.fname.name
419443

@@ -482,6 +506,12 @@ class Meta:
482506
fields = ('url', 'id', 'permission', 'file_id', 'file_fname', 'user_id',
483507
'user_username', 'file', 'user', 'username')
484508

509+
def __init__(self, *args, **kwargs):
510+
super().__init__(*args, **kwargs)
511+
512+
if self.instance is not None: # on update
513+
self.fields['username'].read_only = True # set to read-only before validation
514+
485515
def get_file_fname(self, obj) -> str:
486516
return obj.file.fname.name
487517

@@ -552,6 +582,13 @@ class Meta:
552582
'linked_folder', 'linked_file', 'parent_folder', 'group_permissions',
553583
'user_permissions', 'owner')
554584

585+
def __init__(self, *args, **kwargs):
586+
super().__init__(*args, **kwargs)
587+
588+
if self.instance is not None: # on update
589+
self.fields['fname'].read_only = True # set to read-only before validation
590+
self.fields['path'].read_only = True
591+
555592
def update(self, instance, validated_data):
556593
"""
557594
Overriden to grant or remove public access to the file and/or move it to a new
@@ -711,6 +748,12 @@ class Meta:
711748
fields = ('url', 'id', 'permission', 'link_file_id', 'link_file_fname',
712749
'group_id', 'group_name', 'link_file', 'group', 'grp_name')
713750

751+
def __init__(self, *args, **kwargs):
752+
super().__init__(*args, **kwargs)
753+
754+
if self.instance is not None: # on update
755+
self.fields['grp_name'].read_only = True # set to read-only before validation
756+
714757
def get_link_file_fname(self, obj) -> str:
715758
return obj.link_file.fname.name
716759

@@ -779,6 +822,12 @@ class Meta:
779822
fields = ('url', 'id', 'permission', 'link_file_id', 'link_file_fname', 'user_id',
780823
'user_username', 'link_file', 'user', 'username')
781824

825+
def __init__(self, *args, **kwargs):
826+
super().__init__(*args, **kwargs)
827+
828+
if self.instance is not None: # on update
829+
self.fields['username'].read_only = True # set to read-only before validation
830+
782831
def get_link_file_fname(self, obj) -> str:
783832
return obj.link_file.fname.name
784833

chris_backend/filebrowser/views.py

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -276,15 +276,6 @@ def retrieve(self, request, *args, **kwargs):
276276
template_data = {"permission": ""}
277277
return services.append_collection_template(response, template_data)
278278

279-
def update(self, request, *args, **kwargs):
280-
"""
281-
Overriden to remove 'grp_name' if provided by the user before serializer
282-
validation.
283-
"""
284-
request.data.pop('grp_name', None) # shoud not change on update
285-
return super(FileBrowserFolderGroupPermissionDetail, self).update(request,
286-
*args, **kwargs)
287-
288279
def perform_destroy(self, instance):
289280
"""
290281
Overriden to remove the group permission for the link file in the SHARED folder
@@ -391,15 +382,6 @@ def retrieve(self, request, *args, **kwargs):
391382
template_data = {"permission": ""}
392383
return services.append_collection_template(response, template_data)
393384

394-
def update(self, request, *args, **kwargs):
395-
"""
396-
Overriden to remove 'username' if provided by the user before serializer
397-
validation.
398-
"""
399-
request.data.pop('username', None) # shoud not change on update
400-
return super(FileBrowserFolderUserPermissionDetail, self).update(request,
401-
*args, **kwargs)
402-
403385
def perform_destroy(self, instance):
404386
"""
405387
Overriden to remove the user permission for the link file in the SHARED folder
@@ -466,14 +448,6 @@ def retrieve(self, request, *args, **kwargs):
466448
template_data = {"public": "", "new_file_path": ""}
467449
return services.append_collection_template(response, template_data)
468450

469-
def update(self, request, *args, **kwargs):
470-
"""
471-
Overriden to remove 'fname' if provided by the user before serializer
472-
validation.
473-
"""
474-
request.data.pop('fname', None) # shoud not change on update
475-
return super(FileBrowserFileDetail, self).update(request, *args, **kwargs)
476-
477451

478452
class FileBrowserFileResource(generics.GenericAPIView):
479453
"""
@@ -587,15 +561,6 @@ def retrieve(self, request, *args, **kwargs):
587561
template_data = {"permission": ""}
588562
return services.append_collection_template(response, template_data)
589563

590-
def update(self, request, *args, **kwargs):
591-
"""
592-
Overriden to remove 'grp_name' if provided by the user before serializer
593-
validation.
594-
"""
595-
request.data.pop('grp_name', None) # shoud not change on update
596-
return super(FileBrowserFileGroupPermissionDetail, self).update(request,
597-
*args, **kwargs)
598-
599564
def perform_destroy(self, instance):
600565
"""
601566
Overriden to remove the group permission for the link file in the SHARED folder
@@ -702,15 +667,6 @@ def retrieve(self, request, *args, **kwargs):
702667
template_data = {"permission": ""}
703668
return services.append_collection_template(response, template_data)
704669

705-
def update(self, request, *args, **kwargs):
706-
"""
707-
Overriden to remove 'username' if provided by the user before serializer
708-
validation.
709-
"""
710-
request.data.pop('username', None) # shoud not change on update
711-
return super(FileBrowserFileUserPermissionDetail, self).update(request,
712-
*args, **kwargs)
713-
714670
def perform_destroy(self, instance):
715671
"""
716672
Overriden to remove the user permission for the link file in the SHARED folder
@@ -778,15 +734,6 @@ def retrieve(self, request, *args, **kwargs):
778734
template_data = {"public": "", "new_link_file_path": ""}
779735
return services.append_collection_template(response, template_data)
780736

781-
def update(self, request, *args, **kwargs):
782-
"""
783-
Overriden to remove 'fname' and 'path' if provided by the user before serializer
784-
validation.
785-
"""
786-
request.data.pop('fname', None) # shoud not change on update
787-
request.data.pop('path', None) # shoud not change on update
788-
return super(FileBrowserLinkFileDetail, self).update(request, *args, **kwargs)
789-
790737
def destroy(self, request, *args, **kwargs):
791738
"""
792739
Overriden to verify that the user's home's system-predefined link files are not
@@ -918,15 +865,6 @@ def retrieve(self, request, *args, **kwargs):
918865
template_data = {"permission": ""}
919866
return services.append_collection_template(response, template_data)
920867

921-
def update(self, request, *args, **kwargs):
922-
"""
923-
Overriden to remove 'grp_name' if provided by the user before serializer
924-
validation.
925-
"""
926-
request.data.pop('grp_name', None) # shoud not change on update
927-
return super(FileBrowserLinkFileGroupPermissionDetail, self).update(request,
928-
*args, **kwargs)
929-
930868
def perform_destroy(self, instance):
931869
"""
932870
Overriden to remove the group permission for the link file in the SHARED folder
@@ -1033,15 +971,6 @@ def retrieve(self, request, *args, **kwargs):
1033971
template_data = {"permission": ""}
1034972
return services.append_collection_template(response, template_data)
1035973

1036-
def update(self, request, *args, **kwargs):
1037-
"""
1038-
Overriden to remove 'username' if provided by the user before serializer
1039-
validation.
1040-
"""
1041-
request.data.pop('username', None) # shoud not change on update
1042-
return super(FileBrowserLinkFileUserPermissionDetail, self).update(request,
1043-
*args, **kwargs)
1044-
1045974
def perform_destroy(self, instance):
1046975
"""
1047976
Overriden to remove the user permission for the link file in the SHARED folder

chris_backend/pacsfiles/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ class Meta:
4545
'status', 'pacs_identifier', 'owner_username', 'result',
4646
'retrieve_list')
4747

48+
def __init__(self, *args, **kwargs):
49+
super().__init__(*args, **kwargs)
50+
51+
if self.instance is not None: # on update
52+
self.fields['query'].read_only = True # set to read-only before validation
53+
4854
def create(self, validated_data):
4955
"""
5056
Overriden to rise a serializer error when attempting to create a PACSQuery

chris_backend/pacsfiles/views.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,6 @@ def retrieve(self, request, *args, **kwargs):
252252
template_data = {'title': '', 'description': ''}
253253
return services.append_collection_template(response, template_data)
254254

255-
def update(self, request, *args, **kwargs):
256-
"""
257-
Overriden to remove descriptors that are not allowed to be updated before
258-
serializer validation.
259-
"""
260-
data = self.request.data
261-
data.pop('query', None)
262-
return super(PACSQueryDetail, self).update(request, *args, **kwargs)
263-
264255

265256
class PACSRetrieveList(generics.ListCreateAPIView):
266257
"""

chris_backend/pipelines/serializers.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class PipelineSerializer(serializers.HyperlinkedModelSerializer):
4848
plugin_tree = serializers.JSONField(write_only=True, required=False)
4949
plugin_inst_id = serializers.IntegerField(min_value=1, write_only=True,
5050
required=False)
51+
name = serializers.CharField(required=False)
5152
owner_username = serializers.ReadOnlyField(source='owner.username')
5253
plugins = serializers.HyperlinkedIdentityField(view_name='pipeline-plugin-list')
5354
plugin_pipings = serializers.HyperlinkedIdentityField(
@@ -65,6 +66,13 @@ class Meta:
6566
'modification_date', 'plugins', 'plugin_pipings', 'default_parameters',
6667
'workflows', 'json_repr')
6768

69+
def __init__(self, *args, **kwargs):
70+
super().__init__(*args, **kwargs)
71+
72+
if self.instance is not None: # on update
73+
self.fields['plugin_tree'].read_only = True
74+
self.fields['plugin_inst_id'].read_only = True
75+
6876
def create(self, validated_data):
6977
"""
7078
Overriden to create the pipeline and associate to it a tree of plugins computed
@@ -143,10 +151,18 @@ def update(self, instance, validated_data):
143151

144152
def validate(self, data):
145153
"""
146-
Overriden to validate that at least one of two fields are in data when
147-
creating a new pipeline.
154+
Overriden to validate that required fields are in data when creating a new
155+
pipeline. Also to delete 'locked' parameter if the pipeline is not locked.
148156
"""
149-
if not self.instance: # this validation only happens on create and not on update
157+
if self.instance:
158+
if not self.instance.locked and 'locked' in data:
159+
# this pipeline was made available to the public so it cannot be locked
160+
del data['locked']
161+
else:
162+
if 'name' not in data:
163+
raise serializers.ValidationError(
164+
{'name': ["This field is required."]})
165+
150166
if 'plugin_tree' not in data and 'plugin_inst_id' not in data:
151167
raise serializers.ValidationError(
152168
{'non_field_errors': ["At least one of the fields 'plugin_tree' "

chris_backend/pipelines/views.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -103,22 +103,6 @@ def retrieve(self, request, *args, **kwargs):
103103
template_data['locked'] = ""
104104
return services.append_collection_template(response, template_data)
105105

106-
def update(self, request, *args, **kwargs):
107-
"""
108-
Overriden to remove parameters that are not allowed to be used on update,
109-
include required parameters if not in the request and delete 'locked' parameter
110-
if the pipeline is not locked.
111-
"""
112-
request.data.pop('plugin_tree', None)
113-
request.data.pop('plugin_inst_id', None)
114-
pipeline = self.get_object()
115-
if not pipeline.locked and 'locked' in request.data:
116-
# this pipeline was made available to the public so it cannot be locked
117-
del request.data['locked']
118-
if 'name' not in request.data:
119-
request.data['name'] = pipeline.name # name is required in the serializer
120-
return super(PipelineDetail, self).update(request, *args, **kwargs)
121-
122106
# def destroy(self, request, *args, **kwargs):
123107
# """
124108
# Overriden to check that the pipeline is locked before attempting to delete it.

chris_backend/plugininstances/serializers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ class Meta:
6868
'output_folder', 'feed', 'plugin', 'workflow', 'compute_resource',
6969
'descendants', 'parameters', 'splits')
7070

71+
def __init__(self, *args, **kwargs):
72+
super().__init__(*args, **kwargs)
73+
74+
if self.instance is None: # on create
75+
self.fields['status'].read_only = True # set to read-only before validation
76+
else: # on update
77+
self.fields['gpu_limit'].read_only = True
78+
self.fields['number_of_workers'].read_only = True
79+
self.fields['cpu_limit'].read_only = True
80+
self.fields['memory_limit'].read_only = True
81+
7182
def validate_previous(self, previous_id):
7283
"""
7384
Custom method to check that an id is provided for previous instance when

chris_backend/plugininstances/views.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@ class PluginInstanceList(generics.ListCreateAPIView):
3333
queryset = Plugin.objects.all()
3434
permission_classes = (permissions.IsAuthenticated,)
3535

36-
def create(self, request, *args, **kwargs):
37-
"""
38-
Overriden to remove descriptors from the request that must take their default
39-
value on creation.
40-
"""
41-
self.request.data.pop('status', None)
42-
return super(PluginInstanceList, self).create(request, *args, **kwargs)
43-
4436
def perform_create(self, serializer):
4537
"""
4638
Overriden to associate an owner, a plugin and a previous plugin instance with
@@ -176,18 +168,6 @@ def retrieve(self, request, *args, **kwargs):
176168
template_data = {'title': '', 'status': ''}
177169
return services.append_collection_template(response, template_data)
178170

179-
def update(self, request, *args, **kwargs):
180-
"""
181-
Overriden to remove descriptors that are not allowed to be updated before
182-
serializer validation.
183-
"""
184-
data = self.request.data
185-
data.pop('gpu_limit', None)
186-
data.pop('number_of_workers', None)
187-
data.pop('cpu_limit', None)
188-
data.pop('memory_limit', None)
189-
return super(PluginInstanceDetail, self).update(request, *args, **kwargs)
190-
191171
def perform_update(self, serializer):
192172
"""
193173
Overriden to cancel this plugin instance and all its descendants' execution.

0 commit comments

Comments
 (0)