Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions ietf/api/tests_views_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,3 +565,73 @@ def test_process_rpc_queue(self, mock_task_delay):
)
self.assertEqual(response.status_code, 202)
mock_task_delay.assert_called_once_with(queue_entries)

@override_settings(APP_API_TOKENS={"ietf.api.views_rpc": ["valid-token"]})
@mock.patch("ietf.api.views_rpc.update_rfc_json_task.delay")
def test_rfc_patch_triggers_json_update(self, mock_delay):
"""PATCHing RFC metadata dispatches update_rfc_json_task for that RFC."""
rfc = WgRfcFactory()
url = urlreverse(
"ietf.api.purple_api.rfc-detail", kwargs={"rfc_number": rfc.rfc_number}
)
patch_data = {"title": "Updated Title"}
with self.captureOnCommitCallbacks(execute=True):
r = self.client.patch(
url,
data=patch_data,
format="json",
headers={"X-Api-Key": "valid-token"},
)
self.assertEqual(r.status_code, 200)
mock_delay.assert_called_once_with([rfc.rfc_number])

@override_settings(APP_API_TOKENS={"ietf.api.views_rpc": ["valid-token"]})
@mock.patch("ietf.doc.tasks.signal_update_rfc_metadata_task.delay")
@mock.patch("ietf.api.views_rpc.update_rfc_json_task.delay")
def test_rfc_publish_triggers_related_json_update(
self, mock_json_delay, mock_signal_delay
):
"""Publishing an RFC that obsoletes/updates existing RFCs triggers JSON update for related RFCs only."""
url = urlreverse("ietf.api.purple_api.notify_rfc_published")
area = GroupFactory(type_id="area")
rfc_group = GroupFactory(type_id="wg")
draft = WgDraftFactory(group__parent=area, stream_id="ietf")
obsoletes = RfcFactory.create_batch(2)
updates = RfcFactory.create_batch(1)
unused_rfc_number = (
Document.objects.filter(rfc_number__isnull=False).aggregate(
unused_rfc_number=Max("rfc_number") + 1
)["unused_rfc_number"]
or 20000
)
post_data = {
"published": "2025-06-01T00:00:00Z",
"draft_name": draft.name,
"draft_rev": draft.rev,
"rfc_number": unused_rfc_number,
"title": "New RFC",
"authors": [],
"group": rfc_group.acronym,
"stream": "ietf",
"abstract": "Abstract.",
"pages": 10,
"std_level": "ps",
"obsoletes": [o.rfc_number for o in obsoletes],
"updates": [u.rfc_number for u in updates],
"subseries": [],
}
with self.captureOnCommitCallbacks(execute=True):
r = self.client.post(
url,
data=post_data,
format="json",
headers={"X-Api-Key": "valid-token"},
)
self.assertEqual(r.status_code, 200)

# JSON update fired only for related RFCs, not for the new RFC itself
expected_related = sorted(
{o.rfc_number for o in obsoletes} | {u.rfc_number for u in updates}
)
mock_json_delay.assert_called_once_with(expected_related)
self.assertNotIn(unused_rfc_number, mock_json_delay.call_args[0][0])
11 changes: 9 additions & 2 deletions ietf/api/views_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from tempfile import TemporaryDirectory

from django.conf import settings
from django.db import IntegrityError
from django.db import IntegrityError, transaction
from drf_spectacular.utils import OpenApiParameter
from rest_framework import mixins, parsers, serializers, viewsets, status
from rest_framework.decorators import action
Expand Down Expand Up @@ -48,7 +48,7 @@
)
from ietf.person.models import Email, Person
from ietf.sync.rfcindex import mark_rfcindex_as_dirty
from ietf.sync.tasks import process_rpc_queue_task
from ietf.sync.tasks import process_rpc_queue_task, update_rfc_json_task


class Conflict(APIException):
Expand Down Expand Up @@ -297,6 +297,8 @@ def perform_update(self, serializer):
desc="Metadata update from RFC Editor",
)
super().perform_update(serializer)
rfc_number = serializer.instance.rfc_number
transaction.on_commit(lambda: update_rfc_json_task.delay([rfc_number]))

@action(detail=False, serializer_class=OriginalStreamSerializer)
def rfc_original_stream(self, request):
Expand Down Expand Up @@ -457,6 +459,11 @@ def post(self, request):
)
rfc_number_list = sorted(set(rfc_number_list))
signal_update_rfc_metadata_task.delay(rfc_number_list=rfc_number_list)
related_numbers = sorted(
{d.rfc_number for d in rfc.related_that_doc(("updates", "obs"))}
)
if related_numbers:
transaction.on_commit(lambda: update_rfc_json_task.delay(related_numbers))
return Response(NotificationAckSerializer().data)


Expand Down
Loading
Loading