1
0
forked from erp-dev/erp

feat: batch update for plate order

This commit is contained in:
2025-12-18 17:36:43 +08:00
parent 98d797221a
commit 1a6ce32441
33 changed files with 32087 additions and 8 deletions

View File

@@ -2,6 +2,7 @@ from decimal import Decimal
import datetime
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.test import TestCase
from django.utils import timezone
from rest_framework.test import APIClient, APIRequestFactory
@@ -957,3 +958,118 @@ class PlateOrderByProcessV2APITest(TestCase):
}
)
self.assertEqual(resp.status_code, 400)
class PlateOrderBatchUpdateV2APITest(TestCase):
def setUp(self):
self.client = APIClient()
# 工厂用户(满足 IsPrintingFactory
self.merchant = basic_models.Merchant.objects.create(
name='印染工厂',
type=basic_models.MerchantTypeEnum.FACTORY,
)
self.user = get_user_model().objects.create_user(username='factory_user2', password='pass12345')
basic_models.Employee.objects.create(
merchant=self.merchant,
sys_user=self.user,
name='工厂员工2',
)
self.client.force_authenticate(user=self.user)
# 赋予 change 权限(批量更新必需)
perm_change = Permission.objects.get(codename='change_plateorder')
self.user.user_permissions.add(perm_change)
self.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name='客户A',
created_by=None,
)
self.designer = basic_models.Employee.objects.create(
merchant=self.merchant,
name='设计师',
)
self.po1 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='D1',
urgency_level='正常',
style_name='S1',
)
self.po2 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='D2',
urgency_level='正常',
style_name='S2',
)
def test_batch_update_success(self):
resp = self.client.post(
'/api/v2/plate-orders/batch-update/',
{
'plate_order_ids': [self.po1.id, self.po2.id],
'data': {'urgency_level': '加急', 'designer': self.designer.id},
},
format='json',
)
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data['updated_count'], 2)
self.po1.refresh_from_db()
self.po2.refresh_from_db()
self.assertEqual(self.po1.urgency_level, '加急')
self.assertEqual(self.po2.urgency_level, '加急')
self.assertEqual(self.po1.designer_id, self.designer.id)
self.assertEqual(self.po2.designer_id, self.designer.id)
def test_batch_update_fails_when_missing_ids(self):
resp = self.client.post(
'/api/v2/plate-orders/batch-update/',
{
'plate_order_ids': [self.po1.id, 999999],
'data': {'urgency_level': '加急'},
},
format='json',
)
self.assertEqual(resp.status_code, 400)
self.assertIn('不存在', resp.data.get('detail', ''))
def test_batch_update_fails_when_unknown_field(self):
resp = self.client.post(
'/api/v2/plate-orders/batch-update/',
{
'plate_order_ids': [self.po1.id],
'data': {'process': 123},
},
format='json',
)
self.assertEqual(resp.status_code, 400)
self.assertIn('不支持批量更新字段', resp.data.get('detail', ''))
def test_batch_update_is_invalid_requires_permission(self):
# 未授予 can_invalidate_plateorder
resp = self.client.post(
'/api/v2/plate-orders/batch-update/',
{
'plate_order_ids': [self.po1.id],
'data': {'is_invalid': True},
},
format='json',
)
self.assertEqual(resp.status_code, 403)
perm_invalidate = Permission.objects.get(codename='can_invalidate_plateorder')
self.user.user_permissions.add(perm_invalidate)
resp2 = self.client.post(
'/api/v2/plate-orders/batch-update/',
{
'plate_order_ids': [self.po1.id],
'data': {'is_invalid': True},
},
format='json',
)
self.assertEqual(resp2.status_code, 200)
self.po1.refresh_from_db()
self.assertTrue(self.po1.is_invalid)