from apps.utils.constants import EXCLUDE_FIELDS from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from rest_framework.exceptions import ValidationError from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog from apps.system.models import Dictionary from apps.pm.models import Mtask from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change from apps.mtm.serializers import MaterialSerializer class StLogSerializer(CustomModelSerializer): mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) class Meta: model = StLog fields = '__all__' class SfLogSerializer(CustomModelSerializer): mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) team_name = serializers.CharField(source='team.name', read_only=True) shift_name = serializers.CharField(source='shift.name', read_only=True) leader_name = serializers.CharField(source='leader.name', read_only=True) class Meta: model = SfLog fields = '__all__' read_only_fields = EXCLUDE_FIELDS + \ ['mgroup', 'start_time', 'end_time', 'belong_dept'] extra_kwargs = { 'team': {'required': True}, 'leader': {'required': True} } def update(self, instance, validated_data): old_pcoal_heat = instance.pcoal_heat old_team = instance.team instance = super().update(instance, validated_data) new_pcoal_heat = instance.pcoal_heat new_team = instance.team if new_pcoal_heat != old_pcoal_heat: cal_enstat_when_pcoal_heat_change.delay(instance.id) if new_team != old_team: cal_enstat_when_team_change.delay(instance.id) return instance # def to_internal_value(self, data): # if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']: # u_fields = self.Meta.update_fields # new_data = {key: data[key] for key in u_fields if key in data} # return super().to_internal_value(new_data) # return super().to_internal_value(data) class SflogExpSerializer(CustomModelSerializer): mgroup = serializers.CharField(source='sflog.mgroup.id', read_only=True) mgroup_name = serializers.CharField( source='sflog.mgroup.name', read_only=True) stlog_ = StLogSerializer(source='stlog', read_only=True) happen_time = serializers.DateTimeField(required=True, label='发生时间') cate = serializers.CharField(required=True, label='原因类别') class Meta: model = SfLogExp fields = '__all__' read_only_fields = EXCLUDE_FIELDS + ['stlog', 'is_current_down'] class WMaterialSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) class Meta: model = WMaterial fields = '__all__' class MlogSerializer(CustomModelSerializer): create_by_name = serializers.CharField( source='create_by.name', read_only=True) update_by_name = serializers.CharField( source='update_by.name', read_only=True) class Meta: model = Mlog fields = '__all__' read_only_fields = EXCLUDE_FIELDS def update(self, instance, validated_data): validated_data.pop('mtask', None) return super().update(instance, validated_data) def validate(self, attrs): mtask = attrs['mtask'] if mtask.state != Mtask.MTASK_ASSGINED: raise ValidationError('该任务状态不可提交日志!') return attrs