|
1 | | -# Copyright The IETF Trust 2009-2020, All Rights Reserved |
| 1 | +# Copyright The IETF Trust 2009-2023, All Rights Reserved |
2 | 2 | # -*- coding: utf-8 -*- |
3 | 3 |
|
4 | 4 |
|
|
16 | 16 | import debug # pyflakes:ignore |
17 | 17 |
|
18 | 18 | from ietf.doc.models import DocAlias |
19 | | -from ietf.doc.factories import DocumentFactory, WgDraftFactory, WgRfcFactory |
| 19 | +from ietf.doc.factories import ( |
| 20 | + DocumentFactory, |
| 21 | + WgDraftFactory, |
| 22 | + WgRfcFactory, |
| 23 | + NewRevisionDocEventFactory |
| 24 | +) |
20 | 25 | from ietf.group.factories import RoleFactory |
21 | | -from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory |
| 26 | +from ietf.ipr.factories import ( |
| 27 | + HolderIprDisclosureFactory, |
| 28 | + GenericIprDisclosureFactory, |
| 29 | + IprDocRelFactory, |
| 30 | + IprEventFactory |
| 31 | +) |
22 | 32 | from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails, |
23 | 33 | get_pseudo_submitter, get_holders, get_update_cc_addrs) |
24 | 34 | from ietf.ipr.models import (IprDisclosureBase,GenericIprDisclosure,HolderIprDisclosure, |
25 | 35 | ThirdPartyIprDisclosure) |
| 36 | +from ietf.ipr.templatetags.ipr_filters import no_revisions_message |
26 | 37 | from ietf.ipr.utils import get_genitive, get_ipr_summary |
27 | 38 | from ietf.mailtrigger.utils import gather_address_lists |
28 | 39 | from ietf.message.models import Message |
@@ -305,6 +316,38 @@ def test_new_specific(self): |
305 | 316 | r = self.client.post(url, data) |
306 | 317 | self.assertContains(r, "Your IPR disclosure has been submitted", msg_prefix="Checked patent number: %s" % patent_number) |
307 | 318 |
|
| 319 | + def test_new_specific_no_revision(self): |
| 320 | + draft = WgDraftFactory() |
| 321 | + WgRfcFactory() |
| 322 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 323 | + |
| 324 | + # successful post |
| 325 | + empty_outbox() |
| 326 | + data = { |
| 327 | + "holder_legal_name": "Test Legal", |
| 328 | + "holder_contact_name": "Test Holder", |
| 329 | + "holder_contact_email": "test@holder.com", |
| 330 | + "holder_contact_info": "555-555-0100", |
| 331 | + "ietfer_name": "Test Participant", |
| 332 | + "ietfer_contact_info": "555-555-0101", |
| 333 | + "iprdocrel_set-TOTAL_FORMS": 2, |
| 334 | + "iprdocrel_set-INITIAL_FORMS": 0, |
| 335 | + "iprdocrel_set-0-document": draft.docalias.first().pk, |
| 336 | + "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk, |
| 337 | + "patent_number": "SE12345678901", |
| 338 | + "patent_inventor": "A. Nonymous", |
| 339 | + "patent_title": "A method of transferring bits", |
| 340 | + "patent_date": "2000-01-01", |
| 341 | + "has_patent_pending": False, |
| 342 | + "licensing": "royalty-free", |
| 343 | + "submitter_name": "Test Holder", |
| 344 | + "submitter_email": "test@holder.com", |
| 345 | + } |
| 346 | + r = self.client.post(url, data) |
| 347 | + self.assertEqual(r.status_code, 200) |
| 348 | + q = PyQuery(r.content) |
| 349 | + self.assertTrue(q("#id_iprdocrel_set-0-revisions").hasClass("is-invalid")) |
| 350 | + |
308 | 351 | def test_new_thirdparty(self): |
309 | 352 | """Add a new third-party disclosure. Note: submitter does not need to be logged in. |
310 | 353 | """ |
@@ -761,4 +804,64 @@ def test_docevent_creation(self): |
761 | 804 | removed_docevent = doc.docevent_set.filter(type='removed_related_ipr').first() |
762 | 805 | self.assertIn(ipr.title, removed_docevent.desc, |
763 | 806 | 'IprDisclosure title does not appear in DocEvent desc when removed') |
| 807 | + |
| 808 | + def test_no_revisions_message(self): |
| 809 | + draft = WgDraftFactory(rev="02") |
| 810 | + now = timezone.now() |
| 811 | + for rev in range(0,3): |
| 812 | + NewRevisionDocEventFactory(doc=draft, rev=f"{rev:02d}", time=now-datetime.timedelta(days=30*(2-rev))) |
764 | 813 |
|
| 814 | + # Disclosure has non-empty revisions field on its related draft |
| 815 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first()) |
| 816 | + IprEventFactory(type_id="posted",time=now,disclosure=iprdocrel.disclosure) |
| 817 | + self.assertEqual( |
| 818 | + no_revisions_message(iprdocrel), |
| 819 | + "" |
| 820 | + ) |
| 821 | + |
| 822 | + # Disclosure has more than one revision, none called out, disclosure after submissions |
| 823 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first(), revisions="") |
| 824 | + IprEventFactory(type_id="posted",time=now,disclosure=iprdocrel.disclosure) |
| 825 | + self.assertEqual( |
| 826 | + no_revisions_message(iprdocrel), |
| 827 | + "No revisions for this Internet-Draft were specified in this disclosure. The Internet-Draft's revision was 02 at the time this disclosure was posted. Contact the discloser or patent holder if there are questions about which revisions this disclosure pertains to." |
| 828 | + ) |
| 829 | + |
| 830 | + # Disclosure has more than one revision, none called out, disclosure after 01 |
| 831 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first(), revisions="") |
| 832 | + e = IprEventFactory(type_id="posted",disclosure=iprdocrel.disclosure) |
| 833 | + e.time = now-datetime.timedelta(days=15) |
| 834 | + e.save() |
| 835 | + self.assertEqual( |
| 836 | + no_revisions_message(iprdocrel), |
| 837 | + "No revisions for this Internet-Draft were specified in this disclosure. The Internet-Draft's revision was 01 at the time this disclosure was posted. Contact the discloser or patent holder if there are questions about which revisions this disclosure pertains to." |
| 838 | + ) |
| 839 | + |
| 840 | + # Disclosure has more than one revision, none called out, disclosure was before the 00 |
| 841 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first(), revisions="") |
| 842 | + e = IprEventFactory(type_id="posted",disclosure=iprdocrel.disclosure) |
| 843 | + e.time = now-datetime.timedelta(days=180) |
| 844 | + e.save() |
| 845 | + self.assertEqual( |
| 846 | + no_revisions_message(iprdocrel), |
| 847 | + "No revisions for this Internet-Draft were specified in this disclosure. The Internet-Draft's initial submission was after this disclosure was posted. Contact the discloser or patent holder if there are questions about which revisions this disclosure pertains to." |
| 848 | + ) |
| 849 | + |
| 850 | + # disclosed draft has no NewRevisionDocEvents |
| 851 | + draft = WgDraftFactory(rev="20") |
| 852 | + draft.docevent_set.all().delete() |
| 853 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first(), revisions="") |
| 854 | + IprEventFactory(type_id="posted",disclosure=iprdocrel.disclosure) |
| 855 | + self.assertEqual( |
| 856 | + no_revisions_message(iprdocrel), |
| 857 | + "No revisions for this Internet-Draft were specified in this disclosure. The Internet-Draft's revision at the time this disclosure was posted could not be determined. Contact the discloser or patent holder if there are questions about which revisions this disclosure pertains to." |
| 858 | + ) |
| 859 | + |
| 860 | + # disclosed draft has only one revision |
| 861 | + draft = WgDraftFactory(rev="00") |
| 862 | + iprdocrel = IprDocRelFactory(document=draft.docalias.first(), revisions="") |
| 863 | + IprEventFactory(type_id="posted",disclosure=iprdocrel.disclosure) |
| 864 | + self.assertEqual( |
| 865 | + no_revisions_message(iprdocrel), |
| 866 | + "No revisions for this Internet-Draft were specified in this disclosure. However, there is only one revision of this Internet-Draft." |
| 867 | + ) |
0 commit comments