mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Allow scheduling jobs via. the API
This commit is contained in:
@ -282,6 +282,8 @@ http://netbox/api/extras/scripts/example.MyReport/ \
|
|||||||
--data '{"data": {"foo": "somevalue", "bar": 123}, "commit": true}'
|
--data '{"data": {"foo": "somevalue", "bar": 123}, "commit": true}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Optionally `schedule_at` can be passed in the form data with a datetime string to schedule a script at the specified date and time.
|
||||||
|
|
||||||
### Via the CLI
|
### Via the CLI
|
||||||
|
|
||||||
Scripts can be run on the CLI by invoking the management command:
|
Scripts can be run on the CLI by invoking the management command:
|
||||||
|
@ -152,6 +152,8 @@ Our example report above would be called as:
|
|||||||
POST /api/extras/reports/devices.DeviceConnectionsReport/run/
|
POST /api/extras/reports/devices.DeviceConnectionsReport/run/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Optionally `schedule_at` can be passed in the form data with a datetime string to schedule a script at the specified date and time.
|
||||||
|
|
||||||
### Via the CLI
|
### Via the CLI
|
||||||
|
|
||||||
Reports can be run on the CLI by invoking the management command:
|
Reports can be run on the CLI by invoking the management command:
|
||||||
|
@ -38,6 +38,7 @@ __all__ = (
|
|||||||
'ObjectChangeSerializer',
|
'ObjectChangeSerializer',
|
||||||
'ReportDetailSerializer',
|
'ReportDetailSerializer',
|
||||||
'ReportSerializer',
|
'ReportSerializer',
|
||||||
|
'ReportInputSerializer',
|
||||||
'ScriptDetailSerializer',
|
'ScriptDetailSerializer',
|
||||||
'ScriptInputSerializer',
|
'ScriptInputSerializer',
|
||||||
'ScriptLogMessageSerializer',
|
'ScriptLogMessageSerializer',
|
||||||
@ -388,6 +389,10 @@ class ReportDetailSerializer(ReportSerializer):
|
|||||||
result = JobResultSerializer()
|
result = JobResultSerializer()
|
||||||
|
|
||||||
|
|
||||||
|
class ReportInputSerializer(serializers.Serializer):
|
||||||
|
schedule_at = serializers.DateTimeField(required=False, allow_null=True)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Scripts
|
# Scripts
|
||||||
#
|
#
|
||||||
@ -419,6 +424,7 @@ class ScriptDetailSerializer(ScriptSerializer):
|
|||||||
class ScriptInputSerializer(serializers.Serializer):
|
class ScriptInputSerializer(serializers.Serializer):
|
||||||
data = serializers.JSONField()
|
data = serializers.JSONField()
|
||||||
commit = serializers.BooleanField()
|
commit = serializers.BooleanField()
|
||||||
|
schedule_at = serializers.DateTimeField(required=False, allow_null=True)
|
||||||
|
|
||||||
|
|
||||||
class ScriptLogMessageSerializer(serializers.Serializer):
|
class ScriptLogMessageSerializer(serializers.Serializer):
|
||||||
|
@ -231,19 +231,26 @@ class ReportViewSet(ViewSet):
|
|||||||
|
|
||||||
# Retrieve and run the Report. This will create a new JobResult.
|
# Retrieve and run the Report. This will create a new JobResult.
|
||||||
report = self._retrieve_report(pk)
|
report = self._retrieve_report(pk)
|
||||||
|
input_serializer = serializers.ReportInputSerializer(data=request.data)
|
||||||
|
|
||||||
|
if input_serializer.is_valid():
|
||||||
|
schedule_at = input_serializer.validated_data.get('schedule_at')
|
||||||
|
|
||||||
report_content_type = ContentType.objects.get(app_label='extras', model='report')
|
report_content_type = ContentType.objects.get(app_label='extras', model='report')
|
||||||
job_result = JobResult.enqueue_job(
|
job_result = JobResult.enqueue_job(
|
||||||
run_report,
|
run_report,
|
||||||
report.full_name,
|
report.full_name,
|
||||||
report_content_type,
|
report_content_type,
|
||||||
request.user,
|
request.user,
|
||||||
job_timeout=report.job_timeout
|
job_timeout=report.job_timeout,
|
||||||
|
schedule_at=schedule_at,
|
||||||
)
|
)
|
||||||
report.result = job_result
|
report.result = job_result
|
||||||
|
|
||||||
serializer = serializers.ReportDetailSerializer(report, context={'request': request})
|
serializer = serializers.ReportDetailSerializer(report, context={'request': request})
|
||||||
|
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
return Response(input_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -312,6 +319,7 @@ class ScriptViewSet(ViewSet):
|
|||||||
if input_serializer.is_valid():
|
if input_serializer.is_valid():
|
||||||
data = input_serializer.data['data']
|
data = input_serializer.data['data']
|
||||||
commit = input_serializer.data['commit']
|
commit = input_serializer.data['commit']
|
||||||
|
schedule_at = input_serializer.validated_data.get('schedule_at')
|
||||||
|
|
||||||
script_content_type = ContentType.objects.get(app_label='extras', model='script')
|
script_content_type = ContentType.objects.get(app_label='extras', model='script')
|
||||||
job_result = JobResult.enqueue_job(
|
job_result = JobResult.enqueue_job(
|
||||||
@ -323,6 +331,7 @@ class ScriptViewSet(ViewSet):
|
|||||||
request=copy_safe_request(request),
|
request=copy_safe_request(request),
|
||||||
commit=commit,
|
commit=commit,
|
||||||
job_timeout=script.job_timeout,
|
job_timeout=script.job_timeout,
|
||||||
|
schedule_at=schedule_at,
|
||||||
)
|
)
|
||||||
script.result = job_result
|
script.result = job_result
|
||||||
serializer = serializers.ScriptDetailSerializer(script, context={'request': request})
|
serializer = serializers.ScriptDetailSerializer(script, context={'request': request})
|
||||||
|
Reference in New Issue
Block a user