def handleCreateInterface()

in api/models/badge.py [0:0]


    def handleCreateInterface(self, user, example):
        badge_names_to_add = []
        user.examples_submitted += 1
        streak_days_increased = False
        if example.model_wrong:
            self.incrementUserMetadataField(
                user,
                example.context.round.task.task_code
                + "_fooling_no_verified_incorrect_or_flagged",
            )
            user.streak_examples += 1
            now = datetime.datetime.now()
            if user.streak_days_last_model_wrong is None:
                user.streak_days_last_model_wrong = now
            else:
                one_day_passed = user.streak_days_last_model_wrong + datetime.timedelta(
                    days=1
                )
                two_days_passed = (
                    user.streak_days_last_model_wrong + datetime.timedelta(days=2)
                )
                if now > one_day_passed:
                    if now <= two_days_passed:
                        streak_days_increased = True
                        user.streak_days = user.streak_days + 1
                        user.streak_days_last_model_wrong = now
                    elif now > two_days_passed:
                        user.streak_days = 0
                        user.streak_days_last_model_wrong = None
        else:
            user.streak_examples = 0

        # beginner badges
        if user.examples_submitted == 1:
            badge_names_to_add.append("FIRST_CREATED")
        if user.examples_submitted == 10:
            badge_names_to_add.append("FIRST_TEN_CREATED")

        # Contributor badges
        existing_badges = self.getByUid(user.id)
        if user.metadata_json:
            metadata = util.json_decode(user.metadata_json)
            for task_name in self.task_code_to_badge_name:
                if task_name + "_fooling_no_verified_incorrect_or_flagged" in metadata:
                    for (
                        contributor_type,
                        num_required,
                    ) in self.task_contributor_type_and_num_required_creations:
                        if (
                            metadata[
                                task_name + "_fooling_no_verified_incorrect_or_flagged"
                            ]
                            == num_required
                            and self.lengthOfFilteredList(
                                lambda badge: badge.name
                                == "DYNABENCH_"
                                + self.task_code_to_badge_name[task_name]
                                + "_"
                                + contributor_type,
                                existing_badges,
                            )
                            == 0
                        ):
                            badge_names_to_add.append(
                                "DYNABENCH_"
                                + self.task_code_to_badge_name[task_name]
                                + "_"
                                + contributor_type
                            )

            num_created_by_task = self.getFieldsFromMetadata(
                metadata,
                0,
                [
                    task_name + "_fooling_no_verified_incorrect_or_flagged"
                    for task_name in self.task_code_to_badge_name
                ],
            )
            num_validated_by_task = self.getFieldsFromMetadata(
                metadata,
                0,
                [
                    task_name + "_validated"
                    for task_name in self.task_code_to_badge_name
                ],
            )

            for (
                contributor_type,
                num_creations_required,
                num_validations_required,
            ) in self.contributor_type_num_required_creations_and_validations:
                if (
                    sum(num_created_by_task) >= num_creations_required
                    and sum(num_validated_by_task) >= num_validations_required
                    and self.lengthOfFilteredList(
                        lambda badge: badge.name == "DYNABENCH_" + contributor_type,
                        existing_badges,
                    )
                    == 0
                ):
                    badge_names_to_add.append("DYNABENCH_" + contributor_type)

            if (
                0 not in num_created_by_task + num_validated_by_task
                and self.lengthOfFilteredList(
                    lambda badge: badge.name == "ALL_TASKS_COVERED", existing_badges
                )
                == 0
            ):
                badge_names_to_add.append("ALL_TASKS_COVERED")

        # Example streaks
        for num_required in self.example_streak_num_required:
            if user.streak_examples == num_required:
                badge_names_to_add.append("EXAMPLE_STREAK_" + str(num_required))

        # Day streaks
        if streak_days_increased:
            for streak_type, num_required in self.day_streak_type_and_num_required_days:
                if user.streak_days == num_required:
                    badge_names_to_add.append("DAY_STREAK_" + streak_type)

        badges_to_add = [self._badgeobj(user.id, name) for name in badge_names_to_add]
        self.createNotificationsAndAddBadges(badges_to_add)
        return badge_names_to_add