blob: b438dec56552a4c9899fc7aaca334942ecd6c84f [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)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030054
Anna Arhipovae9258f32023-11-04 12:31:19 +010055 @property
56 def text_filters(self):
57 return {
58 "filter_last_traceback": self.filter_last_traceback,
59 "uuid_filter": self.uuid_filter,
60 "ip_filter": self.ip_filter,
61 "filter_func": self.filter_func,
62 }
63
64 @property
65 def testrail_filters(self):
66 return {
67 "created_by_id": self.created_by_id,
Anna Arhipova62760612023-11-28 23:20:38 +010068 "created_after": self.created_after,
69 "created_before": self.created_before,
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010070 "testrun_pattern": self.testrun_pattern,
Anna Arhipovae9258f32023-11-04 12:31:19 +010071 "plan_name": self.plan_name,
Anna Arhipovae9258f32023-11-04 12:31:19 +010072 }
73
Anna Arhipova614e5fc2024-02-27 18:17:15 +010074 class Meta:
75 ordering = ["-run_id"]
76
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030077
78fs = FileSystemStorage()
79
80
Oleksii Petrenko68268172020-09-28 16:58:13 +030081class TestRailReport(models.Model):
Oleksii Petrenko1de4bab2020-07-21 15:49:04 +030082 path = models.FileField(storage=fs, null=True, blank=True, max_length=500)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030083 report_name = models.CharField(max_length=300)
84 finished = models.BooleanField(default=False)
Oleksii Petrenko7118f8c2020-07-17 12:45:09 +030085 created_at = models.DateTimeField(auto_now_add=True)
Oleksii Petrenko68268172020-09-28 16:58:13 +030086
87
88class ActionLog(models.Model):
89 name = models.CharField(max_length=500)
90 date = models.DateTimeField(null=True)
Anna Arhipova7cdcc852023-11-15 18:20:45 +010091
92
93class SuitePassRate(models.Model):
94 SUITE_CHOICES = [
stavrovska28772bc2024-05-22 09:33:50 +020095 (
96 "Tempest",
97 (
98 ("10650", "[MCP2.0_QUEENS]Tempest"),
99 ("10651", "[MCP2.0_ROCKY]Tempest"),
100 ("10635", "[MCP2.0_STEIN]Tempest"),
101 ("10653", "[MCP2.0_TRAIN]Tempest"),
102 ("10710", "[MCP2.0_USSURI]Tempest"),
103 ("10888", "[MCP2.0_VICTORIA]Tempest"),
104 ("11167", "[MCP2.0_WALLABY]Tempest"),
105 ("11188", "[MCP2.0_XENA]Tempest"),
106 ("11170", "[MCP2.0_YOGA]Tempest"),
107 ("11192", "[MCP2.0_ANTELOPE]Tempest"),
108 ("11195", "[MCP2.0_CARACAL]Tempest"),
109 ),
110 ),
111 (
112 "Stepler",
113 (
114 ("10886", "[MCP2.0_USSURI]Stepler"),
115 ("10887", "[MCP2.0_VICTORIA]Stepler"),
116 ("11171", "[MCP2.0_YOGA]Stepler"),
117 ("11193", "[MCP2.0_ANTELOPE]Stepler"),
118 ("11196", "[MCP2.0_CARACAL]Stepler"),
119 ),
120 ),
Anna Arhipova7cdcc852023-11-15 18:20:45 +0100121 ]
122 suite_id = models.CharField(max_length=20, choices=SUITE_CHOICES)
123 suite_name = models.CharField(max_length=100, blank=True)
124 passrate_by_tests = models.JSONField(default="{}", blank=True)
125 status = models.TextField(max_length=300, blank=True)
126 finished = models.BooleanField(default=False, blank=True)
127
128
129class DiffOfSuitesPassRates(models.Model):
130 limit = models.IntegerField(default=10, blank=True)
131 test_keyword = models.CharField(default="", max_length=300, blank=True)
stavrovska28772bc2024-05-22 09:33:50 +0200132 report1 = models.ForeignKey(
133 to=SuitePassRate,
134 related_name="report1",
135 on_delete=models.CASCADE,
136 blank=True,
137 )
138 report2 = models.ForeignKey(
139 to=SuitePassRate,
140 related_name="report2",
141 on_delete=models.CASCADE,
142 blank=True,
143 )
144 started_at = models.DateTimeField(auto_created=True, auto_now=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100145
146
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100147TASKS = [
stavrovska28772bc2024-05-22 09:33:50 +0200148 (
149 "control.celery_tasks.tasks.check_today_testplan",
150 "Check today testplan",
151 [],
152 ),
153 (
154 "control.celery_tasks.tasks.check_specific_testplan",
155 "Check specific testplan",
156 ["testplan_id_arg"],
157 ),
158]
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100159
stavrovska28772bc2024-05-22 09:33:50 +0200160TASK_CHOICES = list(map(lambda x: x[:-1], TASKS))
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100161
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100162
163class CronPeriodicTask(PeriodicTask):
stavrovska28772bc2024-05-22 09:33:50 +0200164 cron = models.CharField(default="", max_length=300, blank=False)
165 task_name = models.CharField(
166 max_length=300, choices=TASK_CHOICES, default=TASK_CHOICES[0][0]
167 )
Anna Arhipovad2d4d9b2024-03-18 20:57:44 +0100168 testplan_id_arg = models.CharField(max_length=30, blank=True, null=True)
Anna Arhipova22ea6bf2024-02-20 15:25:30 +0100169
170 class Meta:
171 ordering = ["id"]