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

1from django.db import models 

2 

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 

10 

11 

12class IssueData(core_models.CoreModel): 

13 

14 # TODO: Make a create override function to validate the reporter and created_by are project members 

15 

16 summary = models.CharField(max_length=255) 

17 description = models.TextField(blank=True, null=True, default="") 

18 

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') 

23 

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 

36 

37 

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 

44 

45 def list_built_in_types(self): 

46 """ 

47 A helper method to get all built-in issue types, useful in views. 

48 

49 Returns: 

50 list: All built-in issue types. 

51 """ 

52 

53 return issue_type_models.BuiltInIssueType.objects.all() 

54 

55 def list_built_in_priorities(self): 

56 """ 

57 A helper method to get all built-in issue priorities, useful in views. 

58 

59 Returns: 

60 list: All built-in issue priorities. 

61 """ 

62 

63 return priority_models.BuiltInIssuePriority.objects.all() 

64 

65 def list_built_in_statuses(self): 

66 """ 

67 A helper method to get all built-in issue statuses, useful in views. 

68 

69 Returns: 

70 list: All built-in issue statuses. 

71 """ 

72 

73 return status_models.BuiltInIssueStatus.objects.all() 

74 

75 def list_built_in_severities(self): 

76 """ 

77 A helper method to get all built-in issue severities, useful in views. 

78 

79 Returns: 

80 list: All built-in issue severities. 

81 """ 

82 

83 return severity_models.BuiltInIssueSeverity.objects.all() 

84 

85 def list_versions(self, project_id): 

86 """ 

87 A helper method to get all versions for a project, useful in views. 

88 

89 Args: 

90 project_id (project.Project): A project object. 

91 

92 Returns: 

93 list: All versions for a project. 

94 """ 

95 

96 return version_models.Version.objects.filter(project_id=project_id) 

97 

98 def list_components(self, project_id): 

99 """ 

100 A helper method to get all components for a project, useful in views. 

101 

102 Args: 

103 project_id (project.Project): A project object. 

104 

105 Returns: 

106 list: All components for a project. 

107 """ 

108 

109 return component_models.Component.objects.filter(project_id=project_id) 

110 

111 

112class IssueActiveManager(models.Manager): 

113 def get_queryset(self): 

114 return super().get_queryset().filter(deleted=None) 

115 

116 def list_built_in_types(self): 

117 """ 

118 A helper method to get all built-in issue types, useful in views. 

119 

120 Returns: 

121 list: All built-in issue types. 

122 """ 

123 

124 return issue_type_models.BuiltInIssueType.active_objects.all() 

125 

126 def list_built_in_priorities(self): 

127 """ 

128 A helper method to get all built-in issue priorities, useful in views. 

129 

130 Returns: 

131 list: All built-in issue priorities. 

132 """ 

133 

134 return priority_models.BuiltInIssuePriority.active_objects.all() 

135 

136 def list_built_in_statuses(self): 

137 """ 

138 A helper method to get all built-in issue statuses, useful in views. 

139 

140 Returns: 

141 list: All built-in issue statuses. 

142 """ 

143 

144 return status_models.BuiltInIssueStatus.active_objects.all() 

145 

146 def list_built_in_severities(self): 

147 """ 

148 A helper method to get all built-in issue severities, useful in views. 

149 

150 Returns: 

151 list: All built-in issue severities. 

152 """ 

153 

154 return severity_models.BuiltInIssueSeverity.active_objects.all() 

155 

156 def list_versions(self, project_id): 

157 """ 

158 A helper method to get all versions for a project, useful in views. 

159 

160 Args: 

161 project_id (project.Project): A project object. 

162 

163 Returns: 

164 list: All versions for a project. 

165 """ 

166 

167 return version_models.Version.active_objects.filter(project_id=project_id) 

168 

169 def list_components(self, project_id): 

170 """ 

171 A helper method to get all components for a project, useful in views. 

172 

173 Args: 

174 project_id (project.Project): A project object. 

175 

176 Returns: 

177 list: All components for a project. 

178 """ 

179 

180 return component_models.Component.active_objects.filter(project_id=project_id) 

181 

182 

183 

184class Issue(core_models.Sequenced): 

185 class Meta: 

186 ordering = ['-created_on'] 

187 

188 active_objects = IssueActiveManager() 

189 objects = IssueObjectManager() 

190 

191 current = models.ForeignKey(IssueData, on_delete=models.CASCADE) 

192 

193 # TODO: Make a create override function to validate the reporter and created_by are project members