diff --git a/freekake_api/mission/serializers.py b/freekake_api/mission/serializers.py index a38d189..48c5755 100644 --- a/freekake_api/mission/serializers.py +++ b/freekake_api/mission/serializers.py @@ -132,5 +132,42 @@ class MissionLogDetailSerializer(serializers.ModelSerializer): return data + def get_status_display(self, obj): + 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() \ No newline at end of file diff --git a/freekake_api/mission/urls.py b/freekake_api/mission/urls.py index c447140..16f8062 100644 --- a/freekake_api/mission/urls.py +++ b/freekake_api/mission/urls.py @@ -5,6 +5,8 @@ urlpatterns = [ path('missions/', views.MissionList.as_view()), path('missions//', views.MissionDetail.as_view()), + path('missions/today/', views.TodayMissionListView.as_view()), + path('categories/', views.MissionCategoryChoices.as_view()), path('tasks/', views.MissionTaskChoices.as_view()), path('statuses/', views.MissionStatusChoices.as_view()), diff --git a/freekake_api/mission/views.py b/freekake_api/mission/views.py index 21df91c..be04331 100644 --- a/freekake_api/mission/views.py +++ b/freekake_api/mission/views.py @@ -1,6 +1,8 @@ from rest_framework.response import Response from rest_framework import generics, filters, views 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 @@ -79,4 +81,29 @@ class MissionLogDetail(generics.RetrieveUpdateDestroyAPIView): if self.request.method in ['GET']: return serializers.MissionLogDetailSerializer - return serializer_class \ No newline at end of file + 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) \ No newline at end of file