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) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 54 | |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 55 | @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 Arhipova | 6276061 | 2023-11-28 23:20:38 +0100 | [diff] [blame] | 68 | "created_after": self.created_after, |
| 69 | "created_before": self.created_before, |
Anna Arhipova | f1ea3ee | 2024-01-24 13:29:09 +0100 | [diff] [blame] | 70 | "testrun_pattern": self.testrun_pattern, |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 71 | "plan_name": self.plan_name, |
Anna Arhipova | e9258f3 | 2023-11-04 12:31:19 +0100 | [diff] [blame] | 72 | } |
| 73 | |
Anna Arhipova | 614e5fc | 2024-02-27 18:17:15 +0100 | [diff] [blame] | 74 | class Meta: |
| 75 | ordering = ["-run_id"] |
| 76 | |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 77 | |
| 78 | fs = FileSystemStorage() |
| 79 | |
| 80 | |
Oleksii Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 81 | class TestRailReport(models.Model): |
Oleksii Petrenko | 1de4bab | 2020-07-21 15:49:04 +0300 | [diff] [blame] | 82 | path = models.FileField(storage=fs, null=True, blank=True, max_length=500) |
Oleksii Petrenko | 24f1f8f | 2020-06-26 18:09:43 +0300 | [diff] [blame] | 83 | report_name = models.CharField(max_length=300) |
| 84 | finished = models.BooleanField(default=False) |
Oleksii Petrenko | 7118f8c | 2020-07-17 12:45:09 +0300 | [diff] [blame] | 85 | created_at = models.DateTimeField(auto_now_add=True) |
Oleksii Petrenko | 6826817 | 2020-09-28 16:58:13 +0300 | [diff] [blame] | 86 | |
| 87 | |
| 88 | class ActionLog(models.Model): |
| 89 | name = models.CharField(max_length=500) |
| 90 | date = models.DateTimeField(null=True) |
Anna Arhipova | 7cdcc85 | 2023-11-15 18:20:45 +0100 | [diff] [blame] | 91 | |
| 92 | |
| 93 | class SuitePassRate(models.Model): |
| 94 | SUITE_CHOICES = [ |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame^] | 95 | ( |
| 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 Arhipova | 7cdcc85 | 2023-11-15 18:20:45 +0100 | [diff] [blame] | 121 | ] |
| 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 | |
| 129 | class DiffOfSuitesPassRates(models.Model): |
| 130 | limit = models.IntegerField(default=10, blank=True) |
| 131 | test_keyword = models.CharField(default="", max_length=300, blank=True) |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame^] | 132 | 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 Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 145 | |
| 146 | |
Anna Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 147 | TASKS = [ |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame^] | 148 | ( |
| 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 Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 159 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame^] | 160 | TASK_CHOICES = list(map(lambda x: x[:-1], TASKS)) |
Anna Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 161 | |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 162 | |
| 163 | class CronPeriodicTask(PeriodicTask): |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame^] | 164 | 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 Arhipova | d2d4d9b | 2024-03-18 20:57:44 +0100 | [diff] [blame] | 168 | testplan_id_arg = models.CharField(max_length=30, blank=True, null=True) |
Anna Arhipova | 22ea6bf | 2024-02-20 15:25:30 +0100 | [diff] [blame] | 169 | |
| 170 | class Meta: |
| 171 | ordering = ["id"] |