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