moved validation from view to serializer. Prevent relaunching job with deleted credential

This commit is contained in:
Chris Meyers
2015-04-24 09:04:22 -04:00
parent 4fc04a3709
commit f194c0dc1b
2 changed files with 30 additions and 18 deletions

View File

@@ -1493,16 +1493,35 @@ class JobCancelSerializer(JobSerializer):
class JobRelaunchSerializer(JobSerializer): class JobRelaunchSerializer(JobSerializer):
passwords_needed_to_start = serializers.SerializerMethodField('get_passwords_needed_to_start')
class Meta: class Meta:
fields = () fields = ('passwords_needed_to_start',)
def to_native(self, obj): def get_passwords_needed_to_start(self, obj):
if obj: if obj:
return dict([(p, u'') for p in obj.passwords_needed_to_start]) return obj.passwords_needed_to_start
else: return ''
return {}
def validate_passwords_needed_to_start(self, attrs, source):
obj = self.context.get('obj')
data = self.context.get('data')
# Check for passwords needed
needed = self.get_passwords_needed_to_start(obj)
provided = dict([(field, data.get(field, '')) for field in needed])
if not all(provided.values()):
raise serializers.ValidationError(needed)
data.clear()
data.update(provided)
return attrs
def validate(self, attrs):
obj = self.context.get('obj')
if not obj.credential or obj.credential.active == False:
raise serializers.ValidationError(dict(credential=["Credential not found or deleted."]))
return attrs
class AdHocCommandSerializer(UnifiedJobSerializer): class AdHocCommandSerializer(UnifiedJobSerializer):

View File

@@ -1843,7 +1843,7 @@ class JobCancel(RetrieveAPIView):
else: else:
return self.http_method_not_allowed(request, *args, **kwargs) return self.http_method_not_allowed(request, *args, **kwargs)
class JobRelaunch(GenericAPIView): class JobRelaunch(RetrieveAPIView, GenericAPIView):
model = Job model = Job
serializer_class = JobRelaunchSerializer serializer_class = JobRelaunchSerializer
@@ -1854,23 +1854,16 @@ class JobRelaunch(GenericAPIView):
def dispatch(self, *args, **kwargs): def dispatch(self, *args, **kwargs):
return super(JobRelaunch, self).dispatch(*args, **kwargs) return super(JobRelaunch, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
obj = self.get_object()
data = {}
data['passwords_needed_to_start'] = obj.passwords_needed_to_start
return Response(data)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
obj = self.get_object() obj = self.get_object()
if not request.user.can_access(self.model, 'start', obj): if not request.user.can_access(self.model, 'start', obj):
raise PermissionDenied() raise PermissionDenied()
# Check for passwords needed before copying job. # Note: is_valid() may modify request.DATA
needed = obj.passwords_needed_to_start # It will remove any key/value pair who's key is not in the 'passwords_needed_to_start' list
provided = dict([(field, request.DATA.get(field, '')) for field in needed]) serializer = self.serializer_class(data=request.DATA, context={'obj': obj, 'data': request.DATA})
if not all(provided.values()): if not serializer.is_valid():
data = dict(passwords_needed_to_start=needed) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(data, status=status.HTTP_400_BAD_REQUEST)
new_job = obj.copy() new_job = obj.copy()
result = new_job.signal_start(**request.DATA) result = new_job.signal_start(**request.DATA)