# interlegis/sapl architecture

> Architecture diagram of the GitHub repository interlegis/sapl, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/interlegis/sapl
- Repository: https://github.com/interlegis/sapl

## Overview

SAPL is a web system supporting legislative-process work for legislative houses. A visible user workflow is browsing parliamentarians: the frontend loads legislative terms, requests parliamentarian records from the API, then filters and displays the results. The broader product is split into legislative, administrative, session, and public-facing modules; the README also documents password recovery and matter/document tracking, which depend on reCAPTCHA. Several backend modules are unsampled, so their capabilities are represented by their exact directories, while edges are limited to relationships visible in the excerpts or README.

Main entry points: [`sapl/base/views.py`](https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/views.py) (Public pages), [`sapl/base/models.py`](https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/models.py) (Shared records), [`frontend/src/__apps/parlamentar/main.js`](https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__apps/parlamentar/main.js) (Parliamentarian browser), [`sapl/parlamentares/models.py`](https://github.com/interlegis/sapl/blob/3.1.x/sapl/parlamentares/models.py) (Parliamentarians)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_legislative["Legislative records"]
  node_materials[("Legislative matters<br/>[models.py]")]
  node_laws[("Legal norms<br/>[models.py]")]
  node_consolidation[("Consolidated texts<br/>[models.py]")]
  node_legislators[("Parliamentarians<br/>[models.py]")]
end

subgraph group_operations["House operations"]
  node_protocols[("Administrative documents<br/>[models.py]")]
  node_sessions[("Plenary sessions<br/>[models.py]")]
  node_committees[("Committees<br/>[models.py]")]
  node_hearings[("Public hearings<br/>[models.py]")]
  node_panel["Session panel<br/>[views.py]"]
  node_reports["PDF reports<br/>[views.py]"]
end

subgraph group_public["Public services"]
  node_lexml["LexML services<br/>[views.py]"]
  node_public_pages["Public pages<br/>[views.py]"]
end

subgraph group_platform["Application platform"]
  node_web["SAPL web app<br/>[urls.py]"]
  node_common[("Shared records<br/>[models.py]")]
  node_crud["CRUD framework<br/>[base.py]"]
  node_permissions["Access rules<br/>[apps.py]"]
  node_api["REST API<br/>[views.py]"]
end

subgraph group_frontend["User interface"]
  node_parliamentarian_ui["Parliamentarian browser<br/>[main.js]"]
  node_compilation_ui["Text editor UI<br/>[main.js]"]
  node_global_ui["Shared UI tools<br/>[main.js]"]
end

node_user(("House user"))
node_recaptcha["Google reCAPTCHA"]

node_user -.->|"uses"| node_web
node_web -.->|"routes requests"| node_public_pages
node_public_pages -->|"reads settings"| node_common
node_public_pages -->|"uses matter records"| node_materials
node_public_pages -->|"uses norm records"| node_laws
node_public_pages -->|"uses legislator records"| node_legislators
node_public_pages -->|"uses document records"| node_protocols
node_public_pages -->|"uses session records"| node_sessions
node_public_pages -->|"generates reports"| node_reports
node_public_pages -->|"uses framework"| node_crud
node_user -.->|"browses"| node_parliamentarian_ui
node_parliamentarian_ui -->|"requests records"| node_api
node_parliamentarian_ui -.->|"displays results"| node_legislators
node_compilation_ui -.->|"edits texts"| node_consolidation
node_common -->|"references"| node_materials
node_common -->|"references"| node_legislators
node_common -->|"references"| node_protocols
node_api -.->|"enforces access"| node_permissions
node_user -.->|"verifies identity"| node_recaptcha

click node_web "https://github.com/interlegis/sapl/blob/3.1.x/sapl/urls.py"
click node_common "https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/models.py"
click node_crud "https://github.com/interlegis/sapl/blob/3.1.x/sapl/crud/base.py"
click node_permissions "https://github.com/interlegis/sapl/blob/3.1.x/sapl/rules/apps.py"
click node_api "https://github.com/interlegis/sapl/blob/3.1.x/sapl/api/views.py"
click node_materials "https://github.com/interlegis/sapl/blob/3.1.x/sapl/materia/models.py"
click node_laws "https://github.com/interlegis/sapl/blob/3.1.x/sapl/norma/models.py"
click node_consolidation "https://github.com/interlegis/sapl/blob/3.1.x/sapl/compilacao/models.py"
click node_protocols "https://github.com/interlegis/sapl/blob/3.1.x/sapl/protocoloadm/models.py"
click node_sessions "https://github.com/interlegis/sapl/blob/3.1.x/sapl/sessao/models.py"
click node_committees "https://github.com/interlegis/sapl/blob/3.1.x/sapl/comissoes/models.py"
click node_hearings "https://github.com/interlegis/sapl/blob/3.1.x/sapl/audiencia/models.py"
click node_panel "https://github.com/interlegis/sapl/blob/3.1.x/sapl/painel/views.py"
click node_legislators "https://github.com/interlegis/sapl/blob/3.1.x/sapl/parlamentares/models.py"
click node_reports "https://github.com/interlegis/sapl/blob/3.1.x/sapl/relatorios/views.py"
click node_lexml "https://github.com/interlegis/sapl/blob/3.1.x/sapl/lexml/views.py"
click node_public_pages "https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/views.py"
click node_parliamentarian_ui "https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__apps/parlamentar/main.js"
click node_compilation_ui "https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__apps/compilacao/main.js"
click node_global_ui "https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__global/main.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_materials,node_laws,node_consolidation,node_legislators,node_user toneBlue
class node_protocols,node_sessions,node_committees,node_hearings,node_panel,node_reports toneAmber
class node_lexml,node_public_pages toneMint
class node_web,node_common,node_crud,node_permissions,node_api toneRose
class node_parliamentarian_ui,node_compilation_ui,node_global_ui,node_recaptcha toneIndigo
```

## Components

### Legislative records

- [Legislative matters](https://github.com/interlegis/sapl/blob/3.1.x/sapl/materia/models.py): `sapl/materia/models.py`
- [Legal norms](https://github.com/interlegis/sapl/blob/3.1.x/sapl/norma/models.py): `sapl/norma/models.py`
- [Consolidated texts](https://github.com/interlegis/sapl/blob/3.1.x/sapl/compilacao/models.py): `sapl/compilacao/models.py`
- [Parliamentarians](https://github.com/interlegis/sapl/blob/3.1.x/sapl/parlamentares/models.py): `sapl/parlamentares/models.py`

### House operations

- [Administrative documents](https://github.com/interlegis/sapl/blob/3.1.x/sapl/protocoloadm/models.py): `sapl/protocoloadm/models.py`
- [Plenary sessions](https://github.com/interlegis/sapl/blob/3.1.x/sapl/sessao/models.py): `sapl/sessao/models.py`
- [Committees](https://github.com/interlegis/sapl/blob/3.1.x/sapl/comissoes/models.py): `sapl/comissoes/models.py`
- [Public hearings](https://github.com/interlegis/sapl/blob/3.1.x/sapl/audiencia/models.py): `sapl/audiencia/models.py`
- [Session panel](https://github.com/interlegis/sapl/blob/3.1.x/sapl/painel/views.py): `sapl/painel/views.py`
- [PDF reports](https://github.com/interlegis/sapl/blob/3.1.x/sapl/relatorios/views.py): `sapl/relatorios/views.py`

### Public services

- [LexML services](https://github.com/interlegis/sapl/blob/3.1.x/sapl/lexml/views.py): `sapl/lexml/views.py`
- [Public pages](https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/views.py): `sapl/base/views.py`

### Application platform

- [SAPL web app](https://github.com/interlegis/sapl/blob/3.1.x/sapl/urls.py): `sapl/urls.py`
- [Shared records](https://github.com/interlegis/sapl/blob/3.1.x/sapl/base/models.py): `sapl/base/models.py`
- [CRUD framework](https://github.com/interlegis/sapl/blob/3.1.x/sapl/crud/base.py): `sapl/crud/base.py`
- [Access rules](https://github.com/interlegis/sapl/blob/3.1.x/sapl/rules/apps.py): `sapl/rules/apps.py`
- [REST API](https://github.com/interlegis/sapl/blob/3.1.x/sapl/api/views.py): `sapl/api/views.py`

### User interface

- [Parliamentarian browser](https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__apps/parlamentar/main.js): `frontend/src/__apps/parlamentar/main.js`
- [Text editor UI](https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__apps/compilacao/main.js): `frontend/src/__apps/compilacao/main.js`
- [Shared UI tools](https://github.com/interlegis/sapl/blob/3.1.x/frontend/src/__global/main.js): `frontend/src/__global/main.js`

### Other components

- **House user**
- **Google reCAPTCHA**

## Connections

- House user → SAPL web app: uses
- SAPL web app → Public pages: routes requests
- Public pages → Shared records: reads settings (evidence: `sapl/base/views.py`)
- Public pages → Legislative matters: uses matter records (evidence: `sapl/base/views.py`)
- Public pages → Legal norms: uses norm records (evidence: `sapl/base/views.py`)
- Public pages → Parliamentarians: uses legislator records (evidence: `sapl/base/views.py`)
- Public pages → Administrative documents: uses document records (evidence: `sapl/base/views.py`)
- Public pages → Plenary sessions: uses session records (evidence: `sapl/base/views.py`)
- Public pages → PDF reports: generates reports (evidence: `sapl/base/views.py`)
- Public pages → CRUD framework: uses framework (evidence: `sapl/base/views.py`)
- House user → Parliamentarian browser: browses
- Parliamentarian browser → REST API: requests records (evidence: `frontend/src/__apps/parlamentar/main.js`)
- Parliamentarian browser → Parliamentarians: displays results
- Text editor UI → Consolidated texts: edits texts
- Shared records → Legislative matters: references (evidence: `sapl/base/receivers.py`)
- Shared records → Parliamentarians: references (evidence: `sapl/base/receivers.py`)
- Shared records → Administrative documents: references (evidence: `sapl/base/receivers.py`)
- REST API → Access rules: enforces access
- House user → Google reCAPTCHA: verifies identity
