From bda5e841cb2e7cbc19c70c9201600a43efdad89d Mon Sep 17 00:00:00 2001 From: lizerk Date: Wed, 18 Mar 2026 17:47:58 +0300 Subject: [PATCH] =?UTF-8?q?refactor(departments):=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D1=82=D1=8C=20BFF=20=D0=B0=D0=B3=D1=80=D0=B5=D0=B3?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=20ui=5Fcontext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удален метод ui_context (42 строки) - Все его данные доступны через отдельные endpoints: - dept → GET /departments/{id}/ - roles → можно добавить /departments/{id}/roles/ - links → GET /departments/{id}/members/ - user_perms → GET /departments/{id}/user-perms/ - choices → UI логика (фронтенд) Преимущества: - Кешируемые отдельные endpoints - Фронт запрашивает только нужное - Проще тестировать - Более RESTful -42 строки (480 → 438) --- backend/api/v1/employees/views/departments.py | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/backend/api/v1/employees/views/departments.py b/backend/api/v1/employees/views/departments.py index ed4a2a26..2e5f078b 100644 --- a/backend/api/v1/employees/views/departments.py +++ b/backend/api/v1/employees/views/departments.py @@ -80,7 +80,6 @@ class DepartmentViewSet(viewsets.ModelViewSet): if self.action in { "members", "user_perms", - "ui_context", "list", "retrieve", "my_departments", @@ -359,47 +358,6 @@ class DepartmentViewSet(viewsets.ModelViewSet): } return Response(data, status=200) - @action(detail=True, methods=["get"], url_path="ui-context") - def ui_context(self, request, pk=None): - """GET /api/v1/departments/{id}/ui-context/ — BFF-агрегатор для страницы отдела.""" - dept = self.get_object() - dept_data = self.get_serializer(dept).data - - roles_qs = ( - DepartmentRole.objects.filter(department_id=dept.id) - .prefetch_related("scoped_permissions") - .order_by("name", "id") - ) - roles_data = DepartmentRoleSerializer(roles_qs, many=True).data - - links = _build_links_for_dept(dept, EmployeeBriefSerializer) - perm_choices = _perm_choices_synced() - head_choices = _head_choices_for_dept(dept, EmployeeBriefSerializer) - user_perms = { - "is_head": ( - request.user.id == dept.head_id - if getattr(request.user, "id", None) - else False - ), - "can_manage": has_dept_perm(request.user, dept.id, DeptPerm.MANAGE), - "can_change_head": has_dept_perm( - request.user, dept.id, DeptPerm.CHANGE_HEAD - ), - "can_assign_roles": has_dept_perm( - request.user, dept.id, DeptPerm.ASSIGN_ROLE - ), - } - - payload = { - "dept": dept_data, - "roles": roles_data, - "links": links, - "head_choices": head_choices, - "dept_perm_choices": perm_choices, - "user_perms": user_perms, - } - return Response(payload, status=200) - @action(detail=True, methods=["post"], url_path="add_member") def add_member(self, request, pk: int | None = None): """Добавляет сотрудника в отдел."""