| 164 | |
| 165 | |
| 166 | class UpdateFlagV2Serializer(BaseFeatureUpdateSerializer): |
| 167 | feature = FeatureIdentifierSerializer(required=True) |
| 168 | environment_default = EnvironmentDefaultSerializer(required=True) |
| 169 | segment_overrides = SegmentOverrideSerializer(many=True, required=False) |
| 170 | |
| 171 | def validate_segment_overrides( |
| 172 | self, |
| 173 | value: list[dict], # type: ignore[type-arg] |
| 174 | ) -> list[dict]: # type: ignore[type-arg] |
| 175 | if not value: |
| 176 | return value |
| 177 | |
| 178 | segment_ids = [override["segment_id"] for override in value] |
| 179 | if len(segment_ids) != len(set(segment_ids)): |
| 180 | raise serializers.ValidationError( |
| 181 | "Duplicate segment_id values are not allowed" |
| 182 | ) |
| 183 | |
| 184 | # TODO: optimise this once out of experimentation |
| 185 | for segment_id in segment_ids: |
| 186 | self.validate_segment_id(segment_id) |
| 187 | |
| 188 | return value |
| 189 | |
| 190 | def validate(self, data: dict) -> dict: # type: ignore[type-arg] |
| 191 | overrides = data.get("segment_overrides", []) |
| 192 | if any(o.get("multivariate_feature_state_values") for o in overrides): |
| 193 | feature = Feature.objects.filter( |
| 194 | project_id=self.environment.project_id, **data["feature"] |
| 195 | ).first() |
| 196 | if feature is not None: |
| 197 | for override in overrides: |
| 198 | validate_multivariate_state_values( |
| 199 | feature, |
| 200 | override.get("multivariate_feature_state_values", []), |
| 201 | ) |
| 202 | return data |
| 203 | |
| 204 | @property |
| 205 | def change_set_v2(self) -> FlagChangeSetV2: |
| 206 | validated_data = self.validated_data |
| 207 | |
| 208 | env_default = validated_data["environment_default"] |
| 209 | env_value_data = env_default["value"] |
| 210 | |
| 211 | segment_overrides_data = validated_data.get("segment_overrides", []) |
| 212 | segment_overrides = [] |
| 213 | |
| 214 | for override_data in segment_overrides_data: |
| 215 | value_data = override_data["value"] |
| 216 | |
| 217 | multivariate_data = override_data.get("multivariate_feature_state_values") |
| 218 | segment_override = SegmentOverrideChangeSet( |
| 219 | segment_id=override_data["segment_id"], |
| 220 | enabled=override_data["enabled"], |
| 221 | feature_state_value=value_data["value"], |
| 222 | type_=value_data["type"], |
| 223 | priority=override_data.get("priority"), |
searching dependent graphs…