|
|
@@ -15,6 +15,7 @@ from utilities.utils import copy_safe_request, count_related, get_viewname, norm
|
|
|
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
|
|
|
from . import filtersets, forms, tables
|
|
|
from .choices import JobResultStatusChoices
|
|
|
+from .forms.reports import ReportForm
|
|
|
from .models import *
|
|
|
from .reports import get_report, get_reports, run_report
|
|
|
from .scripts import get_scripts, run_script
|
|
|
@@ -592,7 +593,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View):
|
|
|
|
|
|
return render(request, 'extras/report.html', {
|
|
|
'report': report,
|
|
|
- 'run_form': ConfirmationForm(),
|
|
|
+ 'form': ReportForm(),
|
|
|
})
|
|
|
|
|
|
def post(self, request, module, name):
|
|
|
@@ -605,24 +606,36 @@ class ReportView(ContentTypePermissionRequiredMixin, View):
|
|
|
if report is None:
|
|
|
raise Http404
|
|
|
|
|
|
- # Allow execution only if RQ worker process is running
|
|
|
- if not Worker.count(get_connection('default')):
|
|
|
- messages.error(request, "Unable to run report: RQ worker process not running.")
|
|
|
- return render(request, 'extras/report.html', {
|
|
|
- 'report': report,
|
|
|
- })
|
|
|
+ schedule_at = None
|
|
|
+ form = ReportForm(request.POST)
|
|
|
|
|
|
- # Run the Report. A new JobResult is created.
|
|
|
- report_content_type = ContentType.objects.get(app_label='extras', model='report')
|
|
|
- job_result = JobResult.enqueue_job(
|
|
|
- run_report,
|
|
|
- report.full_name,
|
|
|
- report_content_type,
|
|
|
- request.user,
|
|
|
- job_timeout=report.job_timeout
|
|
|
- )
|
|
|
+ if form.is_valid():
|
|
|
+ schedule_at = form.cleaned_data.get("schedule_at")
|
|
|
|
|
|
- return redirect('extras:report_result', job_result_pk=job_result.pk)
|
|
|
+ # Allow execution only if RQ worker process is running
|
|
|
+ if not Worker.count(get_connection('default')):
|
|
|
+ messages.error(request, "Unable to run report: RQ worker process not running.")
|
|
|
+ return render(request, 'extras/report.html', {
|
|
|
+ 'report': report,
|
|
|
+ })
|
|
|
+
|
|
|
+ # Run the Report. A new JobResult is created.
|
|
|
+ report_content_type = ContentType.objects.get(app_label='extras', model='report')
|
|
|
+ job_result = JobResult.enqueue_job(
|
|
|
+ run_report,
|
|
|
+ report.full_name,
|
|
|
+ report_content_type,
|
|
|
+ request.user,
|
|
|
+ job_timeout=report.job_timeout,
|
|
|
+ schedule_at=schedule_at,
|
|
|
+ )
|
|
|
+
|
|
|
+ return redirect('extras:report_result', job_result_pk=job_result.pk)
|
|
|
+
|
|
|
+ return render(request, 'extras/report.html', {
|
|
|
+ 'report': report,
|
|
|
+ 'form': form,
|
|
|
+ })
|
|
|
|
|
|
|
|
|
class ReportResultView(ContentTypePermissionRequiredMixin, View):
|
|
|
@@ -737,6 +750,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, GetScriptMixin, View):
|
|
|
|
|
|
elif form.is_valid():
|
|
|
commit = form.cleaned_data.pop('_commit')
|
|
|
+ schedule_at = form.cleaned_data.pop("_schedule_at")
|
|
|
|
|
|
script_content_type = ContentType.objects.get(app_label='extras', model='script')
|
|
|
|
|
|
@@ -749,6 +763,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, GetScriptMixin, View):
|
|
|
request=copy_safe_request(request),
|
|
|
commit=commit,
|
|
|
job_timeout=script.job_timeout,
|
|
|
+ schedule_at=schedule_at,
|
|
|
)
|
|
|
|
|
|
return redirect('extras:script_result', job_result_pk=job_result.pk)
|
|
|
@@ -788,3 +803,25 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, GetScriptMixin, View)
|
|
|
'result': result,
|
|
|
'class_name': script.__class__.__name__
|
|
|
})
|
|
|
+
|
|
|
+
|
|
|
+#
|
|
|
+# Job results
|
|
|
+#
|
|
|
+
|
|
|
+class JobResultListView(generic.ObjectListView):
|
|
|
+ queryset = JobResult.objects.all()
|
|
|
+ filterset = filtersets.JobResultFilterSet
|
|
|
+ filterset_form = forms.JobResultFilterForm
|
|
|
+ table = tables.JobResultTable
|
|
|
+ actions = ('export', 'delete', 'bulk_delete', )
|
|
|
+
|
|
|
+
|
|
|
+class JobResultDeleteView(generic.ObjectDeleteView):
|
|
|
+ queryset = JobResult.objects.all()
|
|
|
+
|
|
|
+
|
|
|
+class JobResultBulkDeleteView(generic.BulkDeleteView):
|
|
|
+ queryset = JobResult.objects.all()
|
|
|
+ filterset = filtersets.JobResultFilterSet
|
|
|
+ table = tables.JobResultTable
|