diff --git a/fec/data/api_caller.py b/fec/data/api_caller.py index 42a724221..fdb1b1743 100644 --- a/fec/data/api_caller.py +++ b/fec/data/api_caller.py @@ -510,12 +510,12 @@ def _get_sorted_documents(ao): sorted_documents = sorted( ao["documents"], key=itemgetter("description", "document_id"), reverse=False ) - sorted_documents = sorted(sorted_documents, key=itemgetter("date"), reverse=True) + sorted_documents = sorted(sorted_documents, key=lambda doc: doc.get("date") or "", reverse=True) # Sort by document date unless it's a final opinion. Final opinion uses issue date. sorted_documents = sorted( sorted_documents, - key=lambda doc: doc.get("date") if doc.get("ao_doc_category_id") != 'F' else ao.get("issue_date"), + key=lambda doc: (ao.get("issue_date") if doc.get("ao_doc_category_id") == 'F' else doc.get("date")) or "", reverse=True ) diff --git a/fec/data/tests/test_legal_search.py b/fec/data/tests/test_legal_search.py index 12f01ed8b..c2bb5527a 100644 --- a/fec/data/tests/test_legal_search.py +++ b/fec/data/tests/test_legal_search.py @@ -1,5 +1,6 @@ import datetime +import unittest from unittest import mock import io import logging @@ -15,6 +16,34 @@ client = Client() +class TestLegalSearchUtils(unittest.TestCase): + def test_sort_ao_documents_handles_missing_issue_date(self): + ao = { + 'issue_date': None, + 'documents': [ + { + 'ao_doc_category_id': 'F', + 'date': '2024-01-15', + 'description': 'Final Opinion', + 'document_id': 2, + }, + { + 'ao_doc_category_id': 'R', + 'date': '2024-02-01', + 'description': 'Request', + 'document_id': 1, + }, + ], + } + + sorted_documents = api_caller._get_sorted_documents(ao) + + self.assertEqual( + [doc['description'] for doc in sorted_documents], + ['Request', 'Final Opinion'] + ) + + class TestLegalSearch(TestCase): # Test1 : OK diff --git a/fec/fec/static/js/legal-search-ao.js b/fec/fec/static/js/legal-search-ao.js index 329c1b770..aff1a7abb 100644 --- a/fec/fec/static/js/legal-search-ao.js +++ b/fec/fec/static/js/legal-search-ao.js @@ -368,7 +368,7 @@ LegalSearchAo.prototype.refreshTable = function(response) { newRow += `
- ${['Pending','Withdrawn'].includes(advisory_opinion.status) ? advisory_opinion.status : new Date(advisory_opinion.issue_date).toLocaleDateString('en-US', { month: '2-digit', day: '2-digit', year: 'numeric' })} + ${['Pending','Withdrawn'].includes(advisory_opinion.status) ? advisory_opinion.status : advisory_opinion.issue_date ? new Date(advisory_opinion.issue_date).toLocaleDateString('en-US', { month: '2-digit', day: '2-digit', year: 'numeric' }) : 'Not dated'}
`; newRow += ` diff --git a/fec/legal/templates/legal-advisory-opinion.jinja b/fec/legal/templates/legal-advisory-opinion.jinja index 8a4ca7b1a..ed4da6af4 100644 --- a/fec/legal/templates/legal-advisory-opinion.jinja +++ b/fec/legal/templates/legal-advisory-opinion.jinja @@ -43,7 +43,14 @@

Documents

{% if final_opinion %}
- Final opinion {{ final_opinion.date | date(fmt='%B %d, %Y') }} + Final opinion + + {% if advisory_opinion.issue_date %} + {{ advisory_opinion.issue_date | date(fmt='%B %d, %Y') }} + {% else %} + Not dated + {% endif %} +
{% endif %} diff --git a/fec/legal/templates/partials/legal-search-results-advisory-opinion.jinja b/fec/legal/templates/partials/legal-search-results-advisory-opinion.jinja index 45ab28c37..ab2f167ef 100644 --- a/fec/legal/templates/partials/legal-search-results-advisory-opinion.jinja +++ b/fec/legal/templates/partials/legal-search-results-advisory-opinion.jinja @@ -30,8 +30,10 @@ Pending {% elif advisory_opinion.status == "Withdrawn"%} Withdrawn - {% elif advisory_opinion.issue_date != undefined %} + {% elif advisory_opinion.issue_date %} {{ advisory_opinion.issue_date | date(fmt='%m/%d/%Y') }} + {% else %} + Not dated {% endif %} diff --git a/fec/legal/tests/test_legal.py b/fec/legal/tests/test_legal.py index 677f252af..f9e28c46b 100644 --- a/fec/legal/tests/test_legal.py +++ b/fec/legal/tests/test_legal.py @@ -59,6 +59,42 @@ def test_load_legal_mur(self, call_api): ]) +class TestAdvisoryOpinionPage(unittest.TestCase): + def setUp(self): + self.factory = RequestFactory() + + @mock.patch.object(api_caller, 'load_legal_advisory_opinion') + def test_advisory_opinion_page_handles_missing_issue_date(self, mock_load_ao): + final_opinion = { + 'ao_doc_category_id': 'F', + 'category': 'Final Opinion', + 'date': '2024-01-15', + 'description': 'Final Opinion', + 'document_id': 2, + 'url': '/files/legal/aos/2024-01/final.pdf', + } + mock_load_ao.return_value = { + 'no': '2024-01', + 'name': 'Test AO', + 'summary': 'Test summary', + 'issue_date': '', + 'documents': [final_opinion], + 'sorted_documents': [final_opinion], + 'entities': [], + 'statutory_citations': [], + 'regulatory_citations': [], + 'ao_citations': [], + 'aos_cited_by': [], + } + + request = self.factory.get('/data/legal/advisory-opinions/2024-01/') + response = views.advisory_opinion_page(request, '2024-01') + + self.assertEqual(response.status_code, 200) + self.assertIn(b'Final opinion', response.content) + self.assertIn(b'Not dated', response.content) + + class TestLegalDocumentRedirect(TestCase): def setUp(self): self.factory = RequestFactory()