@nurzhannogerbek

Как откатиться к определенной версии в django-reversion?

Здравствуйте! Помогите пожалуйста разобраться.

Использую приложение django-reversion в своем проекте. Проблема в следующем: вывожу историю изменений в виде списка. Пытаюсь откатиться к определенной версии, но выдает ошибку. Из ошибки можно предположить, что проблема вызывается когда хочу установить комментарий set_comment. Что делаю не так и как исправить проблему?

views.py:
from reversion.views import RevisionMixin
from django.views import View
from django.shortcuts import get_object_or_404, redirect
from reversion.models import Version
import reversion

class ArticleRevert(RevisionMixin, View):
    def get(self, request, *args, **kwargs):
        article=get_object_or_404(Article, pk=self.kwargs.get('pk'))
        revision=get_object_or_404(Version.objects.get_for_object(article), pk=self.kwargs.get('article_reversion_id')).revision
        reversion.set_comment("Был совершен откат к версии #{}".format(revision.id))
        revision.revert()
        return redirect('article_list')


ERROR:
Traceback (most recent call last):
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/reversion/views.py", line 43, in do_revision_view
    return func(request, *args, **kwargs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/Applications/Projects/web/project/article/views.py", line 165, in get
    reversion.set_comment("Был совершен откат к версии #{}".format(reversion.id))
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/reversion/revisions.py", line 122, in set_comment
    _update_frame(comment=comment)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/reversion/revisions.py", line 87, in _update_frame
    _local.stack = _local.stack[:-1] + (_current_frame()._replace(**kwargs),)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/reversion/revisions.py", line 53, in _current_frame
    raise RevisionManagementError("There is no active revision for this thread")
RevisionManagementError: There is no active revision for this thread
  • Вопрос задан
  • 704 просмотра
Решения вопроса 1
Судя по исходнику, при использовании RevisionMixin для GET/HEAD/OPTIONS запросов механизм "версионности" игнорируется.
Собственно set_comment напрямую зависит от его активности.

Если нужно "откат" завернуть в новую ревизию, то, по идее, вам нужно поменять get на post.

Если уж очень хочется использовать get (что, в принципе, не лучшая практика для запросов, влияющих на состояние бд), то ничего не мешает вместо RevisionMixin использовать декоратор reversion.create_revision в CBV явно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы