blob: eb5c7ccd37c939f53c49272bbdf6edf75b46b7be [file] [log] [blame]
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03001from django.core.files.storage import FileSystemStorage
2from django.db import models
Anna Arhipova22ea6bf2024-02-20 15:25:30 +01003from django.utils.timezone import now, timedelta
4from django_celery_beat.models import PeriodicTask
Anna Arhipovae9258f32023-11-04 12:31:19 +01005
6
7class IntegerListField(models.Field):
8 def __init__(self, *args, **kwargs):
stavrovska28772bc2024-05-22 09:33:50 +02009 kwargs["editable"] = False
Anna Arhipovae9258f32023-11-04 12:31:19 +010010 super(IntegerListField, self).__init__(*args, **kwargs)
11
12 def db_type(self, connection):
stavrovska28772bc2024-05-22 09:33:50 +020013 return "text"
Anna Arhipovae9258f32023-11-04 12:31:19 +010014
15 def from_db_value(self, value, expression, connection):
16 if not value:
17 return []
stavrovska28772bc2024-05-22 09:33:50 +020018 return [int(x) for x in value.split(",")]
Anna Arhipovae9258f32023-11-04 12:31:19 +010019
20 def to_python(self, value):
21 if isinstance(value, list):
22 return value
23 if not value:
24 return []
stavrovska28772bc2024-05-22 09:33:50 +020025 return [int(x) for x in value.split(",")]
Anna Arhipovae9258f32023-11-04 12:31:19 +010026
27 def get_prep_value(self, value):
28 if not value:
stavrovska28772bc2024-05-22 09:33:50 +020029 return ""
30 return ",".join(str(int(x)) for x in value)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030031
32
Anna Arhipova22ea6bf2024-02-20 15:25:30 +010033def default_created_after():
34 return now() + timedelta(days=-3 * 30)
35
36
Oleksii Petrenko68268172020-09-28 16:58:13 +030037class TestRailTestRun(models.Model):
stavrovska28772bc2024-05-22 09:33:50 +020038 project_name = models.CharField(
39 max_length=300, default="Mirantis Cloud Platform"
40 )
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010041 plan_name = models.CharField(max_length=300, default="[MCP2.0]OSCORE")
42 run_name = models.CharField(max_length=300, blank=True)
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010043 testrun_pattern = models.CharField(max_length=300, blank=True)
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010044 run_id = models.CharField(max_length=300)
Anna Arhipovae9258f32023-11-04 12:31:19 +010045 checked_tests = IntegerListField(default=list())
Anna Arhipovaec725222024-01-21 00:10:37 +010046 caching_tests_enabled = models.BooleanField(default=False)
stavrovska28772bc2024-05-22 09:33:50 +020047 created_by_id = models.IntegerField(default="109")
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030048 filter_func = models.TextField(null=True, blank=True)
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010049 ip_filter = models.BooleanField(default=True)
50 uuid_filter = models.BooleanField(default=True)
Anna Arhipova53461592024-01-10 11:18:05 +010051 filter_last_traceback = models.BooleanField(default=True)
52 created_before = models.DateField(default=now)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +010053 created_after = models.DateField(default=default_created_after)
Pavel Glazov12492922024-06-17 03:32:48 -070054 created_at = models.DateTimeField(auto_now_add=True)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030055
Anna Arhipovae9258f32023-11-04 12:31:19 +010056 @property
57 def text_filters(self):
58 return {
59 "filter_last_traceback": self.filter_last_traceback,
60 "uuid_filter": self.uuid_filter,
61 "ip_filter": self.ip_filter,
62 "filter_func": self.filter_func,
63 }
64
65 @property
66 def testrail_filters(self):
67 return {
68 "created_by_id": self.created_by_id,
Anna Arhipova62760612023-11-28 23:20:38 +010069 "created_after": self.created_after,
70 "created_before": self.created_before,
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010071 "testrun_pattern": self.testrun_pattern,
Anna Arhipovae9258f32023-11-04 12:31:19 +010072 "plan_name": self.plan_name,
Anna Arhipovae9258f32023-11-04 12:31:19 +010073 }
74
Anna Arhipova614e5fc2024-02-27 18:17:15 +010075 class Meta:
76 ordering = ["-run_id"]
77
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030078
79fs = FileSystemStorage()
80
81
Oleksii Petrenko68268172020-09-28 16:58:13 +030082class TestRailReport(models.Model):
Oleksii Petrenko1de4bab2020-07-21 15:49:04 +030083 path = models.FileField(storage=fs, null=True, blank=True, max_length=500)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030084 report_name = models.CharField(max_length=300)
Anna Arhipovaa843b462024-07-06 17:37:00 +020085 test_results = IntegerListField(default=list())
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030086 finished = models.BooleanField(default=False)
Oleksii Petrenko7118f8c2020-07-17 12:45:09 +030087 created_at = models.DateTimeField(auto_now_add=True)
Oleksii Petrenko68268172020-09-28 16:58:13 +030088
89
Anna Arhipovaa843b462024-07-06 17:37:00 +020090class TestResult(models.Model):
91 result_id = models.CharField(max_length=50)
92 text = models.CharField(max_length=10000, default="")
93 action_needed = models.BooleanField(default=True)
94 updated_at = models.DateTimeField(auto_now=True)
95
96
Oleksii Petrenko68268172020-09-28 16:58:13 +030097class ActionLog(models.Model):
98 name = models.CharField(max_length=500)
99 date = models.DateTimeField(null=True)
Anna Arhipova7cdcc852023-11-15 18:20:45 +0100100
101
102class SuitePassRate(models.Model):
103 SUITE_CHOICES = [
stavrovska28772bc2024-05-22 09:33:50 +0200104 (
105 "Tempest",
106 (
107 ("10650", "[MCP2.0_QUEENS]Tempest"),
108 ("10651", "[MCP2.0_ROCKY]Tempest"),
109 ("10635", "[MCP2.0_STEIN]Tempest"),
110 ("10653", "[MCP2.0_TRAIN]Tempest"),
111 ("10710", "[MCP2.0_USSURI]Tempest"),
112 ("10888", "[MCP2.0_VICTORIA]Tempest"),
113 ("11167", "[MCP2.0_WALLABY]Tempest"),
114 ("11188", "[MCP2.0_XENA]Tempest"),
115 ("11170", "[MCP2.0_YOGA]Tempest"),
116 ("11192", "[MCP2.0_ANTELOPE]Tempest"),
117 ("11195", "[MCP2.0_CARACAL]Tempest"),
118 ),
119 ),
120 (
121 "Stepler",
122 (
123 ("10886", "[MCP2.0_USSURI]Stepler"),
124 ("10887", "[MCP2.0_VICTORIA]Stepler"),
125 ("11171", "[MCP2.0_YOGA]Stepler"),
126 ("11193", "[MCP2.0_ANTELOPE]Stepler"),
127 ("11196", "[MCP2.0_CARACAL]Stepler"),
128 ),
129 ),
Anna Arhipova7cdcc852023-11-15 18:20:45 +0100130 ]
131 suite_id = models.CharField(max_length=20, choices=SUITE_CHOICES)
132 suite_name = models.CharField(max_length=100, blank=True)
133 passrate_by_tests = models.JSONField(default="{}", blank=True)
134 status = models.TextField(max_length=300, blank=True)
135 finished = models.BooleanField(default=False, blank=True)
136
137
138class DiffOfSuitesPassRates(models.Model):
139 limit = models.IntegerField(default=10, blank=True)
140 test_keyword = models.CharField(default="", max_length=300, blank=True)
stavrovska28772bc2024-05-22 09:33:50 +0200141 report1 = models.ForeignKey(
142 to=SuitePassRate,
143 related_name="report1",
144 on_delete=models.CASCADE,
145 blank=True,
146 )
147 report2 = models.ForeignKey(
148 to=SuitePassRate,
149 related_name="report2",
150 on_delete=models.CASCADE,
151 blank=True,
152 )
153 started_at = models.DateTimeField(auto_created=True, auto_now=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100154
155
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100156TASKS = [
stavrovska28772bc2024-05-22 09:33:50 +0200157 (
158 "control.celery_tasks.tasks.check_today_testplan",
159 "Check today testplan",
160 [],
161 ),
162 (
163 "control.celery_tasks.tasks.check_specific_testplan",
164 "Check specific testplan",
165 ["testplan_id_arg"],
166 ),
Pavel Glazov12492922024-06-17 03:32:48 -0700167 (
168 "control.celery_tasks.tasks.delete_old_2m_testruns",
169 "Delete previous 2-month TestRuns(for bot view)",
170 [],
171 ),
172 (
173 "control.celery_tasks.tasks.delete_old_2m_reports",
174 "Delete previous 2-month Reports(for bot view)",
175 [],
176 ),
Pavel Glazove9b471d2024-07-02 12:20:42 -0700177 (
178 "control.celery_tasks.tasks.analize_testrail_reports",
179 "Summary report on one day",
180 ["plan_name"],
181 ),
stavrovska28772bc2024-05-22 09:33:50 +0200182]
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100183
stavrovska28772bc2024-05-22 09:33:50 +0200184TASK_CHOICES = list(map(lambda x: x[:-1], TASKS))
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100185
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100186
187class CronPeriodicTask(PeriodicTask):
stavrovska28772bc2024-05-22 09:33:50 +0200188 cron = models.CharField(default="", max_length=300, blank=False)
189 task_name = models.CharField(
190 max_length=300, choices=TASK_CHOICES, default=TASK_CHOICES[0][0]
191 )
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100192 testplan_id_arg = models.CharField(max_length=30, blank=True, null=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100193
194 class Meta:
195 ordering = ["id"]