From 715b5ed4eb4eff18af7cd209983490573b82aedb Mon Sep 17 00:00:00 2001 From: colaftc Date: Mon, 5 Jan 2026 19:56:35 +0800 Subject: [PATCH] feat: added product image to printing jobs api --- api_v1/views/printing/serializers.py | 8 ++++ .../views/printing/test_printing_job_api.py | 47 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/api_v1/views/printing/serializers.py b/api_v1/views/printing/serializers.py index cd98bcf..e22ca2e 100644 --- a/api_v1/views/printing/serializers.py +++ b/api_v1/views/printing/serializers.py @@ -256,6 +256,7 @@ class PrintingJobListSerializer(serializers.ModelSerializer): """印染款式明细列表序列化器""" printing_order_id = serializers.CharField(source='printing_order.human_id', read_only=True) product_name = serializers.CharField(source='product.name', read_only=True) + product_image_url = serializers.SerializerMethodField() status = serializers.CharField(read_only=True) work_state_display = serializers.SerializerMethodField() is_completed = serializers.BooleanField(read_only=True) @@ -266,6 +267,7 @@ class PrintingJobListSerializer(serializers.ModelSerializer): model = models.PrintingJob fields = [ 'id', 'original_id', 'printing_order', 'printing_order_id', 'product', 'product_name', + 'product_image_url', 'quantity', 'unit', 'size', 'pieces', 'description', 'work_state', 'work_state_display', 'status', 'is_completed', 'business_object_id', @@ -278,6 +280,12 @@ class PrintingJobListSerializer(serializers.ModelSerializer): """安全地获取 business_object_id""" return obj.business_object.id if obj.business_object else None + def get_product_image_url(self, obj): + """获取产品图片 URL(优先 mdy_image_url,其次从 description 提取)""" + if obj.product: + return obj.product.get_primary_image_url() + return None + def get_work_state_display(self, obj): return obj.get_work_state_display() diff --git a/api_v1/views/printing/test_printing_job_api.py b/api_v1/views/printing/test_printing_job_api.py index 4614995..9c2c24e 100644 --- a/api_v1/views/printing/test_printing_job_api.py +++ b/api_v1/views/printing/test_printing_job_api.py @@ -1151,3 +1151,50 @@ class PrintingJobAPITestCase(TestCase): self.assertEqual(len(completed_states), 1) self.assertEqual(completed_states[0]['state_name'], self.state1.name) + def test_list_printing_jobs_with_product_image_url(self): + """测试列表接口返回产品图片 URL(mdy_image_url 优先)""" + # 设置产品的 mdy_image_url + self.product.mdy_image_url = 'https://example.com/product.jpg' + self.product.save() + + job = printing_models.PrintingJob.objects.create( + printing_order=self.printing_order, + product=self.product, + quantity=100, + unit='米', + size='50*60', + pieces=10 + ) + + response = self.client.get('/api/v1/printing-jobs/') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # 验证 product_image_url 字段存在且返回正确的 URL + result = response.data['results'][0] + self.assertIn('product_image_url', result) + self.assertEqual(result['product_image_url'], 'https://example.com/product.jpg') + + def test_list_printing_jobs_product_image_url_none(self): + """测试产品无图片时 product_image_url 返回 None""" + # 确保产品没有图片 + self.product.mdy_image_url = None + self.product.image = None + self.product.description = None + self.product.save() + + job = printing_models.PrintingJob.objects.create( + printing_order=self.printing_order, + product=self.product, + quantity=100, + unit='米', + size='50*60', + pieces=10 + ) + + response = self.client.get('/api/v1/printing-jobs/') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # 验证 product_image_url 字段存在且为 None + result = response.data['results'][0] + self.assertIn('product_image_url', result) + self.assertIsNone(result['product_image_url'])