Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 1 | from django.core.files.storage import FileSystemStorage |
| 2 | from django.db import models |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 3 | from django.utils.timezone import now, timedelta |
| 4 | from django_celery_beat.models import PeriodicTask |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 5 | |
| 6 | |
| 7 | class IntegerListField(models.Field): |
| 8 | def __init__(self, *args, **kwargs): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 9 | kwargs["editable"] = False |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 10 | super(IntegerListField, self).__init__(*args, **kwargs) |
| 11 | |
| 12 | def db_type(self, connection): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 13 | return "text" |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 14 | |
| 15 | def from_db_value(self, value, expression, connection): |
| 16 | if not value: |
| 17 | return [] |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 18 | return [int(x) for x in value.split(",")] |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 19 | |
| 20 | def to_python(self, value): |
| 21 | if isinstance(value, list): |
| 22 | return value |
| 23 | if not value: |
| 24 | return [] |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 25 | return [int(x) for x in value.split(",")] |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 26 | |
| 27 | def get_prep_value(self, value): |
| 28 | if not value: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 29 | return "" |
| 30 | return ",".join(str(int(x)) for x in value) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 31 | |
| 32 | |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 33 | def default_created_after(): |
| 34 | return now() + timedelta(days=-3 * 30) |
| 35 | |
| 36 | |
Oleksii Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 37 | class TestRailTestRun(models.Model): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 38 | project_name = models.CharField( |
| 39 | max_length=300, default="Mirantis Cloud Platform" |
| 40 | ) |
Sofiia Andriichenko | 4b440da | 2023-02-10 12:29:46 +0100 | [diff] [blame] | 41 | plan_name = models.CharField(max_length=300, default="[MCP2.0]OSCORE") |
| 42 | run_name = models.CharField(max_length=300, blank=True) |
Anna Arhipova | f1ea3ee | 2024-01-24 13:29:09 +0100 | [diff] [blame] | 43 | testrun_pattern = models.CharField(max_length=300, blank=True) |
Sofiia Andriichenko | 4b440da | 2023-02-10 12:29:46 +0100 | [diff] [blame] | 44 | run_id = models.CharField(max_length=300) |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 45 | checked_tests = IntegerListField(default=list()) |
Anna Arhipova | ec72522 | 2024-01-21 00:10:37 +0100 | [diff] [blame] | 46 | caching_tests_enabled = models.BooleanField(default=False) |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 47 | created_by_id = models.IntegerField(default="109") |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 48 | filter_func = models.TextField(null=True, blank=True) |
Sofiia Andriichenko | 4b440da | 2023-02-10 12:29:46 +0100 | [diff] [blame] | 49 | ip_filter = models.BooleanField(default=True) |
| 50 | uuid_filter = models.BooleanField(default=True) |
Anna Arhipova | 5346159 | 2024-01-10 11:18:05 +0100 | [diff] [blame] | 51 | filter_last_traceback = models.BooleanField(default=True) |
| 52 | created_before = models.DateField(default=now) |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 53 | created_after = models.DateField(default=default_created_after) |
Pavel Glazov | 1249292 | 2024-06-17 03:32:48 -0700 | [diff] [blame] | 54 | created_at = models.DateTimeField(auto_now_add=True) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 55 | |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 56 | @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 Arhipova | 6276061 | 2023-11-28 23:20:38 +0100 | [diff] [blame] | 69 | "created_after": self.created_after, |
| 70 | "created_before": self.created_before, |
Anna Arhipova | f1ea3ee | 2024-01-24 13:29:09 +0100 | [diff] [blame] | 71 | "testrun_pattern": self.testrun_pattern, |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 72 | "plan_name": self.plan_name, |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 73 | } |
| 74 | |
Anna Arhipova | 614e5fc | 2024-02-27 18:17:15 +0100 | [diff] [blame] | 75 | class Meta: |
| 76 | ordering = ["-run_id"] |
| 77 | |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 78 | |
| 79 | fs = FileSystemStorage() |
| 80 | |
| 81 | |
Oleksii Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 82 | class TestRailReport(models.Model): |
Oleksii Petrenko | 1de4bab | 2020-07-21 15:49:04 +0300 | [diff] [blame] | 83 | path = models.FileField(storage=fs, null=True, blank=True, max_length=500) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 84 | report_name = models.CharField(max_length=300) |
Anna Arhipova | a843b46 | 2024-07-06 17:37:00 +0200 | [diff] [blame^] | 85 | test_results = IntegerListField(default=list()) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 86 | finished = models.BooleanField(default=False) |
Oleksii Petrenko | 7118f8c | 2020-07-17 12:45:09 +0300 | [diff] [blame] | 87 | created_at = models.DateTimeField(auto_now_add=True) |
Oleksii Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 88 | |
| 89 | |
Anna Arhipova | a843b46 | 2024-07-06 17:37:00 +0200 | [diff] [blame^] | 90 | class 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 Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 97 | class ActionLog(models.Model): |
| 98 | name = models.CharField(max_length=500) |
| 99 | date = models.DateTimeField(null=True) |
Anna Arhipova | 7cdcc85 | 2023-11-15 18:20:45 +0100 | [diff] [blame] | 100 | |
| 101 | |
| 102 | class SuitePassRate(models.Model): |
| 103 | SUITE_CHOICES = [ |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 104 | ( |
| 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 Arhipova | 7cdcc85 | 2023-11-15 18:20:45 +0100 | [diff] [blame] | 130 | ] |
| 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 | |
| 138 | class DiffOfSuitesPassRates(models.Model): |
| 139 | limit = models.IntegerField(default=10, blank=True) |
| 140 | test_keyword = models.CharField(default="", max_length=300, blank=True) |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 141 | 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 Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 154 | |
| 155 | |
Anna Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 156 | TASKS = [ |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 157 | ( |
| 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 Glazov | 1249292 | 2024-06-17 03:32:48 -0700 | [diff] [blame] | 167 | ( |
| 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 | ), |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 177 | ] |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 178 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 179 | TASK_CHOICES = list(map(lambda x: x[:-1], TASKS)) |
Anna Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 180 | |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 181 | |
| 182 | class CronPeriodicTask(PeriodicTask): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 183 | cron = models.CharField(default="", max_length=300, blank=False) |
| 184 | task_name = models.CharField( |
| 185 | max_length=300, choices=TASK_CHOICES, default=TASK_CHOICES[0][0] |
| 186 | ) |
Anna Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 187 | testplan_id_arg = models.CharField(max_length=30, blank=True, null=True) |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 188 | |
| 189 | class Meta: |
| 190 | ordering = ["id"] |