Skip to content

Commit 947345e

Browse files
committed
Remove link to now obsolete shepherd pages, move manage workflow to
wginfo, fix a couple of oddities on the workflow page - Legacy-Id: 6136
1 parent 3c8f5d3 commit 947345e

8 files changed

Lines changed: 105 additions & 173 deletions

File tree

ietf/templates/wgchairs/manage_workflowREDESIGN.html renamed to ietf/templates/wginfo/customize_workflow.html

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
{% extends "wginfo/wg_base.html" %}
1+
{% extends "base.html" %}
22

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 %}
3+
{% block title %}Customize Workflow for {{ group.acronym }} {{ group.type.name }}{% endblock %}
114

125
{% block morecss %}
136
{{ block.super }}
@@ -53,13 +46,20 @@
5346
}
5447
{% endblock %}
5548

56-
{% block wg_content %}
57-
<div class="wg-workflow-management">
58-
<h2>Edit workflow</h2>
49+
{% block content %}
50+
{% load ietf_filters %}
51+
52+
<div class="group-customize-workflow">
53+
54+
<h1>Customize Workflow for {{ group.acronym }} {{ group.type.name }}</h1>
55+
56+
<p>Below you can customize the draft states and tags used in the
57+
<a href="{% url group_charter group.acronym %}">{{ group.acronym }} {{ group.type.name }}</a>. Note that some states are
58+
mandatory for group operation and cannot be deactivated.</p>
5959

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>
60+
<p>You can see the default Working Group I-D State Diagram
61+
in <a href="http://tools.ietf.org/html/rfc6174#section-4.1">Section 4.1 of RFC6174</a>.</p>
6162

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>
6363

6464
<h3>States</h3>
6565

@@ -90,11 +90,7 @@ <h3>States</h3>
9090
{% endif %}
9191
</td>
9292
<td>
93-
<div>
94-
<span>{{ state.name }} {% if not state.used %} (not used in {{ wg.acronym }}){% endif %}</span>
95-
<a class="toggler" title="Click to show description of state" href="">+</a>
96-
</div>
97-
<div class="toggled">{{ state.desc|safe|linebreaks }}</div>
93+
{{ state.name }} {% if not state.used %} (not used in {{ group.acronym }}){% endif %} {{ state|statehelp }}
9894
</td>
9995
<td>
10096
<div>
@@ -142,11 +138,14 @@ <h3>Tags</h3>
142138
<input type="hidden" name="action" value="settagactive" />
143139
</form>
144140
</td>
145-
<td><span>{{ tag.name }} {% if not tag.used %} (not used in {{ wg.acronym }}){% endif %}</span></td>
141+
<td><span>{{ tag.name }} {% if not tag.used %} (not used in {{ group.acronym }}){% endif %}</span></td>
146142
</tr>
147143
{% endfor %}
148144
</table>
149145

146+
{% endblock content %}
147+
148+
{% block js %}
150149
<script type="text/javascript">
151150
//<![CDATA[
152151
jQuery('.state-table .toggler').click(function(e) {
@@ -164,5 +163,4 @@ <h3>Tags</h3>
164163
});
165164
//]]>
166165
</script>
167-
168166
{% endblock %}

ietf/templates/wginfo/group_base.html

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3333
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3434
{% endcomment %}
35-
{% load ietf_filters wgchairs_tags %}
35+
{% load ietf_filters %}
3636
{% block title %}{{ group.name }} ({{ group.acronym }}) - {% block group_subtitle %}{% endblock %}{% endblock %}
3737

3838
{% block morecss %}
@@ -73,18 +73,6 @@ <h1>{{ group.name}} ({{ group.acronym }})
7373
<a {% if selected == "documents" %}class="selected"{% else %}href="{% url ietf.wginfo.views.group_documents acronym=group.acronym %}"{% endif %}>Documents</a> |
7474
<a {% if selected == "charter" %}class="selected"{% else %}href="{% url ietf.wginfo.views.group_charter acronym=group.acronym %}"{% endif %}>Charter</a> |
7575

76-
{% if can_manage_workflow %}
77-
<a {% if selected == "manage_workflow" %}class="selected"{% else %}href="{% url manage_workflow group.acronym %}"{% endif %}>Manage workflow</a> |
78-
{% endif %}
79-
80-
{% if can_manage_delegates %}
81-
<a {% if selected == "manage_delegates" %}class="selected"{% else %}href="{% url manage_delegates group.acronym %}"{% endif %}>Manage delegations</a> |
82-
{% endif %}
83-
84-
{% if can_manage_shepherds %}
85-
<a {% if selected == "manage_shepherds" %}class="selected"{% else %}href="{% url manage_shepherds group.acronym %}"{% endif %}>Manage shepherds</a> |
86-
{% endif %}
87-
8876
<a {% if selected == "history" %}class="selected"{% else %}href="{% url ietf.wginfo.views.history acronym=group.acronym %}"{% endif %}>History</a> |
8977
{% if group.list_archive|startswith:"http:" or group.list_archive|startswith:"https:" or group.list_archive|startswith:"ftp:" %}
9078
<a href="{{ group.list_archive }}">List Archive &raquo;</a> |

ietf/templates/wginfo/group_charter.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
{% if user|has_role:"Area Director,Secretariat" %}
131131
<div style="margin: 2px; margin-top: 2em;">
132132
{% for name, url in actions %}
133-
<a class="button" href="{{ url }}">{{ name }}</a>
133+
<a href="{{ url }}">{{ name }}</a> {% if not forloop.last %} | {% endif %}
134134
{% endfor %}
135135
</div>
136136
{% endif %}

ietf/wgchairs/urls.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,5 @@
33
from django.conf.urls.defaults import patterns, url
44

55
urlpatterns = patterns('ietf.wgchairs.views',
6-
url(r'^workflows/$', 'manage_workflow', name='manage_workflow'),
76
url(r'^delegates/$', 'manage_delegates', name='manage_delegates'),
8-
url(r'^shepherds/$', 'wg_shepherd_documents', name='manage_shepherds'),
97
)

ietf/wgchairs/views.py

Lines changed: 0 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -51,133 +51,6 @@ def manage_delegates(request, acronym):
5151
}, RequestContext(request))
5252

5353

54-
def manage_workflow(request, acronym):
55-
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
56-
user = request.user
57-
if not can_manage_workflow_in_group(user, wg):
58-
return HttpResponseForbidden("You don't have permission to access this view")
59-
workflow = get_workflow_for_wg(wg)
60-
default_workflow = get_default_workflow_for_wg()
61-
formset = None
62-
if request.method == 'POST':
63-
form = workflow_form_factory(request, wg=wg, user=user)
64-
if form.is_valid():
65-
form.save()
66-
elif isinstance(form, TransitionFormSet):
67-
formset = form
68-
tags = workflow.selected_tags.all()
69-
default_tags = default_workflow.annotation_tags.all()
70-
states = workflow.selected_states.all().order_by('statedescription__order')
71-
default_states = default_workflow.states.all().order_by('statedescription__order')
72-
for i in default_states:
73-
if states.filter(name=i.name).count() == 1:
74-
i.used = True
75-
if i.name in REQUIRED_STATES:
76-
i.freeze = True
77-
for i in default_tags:
78-
if tags.filter(name=i.name).count() == 1:
79-
i.used = True
80-
if not formset:
81-
formset = TransitionFormSet(queryset=workflow.transitions.all(), user=user, wg=wg)
82-
83-
return render_to_response('wgchairs/manage_workflow.html',
84-
{'wg': wg,
85-
'workflow': workflow,
86-
'default_workflow': default_workflow,
87-
'states': states,
88-
'tags': tags,
89-
'default_states': default_states,
90-
'default_tags': default_tags,
91-
'formset': formset,
92-
'selected': 'manage_workflow',
93-
}, RequestContext(request))
94-
95-
def manage_workflowREDESIGN(request, acronym):
96-
from ietf.doc.models import State
97-
from ietf.group.models import GroupStateTransitions
98-
99-
MANDATORY_STATES = ('c-adopt', 'wg-doc', 'sub-pub')
100-
101-
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
102-
user = request.user
103-
if not can_manage_workflow_in_group(user, wg):
104-
return HttpResponseForbidden("You don't have permission to access this view")
105-
106-
if request.method == 'POST':
107-
action = request.POST.get("action")
108-
if action == "setstateactive":
109-
active = request.POST.get("active") == "1"
110-
try:
111-
state = State.objects.exclude(slug__in=MANDATORY_STATES).get(pk=request.POST.get("state"))
112-
except State.DoesNotExist:
113-
return HttpResponse("Invalid state %s" % request.POST.get("state"))
114-
115-
if active:
116-
wg.unused_states.remove(state)
117-
else:
118-
wg.unused_states.add(state)
119-
120-
if action == "setnextstates":
121-
try:
122-
state = State.objects.get(pk=request.POST.get("state"))
123-
except State.DoesNotExist:
124-
return HttpResponse("Invalid state %s" % request.POST.get("state"))
125-
126-
next_states = State.objects.filter(used=True, type='draft-stream-ietf', pk__in=request.POST.getlist("next_states"))
127-
unused = wg.unused_states.all()
128-
if set(next_states.exclude(pk__in=unused)) == set(state.next_states.exclude(pk__in=unused)):
129-
# just use the default
130-
wg.groupstatetransitions_set.filter(state=state).delete()
131-
else:
132-
transitions, _ = GroupStateTransitions.objects.get_or_create(group=wg, state=state)
133-
transitions.next_states = next_states
134-
135-
if action == "settagactive":
136-
active = request.POST.get("active") == "1"
137-
try:
138-
tag = DocTagName.objects.get(pk=request.POST.get("tag"))
139-
except DocTagName.DoesNotExist:
140-
return HttpResponse("Invalid tag %s" % request.POST.get("tag"))
141-
142-
if active:
143-
wg.unused_tags.remove(tag)
144-
else:
145-
wg.unused_tags.add(tag)
146-
147-
148-
# put some info for the template on tags and states
149-
unused_tags = wg.unused_tags.all().values_list('slug', flat=True)
150-
tags = DocTagName.objects.filter(slug__in=get_tags_for_stream_id("ietf"))
151-
for t in tags:
152-
t.used = t.slug not in unused_tags
153-
154-
unused_states = wg.unused_states.all().values_list('slug', flat=True)
155-
states = State.objects.filter(used=True, type="draft-stream-ietf")
156-
transitions = dict((o.state, o) for o in wg.groupstatetransitions_set.all())
157-
for s in states:
158-
s.used = s.slug not in unused_states
159-
s.mandatory = s.slug in MANDATORY_STATES
160-
161-
default_n = s.next_states.all()
162-
if s in transitions:
163-
n = transitions[s].next_states.all()
164-
else:
165-
n = default_n
166-
167-
s.next_states_checkboxes = [(x in n, x in default_n, x) for x in states]
168-
s.used_next_states = [x for x in n if x.slug not in unused_states]
169-
170-
return render_to_response('wgchairs/manage_workflowREDESIGN.html',
171-
{'wg': wg,
172-
'states': states,
173-
'tags': tags,
174-
'selected': 'manage_workflow',
175-
}, RequestContext(request))
176-
177-
178-
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
179-
manage_workflow = manage_workflowREDESIGN
180-
18154
def wg_shepherd_documents(request, acronym):
18255
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
18356
user = request.user

ietf/wginfo/edit.py

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ietf.group.utils import save_group_in_history
2121
from ietf.wgcharter.mails import email_secretariat
2222
from ietf.person.forms import EmailsField
23-
23+
from ietf.doc.utils import get_tags_for_stream_id
2424

2525
class WGForm(forms.Form):
2626
name = forms.CharField(max_length=255, label="WG Name", required=True)
@@ -320,3 +320,81 @@ def conclude(request, acronym):
320320
dict(form=form,
321321
wg=wg),
322322
context_instance=RequestContext(request))
323+
324+
325+
def customize_workflow(request, acronym):
326+
MANDATORY_STATES = ('c-adopt', 'wg-doc', 'sub-pub')
327+
328+
group = get_object_or_404(Group, acronym=acronym, type="wg")
329+
if not request.user.is_authenticated() or not (has_role(request.user, "Secretariat") or group.role_set.filter(name="chair", person__user=request.user)):
330+
return HttpResponseForbidden("You don't have permission to access this view")
331+
332+
if request.method == 'POST':
333+
action = request.POST.get("action")
334+
if action == "setstateactive":
335+
active = request.POST.get("active") == "1"
336+
try:
337+
state = State.objects.exclude(slug__in=MANDATORY_STATES).get(pk=request.POST.get("state"))
338+
except State.DoesNotExist:
339+
return HttpResponse("Invalid state %s" % request.POST.get("state"))
340+
341+
if active:
342+
group.unused_states.remove(state)
343+
else:
344+
group.unused_states.add(state)
345+
346+
if action == "setnextstates":
347+
try:
348+
state = State.objects.get(pk=request.POST.get("state"))
349+
except State.DoesNotExist:
350+
return HttpResponse("Invalid state %s" % request.POST.get("state"))
351+
352+
next_states = State.objects.filter(used=True, type='draft-stream-ietf', pk__in=request.POST.getlist("next_states"))
353+
unused = group.unused_states.all()
354+
if set(next_states.exclude(pk__in=unused)) == set(state.next_states.exclude(pk__in=unused)):
355+
# just use the default
356+
group.groupstatetransitions_set.filter(state=state).delete()
357+
else:
358+
transitions, _ = GroupStateTransitions.objects.get_or_create(group=group, state=state)
359+
transitions.next_states = next_states
360+
361+
if action == "settagactive":
362+
active = request.POST.get("active") == "1"
363+
try:
364+
tag = DocTagName.objects.get(pk=request.POST.get("tag"))
365+
except DocTagName.DoesNotExist:
366+
return HttpResponse("Invalid tag %s" % request.POST.get("tag"))
367+
368+
if active:
369+
group.unused_tags.remove(tag)
370+
else:
371+
group.unused_tags.add(tag)
372+
373+
374+
# put some info for the template on tags and states
375+
unused_tags = group.unused_tags.all().values_list('slug', flat=True)
376+
tags = DocTagName.objects.filter(slug__in=get_tags_for_stream_id("ietf"))
377+
for t in tags:
378+
t.used = t.slug not in unused_tags
379+
380+
unused_states = group.unused_states.all().values_list('slug', flat=True)
381+
states = State.objects.filter(used=True, type="draft-stream-ietf")
382+
transitions = dict((o.state, o) for o in group.groupstatetransitions_set.all())
383+
for s in states:
384+
s.used = s.slug not in unused_states
385+
s.mandatory = s.slug in MANDATORY_STATES
386+
387+
default_n = s.next_states.all()
388+
if s in transitions:
389+
n = transitions[s].next_states.all()
390+
else:
391+
n = default_n
392+
393+
s.next_states_checkboxes = [(x in n, x in default_n, x) for x in states]
394+
s.used_next_states = [x for x in n if x.slug not in unused_states]
395+
396+
return render_to_response('wginfo/customize_workflow.html', {
397+
'group': group,
398+
'states': states,
399+
'tags': tags,
400+
}, RequestContext(request))

ietf/wginfo/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/charter/$', milestones.edit_milestones, {'milestone_set': "charter"}, "wg_edit_charter_milestones"),
3030
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/charter/reset/$', milestones.reset_charter_milestones, None, "wg_reset_charter_milestones"),
3131
(r'^(?P<acronym>[a-zA-Z0-9-]+)/ajax/searchdocs/$', milestones.ajax_search_docs, None, "wg_ajax_search_docs"),
32+
(r'^(?P<acronym>[a-zA-Z0-9-]+)/workflow/$', edit.customize_workflow),
3233
(r'^(?P<acronym>[^/]+)/management/', include('ietf.wgchairs.urls')),
33-
3434
)

ietf/wginfo/views.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,6 @@
4949
from ietf.group.utils import get_charter_text
5050
from ietf.doc.templatetags.ietf_filters import clean_whitespace
5151

52-
from ietf.wgchairs.accounts import (can_manage_workflow_in_group,
53-
can_manage_delegates_in_group,
54-
can_manage_shepherds_in_group)
55-
5652

5753
def fill_in_charter_info(group, include_drafts=False):
5854
group.areadirector = group.ad.role_email("ad", group.parent) if group.ad else None
@@ -179,9 +175,6 @@ def construct_group_menu_context(request, group, selected, others):
179175
d = {
180176
"group": group,
181177
"selected": selected,
182-
"can_manage_delegates": can_manage_delegates_in_group(request.user, group),
183-
"can_manage_workflow": can_manage_workflow_in_group(request.user, group),
184-
"can_manage_shepherds": can_manage_shepherds_in_group(request.user, group),
185178
}
186179

187180
d.update(others)
@@ -274,6 +267,10 @@ def group_charter(request, acronym):
274267

275268
is_chair = request.user.is_authenticated() and group.role_set.filter(name="chair", person__user=request.user)
276269

270+
if is_chair or has_role(request.user, "Secretariat"):
271+
actions.append((u"Manage delegates", urlreverse("manage_delegates", kwargs=dict(acronym=group.acronym))))
272+
actions.append((u"Customize workflow", urlreverse("ietf.wginfo.edit.customize_workflow", kwargs=dict(acronym=group.acronym))))
273+
277274
return render_to_response('wginfo/group_charter.html',
278275
construct_group_menu_context(request, group, "charter", {
279276
"actions": actions,

0 commit comments

Comments
 (0)