# scwizard/jiangsu-safety-platform-skip architecture

> Architecture diagram of the GitHub repository scwizard/jiangsu-safety-platform-skip, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/scwizard/jiangsu-safety-platform-skip
- Repository: https://github.com/scwizard/jiangsu-safety-platform-skip

## Overview

This is a Python command-line script that automates the Jiangsu university safety education workflow: select a school, log in, complete unfinished course units, take the exam using answers from a local SQLite question bank, and retrieve a completion certificate. The README documents the question-bank approach; sampled code also shows optional usage-stat reporting. Main.py orchestrates the workflow and calls utilities in utils.py. Some utility implementations and the remainder of main.py were not sampled, so only documented or excerpt-visible relationships are shown.

Main entry points: [`main.py`](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py) (Workflow runner), [`utils.py`](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py) (HTTP session), [`database.db`](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/database.db) (Question bank)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Learning workflow"]
  node_orchestrator["Workflow runner<br/>[main.py]"]
  node_course_list["Course status<br/>[main.py]"]
  node_course_submit["Course completion<br/>[main.py]"]
  node_learning_api["Learning platform"]
  node_certificate["Certificate retrieval<br/>[main.py]"]
end

subgraph group_exam["Exam and answers"]
  node_exam_setup["Exam setup<br/>[utils.py]"]
  node_exam_questions["Exam questions<br/>[utils.py]"]
  node_answer_lookup["Answer matching<br/>[main.py]"]
  node_question_bank[("Question bank<br/>[database.db]")]
  node_exam_submit["Exam submission<br/>[utils.py]"]
end

subgraph group_support["Session and reporting"]
  node_school["School selection<br/>[utils.py]"]
  node_login["Account login<br/>[utils.py]"]
  node_session["HTTP session<br/>[utils.py]"]
  node_stats["Usage statistics<br/>[utils.py]"]
  node_stats_service["Statistics service"]
end

node_student(("Student"))

node_student -->|"provides credentials"| node_orchestrator
node_orchestrator -->|"requests school"| node_school
node_orchestrator -->|"authenticates"| node_login
node_orchestrator -->|"checks progress"| node_course_list
node_course_list -->|"requests status"| node_learning_api
node_orchestrator -->|"dispatches unfinished"| node_course_submit
node_course_submit -->|"submits unit work"| node_learning_api
node_course_submit -.->|"uses session"| node_session
node_orchestrator -->|"creates exam"| node_exam_setup
node_orchestrator -->|"fetches questions"| node_exam_questions
node_exam_questions -.->|"requests exam"| node_learning_api
node_orchestrator -->|"matches answers"| node_answer_lookup
node_answer_lookup -->|"looks up answers"| node_question_bank
node_orchestrator -->|"submits answers"| node_exam_submit
node_exam_submit -.->|"posts exam"| node_learning_api
node_orchestrator -->|"downloads on success"| node_certificate
node_certificate -->|"requests certificate"| node_learning_api
node_orchestrator -.->|"reports result"| node_stats
node_stats -->|"uploads score"| node_stats_service
node_school -->|"uses session"| node_session
node_login -->|"posts login"| node_session
node_exam_setup -->|"uses session"| node_session
node_exam_questions -->|"uses session"| node_session
node_exam_submit -->|"posts answers"| node_session

click node_orchestrator "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py"
click node_school "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_login "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_course_list "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py"
click node_course_submit "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py"
click node_exam_setup "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_exam_questions "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_answer_lookup "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py"
click node_question_bank "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/database.db"
click node_exam_submit "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_certificate "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py"
click node_session "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py"
click node_stats "https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.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_orchestrator,node_course_list,node_course_submit,node_learning_api,node_certificate toneBlue
class node_exam_setup,node_exam_questions,node_answer_lookup,node_question_bank,node_exam_submit toneAmber
class node_school,node_login,node_session,node_stats,node_stats_service toneMint
class node_student toneIndigo
```

## Components

### Learning workflow

- [Workflow runner](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py): `main.py`
- [Course status](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py): `main.py`
- [Course completion](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py): `main.py`
- **Learning platform**
- [Certificate retrieval](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py): `main.py`

### Exam and answers

- [Exam setup](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- [Exam questions](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- [Answer matching](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/main.py): `main.py`
- [Question bank](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/database.db): `database.db`
- [Exam submission](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`

### Session and reporting

- [School selection](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- [Account login](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- [HTTP session](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- [Usage statistics](https://github.com/scwizard/jiangsu-safety-platform-skip/blob/main/utils.py): `utils.py`
- **Statistics service**

### Other components

- **Student**

## Connections

- Student → Workflow runner: provides credentials (evidence: `main.py`)
- Workflow runner → School selection: requests school (evidence: `main.py`)
- Workflow runner → Account login: authenticates (evidence: `main.py`)
- Workflow runner → Course status: checks progress (evidence: `main.py`)
- Course status → Learning platform: requests status (evidence: `main.py`)
- Workflow runner → Course completion: dispatches unfinished (evidence: `main.py`)
- Course completion → Learning platform: submits unit work (evidence: `main.py`)
- Course completion → HTTP session: uses session (evidence: `main.py`)
- Workflow runner → Exam setup: creates exam (evidence: `main.py`)
- Workflow runner → Exam questions: fetches questions (evidence: `main.py`)
- Exam questions → Learning platform: requests exam
- Workflow runner → Answer matching: matches answers (evidence: `main.py`)
- Answer matching → Question bank: looks up answers (evidence: `main.py`)
- Workflow runner → Exam submission: submits answers (evidence: `main.py`)
- Exam submission → Learning platform: posts exam
- Workflow runner → Certificate retrieval: downloads on success (evidence: `main.py`)
- Certificate retrieval → Learning platform: requests certificate (evidence: `main.py`)
- Workflow runner → Usage statistics: reports result (evidence: `main.py`)
- Usage statistics → Statistics service: uploads score (evidence: `utils.py`)
- School selection → HTTP session: uses session (evidence: `utils.py`)
- Account login → HTTP session: posts login (evidence: `utils.py`)
- Exam setup → HTTP session: uses session (evidence: `utils.py`)
- Exam questions → HTTP session: uses session (evidence: `utils.py`)
- Exam submission → HTTP session: posts answers (evidence: `utils.py`)
