(self)
| 177 | }.get(self.action, ProjectFeatureSerializer) |
| 178 | |
| 179 | def get_queryset(self): # type: ignore[no-untyped-def] # noqa: C901 |
| 180 | if getattr(self, "swagger_fake_view", False): |
| 181 | return Feature.objects.none() |
| 182 | |
| 183 | accessible_projects = self.request.user.get_permitted_projects(VIEW_PROJECT) # type: ignore[union-attr] |
| 184 | |
| 185 | project = get_object_or_404(accessible_projects, pk=self.kwargs["project_pk"]) |
| 186 | |
| 187 | queryset = ( |
| 188 | project.features.all() |
| 189 | .annotate( |
| 190 | last_modified_in_any_environment=Max( |
| 191 | "feature_states__environment_feature_version__created_at", |
| 192 | filter=Q( |
| 193 | feature_states__environment_feature_version__published_at__isnull=False |
| 194 | ), |
| 195 | ), |
| 196 | ) |
| 197 | .prefetch_related( |
| 198 | "multivariate_options", "owners", "tags", "group_owners", "metadata" |
| 199 | ) |
| 200 | ) |
| 201 | |
| 202 | query_serializer = FeatureQuerySerializer( |
| 203 | data=self.request.query_params, |
| 204 | context={"project": project}, |
| 205 | ) |
| 206 | query_serializer.is_valid(raise_exception=True) |
| 207 | query_data = query_serializer.validated_data |
| 208 | |
| 209 | queryset = annotate_feature_queryset_with_code_references_summary(queryset) |
| 210 | |
| 211 | queryset = self._filter_queryset(queryset, query_serializer) |
| 212 | |
| 213 | if environment_id := query_data.get("environment"): |
| 214 | queryset = queryset.annotate( |
| 215 | last_modified_in_current_environment=Max( |
| 216 | "feature_states__environment_feature_version__created_at", |
| 217 | filter=Q( |
| 218 | feature_states__environment=environment_id, |
| 219 | feature_states__environment_feature_version__published_at__isnull=False, |
| 220 | ), |
| 221 | ) |
| 222 | ) |
| 223 | |
| 224 | if query_data["value_search"] or query_data["is_enabled"] is not None: |
| 225 | queryset = self.apply_state_to_queryset(query_data, queryset) |
| 226 | sort = "%s%s" % ( |
| 227 | "-" if query_data["sort_direction"] == "DESC" else "", |
| 228 | query_data["sort_field"], |
| 229 | ) |
| 230 | override_ordering: list[str] = [] |
| 231 | if environment_id and (segment_id := query_data.get("segment")): |
| 232 | queryset = queryset.annotate( |
| 233 | has_segment_override=Exists( |
| 234 | FeatureSegment.objects.filter( |
| 235 | feature=OuterRef("pk"), |
| 236 | segment_id=segment_id, |
no test coverage detected