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)