This page lists the fields, routes, and rules of the person_languages sub-module in src/cluster_erp/modules/parties/person_languages/. A row records one language a party speaks and how well; a person can have several rows. On the party card the rows appear in the Spoken Languages tab (src/cluster_erp/modules/parties/parties/metadata.py:529-534).
Scope and source¶
- Defined in:
src/cluster_erp/modules/parties/person_languages/models.py(PersonLanguage),schemas.py,services.py(PersonLanguageService),routes.py,metadata.py(PERSON_LANGUAGE_META). - Count: 1 table; 6 routes (
@router.decorators inroutes.py); 25 language choices and 5 proficiency choices (ChoiceMeta(entries inmetadata.py, 30 in total).
Fields¶
| Name | Type | Meaning | Source |
|---|---|---|---|
party_id |
FK to parties_parties.id |
The party | src/cluster_erp/modules/parties/person_languages/models.py:20-22 |
language |
String(10) |
ISO 639-1 code, for example tr or en |
src/cluster_erp/modules/parties/person_languages/models.py:23-25 |
proficiency_level |
String(20) |
native, fluent, advanced, intermediate, or beginner |
src/cluster_erp/modules/parties/person_languages/models.py:26-27 |
The table has no code column; the service does not draw a business key (src/cluster_erp/modules/parties/person_languages/services.py:35-41).
Routes¶
All paths are under /api/v1/parties.
| Method and path | Purpose | Permission | Source |
|---|---|---|---|
GET /{party_id}/languages |
Languages of one party, oldest first | person_language.read |
src/cluster_erp/modules/parties/person_languages/routes.py:22-30, src/cluster_erp/modules/parties/person_languages/services.py:19-26 |
POST /{party_id}/languages |
Add a language | person_language.create |
src/cluster_erp/modules/parties/person_languages/routes.py:33-42 |
GET /languages/{language_id} |
One row | person_language.read |
src/cluster_erp/modules/parties/person_languages/routes.py:45-55 |
PUT /languages/{language_id} |
Update | person_language.update |
src/cluster_erp/modules/parties/person_languages/routes.py:58-69 |
POST /languages/bulk-delete |
Soft-delete several | person_language.bulk_delete |
src/cluster_erp/modules/parties/person_languages/routes.py:72-80 |
DELETE /languages/{language_id} |
Soft-delete one | person_language.delete |
src/cluster_erp/modules/parties/person_languages/routes.py:83-91 |
Constraints and validation¶
- The schemas limit
languageto 10 characters andproficiency_levelto 20 (src/cluster_erp/modules/parties/person_languages/schemas.py:10-16). The allowed values are declared as metadata choices for the form (src/cluster_erp/modules/parties/person_languages/metadata.py:18-52); the schemas do not restrict the values to those choices. - The form marks both fields as required and shows them as enum pickers (
src/cluster_erp/modules/parties/person_languages/metadata.py:109-116). - The rows are part of the party's data-subject copy and are anonymised with the party (
src/cluster_erp/modules/parties/privacy_handlers.py:77,src/cluster_erp/modules/parties/privacy_handlers.py:242).
Discrepancies¶
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| spoken language | PersonLanguage |
A language a party speaks, with a proficiency level. | Konuştuğu dil | src/cluster_erp/modules/parties/person_languages/models.py:15 |
| proficiency level | proficiency_level |
How well the party speaks the language. | Seviye | src/cluster_erp/modules/parties/person_languages/models.py:27 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.