(
self,
env: "Environment",
live_from: datetime.datetime = None, # type: ignore[assignment]
as_draft: bool = False,
version: int = None, # type: ignore[assignment]
environment_feature_version: "EnvironmentFeatureVersion" = None, # type: ignore[assignment]
)
| 656 | return bool(self.live_from and self.live_from > timezone.now()) |
| 657 | |
| 658 | def clone( |
| 659 | self, |
| 660 | env: "Environment", |
| 661 | live_from: datetime.datetime = None, # type: ignore[assignment] |
| 662 | as_draft: bool = False, |
| 663 | version: int = None, # type: ignore[assignment] |
| 664 | environment_feature_version: "EnvironmentFeatureVersion" = None, # type: ignore[assignment] |
| 665 | ) -> "FeatureState": |
| 666 | # Cloning the Identity is not allowed because they are closely tied |
| 667 | # to the environment |
| 668 | assert self.identity is None |
| 669 | clone = deepcopy(self) |
| 670 | clone.id = None |
| 671 | clone.uuid = uuid.uuid4() |
| 672 | |
| 673 | if self.feature_segment: |
| 674 | # We can only create a new feature segment if we are cloning to another environment, |
| 675 | # or we are creating the feature segment in a new version (versioning v2). This is |
| 676 | # due to the default unique constraint on the FeatureSegment model which means that |
| 677 | # the same feature, segment and environment combination cannot exist more than once. |
| 678 | clone.feature_segment = ( |
| 679 | self.feature_segment.clone( |
| 680 | environment=env, |
| 681 | environment_feature_version=environment_feature_version, |
| 682 | ) |
| 683 | if env != self.environment or environment_feature_version is not None |
| 684 | else self.feature_segment |
| 685 | ) |
| 686 | |
| 687 | clone.environment = env |
| 688 | clone.version = ( |
| 689 | None if as_draft or environment_feature_version else version or self.version |
| 690 | ) |
| 691 | clone.live_from = live_from |
| 692 | clone.environment_feature_version = environment_feature_version |
| 693 | clone.save() |
| 694 | # clone the related objects |
| 695 | self.feature_state_value.clone(clone) |
| 696 | |
| 697 | if self.feature.type == MULTIVARIATE: |
| 698 | mv_values = [ |
| 699 | mv_value.clone(feature_state=clone, persist=False) |
| 700 | for mv_value in self.multivariate_feature_state_values.all() |
| 701 | ] |
| 702 | MultivariateFeatureStateValue.objects.bulk_create(mv_values) |
| 703 | |
| 704 | return clone |
| 705 | |
| 706 | def generate_feature_state_value_data(self, value): # type: ignore[no-untyped-def] |
| 707 | """ |
no test coverage detected