Compare test suites results feature PRODX-36767

Update Django to 4.2 version

Change-Id: Ieed17cfac12518262503043ccee03473a3023221
diff --git a/testrail_bot/control/views.py b/testrail_bot/control/views.py
index c9fe8f3..f7b0a9d 100644
--- a/testrail_bot/control/views.py
+++ b/testrail_bot/control/views.py
@@ -7,7 +7,9 @@
 
 from . import models
 from . import forms
-from .celery_tasks.tasks import process_run, update_plot_data
+from .celery_tasks.tasks import process_run, update_plot_data, \
+    get_test_passability_in_suite
+from .utils import short_names_for_dict, get_dict_diff
 
 
 def index(request):
@@ -55,7 +57,8 @@
 def single_report(request, report_id):
     report = models.TestRailReport.objects.get(pk=report_id)
     data = report.path.read().decode("utf-8")
-    if request.method == "POST" and request.is_ajax():
+    if request.method == "POST" \
+            and request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
         return HttpResponse(
             json.dumps({"data": data, "finished": report.finished}),
             content_type="application/json")
@@ -141,3 +144,80 @@
         request, "control/jenkins_plot.html",
         {"update_date": update_date, "update_started": update_started,
          "job_names": enumerate(job_names, 1)})
+
+
+def submit_suites(request):
+    form = forms.DiffPassRatesForm(request.POST)
+    if not form.is_valid():
+        print(f"{form.errors=}")
+        return
+    report1 = models.SuitePassRate(suite_id=request.POST["first-suite_id"])
+    report1.save()
+    report2 = models.SuitePassRate(suite_id=request.POST["second-suite_id"])
+    report2.save()
+
+    diff_model = models.DiffOfSuitesPassRates(
+        report1=report1,
+        report2=report2,
+        limit=form.cleaned_data["limit"],
+        test_keyword=form.cleaned_data["test_keyword"]
+    )
+    diff_model.save()
+    get_test_passability_in_suite.delay(diff_model.id, report1.id)
+    get_test_passability_in_suite.delay(diff_model.id, report2.id)
+
+    return redirect("report_comparing_suites", diff_model.id)
+
+
+def compare_suites(request):
+    if request.method == "POST":
+        return submit_suites(request)
+
+    diff_form = forms.DiffPassRatesForm()
+    report1_form = forms.SuitePassRateForm(prefix='first')
+    report2_form = forms.SuitePassRateForm(prefix='second')
+
+    return render(
+        request, "control/compare_suites.html",
+        {
+         "diff_form": diff_form,
+         "report1_form": report1_form,
+         "report2_form": report2_form,
+         "finished": None
+        })
+
+
+def list_of_comparing_reports(request):
+    list_of_reports = models.DiffOfSuitesPassRates.objects.all()
+    return render(
+        request, "control/list_comparing_suites.html",
+        {
+            "reports": list_of_reports
+        })
+
+
+def report_comparing_suites(request, report_id):
+    report = models.DiffOfSuitesPassRates.objects.get(pk=report_id)
+    passrate1 = short_names_for_dict(json.loads(
+        report.report1.passrate_by_tests))
+    passrate2 = short_names_for_dict(json.loads(
+        report.report2.passrate_by_tests))
+
+    diff_table = get_dict_diff(dict1=passrate1,
+                               dict2=passrate2,
+                               compare_by_key="rate")
+    diff_form = forms.DiffPassRatesForm(instance=report)
+    report1_form = forms.SuitePassRateForm(instance=report.report1,
+                                           prefix="first")
+    report2_form = forms.SuitePassRateForm(instance=report.report2,
+                                           prefix="second")
+
+    return render(
+        request, "control/compare_suites.html",
+        {"diff_form": diff_form,
+         "report1_form": report1_form,
+         "report2_form": report2_form,
+         "report1": report.report1,
+         "report2": report.report2,
+         "is_finished": report.report1.finished and report.report2.finished,
+         "diff_table": diff_table})