diff --git a/services/backend/apps/achievement/icons/start_competition.png b/services/backend/apps/achievement/icons/start_competition.png new file mode 100644 index 0000000..d8a3519 Binary files /dev/null and b/services/backend/apps/achievement/icons/start_competition.png differ diff --git a/services/backend/apps/achievement/management/commands/init_achievments.py b/services/backend/apps/achievement/management/commands/init_achievments.py index 9619b58..bb9f2fb 100644 --- a/services/backend/apps/achievement/management/commands/init_achievments.py +++ b/services/backend/apps/achievement/management/commands/init_achievments.py @@ -30,3 +30,13 @@ class Command(BaseCommand): slug="welcome", icon=welcome_icon, ) + + if not Achievement.objects.filter(slug="start_competition").exists(): + with open(f"{icons_dir}/start_competition.png", "rb") as f: + start_competition = File(f, name="start_competition.png") + Achievement.objects.get_or_create( + name="Да начнётся битва!", + description="Начните соревнование", + slug="start_competition", + icon=start_competition, + ) diff --git a/services/backend/apps/competition/apps.py b/services/backend/apps/competition/apps.py index d343cd0..f10ee38 100644 --- a/services/backend/apps/competition/apps.py +++ b/services/backend/apps/competition/apps.py @@ -5,3 +5,6 @@ class CompetitionsConfig(AppConfig): name = "apps.competition" label = "competition" verbose_name = "Соревнование" + + def ready(self): + import apps.competition.signals diff --git a/services/backend/apps/competition/signals.py b/services/backend/apps/competition/signals.py new file mode 100644 index 0000000..9a832bd --- /dev/null +++ b/services/backend/apps/competition/signals.py @@ -0,0 +1,17 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from apps.achievement.models import Achievement, UserAchievement +from apps.competition.models import State +from apps.user.models import User + + +@receiver(post_save, sender=State) +def assign_start_competition_achievement(sender, instance, created, **kwargs): + if created: + if State.objects.filter(user=instance.user, state=State.StateChoices.STARTED.value).count() == 1 \ + and not State.objects.filter(user=instance.user, state=State.StateChoices.FINISHED.value).exists(): + start_competition_achievement = Achievement.objects.get(slug="start_competition") + UserAchievement.objects.create( + user=instance.user, achievement=start_competition_achievement + )