mission today

This commit is contained in:
Irwan Cahyono 2025-10-16 17:23:21 +07:00
parent e99c109053
commit 5428cee51f
3 changed files with 67 additions and 1 deletions

View File

@ -134,3 +134,40 @@ class MissionLogDetailSerializer(serializers.ModelSerializer):
def get_status_display(self, obj): def get_status_display(self, obj):
return obj.get_status_display() return obj.get_status_display()
class MissionWithLogSerializer(serializers.ModelSerializer):
category_display = serializers.SerializerMethodField()
task_display = serializers.SerializerMethodField()
status_display = serializers.SerializerMethodField()
log_status = serializers.CharField(read_only=True)
log_completed_at = serializers.DateTimeField(read_only=True)
log_claimed_at = serializers.DateTimeField(read_only=True)
class Meta:
model = models.Mission
fields = [
'id',
'name',
'description',
'featured_image',
'coin',
'point',
'category',
'task',
'status',
'date_time_from_valid',
'date_time_to_valid',
'category_display',
'task_display',
'status_display',
'log_status', 'log_completed_at', 'log_claimed_at'
]
def get_category_display(self, obj):
return obj.get_category_display()
def get_task_display(self, obj):
return obj.get_task_display()
def get_status_display(self, obj):
return obj.get_status_display()

View File

@ -5,6 +5,8 @@ urlpatterns = [
path('missions/', views.MissionList.as_view()), path('missions/', views.MissionList.as_view()),
path('missions/<int:pk>/', views.MissionDetail.as_view()), path('missions/<int:pk>/', views.MissionDetail.as_view()),
path('missions/today/', views.TodayMissionListView.as_view()),
path('categories/', views.MissionCategoryChoices.as_view()), path('categories/', views.MissionCategoryChoices.as_view()),
path('tasks/', views.MissionTaskChoices.as_view()), path('tasks/', views.MissionTaskChoices.as_view()),
path('statuses/', views.MissionStatusChoices.as_view()), path('statuses/', views.MissionStatusChoices.as_view()),

View File

@ -1,6 +1,8 @@
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import generics, filters, views from rest_framework import generics, filters, views
from django_filters.rest_framework import DjangoFilterBackend, FilterSet, CharFilter, ChoiceFilter from django_filters.rest_framework import DjangoFilterBackend, FilterSet, CharFilter, ChoiceFilter
from django.db.models import OuterRef, Subquery
from django.utils import timezone
from mission import models, serializers from mission import models, serializers
@ -80,3 +82,28 @@ class MissionLogDetail(generics.RetrieveUpdateDestroyAPIView):
return serializers.MissionLogDetailSerializer return serializers.MissionLogDetailSerializer
return serializer_class return serializer_class
class TodayMissionListView(views.APIView):
def get(self, request):
user_id = request.user.id
now = timezone.now()
missions = models.Mission.objects.filter(
status='published',
date_time_from_valid__lte=now,
date_time_to_valid__gte=now
)
mission_log_subquery = models.MissionLog.objects.filter(
mission=OuterRef('pk'),
user_id=user_id
)
missions = missions.annotate(
log_status=Subquery(mission_log_subquery.values('status')[:1]),
log_completed_at=Subquery(mission_log_subquery.values('completed_at')[:1]),
log_claimed_at=Subquery(mission_log_subquery.values('claimed_at')[:1]),
)
serializer = serializers.MissionWithLogSerializer(missions, many=True)
return Response(serializer.data)