def clone()

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