1
0
forked from erp-dev/erp

feat: mission replied calling task

This commit is contained in:
2026-04-17 23:26:33 +08:00
parent e109c00837
commit 8b1afc64c5
22 changed files with 1056 additions and 95 deletions

View File

@@ -36,6 +36,9 @@ class MissionWriteSerializer(serializers.Serializer):
category = serializers.IntegerField(required=False, min_value=1)
content_type = serializers.IntegerField(required=False, allow_null=True, min_value=1)
content_id = serializers.IntegerField(required=False, allow_null=True, min_value=1)
notify_if_unreplied = serializers.BooleanField(required=False)
unreplied_notify_interval_minutes = serializers.IntegerField(required=False, allow_null=True, min_value=1)
unreplied_notify_max_count = serializers.IntegerField(required=False, min_value=1)
participant_ids = serializers.ListField(
child=serializers.IntegerField(min_value=1),
required=False,
@@ -73,6 +76,20 @@ class MissionWriteSerializer(serializers.Serializer):
attrs["content_type"] = ContentType.objects.get(id=content_type_id)
except ContentType.DoesNotExist as exc:
raise serializers.ValidationError({"content_type": "ContentType 不存在"}) from exc
instance = self.context.get("instance")
final_notify_if_unreplied = attrs.get(
"notify_if_unreplied",
getattr(instance, "notify_if_unreplied", False),
)
final_interval = attrs.get(
"unreplied_notify_interval_minutes",
getattr(instance, "unreplied_notify_interval_minutes", None),
)
if final_notify_if_unreplied and final_interval is None:
raise serializers.ValidationError(
{"unreplied_notify_interval_minutes": "开启未回复提醒时必须设置提醒间隔"}
)
return attrs
@@ -126,6 +143,11 @@ class MissionSerializer(serializers.ModelSerializer):
"is_urgent",
"is_completed",
"is_cancelled",
"notify_if_unreplied",
"unreplied_notify_interval_minutes",
"unreplied_notify_max_count",
"unreplied_notify_sent_count",
"unreplied_last_notified_at",
"cancelled_at",
"creator",
"cancelled_by",
@@ -313,6 +335,9 @@ class MissionListCreateView(APIView):
content_type=data.get("content_type"),
content_id=data.get("content_id"),
participant_ids=data.get("participant_ids"),
notify_if_unreplied=data.get("notify_if_unreplied", False),
unreplied_notify_interval_minutes=data.get("unreplied_notify_interval_minutes"),
unreplied_notify_max_count=data.get("unreplied_notify_max_count", 5),
)
except ValueError as exc:
return Response({"detail": str(exc)}, status=status.HTTP_400_BAD_REQUEST)
@@ -333,7 +358,11 @@ class MissionDetailView(APIView):
def patch(self, request, mission_id):
employee = _get_employee(request)
mission = self.get_object(request, mission_id)
serializer = MissionWriteSerializer(data=request.data, partial=True, context={"employee": employee})
serializer = MissionWriteSerializer(
data=request.data,
partial=True,
context={"employee": employee, "instance": mission},
)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
try:
@@ -346,6 +375,21 @@ class MissionDetailView(APIView):
content_id=data.get("content_id"),
update_content_object=("content_type" in request.data or "content_id" in request.data),
participant_ids=data.get("participant_ids"),
notify_if_unreplied=(
data["notify_if_unreplied"]
if "notify_if_unreplied" in data
else mission_services.UNSET
),
unreplied_notify_interval_minutes=(
data["unreplied_notify_interval_minutes"]
if "unreplied_notify_interval_minutes" in data
else mission_services.UNSET
),
unreplied_notify_max_count=(
data["unreplied_notify_max_count"]
if "unreplied_notify_max_count" in data
else mission_services.UNSET
),
)
except ValueError as exc:
return Response({"detail": str(exc)}, status=status.HTTP_400_BAD_REQUEST)