Merged in [16853] from rjsparks@nostrum.com:

Add submitted and posted dates to several ipr notification email messages. Fixes #2807.
 - Legacy-Id: 16899
Note: SVN reference [16853] has been migrated to Git commit f39d1568f0c4a8f4b1ebd3dee887fff6b3d8049b
This commit is contained in:
Henrik Levkowetz 2019-10-22 12:23:07 +00:00
parent 286ee2f961
commit a4e49d8ec0
6 changed files with 76 additions and 18 deletions

View file

@ -10,7 +10,7 @@ import factory
from ietf.ipr.models import (
IprDisclosureBase, HolderIprDisclosure, ThirdPartyIprDisclosure, NonDocSpecificIprDisclosure,
GenericIprDisclosure, IprDocRel, RelatedIpr
GenericIprDisclosure, IprDocRel, RelatedIpr, IprEvent
)
def _fake_patent_info():
@ -85,3 +85,12 @@ class GenericIprDisclosureFactory(IprDisclosureBaseFactory):
holder_contact_email = factory.Faker('email')
holder_contact_name = factory.Faker('name')
class IprEventFactory(factory.DjangoModelFactory):
class Meta:
model = IprEvent
type_id = 'submitted'
by = factory.SubFactory('ietf.person.factories.PersonFactory')
disclosure = factory.SubFactory(IprDisclosureBaseFactory)
desc = factory.Faker('sentence')

View file

@ -56,6 +56,12 @@ class IprDisclosureBase(models.Model):
"""Returns the latest IprEvent of type msgout. For use in templates."""
return self.latest_event(type='msgout')
def get_latest_event_submitted(self):
return self.latest_event(type='submitted')
def get_latest_event_posted(self):
return self.latest_event(type='posted')
def has_legacy_event(self):
"""Returns True if there is one or more LegacyMigrationIprEvents
for this disclosure"""

View file

@ -16,7 +16,8 @@ import debug # pyflakes:ignore
from ietf.doc.models import DocAlias
from ietf.doc.factories import DocumentFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory
from ietf.ipr.factories import HolderIprDisclosureFactory
from ietf.group.factories import RoleFactory
from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory
from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails,
get_pseudo_submitter, get_holders, get_update_cc_addrs)
from ietf.ipr.models import (IprDisclosureBase,GenericIprDisclosure,HolderIprDisclosure,
@ -29,6 +30,24 @@ from ietf.utils.test_utils import TestCase, login_testing_unauthorized
from ietf.utils.text import text_to_dict
def extract_message_content(message):
return message.get_payload(decode=True).decode(str(message.get_charset()))
def make_data_from_content(content):
q = PyQuery(content)
data = dict()
for name in ['form-TOTAL_FORMS','form-INITIAL_FORMS','form-MIN_NUM_FORMS','form-MAX_NUM_FORMS']:
data[name] = q('form input[name=%s]'%name).val()
for i in range(0,int(data['form-TOTAL_FORMS'])):
name = 'form-%d-type' % i
data[name] = q('form input[name=%s]'%name).val()
text_name = 'form-%d-text' % i
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
# Do not try to use
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
# .text does not work - the field will likely contain <> characters
return data
class IprTests(TestCase):
def setUp(self):
pass
@ -527,8 +546,24 @@ I would like to revoke this declaration.
pass
def test_post(self):
ipr = HolderIprDisclosureFactory(state_id='pending')
url = urlreverse('ietf.ipr.views.state', kwargs={'id':ipr.id})
login_testing_unauthorized(self,"secretary",url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
r = self.client.post(url,{'state':'posted'})
self.assertEqual(r.status_code, 302)
ipr = HolderIprDisclosure.objects.get(id=ipr.id)
self.assertTrue(ipr.iprevent_set.filter(type='posted').exists())
def test_notify(self):
doc = WgDraftFactory(group__acronym='mars-wg', name='draft-ietf-mars-test')
ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com')
old_ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com')
IprEventFactory(type_id='submitted', disclosure=old_ipr)
IprEventFactory(type_id='posted', disclosure=old_ipr)
ipr = HolderIprDisclosureFactory(docs=[doc,], submitter_email='george@acme.com', updates=[old_ipr])
IprEventFactory(type_id='submitted', disclosure=ipr)
IprEventFactory(type_id='posted', disclosure=ipr)
url = urlreverse('ietf.ipr.views.post', kwargs={ "id": ipr.id })
login_testing_unauthorized(self, "secretary", url)
@ -543,24 +578,32 @@ I would like to revoke this declaration.
self.assertEqual(ipr.state.slug,'posted')
url = urlreverse('ietf.ipr.views.notify',kwargs={ 'id':ipr.id, 'type':'posted'})
r = self.client.get(url,follow=True)
q = PyQuery(r.content)
data = dict()
for name in ['form-TOTAL_FORMS','form-INITIAL_FORMS','form-MIN_NUM_FORMS','form-MAX_NUM_FORMS']:
data[name] = q('form input[name=%s]'%name).val()
for i in range(0,int(data['form-TOTAL_FORMS'])):
name = 'form-%d-type' % i
data[name] = q('form input[name=%s]'%name).val()
text_name = 'form-%d-text' % i
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
# Do not try to use
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
# .text does not work - the field will likely contain <> characters
self.assertEqual(r.status_code,200)
data = make_data_from_content(r.content)
r = self.client.post(url, data )
self.assertEqual(r.status_code,302)
self.assertEqual(len(outbox),len_before+2)
self.assertTrue('george@acme.com' in outbox[len_before]['To'])
self.assertIn('posted on '+datetime.date.today().strftime("%Y-%m-%d"), extract_message_content(outbox[len_before]).replace('\n',' '))
self.assertTrue('draft-ietf-mars-test@ietf.org' in outbox[len_before+1]['To'])
self.assertTrue('mars-wg@ietf.org' in outbox[len_before+1]['Cc'])
self.assertIn('Secretariat on '+ipr.get_latest_event_submitted().time.strftime("%Y-%m-%d"), extract_message_content(outbox[len_before+1]).replace('\n',' '))
def test_notify_generic(self):
RoleFactory(name_id='ad',group__acronym='gen')
ipr = GenericIprDisclosureFactory(submitter_email='foo@example.com')
IprEventFactory(type_id='submitted', disclosure=ipr)
IprEventFactory(type_id='posted', disclosure=ipr)
url = urlreverse('ietf.ipr.views.notify',kwargs={ 'id':ipr.id, 'type':'posted'})
empty_outbox()
login_testing_unauthorized(self, 'secretary', url)
r = self.client.get(url, follow=True)
self.assertTrue(r.status_code, 200)
data = make_data_from_content(r.content)
r = self.client.post(url, data )
self.assertEqual(r.status_code,302)
self.assertEqual(len(outbox),2)
self.assertIn('Secretariat on '+ipr.get_latest_event_submitted().time.strftime("%Y-%m-%d"), extract_message_content(outbox[1]).replace('\n',' '))
def test_process_response_email(self):
# first send a mail

View file

@ -6,7 +6,7 @@ Cc: {{ cc_email }}
Dear {{ to_name }}:
{% filter wordwrap:78 %}
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 }}"
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 }}"
{% endfilter %}
Thank you

View file

@ -5,7 +5,7 @@ Cc:
Dear {{ to_name }}:
A generic IPR disclosure was submitted to the IETF Secretariat on {{ ipr.submitted_date|date:"Y-m-d" }}
A generic IPR disclosure 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/). The title of the IPR disclosure is
{{ ipr.title }}.

View file

@ -11,7 +11,7 @@ has been posted on the "IETF Page of Intellectual Property Rights Disclosures"
Your IPR disclosure updates:
{% for rel in ipr.updates %}
IPR disclosure ID #{{ rel.target.pk }}, "{{ rel.target.title }}", which was posted on {{ rel.target.submitted_date }}
IPR disclosure ID #{{ rel.target.pk }}, "{{ rel.target.title }}", which was posted on {{ rel.target.get_latest_event_posted.time|date:"Y-m-d" }}
{% endfor %}
{% endif %}