Merged in personal/rjs/v4.02_via_rfc containing [4356] which replaces code using the old via-rfc tag with code looking at the document stream (and more), and [4364] which adds document page counts on the future telechats page.
- Legacy-Id: 4482 Note: SVN reference [4356] has been migrated to Git commit4eabc033c1
Note: SVN reference [4364] has been migrated to Git commitb3c665287d
This commit is contained in:
commit
2b78e1573e
|
@ -407,7 +407,7 @@ class InternetDraft(Document):
|
|||
#via_rfc_editor = models.IntegerField(null=True, blank=True)
|
||||
@property
|
||||
def via_rfc_editor(self):
|
||||
return bool(self.tags.filter(slug='via-rfc'))
|
||||
return self.stream_id in ('ise','irtf')
|
||||
|
||||
#state_change_notice_to = models.CharField(blank=True, max_length=255)
|
||||
@property
|
||||
|
|
|
@ -154,19 +154,19 @@ class IdWrapper:
|
|||
return self.ietf_process != None
|
||||
|
||||
def submission(self):
|
||||
if self._idinternal and self._idinternal.via_rfc_editor:
|
||||
return "Via IRTF or RFC Editor"
|
||||
|
||||
if self._draft.stream_id != u'ietf':
|
||||
return self._draft.stream
|
||||
|
||||
if self._draft.group_id == Acronym.INDIVIDUAL_SUBMITTER:
|
||||
return "Individual"
|
||||
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
if self._draft.group and self._draft.group.type_id == "area":
|
||||
return u"Individual in %s area" % self._draft.group.acronym
|
||||
if self._draft.group and self._draft.group.type_id == "area":
|
||||
return u"Individual in %s area" % self._draft.group.acronym
|
||||
|
||||
a = self.group_acronym()
|
||||
if a:
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES and self._draft.stream_id == "ietf" and self._draft.get_state_slug("draft-stream-ietf") == "c-adopt":
|
||||
if self._draft.stream_id == "ietf" and self._draft.get_state_slug("draft-stream-ietf") == "c-adopt":
|
||||
return "candidate for <a href='/wg/%s/'>%s WG</a>" % (a, a)
|
||||
|
||||
return "<a href='/wg/%s/'>%s WG</a>" % (a, a)
|
||||
|
@ -176,7 +176,7 @@ class IdWrapper:
|
|||
|
||||
def search_archive(self):
|
||||
|
||||
if self._idinternal and self._idinternal.via_rfc_editor:
|
||||
if self._idinternal and self._idinternal.stream in ("IRTF","ISE"):
|
||||
return "www.ietf.org/mail-archive/web/"
|
||||
|
||||
if self._draft.group_id == Acronym.INDIVIDUAL_SUBMITTER or (settings.USE_DB_REDESIGN_PROXY_CLASSES and self._draft.group.type_id == "area"):
|
||||
|
@ -207,7 +207,7 @@ class IdWrapper:
|
|||
elif self.draft_name.startswith("draft-irtf-"):
|
||||
return 3
|
||||
elif self._idinternal:
|
||||
if self._idinternal.via_rfc_editor > 0:
|
||||
if self._idinternal.stream == "ISE":
|
||||
return 4
|
||||
else:
|
||||
return 1
|
||||
|
|
|
@ -142,7 +142,7 @@ def generate_approval_mail_rfc_editor(request, doc):
|
|||
DO_NOT_PUBLISH_IESG_STATES = ("nopubadw", "nopubanw")
|
||||
|
||||
def generate_approval_mailREDESIGN(request, doc):
|
||||
if doc.get_state_slug("draft-iesg") in DO_NOT_PUBLISH_IESG_STATES or doc.tags.filter(slug='via-rfc'):
|
||||
if doc.get_state_slug("draft-iesg") in DO_NOT_PUBLISH_IESG_STATES or doc.stream_id in ('ise','irtf'):
|
||||
mail = generate_approval_mail_rfc_editor(request, doc)
|
||||
else:
|
||||
mail = generate_approval_mail_approved(request, doc)
|
||||
|
|
|
@ -49,927 +49,10 @@ from ietf.utils.mail import outbox
|
|||
from ietf.ietfworkflows.models import Stream
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
class IdRfcUrlTestCase(SimpleUrlTestCase):
|
||||
def testUrls(self):
|
||||
self.doTestUrls(__file__)
|
||||
|
||||
class ChangeStateTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def test_change_state(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_change_state', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
state = draft.idinternal.cur_state
|
||||
substate = draft.idinternal.cur_sub_state
|
||||
next_states = IDNextState.objects.filter(cur_state=draft.idinternal.cur_state)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form select[name=state]')), 1)
|
||||
self.assertEquals(len(q('form select[name=substate]')), 1)
|
||||
|
||||
if next_states:
|
||||
self.assertTrue(len(q('.next-states form input[type=hidden]')) > 0)
|
||||
|
||||
|
||||
# faulty post
|
||||
r = self.client.post(url,
|
||||
dict(state="123456789", substate="987654531"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form ul.errorlist')) > 0)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.cur_state, state)
|
||||
|
||||
|
||||
# change state
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url,
|
||||
dict(state="12", substate=""))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.prev_state, state)
|
||||
self.assertEquals(draft.idinternal.prev_sub_state, substate)
|
||||
self.assertEquals(draft.idinternal.cur_state.document_state_id, 12)
|
||||
self.assertEquals(draft.idinternal.cur_sub_state, None)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("State changed" in draft.idinternal.comments()[0].comment_text)
|
||||
self.assertEquals(len(outbox), mailbox_before + 2)
|
||||
self.assertTrue("State Update Notice" in outbox[-2]['Subject'])
|
||||
self.assertTrue(draft.filename in outbox[-1]['Subject'])
|
||||
|
||||
|
||||
def test_request_last_call(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
|
||||
self.client.login(remote_user="klm")
|
||||
url = urlreverse('doc_change_state', kwargs=dict(name=draft.filename))
|
||||
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
self.assertRaises(BallotInfo.DoesNotExist, lambda: draft.idinternal.ballot)
|
||||
r = self.client.post(url,
|
||||
dict(state=str(IDState.LAST_CALL_REQUESTED),
|
||||
substate=""))
|
||||
self.assertContains(r, "Your request to issue the Last Call")
|
||||
|
||||
# last call text
|
||||
self.assertTrue("The IESG has received" in draft.idinternal.ballot.last_call_text)
|
||||
self.assertTrue(draft.title in draft.idinternal.ballot.last_call_text)
|
||||
self.assertTrue(draft.idinternal.get_absolute_url() in draft.idinternal.ballot.last_call_text)
|
||||
|
||||
# approval text
|
||||
self.assertTrue("The IESG has approved" in draft.idinternal.ballot.approval_text)
|
||||
self.assertTrue(draft.title in draft.idinternal.ballot.approval_text)
|
||||
self.assertTrue(draft.idinternal.get_absolute_url() in draft.idinternal.ballot.approval_text)
|
||||
|
||||
# ballot writeup
|
||||
self.assertTrue("Technical Summary" in draft.idinternal.ballot.ballot_writeup)
|
||||
|
||||
# mail notice
|
||||
self.assertTrue(len(outbox) > mailbox_before)
|
||||
self.assertTrue("Last Call:" in outbox[-1]['Subject'])
|
||||
|
||||
# comment
|
||||
self.assertTrue("Last Call was requested" in draft.idinternal.comments()[0].comment_text)
|
||||
|
||||
|
||||
class EditInfoTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def test_edit_info(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_edit_info', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form select[name=intended_status]')), 1)
|
||||
self.assertEquals(len(q('form input[name=via_rfc_editor]')), 1)
|
||||
|
||||
prev_job_owner = draft.idinternal.job_owner
|
||||
# faulty post
|
||||
r = self.client.post(url, dict(job_owner="123456789"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form ul.errorlist')) > 0)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.job_owner, prev_job_owner)
|
||||
|
||||
# edit info
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
mailbox_before = len(outbox)
|
||||
draft.group = Acronym.objects.get(acronym_id=Acronym.INDIVIDUAL_SUBMITTER)
|
||||
draft.save()
|
||||
new_job_owner = IESGLogin.objects.exclude(id__in=[IESGLogin.objects.get(login_name="klm").id, draft.idinternal.job_owner_id])[0]
|
||||
new_area = Area.active_areas()[0]
|
||||
|
||||
r = self.client.post(url,
|
||||
dict(intended_status=str(draft.intended_status_id),
|
||||
status_date=str(date.today() + timedelta(2)),
|
||||
area_acronym=str(new_area.area_acronym_id),
|
||||
via_rfc_editor="1",
|
||||
job_owner=new_job_owner.id,
|
||||
state_change_notice_to="test@example.com",
|
||||
note="",
|
||||
telechat_date="",
|
||||
stream=Stream.objects.get(name=u'IETF').id,
|
||||
))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.area_acronym, new_area)
|
||||
self.assertTrue(draft.idinternal.via_rfc_editor)
|
||||
self.assertEquals(draft.idinternal.job_owner, new_job_owner)
|
||||
self.assertEquals(draft.idinternal.note, "")
|
||||
self.assertTrue(not draft.idinternal.agenda)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 3)
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue(draft.filename in outbox[-1]['Subject'])
|
||||
|
||||
def test_edit_telechat_date(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.idinternal.agenda = False
|
||||
draft.idinternal.save()
|
||||
url = urlreverse('doc_edit_info', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
data = dict(intended_status=str(draft.intended_status_id),
|
||||
status_date=str(date.today() + timedelta(2)),
|
||||
area_acronym=str(draft.idinternal.area_acronym_id),
|
||||
via_rfc_editor="1",
|
||||
job_owner=str(draft.idinternal.job_owner_id),
|
||||
state_change_notice_to="test@example.com",
|
||||
note="",
|
||||
stream=Stream.objects.get(name=u'IETF').id,
|
||||
)
|
||||
|
||||
from ietf.iesg.models import TelechatDates
|
||||
|
||||
# add to telechat
|
||||
data["telechat_date"] = TelechatDates.objects.all()[0].date1.isoformat()
|
||||
r = self.client.post(url, data)
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue(draft.idinternal.agenda)
|
||||
self.assertEquals(draft.idinternal.telechat_date, TelechatDates.objects.all()[0].date1)
|
||||
|
||||
# change telechat
|
||||
data["telechat_date"] = TelechatDates.objects.all()[0].date2.isoformat()
|
||||
r = self.client.post(url, data)
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue(draft.idinternal.agenda)
|
||||
self.assertEquals(draft.idinternal.telechat_date, TelechatDates.objects.all()[0].date2)
|
||||
|
||||
# remove from agenda
|
||||
data["telechat_date"] = ""
|
||||
r = self.client.post(url, data)
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue(not draft.idinternal.agenda)
|
||||
|
||||
|
||||
def test_add_draft(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ah-rfc2141bis-urn")
|
||||
url = urlreverse('doc_edit_info', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form select[name=intended_status]')), 1)
|
||||
self.assertEquals(len(q('form input[name=via_rfc_editor]')), 1)
|
||||
self.assertTrue('@' in q('form input[name=state_change_notice_to]')[0].get('value'))
|
||||
|
||||
# add
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
job_owner = IESGLogin.objects.filter(user_level=1)[0]
|
||||
area = Area.active_areas()[0]
|
||||
|
||||
r = self.client.post(url,
|
||||
dict(intended_status=str(draft.intended_status_id),
|
||||
area_acronym=str(area.area_acronym_id),
|
||||
via_rfc_editor="1",
|
||||
job_owner=job_owner.id,
|
||||
create_in_state=IDState.PUBLICATION_REQUESTED,
|
||||
state_change_notice_to="test@example.com",
|
||||
note="This is a note",
|
||||
telechat_date="",
|
||||
stream=Stream.objects.get(name=u'IETF').id,
|
||||
))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ah-rfc2141bis-urn")
|
||||
self.assertEquals(draft.idinternal.area_acronym, area)
|
||||
self.assertTrue(draft.idinternal.via_rfc_editor)
|
||||
self.assertEquals(draft.idinternal.job_owner, job_owner)
|
||||
self.assertEquals(draft.idinternal.note, "This is a note")
|
||||
self.assertTrue(not draft.idinternal.agenda)
|
||||
self.assertEquals(draft.idinternal.comments().count(), 2)
|
||||
self.assertTrue("Draft added" in draft.idinternal.comments()[0].comment_text)
|
||||
self.assertTrue("This is a note" in draft.idinternal.comments()[1].comment_text)
|
||||
self.assertEquals(len(outbox), mailbox_before)
|
||||
|
||||
|
||||
class ResurrectTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def test_request_resurrect(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mip6-cn-ipsec")
|
||||
self.assertEquals(draft.status.status, "Expired")
|
||||
self.assertTrue(not draft.idinternal.resurrect_requested_by)
|
||||
|
||||
url = urlreverse('doc_request_resurrect', kwargs=dict(name=draft.filename))
|
||||
login_as = "rhousley"
|
||||
|
||||
login_testing_unauthorized(self, login_as, url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form input[type=submit]')), 1)
|
||||
|
||||
|
||||
# request resurrect
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict())
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mip6-cn-ipsec")
|
||||
self.assertEquals(draft.idinternal.resurrect_requested_by, IESGLogin.objects.get(login_name=login_as))
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("Resurrection" in draft.idinternal.comments()[0].comment_text)
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("Resurrection" in outbox[-1]['Subject'])
|
||||
|
||||
def test_resurrect(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mip6-cn-ipsec")
|
||||
self.assertEquals(draft.status.status, "Expired")
|
||||
draft.idinternal.resurrect_requested_by = IESGLogin.objects.get(login_name="rhousley")
|
||||
draft.idinternal.save()
|
||||
|
||||
url = urlreverse('doc_resurrect', kwargs=dict(name=draft.filename))
|
||||
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form input[type=submit]')), 1)
|
||||
|
||||
# request resurrect
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict())
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mip6-cn-ipsec")
|
||||
self.assertEquals(draft.idinternal.resurrect_requested_by, None)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("completed" in draft.idinternal.comments()[0].comment_text)
|
||||
self.assertEquals(draft.status.status, "Active")
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
|
||||
class AddCommentTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def test_add_comment(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_add_comment', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form textarea[name=comment]')), 1)
|
||||
|
||||
# request resurrect
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict(comment="This is a test."))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("This is a test." in draft.idinternal.comments()[0].comment_text)
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("updated" in outbox[-1]['Subject'])
|
||||
self.assertTrue(draft.filename in outbox[-1]['Subject'])
|
||||
|
||||
class EditPositionTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft', 'ballot']
|
||||
|
||||
def test_edit_position(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "rhousley", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form input[name=position]')) > 0)
|
||||
self.assertEquals(len(q('form textarea[name=comment_text]')), 1)
|
||||
|
||||
# vote
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
self.assertTrue(not Position.objects.filter(ballot=draft.idinternal.ballot, ad__login_name="rhousley"))
|
||||
|
||||
r = self.client.post(url, dict(position="discuss",
|
||||
discuss_text="This is a discussion test.",
|
||||
comment_text="This is a test."))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
pos = Position.objects.get(ballot=draft.idinternal.ballot, ad__login_name="rhousley")
|
||||
self.assertTrue("This is a discussion test." in IESGDiscuss.objects.get(ballot=draft.idinternal.ballot, ad__login_name="rhousley").text)
|
||||
self.assertTrue("This is a test." in IESGComment.objects.get(ballot=draft.idinternal.ballot, ad__login_name="rhousley").text)
|
||||
self.assertTrue(pos.discuss)
|
||||
self.assertTrue(not (pos.yes or pos.noobj or pos.abstain or pos.recuse))
|
||||
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 3)
|
||||
self.assertTrue("New position" in draft.idinternal.comments()[2].comment_text)
|
||||
|
||||
# recast vote
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
r = self.client.post(url, dict(position="noobj"))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
pos = Position.objects.filter(ballot=draft.idinternal.ballot, ad__login_name="rhousley")[0]
|
||||
self.assertTrue(pos.noobj)
|
||||
self.assertTrue(not (pos.yes or pos.abstain or pos.recuse))
|
||||
self.assertTrue(pos.discuss == -1)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("Position" in draft.idinternal.comments()[0].comment_text)
|
||||
|
||||
# clear vote
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
r = self.client.post(url, dict(position=""))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
pos = Position.objects.filter(ballot=draft.idinternal.ballot, ad__login_name="rhousley")
|
||||
self.assertEquals(len(pos), 0)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertTrue("Position" in draft.idinternal.comments()[0].comment_text)
|
||||
def test_edit_position_as_secretary(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.filename))
|
||||
url += "?ad=rhousley"
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form input[name=position]')) > 0)
|
||||
|
||||
# vote for rhousley
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
self.assertTrue(not Position.objects.filter(ballot=draft.idinternal.ballot, ad__login_name="rhousley"))
|
||||
|
||||
r = self.client.post(url, dict(position="discuss",discuss_text="A non-empty discuss"))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
pos = Position.objects.get(ballot=draft.idinternal.ballot, ad__login_name="rhousley")
|
||||
self.assertTrue(pos.discuss)
|
||||
self.assertTrue(not (pos.yes or pos.noobj or pos.abstain or pos.recuse))
|
||||
|
||||
|
||||
def test_send_ballot_comment(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_send_ballot_comment', kwargs=dict(name=draft.filename))
|
||||
login_as = "rhousley"
|
||||
login_testing_unauthorized(self, login_as, url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form input[name="cc"]')) > 0)
|
||||
|
||||
# send
|
||||
mailbox_before = len(outbox)
|
||||
IESGComment.objects.create(ballot=draft.idinternal.ballot,
|
||||
ad=IESGLogin.objects.get(login_name=login_as),
|
||||
text="Test!", date=date.today(),
|
||||
revision=draft.revision_display(), active=1)
|
||||
|
||||
r = self.client.post(url, dict(cc="test@example.com", cc_state_change="1"))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("COMMENT" in outbox[-1]['Subject'])
|
||||
|
||||
|
||||
class DeferBallotTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft', 'ballot']
|
||||
|
||||
def test_defer_ballot(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_defer_ballot', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "rhousley", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
|
||||
# defer
|
||||
self.assertTrue(not draft.idinternal.ballot.defer)
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict())
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue(draft.idinternal.ballot.defer)
|
||||
self.assertTrue(draft.idinternal.cur_state_id == IDState.IESG_EVALUATION_DEFER)
|
||||
|
||||
self.assertEquals(len(outbox), mailbox_before + 2)
|
||||
self.assertTrue("Deferred" in outbox[-2]['Subject'])
|
||||
self.assertTrue(draft.file_tag() in outbox[-2]['Subject'])
|
||||
|
||||
def test_undefer_ballot(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_undefer_ballot', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "rhousley", url)
|
||||
|
||||
draft.idinternal.ballot.defer = True
|
||||
draft.idinternal.ballot.save()
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
|
||||
# undefer
|
||||
self.assertTrue(draft.idinternal.ballot.defer)
|
||||
|
||||
r = self.client.post(url, dict())
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue(not draft.idinternal.ballot.defer)
|
||||
self.assertEquals(draft.idinternal.cur_state_id, IDState.IESG_EVALUATION)
|
||||
|
||||
class BallotWriteupsTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft', 'ballot']
|
||||
|
||||
def test_edit_last_call_text(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_ballot_lastcall', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('textarea[name=last_call_text]')), 1)
|
||||
self.assertEquals(len(q('input[type=submit][value*="Save Last Call"]')), 1)
|
||||
|
||||
# subject error
|
||||
r = self.client.post(url, dict(
|
||||
last_call_text="Subject: test\r\nhello\r\n\r\n",
|
||||
save_last_call_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('ul.errorlist')) > 0)
|
||||
|
||||
# save
|
||||
r = self.client.post(url, dict(
|
||||
last_call_text="This is a simple test.",
|
||||
save_last_call_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue("This is a simple test" in draft.idinternal.ballot.last_call_text)
|
||||
|
||||
# test regenerate
|
||||
r = self.client.post(url, dict(
|
||||
last_call_text="This is a simple test.",
|
||||
regenerate_last_call_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue("Subject: Last Call" in draft.idinternal.ballot.last_call_text)
|
||||
|
||||
def test_request_last_call(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_ballot_lastcall', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict(
|
||||
last_call_text=draft.idinternal.ballot.last_call_text,
|
||||
send_last_call_request="1"))
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.cur_state_id, IDState.LAST_CALL_REQUESTED)
|
||||
|
||||
self.assertEquals(len(outbox), mailbox_before + 3)
|
||||
|
||||
self.assertTrue("Last Call" in outbox[-1]['Subject'])
|
||||
|
||||
def test_edit_ballot_writeup(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('textarea[name=ballot_writeup]')), 1)
|
||||
self.assertEquals(len(q('input[type=submit][value*="Save Ballot Writeup"]')), 1)
|
||||
|
||||
# save
|
||||
r = self.client.post(url, dict(
|
||||
ballot_writeup="This is a simple test.",
|
||||
save_ballot_writeup="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue("This is a simple test" in draft.idinternal.ballot.ballot_writeup)
|
||||
|
||||
def test_issue_ballot(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "rhousley", url)
|
||||
|
||||
draft.idinternal.ballot.ballot_issued = False
|
||||
draft.idinternal.ballot.save()
|
||||
active = IESGLogin.objects.filter(user_level=1)
|
||||
Position.objects.create(ad=active[0], yes=1, noobj=0, discuss=0, abstain=0, recuse=0, ballot=draft.idinternal.ballot)
|
||||
Position.objects.create(ad=active[1], yes=0, noobj=1, discuss=0, abstain=0, recuse=0, ballot=draft.idinternal.ballot)
|
||||
Position.objects.create(ad=active[2], yes=0, noobj=1, discuss=-1, abstain=0, recuse=0, ballot=draft.idinternal.ballot)
|
||||
Position.objects.create(ad=active[3], yes=0, noobj=0, discuss=1, abstain=0, recuse=0, ballot=draft.idinternal.ballot)
|
||||
Position.objects.create(ad=active[4], yes=0, noobj=0, discuss=0, abstain=1, recuse=0, ballot=draft.idinternal.ballot)
|
||||
Position.objects.create(ad=active[5], yes=0, noobj=0, discuss=0, abstain=0, recuse=1, ballot=draft.idinternal.ballot)
|
||||
inactive = IESGLogin.objects.filter(user_level=2)
|
||||
Position.objects.create(ad=inactive[0], yes=1, noobj=0, discuss=0, abstain=0, recuse=0, ballot=draft.idinternal.ballot)
|
||||
IESGDiscuss.objects.create(ad=active[1], active=True, date=datetime.date.today(), text="test " * 20, ballot=draft.idinternal.ballot)
|
||||
IESGComment.objects.create(ad=active[2], active=True, date=datetime.date.today(), text="test " * 20, ballot=draft.idinternal.ballot)
|
||||
IESGDiscuss.objects.create(ad=active[3], active=True, date=datetime.date.today(), text="test " * 20, ballot=draft.idinternal.ballot)
|
||||
IESGComment.objects.create(ad=active[3], active=True, date=datetime.date.today(), text="test " * 20, ballot=draft.idinternal.ballot)
|
||||
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict(
|
||||
ballot_writeup=draft.idinternal.ballot.ballot_writeup,
|
||||
approval_text=draft.idinternal.ballot.approval_text,
|
||||
issue_ballot="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
|
||||
self.assertTrue(draft.idinternal.ballot.ballot_issued)
|
||||
self.assertEquals(len(outbox), mailbox_before + 2)
|
||||
self.assertTrue("Evaluation:" in outbox[-2]['Subject'])
|
||||
|
||||
|
||||
def test_edit_approval_text(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_ballot_approvaltext', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('textarea[name=approval_text]')), 1)
|
||||
self.assertEquals(len(q('input[type=submit][value*="Save Approval"]')), 1)
|
||||
|
||||
# save
|
||||
r = self.client.post(url, dict(
|
||||
approval_text="This is a simple test.",
|
||||
save_approval_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue("This is a simple test" in draft.idinternal.ballot.approval_text)
|
||||
|
||||
# test regenerate
|
||||
r = self.client.post(url, dict(
|
||||
approval_text="This is a simple test.",
|
||||
regenerate_approval_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertTrue("Subject: Protocol Action" in draft.idinternal.ballot.approval_text)
|
||||
|
||||
class ApproveBallotTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft', 'ballot']
|
||||
|
||||
def test_approve_ballot(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
url = urlreverse('doc_approve_ballot', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue("Send out the announcement" in q('input[type=submit]')[0].get('value'))
|
||||
self.assertEquals(len(q('pre')), 1)
|
||||
|
||||
# approve
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
r = self.client.post(url, dict())
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.cur_state_id, IDState.APPROVED_ANNOUNCEMENT_SENT)
|
||||
|
||||
self.assertEquals(len(outbox), mailbox_before + 4)
|
||||
|
||||
self.assertTrue("Protocol Action" in outbox[-2]['Subject'])
|
||||
# the IANA copy
|
||||
self.assertTrue("Protocol Action" in outbox[-1]['Subject'])
|
||||
|
||||
class MakeLastCallTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft', 'ballot']
|
||||
|
||||
def test_make_last_call(self):
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.idinternal.cur_state = IDState.objects.get(document_state_id=IDState.LAST_CALL_REQUESTED)
|
||||
draft.idinternal.save()
|
||||
draft.lc_expiration_date = None
|
||||
draft.save()
|
||||
|
||||
url = urlreverse('doc_make_last_call', kwargs=dict(name=draft.filename))
|
||||
login_testing_unauthorized(self, "klm", url)
|
||||
|
||||
# normal get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('input[name=last_call_sent_date]')), 1)
|
||||
|
||||
# make last call
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
expire_date = q('input[name=last_call_expiration_date]')[0].get("value")
|
||||
|
||||
r = self.client.post(url,
|
||||
dict(last_call_sent_date=q('input[name=last_call_sent_date]')[0].get("value"),
|
||||
last_call_expiration_date=expire_date
|
||||
))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.cur_state_id, IDState.IN_LAST_CALL)
|
||||
self.assertEquals(draft.lc_expiration_date.strftime("%Y-%m-%d"), expire_date)
|
||||
self.assertEquals(len(outbox), mailbox_before + 4)
|
||||
|
||||
self.assertTrue("Last Call" in outbox[-4]['Subject'])
|
||||
# the IANA copy
|
||||
self.assertTrue("Last Call" in outbox[-3]['Subject'])
|
||||
|
||||
class ExpireIDsTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def setUp(self):
|
||||
self.id_dir = os.path.abspath("tmp-id-dir")
|
||||
self.archive_dir = os.path.abspath("tmp-id-archive")
|
||||
os.mkdir(self.id_dir)
|
||||
os.mkdir(self.archive_dir)
|
||||
os.mkdir(os.path.join(self.archive_dir, "unknown_ids"))
|
||||
os.mkdir(os.path.join(self.archive_dir, "deleted_tombstones"))
|
||||
os.mkdir(os.path.join(self.archive_dir, "expired_without_tombstone"))
|
||||
|
||||
settings.IDSUBMIT_REPOSITORY_PATH = self.id_dir
|
||||
settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.id_dir)
|
||||
shutil.rmtree(self.archive_dir)
|
||||
|
||||
def write_id_file(self, name, size):
|
||||
f = open(os.path.join(self.id_dir, name), 'w')
|
||||
f.write("a" * size)
|
||||
f.close()
|
||||
|
||||
def test_in_id_expire_freeze(self):
|
||||
from ietf.idrfc.expire import in_id_expire_freeze
|
||||
|
||||
self.assertTrue(not in_id_expire_freeze(datetime.datetime(2010, 7, 11, 0, 0)))
|
||||
self.assertTrue(not in_id_expire_freeze(datetime.datetime(2010, 7, 12, 8, 0)))
|
||||
self.assertTrue(in_id_expire_freeze(datetime.datetime(2010, 7, 12, 10, 0)))
|
||||
self.assertTrue(in_id_expire_freeze(datetime.datetime(2010, 7, 25, 0, 0)))
|
||||
self.assertTrue(not in_id_expire_freeze(datetime.datetime(2010, 7, 26, 0, 0)))
|
||||
|
||||
def test_warn_expirable_ids(self):
|
||||
from ietf.idrfc.expire import get_soon_to_expire_ids, send_expire_warning_for_id
|
||||
|
||||
# hack into almost expirable state
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.status = IDStatus.objects.get(status="Active")
|
||||
draft.review_by_rfc_editor = 0
|
||||
draft.revision_date = datetime.date.today() - datetime.timedelta(days=InternetDraft.DAYS_TO_EXPIRE - 7)
|
||||
draft.idinternal.cur_state_id = IDState.AD_WATCHING
|
||||
draft.idinternal.save()
|
||||
draft.save()
|
||||
|
||||
author = PersonOrOrgInfo.objects.all()[0]
|
||||
IDAuthor.objects.create(document=draft, person=author, author_order=1)
|
||||
EmailAddress.objects.create(person_or_org=author, type="I-D", priority=draft.pk, address="author@example.com")
|
||||
|
||||
# test query
|
||||
documents = list(get_soon_to_expire_ids(14))
|
||||
self.assertEquals(len(documents), 1)
|
||||
|
||||
# test send warning
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
send_expire_warning_for_id(documents[0])
|
||||
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("author@example.com" in str(outbox[-1]))
|
||||
|
||||
def test_expire_ids(self):
|
||||
from ietf.idrfc.expire import get_expired_ids, send_expire_notice_for_id, expire_id
|
||||
|
||||
# hack into expirable state
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.status = IDStatus.objects.get(status="Active")
|
||||
draft.review_by_rfc_editor = 0
|
||||
draft.revision_date = datetime.date.today() - datetime.timedelta(days=InternetDraft.DAYS_TO_EXPIRE + 1)
|
||||
draft.idinternal.cur_state_id = IDState.AD_WATCHING
|
||||
draft.idinternal.save()
|
||||
draft.save()
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ah-rfc2141bis-urn")
|
||||
self.assertTrue(draft.idinternal == None)
|
||||
draft.status = IDStatus.objects.get(status="Active")
|
||||
draft.review_by_rfc_editor = 0
|
||||
draft.revision_date = datetime.date.today() - datetime.timedelta(days=InternetDraft.DAYS_TO_EXPIRE + 1)
|
||||
draft.save()
|
||||
|
||||
# test query
|
||||
documents = get_expired_ids()
|
||||
self.assertEquals(len(documents), 2)
|
||||
|
||||
for d in documents:
|
||||
# test notice
|
||||
mailbox_before = len(outbox)
|
||||
|
||||
send_expire_notice_for_id(d)
|
||||
|
||||
self.assertEquals(InternetDraft.objects.get(filename=d.filename).dunn_sent_date, datetime.date.today())
|
||||
if d.idinternal:
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("expired" in outbox[-1]["Subject"])
|
||||
|
||||
# test expiry
|
||||
txt = "%s-%s.txt" % (d.filename, d.revision_display())
|
||||
self.write_id_file(txt, 5000)
|
||||
|
||||
revision_before = d.revision
|
||||
|
||||
expire_id(d)
|
||||
|
||||
draft = InternetDraft.objects.get(filename=d.filename)
|
||||
self.assertEquals(draft.status.status, "Expired")
|
||||
self.assertEquals(int(draft.revision), int(revision_before) + 1)
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, txt)))
|
||||
new_txt = "%s-%s.txt" % (draft.filename, draft.revision)
|
||||
self.assertTrue(os.path.exists(os.path.join(self.id_dir, new_txt)))
|
||||
|
||||
def test_clean_up_id_files(self):
|
||||
from ietf.idrfc.expire import clean_up_id_files
|
||||
|
||||
# put unknown file
|
||||
unknown = "draft-i-am-unknown-01.txt"
|
||||
self.write_id_file(unknown, 5000)
|
||||
|
||||
clean_up_id_files()
|
||||
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, unknown)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "unknown_ids", unknown)))
|
||||
|
||||
|
||||
# put file with malformed name (no revision)
|
||||
malformed = "draft-ietf-mipshop-pfmipv6.txt"
|
||||
self.write_id_file(malformed, 5000)
|
||||
|
||||
clean_up_id_files()
|
||||
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, malformed)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "unknown_ids", malformed)))
|
||||
|
||||
|
||||
# RFC draft
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.status_id = 3
|
||||
draft.save()
|
||||
|
||||
txt = "%s-%s.txt" % (draft.filename, draft.revision)
|
||||
self.write_id_file(txt, 5000)
|
||||
pdf = "%s-%s.pdf" % (draft.filename, draft.revision)
|
||||
self.write_id_file(pdf, 5000)
|
||||
|
||||
clean_up_id_files()
|
||||
|
||||
# txt files shouldn't be moved (for some reason)
|
||||
self.assertTrue(os.path.exists(os.path.join(self.id_dir, txt)))
|
||||
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, pdf)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "unknown_ids", pdf)))
|
||||
|
||||
|
||||
# expired without tombstone
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.status_id = 2
|
||||
draft.expiration_date = datetime.date.today() - datetime.timedelta(days=InternetDraft.DAYS_TO_EXPIRE + 1)
|
||||
draft.save()
|
||||
|
||||
txt = "%s-%s.txt" % (draft.filename, draft.revision)
|
||||
self.write_id_file(txt, 5000)
|
||||
|
||||
clean_up_id_files()
|
||||
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "expired_without_tombstone", txt)))
|
||||
|
||||
|
||||
# expired with tombstone
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.status_id = 2
|
||||
draft.expiration_date = datetime.date.today() - datetime.timedelta(days=InternetDraft.DAYS_TO_EXPIRE + 1)
|
||||
draft.expired_tombstone = False
|
||||
draft.save()
|
||||
|
||||
revision_before = draft.revision
|
||||
|
||||
txt = "%s-%s.txt" % (draft.filename, draft.revision)
|
||||
self.write_id_file(txt, 1000)
|
||||
|
||||
clean_up_id_files()
|
||||
|
||||
self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt)))
|
||||
self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "deleted_tombstones", txt)))
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(int(draft.revision), int(revision_before) - 1)
|
||||
self.assertTrue(draft.expired_tombstone)
|
||||
|
||||
class ExpireLastCallTestCase(django.test.TestCase):
|
||||
fixtures = ['base', 'draft']
|
||||
|
||||
def test_expire_last_call(self):
|
||||
from ietf.idrfc.lastcall import get_expired_last_calls, expire_last_call
|
||||
|
||||
# check that not expired drafts aren't expired
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
draft.idinternal.cur_state = IDState.objects.get(document_state_id=IDState.IN_LAST_CALL)
|
||||
draft.idinternal.cur_substate = None
|
||||
draft.idinternal.save()
|
||||
draft.lc_expiration_date = datetime.date.today() + datetime.timedelta(days=2)
|
||||
draft.save()
|
||||
|
||||
self.assertEquals(len(get_expired_last_calls()), 0)
|
||||
|
||||
draft.lc_expiration_date = None
|
||||
draft.save()
|
||||
|
||||
self.assertEquals(len(get_expired_last_calls()), 0)
|
||||
|
||||
# test expired
|
||||
draft.lc_expiration_date = datetime.date.today()
|
||||
draft.save()
|
||||
|
||||
drafts = get_expired_last_calls()
|
||||
self.assertEquals(len(drafts), 1)
|
||||
|
||||
mailbox_before = len(outbox)
|
||||
comments_before = draft.idinternal.comments().count()
|
||||
|
||||
expire_last_call(drafts[0])
|
||||
|
||||
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
|
||||
self.assertEquals(draft.idinternal.cur_state.document_state_id, IDState.WAITING_FOR_WRITEUP)
|
||||
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("Last Call Expired" in outbox[-1]["Subject"])
|
||||
|
||||
|
||||
# REMOVED ALL THE CLASS DEFINITIONS FROM THIS FILE
|
||||
# AS A FIRST STEP TOWARDS TRANSITION CLEANUP. ALL
|
||||
# OF WHAT WAS HERE IS REDEFINED BY THE INCLUDE
|
||||
# BELOW
|
||||
|
||||
TEST_RFC_INDEX = '''<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rfc-index xmlns="http://www.rfc-editor.org/rfc-index"
|
||||
|
@ -1281,27 +364,6 @@ Asynchronous Channels for the Blocks Extensible Exchange Protocol (BEEP)
|
|||
</rfc-editor-queue>
|
||||
'''
|
||||
|
||||
class MirrorScriptTestCases(unittest.TestCase,RealDatabaseTest):
|
||||
|
||||
def setUp(self):
|
||||
self.setUpRealDatabase()
|
||||
def tearDown(self):
|
||||
self.tearDownRealDatabase()
|
||||
|
||||
def testRfcIndex(self):
|
||||
print " Testing rfc-index.xml parsing"
|
||||
from ietf.idrfc.mirror_rfc_index import parse
|
||||
data = parse(StringIO.StringIO(TEST_RFC_INDEX))
|
||||
self.assertEquals(len(data), 6)
|
||||
print "OK"
|
||||
|
||||
def testRfcEditorQueue(self):
|
||||
print " Testing queue2.xml parsing"
|
||||
from ietf.idrfc.mirror_rfc_editor_queue import parse_all
|
||||
(drafts,refs) = parse_all(StringIO.StringIO(TEST_QUEUE))
|
||||
self.assertEquals(len(drafts), 3)
|
||||
self.assertEquals(len(refs), 3)
|
||||
print "OK"
|
||||
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
from testsREDESIGN import *
|
||||
|
|
|
@ -173,7 +173,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form select[name=intended_std_level]')), 1)
|
||||
self.assertEquals(len(q('form input[name=via_rfc_editor]')), 1)
|
||||
|
||||
prev_ad = draft.ad
|
||||
# faulty post
|
||||
|
@ -193,7 +192,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
r = self.client.post(url,
|
||||
dict(intended_std_level=str(draft.intended_std_level.pk),
|
||||
stream=draft.stream_id,
|
||||
via_rfc_editor="1",
|
||||
ad=str(new_ad.pk),
|
||||
notify="test@example.com",
|
||||
note="New note",
|
||||
|
@ -202,7 +200,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertTrue(draft.tags.filter(slug="via-rfc"))
|
||||
self.assertEquals(draft.ad, new_ad)
|
||||
self.assertEquals(draft.note, "New note")
|
||||
self.assertTrue(not draft.latest_event(TelechatDocEvent, type="telechat_date"))
|
||||
|
@ -218,7 +215,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
|
||||
data = dict(intended_std_level=str(draft.intended_std_level_id),
|
||||
stream=draft.stream_id,
|
||||
via_rfc_editor="1",
|
||||
ad=str(draft.ad_id),
|
||||
notify="test@example.com",
|
||||
note="",
|
||||
|
@ -287,7 +283,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form select[name=intended_std_level]')), 1)
|
||||
self.assertEquals(len(q('form input[name=via_rfc_editor]')), 1)
|
||||
self.assertTrue('@' in q('form input[name=notify]')[0].get('value'))
|
||||
|
||||
# add
|
||||
|
@ -299,7 +294,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
r = self.client.post(url,
|
||||
dict(intended_std_level=str(draft.intended_std_level_id),
|
||||
stream="ietf",
|
||||
via_rfc_editor="1",
|
||||
ad=ad.pk,
|
||||
create_in_state=State.objects.get(type="draft-iesg", slug="watching").pk,
|
||||
notify="test@example.com",
|
||||
|
@ -309,7 +303,6 @@ class EditInfoTestCase(django.test.TestCase):
|
|||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertTrue(draft.tags.filter(slug="via-rfc"))
|
||||
self.assertEquals(draft.get_state_slug("draft-iesg"), "watching")
|
||||
self.assertEquals(draft.ad, ad)
|
||||
self.assertEquals(draft.note, "This is a note")
|
||||
|
@ -780,12 +773,11 @@ class BallotWriteupsTestCase(django.test.TestCase):
|
|||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertTrue("NOT be published" in draft.latest_event(WriteupDocEvent, type="changed_ballot_approval_text").text)
|
||||
|
||||
# test regenerate when it's via RFC Editor
|
||||
# test regenerate when it's a conflict review
|
||||
draft.group = Group.objects.get(type="individ")
|
||||
draft.stream_id = "irtf"
|
||||
draft.save()
|
||||
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
|
||||
draft.tags.add("via-rfc")
|
||||
|
||||
r = self.client.post(url, dict(regenerate_approval_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
|
|
|
@ -208,63 +208,7 @@ def dehtmlify_textarea_text(s):
|
|||
return s.replace("<br>", "\n").replace("<b>", "").replace("</b>", "").replace(" ", " ")
|
||||
|
||||
class EditInfoForm(forms.Form):
|
||||
intended_status = forms.ModelChoiceField(IDIntendedStatus.objects.all(), empty_label=None, required=True)
|
||||
area_acronym = forms.ModelChoiceField(Area.active_areas(), required=True, empty_label='None Selected')
|
||||
via_rfc_editor = forms.BooleanField(required=False, label="Via IRTF or RFC Editor")
|
||||
stream = forms.ModelChoiceField(Stream.objects.all(), empty_label=None, required=True)
|
||||
job_owner = forms.ModelChoiceField(IESGLogin.objects.filter(user_level__in=(IESGLogin.AD_LEVEL, IESGLogin.INACTIVE_AD_LEVEL)).order_by('user_level', 'last_name'), label="Responsible AD", empty_label=None, required=True)
|
||||
create_in_state = forms.ModelChoiceField(IDState.objects.filter(document_state_id__in=(IDState.PUBLICATION_REQUESTED, IDState.AD_WATCHING)), empty_label=None, required=False)
|
||||
state_change_notice_to = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas", required=False)
|
||||
note = forms.CharField(widget=forms.Textarea, label="IESG note", required=False)
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False, widget=forms.Select(attrs={'onchange':'make_bold()'}))
|
||||
returning_item = forms.BooleanField(required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
old_ads = kwargs.pop('old_ads')
|
||||
|
||||
super(self.__class__, self).__init__(*args, **kwargs)
|
||||
|
||||
job_owners = IESGLogin.objects.in_bulk([t[0] for t in self.fields['job_owner'].choices])
|
||||
choices = [("","None Selected"), ]
|
||||
if old_ads:
|
||||
# separate active ADs from inactive
|
||||
separated = False
|
||||
for t in self.fields['job_owner'].choices:
|
||||
if job_owners[t[0]].user_level != IESGLogin.AD_LEVEL and not separated:
|
||||
choices.append(("", "----------------"))
|
||||
separated = True
|
||||
choices.append(t)
|
||||
self.fields['job_owner'].choices = choices
|
||||
else:
|
||||
# remove old ones
|
||||
for t in self.fields['job_owner'].choices:
|
||||
if job_owners[t[0]].user_level==IESGLogin.AD_LEVEL:
|
||||
choices.append(t)
|
||||
self.fields['job_owner'].choices = choices
|
||||
|
||||
# telechat choices
|
||||
dates = TelechatDates.objects.all()[0].dates()
|
||||
init = kwargs['initial']['telechat_date']
|
||||
if init and init not in dates:
|
||||
dates.insert(0, init)
|
||||
|
||||
choices = [("", "(not on agenda)")]
|
||||
for d in dates:
|
||||
choices.append((d, d.strftime("%Y-%m-%d")))
|
||||
|
||||
self.fields['telechat_date'].choices = choices
|
||||
|
||||
# if kwargs['initial']['area_acronym'] == Acronym.INDIVIDUAL_SUBMITTER:
|
||||
# # default to "gen"
|
||||
# kwargs['initial']['area_acronym'] = 1008
|
||||
|
||||
# returning item is rendered non-standard
|
||||
self.standard_fields = [x for x in self.visible_fields() if x.name not in ('returning_item',)]
|
||||
|
||||
def clean_note(self):
|
||||
# note is stored munged in the database
|
||||
return self.cleaned_data['note'].replace('\n', '<br>').replace('\r', '').replace(' ', ' ')
|
||||
|
||||
pass
|
||||
|
||||
def get_initial_state_change_notice(doc):
|
||||
# set change state notice to something sensible
|
||||
|
@ -311,7 +255,6 @@ def edit_info(request, name):
|
|||
# would be better to use NULL to
|
||||
# signify an empty ballot
|
||||
ballot_id=get_new_ballot_id(),
|
||||
via_rfc_editor = False,
|
||||
)
|
||||
|
||||
if doc.idinternal.agenda:
|
||||
|
@ -321,7 +264,11 @@ def edit_info(request, name):
|
|||
|
||||
if request.method == 'POST':
|
||||
form = EditInfoForm(request.POST,
|
||||
old_ads=False,
|
||||
#old_ads needs to be True here - sometimes the user needs to touch
|
||||
#the information on an older document and the AD associated with it
|
||||
#should remain the same - if th old ADs aren't offered, the form
|
||||
#won't let the user proceed without doing the wrong thing
|
||||
old_ads=True,
|
||||
initial=dict(telechat_date=initial_telechat_date,
|
||||
area_acronym=doc.idinternal.area_acronym_id))
|
||||
|
||||
|
@ -380,8 +327,6 @@ def edit_info(request, name):
|
|||
update_telechat(request, doc.idinternal,
|
||||
r['telechat_date'], r['returning_item'])
|
||||
|
||||
if in_group(request.user, 'Secretariat'):
|
||||
doc.idinternal.via_rfc_editor = bool(r['via_rfc_editor'])
|
||||
|
||||
doc.idinternal.email_display = str(doc.idinternal.job_owner)
|
||||
doc.idinternal.token_name = str(doc.idinternal.job_owner)
|
||||
|
@ -420,8 +365,6 @@ def edit_info(request, name):
|
|||
|
||||
form = EditInfoForm(old_ads=False, initial=init)
|
||||
|
||||
if not in_group(request.user, 'Secretariat'):
|
||||
form.standard_fields = [x for x in form.standard_fields if x.name != "via_rfc_editor"]
|
||||
|
||||
if not new_document:
|
||||
form.standard_fields = [x for x in form.standard_fields if x.name != "create_in_state"]
|
||||
|
@ -441,7 +384,6 @@ def edit_info(request, name):
|
|||
|
||||
class EditInfoFormREDESIGN(forms.Form):
|
||||
intended_std_level = forms.ModelChoiceField(IntendedStdLevelName.objects.filter(used=True), empty_label="(None)", required=True, label="Intended RFC status")
|
||||
via_rfc_editor = forms.BooleanField(required=False, label="Via IRTF or RFC Editor")
|
||||
stream = forms.ModelChoiceField(StreamName.objects.all(), empty_label="(None)", required=True)
|
||||
area = forms.ModelChoiceField(Group.objects.filter(type="area", state="active"), empty_label="(None - individual submission)", required=False, label="Assigned to area")
|
||||
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'), label="Responsible AD", empty_label="(None)", required=True)
|
||||
|
@ -597,13 +539,6 @@ def edit_infoREDESIGN(request, name):
|
|||
update_telechat(request, doc, login,
|
||||
r['telechat_date'], r['returning_item'])
|
||||
|
||||
if has_role(request.user, 'Secretariat'):
|
||||
via_rfc = DocTagName.objects.get(slug="via-rfc")
|
||||
if r['via_rfc_editor']:
|
||||
doc.tags.add(via_rfc)
|
||||
else:
|
||||
doc.tags.remove(via_rfc)
|
||||
|
||||
doc.time = datetime.datetime.now()
|
||||
|
||||
if changes and not new_document:
|
||||
|
@ -627,8 +562,6 @@ def edit_infoREDESIGN(request, name):
|
|||
# optionally filter out some fields
|
||||
if not new_document:
|
||||
form.standard_fields = [x for x in form.standard_fields if x.name != "create_in_state"]
|
||||
if not has_role(request.user, 'Secretariat'):
|
||||
form.standard_fields = [x for x in form.standard_fields if x.name != "via_rfc_editor"]
|
||||
if doc.group.type_id not in ("individ", "area"):
|
||||
form.standard_fields = [x for x in form.standard_fields if x.name != "area"]
|
||||
|
||||
|
|
|
@ -63,52 +63,20 @@ def date_threshold():
|
|||
return ret
|
||||
|
||||
def inddocs(request):
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
queryset_list_ind = [d for d in InternetDraft.objects.filter(tags__slug="via-rfc", docevent__type="iesg_approved").distinct() if d.latest_event(type__in=("iesg_disapproved", "iesg_approved")).type == "iesg_approved"]
|
||||
queryset_list_ind.sort(key=lambda d: d.b_approve_date, reverse=True)
|
||||
queryset_list_ind = [d for d in InternetDraft.objects.filter(stream__in=("IRTF","ISE"), docevent__type="iesg_approved").distinct() if d.latest_event(type__in=("iesg_disapproved", "iesg_approved")).type == "iesg_approved"]
|
||||
queryset_list_ind.sort(key=lambda d: d.b_approve_date, reverse=True)
|
||||
|
||||
queryset_list_ind_dnp = [d for d in IDInternal.objects.filter(tags__slug="via-rfc", docevent__type="iesg_disapproved").distinct() if d.latest_event(type__in=("iesg_disapproved", "iesg_approved")).type == "iesg_disapproved"]
|
||||
queryset_list_ind_dnp.sort(key=lambda d: d.dnp_date, reverse=True)
|
||||
queryset_list_ind_dnp = [d for d in IDInternal.objects.filter(stream__in=("IRTF","ISE"), docevent__type="iesg_disapproved").distinct() if d.latest_event(type__in=("iesg_disapproved", "iesg_approved")).type == "iesg_disapproved"]
|
||||
queryset_list_ind_dnp.sort(key=lambda d: d.dnp_date, reverse=True)
|
||||
|
||||
return render_to_response('iesg/independent_doc.html',
|
||||
dict(object_list=queryset_list_ind,
|
||||
object_list_dnp=queryset_list_ind_dnp),
|
||||
context_instance=RequestContext(request))
|
||||
return render_to_response('iesg/independent_doc.html',
|
||||
dict(object_list=queryset_list_ind,
|
||||
object_list_dnp=queryset_list_ind_dnp),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
queryset_list_ind = InternetDraft.objects.filter(idinternal__via_rfc_editor=1, idinternal__rfc_flag=0, idinternal__noproblem=1, idinternal__dnp=0).order_by('-b_approve_date')
|
||||
queryset_list_ind_dnp = IDInternal.objects.filter(via_rfc_editor = 1,rfc_flag=0,dnp=1).order_by('-dnp_date')
|
||||
return object_list(request, queryset=queryset_list_ind, template_name='iesg/independent_doc.html', allow_empty=True, extra_context={'object_list_dnp':queryset_list_ind_dnp })
|
||||
|
||||
def wgdocs(request,cat):
|
||||
is_recent = 0
|
||||
queryset_list=[]
|
||||
queryset_list_doc=[]
|
||||
if cat == 'new':
|
||||
is_recent = 1
|
||||
queryset = InternetDraft.objects.filter(b_approve_date__gte = date_threshold(), intended_status__in=[1,2,6,7],idinternal__via_rfc_editor=0,idinternal__primary_flag=1).order_by("-b_approve_date")
|
||||
queryset_doc = InternetDraft.objects.filter(b_approve_date__gte = date_threshold(), intended_status__in=[3,5],idinternal__via_rfc_editor=0, idinternal__primary_flag=1).order_by("-b_approve_date")
|
||||
elif cat == 'prev':
|
||||
queryset = InternetDraft.objects.filter(b_approve_date__lt = date_threshold(), b_approve_date__gte = '1997-12-1', intended_status__in=[1,2,6,7],idinternal__via_rfc_editor=0,idinternal__primary_flag=1).order_by("-b_approve_date")
|
||||
queryset_doc = InternetDraft.objects.filter(b_approve_date__lt = date_threshold(), b_approve_date__gte = '1998-10-15', intended_status__in=[3,5],idinternal__via_rfc_editor=0,idinternal__primary_flag=1).order_by("-b_approve_date")
|
||||
else:
|
||||
raise Http404
|
||||
for item in list(queryset):
|
||||
queryset_list.append(item)
|
||||
try:
|
||||
ballot_id=item.idinternal.ballot_id
|
||||
except AttributeError:
|
||||
ballot_id=0
|
||||
for sub_item in list(InternetDraft.objects.filter(idinternal__ballot=ballot_id,idinternal__primary_flag=0)):
|
||||
queryset_list.append(sub_item)
|
||||
for item2 in list(queryset_doc):
|
||||
queryset_list_doc.append(item2)
|
||||
try:
|
||||
ballot_id=item2.idinternal.ballot_id
|
||||
except AttributeError:
|
||||
ballot_id=0
|
||||
for sub_item2 in list(InternetDraft.objects.filter(idinternal__ballot=ballot_id,idinternal__primary_flag=0)):
|
||||
queryset_list_doc.append(sub_item2)
|
||||
return render_to_response( 'iesg/ietf_doc.html', {'object_list': queryset_list, 'object_list_doc':queryset_list_doc, 'is_recent':is_recent}, context_instance=RequestContext(request) )
|
||||
pass
|
||||
|
||||
def wgdocsREDESIGN(request,cat):
|
||||
is_recent = 0
|
||||
|
@ -122,7 +90,7 @@ def wgdocsREDESIGN(request,cat):
|
|||
if cat == 'new':
|
||||
is_recent = 1
|
||||
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__gte=threshold, intended_std_level__in=proto_levels + doc_levels).exclude(tags__slug="via-rfc").distinct()
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__gte=threshold, intended_std_level__in=proto_levels + doc_levels).exclude(stream__in=("ISE","IRTF")).distinct()
|
||||
for d in drafts:
|
||||
if d.b_approve_date and d.b_approve_date >= threshold:
|
||||
if d.intended_std_level_id in proto_levels:
|
||||
|
@ -134,7 +102,7 @@ def wgdocsREDESIGN(request,cat):
|
|||
# proto
|
||||
start_date = datetime.date(1997, 12, 1)
|
||||
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__lt=threshold, docevent__time__gte=start_date, intended_std_level__in=proto_levels).exclude(tags__slug="via-rfc").distinct()
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__lt=threshold, docevent__time__gte=start_date, intended_std_level__in=proto_levels).exclude(stream__in=("ISE","IRTF")).distinct()
|
||||
|
||||
for d in drafts:
|
||||
if d.b_approve_date and start_date <= d.b_approve_date < threshold:
|
||||
|
@ -143,7 +111,7 @@ def wgdocsREDESIGN(request,cat):
|
|||
# doc
|
||||
start_date = datetime.date(1998, 10, 15)
|
||||
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__lt=threshold, docevent__time__gte=start_date, intended_std_level__in=doc_levels).exclude(tags__slug="via-rfc").distinct()
|
||||
drafts = InternetDraft.objects.filter(docevent__type="iesg_approved", docevent__time__lt=threshold, docevent__time__gte=start_date, intended_std_level__in=doc_levels).exclude(stream__in=("ISE","IRTF")).distinct()
|
||||
|
||||
for d in drafts:
|
||||
if d.b_approve_date and start_date <= d.b_approve_date < threshold:
|
||||
|
@ -166,28 +134,7 @@ if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
|||
|
||||
|
||||
def get_doc_section(id):
|
||||
states = [16,17,18,19,20,21]
|
||||
if id.document().intended_status.intended_status_id in [1,2,6,7]:
|
||||
s = "2"
|
||||
else:
|
||||
s = "3"
|
||||
if id.rfc_flag == 0:
|
||||
g = id.document().group_acronym()
|
||||
else:
|
||||
g = id.document().group_acronym
|
||||
if g and str(g) != 'none':
|
||||
s = s + "1"
|
||||
elif (s == "3") and id.via_rfc_editor > 0:
|
||||
s = s + "3"
|
||||
else:
|
||||
s = s + "2"
|
||||
if not id.rfc_flag and id.cur_state.document_state_id not in states:
|
||||
s = s + "3"
|
||||
elif id.returning_item > 0:
|
||||
s = s + "2"
|
||||
else:
|
||||
s = s + "1"
|
||||
return s
|
||||
pass
|
||||
|
||||
def get_doc_sectionREDESIGN(id):
|
||||
states = [16,17,18,19,20,21]
|
||||
|
@ -199,7 +146,7 @@ def get_doc_sectionREDESIGN(id):
|
|||
g = id.document().group_acronym()
|
||||
if g and str(g) != 'none':
|
||||
s = s + "1"
|
||||
elif (s == "3") and id.via_rfc_editor:
|
||||
elif (s == "3") and id.stream in ("ISE","IRTF"):
|
||||
s = s + "3"
|
||||
else:
|
||||
s = s + "2"
|
||||
|
@ -370,7 +317,7 @@ def agenda_documents_txt(request):
|
|||
else:
|
||||
docs.extend(IDInternal.objects.filter(telechat_date=date, primary_flag=1, agenda=1))
|
||||
t = loader.get_template('iesg/agenda_documents.txt')
|
||||
c = Context({'docs':docs})
|
||||
c = Context({'docs':docs,'special_stream_list':['ISE','IRTF']})
|
||||
return HttpResponse(t.render(c), mimetype='text/plain')
|
||||
|
||||
class RescheduleForm(forms.Form):
|
||||
|
|
|
@ -301,40 +301,6 @@ class DraftTagsStateForm(StreamDraftForm):
|
|||
e.save()
|
||||
|
||||
|
||||
class DraftStreamForm(StreamDraftForm):
|
||||
|
||||
comment = forms.CharField(widget=forms.Textarea)
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
stream = forms.ModelChoiceField(StreamName.objects.exclude(slug="legacy"))
|
||||
else:
|
||||
stream = forms.ModelChoiceField(Stream.objects.all())
|
||||
|
||||
template = 'ietfworkflows/stream_form.html'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(DraftStreamForm, self).__init__(*args, **kwargs)
|
||||
self.stream = get_stream_from_draft(self.draft)
|
||||
self.tags = [i.annotation_tag for i in get_annotation_tags_for_draft(self.draft)]
|
||||
if self.stream:
|
||||
self.fields['stream'].initial = self.stream.pk
|
||||
|
||||
def save(self):
|
||||
comment = self.cleaned_data.get('comment').strip()
|
||||
to_stream = self.cleaned_data.get('stream')
|
||||
|
||||
update_stream(self.request, self.draft,
|
||||
comment=comment,
|
||||
person=self.person,
|
||||
to_stream=to_stream)
|
||||
|
||||
if comment:
|
||||
e = DocEvent(type="added_comment")
|
||||
e.time = self.draft.time
|
||||
e.by = self.person
|
||||
e.doc_id = self.draft.pk
|
||||
e.desc = comment
|
||||
e.save()
|
||||
|
||||
class StreamDelegatesForm(forms.Form):
|
||||
email = forms.EmailField()
|
||||
|
||||
|
|
|
@ -75,9 +75,6 @@ def edit_actions(context, wrapper):
|
|||
if can_edit_state(user, draft):
|
||||
actions.append(("Change stream state", urlreverse('edit_state', kwargs=dict(name=doc.draft_name))))
|
||||
|
||||
if can_edit_stream(user, draft):
|
||||
actions.append(("Change stream", urlreverse('edit_stream', kwargs=dict(name=doc.draft_name))))
|
||||
|
||||
if can_manage_shepherd_of_a_document(user, draft):
|
||||
actions.append(("Change shepherd", urlreverse('doc_managing_shepherd', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
|
||||
|
|
|
@ -139,37 +139,6 @@ class EditStreamInfoTestCase(django.test.TestCase):
|
|||
self.assertTrue("wgchairman@ietf.org" in unicode(outbox[-1]))
|
||||
self.assertTrue("wgdelegate@ietf.org" in unicode(outbox[-1]))
|
||||
|
||||
def test_set_stream(self):
|
||||
draft = make_test_data()
|
||||
draft.stream = None
|
||||
draft.save()
|
||||
|
||||
url = urlreverse('edit_stream', kwargs=dict(name=draft.name))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
# get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('select[name=stream]')), 1)
|
||||
|
||||
# set state
|
||||
mailbox_before = len(outbox)
|
||||
events_before = draft.docevent_set.count()
|
||||
r = self.client.post(url,
|
||||
dict(comment="some comment",
|
||||
stream="irtf",
|
||||
))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
|
||||
draft = Document.objects.get(pk=draft.pk)
|
||||
self.assertEquals(draft.stream_id, "irtf")
|
||||
self.assertEquals(draft.docevent_set.count() - events_before, 2)
|
||||
self.assertEquals(len(outbox), mailbox_before + 1)
|
||||
self.assertTrue("stream changed" in outbox[-1]["Subject"].lower())
|
||||
self.assertTrue("wgchairman@ietf.org" in unicode(outbox[-1]))
|
||||
self.assertTrue("wgdelegate@ietf.org" in unicode(outbox[-1]))
|
||||
|
||||
def test_manage_stream_delegates(self):
|
||||
make_test_data()
|
||||
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
# Copyright The IETF Trust 2008, All Rights Reserved
|
||||
|
||||
from django.conf.urls.defaults import patterns, url
|
||||
from django.views.generic.simple import redirect_to
|
||||
|
||||
urlpatterns = patterns('ietf.ietfworkflows.views',
|
||||
url(r'^(?P<name>[^/]+)/history/$', 'stream_history', name='stream_history'),
|
||||
url(r'^(?P<name>[^/]+)/edit/adopt/$', 'edit_adopt', name='edit_adopt'),
|
||||
url(r'^(?P<name>[^/]+)/edit/state/$', 'edit_state', name='edit_state'),
|
||||
url(r'^(?P<name>[^/]+)/edit/stream/$', 'edit_stream', name='edit_stream'),
|
||||
url(r'^(?P<name>[^/]+)/edit/stream/$', redirect_to, { 'url': '/doc/%(name)s/edit/info/'}) ,
|
||||
url(r'^delegates/(?P<stream_name>[^/]+)/$', 'stream_delegates', name='stream_delegates'),
|
||||
)
|
||||
|
|
|
@ -7,7 +7,6 @@ from django.core.urlresolvers import reverse as urlreverse
|
|||
from ietf.idtracker.models import InternetDraft
|
||||
from ietf.ietfworkflows.models import Stream, StreamDelegate
|
||||
from ietf.ietfworkflows.forms import (DraftTagsStateForm,
|
||||
DraftStreamForm,
|
||||
NoWorkflowStateForm,
|
||||
StreamDelegatesForm)
|
||||
from ietf.ietfworkflows.streams import (get_stream_from_draft,
|
||||
|
@ -114,12 +113,6 @@ def edit_state(request, name):
|
|||
return _edit_draft_stream(request, draft, DraftTagsStateForm)
|
||||
|
||||
|
||||
def edit_stream(request, name):
|
||||
draft = get_object_or_404(InternetDraft, filename=name)
|
||||
if not can_edit_stream(request.user, draft):
|
||||
return HttpResponseForbidden("You don't have permission to access this view")
|
||||
return _edit_draft_stream(request, draft, DraftStreamForm)
|
||||
|
||||
|
||||
def stream_delegates(request, stream_name):
|
||||
stream = get_object_or_404(Stream, name=stream_name)
|
||||
|
|
|
@ -31,4 +31,4 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{% endcomment %}# Fields: telechat date, filename (draft-foo-bar or rfc1234), intended status, rfc editor submission flag (0=no, 1=yes), area acronym, AD name, version{% for doc in docs %}
|
||||
{{ doc.telechat_date }} {{ doc.document.filename }} {{ doc.document.intended_status }} {{doc.via_rfc_editor|yesno:"1,0,0"}} {{doc.area_acronym|lower}} {{doc.token_name }} {{doc.document.revision}}{% endfor %}
|
||||
{{ doc.telechat_date }} {{ doc.document.filename }} {{ doc.document.intended_status }} {% if doc.stream in special_stream_list %}1{% else %}0{% endif %} {{doc.document.revision}}{% endfor %}
|
||||
|
|
|
@ -15,7 +15,7 @@ The RFC Editor receives requests to publish non-IETF Working Group documents as
|
|||
{% regroup date.list by idinternal.ballot_id as ballots %}
|
||||
{% for each_ballot in ballots %}
|
||||
{% if each_ballot.grouper %}
|
||||
<li> <a href="/iesg/ann/{{ each_ballot.grouper }}/">
|
||||
<li> <a href="/doc/{{ each_ballot.grouper }}/">
|
||||
{% for item in each_ballot.list %}
|
||||
{{ item.title|escape }} ({{ item.intended_status }})<br>
|
||||
{% endfor %}
|
||||
|
@ -33,7 +33,7 @@ The RFC Editor receives requests to publish non-IETF Working Group documents as
|
|||
<b>Date Sent: {{ date.grouper }}</b>
|
||||
<ul>
|
||||
{% for item in date.list %}
|
||||
<li><a href="/iesg/ann/{{ item.ballot_id }}/">{{ item.draft.title|escape }} ({{item.draft.intended_status }})</a>
|
||||
<li><a href="/doc/{{ item.ballot_id }}/">{{ item.draft.title|escape }} ({{item.draft.intended_status }})</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endfor %}
|
||||
|
|
Loading…
Reference in a new issue