This page describes the directory sub-module in src/cluster_erp/modules/intranet/directory/. The directory is a live view over the employees of the owned_organisations module and the parties of the parties module. It stores no person row of its own; opening a colleague opens the real party card (src/cluster_erp/modules/intranet/directory/services.py:1-8).
Scope and source¶
- Defined in:
directory/services.py(DirectoryService),directory/routes.py,directory/schemas.py, anddirectory/metadata.py. - Count: no table, 4 routes in
directory/routes.py, noActionMeta. - The metadata entity
intranet_employee_projectioncarries an identity redirect to the party entity of thepartiesmodule (src/cluster_erp/modules/intranet/directory/metadata.py:1-4,src/cluster_erp/modules/intranet/directory/metadata.py:30). See party unification.
How a person row is built¶
_live_people builds each row from three batched EventBus calls (src/cluster_erp/modules/intranet/directory/services.py:57-144):
| Step | Contract | Purpose | Source |
|---|---|---|---|
| 1 | ListDirectoryEmployees |
the employees, with department, organisation, title, manager, and active flag | src/cluster_erp/modules/intranet/directory/services.py:60-63 |
| 2 | SearchParties |
the party names, in one call with a limit of 10000 | src/cluster_erp/modules/intranet/directory/services.py:74-80 |
| 3 | ResolveEntityEmails |
the primary e-mail addresses | src/cluster_erp/modules/intranet/directory/services.py:91-95 |
A failure of the name or e-mail lookup is logged and the directory continues (src/cluster_erp/modules/intranet/directory/services.py:85-86, src/cluster_erp/modules/intranet/directory/services.py:105).
Operations¶
| Method | Purpose | Source |
|---|---|---|
list |
Search and filter the live people | src/cluster_erp/modules/intranet/directory/services.py:146-168 |
get |
One person by party id | src/cluster_erp/modules/intranet/directory/services.py:170-178 |
reports |
The people whose manager_party_id is the given party |
src/cluster_erp/modules/intranet/directory/services.py:180-187 |
org_chart |
All live people; the chart is derived from manager links | src/cluster_erp/modules/intranet/directory/services.py:189-190 |
active_party_ids |
Every active employee's party id, used as the audience "everyone" and as the source of segment membership | src/cluster_erp/modules/intranet/directory/services.py:192-199 |
Routes¶
| Method and path | Purpose | Permission | Source |
|---|---|---|---|
GET /directory/ |
List | intranet_employee_projection.read |
src/cluster_erp/modules/intranet/directory/routes.py:22-45 |
GET /directory/org-chart |
Org chart | intranet_employee_projection.read |
src/cluster_erp/modules/intranet/directory/routes.py:48-57 |
GET /directory/{party_id} |
One person | intranet_employee_projection.read |
src/cluster_erp/modules/intranet/directory/routes.py:60-69 |
GET /directory/{party_id}/reports |
Direct reports | intranet_employee_projection.read |
src/cluster_erp/modules/intranet/directory/routes.py:72-82 |
Constraints and validation¶
- The directory has no write route (
src/cluster_erp/modules/intranet/directory/routes.py:22-82). - The model docstring states that there is no stored person projection and no stored org closure, so nothing goes stale (
src/cluster_erp/modules/intranet/models.py:23-28).
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| live directory | DirectoryService |
The employee directory read on demand from employees and parties, without a stored copy. | Canlı rehber | src/cluster_erp/modules/intranet/directory/services.py:1-8 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.