Skip to content

Commit

Permalink
Start adding the new achivs (#3735)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasdeluna authored Feb 12, 2025
1 parent e9e0f06 commit 33a7fe9
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 3 deletions.
3 changes: 2 additions & 1 deletion lego/api/v1.py
Original file line number Diff line number Diff line change
@@ -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 (
Expand Down Expand Up @@ -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"
)
Expand Down
21 changes: 20 additions & 1 deletion lego/apps/achievements/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
),
),
]
8 changes: 8 additions & 0 deletions lego/apps/achievements/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from rest_framework import serializers

from lego.apps.achievements.models import Achievement
from lego.utils.serializers import BasisModelSerializer

Expand All @@ -12,3 +14,9 @@ class Meta:
"identifier",
"level",
)


class KeypressOrderSerializer(serializers.Serializer):
code = serializers.ListField(
child=serializers.IntegerField(),
)
4 changes: 4 additions & 0 deletions lego/apps/achievements/utils/calculation_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
EVENT_IDENTIFIER,
EVENT_PRICE_IDENTIFIER,
EVENT_RANK_IDENTIFIER,
EVENT_RULES_IDENTIFIER,
KEYPRESS_ORDER_IDENTIFIER,
MEETING_IDENTIFIER,
PENALTY_IDENTIFIER,
POLL_IDENTIFIER,
Expand All @@ -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
Expand Down
44 changes: 43 additions & 1 deletion lego/apps/achievements/views.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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)

0 comments on commit 33a7fe9

Please sign in to comment.