---
tags: Функциональные части
---
# Database
База данных для хранения информации обо всём: курсах, задачах, учениках, учителях, результатах проверки. Можно поднять **PostgreSQL** [бесплатно](https://www.elephantsql.com/).
## Модели
### Пользователь
```json
{
"email": "ivanov@gmail.com", // e-mail пользователя
"login": "ivanov", // имя пользователя
"password": "secretpassword", // пароль пользователя
"middle_name": "Иванович", // отчество
"first_name": "Иван", // имя
"last_name": "Иванов", // фамилия
"birthday": "01.01.1970", // дата рождения
"user_type": "teacher", // тип пользователя teacher/student
}
```
### Группа пользователей (создается учителем)
```json
{
"id": <primary_key>,
"name": <name>,
"slug": <slug>,
"owner": <user_id>
}
```
* `name` – имя группы
* `slug` – имя группы в виде слага
* `owner` - id пользователя, кому принадлежит группа
### Принадлежность пользователей группе (Django через ManyToMany)
```json
{
"id": <primary_key>,
"user_id": <user_primary_key>,
"group_id": <group_primary_key>
}
```
* `user_id` – пользователь (ученик)
* `group_id` - группа
### Привязка пользователей к задаче (Django через ManyToMany)
```json
{
"id": <primary_key>,
"user_id": <user_primary_key>,
"task_id": <task_primary_key>
}
```
* `user_id` – пользователь (ученик)
* `task_id` - задача
### Привязка группы к задаче (Django через ManyToMany)
```json
{
"id": <primary_key>,
"group_id": <group_primary_key>,
"task_id": <task_primary_key>
}
```
* `group_id` – группы
* `task_id` - задача
### Задача
```json
{
"id": <primary_key>,
"author_id": <user_primary_key>,
"name": <name>,
"description": <description>,
"slug": <slug>,
"layout_id": <layout_primary_key>,
"tests": <tests>
}
```
* `course_id` – курс (нужно, чтобы понимать язык программирования задачи)
* `name` – имя задачи
* `description` - описание задачи (может быть Markdown'ом)
* `slug` – имя задачи в виде слага (будет использоваться в качестве имени создаваемой папки внутри папки пользователя внутри папки курса)
* `layout_id` – шаблон проекта, описан в модели `Шаблон`
### Результат проверки задачи
```json
{
"id": <primary_key>,
"student_id": <student_primary_key>,
"task_id": <task_primary_key>,
"status": <"running"|"stopped"|"ce"|"re"|"tle"|"wa"|"ok">,
"tests_count": <tests_count>,
"passed_tests_count": <passed_tests_count>,
"language_id": <language_primary_key>,
"date": <date>
}
```
* `student_id` – студент решивший задачу
* `task_id` – решенная задача
* `status` – статус проверки
* `tests_count` - количество тестов
* `passed_tests_count` - количество пройденных тестов
* `language_id` - язык, на котором сдавалась задача
* `date` - время сдачи
### Шаблон
```json
{
"id": <primary_key>,
"slug": <slug>
}
```
* `slug` - просто поле для красивого отображения имени шаблона
### Язык программирования
```json
{
"id": <primary_key>,
"name": <name>,
"slug": <slug>
}
```
* `name` – имя языка программирования
* `slug` – для определения чекера
### Связь задачи и языков программирования (одна задача может быть решена на нескольких языках) (Django через ManyToMany)
```json
{
"id": <primary_key>,
"task_id": <task_primary_key>,
"language_id": <language_primary_key>
}
```
* `task_id` – задача
* `language_id` – язык