diff --git a/ietf/sync/tests.py b/ietf/sync/tests.py index bb6403124..aed7eb60a 100644 --- a/ietf/sync/tests.py +++ b/ietf/sync/tests.py @@ -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)) diff --git a/ietf/sync/views.py b/ietf/sync/views.py index e9d734676..47a372fbd 100644 --- a/ietf/sync/views.py +++ b/ietf/sync/views.py @@ -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)