Skip to content

Commit 2f34766

Browse files
committed
In order that document states (which may be used by old documents) should not need to be removed when state machines change and states go out of use, all document states have a 'used' field. The code which accesses the state fields have not been requiring that used=True for the states returned, which is an error. Fixed this by adding 'used=True' to all State.objects.get() and State.objects.filter() call where it's relevant.
- Legacy-Id: 5486
2 parents 9ac6cdc + 275f82d commit 2f34766

29 files changed

Lines changed: 117 additions & 117 deletions

ietf/doc/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def render(self, name, value, attrs=None, choices=()):
4242

4343
categorized_choices = []
4444
for t in types:
45-
states = State.objects.filter(type=t).select_related()
45+
states = State.objects.filter(used=True, type=t).select_related()
4646
if states:
4747
categorized_choices.append((t.label, states))
4848

ietf/doc/tests_conflict_review.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_start_review(self):
6161

6262
# successful review start
6363
ad_strpk = str(Person.objects.get(name='Aread Irector').pk)
64-
state_strpk = str(State.objects.get(slug='needshep',type__slug='conflrev').pk)
64+
state_strpk = str(State.objects.get(used=True, slug='needshep',type__slug='conflrev').pk)
6565
r = self.client.post(url,dict(ad=ad_strpk,create_in_state=state_strpk,notify='ipu@ietf.org'))
6666
self.assertEquals(r.status_code, 302)
6767
review_doc = Document.objects.get(name='conflict-review-imaginary-independent-submission')
@@ -99,7 +99,7 @@ def test_change_state(self):
9999
self.assertTrue(len(q('form ul.errorlist')) > 0)
100100

101101
# successful change to AD Review
102-
adrev_pk = str(State.objects.get(slug='adrev',type__slug='conflrev').pk)
102+
adrev_pk = str(State.objects.get(used=True, slug='adrev',type__slug='conflrev').pk)
103103
r = self.client.post(url,dict(review_state=adrev_pk,comment='RDNK84ZD'))
104104
self.assertEquals(r.status_code, 302)
105105
review_doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
@@ -108,7 +108,7 @@ def test_change_state(self):
108108
self.assertFalse(review_doc.active_ballot())
109109

110110
# successful change to IESG Evaluation
111-
iesgeval_pk = str(State.objects.get(slug='iesgeval',type__slug='conflrev').pk)
111+
iesgeval_pk = str(State.objects.get(used=True, slug='iesgeval',type__slug='conflrev').pk)
112112
r = self.client.post(url,dict(review_state=iesgeval_pk,comment='TGmZtEjt'))
113113
self.assertEquals(r.status_code, 302)
114114
review_doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
@@ -214,7 +214,7 @@ def approve_test_helper(self,approve_type):
214214

215215
# Some additional setup
216216
create_ballot_if_not_open(doc,Person.objects.get(name="Sec Retary"),"conflrev")
217-
doc.set_state(State.objects.get(slug=approve_type+'-pend',type='conflrev'))
217+
doc.set_state(State.objects.get(used=True, slug=approve_type+'-pend',type='conflrev'))
218218
doc.save()
219219

220220
# get

ietf/doc/views_conflict_review.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from ietf.group.models import Role, Group
2727

2828
class ChangeStateForm(forms.Form):
29-
review_state = forms.ModelChoiceField(State.objects.filter(type="conflrev", used=True), label="Conflict review state", empty_label=None, required=True)
29+
review_state = forms.ModelChoiceField(State.objects.filter(used=True, type="conflrev"), label="Conflict review state", empty_label=None, required=True)
3030
comment = forms.CharField(widget=forms.Textarea, help_text="Optional comment for the review history", required=False)
3131
def __init__(self, *args, **kwargs):
3232
self.hide = kwargs.pop('hide', None)
@@ -329,7 +329,7 @@ def approve(request, name):
329329
if form.is_valid():
330330

331331
new_state_slug = 'appr-reqnopub-sent' if review.get_state('conflrev').slug=='appr-reqnopub-pend' else 'appr-noprob-sent'
332-
new_review_state = State.objects.get(type="conflrev", slug=new_state_slug)
332+
new_review_state = State.objects.get(used=True, type="conflrev", slug=new_state_slug)
333333
save_document_in_history(review)
334334
old_description = review.friendly_state()
335335
review.set_state(new_review_state)
@@ -372,7 +372,7 @@ def approve(request, name):
372372
class StartReviewForm(forms.Form):
373373
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'),
374374
label="Shepherding AD", empty_label="(None)", required=True)
375-
create_in_state = forms.ModelChoiceField(State.objects.filter(type="conflrev", slug__in=("needshep", "adrev")), empty_label=None, required=False)
375+
create_in_state = forms.ModelChoiceField(State.objects.filter(used=True, type="conflrev", slug__in=("needshep", "adrev")), empty_label=None, required=False)
376376
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas", required=False)
377377
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()'}))
378378

ietf/help/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def state(request, doc, type=None):
1212
slug = "%s-%s" % (doc,type) if type else doc
1313
debug.show('slug')
1414
statetype = get_object_or_404(StateType, slug=slug)
15-
states = State.objects.filter(type=statetype).order_by('order')
15+
states = State.objects.filter(used=True, type=statetype).order_by('order')
1616
return render_to_response('help/states.html', {"doc": doc, "type": statetype, "states":states},
1717
context_instance=RequestContext(request))
1818

ietf/idrfc/expire.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ def expirable_documents():
4141

4242
nonexpirable_states = []
4343
# all IESG states except AD Watching and Dead block expiry
44-
nonexpirable_states += list(State.objects.filter(type="draft-iesg").exclude(slug__in=("watching", "dead")))
44+
nonexpirable_states += list(State.objects.filter(used=True, type="draft-iesg").exclude(slug__in=("watching", "dead")))
4545
# Sent to RFC Editor and RFC Published block expiry (the latter
4646
# shouldn't be possible for an active draft, though)
47-
nonexpirable_states += list(State.objects.filter(type__in=("draft-stream-iab", "draft-stream-irtf", "draft-stream-ise"), slug__in=("rfc-edit", "pub")))
47+
nonexpirable_states += list(State.objects.filter(used=True, type__in=("draft-stream-iab", "draft-stream-irtf", "draft-stream-ise"), slug__in=("rfc-edit", "pub")))
4848

4949
return d.exclude(states__in=nonexpirable_states).distinct()
5050

@@ -220,7 +220,7 @@ def expire_idREDESIGN(doc):
220220

221221
save_document_in_history(doc)
222222
if doc.latest_event(type='started_iesg_process'):
223-
dead_state = State.objects.get(type="draft-iesg", slug="dead")
223+
dead_state = State.objects.get(used=True, type="draft-iesg", slug="dead")
224224
prev = doc.get_state("draft-iesg")
225225
prev_tag = doc.tags.filter(slug__in=('point', 'ad-f-up', 'need-rev', 'extpty'))
226226
prev_tag = prev_tag[0] if prev_tag else None
@@ -235,7 +235,7 @@ def expire_idREDESIGN(doc):
235235
e.desc = "Document has expired"
236236
e.save()
237237

238-
doc.set_state(State.objects.get(type="draft", slug="expired"))
238+
doc.set_state(State.objects.get(used=True, type="draft", slug="expired"))
239239
doc.time = datetime.datetime.now()
240240
doc.save()
241241

ietf/idrfc/lastcall.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ def expire_last_call(doc):
7070
email_last_call_expired(doc)
7171

7272
def expire_last_callREDESIGN(doc):
73-
state = State.objects.get(type="draft-iesg", slug="writeupw")
73+
state = State.objects.get(used=True, type="draft-iesg", slug="writeupw")
7474

7575
e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text")
7676
if e and "What does this protocol do and why" not in e.text:
7777
# if boiler-plate text has been removed, we assume the
7878
# write-up has been written
79-
state = State.objects.get(type="draft-iesg", slug="goaheadw")
79+
state = State.objects.get(used=True, type="draft-iesg", slug="goaheadw")
8080

8181
save_document_in_history(doc)
8282

ietf/idrfc/testsREDESIGN.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class ChangeStateTestCase(django.test.TestCase):
6363

6464
def test_change_state(self):
6565
draft = make_test_data()
66-
draft.set_state(State.objects.get(type="draft-iesg", slug="ad-eval"))
66+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="ad-eval"))
6767

6868
url = urlreverse('doc_change_state', kwargs=dict(name=draft.name))
6969
login_testing_unauthorized(self, "secretary", url)
@@ -82,7 +82,7 @@ def test_change_state(self):
8282

8383

8484
# faulty post
85-
r = self.client.post(url, dict(state=State.objects.get(type="draft", slug="active").pk))
85+
r = self.client.post(url, dict(state=State.objects.get(used=True, type="draft", slug="active").pk))
8686
self.assertEquals(r.status_code, 200)
8787
q = PyQuery(r.content)
8888
self.assertTrue(len(q('form ul.errorlist')) > 0)
@@ -96,7 +96,7 @@ def test_change_state(self):
9696
draft.tags.add("ad-f-up")
9797

9898
r = self.client.post(url,
99-
dict(state=State.objects.get(type="draft-iesg", slug="review-e").pk,
99+
dict(state=State.objects.get(used=True, type="draft-iesg", slug="review-e").pk,
100100
substate="point",
101101
comment="Test comment"))
102102
self.assertEquals(r.status_code, 302)
@@ -121,7 +121,7 @@ def test_change_state(self):
121121

122122
def test_pull_from_rfc_queue(self):
123123
draft = make_test_data()
124-
draft.set_state(State.objects.get(type="draft-iesg", slug="rfcqueue"))
124+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="rfcqueue"))
125125

126126
url = urlreverse('doc_change_state', kwargs=dict(name=draft.name))
127127
login_testing_unauthorized(self, "secretary", url)
@@ -130,7 +130,7 @@ def test_pull_from_rfc_queue(self):
130130
mailbox_before = len(outbox)
131131

132132
r = self.client.post(url,
133-
dict(state=State.objects.get(type="draft-iesg", slug="review-e").pk,
133+
dict(state=State.objects.get(used=True, type="draft-iesg", slug="review-e").pk,
134134
substate="",
135135
comment="Test comment"))
136136
self.assertEquals(r.status_code, 302)
@@ -146,8 +146,8 @@ def test_pull_from_rfc_queue(self):
146146
def test_change_iana_state(self):
147147
draft = make_test_data()
148148

149-
first_state = State.objects.get(type="draft-iana-review", slug="need-rev")
150-
next_state = State.objects.get(type="draft-iana-review", slug="ok-noact")
149+
first_state = State.objects.get(used=True, type="draft-iana-review", slug="need-rev")
150+
next_state = State.objects.get(used=True, type="draft-iana-review", slug="ok-noact")
151151
draft.set_state(first_state)
152152

153153
url = urlreverse('doc_change_iana_state', kwargs=dict(name=draft.name, state_type="iana-review"))
@@ -176,15 +176,15 @@ def test_change_iana_state(self):
176176

177177
def test_request_last_call(self):
178178
draft = make_test_data()
179-
draft.set_state(State.objects.get(type="draft-iesg", slug="ad-eval"))
179+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="ad-eval"))
180180

181181
self.client.login(remote_user="secretary")
182182
url = urlreverse('doc_change_state', kwargs=dict(name=draft.name))
183183

184184
mailbox_before = len(outbox)
185185

186186
self.assertTrue(not draft.latest_event(type="changed_ballot_writeup_text"))
187-
r = self.client.post(url, dict(state=State.objects.get(type="draft-iesg", slug="lc-req").pk))
187+
r = self.client.post(url, dict(state=State.objects.get(used=True, type="draft-iesg", slug="lc-req").pk))
188188
self.assertContains(r, "Your request to issue the Last Call")
189189

190190
# last call text
@@ -348,7 +348,7 @@ def test_start_iesg_process_on_draft(self):
348348
r = self.client.post(url,
349349
dict(intended_std_level=str(draft.intended_std_level_id),
350350
ad=ad.pk,
351-
create_in_state=State.objects.get(type="draft-iesg", slug="watching").pk,
351+
create_in_state=State.objects.get(used=True, type="draft-iesg", slug="watching").pk,
352352
notify="test@example.com",
353353
note="This is a note",
354354
telechat_date="",
@@ -383,7 +383,7 @@ class ResurrectTestCase(django.test.TestCase):
383383

384384
def test_request_resurrect(self):
385385
draft = make_test_data()
386-
draft.set_state(State.objects.get(type="draft", slug="expired"))
386+
draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
387387

388388
url = urlreverse('doc_request_resurrect', kwargs=dict(name=draft.name))
389389

@@ -414,7 +414,7 @@ def test_request_resurrect(self):
414414

415415
def test_resurrect(self):
416416
draft = make_test_data()
417-
draft.set_state(State.objects.get(type="draft", slug="expired"))
417+
draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
418418

419419
DocEvent.objects.create(doc=draft,
420420
type="requested_resurrect",
@@ -636,7 +636,7 @@ class DeferBallotTestCase(django.test.TestCase):
636636

637637
def test_defer_ballot(self):
638638
draft = make_test_data()
639-
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
639+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva"))
640640

641641
url = urlreverse('doc_defer_ballot', kwargs=dict(name=draft.name))
642642
login_testing_unauthorized(self, "ad", url)
@@ -661,7 +661,7 @@ def test_defer_ballot(self):
661661

662662
def test_undefer_ballot(self):
663663
draft = make_test_data()
664-
draft.set_state(State.objects.get(type="draft-iesg", slug="defer"))
664+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="defer"))
665665

666666
url = urlreverse('doc_undefer_ballot', kwargs=dict(name=draft.name))
667667
login_testing_unauthorized(self, "ad", url)
@@ -747,7 +747,7 @@ def test_edit_ballot_writeup(self):
747747
login_testing_unauthorized(self, "secretary", url)
748748

749749
# add a IANA review note
750-
draft.set_state(State.objects.get(type="draft-iana-review", slug="not-ok"))
750+
draft.set_state(State.objects.get(used=True, type="draft-iana-review", slug="not-ok"))
751751
DocEvent.objects.create(type="iana_review",
752752
doc=draft,
753753
by=Person.objects.get(user__username="iana"),
@@ -850,7 +850,7 @@ def test_edit_approval_text(self):
850850
self.assertTrue("Subject: Protocol Action" in draft.latest_event(WriteupDocEvent, type="changed_ballot_approval_text").text)
851851

852852
# test regenerate when it's a disapprove
853-
draft.set_state(State.objects.get(type="draft-iesg", slug="nopubadw"))
853+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="nopubadw"))
854854

855855
r = self.client.post(url, dict(regenerate_approval_text="1"))
856856
self.assertEquals(r.status_code, 200)
@@ -861,7 +861,7 @@ def test_edit_approval_text(self):
861861
draft.group = Group.objects.get(type="individ")
862862
draft.stream_id = "irtf"
863863
draft.save()
864-
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
864+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva"))
865865

866866
r = self.client.post(url, dict(regenerate_approval_text="1"))
867867
self.assertEquals(r.status_code, 200)
@@ -873,7 +873,7 @@ class ApproveBallotTestCase(django.test.TestCase):
873873

874874
def test_approve_ballot(self):
875875
draft = make_test_data()
876-
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva")) # make sure it's approvable
876+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva")) # make sure it's approvable
877877

878878
url = urlreverse('doc_approve_ballot', kwargs=dict(name=draft.name))
879879
login_testing_unauthorized(self, "secretary", url)
@@ -901,7 +901,7 @@ def test_approve_ballot(self):
901901

902902
def test_disapprove_ballot(self):
903903
draft = make_test_data()
904-
draft.set_state(State.objects.get(type="draft-iesg", slug="nopubadw"))
904+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="nopubadw"))
905905

906906
url = urlreverse('doc_approve_ballot', kwargs=dict(name=draft.name))
907907
login_testing_unauthorized(self, "secretary", url)
@@ -922,7 +922,7 @@ class MakeLastCallTestCase(django.test.TestCase):
922922

923923
def test_make_last_call(self):
924924
draft = make_test_data()
925-
draft.set_state(State.objects.get(type="draft-iesg", slug="lc-req"))
925+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="lc-req"))
926926

927927
url = urlreverse('doc_make_last_call', kwargs=dict(name=draft.name))
928928
login_testing_unauthorized(self, "secretary", url)
@@ -963,7 +963,7 @@ def test_request_publication(self):
963963
draft.group = Group.objects.get(acronym="iab")
964964
draft.intended_std_level = IntendedStdLevelName.objects.get(slug="inf")
965965
draft.save()
966-
draft.set_state(State.objects.get(type="draft-stream-iab", slug="approved"))
966+
draft.set_state(State.objects.get(used=True, type="draft-stream-iab", slug="approved"))
967967

968968
url = urlreverse('doc_request_publication', kwargs=dict(name=draft.name))
969969
login_testing_unauthorized(self, "iabchair", url)
@@ -1068,11 +1068,11 @@ def test_expire_ids(self):
10681068

10691069
self.assertEquals(len(list(get_expired_ids())), 1)
10701070

1071-
draft.set_state(State.objects.get(type="draft-iesg", slug="watching"))
1071+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="watching"))
10721072

10731073
self.assertEquals(len(list(get_expired_ids())), 1)
10741074

1075-
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
1075+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva"))
10761076

10771077
self.assertEquals(len(list(get_expired_ids())), 0)
10781078

@@ -1123,7 +1123,7 @@ def test_clean_up_id_files(self):
11231123

11241124

11251125
# RFC draft
1126-
draft.set_state(State.objects.get(type="draft", slug="rfc"))
1126+
draft.set_state(State.objects.get(used=True, type="draft", slug="rfc"))
11271127
draft.save()
11281128

11291129
txt = "%s-%s.txt" % (draft.name, draft.rev)
@@ -1141,7 +1141,7 @@ def test_clean_up_id_files(self):
11411141

11421142

11431143
# expire draft
1144-
draft.set_state(State.objects.get(type="draft", slug="expired"))
1144+
draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
11451145
draft.expires = datetime.datetime.now() - datetime.timedelta(days=1)
11461146
draft.save()
11471147

@@ -1183,7 +1183,7 @@ def test_expire_last_call(self):
11831183
# check that non-expirable drafts aren't expired
11841184

11851185
draft = make_test_data()
1186-
draft.set_state(State.objects.get(type="draft-iesg", slug="lc"))
1186+
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="lc"))
11871187

11881188
secretary = Person.objects.get(name="Sec Retary")
11891189

ietf/idrfc/urls.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@
8484
)
8585

8686
urlpatterns += patterns('django.views.generic.simple',
87-
url(r'^help/state/charter/$', 'direct_to_template', { 'template': 'doc/states.html', 'extra_context': { 'states': State.objects.filter(type="charter"),'title':"Charter" } }, name='help_charter_states'),
88-
url(r'^help/state/conflict-review/$', 'direct_to_template', { 'template': 'doc/states.html', 'extra_context': { 'states': State.objects.filter(type="conflrev").order_by("order"),'title':"Conflict Review" } }, name='help_conflict_review_states'),
87+
url(r'^help/state/charter/$', 'direct_to_template', { 'template': 'doc/states.html', 'extra_context': { 'states': State.objects.filter(used=True, type="charter"),'title':"Charter" } }, name='help_charter_states'),
88+
url(r'^help/state/conflict-review/$', 'direct_to_template', { 'template': 'doc/states.html', 'extra_context': { 'states': State.objects.filter(used=True, type="conflrev").order_by("order"),'title':"Conflict Review" } }, name='help_conflict_review_states'),
8989
)
9090

9191

0 commit comments

Comments
 (0)