blob: 42b87c06767c571800a8d8e8c1be0de4b3762108 [file] [log] [blame]
Oleksii Petrenko99539bd2020-07-31 20:00:06 +03001import datetime
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03002import json
3import os
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +01004from .celery_tasks import test_rail_api
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03005
6from django.shortcuts import render, redirect, HttpResponse
7
8from . import models
9from . import forms
Oleksii Petrenko68268172020-09-28 16:58:13 +030010from .celery_tasks.tasks import process_run, update_plot_data
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030011
12
13def index(request):
Oleksii Petrenko68268172020-09-28 16:58:13 +030014 runs = models.TestRailTestRun.objects.all()
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030015 return render(request, "control/index.html", {"runs": runs})
16
17
18def redirect_to_index(request):
19 return redirect("index")
20
21
22def single_run(request, run_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030023 run = models.TestRailTestRun.objects.get(pk=run_id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030024 if request.method == "POST":
25 form = forms.TestRunForm(request.POST, instance=run)
26 if form.is_valid():
27 form.save()
28 return redirect("single_run", run_id)
29 else:
30 form = forms.TestRunForm(instance=run)
31
32 return render(request, "control/update_run.html",
Anna Arhipovae9258f32023-11-04 12:31:19 +010033 {"form": form, "run_id": run_id, "checked_tests":
34 run.checked_tests})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030035
36
37def create_run(request):
38 if request.method == "POST":
39 form = forms.TestRunForm(request.POST)
40 if form.is_valid():
41 obj = form.save()
42 return redirect("single_run", obj.id)
43 else:
44 form = forms.TestRunForm()
45
Anna Arhipova7cff6e52023-10-25 10:28:01 +020046 form.fields["timestamp"].initial = datetime.date.today()
Anna Arhipova175d4712023-11-06 11:19:44 +010047 return render(request, "control/update_run.html", {"form": form})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030048
49
50def list_reports(request):
Oleksii Petrenko68268172020-09-28 16:58:13 +030051 reports = models.TestRailReport.objects.order_by("-created_at").all()
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030052 return render(request, "control/reports.html", {"reports": reports})
53
54
55def single_report(request, report_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030056 report = models.TestRailReport.objects.get(pk=report_id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030057 data = report.path.read().decode("utf-8")
58 if request.method == "POST" and request.is_ajax():
59 return HttpResponse(
60 json.dumps({"data": data, "finished": report.finished}),
61 content_type="application/json")
Anna Arhipova175d4712023-11-06 11:19:44 +010062
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030063 return render(request, "control/report.html",
Anna Arhipova175d4712023-11-06 11:19:44 +010064 {"report_id": report.id,
65 "report": data,
66 "finished": report.finished})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030067
68
Anna Arhipova6ecdd342023-11-21 13:43:37 +010069def delete_report(request, report_id):
70 report:models.TestRailReport = models.TestRailReport.objects.get(pk=report_id)
71 try:
72 os.remove(report.path.path)
73 except FileNotFoundError:
74 pass
75 report.delete()
76 return redirect("list_reports")
77
78
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030079def submit_run(request, run_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030080 run = models.TestRailTestRun.objects.get(pk=run_id)
Anna Arhipovae9258f32023-11-04 12:31:19 +010081 is_testplan = test_rail_api.is_testplan(run.run_id)
82
83 if is_testplan:
84 testrail_run = test_rail_api.get_plan_by_id(run.run_id)
85 else:
86 testrail_run = test_rail_api.get_run_by_id(run.run_id)
87 run_name = 'Plan-' if is_testplan else "Run-"
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010088 if not run.run_name:
Sofiia Andriichenko56458e52023-09-28 15:07:19 +020089 run_name += testrail_run['name']
90 if run.test_pattern:
Anna Arhipova9bf4c352023-10-14 22:01:32 +020091 run_name += "-" + run.test_pattern
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010092 report_name = "{}-run_id-{}-date-{}".format(
Sofiia Andriichenko56458e52023-09-28 15:07:19 +020093 run_name, run.run_id, datetime.datetime.isoformat(datetime.datetime.now()))
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030094 path = os.path.join(models.fs.location, report_name)
95 with open(path, "w"):
96 pass
97
Oleksii Petrenko68268172020-09-28 16:58:13 +030098 report = models.TestRailReport(
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030099 report_name=report_name,
100 path=path)
101 report.save()
Anna Arhipovae9258f32023-11-04 12:31:19 +0100102 process_run.delay(run_id, report.id, path, is_testplan)
Oleksii Petrenko12508832020-07-10 18:13:53 +0300103 return redirect("single_report", report.id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300104
105
Anna Arhipova52cdec92023-10-05 23:05:48 +0200106def delete_run(request, run_id):
107 run = models.TestRailTestRun.objects.get(pk=run_id)
108 run.delete()
109 return redirect("index")
110
111
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300112def show_help(request):
113 return render(request, "control/help.html")
Oleksii Petrenko68268172020-09-28 16:58:13 +0300114
115
116def update_jenkins_plot(request):
117 try:
118 models.ActionLog.objects.get(name="update_plot_started")
119 return HttpResponse("Update in progress", status=403)
120 except models.ActionLog.DoesNotExist:
121 pass
122 update = models.ActionLog(
123 name="update_plot_started", date=datetime.datetime.now())
124 update.save()
125 update_plot_data.delay()
126 return HttpResponse("Started Update", status=200)
127
128
129def jenkins_plot(request):
130 try:
131 update_date = models.ActionLog.objects.get(
132 name="update_jenkins_plot").date
133 except models.ActionLog.DoesNotExist:
134 update_date = None
135 try:
136 models.ActionLog.objects.get(name="update_plot_started")
137 update_started = True
138 except models.ActionLog.DoesNotExist:
139 update_started = False
140
141 job_names_path = os.path.join(models.fs.location, "job_names.txt")
142 job_names = []
143 if os.path.exists(job_names_path):
144 try:
145 with open(job_names_path, "r") as f:
146 job_names = json.load(f)
147 except:
148 pass
149
150 return render(
151 request, "control/jenkins_plot.html",
152 {"update_date": update_date, "update_started": update_started,
153 "job_names": enumerate(job_names, 1)})