Coverage for project/models/issue.py: 100.00%
64 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-06-06 22:17 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-06-06 22:17 +0000
1from django.db import models
3from core.models import core as core_models
4from . import issue_type as issue_type_models
5from . import priority as priority_models
6from . import status as status_models
7from . import component as component_models
8from . import version as version_models
9from . import severity as severity_models
12class IssueData(core_models.CoreModel):
14 # TODO: Make a create override function to validate the reporter and created_by are project members
16 summary = models.CharField(max_length=255)
17 description = models.TextField(blank=True, null=True, default="")
19 project = models.ForeignKey('project.Project', on_delete=models.CASCADE)
20 reporter = models.ForeignKey('core.CoreUser', on_delete=models.CASCADE, related_name='issuereporter_set')
21 assignee = models.ForeignKey('core.CoreUser', on_delete=models.CASCADE, related_name='issueassignee_set', blank=True, null=True)
22 watchers = models.ManyToManyField('core.CoreUser', related_name='issuewatcher_set')
24 built_in_type = models.ForeignKey(issue_type_models.BuiltInIssueType, on_delete=models.CASCADE, blank=True, null=True)
25 built_in_priority = models.ForeignKey(priority_models.BuiltInIssuePriority, on_delete=models.CASCADE, blank=True, null=True)
26 built_in_status = models.ForeignKey(status_models.BuiltInIssueStatus, on_delete=models.CASCADE, blank=True, null=True)
27 built_in_severity = models.ForeignKey(severity_models.BuiltInIssueSeverity, on_delete=models.CASCADE, blank=True, null=True)
28 custom_type = models.ForeignKey(issue_type_models.CustomIssueType, on_delete=models.CASCADE, blank=True, null=True)
29 custom_priority = models.ForeignKey(priority_models.CustomIssuePriority, on_delete=models.CASCADE, blank=True, null=True)
30 custom_severity = models.ForeignKey(severity_models.CustomIssueSeverity, on_delete=models.CASCADE, blank=True, null=True)
31 custom_status = models.ForeignKey(status_models.CustomIssueStatus, on_delete=models.CASCADE, blank=True, null=True)
32 # TODO: Should these be ManyToManyFields?
33 component = models.ForeignKey(component_models.Component, on_delete=models.CASCADE, blank=True, null=True)
34 version = models.ForeignKey(version_models.Version, on_delete=models.CASCADE, blank=True, null=True)
35 # TODO: attachments, other things a bug/story/epic/test needs
38class IssueObjectManager(models.Manager):
39 def get_next_sequence_number(self, project_id):
40 try:
41 return self.filter(current__project_id=project_id).latest('sequence').sequence + 1
42 except self.model.DoesNotExist:
43 return 1
45 def list_built_in_types(self):
46 """
47 A helper method to get all built-in issue types, useful in views.
49 Returns:
50 list: All built-in issue types.
51 """
53 return issue_type_models.BuiltInIssueType.objects.all()
55 def list_built_in_priorities(self):
56 """
57 A helper method to get all built-in issue priorities, useful in views.
59 Returns:
60 list: All built-in issue priorities.
61 """
63 return priority_models.BuiltInIssuePriority.objects.all()
65 def list_built_in_statuses(self):
66 """
67 A helper method to get all built-in issue statuses, useful in views.
69 Returns:
70 list: All built-in issue statuses.
71 """
73 return status_models.BuiltInIssueStatus.objects.all()
75 def list_built_in_severities(self):
76 """
77 A helper method to get all built-in issue severities, useful in views.
79 Returns:
80 list: All built-in issue severities.
81 """
83 return severity_models.BuiltInIssueSeverity.objects.all()
85 def list_versions(self, project_id):
86 """
87 A helper method to get all versions for a project, useful in views.
89 Args:
90 project_id (project.Project): A project object.
92 Returns:
93 list: All versions for a project.
94 """
96 return version_models.Version.objects.filter(project_id=project_id)
98 def list_components(self, project_id):
99 """
100 A helper method to get all components for a project, useful in views.
102 Args:
103 project_id (project.Project): A project object.
105 Returns:
106 list: All components for a project.
107 """
109 return component_models.Component.objects.filter(project_id=project_id)
112class IssueActiveManager(models.Manager):
113 def get_queryset(self):
114 return super().get_queryset().filter(deleted=None)
116 def list_built_in_types(self):
117 """
118 A helper method to get all built-in issue types, useful in views.
120 Returns:
121 list: All built-in issue types.
122 """
124 return issue_type_models.BuiltInIssueType.active_objects.all()
126 def list_built_in_priorities(self):
127 """
128 A helper method to get all built-in issue priorities, useful in views.
130 Returns:
131 list: All built-in issue priorities.
132 """
134 return priority_models.BuiltInIssuePriority.active_objects.all()
136 def list_built_in_statuses(self):
137 """
138 A helper method to get all built-in issue statuses, useful in views.
140 Returns:
141 list: All built-in issue statuses.
142 """
144 return status_models.BuiltInIssueStatus.active_objects.all()
146 def list_built_in_severities(self):
147 """
148 A helper method to get all built-in issue severities, useful in views.
150 Returns:
151 list: All built-in issue severities.
152 """
154 return severity_models.BuiltInIssueSeverity.active_objects.all()
156 def list_versions(self, project_id):
157 """
158 A helper method to get all versions for a project, useful in views.
160 Args:
161 project_id (project.Project): A project object.
163 Returns:
164 list: All versions for a project.
165 """
167 return version_models.Version.active_objects.filter(project_id=project_id)
169 def list_components(self, project_id):
170 """
171 A helper method to get all components for a project, useful in views.
173 Args:
174 project_id (project.Project): A project object.
176 Returns:
177 list: All components for a project.
178 """
180 return component_models.Component.active_objects.filter(project_id=project_id)
184class Issue(core_models.Sequenced):
185 class Meta:
186 ordering = ['-created_on']
188 active_objects = IssueActiveManager()
189 objects = IssueObjectManager()
191 current = models.ForeignKey(IssueData, on_delete=models.CASCADE)
193 # TODO: Make a create override function to validate the reporter and created_by are project members