Skip to content

Commit f39d156

Browse files
committed
Add submitted and posted dates to several ipr notification email messages. Fixes ietf-tools#2807. Commit ready for merge.
- Legacy-Id: 16853
1 parent 6375aa3 commit f39d156

6 files changed

Lines changed: 76 additions & 18 deletions

File tree

ietf/ipr/factories.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from ietf.ipr.models import (
1212
IprDisclosureBase, HolderIprDisclosure, ThirdPartyIprDisclosure, NonDocSpecificIprDisclosure,
13-
GenericIprDisclosure, IprDocRel, RelatedIpr
13+
GenericIprDisclosure, IprDocRel, RelatedIpr, IprEvent
1414
)
1515

1616
def _fake_patent_info():
@@ -85,3 +85,12 @@ class Meta:
8585
holder_contact_email = factory.Faker('email')
8686
holder_contact_name = factory.Faker('name')
8787

88+
class IprEventFactory(factory.DjangoModelFactory):
89+
class Meta:
90+
model = IprEvent
91+
92+
type_id = 'submitted'
93+
by = factory.SubFactory('ietf.person.factories.PersonFactory')
94+
disclosure = factory.SubFactory(IprDisclosureBaseFactory)
95+
desc = factory.Faker('sentence')
96+

ietf/ipr/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ def get_latest_event_msgout(self):
5656
"""Returns the latest IprEvent of type msgout. For use in templates."""
5757
return self.latest_event(type='msgout')
5858

59+
def get_latest_event_submitted(self):
60+
return self.latest_event(type='submitted')
61+
62+
def get_latest_event_posted(self):
63+
return self.latest_event(type='posted')
64+
5965
def has_legacy_event(self):
6066
"""Returns True if there is one or more LegacyMigrationIprEvents
6167
for this disclosure"""

ietf/ipr/tests.py

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
from ietf.doc.models import DocAlias
1818
from ietf.doc.factories import DocumentFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory
19-
from ietf.ipr.factories import HolderIprDisclosureFactory
19+
from ietf.group.factories import RoleFactory
20+
from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory
2021
from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails,
2122
get_pseudo_submitter, get_holders, get_update_cc_addrs)
2223
from ietf.ipr.models import (IprDisclosureBase,GenericIprDisclosure,HolderIprDisclosure,
@@ -29,6 +30,24 @@
2930
from ietf.utils.text import text_to_dict
3031

3132

33+
def extract_message_content(message):
34+
return message.get_payload(decode=True).decode(str(message.get_charset()))
35+
36+
def make_data_from_content(content):
37+
q = PyQuery(content)
38+
data = dict()
39+
for name in ['form-TOTAL_FORMS','form-INITIAL_FORMS','form-MIN_NUM_FORMS','form-MAX_NUM_FORMS']:
40+
data[name] = q('form input[name=%s]'%name).val()
41+
for i in range(0,int(data['form-TOTAL_FORMS'])):
42+
name = 'form-%d-type' % i
43+
data[name] = q('form input[name=%s]'%name).val()
44+
text_name = 'form-%d-text' % i
45+
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
46+
# Do not try to use
47+
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
48+
# .text does not work - the field will likely contain <> characters
49+
return data
50+
3251
class IprTests(TestCase):
3352
def setUp(self):
3453
pass
@@ -527,8 +546,24 @@ def test_admin_parked(self):
527546
pass
528547

529548
def test_post(self):
549+
ipr = HolderIprDisclosureFactory(state_id='pending')
550+
url = urlreverse('ietf.ipr.views.state', kwargs={'id':ipr.id})
551+
login_testing_unauthorized(self,"secretary",url)
552+
r = self.client.get(url)
553+
self.assertEqual(r.status_code, 200)
554+
r = self.client.post(url,{'state':'posted'})
555+
self.assertEqual(r.status_code, 302)
556+
ipr = HolderIprDisclosure.objects.get(id=ipr.id)
557+
self.assertTrue(ipr.iprevent_set.filter(type='posted').exists())
558+
559+
def test_notify(self):
530560
doc = WgDraftFactory(group__acronym='mars-wg', name='draft-ietf-mars-test')
531-
ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com')
561+
old_ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com')
562+
IprEventFactory(type_id='submitted', disclosure=old_ipr)
563+
IprEventFactory(type_id='posted', disclosure=old_ipr)
564+
ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com', updates=[old_ipr])
565+
IprEventFactory(type_id='submitted', disclosure=ipr)
566+
IprEventFactory(type_id='posted', disclosure=ipr)
532567
url = urlreverse('ietf.ipr.views.post', kwargs={ "id": ipr.id })
533568
login_testing_unauthorized(self, "secretary", url)
534569

@@ -543,24 +578,32 @@ def test_post(self):
543578
self.assertEqual(ipr.state.slug,'posted')
544579
url = urlreverse('ietf.ipr.views.notify',kwargs={ 'id':ipr.id, 'type':'posted'})
545580
r = self.client.get(url,follow=True)
546-
q = PyQuery(r.content)
547-
data = dict()
548-
for name in ['form-TOTAL_FORMS','form-INITIAL_FORMS','form-MIN_NUM_FORMS','form-MAX_NUM_FORMS']:
549-
data[name] = q('form input[name=%s]'%name).val()
550-
for i in range(0,int(data['form-TOTAL_FORMS'])):
551-
name = 'form-%d-type' % i
552-
data[name] = q('form input[name=%s]'%name).val()
553-
text_name = 'form-%d-text' % i
554-
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
555-
# Do not try to use
556-
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
557-
# .text does not work - the field will likely contain <> characters
581+
self.assertEqual(r.status_code,200)
582+
data = make_data_from_content(r.content)
558583
r = self.client.post(url, data )
559584
self.assertEqual(r.status_code,302)
560585
self.assertEqual(len(outbox),len_before+2)
561586
self.assertTrue('george@acme.com' in outbox[len_before]['To'])
587+
self.assertIn('posted on '+datetime.date.today().strftime("%Y-%m-%d"), extract_message_content(outbox[len_before]).replace('\n',' '))
562588
self.assertTrue('draft-ietf-mars-test@ietf.org' in outbox[len_before+1]['To'])
563589
self.assertTrue('mars-wg@ietf.org' in outbox[len_before+1]['Cc'])
590+
self.assertIn('Secretariat on '+ipr.get_latest_event_submitted().time.strftime("%Y-%m-%d"), extract_message_content(outbox[len_before+1]).replace('\n',' '))
591+
592+
def test_notify_generic(self):
593+
RoleFactory(name_id='ad',group__acronym='gen')
594+
ipr = GenericIprDisclosureFactory(submitter_email='foo@example.com')
595+
IprEventFactory(type_id='submitted', disclosure=ipr)
596+
IprEventFactory(type_id='posted', disclosure=ipr)
597+
url = urlreverse('ietf.ipr.views.notify',kwargs={ 'id':ipr.id, 'type':'posted'})
598+
empty_outbox()
599+
login_testing_unauthorized(self, 'secretary', url)
600+
r = self.client.get(url, follow=True)
601+
self.assertTrue(r.status_code, 200)
602+
data = make_data_from_content(r.content)
603+
r = self.client.post(url, data )
604+
self.assertEqual(r.status_code,302)
605+
self.assertEqual(len(outbox),2)
606+
self.assertIn('Secretariat on '+ipr.get_latest_event_submitted().time.strftime("%Y-%m-%d"), extract_message_content(outbox[1]).replace('\n',' '))
564607

565608
def test_process_response_email(self):
566609
# first send a mail

ietf/templates/ipr/posted_document_email.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Cc: {{ cc_email }}
66
Dear {{ to_name }}:
77

88
{% filter wordwrap:78 %}
9-
An IPR disclosure that pertains to your {{ doc_info }} was submitted to the IETF Secretariat on {{ ipr.submitted_date|date:"Y-m-d" }} and has been posted on the "IETF Page of Intellectual Property Rights Disclosures" (https://datatracker.ietf.org/ipr/{{ ipr.pk }}/). The title of the IPR disclosure is "{{ ipr.title }}"
9+
An IPR disclosure that pertains to your {{ doc_info }} was submitted to the IETF Secretariat on {{ ipr.get_latest_event_submitted.time|date:"Y-m-d" }} and has been posted on the "IETF Page of Intellectual Property Rights Disclosures" (https://datatracker.ietf.org/ipr/{{ ipr.pk }}/). The title of the IPR disclosure is "{{ ipr.title }}"
1010
{% endfilter %}
1111

1212
Thank you

ietf/templates/ipr/posted_generic_email.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Cc:
55

66
Dear {{ to_name }}:
77

8-
A generic IPR disclosure was submitted to the IETF Secretariat on {{ ipr.submitted_date|date:"Y-m-d" }}
8+
A generic IPR disclosure was submitted to the IETF Secretariat on {{ ipr.get_latest_event_submitted.time|date:"Y-m-d" }}
99
and has been posted on the "IETF Page of Intellectual Property Rights Disclosures"
1010
(https://datatracker.ietf.org/ipr/). The title of the IPR disclosure is
1111
{{ ipr.title }}.

ietf/templates/ipr/posted_submitter_email.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ has been posted on the "IETF Page of Intellectual Property Rights Disclosures"
1111
Your IPR disclosure updates:
1212

1313
{% for rel in ipr.updates %}
14-
IPR disclosure ID #{{ rel.target.pk }}, "{{ rel.target.title }}", which was posted on {{ rel.target.submitted_date }}
14+
IPR disclosure ID #{{ rel.target.pk }}, "{{ rel.target.title }}", which was posted on {{ rel.target.get_latest_event_posted.time|date:"Y-m-d" }}
1515
{% endfor %}
1616
{% endif %}
1717

0 commit comments

Comments
 (0)