| 180 | |
| 181 | |
| 182 | def _bulk_retrieve_snapshot_values( |
| 183 | group_values_list: Iterable[Group | GroupValues], group_deleted: bool = False |
| 184 | ) -> list[GroupAttributesSnapshot]: |
| 185 | group_assignee_map = { |
| 186 | ga["group_id"]: ga |
| 187 | for ga in GroupAssignee.objects.filter( |
| 188 | group_id__in=[gv.id for gv in group_values_list] |
| 189 | ).values("group_id", "user_id", "team_id") |
| 190 | } |
| 191 | |
| 192 | group_owner_map = {} |
| 193 | |
| 194 | for group_owner in ( |
| 195 | GroupOwner.objects.annotate( |
| 196 | position=Window(Rank(), partition_by=[F("group_id"), F("type")], order_by="-date_added") |
| 197 | ) |
| 198 | .filter(position=1, group_id__in=[g.id for g in group_values_list]) |
| 199 | .values("group_id", "user_id", "team_id", "type") |
| 200 | ): |
| 201 | group_owner_map[(group_owner["group_id"], group_owner["type"])] = group_owner |
| 202 | |
| 203 | snapshots = [] |
| 204 | for group_value in group_values_list: |
| 205 | assignee = group_assignee_map.get(group_value.id) |
| 206 | suspect_owner = group_owner_map.get((group_value.id, GroupOwnerType.SUSPECT_COMMIT.value)) |
| 207 | ownership_owner = group_owner_map.get((group_value.id, GroupOwnerType.OWNERSHIP_RULE.value)) |
| 208 | codeowners_owner = group_owner_map.get((group_value.id, GroupOwnerType.CODEOWNERS.value)) |
| 209 | snapshot: GroupAttributesSnapshot = { |
| 210 | "group_deleted": group_deleted, |
| 211 | "project_id": group_value.project_id, |
| 212 | "group_id": group_value.id, |
| 213 | "status": group_value.status, |
| 214 | "substatus": group_value.substatus, |
| 215 | "priority": group_value.priority, |
| 216 | "first_release": group_value.first_release_id, |
| 217 | "first_seen": group_value.first_seen.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), |
| 218 | "num_comments": group_value.num_comments, |
| 219 | "timestamp": datetime.now().isoformat(), |
| 220 | "assignee_user_id": assignee["user_id"] if assignee else None, |
| 221 | "assignee_team_id": assignee["team_id"] if assignee else None, |
| 222 | "owner_suspect_commit_user_id": suspect_owner["user_id"] if suspect_owner else None, |
| 223 | "owner_ownership_rule_user_id": ownership_owner["user_id"] if ownership_owner else None, |
| 224 | "owner_ownership_rule_team_id": ownership_owner["team_id"] if ownership_owner else None, |
| 225 | "owner_codeowners_user_id": codeowners_owner["user_id"] if codeowners_owner else None, |
| 226 | "owner_codeowners_team_id": codeowners_owner["team_id"] if codeowners_owner else None, |
| 227 | } |
| 228 | snapshots.append(snapshot) |
| 229 | |
| 230 | return snapshots |
| 231 | |
| 232 | |
| 233 | @receiver( |