ActionType
— это класс, который определяет, как выполнять do
, undo
и redo
конкретное действие в Baserow. Он может свободно использовать Handlers
для выполнения логики, но почти наверняка не должен вызывать другие ActionType
, если только это не какой-то вид meta
ActionType
, если таковой когда-либо появится. ActionTypes
будут извлекаться из реестра по типу и запускаться методами API
(например, action_type_registry.get_by_type(DeleteWorkspaceAction).do(user, workspace_to_delete)
).
backend/src/baserow/core/actions/registries.py
есть action_type_registry
, который можно использовать для регистрации ActionType
.ActionType
должен реализовывать методы do
/undo
/redo
.
do
выполняет действие, когда пользователь запрашивает его выполнение, и также должен сохранять модель Action
с помощью cls.register_action
.undo
должен отменять действие, выполненное методом do
. Он не должен сохранять никакие модели Action
.redo
должен повторять действие после его отмены методом undo
. Он также не должен сохранять никакие модели Action
.ActionType
должен реализовывать Params
dataclass, в котором он будет хранить любые параметры, необходимые для отмены или повтора действия. Экземпляр этого dataclass должен быть предоставлен методу cls.register_action
в методе do
, и он будет сериализован в JSON и сохранен в таблице Action
. Когда вызывается метод redo
или undo
, этот dataclass будет создан снова из JSON в строке Action
и предоставлен функции.См. baserow.core.action.models.Action для более подробной информации.
id (serial) | user_id (fk к таблице пользователей, nullable) | session (text nullable) | category (text) | created_on (auto_now_add DateTimeField) | type (text) | params (JSONB) | undone_at (nullable DateTimeField) | error (text nullable) |
---|---|---|---|---|---|---|---|---|
1 | 2 | 'some-uuid-from-client' | 'root' | datetime | 'workspace_created' | '{created_workspace_id:10}' | null | null |
ActionHandler
имеет методы undo
и redo
, которые можно использовать для запуска отмены/повтора действия для пользователя. Существуют два соответствующих эндпоинта в /api/user/undo
и /api/user/redo
, которые вызывают ActionHandler
. Для запуска отмены/повтора нам нужны три куска информации:
client session id
. Каждый раз, когда пользователь выполняет действие в Baserow, мы проверяем заголовок ClientSessionId
. Если он установлен, мы связываем действие с этим ClientSessionId
. Когда пользователь затем переходит к отмене или повтору, он также предоставляет этот заголовок, и мы позволяем ему отменять/повторять только действия с совпадающим ClientSessionId
. Это позволяет иметь разные истории отмены/повтора для каждой вкладки, открытой пользователем, так как каждая вкладка генерирует уникальный ClientSessionId
.category
. Каждый раз, когда действие выполняется в Baserow, мы связываем его с определенной категорией. Это буквально просто текстовое поле в модели Action
со значениями, такими как root
или table10
или workspace20
. Категория действия описывает, в какой логической части Baserow было выполнено действие. Реализация ActionType
решает, какую категорию установить при вызове cls.register_action
. Когда происходит отмена/повтор, веб-фронтенд отправляет категории, на которые пользователь смотрит в данный момент. Например, если у меня открыта таблица 20 с рабочим пространством 6 в боковой панели и я нажимаю отмену/повтор, отправляемая категория будет:{
root: true,
table: 20,
workspace: 6
}
Отправляя эту категорию в эндпоинт отмены/повтора, мы указываем ему отменить любые действия, выполненные в:
Например, если я переименовал таблицу 20, то действие table_update будет находиться в категории рабочего пространства 6. Если я затем смотрю на таблицу 20 в интерфейсе и нажимаю отмену, интерфейс отправит категорию рабочего пространства 6 как одну из активных категорий, так как таблица 20 находится в рабочем пространстве 6. Это означает, что я смогу отменить это переименование. Если я переключусь на рабочее пространство 5 и нажму отмену, интерфейс отправит категорию рабочего пространства 5, и я не смогу отменить переименование таблицы 20 до тех пор, пока не переключусь обратно на часть интерфейса, где активна категория рабочего пространства 6.
auth
ClientSessionId example_client_session_id
(это обычно UUID).undoRedo
как: {root: true, table_id:10, application_id:2, workspace_id:1}
ClientSessionId
со значением example_client_session_id
.action_type_registry.get(UpdateTableAction).do(user, ...)
.workspace1
.ClientSessionId
, и сессия действия устанавливается как example_client_session_id
.User A
.action.params
, чтобы облегчить отмену и повтор.category
, установленными на текущую категорию страницы, открытой пользователем, полученную из хранилища undoRedo
(см. выше).
ClientSessionId
со значением example_client_session_id
.ActionHandler.undo
.
example_client_session_id
и в любой из следующих категорий: ["root", "workspace1", "application2", "table10"]
. Эти категории были вычислены из параметра категории, переданного эндпоинту.workspace
, выполнено пользователем A и еще не было отменено (поле undone_at
равно null).action_type_registry.get(UpdateTableAction).undo(user, params, action_to_undo)
.datetime.now(tz=timezone.utc)
, указывая на то, что действие теперь отменено.Представьте ситуацию, когда два пользователя одновременно работают над таблицей:
Мы не можем отменить последнее действие пользователя A, так как оно было выполнено для ячейки в удаленном поле 'name'. Что произойдет:
Если пользователь затем дважды нажмет повтор, произойдет следующее:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )