63 lines
2.4 KiB
Python
Executable File
63 lines
2.4 KiB
Python
Executable File
from rest_framework import viewsets
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from django.utils import timezone
|
|
from .models import DiaryEntry, DailyProgress, Experience
|
|
from .serializers import DiaryEntrySerializer, DailyProgressSerializer, ExperienceSerializer
|
|
|
|
class DiaryEntryViewSet(viewsets.ModelViewSet):
|
|
queryset = DiaryEntry.objects.all()
|
|
serializer_class = DiaryEntrySerializer
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def today(self, request):
|
|
"""获取今天的日记"""
|
|
today = timezone.now().date()
|
|
entry, created = DiaryEntry.objects.get_or_create(date=today)
|
|
serializer = self.get_serializer(entry)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def recent(self, request):
|
|
"""获取最近 7 天的日记"""
|
|
entries = DiaryEntry.objects.order_by('-date')[:7]
|
|
serializer = self.get_serializer(entries, many=True)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def stats(self, request):
|
|
"""获取统计信息"""
|
|
total_entries = DiaryEntry.objects.count()
|
|
return Response({
|
|
'total_entries': total_entries,
|
|
'first_entry': DiaryEntry.objects.order_by('date').first().date if total_entries > 0 else None,
|
|
'latest_entry': DiaryEntry.objects.order_by('-date').first().date if total_entries > 0 else None,
|
|
})
|
|
|
|
class DailyProgressViewSet(viewsets.ModelViewSet):
|
|
queryset = DailyProgress.objects.all()
|
|
serializer_class = DailyProgressSerializer
|
|
|
|
|
|
class ExperienceViewSet(viewsets.ModelViewSet):
|
|
queryset = Experience.objects.all()
|
|
serializer_class = ExperienceSerializer
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def by_category(self, request):
|
|
"""按类别分组获取经验"""
|
|
categories = {}
|
|
for exp in Experience.objects.all():
|
|
cat = exp.get_category_display()
|
|
if cat not in categories:
|
|
categories[cat] = []
|
|
categories[cat].append(ExperienceSerializer(exp).data)
|
|
return Response(categories)
|
|
|
|
@action(detail=False, methods=['get'])
|
|
def recent(self, request):
|
|
"""获取最近 10 条经验"""
|
|
experiences = Experience.objects.order_by('-date', '-created_at')[:10]
|
|
serializer = self.get_serializer(experiences, many=True)
|
|
return Response(serializer.data)
|