from rest_framework import serializers from django.contrib.auth import get_user_model from .models import DailyReport, ReportComment User = get_user_model() class UserSimpleSerializer(serializers.ModelSerializer): """用户简单信息序列化器""" full_name = serializers.SerializerMethodField() class Meta: model = User fields = ('id', 'username', 'full_name', 'department', 'position') def get_full_name(self, obj): return f'{obj.first_name} {obj.last_name}'.strip() or obj.username class ReportCommentSerializer(serializers.ModelSerializer): """日报评论序列化器""" user = UserSimpleSerializer(read_only=True) class Meta: model = ReportComment fields = ('id', 'user', 'content', 'created_at', 'updated_at') read_only_fields = ('id', 'created_at', 'updated_at') def create(self, validated_data): validated_data['user'] = self.context['request'].user return super().create(validated_data) class DailyReportListSerializer(serializers.ModelSerializer): """日报列表序列化器""" user = UserSimpleSerializer(read_only=True) work_summary_preview = serializers.ReadOnlyField() next_day_plan_preview = serializers.ReadOnlyField() comments_count = serializers.SerializerMethodField() class Meta: model = DailyReport fields = ( 'id', 'user', 'work_summary_preview', 'next_day_plan_preview', 'report_date', 'created_at', 'updated_at', 'is_draft', 'comments_count' ) def get_comments_count(self, obj): return obj.comments.count() class DailyReportDetailSerializer(serializers.ModelSerializer): """日报详情序列化器""" user = UserSimpleSerializer(read_only=True) comments = ReportCommentSerializer(many=True, read_only=True) can_edit = serializers.SerializerMethodField() can_delete = serializers.SerializerMethodField() class Meta: model = DailyReport fields = ( 'id', 'user', 'work_summary', 'next_day_plan', 'difficulties', 'suggestions', 'report_date', 'created_at', 'updated_at', 'is_draft', 'comments', 'can_edit', 'can_delete' ) def get_can_edit(self, obj): request = self.context.get('request') if not request or not request.user: return False return obj.user == request.user or request.user.is_staff def get_can_delete(self, obj): request = self.context.get('request') if not request or not request.user: return False return obj.user == request.user or request.user.is_staff class DailyReportCreateUpdateSerializer(serializers.ModelSerializer): """日报创建和更新序列化器""" class Meta: model = DailyReport fields = ( 'work_summary', 'next_day_plan', 'difficulties', 'suggestions', 'report_date', 'is_draft' ) def validate_report_date(self, value): """验证日报日期""" request = self.context.get('request') if not request: return value # 检查是否已存在该日期的日报(更新时排除当前记录) queryset = DailyReport.objects.filter( user=request.user, report_date=value ) # 如果是更新操作,排除当前记录 if self.instance: queryset = queryset.exclude(id=self.instance.id) if queryset.exists(): raise serializers.ValidationError(f'您已在 {value} 提交过日报,每天只能提交一份日报。') return value def create(self, validated_data): validated_data['user'] = self.context['request'].user return super().create(validated_data) class DailyReportStatsSerializer(serializers.Serializer): """日报统计序列化器""" total_reports = serializers.IntegerField() this_month_reports = serializers.IntegerField() this_week_reports = serializers.IntegerField() draft_reports = serializers.IntegerField() completion_rate = serializers.FloatField() class UserReportStatsSerializer(serializers.Serializer): """用户日报统计序列化器""" user = UserSimpleSerializer() total_reports = serializers.IntegerField() this_month_reports = serializers.IntegerField() last_report_date = serializers.DateField() completion_rate = serializers.FloatField()