From 33a7fe9b6e6d0947b9a21ffb28f895625fa8b7b4 Mon Sep 17 00:00:00 2001 From: Jonas de Luna Skulberg <113468143+jonasdeluna@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:46:12 +0100 Subject: [PATCH] Start adding the new achivs (#3735) --- lego/api/v1.py | 3 +- lego/apps/achievements/constants.py | 21 ++++++++- .../0004_alter_achievement_identifier.py | 31 +++++++++++++ lego/apps/achievements/serializers.py | 8 ++++ .../achievements/utils/calculation_utils.py | 4 ++ lego/apps/achievements/views.py | 44 ++++++++++++++++++- 6 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 lego/apps/achievements/migrations/0004_alter_achievement_identifier.py diff --git a/lego/api/v1.py b/lego/api/v1.py index e2ee1fad9..a61a071c2 100644 --- a/lego/api/v1.py +++ b/lego/api/v1.py @@ -1,7 +1,7 @@ from django.urls import include, path from rest_framework import routers -from lego.apps.achievements.views import LeaderBoardViewSet +from lego.apps.achievements.views import AchievementViewSet, LeaderBoardViewSet from lego.apps.articles.views import ArticlesViewSet from lego.apps.comments.views import CommentViewSet from lego.apps.companies.views import ( @@ -82,6 +82,7 @@ from lego.utils.views import SiteMetaViewSet router = routers.DefaultRouter() +router.register(r"achievements", AchievementViewSet, basename="achievement") router.register( r"achievements/leaderboard", LeaderBoardViewSet, basename="achievements" ) diff --git a/lego/apps/achievements/constants.py b/lego/apps/achievements/constants.py index e6010b390..6e10b88d7 100644 --- a/lego/apps/achievements/constants.py +++ b/lego/apps/achievements/constants.py @@ -24,6 +24,8 @@ class Achievement(TypedDict): EVENT_IDENTIFIER = "event_count" EVENT_RANK_IDENTIFIER = "event_rank" EVENT_PRICE_IDENTIFIER = "event_price" +EVENT_RULES_IDENTIFIER = "event_rules" +KEYPRESS_ORDER_IDENTIFIER = "keypress_order" QUOTE_IDENTIFIER = "quote_count" MEETING_IDENTIFIER = "meeting_hidden" POLL_IDENTIFIER = "poll_count" @@ -121,6 +123,14 @@ class Achievement(TypedDict): }, } +EVENT_RULES: AchievementCollection = { + "event_rules": { + "identifier": EVENT_RULES_IDENTIFIER, + "requirement_function": lambda user: False, + "level": 0, + }, +} + POLL_ACHIEVEMENTS: AchievementCollection = { "poll_5": { "identifier": POLL_IDENTIFIER, @@ -170,14 +180,23 @@ class Achievement(TypedDict): }, } +KEYPRESS_ORDER: AchievementCollection = { + "keypress_order": { + "identifier": KEYPRESS_ORDER_IDENTIFIER, + "requirement_function": lambda user: False, + "level": 0, + }, +} + -HIDDEN_ACHIEVEMENTS = {**QUOTE_ACHIEVEMENTS, **MEETING_ACHIEVEMENTS} +HIDDEN_ACHIEVEMENTS = {**QUOTE_ACHIEVEMENTS, **MEETING_ACHIEVEMENTS, **KEYPRESS_ORDER} ACHIEVEMENTS = { **EVENT_ACHIEVEMENTS, **EVENT_RANK_ACHIEVEMENTS, **EVENT_PRICE_ACHIEVEMENTS, + **EVENT_RULES, **POLL_ACHIEVEMENTS, **HIDDEN_ACHIEVEMENTS, **PENALTY_ACHIEVEMENTS, diff --git a/lego/apps/achievements/migrations/0004_alter_achievement_identifier.py b/lego/apps/achievements/migrations/0004_alter_achievement_identifier.py new file mode 100644 index 000000000..ee1e296ae --- /dev/null +++ b/lego/apps/achievements/migrations/0004_alter_achievement_identifier.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2.16 on 2025-02-12 20:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("achievements", "0003_alter_achievement_identifier"), + ] + + operations = [ + migrations.AlterField( + model_name="achievement", + name="identifier", + field=models.CharField( + choices=[ + ("event_count", "event_count"), + ("event_price", "event_price"), + ("event_rank", "event_rank"), + ("event_rules", "event_rules"), + ("keypress_order", "keypress_order"), + ("meeting_hidden", "meeting_hidden"), + ("penalty_period", "penalty_period"), + ("poll_count", "poll_count"), + ("quote_count", "quote_count"), + ], + max_length=128, + ), + ), + ] diff --git a/lego/apps/achievements/serializers.py b/lego/apps/achievements/serializers.py index 478b173ce..65cf00000 100644 --- a/lego/apps/achievements/serializers.py +++ b/lego/apps/achievements/serializers.py @@ -1,3 +1,5 @@ +from rest_framework import serializers + from lego.apps.achievements.models import Achievement from lego.utils.serializers import BasisModelSerializer @@ -12,3 +14,9 @@ class Meta: "identifier", "level", ) + + +class KeypressOrderSerializer(serializers.Serializer): + code = serializers.ListField( + child=serializers.IntegerField(), + ) diff --git a/lego/apps/achievements/utils/calculation_utils.py b/lego/apps/achievements/utils/calculation_utils.py index 22d12521f..13d3f0f33 100644 --- a/lego/apps/achievements/utils/calculation_utils.py +++ b/lego/apps/achievements/utils/calculation_utils.py @@ -2,6 +2,8 @@ EVENT_IDENTIFIER, EVENT_PRICE_IDENTIFIER, EVENT_RANK_IDENTIFIER, + EVENT_RULES_IDENTIFIER, + KEYPRESS_ORDER_IDENTIFIER, MEETING_IDENTIFIER, PENALTY_IDENTIFIER, POLL_IDENTIFIER, @@ -16,6 +18,8 @@ MEETING_IDENTIFIER: [1], POLL_IDENTIFIER: [0, 2, 4], PENALTY_IDENTIFIER: [0, 3, 5, 6], + EVENT_RULES_IDENTIFIER: [0], + KEYPRESS_ORDER_IDENTIFIER: [2], } delta = 0.1 diff --git a/lego/apps/achievements/views.py b/lego/apps/achievements/views.py index 1e6f04e46..f104b0810 100644 --- a/lego/apps/achievements/views.py +++ b/lego/apps/achievements/views.py @@ -1,7 +1,16 @@ -from rest_framework import mixins, permissions, viewsets +from rest_framework import mixins, permissions, status, viewsets +from rest_framework.decorators import action from rest_framework.response import Response +from lego.apps.achievements.constants import ( + EVENT_RULES, + EVENT_RULES_IDENTIFIER, + KEYPRESS_ORDER, + KEYPRESS_ORDER_IDENTIFIER, +) +from lego.apps.achievements.models import Achievement from lego.apps.achievements.pagination import AchievementLeaderboardPagination +from lego.apps.achievements.serializers import KeypressOrderSerializer from lego.apps.users.models import User from lego.apps.users.serializers.users import PublicUserWithGroupsSerializer @@ -26,3 +35,36 @@ def list(self, request, *args, **kwargs): return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + + +class AchievementViewSet(viewsets.GenericViewSet): + permission_classes = [permissions.IsAuthenticated] + + serializer_class = KeypressOrderSerializer + + @action(detail=False, methods=["POST"]) + def getting_wood(self, request, *args, **kwargs): + achievement, created = Achievement.objects.get_or_create( + identifier=EVENT_RULES[EVENT_RULES_IDENTIFIER]["identifier"], + user=request.user, + level=0, + ) + if created: + return Response(status=status.HTTP_201_CREATED) + else: + return Response(status=status.HTTP_204_NO_CONTENT) + + @action(detail=False, methods=["POST"]) + def keypress_order(self, request, *args, **kwargs): + code = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13] + if request.data.get("code", []) == code: + achievement, created = Achievement.objects.get_or_create( + identifier=KEYPRESS_ORDER[KEYPRESS_ORDER_IDENTIFIER]["identifier"], + user=request.user, + level=0, + ) + if created: + return Response(status=status.HTTP_201_CREATED) + else: + return Response(status=status.HTTP_204_NO_CONTENT) + return Response(status=status.HTTP_204_NO_CONTENT)