1
0
forked from erp-dev/erp

feat: added frontend_pages models(basic_info) and api(v2), support employees query pages that they can visit by themself token

This commit is contained in:
2026-01-07 14:28:17 +08:00
parent 941f797e35
commit 4566c2a2c8
14 changed files with 1079 additions and 61 deletions

View File

@@ -1386,3 +1386,133 @@ class PlateOrderBatchUpdateV2APITest(TestCase):
self.assertEqual(resp2.status_code, 200)
self.po1.refresh_from_db()
self.assertTrue(self.po1.is_invalid)
class MyVisiblePagesAPITest(TestCase):
"""测试获取当前用户可见页面 API"""
def setUp(self):
self.client = APIClient()
self.merchant = basic_models.Merchant.objects.create(
name='测试商户',
type=basic_models.MerchantTypeEnum.FACTORY,
)
self.user = get_user_model().objects.create_user(username='testuser', password='pass12345')
# 创建前端页面
self.main_menu = basic_models.FrontendPage.objects.create(
key='production',
label='生产管理',
page_type=basic_models.FrontendPageTypeEnum.MAIN,
sort_order=100
)
self.sub_menu1 = basic_models.FrontendPage.objects.create(
key='production-kanban',
label='生产看板',
page_type=basic_models.FrontendPageTypeEnum.SUB,
parent=self.main_menu,
sort_order=101
)
self.sub_menu2 = basic_models.FrontendPage.objects.create(
key='printing-order-list',
label='生产订单',
page_type=basic_models.FrontendPageTypeEnum.SUB,
parent=self.main_menu,
sort_order=102
)
self.other_menu = basic_models.FrontendPage.objects.create(
key='inventory',
label='库存管理',
page_type=basic_models.FrontendPageTypeEnum.MAIN,
sort_order=200
)
# 创建岗位并分配页面
self.emp_type = basic_models.EmployeeType.objects.create(
merchant=self.merchant,
title='生产主管'
)
self.emp_type.visible_pages.add(self.main_menu)
# 创建员工并关联用户
self.employee = basic_models.Employee.objects.create(
merchant=self.merchant,
name='张三',
position=self.emp_type,
sys_user=self.user # 关联到用户
)
self.client.force_authenticate(user=self.user)
def test_get_visible_pages_success(self):
"""测试成功获取当前用户可见页面"""
response = self.client.get('/api/v2/me/visible-pages/')
self.assertEqual(response.status_code, 200)
data = response.data
self.assertEqual(data['employee_id'], self.employee.id)
self.assertEqual(data['employee_name'], '张三')
self.assertEqual(data['position_id'], self.emp_type.id)
self.assertEqual(data['position_title'], '生产主管')
# 验证可见页面(主菜单 + 子菜单)
visible_keys = data['visible_keys']
self.assertIn('production', visible_keys)
self.assertIn('production-kanban', visible_keys)
self.assertIn('printing-order-list', visible_keys)
self.assertNotIn('inventory', visible_keys)
# 验证页面详情
self.assertEqual(len(data['visible_pages']), 3)
def test_get_visible_pages_with_sub_menu_only(self):
"""测试仅授予子菜单时只返回该子菜单"""
# 重新配置岗位:只授予子菜单
self.emp_type.visible_pages.clear()
self.emp_type.visible_pages.add(self.sub_menu1)
response = self.client.get('/api/v2/me/visible-pages/')
self.assertEqual(response.status_code, 200)
visible_keys = response.data['visible_keys']
self.assertIn('production-kanban', visible_keys)
self.assertNotIn('production', visible_keys)
self.assertNotIn('printing-order-list', visible_keys)
self.assertEqual(len(visible_keys), 1)
def test_get_visible_pages_employee_no_position(self):
"""测试没有岗位的员工返回空列表"""
# 移除员工岗位
self.employee.position = None
self.employee.save()
response = self.client.get('/api/v2/me/visible-pages/')
self.assertEqual(response.status_code, 200)
data = response.data
self.assertEqual(data['employee_id'], self.employee.id)
self.assertEqual(data['position_id'], None)
self.assertEqual(data['visible_pages'], [])
self.assertEqual(data['visible_keys'], [])
def test_get_visible_pages_user_no_employee(self):
"""测试用户未关联员工时返回空列表"""
# 创建一个没有关联员工的用户
user_no_employee = get_user_model().objects.create_user(username='noemployee', password='pass12345')
self.client.force_authenticate(user=user_no_employee)
response = self.client.get('/api/v2/me/visible-pages/')
self.assertEqual(response.status_code, 200)
data = response.data
self.assertEqual(data['employee_id'], None)
self.assertEqual(data['employee_name'], None)
self.assertEqual(data['position_id'], None)
self.assertEqual(data['visible_pages'], [])
self.assertEqual(data['visible_keys'], [])
def test_get_visible_pages_unauthenticated(self):
"""测试未登录时返回 401"""
self.client.logout()
response = self.client.get('/api/v2/me/visible-pages/')
self.assertEqual(response.status_code, 401)