def clone()

in experimenter/experimenter/legacy/legacy_experiments/models.py [0:0]


    def clone(self, name, user):
        cloned = copy.copy(self)
        variants = ExperimentVariant.objects.filter(experiment=self)

        set_to_none_fields = [
            "addon_experiment_id",
            "addon_release_url",
            "recipe_slug",
            "normandy_id",
            "other_normandy_ids",
            "bugzilla_id",
            "review_science",
            "review_engineering",
            "review_qa_requested",
            "review_intent_to_ship",
            "review_bugzilla",
            "review_qa",
            "review_relman",
            "review_advisory",
            "review_legal",
            "review_ux",
            "review_security",
            "review_vp",
            "review_data_steward",
            "review_comms",
            "review_impacted_teams",
            "proposed_start_date",
            "results_url",
            "results_initial",
            "results_lessons_learned",
            "results_fail_to_launch",
            "results_recipe_errors",
            "results_restarts",
            "results_low_enrollment",
            "results_early_end",
            "results_no_usable_data",
            "results_failures_notes",
            "results_changes_to_firefox",
            "results_data_for_hypothesis",
            "results_confidence",
            "results_measure_impact",
            "results_impact_notes",
        ]

        cloned.id = None
        cloned.name = name
        cloned.slug = slugify(cloned.name)
        cloned.status = ExperimentConstants.STATUS_DRAFT
        cloned.owner = user
        cloned.parent = self
        cloned.archived = False
        cloned.is_paused = False
        cloned.is_high_population = False

        for field in set_to_none_fields:
            setattr(cloned, field, None)

        cloned.save()

        # for the variants on the old experiment, duplicate each
        # with id=none, set the experiment foreignkey to the new clone
        for variant in variants:
            variant.id = None
            variant.experiment = cloned
            variant.save()

            if self.is_multi_pref:
                original_variant = self.variants.get(slug=variant.slug)
                for preference in original_variant.preferences.all():
                    preference.variant = variant
                    preference.id = None
                    preference.save()

        cloned.projects.set(self.projects.all())

        cloned.related_to.add(self)

        cloned.countries.add(*self.countries.all())
        cloned.locales.add(*self.locales.all())

        ExperimentChangeLog.objects.create(
            experiment=cloned,
            changed_by=get_user_model().objects.get(id=user.id),
            old_status=None,
            new_status=ExperimentConstants.STATUS_DRAFT,
            message=ExperimentChangeLog.STATUS_CLONED,
        )

        return cloned