Skip to content

Commit d0214d3

Browse files
committed
Merged [4806] from rjsparks@nostrum.com:
Better handling for BoFs, particularly those that won't create WGs - Legacy-Id: 4939
1 parent d9619aa commit d0214d3

11 files changed

Lines changed: 244 additions & 23 deletions

File tree

ietf/group/proxy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def start_date(self):
131131
#status = models.ForeignKey(WGStatus)
132132
@property
133133
def status_id(self):
134-
return { "active": 1, "dormant": 2, "conclude": 3, "proposed": 4, "bof": 4, }[self.state_id]
134+
return { "active": 1, "dormant": 2, "conclude": 3, "proposed": 4, "bof": 4, "abandon": 4 }[self.state_id]
135135
#area_director = models.ForeignKey(AreaDirector, null=True)
136136
#meeting_scheduled = models.CharField(blank=True, max_length=3)
137137
@property
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# encoding: utf-8
2+
import datetime
3+
from south.db import db
4+
from south.v2 import DataMigration
5+
from django.db import models
6+
7+
class Migration(DataMigration):
8+
9+
def forwards(self, orm):
10+
GroupStateName(slug='abandon',name='Abandonded',desc='Formation of the group (most likely a BoF or Proposed WG) was abandoned',used=True).save()
11+
12+
13+
def backwards(self, orm):
14+
pass
15+
16+
17+
models = {
18+
'name.ballotpositionname': {
19+
'Meta': {'ordering': "['order']", 'object_name': 'BallotPositionName'},
20+
'blocking': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
21+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
22+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
23+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
24+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
25+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
26+
},
27+
'name.constraintname': {
28+
'Meta': {'ordering': "['order']", 'object_name': 'ConstraintName'},
29+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
30+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
31+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
32+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
33+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
34+
},
35+
'name.docrelationshipname': {
36+
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
37+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
38+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
39+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
40+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
41+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
42+
},
43+
'name.docremindertypename': {
44+
'Meta': {'ordering': "['order']", 'object_name': 'DocReminderTypeName'},
45+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
46+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
47+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
48+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
49+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
50+
},
51+
'name.doctagname': {
52+
'Meta': {'ordering': "['order']", 'object_name': 'DocTagName'},
53+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
54+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
55+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
56+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
57+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
58+
},
59+
'name.doctypename': {
60+
'Meta': {'ordering': "['order']", 'object_name': 'DocTypeName'},
61+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
62+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
63+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
64+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
65+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
66+
},
67+
'name.groupballotpositionname': {
68+
'Meta': {'ordering': "['order']", 'object_name': 'GroupBallotPositionName'},
69+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
70+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
71+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
72+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
73+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
74+
},
75+
'name.groupstatename': {
76+
'Meta': {'ordering': "['order']", 'object_name': 'GroupStateName'},
77+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
78+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
79+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
80+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
81+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
82+
},
83+
'name.grouptypename': {
84+
'Meta': {'ordering': "['order']", 'object_name': 'GroupTypeName'},
85+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
86+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
87+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
88+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
89+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
90+
},
91+
'name.intendedstdlevelname': {
92+
'Meta': {'ordering': "['order']", 'object_name': 'IntendedStdLevelName'},
93+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
94+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
95+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
96+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
97+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
98+
},
99+
'name.liaisonstatementpurposename': {
100+
'Meta': {'ordering': "['order']", 'object_name': 'LiaisonStatementPurposeName'},
101+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
102+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
103+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
104+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
105+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
106+
},
107+
'name.meetingtypename': {
108+
'Meta': {'ordering': "['order']", 'object_name': 'MeetingTypeName'},
109+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
110+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
111+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
112+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
113+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
114+
},
115+
'name.rolename': {
116+
'Meta': {'ordering': "['order']", 'object_name': 'RoleName'},
117+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
118+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
119+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
120+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
121+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
122+
},
123+
'name.sessionstatusname': {
124+
'Meta': {'ordering': "['order']", 'object_name': 'SessionStatusName'},
125+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
126+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
127+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
128+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
129+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
130+
},
131+
'name.stdlevelname': {
132+
'Meta': {'ordering': "['order']", 'object_name': 'StdLevelName'},
133+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
134+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
135+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
136+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
137+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
138+
},
139+
'name.streamname': {
140+
'Meta': {'ordering': "['order']", 'object_name': 'StreamName'},
141+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
142+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
143+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
144+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
145+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
146+
},
147+
'name.timeslottypename': {
148+
'Meta': {'ordering': "['order']", 'object_name': 'TimeSlotTypeName'},
149+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
150+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
151+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
152+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
153+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
154+
}
155+
}
156+
157+
complete_apps = ['name']

ietf/name/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class Meta:
1717
ordering = ['order']
1818

1919
class GroupStateName(NameModel):
20-
"""BOF, Proposed, Active, Dormant, Concluded"""
20+
"""BOF, Proposed, Active, Dormant, Concluded, Abandoned"""
2121
class GroupTypeName(NameModel):
2222
"""IETF, Area, WG, RG, Team, etc."""
2323
class RoleName(NameModel):

ietf/templates/base_leftmenu.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474

7575
<li style="padding-top:0;"><a href="/wg/">Active WGs</a></li>
7676
<li><a href="{% url ietf.wginfo.views.chartering_wgs %}">Chartering WGs</a></li>
77+
<li><a href="{% url ietf.wginfo.views.bofs %}">BoFs</a></li>
7778
<li><a href="http://tools.ietf.org/wg/concluded">Concluded WGs</a></li>
7879
<li><a href="http://www.ietf.org/list/nonwg.html">Non-WG Lists</a></li>
7980

ietf/templates/wginfo/bofs.html

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}BoFs{% endblock %}
4+
5+
{% block content %}
6+
{% load ietf_filters %}
7+
{% load ballot_icon %}
8+
9+
<h1>Bofs</h1>
10+
11+
<p>Groups in the BoF state</p>
12+
13+
{% if user|has_role:"Area Director,Secretariat" %}
14+
<p><a href="{% url bof_create %}">Create a new BoF</a></p>
15+
{% endif %}
16+
17+
{% if not groups %}
18+
<p><b>No groups found.</b></p>
19+
{% else %}
20+
<table class="ietf-table ietf-doctable">
21+
<tr>
22+
<th>Group</th>
23+
<th>Name</th>
24+
<th>Date</th>
25+
</tr>
26+
{% for g in groups %}
27+
<tr class="{{ forloop.counter|divisibleby:2|yesno:"oddrow,evenrow" }}">
28+
<td class="acronym">
29+
<a href="{% url wg_charter acronym=g.acronym %}">{{ g.acronym }}</a>
30+
</td>
31+
<td class="title">
32+
<a {%comment%}href="{% url doc_view name=g.charter.name %}"{%endcomment%}>{{ g.name }}</a>
33+
</td>
34+
<td class="date">{{ g.time|date:"Y-m-d" }}</td>
35+
</tr>
36+
{% endfor %}
37+
</table>
38+
{% endif %}
39+
40+
{% endblock %}

ietf/templates/wginfo/edit.html

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@
2626

2727
{% block content %}
2828
{% load ietf_filters %}
29-
<h1>{% if wg %}
29+
<h1>
30+
{% ifequal action "edit" %}
3031
Edit WG {{ wg.acronym }}
31-
{% else %}
32+
{% else %}
33+
{% ifequal action "charter" %}
3234
Start chartering new WG
33-
{% endif %}
35+
{% else %}
36+
Create new WG or BoF
37+
{% endifequal %}
38+
{% endifequal %}
3439
</h1>
3540

3641
<form class="edit" action="" method="POST">
@@ -60,12 +65,16 @@ <h1>{% if wg %}
6065
<tr>
6166
<td></td>
6267
<td class="actions">
63-
{% if wg %}
68+
{% ifequal action "edit" %}
6469
<a href="{% url wg_charter acronym=wg.acronym %}">Back</a>
6570
<input type="submit" value="Save"/>
66-
{% else %}
67-
<input type="submit" value="Start chartering"/>
68-
{% endif %}
71+
{% else %}
72+
{% ifequal action "charter" %}
73+
<input type="submit" value="Start chartering"/>
74+
{% else %}
75+
<input type="submit" value="Create group or bof"/>
76+
{% endifequal %}
77+
{% endifequal %}
6978
</td>
7079
</tr>
7180
</table>

ietf/utils/test_runner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
from django.template import TemplateDoesNotExist
3939
from django.test.simple import run_tests as django_run_tests
4040

41+
import debug
42+
4143
import ietf.utils.mail
4244

4345
loaded_templates = set()

ietf/wgcharter/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def change_state(request, name, option=None):
7575
elif option == "abandon":
7676
if wg.state_id in ("proposed","bof","unknown"):
7777
charter_state = State.objects.get(type="charter", slug="notrev")
78+
#TODO : set an abandoned state and leave some comments here
7879
else:
7980
charter_state = State.objects.get(type="charter", slug="approved")
8081
charter_rev = approved_revision(charter.rev)
@@ -160,7 +161,7 @@ def change_state(request, name, option=None):
160161
"abandon": "Abandon effort on WG %s" % wg.acronym,
161162
}.get(option)
162163
if not title:
163-
title = "Change state of WG %s" % wg.acronym
164+
title = "Change chartering state of WG %s" % wg.acronym
164165

165166
def state_pk(slug):
166167
return State.objects.get(type="charter", slug=slug).pk

0 commit comments

Comments
 (0)