Skip to content

Commit 2d420fa

Browse files
committed
Merged additional django-port and shim-removal tweaks from olau@iola.dk: branch/iola/djangoport@7167.
- Legacy-Id: 7168
2 parents 6e97c2c + e2554a6 commit 2d420fa

27 files changed

Lines changed: 818 additions & 238 deletions

ietf/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- coding: utf-8-no-bom -*-
22
# Copyright The IETF Trust 2007, All Rights Reserved
33

4-
__version__ = "4.91-dev"
4+
__version__ = "5.0.0-dev"
55

66
__date__ = "$Date$"
77

ietf/doc/expire.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ietf.doc.models import Document, DocEvent, State, save_document_in_history, IESG_SUBSTATE_TAGS
1111
from ietf.person.models import Person, Email
1212
from ietf.meeting.models import Meeting
13-
from ietf.doc.utils import log_state_changed
13+
from ietf.doc.utils import add_state_change_event
1414

1515
def expirable_draft(draft):
1616
"""Return whether draft is in an expirable state or not. This is
@@ -122,20 +122,18 @@ def expire_draft(doc):
122122
# clean up files
123123
move_draft_files_to_archive(doc, doc.rev)
124124

125-
# change the state
126125
system = Person.objects.get(name="(System)")
127126

127+
# change the state
128128
save_document_in_history(doc)
129129
if doc.latest_event(type='started_iesg_process'):
130-
dead_state = State.objects.get(used=True, type="draft-iesg", slug="dead")
131-
prev_state = doc.friendly_state()
132-
prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
133-
prev_tag = prev_tag[0] if prev_tag else None
134-
if doc.get_state("draft-iesg") != dead_state:
135-
doc.set_state(dead_state)
136-
if prev_tag:
137-
doc.tags.remove(prev_tag)
138-
log_state_changed(None, doc, system, doc.friendly_state(), prev_state)
130+
new_state = State.objects.get(used=True, type="draft-iesg", slug="dead")
131+
prev_state = doc.get_state(new_state.type_id)
132+
prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
133+
if new_state != prev_state:
134+
doc.set_state(new_state)
135+
doc.tags.remove(*prev_tags)
136+
e = add_state_change_event(doc, system, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
139137

140138
e = DocEvent(doc=doc, by=system)
141139
e.type = "expired_document"

ietf/doc/lastcall.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from ietf.doc.models import *
88
from ietf.person.models import Person
9-
from ietf.doc.utils import log_state_changed
9+
from ietf.doc.utils import add_state_change_event
1010
from ietf.doc.mails import *
1111

1212
def request_last_call(request, doc):
@@ -36,30 +36,27 @@ def get_expired_last_calls():
3636

3737
def expire_last_call(doc):
3838
if doc.type_id == 'draft':
39-
state = State.objects.get(used=True, type="draft-iesg", slug="writeupw")
39+
new_state = State.objects.get(used=True, type="draft-iesg", slug="writeupw")
4040
e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text")
4141
if e and "Relevant content can frequently be found in the abstract" not in e.text:
4242
# if boiler-plate text has been removed, we assume the
4343
# write-up has been written
44-
state = State.objects.get(used=True, type="draft-iesg", slug="goaheadw")
45-
prev = doc.get_state("draft-iesg")
44+
new_state = State.objects.get(used=True, type="draft-iesg", slug="goaheadw")
4645
elif doc.type_id == 'statchg':
47-
state = State.objects.get(used=True, type="statchg", slug="goahead")
48-
prev = doc.get_state("statchg")
46+
new_state = State.objects.get(used=True, type="statchg", slug="goahead")
4947
else:
5048
raise ValueError("Unexpected document type to expire_last_call(): %s" % doc.type)
5149

52-
prev_state = doc.friendly_state()
53-
5450
save_document_in_history(doc)
55-
doc.set_state(state)
5651

57-
prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
58-
prev_tag = prev_tag[0] if prev_tag else None
59-
if prev_tag:
60-
doc.tags.remove(prev_tag)
52+
prev_state = doc.get_state(new_state.type_id)
53+
doc.set_state(new_state)
54+
55+
prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
56+
doc.tags.remove(*prev_tags)
6157

62-
e = log_state_changed(None, doc, Person.objects.get(name="(System)"), doc.friendly_state(), prev_state)
58+
system = Person.objects.get(name="(System)")
59+
e = add_state_change_event(doc, system, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
6360

6461
doc.time = e.time
6562
doc.save()

ietf/doc/migrations/0017_set_type_to_changed_state.py

Lines changed: 464 additions & 0 deletions
Large diffs are not rendered by default.

ietf/doc/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ def friendly_state(self):
426426
# Expired/Withdrawn by Submitter/IETF
427427
return state.name
428428
else:
429-
return state.name
429+
return state.name
430430

431431
def ipr(self):
432432
"""Returns the IPR disclosures against this document (as a queryset over IprDocAlias)."""

ietf/doc/templatetags/ballot_icon.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -143,44 +143,38 @@ def state_age_colored(doc):
143143
if not doc.get_state_slug() in ["active", "rfc"]:
144144
# Don't show anything for expired/withdrawn/replaced drafts
145145
return ""
146-
main_state = doc.get_state_slug('draft-iesg')
147-
if not main_state:
146+
iesg_state = doc.get_state_slug('draft-iesg')
147+
if not iesg_state:
148148
return ""
149149

150-
if main_state in ["dead", "watching", "pub"]:
150+
if iesg_state in ["dead", "watching", "pub"]:
151151
return ""
152152
try:
153153
state_date = doc.docevent_set.filter(
154-
Q(desc__istartswith="Draft Added by ")|
155-
Q(desc__istartswith="Draft Added in state ")|
156-
Q(desc__istartswith="Draft added in state ")|
157-
Q(desc__istartswith="State changed to ")|
158-
Q(desc__istartswith="State Changes to ")|
159-
Q(desc__istartswith="Sub state has been changed to ")|
160-
Q(desc__istartswith="State has been changed to ")|
161-
Q(desc__istartswith="IESG process started in state")
162-
).order_by('-time')[0].time.date()
154+
Q(type="started_iesg_process")|
155+
Q(type="changed_state", statedocevent__state_type="draft-iesg")
156+
).order_by('-time')[0].time.date()
163157
except IndexError:
164158
state_date = datetime.date(1990,1,1)
165159
days = (datetime.date.today() - state_date).days
166160
# loosely based on
167161
# http://trac.tools.ietf.org/group/iesg/trac/wiki/PublishPath
168-
if main_state == "lc":
162+
if iesg_state == "lc":
169163
goal1 = 30
170164
goal2 = 30
171-
elif main_state == "rfcqueue":
165+
elif iesg_state == "rfcqueue":
172166
goal1 = 60
173167
goal2 = 120
174-
elif main_state in ["lc-req", "ann"]:
168+
elif iesg_state in ["lc-req", "ann"]:
175169
goal1 = 4
176170
goal2 = 7
177171
elif 'need-rev' in [x.slug for x in doc.tags.all()]:
178172
goal1 = 14
179173
goal2 = 28
180-
elif main_state == "pub-req":
174+
elif iesg_state == "pub-req":
181175
goal1 = 7
182176
goal2 = 14
183-
elif main_state == "ad-eval":
177+
elif iesg_state == "ad-eval":
184178
goal1 = 14
185179
goal2 = 28
186180
else:

ietf/doc/tests_charter.py

Lines changed: 126 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,29 @@ def setUp(self):
3030
def tearDown(self):
3131
shutil.rmtree(self.charter_dir)
3232

33+
def test_startstop_process(self):
34+
make_test_data()
35+
36+
group = Group.objects.get(acronym="mars")
37+
charter = group.charter
38+
39+
for option in ("recharter", "abandon"):
40+
self.client.logout()
41+
url = urlreverse('charter_startstop_process', kwargs=dict(name=charter.name, option=option))
42+
login_testing_unauthorized(self, "secretary", url)
43+
44+
# normal get
45+
r = self.client.get(url)
46+
self.assertEqual(r.status_code, 200)
47+
48+
# post
49+
r = self.client.post(url, dict(message="test message"))
50+
self.assertEqual(r.status_code, 302)
51+
if option == "abandon":
52+
self.assertTrue("abandoned" in charter.latest_event(type="changed_document").desc.lower())
53+
else:
54+
self.assertTrue("state changed" in charter.latest_event(type="changed_state").desc.lower())
55+
3356
def test_change_state(self):
3457
make_test_data()
3558

@@ -71,7 +94,7 @@ def test_change_state(self):
7194
def find_event(t):
7295
return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t]
7396

74-
self.assertTrue("state changed" in find_event("changed_document")[0].desc.lower())
97+
self.assertTrue("state changed" in find_event("changed_state")[0].desc.lower())
7598

7699
if slug in ("intrev", "iesgrev"):
77100
self.assertTrue(find_event("created_ballot"))
@@ -88,6 +111,10 @@ def test_edit_telechat_date(self):
88111
url = urlreverse('charter_telechat_date', kwargs=dict(name=charter.name))
89112
login_testing_unauthorized(self, "secretary", url)
90113

114+
# get
115+
r = self.client.get(url)
116+
self.assertEqual(r.status_code, 200)
117+
91118
# add to telechat
92119
self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
93120
telechat_date = TelechatDate.objects.active()[0].date
@@ -122,6 +149,10 @@ def test_edit_notify(self):
122149
url = urlreverse('charter_edit_notify', kwargs=dict(name=charter.name))
123150
login_testing_unauthorized(self, "secretary", url)
124151

152+
# get
153+
r = self.client.get(url)
154+
self.assertEqual(r.status_code, 200)
155+
125156
# post
126157
self.assertTrue(not charter.notify)
127158
r = self.client.post(url, dict(notify="someone@example.com, someoneelse@example.com"))
@@ -195,15 +226,82 @@ def test_submit_charter(self):
195226
self.assertEqual(f.read(),
196227
"Windows line\nMac line\nUnix line\n" + utf_8_snippet)
197228

198-
class ApproveCharterTests(TestCase):
199-
def setUp(self):
200-
self.charter_dir = os.path.abspath("tmp-charter-dir")
201-
os.mkdir(self.charter_dir)
202-
settings.CHARTER_PATH = self.charter_dir
229+
def test_edit_announcement_text(self):
230+
draft = make_test_data()
231+
charter = draft.group.charter
232+
233+
for ann in ("action", "review"):
234+
url = urlreverse('ietf.doc.views_charter.announcement_text', kwargs=dict(name=charter.name, ann=ann))
235+
self.client.logout()
236+
login_testing_unauthorized(self, "secretary", url)
237+
238+
# normal get
239+
r = self.client.get(url)
240+
self.assertEqual(r.status_code, 200)
241+
q = PyQuery(r.content)
242+
self.assertEqual(len(q('textarea[name=announcement_text]')), 1)
243+
# as Secretariat, we can send
244+
if ann == "review":
245+
mailbox_before = len(outbox)
246+
by = Person.objects.get(user__username="secretary")
247+
r = self.client.post(url, dict(
248+
announcement_text=default_review_text(draft.group, charter, by).text,
249+
send_text="1"))
250+
self.assertEqual(len(outbox), mailbox_before + 1)
251+
252+
# save
253+
r = self.client.post(url, dict(
254+
announcement_text="This is a simple test.",
255+
save_text="1"))
256+
self.assertEqual(r.status_code, 302)
257+
self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_%s_announcement" % ann).text)
203258

204-
def tearDown(self):
205-
shutil.rmtree(self.charter_dir)
259+
# test regenerate
260+
r = self.client.post(url, dict(
261+
announcement_text="This is a simple test.",
262+
regenerate_text="1"))
263+
self.assertEqual(r.status_code, 200)
264+
q = PyQuery(r.content)
265+
self.assertTrue(draft.group.name in charter.latest_event(WriteupDocEvent, type="changed_%s_announcement" % ann).text)
266+
267+
def test_edit_ballot_writeupnotes(self):
268+
draft = make_test_data()
269+
charter = draft.group.charter
270+
by = Person.objects.get(user__username="secretary")
271+
272+
BallotDocEvent.objects.create(
273+
type="created_ballot",
274+
ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"),
275+
by=by,
276+
doc=charter,
277+
desc="Created ballot",
278+
)
279+
280+
url = urlreverse('ietf.doc.views_charter.ballot_writeupnotes', kwargs=dict(name=charter.name))
281+
login_testing_unauthorized(self, "secretary", url)
282+
283+
default_action_text(draft.group, charter, by)
284+
285+
# normal get
286+
r = self.client.get(url)
287+
self.assertEqual(r.status_code, 200)
288+
q = PyQuery(r.content)
289+
self.assertEqual(len(q('textarea[name=ballot_writeup]')), 1)
290+
291+
# save
292+
r = self.client.post(url, dict(
293+
ballot_writeup="This is a simple test.",
294+
save_ballot_writeup="1"))
295+
self.assertEqual(r.status_code, 200)
296+
self.assertTrue("This is a simple test" in charter.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text)
206297

298+
# send
299+
mailbox_before = len(outbox)
300+
r = self.client.post(url, dict(
301+
ballot_writeup="This is a simple test.",
302+
send_ballot="1"))
303+
self.assertEqual(len(outbox), mailbox_before + 1)
304+
207305
def test_approve(self):
208306
make_test_data()
209307

@@ -278,3 +376,23 @@ def test_approve(self):
278376
self.assertEqual(group.groupmilestone_set.filter(state="active").count(), 2)
279377
self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m1.desc).count(), 1)
280378
self.assertEqual(group.groupmilestone_set.filter(state="active", desc=m4.desc).count(), 1)
379+
380+
def test_charter_with_milestones(self):
381+
draft = make_test_data()
382+
charter = draft.group.charter
383+
384+
NewRevisionDocEvent.objects.create(doc=charter,
385+
type="new_revision",
386+
rev=charter.rev,
387+
by=Person.objects.get(name="(System)"))
388+
389+
m = GroupMilestone.objects.create(group=draft.group,
390+
state_id="active",
391+
desc="Test milestone",
392+
due=datetime.date.today(),
393+
resolved="")
394+
395+
url = urlreverse('charter_with_milestones_txt', kwargs=dict(name=charter.name, rev=charter.rev))
396+
r = self.client.get(url)
397+
self.assertEqual(r.status_code, 200)
398+
self.assertTrue(m.desc in r.content)

ietf/doc/tests_draft.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_change_state(self):
6767
self.assertTrue(draft.tags.filter(slug="point"))
6868
self.assertEqual(draft.docevent_set.count(), events_before + 2)
6969
self.assertTrue("Test comment" in draft.docevent_set.all()[0].desc)
70-
self.assertTrue("State changed" in draft.docevent_set.all()[1].desc)
70+
self.assertTrue("IESG state changed" in draft.docevent_set.all()[1].desc)
7171
self.assertEqual(len(outbox), mailbox_before + 2)
7272
self.assertTrue("State Update Notice" in outbox[-2]['Subject'])
7373
self.assertTrue(draft.name in outbox[-1]['Subject'])
@@ -232,6 +232,10 @@ def test_edit_telechat_date(self):
232232
note="",
233233
)
234234

235+
# get
236+
r = self.client.get(url)
237+
self.assertEqual(r.status_code, 200)
238+
235239
# add to telechat
236240
self.assertTrue(not draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat"))
237241
data["telechat_date"] = TelechatDate.objects.active()[0].date.isoformat()
@@ -347,6 +351,11 @@ def test_edit_consensus(self):
347351
url = urlreverse('doc_edit_consensus', kwargs=dict(name=draft.name))
348352
login_testing_unauthorized(self, "secretary", url)
349353

354+
# get
355+
r = self.client.get(url)
356+
self.assertEqual(r.status_code, 200)
357+
358+
# post
350359
self.assertTrue(not draft.latest_event(ConsensusDocEvent, type="changed_consensus"))
351360
r = self.client.post(url, dict(consensus="Yes"))
352361
self.assertEqual(r.status_code, 302)

ietf/doc/urls_charter.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
url(r'^(?P<ann>action|review)/$', "ietf.doc.views_charter.announcement_text", name="charter_edit_announcement"),
1212
url(r'^ballotwriteupnotes/$', "ietf.doc.views_charter.ballot_writeupnotes"),
1313
url(r'^approve/$', "ietf.doc.views_charter.approve", name='charter_approve'),
14-
url(r'^submit/$', "ietf.doc.views_charter.submit", name='charter_submit'),
15-
url(r'^submit/(?P<option>initcharter|recharter)/$', "ietf.doc.views_charter.submit", name='charter_submit'), # shouldn't be here
14+
url(r'^submit/(?:(?P<option>initcharter|recharter)/)?$', "ietf.doc.views_charter.submit", name='charter_submit'),
1615
url(r'^withmilestones-(?P<rev>[0-9-]+).txt$', "ietf.doc.views_charter.charter_with_milestones_txt", name='charter_with_milestones_txt'),
1716
)

0 commit comments

Comments
 (0)