Как вызвать и обработать всплывающее окно подтверждения из сервисной функции, не прерывая транзакцию
В моем проекте Django бизнес-логика размещена на слое service
. Views
выполняет только функцию работы с templates
. У меня есть базовый шаблон с формой и полями типа select на ней. При изменении любого поля скрипт отправляет AJAX-запрос на views
. views
принимает этот запрос и передает данные в сервисную функцию, которая использует их для записи в БД.
template
-> views
-> service
-> model
Теперь мне нужно сделать функцию для вызова всплывающего окна подтверждения из сервиса для подтверждения изменения данных, получения ответа из окна и его обработки. У меня уже есть модальное окно и скрипт, который вызывает его при response.confirmation_dialog. Мне нужен механизм вызова этого окна из сервиса без прерывания транзакции.
Один из вариантов реализации заключался в отправке ответа шаблону с модальным вызовом подтверждения. При нажатии на кнопку подтверждения снова отправлялся AJAX-запрос к представлению с информацией о подтверждении. Затем эта информация отправлялась обратно в сервис, который проверял, прошло подтверждение или нет. Однако даже с одним подтверждением это выглядит плохо, и сервису может понадобиться сразу несколько проверок.
Другая попытка заключалась в использовании генератора в сервисе. Это позволило вызывать окно подтверждения, не прерывая работу функции сервиса.
def some_view(response):
my_gen = service.get_generator(user)
response = next(my_gen)
service.save_generator(user, my_gen)
return JsonResponse(response)
def some_generator():
yield {'success': False,
'confirmation_dialog': {
'show': True,
'title': "Test 1",
'message': "Test 1"
}
}
edit_some_model()
yield {'success': False,
'confirmation_dialog': {
'show': True,
'title': "Test 2",
'message': "Test 2"
}
}
edit_another_model()
yield {'success': False,
'confirmation_dialog': {
'show': True,
'title': "Test 3",
'message': "Test 3"
}
}
commit_changes()
yield {'success': True}
Однако это приведет к прерыванию транзакции в представлении.
Итак, мне нужно создать универсальный механизм, который позволил бы вызывать окно подтверждения из сервиса, не прерывая транзакцию. Вот пример того, как я хотел бы это реализовать:
from cmp_modals import ConfirmDialog
def some_service_func():
if not ConfirmDialog(title="title", message="message"):
return False
if some_condition:
dialog = ConfirmDialog(title="another_title", message="another_message")
if not dialog:
return False
else:
another_service_func():
Приблизительная версия того, что я хочу получить
Есть что-то подобное в MS Business Central, мне нужен какой-то аналог этого: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/dialog/dialog-confirm-method