# CRUD
# Работа с записью
CRUD имеет стандартный набор URL-ов, для работы над записью. Прежде всего, необходимо зарегистрировать в системе исходную модель.
Конструктор -> CRUD -> Добавить запись
Прописываем необходимые поля модели/таблицы, и выбираем нужные разрешения. Далее указываем функцию проверки прав доступа к объекту в контексте задачи.
Пример:
CREATE OR REPLACE FUNCTION permissions_contest(action_name character, listing_id integer, user_organization_id integer, user_role character, user_id integer, user_language character, document_id character, params jsonb)
RETURNS boolean
LANGUAGE plpgsql
AS $function$
DECLARE
--
-- Проверка прав на CRUD
-- /admin/processing/listingpage/1/change/
--
BEGIN
-- Доступ: Администратор и Координатор
IF user_id > 0 AND user_role IN ('ADMIN', 'COORDINATOR') THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$function$
Совет
- Роль пользователя определяется на основе поля Роль, в объекте Пользователя в таблице
authentication_userили по энд-поинту/api/v1/auth/set/role/. - Права доступа к CRUD неследуются из родительского листинга, если функция проверки прав доступа явно не указана.
# Валидация входящих данных
Иногда необходима пре-валидация данных, которая имеет логику, отличную от стандартной, но требуется для бизнес процессов. В этом случае, мы можем прописать функцию валидации.
Пример:
CREATE OR REPLACE FUNCTION crud_validator(action_name character, listing_id integer, user_organization_id integer, user_role character, user_id integer, user_language character, document_id character, params jsonb)
RETURNS boolean
LANGUAGE plpgsql
AS $function$
DECLARE
--
-- Кастомная валидация CRUD
-- /admin/processing/crudpage/1/change/
--
in_desc TEXT;
in_file TEXT;
BEGIN
-- Доступ: Администратор и Координатор
IF user_role NOT IN ('ADMIN', 'COORDINATOR') THEN
RAISE NOTICE '%', 'Ошибка доступа!';
RETURN FALSE;
END IF;
-- Входящие данные
in_desc := jsonb_extract_path(params, 'desc');
in_file := json_extract_path_text(params::json, 'file');
-- Проверка наличия: Файла и Причины
IF (in_desc IS NULL OR in_desc = '') OR (in_file IS NULL OR in_file = '') THEN
RAISE NOTICE '%', 'Заполните поля Файл и Описание!';
RETURN FALSE;
END IF;
-- Проверка формата файла
IF in_file NOT SIMILAR TO '%(.doc|.docx|.xls|.xlsx|.txt|.pdf|/)' THEN
RAISE NOTICE '%', 'Неверный формат файла';
RETURN FALSE;
END IF;
-- Проверки пройдены
RETURN TRUE;
END;
$function$
# Добавление записи
Метод: POST
Эндпоинт: /api/v1/processing/crud/{slug}/
Тело HTTP-запроса:
{ key: value, ... },
# Редактирование записи
Метод: PATCH или PUT
Эндпоинт: /api/v1/processing/crud/{slug}/{id}/
Тело HTTP-запроса:
{ key: value, ... },
# Удаление записи
Метод: DELETE
Эндпоинт: /api/v1/processing/crud/{slug}/{id}/
Совет
URL-ы CRUD-а доступны так же в браузере, посредству интерфейса DRF, для тестирования со стороны бекенд разработчика.
# Массовое создание записей
Метод: POST
Эндпоинт: /api/v1/processing/crud/{slug}/?multi=1
Тело HTTP-запроса:
[
{ key: value, ... },
{ key: value, ... }
]
# Массовое редактирование записей
Метод: PATCH
Эндпоинт: /api/v1/processing/crud/{slug}/?multi=1
Тело HTTP-запроса:
[
{ id: value, key: value, ...},
{ id: value, key: value, ...}
]
Совет
Возможность массового создания и редактирования, требуется в случаях, когда у родительского объекта, имеются множества инлайнов (дочерних объектов), связанных по первичному ключу (FK) в БД.
# Мультиязычность
При использовании мультиязычности, для редактирования, нужно выводить поля с постфиксом языка.
Пример:
name_en
name_ru
name_uz
# Защита формы с Google ReCaptcha:
Добавьте поле, с названием captcha в список полей CRUD для ввода. Таким образом, будет активирован механизм,
для верификации пользователя. Предварительно, необходимо получить ключи для работы с ReCaptcha.
Для этого перейдите в панель администратора Google, по адресу https://www.google.com/recaptcha/admin/create ,
заполните необходимые данные и укажите версию v3.
После передайте Ключ для Сайта фронтенд разработчику, и Секретный ключ бекенд разработчику.
При необходимости, можно попросить добавить captcha в форму авторизации пользователя на сайте.
# Работа с формами (фронтенд)
# Файлы
В случае, когда модель имеет хотя бы одно поле файл, необходимо изменить
отправку данных с raw/json, на multipart/form-data.
# FK и M2M
При использовании FK, необходимо передавать id/code, в объекте формы.
В случае с M2M, данные передаются в виде массива ключей:
array: first_item,
array: second_item,
...
Совет
По умолчанию все данные принимаются в формате json.