Undo actual state when doing an RFC Editor undo, this is only relevant

if the removed entry is the latest entry
 - Legacy-Id: 5116
This commit is contained in:
Ole Laursen 2012-12-11 15:10:51 +00:00
parent 8eeef2def4
commit 9c571e65ef
2 changed files with 28 additions and 8 deletions

View file

@ -407,30 +407,40 @@ class RFCEditorUndoTestCase(django.test.TestCase):
def test_rfceditor_undo(self):
draft = make_test_data()
e = add_state_change_event(draft, Person.objects.get(name="(System)"), None,
e1 = add_state_change_event(draft, Person.objects.get(name="(System)"), None,
State.objects.get(type="draft-rfceditor", slug="auth"))
e.desc = "Test"
e.save()
e1.desc = "First"
e1.save()
e2 = add_state_change_event(draft, Person.objects.get(name="(System)"), None,
State.objects.get(type="draft-rfceditor", slug="edit"))
e2.desc = "Second"
e2.save()
url = urlreverse('ietf.sync.views.rfceditor_undo')
login_testing_unauthorized(self, "rfc", url)
# get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
self.assertTrue(e.doc_id in r.content)
self.assertTrue(e2.doc_id in r.content)
# delete
# delete e2
deleted_before = DeletedEvent.objects.count()
r = self.client.post(url, dict(event=e.id))
r = self.client.post(url, dict(event=e2.id))
self.assertEquals(r.status_code, 302)
self.assertEquals(StateDocEvent.objects.filter(id=e.id).count(), 0)
self.assertEquals(StateDocEvent.objects.filter(id=e2.id).count(), 0)
self.assertEquals(draft.get_state("draft-rfceditor").slug, "auth")
self.assertEquals(DeletedEvent.objects.count(), deleted_before + 1)
# delete e1
r = self.client.post(url, dict(event=e1.id))
self.assertEquals(draft.get_state("draft-rfceditor"), None)
# let's just test we can recover
e = DeletedEvent.objects.all().order_by("-time")[0]
e.content_type.model_class().objects.create(**json.loads(e.json))
self.assertEquals(draft.latest_event(type="changed_state").desc, "Test")
self.assertTrue(StateDocEvent.objects.filter(desc="First", doc=draft))

View file

@ -120,6 +120,16 @@ def rfceditor_undo(request):
except StateDocEvent.DoesNotExist:
return HttpResponse("Event does not exist")
doc = e.doc
# possibly reset the state of the document
all_events = StateDocEvent.objects.filter(doc=doc, state_type="draft-rfceditor").order_by("-time", "-id")
if all_events and all_events[0] == e:
if len(all_events) > 1:
doc.set_state(all_events[1].state)
else:
doc.unset_state("draft-rfceditor")
dump = DeletedEvent()
dump.content_type = ContentType.objects.get_for_model(type(e))
dump.json = json.dumps(object_as_shallow_dict(e), indent=2)