in experimenter/experimenter/experiments/models.py [0:0]
def clone(self, name, user, rollout_branch_slug=None, changed_on=None):
# Inline import to prevent circular import
from experimenter.experiments.changelog_utils import generate_nimbus_changelog
cloned = copy.copy(self)
cloned.id = None
cloned.name = name
cloned.slug = slugify(cloned.name)
cloned.status = self.Status.DRAFT
cloned.status_next = None
cloned.publish_status = self.PublishStatus.IDLE
cloned.owner = user
cloned.parent = self
cloned.is_archived = False
cloned.is_paused = False
cloned.is_rollout_dirty = False
cloned.reference_branch = None
cloned.proposed_release_date = None
cloned.published_dto = None
cloned.published_date = None
cloned.results_data = None
cloned.takeaways_summary = None
cloned.conclusion_recommendations = []
cloned.takeaways_metric_gain = False
cloned.takeaways_gain_amount = None
cloned.takeaways_qbr_learning = False
cloned.use_group_id = True
cloned._start_date = None
cloned._end_date = None
cloned._enrollment_end_date = None
cloned.qa_status = NimbusExperiment.QAStatus.NOT_SET
cloned.qa_comment = None
cloned.save()
if rollout_branch_slug:
branch = self.branches.get(slug=rollout_branch_slug)
cloned.reference_branch = branch.clone(cloned)
cloned.is_rollout = True
cloned.proposed_duration = NimbusExperiment.DEFAULT_PROPOSED_DURATION
cloned.proposed_enrollment = NimbusExperiment.DEFAULT_PROPOSED_ENROLLMENT
cloned.population_percent = 0
cloned.total_enrolled_clients = 0
cloned.save()
else:
for branch in self.branches.all():
branch.clone(cloned)
if self.reference_branch:
cloned.reference_branch = cloned.branches.get(
slug=self.reference_branch.slug
)
cloned.save()
for link in self.documentation_links.all():
link.id = None
link.experiment = cloned
link.save()
for (
required_experiment_branch
) in NimbusExperimentBranchThroughRequired.objects.filter(parent_experiment=self):
NimbusExperimentBranchThroughRequired.objects.create(
parent_experiment=cloned,
child_experiment=required_experiment_branch.child_experiment,
branch_slug=required_experiment_branch.branch_slug,
)
for (
excluded_experiment_branch
) in NimbusExperimentBranchThroughExcluded.objects.filter(parent_experiment=self):
NimbusExperimentBranchThroughExcluded.objects.create(
parent_experiment=cloned,
child_experiment=excluded_experiment_branch.child_experiment,
branch_slug=excluded_experiment_branch.branch_slug,
)
cloned.feature_configs.add(*self.feature_configs.all())
cloned.countries.add(*self.countries.all())
if self.is_desktop:
cloned.locales.add(*self.locales.all())
cloned.languages.add(*self.languages.all())
cloned.projects.add(*self.projects.all())
cloned.subscribers.remove(*self.subscribers.all())
if rollout_branch_slug:
generate_nimbus_changelog(
cloned,
user,
f"Cloned from {self} with rollout branch {rollout_branch_slug}",
changed_on,
)
else:
generate_nimbus_changelog(cloned, user, f"Cloned from {self}", changed_on)
return cloned