Skip to content
Merged
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
57 changes: 57 additions & 0 deletions ietf/ipr/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@


import datetime
import json
from unittest import mock
import re

Expand All @@ -15,6 +16,8 @@
from django.urls import reverse as urlreverse
from django.utils import timezone

from django.db.models import Max

import debug # pyflakes:ignore

from ietf.api.views import EmailIngestionError
Expand Down Expand Up @@ -45,6 +48,7 @@
from ietf.mailtrigger.utils import gather_address_lists
from ietf.message.factories import MessageFactory
from ietf.message.models import Message
from ietf.person.factories import PersonFactory
from ietf.utils.mail import outbox, empty_outbox, get_payload_text
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
from ietf.utils.text import text_to_dict
Expand Down Expand Up @@ -1113,3 +1117,56 @@ def test_patent_details_required_unless_blanket(self):
val = self.data.pop(pf)
self.assertTrue(HolderIprDisclosureForm(data=self.data).is_valid())
self.data[pf] = val

class JsonSnapshotTests(TestCase):
def test_json_snapshot(self):
h = HolderIprDisclosureFactory()
url = urlreverse("ietf.ipr.views.json_snapshot", kwargs=dict(id=h.id))
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
dump = json.loads(r.content)
self.assertCountEqual(
[o["model"] for o in dump],
["ipr.holderiprdisclosure", "ipr.iprdisclosurebase", "person.person"],
)
h.docs.add(WgRfcFactory())
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
dump = json.loads(r.content)
self.assertCountEqual(
[o["model"] for o in dump],
[
"ipr.holderiprdisclosure",
"ipr.iprdisclosurebase",
"ipr.iprdocrel",
"person.person",
],
)
IprEventFactory(
disclosure=h,
message=MessageFactory(by=PersonFactory()),
in_reply_to=MessageFactory(),
)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
dump = json.loads(r.content)
self.assertCountEqual(
[o["model"] for o in dump],
[
"ipr.holderiprdisclosure",
"ipr.iprdisclosurebase",
"ipr.iprdocrel",
"ipr.iprevent",
"message.message",
"message.message",
"person.person",
"person.person",
"person.person",
"person.person",
],
)
no_such_ipr_id = IprDisclosureBase.objects.aggregate(Max("id"))["id__max"] + 1
url = urlreverse("ietf.ipr.views.json_snapshot", kwargs=dict(id=no_such_ipr_id))
r = self.client.get(url)
self.assertEqual(r.status_code, 404)
1 change: 1 addition & 0 deletions ietf/ipr/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
url(r'^(?P<id>\d+)/notify/(?P<type>update|posted)/$', views.notify),
url(r'^(?P<id>\d+)/post/$', views.post),
url(r'^(?P<id>\d+)/state/$', views.state),
url(r'^(?P<id>\d+)/json-snapshot/$', views.json_snapshot),
url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ietf.ipr.views.showlist'), permanent=True)),
url(r'^update/(?P<id>\d+)/$', views.update),
url(r'^new-(?P<_type>(specific|generic|general|third-party))/$', views.new),
Expand Down
24 changes: 22 additions & 2 deletions ietf/ipr/utils.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
# Copyright The IETF Trust 2014-2020, All Rights Reserved
# Copyright The IETF Trust 2014-2025, All Rights Reserved
# -*- coding: utf-8 -*-

import json
import debug # pyflakes:ignore

from textwrap import dedent

from django.core import serializers

from ietf.ipr.mail import process_response_email, UndeliverableIprResponseError

import debug # pyflakes:ignore
from ietf.ipr.models import IprDocRel

def get_genitive(name):
"""Return the genitive form of name"""
Expand Down Expand Up @@ -85,3 +90,18 @@ def ingest_response_email(message: bytes):
email_original_message=message,
email_attach_traceback=True,
) from err

def json_dump_disclosure(disclosure):
objs = set()
objs.add(disclosure)
objs.add(disclosure.iprdisclosurebase_ptr)
objs.add(disclosure.by)
objs.update(IprDocRel.objects.filter(disclosure=disclosure))
objs.update(disclosure.iprevent_set.all())
objs.update([i.by for i in disclosure.iprevent_set.all()])
objs.update([i.message for i in disclosure.iprevent_set.all() if i.message ])
objs.update([i.message.by for i in disclosure.iprevent_set.all() if i.message ])
objs.update([i.in_reply_to for i in disclosure.iprevent_set.all() if i.in_reply_to ])
objs.update([i.in_reply_to.by for i in disclosure.iprevent_set.all() if i.in_reply_to ])
objs = sorted(list(objs),key=lambda o:o.__class__.__name__)
return json.dumps(json.loads(serializers.serialize("json",objs)),indent=4)
7 changes: 6 additions & 1 deletion ietf/ipr/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
NonDocSpecificIprDisclosure, IprDocRel,
RelatedIpr,IprEvent)
from ietf.ipr.utils import (get_genitive, get_ipr_summary,
iprs_from_docs, related_docs)
iprs_from_docs, json_dump_disclosure, related_docs)
from ietf.mailtrigger.utils import gather_address_lists
from ietf.message.models import Message
from ietf.message.utils import infer_message
Expand Down Expand Up @@ -901,3 +901,8 @@ def update(request, id):
child = ipr.get_child()
type = class_to_type[child.__class__.__name__]
return new(request, type, updates=id)

@role_required("Secretariat")
def json_snapshot(request, id):
obj = get_object_or_404(IprDisclosureBase,id=id).get_child()
return HttpResponse(json_dump_disclosure(obj),content_type="application/json")
Loading