From b2ebad11d5b82d9d47fe951f8f0a1623fda74ea8 Mon Sep 17 00:00:00 2001
From: Robert Sparks <rjsparks@nostrum.com>
Date: Mon, 10 Jul 2023 12:56:06 -0500
Subject: [PATCH] fix: repaired rfcdiff api endpoint

---
 ietf/api/tests.py | 16 ++++++++--------
 ietf/api/views.py | 23 +++++++++++++++++------
 2 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/ietf/api/tests.py b/ietf/api/tests.py
index f1333ccf7..5f350d94e 100644
--- a/ietf/api/tests.py
+++ b/ietf/api/tests.py
@@ -964,11 +964,11 @@ class RfcdiffSupportTests(TestCase):
 
     def do_rfc_test(self, draft_name):
         draft = WgDraftFactory(name=draft_name, create_revisions=range(0,2))
-        draft.docalias.create(name=f'rfc{self.next_rfc_number():04}')
+        rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number())
+        draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
         draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
         draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
-        draft = reload_db_objects(draft)
-        rfc = WgRfcFactory(group=draft.group)  # todo link this with its pre-publication draft
+        draft, rfc = reload_db_objects(draft, rfc)
 
         number = rfc.rfc_number
         received = self.getJson(dict(name=number))
@@ -976,7 +976,7 @@ class RfcdiffSupportTests(TestCase):
             received,
             dict(
                 content_url=rfc.get_href(),
-                name=rfc.canonical_name(),
+                name=rfc.name,
                 previous=f'{draft.name}-{draft.rev}',
                 previous_url= draft.history_set.get(rev=draft.rev).get_href(),
             ),
@@ -1016,11 +1016,11 @@ class RfcdiffSupportTests(TestCase):
 
     def test_rfc_with_tombstone(self):
         draft = WgDraftFactory(create_revisions=range(0,2))
-        draft.docalias.create(name='rfc3261') # See views_doc.HAS_TOMBSTONE
+        rfc = WgRfcFactory(rfc_number=3261,group=draft.group)# See views_doc.HAS_TOMBSTONE
+        draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
         draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
         draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
         draft = reload_db_objects(draft)
-        rfc = draft
 
         # Some old rfcs had tombstones that shouldn't be used for comparisons
         received = self.getJson(dict(name=rfc.canonical_name()))
@@ -1028,11 +1028,11 @@ class RfcdiffSupportTests(TestCase):
 
     def do_rfc_with_broken_history_test(self, draft_name):
         draft = WgDraftFactory(rev='10', name=draft_name)
-        draft.docalias.create(name=f'rfc{self.next_rfc_number():04}')
+        rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number())
+        draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
         draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
         draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
         draft = reload_db_objects(draft)
-        rfc = draft
 
         received = self.getJson(dict(name=draft.name))
         self.assertEqual(
diff --git a/ietf/api/views.py b/ietf/api/views.py
index 387924976..45becbd72 100644
--- a/ietf/api/views.py
+++ b/ietf/api/views.py
@@ -327,17 +327,28 @@ def get_previous_url(name, rev=None):
 def rfcdiff_latest_json(request, name, rev=None):
     response = dict()
     condition, document, history, found_rev = find_doc_for_rfcdiff(name, rev)
-
+    if document.type_id == "rfc":
+        draft_alias = next(iter(document.related_that('became_rfc')), None)
     if condition == 'no such document':
         raise Http404
     elif condition in ('historic version', 'current version'):
         doc = history if history else document
-        if not found_rev and doc.type_id == "rfc":
-            response['content_url'] = doc.get_href()
-            response['name']=doc.canonical_name()
-            if doc.name != doc.canonical_name():
+        if doc.type_id == "rfc":
+                response['content_url'] = doc.get_href()
+                response['name']=doc.name
+                if draft_alias:
+                    draft = draft_alias.document
+                    prev_rev = draft.rev
+                    if doc.rfc_number in HAS_TOMBSTONE and prev_rev != '00':
+                        prev_rev = f'{(int(draft.rev)-1):02d}'
+                    response['previous'] = f'{draft.name}-{prev_rev}'
+                    response['previous_url'] = get_previous_url(draft.name, prev_rev)            
+        elif doc.type_id == "draft" and not found_rev and doc.relateddocument_set.filter(relationship_id="became_rfc").exists():
+                rfc = doc.related_that_doc("became_rfc")[0].document
+                response['content_url'] = rfc.get_href()
+                response['name']=rfc.name
                 prev_rev = doc.rev
-                if doc.rfc_number in HAS_TOMBSTONE and prev_rev != '00':
+                if rfc.rfc_number in HAS_TOMBSTONE and prev_rev != '00':
                     prev_rev = f'{(int(doc.rev)-1):02d}'
                 response['previous'] = f'{doc.name}-{prev_rev}'
                 response['previous_url'] = get_previous_url(doc.name, prev_rev)