Repository: ietf-tools/datatracker

Issue:
Additional Resources field missing from datatracker listing for drafts
### Describe the issue

Previously it was possible to view and edit the "Additional Resources" for a draft or RFC. This field is no longer being displayed when a draft is viewed in the datatracker. An example is https://datatracker.ietf.org/doc/draft-eckel-edm-find-code/. Both a GitHub repository for the draft and an example implementation are specified as Additional Resources, but this information is not displayed.

### Code of Conduct

- [X] I agree to follow the [IETF's Code of Conduct](https://github.com/ietf-tools/.github/blob/main/CODE_OF_CONDUCT.md)


Discussion:
I think this may have been broken at #4825.

If you have one handy, could you also point to a draft that hasn't expired?

cc: @larseggert 
https://datatracker.ietf.org/doc/draft-ietf-opsawg-ipfix-srv6-srh/ is an example of a draft that has not expired and has Additional Resource that are not being displayed.

Resolving patch:
diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py
--- a/ietf/doc/factories.py
+++ b/ietf/doc/factories.py
@@ -14,14 +14,16 @@
 
 from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor,
     StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent,
-    DocumentActionHolder, BofreqEditorDocEvent, BofreqResponsibleDocEvent )
+    DocumentActionHolder, BofreqEditorDocEvent, BofreqResponsibleDocEvent, DocExtResource )
 from ietf.group.models import Group
 from ietf.person.factories import PersonFactory
 from ietf.group.factories import RoleFactory
+from ietf.name.models import ExtResourceName
 from ietf.utils.text import xslugify
 from ietf.utils.timezone import date_today
 
 
+
 def draft_name_generator(type_id,group,n):
         return '%s-%s-%s-%s%d'%( 
               type_id,
@@ -520,3 +522,12 @@ def states(obj, create, extracted, **kwargs):
                 obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug))
         else:
             obj.set_state(State.objects.get(type_id='procmaterials', slug='active'))
+
+class DocExtResourceFactory(factory.django.DjangoModelFactory):
+
+    name = factory.Iterator(ExtResourceName.objects.filter(type_id='url'))
+    value = factory.Faker('url')
+    doc = factory.SubFactory('ietf.doc.factories.BaseDocumentFactory')
+    class Meta:
+        model = DocExtResource
+


Test patch:
diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py
--- a/ietf/doc/tests.py
+++ b/ietf/doc/tests.py
@@ -40,7 +40,7 @@
     ConflictReviewFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory, 
     IndividualRfcFactory, StateDocEventFactory, BallotPositionDocEventFactory, 
     BallotDocEventFactory, DocumentAuthorFactory, NewRevisionDocEventFactory,
-    StatusChangeFactory, BofreqFactory)
+    StatusChangeFactory, BofreqFactory, DocExtResourceFactory)
 from ietf.doc.forms import NotifyForm
 from ietf.doc.fields import SearchableDocumentsField
 from ietf.doc.utils import create_ballot_if_not_open, uppercase_std_abbreviated_name
@@ -602,6 +602,8 @@ def test_document_draft(self):
         updated_by = IndividualDraftFactory()
         updated_by.relateddocument_set.create(relationship_id='updates',source=obsoleted_by,target=draft.docalias.first())
 
+        external_resource = DocExtResourceFactory(doc=draft)
+
         # these tests aren't testing all attributes yet, feel free to
         # expand them
 
@@ -622,6 +624,7 @@ def test_document_draft(self):
         self.assertNotContains(r, updated.title)
         self.assertNotContains(r, updated_by.canonical_name())
         self.assertNotContains(r, updated_by.title)
+        self.assertContains(r, external_resource.value)
 
         r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name)) + "?include_text=0")
         self.assertEqual(r.status_code, 200)