forked from erp-dev/erp
feat: mission replied calling task
This commit is contained in:
@@ -69,10 +69,42 @@ class MissionV2APITest(TestCase):
|
||||
self.assertFalse(mission.is_urgent)
|
||||
self.assertFalse(mission.is_completed)
|
||||
self.assertFalse(mission.is_cancelled)
|
||||
self.assertFalse(mission.notify_if_unreplied)
|
||||
self.assertEqual(mission.unreplied_notify_max_count, 5)
|
||||
self.assertEqual(resp.data["category"], self.default_category.id)
|
||||
self.assertEqual(resp.data["category_name"], "通用")
|
||||
self.assertEqual(list(mission.participants.values_list("employee_id", flat=True)), [self.participant.id])
|
||||
|
||||
def test_create_mission_supports_unreplied_notification_fields(self):
|
||||
resp = self.client.post(
|
||||
"/api/v2/missions/",
|
||||
{
|
||||
"description": "需要未回复提醒",
|
||||
"notify_if_unreplied": True,
|
||||
"unreplied_notify_interval_minutes": 30,
|
||||
},
|
||||
format="json",
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 201)
|
||||
self.assertTrue(resp.data["notify_if_unreplied"])
|
||||
self.assertEqual(resp.data["unreplied_notify_interval_minutes"], 30)
|
||||
self.assertEqual(resp.data["unreplied_notify_max_count"], 5)
|
||||
self.assertEqual(resp.data["unreplied_notify_sent_count"], 0)
|
||||
|
||||
def test_create_mission_rejects_missing_interval_when_unreplied_notification_enabled(self):
|
||||
resp = self.client.post(
|
||||
"/api/v2/missions/",
|
||||
{
|
||||
"description": "缺少提醒间隔",
|
||||
"notify_if_unreplied": True,
|
||||
},
|
||||
format="json",
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 400)
|
||||
self.assertIn("unreplied_notify_interval_minutes", resp.data)
|
||||
|
||||
def test_create_mission_rejects_status_fields(self):
|
||||
resp = self.client.post(
|
||||
"/api/v2/missions/",
|
||||
@@ -146,6 +178,25 @@ class MissionV2APITest(TestCase):
|
||||
self.assertEqual(resp.data["category_name"], "跟进")
|
||||
self.assertEqual(list(mission.participants.values_list("employee_id", flat=True)), [self.participant.id])
|
||||
|
||||
def test_patch_mission_updates_unreplied_notification_fields(self):
|
||||
mission = self._create_mission()
|
||||
|
||||
resp = self.client.patch(
|
||||
f"/api/v2/missions/{mission.id}/",
|
||||
{
|
||||
"notify_if_unreplied": True,
|
||||
"unreplied_notify_interval_minutes": 12,
|
||||
"unreplied_notify_max_count": 7,
|
||||
},
|
||||
format="json",
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
mission.refresh_from_db()
|
||||
self.assertTrue(mission.notify_if_unreplied)
|
||||
self.assertEqual(mission.unreplied_notify_interval_minutes, 12)
|
||||
self.assertEqual(mission.unreplied_notify_max_count, 7)
|
||||
|
||||
def test_list_only_returns_current_merchant_missions(self):
|
||||
visible = self._create_mission(description="可见任务")
|
||||
mission_models.Mission.objects.create(
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user