Здеcь будут содержать все файлы для командного проекта по формирования отчетов компании между заказчиками
Для этого репозитория написано вики
- Выполните клонирование репозитория через команду в нужную директорию:
git clone https://github.com/EmAksS/ReportCreator.git
- Создадите и запустите виртуальную среду в директории
reportcreator:
python -m venv venv
.\venv\Scripts\activate
- Установите все зависимости через
requirements.txt
pip install -r ../requirements.txt
- Создадите и заполните
.env-файл. Структура переменных описана в файле.env.dist- Значение
MODEставить на любое значение, кроме случаев загрузки сайта на продакшн - тут нужно ставить значениеproduction. - Значение
SECRET_KEYможно оставить пустым (при запуске будет подгружаться публичный ключ), однако при загрузке на продакшн тут должен быть СЕКРЕТНЫЙ ключ проекта.
- Значение
- Создайте новую ветку Git'a для работы.
Проект поддерживает запуск помощью Docker.
Если вы впервые запускаете проект, сначала соберите контейнеры с помощью команды docker-compose build.
Запуск контейнеров оуществляется с помощью docker-compose up.
Приложение содержит миграции - это специальные файлы для организации структуры базы данных.
По умолчанию, миграции уже приготовлены и они располагаются в backend/migrations/.
Перед первым запуском приложения, примените эти миграции для организации полей базы данных:
py .\manage.py migrate
После этого, будут организован файл базы данных в core/db.sqlite3.
Примечание: Если мы изменяете структуру базы данных (т.е. меняете файлы в папке <app_name>/models/<model_name>), вам нужно создать миграции командой:
py .\manage.py makemigrations
...и далее применить миграции командой migrate.
- Введите команду:
python manage.py runserver
- Перейдите по ссылке http://127.0.0.1:8000/ в браузере.
ВАЖНО! Вы можете посмотреть все методы для работы по адресу http://127.0.0.1:8000/schema/swagger-ui/#/
- Исполнитель - компания, которая зарегистрирована как исполнитель услуг.
- Заказчик - внешняя компания, которая зарегистрирована как заказчик услуг исполнителя.
- Модель - таблица баз данных, куда сохраняются данные
Объявление моделей компаний указано в файле /backend/models/company.py
Это базовая модель, где будут находиться общие поля для каждой компании (Исполнителя и Заказчика):
- ID (ключевое поле, автоинкрементирующий номер)
- Название компании (с сокращением и абревиатурами: ООО "Трайв Технолоджис")
- Полное название компании (с расшифровкой абревиатур: общество с ограниченной ответственностью «Трайв Технолоджис»)
- Название должности (директор или ген.директор)
- ФИО директора (полностью - Иванов Иван Иванович)
ID - это автоинкрементирующее поле, действие которое переходит в качестве Django и является ключевым полем для элемента. Тип данных - число.
Название компании (company_name) - обязательное поле. Принимает название компании с сокращениями и абревиатурами. Максимальная длина поля - 64 символа. Принимает только текстовые символы.
Полное название компании (company_fullName) - текстовое поле, которое содержит полное название компании с расшифровкой всех абревиатур. Максимальная длина 256 символов. Не может быть пустым. Если при создании элемента значение не задано, то принимает значение поля company_name.
Название должности руководителя (director_post) - именование должности руководителя, от чьего имени будут подписываться все документы от компании. Максимальная длина - 32 символа. Не может быть пустым. По умолчанию или если поле не было заполнено, принимает значение "Директор"
ФИО руководителя (director_name) - ФИО руководителя полностью, от чьего имени будут подписываться документы. Не может быть пустым. Максимальная длина - 64 символа.
Инициалы руководителя (director_shortName) - инициалы руководителя компании. Максимальная длина строки - 32 символа. Не может быть пустым.
В дальнейшем оно будет автоматически создаваться из значений поля director_name.
Модель наследует все поля из абстрактной модели компании.
Имеются ли дополнительные поля у исполнителя?
Модель компании-заказчика, который выполняет заказ у компании-исполнителя. Наследует все поля из абстрактной модели компании, а также добавляются дополнительные поля:
Город-месторасположение компании (contractor_city) - название города, где располагается компания-заказчик. Представляет собой строку, максимальная длина равна 64 символа. Не может быть пустым.
Модель пользователя системы, который выполняет работу с системой. Каждый пользователь связан с конкретной компанией-исполнителем. Пользователь может быть связан только с одной конкретной компанией.
Здесь представлена только информация с пользователем, как объектом системы.
Поля пользователя:
- username - имя пользователя в системе.
- last_name - фамилия пользователя.
- first_name - имя пользователя.
- patronymic - отчество пользователя.
- related_company - компания, которой принадлежит пользователь. Является полем таблицы
companies.Executor.
Все действия с сервером будет происходить через API.
Абсолютно вся работа API описана в директории api/.
Для работы используется модуль django-rest-framework.
Пока проект не загружен на продакшн, API будет доступно по адресу локалхоста с портом 8000.
ВАЖНО! Проект принимает только запроса от локалхоста с портом 3000 - React-проекта.
Перед запуском проекта убедитесь, что фронтенд будет запускаться именно на этом порту!
Принцип работы действует согласно правилам API, предоставляя заголовки, коды ответов и само тело ответа.
Все точки взаимодействия API описаны относительно адреса https://127.0.0.1:8000
/csrf/- получить CSRF-токен текущей сессии - указан по ключуcsrf_token/check_auth/- проверить, является ли текущий пользовать авторизирован в системе. Статус аутентификации указан по ключуstatus:authenticated|not_authenticated. При аутентификации пользователя, также возвращает в ключеuserинформацию о пользователе./login/- POST-метод, аутентификация пользователя в системе. Обязан принять request-запрос в формате ключ-значение в формате ниже. При успехе возвращает ключ"status": "success"и информацию о пользователе в полеuser. При неудаче, возвращает ошибку400.
{
"username": "логин_пользователя",
"password": "пароль_пользователя"
}/logout- POST-метод, только для авторизированных пользователей. Выполняет выход пользователя из системы. При успехе возвращает поле"status": "success". Если пользователь не авторизирован, возвращает ошибку403.register/company/- POST-метод. Осуществляет регистрацию компании и его суперпользователя. Обязан модержать поля, указанные ниже. При успехе, возвращает код201, а также поля"status": "success", информацию о сохранённой компании (company) и информацию о суперпользователе этой компании (user). При ошибке возвращает код403.
{
"company_name": "краткое_название_компании",
"company_fullName": "полное_название_компании",
"username": "логин_создаваемого_суперпользователя",
"password": "пароль_создаваемого_суперпользователя",
"last_name": "фамилия_суперпользователя",
"first_name": "имя_суперпользователя",
"surname": "НЕОБЯЗАТЕЛЬНО_отчество_суперпользователя"
}/register/user/- POST-метод, только для авторизированного суперпользователя компании. Создаёт пользователя компании, в которой находится суперпользователь. Обязан содержать поля, указанные ниже. При успехе создания пользователя, возвращает код201,"status": "success"и информацию о созданном пользователеuser.
{
"username": "логин_создаваемого_пользователя",
"password": "пароль_создаваемого_пользователя",
"last_name": "фамилия_пользователя",
"first_name": "имя_пользователя",
"surname": "НЕОБЯЗАТЕЛЬНО_отчество_пользователя"
}/company/- только для авторизированных пользователей. Берёт компанию пользователя и информацию о компанииcompany, а также информацию о всех пользователях-участниках этой компанииusers. Если пользователь не состоит в компании, возвращает код400.
Поля (fields) - парадигма сохранения данных о пользователе, где содержится дополнительная информация о пользователях.
Через API можно создать дополнительные кастомные поля, куда можно писать данные определённых типов.
Все данные о полях описаны в backend/models/fields.py:
key_name- английское название поле. Является ключевым полем (primary_key) и по нему идёт доступ в программе.name- русскоязычное название поле, понятное для человека.is_required- флаг, который обозначает, является ли переменная обязательной для заполнения или нет.related_item- название модели, куда относится данное поле. Заполняется программно (автоматически), при создании поля в зависимости от метода создания поля. Например, если создаётся поле пользователя, тоrelated_item = "User". На данный момент (05.04.2025) поддерживает только значение"User".type- тип данных, который должен выступать как значение поля. Поддерживает значения, указанные в переменнойFIELD_TYPESв файле модели. При программном создании (при формировании запроса в API) нужно использовать только первое значение кортежа. То есть, при кортеже("TEXT", "Текстовое поле")нужно указатьtype = "TEXT". Обратите внимание, что несмотря на различные указания, все данные будут хранитьсся в текстовом формате.placeholder- необязательное поле - если его не указать, то принимает значениеnull. Указывает текст, который будет служить плейсхолдером при ожидании значения поля.validation_regex- необязательное поле - если его не указать, то принимает значениеnull. Указывает регулярное выражение, соглано которому нужно проверять значение поля. Стоит обратить внимание, что значение хранится в текстовом формате.secure_text- булевый флаг, отвечающий за то, является ли текст защищённым или нет. Если тект является защищённым, то предполагается, что его значение при вводе должно скрываться. Это обычно делается для паролей.error_text- текст, выводимый при ошибке ввода. Обычно это может быть ошибка при несоответствии ввода по регулярному выражениюvalidation_regex. Может бытьnull- тогда вывод ошибки при несоответствии регулярному выражению остаётся на разработчике. Текст ошибки не предполагает иные ошибки (например, ошибки отказа доступа или другие из семейства 400). Текст ошибки не адаптируется соглано коду ошибки и не подвержен HTML-структуре.
Имеется точки взяимодействия с API для создания различных полей, но точки взаимодействия будут отличаться. Для каждого модуля (пользователи, документы, лица) программы будут свои точки взаимодействия с API для работы с полями (см. далее)
Поля пользователя имеют related_item = "User".
При запуске миграций (python manage.py migrate) создаются (если их нет) ключевые поля для пользователя.
Проверить и изменить их можно в файле backend/migrations/initial_fields_0005.py.
По факту это только ФИО пользователя, но там можно проверить пример создания полей, если вы хотите добавить другие поля для создания при старте сервера.
Имеются два API-метода для работы с полями пользователя.
Здесь и далее будут указаны URL отноительно адреса https://127.0.0.1:8000.
user/fields/create/- POST-метод. Доступен только для суперпользователей или еслиDEBUG=True(см.core/settings/) Создаёт поле для пользователя. Принимает значения, необходимые для создания полей (см. #Поля). При успехе возвращает код статуса201,"status": "success"и созданное поле"field". При ошибке возвращает код статуса400и текст ошибки"error".user/fields/fields/- GET-метод для всех пользователей. Возвращает все поля пользователя, которые находятся в базе данных в формате списка (массива) объектов. Возврат идёт в формате полей (см. #Поля).
Все значения кастомных полей хранятся в отдельной таблице базы данных UsersValues (/backend/models/users.py).
user- пользователь, к которому относится данное поле. Является ссылкой на объект базы данныхUser.field- поле, чьё значение бло записано. Является ссылкой на объект базы данныхField.value- значение поля. Стоит обратить внимание, что оно всегда сохраняется как текст, вне зависимости от типа поля. При получении значения поля, стоит вручную позаботиться о его переводе в нужный формат.
Существуют несколько методов, которые изменяют данные поля пользователя. Все методы будут работать только для аутентифицированных пользователей. Все методы будут возвращать поля только для того пользователя, от лица которого будет идти запрос.
user/fields/- POST-/GET-метод. Позволяет получить и изменить все значения полей для авторизированного пользователя. При получении данных возвращает данные в стандартном формате (см. #Работа со значениями полей пользователя). При успешной записи возвращает код статуса201и записанные данные. При ошибки в записи возвращает код статуса400и описание ошибки.user/fields/<int:pk>/- GET-/PUT-/DELETE-метод. Позволяет получить и изменить данные о значении определённого поля для авторизированного пользователя.pkявляется ID значения поля в базе данных: его можно получить черезuser/fields/. Если полеpkне найдено, возвращает код ошибки404и"error": "Поле не найдено". При получении данных, возвращает код200и указанное значение поля. При успешном изменении поля, возвращает код200и изменённое поле. При ошибке во время изменения, возвращает ошибку в теле ответа и код400. При успешном удалении поля возвращает только код выполнения204.
Все другие вопросы спрашивайте на странице проекта в Трекере.