Skip to content

Commit 3c2293d

Browse files
committed
Port ietfworkflows and wgchairs to new schema, fix missing state
setting in I-D submission, add tests - Legacy-Id: 3618
1 parent ea7f45d commit 3c2293d

6 files changed

Lines changed: 440 additions & 43 deletions

File tree

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
{% extends "wginfo/wg_base.html" %}
2+
3+
{% block wg_titledetail %}Manage Workflow{% endblock %}
4+
5+
{% block pagehead %}
6+
{{ block.super }}
7+
<script type="text/javascript" src="/js/lib/jquery-1.4.2.min.js"></script>
8+
<script type="text/javascript" src="/js/yui/yui-20100305.js"></script>
9+
<script type="text/javascript" src="/js/base.js"></script>
10+
{% endblock pagehead %}
11+
12+
{% block morecss %}
13+
{{ block.super }}
14+
.state-table .inactive,
15+
.tag-table .inactive {
16+
font-style: italic;
17+
color: #666;
18+
}
19+
.state-table .state {
20+
padding-right: 0.6em;
21+
}
22+
.set-next-states {
23+
margin-top: 1em;
24+
}
25+
.set-next-states label {
26+
display: block;
27+
cursor: pointer;
28+
}
29+
.set-next-states label input {
30+
vertical-align: middle;
31+
}
32+
.set-state input, .set-tag input {
33+
width: 6em;
34+
}
35+
.toggled {
36+
display: none;
37+
}
38+
.toggler {
39+
color: #000;
40+
text-decoration: none;
41+
padding: 0px 3px;
42+
display: inline-block;
43+
margin-left: 0.5em;
44+
font-size: 15px;
45+
font-weight: bold;
46+
}
47+
.inactive .toggler {
48+
color: #666;
49+
}
50+
.toggler:hover {
51+
background-color: #999;
52+
color: #fff;
53+
}
54+
{% endblock %}
55+
56+
{% block wg_content %}
57+
<div class="wg-workflow-management">
58+
<h2>Edit workflow</h2>
59+
60+
<p>Below you can customize the draft states and tags used in the {{ wg.acronym }} WG. Note that some states are mandatory for WG operation and cannot be deactivated.</p>
61+
62+
<p>You can see the default Working Group I-D State Diagram in <a href="http://tools.ietf.org/html/rfc6174#section-4.1">Section 4.1 of RFC6174</a>.</p>
63+
64+
<h3>States</h3>
65+
66+
<table class="ietf-table state-table">
67+
<tr>
68+
<th style="width:26em">State</th>
69+
<th style="auto">Turn on/off</th>
70+
<th style="width:26em">Next states</th>
71+
</tr>
72+
{% for state in states %}
73+
<tr class="{% cycle "oddrow" "evenrow" %}{% if not state.used %} inactive{% endif %}" style="vertical-align: top;">
74+
<td>
75+
<div>
76+
<span>{{ state.name }} {% if not state.used %} (not used in {{ wg.acronym }}){% endif %}</span>
77+
<a class="toggler" title="Click to show description of state" href="">+</a>
78+
</div>
79+
<div class="toggled">{{ state.desc|safe|linebreaks }}</div>
80+
</td>
81+
<td>
82+
{% if state.mandatory %}
83+
(mandatory)
84+
{% else %}
85+
<form class="set-state" method="post" action="">
86+
{% if state.used %}
87+
<input type="hidden" name="state" value="{{ state.pk }}" />
88+
<input type="hidden" name="active" value="0" />
89+
<input type="submit" title="Click to deactive this state" value="Deactivate" />
90+
{% else %}
91+
<input type="hidden" name="state" value="{{ state.pk }}" />
92+
<input type="hidden" name="active" value="1" />
93+
<input type="submit" title="Click to active this state" value="Activate" />
94+
{% endif %}
95+
<input type="hidden" name="action" value="setstateactive" />
96+
</form>
97+
{% endif %}
98+
</td>
99+
<td>
100+
<div>
101+
{% if state.used_next_states %}
102+
{% for n in state.used_next_states %}<span class="state">{{ n.name }}</span>{% if not forloop.last %} {% endif %}{% endfor %}
103+
{% else %}
104+
<i>None</i>
105+
{% endif %}
106+
<a class="toggler" title="Click to set next states for state" href="">+</a>
107+
</div>
108+
<form class="toggled set-next-states" method="post" action="">
109+
Select the next states:
110+
{% for checked, default, s in state.next_states_checkboxes %}
111+
<label{% if not s.used %} class="inactive"{% endif %}><input type="checkbox" name="next_states" value="{{ s.pk }}"{% if checked %} checked="checked"{% endif %} />{{ s.name }}{% if default %} (default){% endif %}</label>
112+
{% endfor %}
113+
<input type="hidden" name="state" value="{{ state.pk }}" />
114+
<input type="hidden" name="action" value="setnextstates" />
115+
<input class="submit" type="submit" value="Save" />
116+
</form>
117+
</td>
118+
</tr>
119+
{% endfor %}
120+
</table>
121+
122+
<h3>Tags</h3>
123+
124+
<table class="ietf-table tag-table">
125+
<tr>
126+
<th>Tag</th>
127+
<th>Turn on/off</th>
128+
</tr>
129+
{% for tag in tags %}
130+
<tr class="{% cycle "oddrow" "evenrow" %}{% if not tag.used %} inactive{% endif %}" style="vertical-align: top;">
131+
<td><span>{{ tag.name }} {% if not tag.used %} (not used in {{ wg.acronym }}){% endif %}</span></td>
132+
<td>
133+
<form class="set-tag" method="post" action="">
134+
{% if tag.used %}
135+
<input type="hidden" name="tag" value="{{ tag.pk }}" />
136+
<input type="hidden" name="active" value="0" />
137+
<input type="submit" value="Deactivate" />
138+
{% else %}
139+
<input type="hidden" name="tag" value="{{ tag.pk }}" />
140+
<input type="hidden" name="active" value="1" />
141+
<input type="submit" value="Activate" />
142+
{% endif %}
143+
<input type="hidden" name="action" value="settagactive" />
144+
</form>
145+
</td>
146+
</tr>
147+
{% endfor %}
148+
</table>
149+
150+
<script type="text/javascript">
151+
//<![CDATA[
152+
jQuery('.state-table .toggler').click(function(e) {
153+
e.preventDefault();
154+
var toggler = jQuery(this),
155+
toggled = toggler.parent().siblings(".toggled");
156+
if (toggled.is(":hidden")) {
157+
toggler.html("&ndash;");
158+
toggled.slideDown(300);
159+
}
160+
else {
161+
toggler.html("+");
162+
toggled.slideUp(300);
163+
}
164+
});
165+
//]]>
166+
</script>
167+
168+
{% endblock %}

ietf/wgchairs/forms.py

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
from workflows.models import Transition
2020

21+
from redesign.doc.models import WriteupDocEvent
2122
from redesign.person.models import Person, Email
2223
from redesign.group.models import Role, RoleName
24+
from redesign.name.models import DocTagName
2325

2426

2527
class RelatedWGForm(forms.Form):
@@ -194,17 +196,20 @@ def assign_shepherd(user, internetdraft, shepherd):
194196
doc = Document.objects.get(name=internetdraft.name)
195197

196198
save_document_in_history(doc)
197-
e = DocEvent(doc=doc, by=user.get_profile())
199+
200+
doc.time = datetime.datetime.now()
201+
doc.shepherd = shepherd
202+
doc.save()
203+
204+
e = DocEvent(type="changed_document")
205+
e.time = doc.time
206+
e.doc = doc
207+
e.by = user.get_profile()
198208
if not shepherd:
199209
e.desc = u"Unassigned shepherd"
200210
else:
201211
e.desc = u"Changed shepherd to %s" % shepherd.name
202-
e.type = "changed_document"
203212
e.save()
204-
205-
doc.time = e.time
206-
doc.shepherd = shepherd
207-
doc.save()
208213

209214
# update proxy too
210215
internetdraft.shepherd = shepherd
@@ -402,14 +407,25 @@ def get_writeup(self):
402407
return self.data.get('writeup', self.doc_writeup and self.doc_writeup.writeup or '')
403408

404409
def save(self):
405-
if not self.doc_writeup:
406-
self.doc_writeup = ProtoWriteUp.objects.create(
407-
person=self.person,
408-
draft=self.doc,
409-
writeup=self.cleaned_data['writeup'])
410+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
411+
e = WriteupDocEvent(type="changed_protocol_writeup")
412+
e.doc = self.doc
413+
e.by = self.person
414+
e.desc = e.get_type_display()
415+
e.text = self.cleaned_data['writeup']
416+
e.save()
417+
from ietf.wgchairs.models import ProtoWriteUpProxy
418+
self.doc_writeup = ProtoWriteUpProxy.objects.get(pk=e.pk)
410419
else:
411-
self.doc_writeup.writeup = self.cleaned_data['writeup']
412-
self.doc_writeup.save()
420+
if not self.doc_writeup:
421+
self.doc_writeup = ProtoWriteUp.objects.create(
422+
person=self.person,
423+
draft=self.doc,
424+
writeup=self.cleaned_data['writeup'])
425+
else:
426+
self.doc_writeup.writeup = self.cleaned_data['writeup']
427+
self.doc_writeup.save()
428+
413429
if self.data.get('modify_tag', False):
414430
followup = self.cleaned_data.get('followup', False)
415431
comment = self.cleaned_data.get('comment', False)
@@ -418,13 +434,20 @@ def save(self):
418434
except PersonOrOrgInfo.DoesNotExist:
419435
shepherd = None
420436
if shepherd:
421-
extra_notify = ['%s <%s>' % shepherd.email()]
437+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
438+
extra_notify = [shepherd.formatted_email()]
439+
else:
440+
extra_notify = ['%s <%s>' % shepherd.email()]
422441
else:
423442
extra_notify = []
443+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
444+
tags = DocTagName.objects.filter(slug="sheph-u")
445+
else:
446+
tags = [FOLLOWUP_TAG]
424447
if followup:
425-
update_tags(self.doc, comment, self.person, set_tags=[FOLLOWUP_TAG], extra_notify=extra_notify)
448+
update_tags(self.doc, comment, self.person, set_tags=tags, extra_notify=extra_notify)
426449
else:
427-
update_tags(self.doc, comment, self.person, reset_tags=[FOLLOWUP_TAG], extra_notify=extra_notify)
450+
update_tags(self.doc, comment, self.person, reset_tags=tags, extra_notify=extra_notify)
428451
return self.doc_writeup
429452

430453
def is_valid(self):

ietf/wgchairs/models.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class ProtoWriteUp(models.Model):
2727
null=False,
2828
)
2929

30+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
31+
from ietf.idtracker.models import InternetDraftOld as InternetDraft
32+
3033
draft = models.ForeignKey(
3134
InternetDraft,
3235
blank=False,
@@ -59,16 +62,26 @@ def __unicode__(self):
5962
class Meta:
6063
proxy = True
6164

62-
from redesign.doc.models import DocEvent
63-
class ProtoWriteUpProxy(DocEvent):
65+
from redesign.doc.models import WriteupDocEvent
66+
class ProtoWriteUpProxy(WriteupDocEvent):
6467
#person = models.ForeignKey(PersonOrOrgInfo, blank=False, null=False)
68+
@property
69+
def person(self):
70+
return self.by
6571
#draft = models.ForeignKey(InternetDraft, blank=False, null=False)
72+
@property
73+
def draft(self):
74+
return self.doc
6675
#date = models.DateTimeField(default=datetime.datetime.now(), blank=False, null=False)
76+
@property
77+
def date(self):
78+
return self.time
6779
#writeup = models.TextField(blank=False, null=False)
80+
@property
81+
def writeup(self):
82+
return self.text
6883
class Meta:
6984
proxy = True
7085

7186
#WGDelegateOld = WGDelegate
7287
WGDelegate = WGDelegateProxy
73-
ProtoWriteUpOld = ProtoWriteUp
74-
ProtoWriteUp = ProtoWriteUpProxy

ietf/wgchairs/templatetags/wgchairs_tags.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,17 @@ def wgchairs_admin_options(context, wg):
2424

2525
@register.simple_tag
2626
def writeup(doc):
27-
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
28-
e = doc.latest_event(type="changed_protocol_writeup")
29-
return e.text if e else ""
30-
3127
writeup = doc.protowriteup_set.all()
32-
if not writeup.count():
28+
if not writeup:
3329
return ''
3430
else:
3531
return writeup[0].writeup
3632

3733

3834
@register.simple_tag
3935
def writeupdate(doc):
40-
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
41-
e = doc.latest_event(type="changed_protocol_writeup")
42-
return e.time if e else ""
43-
4436
writeup = doc.protowriteup_set.all()
45-
if not writeup.count():
37+
if not writeup:
4638
return ''
4739
else:
4840
return writeup[0].date

0 commit comments

Comments
 (0)