# qusheo/stud-portrait-app architecture

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

- Interactive diagram: https://gitdiagram.com/qusheo/stud-portrait-app
- Repository: https://github.com/qusheo/stud-portrait-app

## Overview

StudPortrait is a student-portrait and analytics web application. A user signs in, reaches permission-guarded student or admin views, and the frontend services call Django endpoints to retrieve portraits, results, and analytics; admin workflows also include data import and curriculum parsing. The README documents PostgreSQL and Redis configuration. The graph preserves documented analytics and operational capabilities where implementation was not sampled; those links are omitted or marked unverified rather than inferred from names.

Main entry points: [`backend/src/portrait/models.py`](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/models.py) (PostgreSQL data), [`frontend/src/index.jsx`](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/index.jsx) (App routing), [`frontend/src/services`](https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/services) (Frontend services), [`backend/src/portrait/urls.py`](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/urls.py) (Django routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_frontend["App routing<br/>[index.jsx]"]
  node_login["Login view<br/>[LoginView.jsx]"]
  node_userportrait["Student portrait<br/>[UserView.jsx]"]
  node_userreport["Portrait report<br/>[UserReportView.jsx]"]
  node_adminviews["Admin analytics"]
  node_superviews["Superadmin tools"]
  node_services["Frontend services"]
  node_api_client["HTTP API client<br/>[api.js]"]
end

subgraph group_api["Backend API"]
  node_django["Django routes<br/>[urls.py]"]
  node_auth["Session and permissions<br/>[auth.py]"]
  node_common["Response and helpers<br/>[common.py]"]
  node_student_endpoints["Student endpoints<br/>[students.py]"]
  node_database[("PostgreSQL data<br/>[models.py]")]
  node_redis[("Redis cache")]
end

subgraph group_domain["Portrait analytics"]
  node_analysis_endpoints["Analysis endpoints<br/>[datanal.py]"]
  node_advanced_analysis["Advanced analysis<br/>[analysis_end.py]"]
  node_ml["ML model<br/>[mlmodel.py]"]
  node_selection["Student selection"]
  node_matching["Student matching<br/>[matching.py]"]
  node_student_interests["Student interests"]
  node_llm["LLM service<br/>[main.py]"]
end

subgraph group_ops["Data operations"]
  node_data_import["Data import<br/>[dataload.py]"]
  node_curriculum["Curriculum parsing"]
  node_teacher_parser["Teacher directory parsing"]
  node_audit["Audit tools<br/>[audit.py]"]
end

node_user(("Student or admin"))

node_user -->|"opens"| node_frontend
node_frontend -->|"routes to"| node_login
node_frontend -->|"routes to"| node_userportrait
node_frontend -->|"routes to"| node_userreport
node_frontend -->|"routes to"| node_adminviews
node_frontend -->|"routes to"| node_superviews
node_login -.->|"requests data"| node_services
node_userportrait -.->|"requests data"| node_services
node_userreport -.->|"requests data"| node_services
node_adminviews -.->|"requests data"| node_services
node_superviews -.->|"requests data"| node_services
node_services -->|"calls"| node_api_client
node_api_client -->|"HTTP requests"| node_django
node_django -.->|"routes to"| node_auth
node_django -.->|"routes to"| node_student_endpoints
node_django -.->|"routes to"| node_analysis_endpoints
node_auth -->|"reads account"| node_database
node_student_endpoints -->|"uses helpers"| node_common
node_student_endpoints -.->|"reads and writes"| node_database
node_analysis_endpoints -->|"uses helpers"| node_common
node_advanced_analysis -->|"imports analysis"| node_analysis_endpoints
node_advanced_analysis -->|"uses model"| node_ml
node_analysis_endpoints -.->|"queries data"| node_database
node_student_interests -->|"uses helpers"| node_common
node_student_interests -->|"uses auth"| node_auth
node_student_interests -.->|"reads and writes"| node_database
node_data_import -.->|"imports data"| node_database
node_curriculum -.->|"stores mappings"| node_database
node_teacher_parser -.->|"loads directory"| node_database
node_audit -.->|"reads audit data"| node_database
node_common -.->|"uses cache"| node_redis
node_ml -.->|"integrates"| node_llm
node_selection -.->|"selects students"| node_database
node_matching -.->|"matches records"| node_database

click node_frontend "https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/index.jsx"
click node_login "https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/auth/LoginView.jsx"
click node_userportrait "https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/user/UserView.jsx"
click node_userreport "https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/user/UserReportView.jsx"
click node_adminviews "https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/views/admin"
click node_superviews "https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/views/super"
click node_services "https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/services"
click node_api_client "https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/api.js"
click node_django "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/urls.py"
click node_auth "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/auth.py"
click node_common "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/common.py"
click node_student_endpoints "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/entities/students.py"
click node_analysis_endpoints "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/datanal.py"
click node_advanced_analysis "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/statisticsService/analysis_end.py"
click node_ml "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/mlmodel.py"
click node_selection "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/selectionService/student_selection.py"
click node_matching "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/matchingService/matching.py"
click node_student_interests "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/student_interests.py"
click node_database "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/models.py"
click node_data_import "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/dataload.py"
click node_curriculum "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/parsers/disciplines_parser.py"
click node_teacher_parser "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/parsers/teacher_directory_parser.py"
click node_audit "https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/audit.py"
click node_llm "https://github.com/qusheo/stud-portrait-app/blob/main/model/src/main.py"

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_frontend,node_login,node_userportrait,node_userreport,node_adminviews,node_superviews,node_services,node_api_client toneBlue
class node_django,node_auth,node_common,node_student_endpoints,node_database,node_redis toneAmber
class node_analysis_endpoints,node_advanced_analysis,node_ml,node_selection,node_matching,node_student_interests,node_llm toneMint
class node_data_import,node_curriculum,node_teacher_parser,node_audit toneRose
class node_user toneIndigo
```

## Components

### Web experience

- [App routing](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/index.jsx): `frontend/src/index.jsx`
- [Login view](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/auth/LoginView.jsx): `frontend/src/views/auth/LoginView.jsx`
- [Student portrait](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/user/UserView.jsx): `frontend/src/views/user/UserView.jsx`
- [Portrait report](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/views/user/UserReportView.jsx): `frontend/src/views/user/UserReportView.jsx`
- [Admin analytics](https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/views/admin): `frontend/src/views/admin`
- [Superadmin tools](https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/views/super): `frontend/src/views/super`
- [Frontend services](https://github.com/qusheo/stud-portrait-app/tree/main/frontend/src/services): `frontend/src/services`
- [HTTP API client](https://github.com/qusheo/stud-portrait-app/blob/main/frontend/src/api.js): `frontend/src/api.js`

### Backend API

- [Django routes](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/urls.py): `backend/src/portrait/urls.py`
- [Session and permissions](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/auth.py): `backend/src/portrait/endpoints/auth.py`
- [Response and helpers](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/common.py): `backend/src/portrait/endpoints/common.py`
- [Student endpoints](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/entities/students.py): `backend/src/portrait/endpoints/entities/students.py`
- [PostgreSQL data](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/models.py): `backend/src/portrait/models.py`
- **Redis cache**

### Portrait analytics

- [Analysis endpoints](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/datanal.py): `backend/src/portrait/endpoints/datanal.py`
- [Advanced analysis](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/statisticsService/analysis_end.py): `backend/src/portrait/endpoints/statisticsService/analysis_end.py`
- [ML model](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/mlmodel.py): `backend/src/portrait/mlmodel.py`
- [Student selection](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/selectionService/student_selection.py): `backend/src/portrait/endpoints/selectionService/student_selection.py`
- [Student matching](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/matchingService/matching.py): `backend/src/portrait/endpoints/matchingService/matching.py`
- [Student interests](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/student_interests.py): `backend/src/portrait/endpoints/student_interests.py`
- [LLM service](https://github.com/qusheo/stud-portrait-app/blob/main/model/src/main.py): `model/src/main.py`

### Data operations

- [Data import](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/dataload.py): `backend/src/portrait/endpoints/dataload.py`
- [Curriculum parsing](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/parsers/disciplines_parser.py): `backend/src/portrait/endpoints/parsers/disciplines_parser.py`
- [Teacher directory parsing](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/parsers/teacher_directory_parser.py): `backend/src/portrait/endpoints/parsers/teacher_directory_parser.py`
- [Audit tools](https://github.com/qusheo/stud-portrait-app/blob/main/backend/src/portrait/endpoints/audit.py): `backend/src/portrait/endpoints/audit.py`

### Other components

- **Student or admin**

## Connections

- Student or admin → App routing: opens (evidence: `frontend/src/index.jsx`)
- App routing → Login view: routes to (evidence: `frontend/src/index.jsx`)
- App routing → Student portrait: routes to (evidence: `frontend/src/index.jsx`)
- App routing → Portrait report: routes to (evidence: `frontend/src/index.jsx`)
- App routing → Admin analytics: routes to (evidence: `frontend/src/index.jsx`)
- App routing → Superadmin tools: routes to (evidence: `frontend/src/index.jsx`)
- Login view → Frontend services: requests data
- Student portrait → Frontend services: requests data
- Portrait report → Frontend services: requests data
- Admin analytics → Frontend services: requests data
- Superadmin tools → Frontend services: requests data
- Frontend services → HTTP API client: calls (evidence: `frontend/src/services/StudentService.ts`)
- HTTP API client → Django routes: HTTP requests (evidence: `frontend/src/api.js`)
- Django routes → Session and permissions: routes to
- Django routes → Student endpoints: routes to
- Django routes → Analysis endpoints: routes to
- Session and permissions → PostgreSQL data: reads account (evidence: `backend/src/portrait/endpoints/auth.py`)
- Student endpoints → Response and helpers: uses helpers (evidence: `backend/src/portrait/endpoints/entities/students.py`)
- Student endpoints → PostgreSQL data: reads and writes (evidence: `backend/src/portrait/endpoints/entities/students.py`)
- Analysis endpoints → Response and helpers: uses helpers (evidence: `backend/src/portrait/endpoints/datanal.py`)
- Advanced analysis → Analysis endpoints: imports analysis (evidence: `backend/src/portrait/endpoints/statisticsService/analysis_end.py`)
- Advanced analysis → ML model: uses model (evidence: `backend/src/portrait/endpoints/statisticsService/analysis_end.py`)
- Analysis endpoints → PostgreSQL data: queries data
- Student interests → Response and helpers: uses helpers (evidence: `backend/src/portrait/endpoints/student_interests.py`)
- Student interests → Session and permissions: uses auth (evidence: `backend/src/portrait/endpoints/student_interests.py`)
- Student interests → PostgreSQL data: reads and writes
- Data import → PostgreSQL data: imports data
- Curriculum parsing → PostgreSQL data: stores mappings
- Teacher directory parsing → PostgreSQL data: loads directory
- Audit tools → PostgreSQL data: reads audit data
- Response and helpers → Redis cache: uses cache (evidence: `backend/src/portrait/endpoints/common.py`)
- ML model → LLM service: integrates
- Student selection → PostgreSQL data: selects students
- Student matching → PostgreSQL data: matches records
