---
# System prepended metadata

title: Database
tags: [Функциональные части]

---

---
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` – язык