Delete all old WGAction stuff, it's superceded by the WG charter

support, clean up iesg/models.py a bit
 - Legacy-Id: 6411
This commit is contained in:
Ole Laursen 2013-10-10 16:12:34 +00:00
parent 77aa4723bf
commit f6ff2a8082
10 changed files with 5 additions and 536 deletions

View file

@ -5,9 +5,5 @@ class TelechatAgendaItemAdmin(admin.ModelAdmin):
pass
admin.site.register(TelechatAgendaItem, TelechatAgendaItemAdmin)
class WGActionAdmin(admin.ModelAdmin):
pass
admin.site.register(WGAction, WGActionAdmin)
admin.site.register(TelechatDate)

View file

@ -37,49 +37,6 @@ from django.conf import settings
from ietf.idtracker.models import Acronym
import datetime
# This table is not used by any code right now, and according to Glen,
# probably not currently (Aug 2009) maintained by the secretariat.
#class TelechatMinutes(models.Model):
# telechat_date = models.DateField(null=True, blank=True)
# telechat_minute = models.TextField(blank=True)
# exported = models.IntegerField(null=True, blank=True)
# def get_absolute_url(self):
# return "/iesg/telechat/%d/" % self.id
# def __str__(self):
# return "IESG Telechat Minutes for %s" % self.telechat_date
# class Meta:
# db_table = 'telechat_minutes'
# verbose_name = "Telechat Minute Text"
# verbose_name_plural = "Telechat Minutes"
# this model is deprecated
class TelechatDates(models.Model):
date1 = models.DateField(primary_key=True, null=True, blank=True)
date2 = models.DateField(null=True, blank=True)
date3 = models.DateField(null=True, blank=True)
date4 = models.DateField(null=True, blank=True)
def dates(self):
l = []
if self.date1:
l.append(self.date1)
if self.date2:
l.append(self.date2)
if self.date3:
l.append(self.date3)
if self.date4:
l.append(self.date4)
return l
def save(self):
# date1 isn't really a primary id, so save() doesn't work
raise NotImplemented
def __str__(self):
return " / ".join([str(d) for d in [self.date1,self.date2,self.date3,self.date4]])
class Meta:
db_table = "telechat_dates"
verbose_name = "Next Telechat Date"
class TelechatAgendaItem(models.Model):
TYPE_CHOICES = (
(1, "Working Group News"),
@ -98,34 +55,6 @@ class TelechatAgendaItem(models.Model):
def __unicode__(self):
type_name = self.TYPE_CHOICES_DICT.get(self.type, str(self.type))
return u'%s: %s' % (type_name, self.title or "")
class Meta:
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
db_table = 'templates'
class WGAction(models.Model):
CATEGORY_CHOICES = (
(11, "WG Creation::In Internal Review"),
(12, "WG Creation::Proposed for IETF Review"),
(13, "WG Creation::Proposed for Approval"),
(21, "WG Rechartering::In Internal Review"),
(22, "WG Rechartering::Under evaluation for IETF Review"),
(23, "WG Rechartering::Proposed for Approval")
)
# note that with the new schema, Acronym is monkey-patched and is really Group
group_acronym = models.ForeignKey(Acronym, db_column='group_acronym_id', primary_key=True, unique=True)
note = models.TextField(blank=True,null=True)
status_date = models.DateField()
agenda = models.BooleanField("On Agenda")
token_name = models.CharField(max_length=25)
category = models.IntegerField(db_column='pwg_cat_id', choices=CATEGORY_CHOICES, default=11)
telechat_date = models.DateField() #choices = [(x.telechat_date,x.telechat_date) for x in Telechat.objects.all().order_by('-telechat_date')])
def __str__(self):
return str(self.telechat_date)+": "+str(self.group_acronym)
class Meta:
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
db_table = 'group_internal'
ordering = ['-telechat_date']
verbose_name = "WG Action"
class Telechat(models.Model):
telechat_id = models.IntegerField(primary_key=True)
@ -160,55 +89,3 @@ class TelechatDate(models.Model):
class Meta:
ordering = ['-date']
class TelechatDatesProxyDummy(object):
def all(self):
class Dummy(object):
def __getitem__(self, i):
return self
def get_date(self, index):
if not hasattr(self, "date_cache"):
self.date_cache = TelechatDate.objects.active().order_by("date")
if index < len(self.date_cache):
return self.date_cache[index].date
return None
#date1 = models.DateField(primary_key=True, null=True, blank= True)
@property
def date1(self):
return self.get_date(0)
#date2 = models.DateField(null=True, blank=True)
@property
def date2(self):
return self.get_date(1)
#date3 = models.DateField(null=True, blank=True)
@property
def date3(self):
return self.get_date(2)
#date4 = models.DateField(null=True, blank=True)
@property
def date4(self):
return self.get_date(3)
def dates(self):
l = []
if self.date1:
l.append(self.date1)
if self.date2:
l.append(self.date2)
if self.date3:
l.append(self.date3)
if self.date4:
l.append(self.date4)
return l
return Dummy()
class TelechatDatesProxy(object):
objects = TelechatDatesProxyDummy()
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
TelechatDatesOld = TelechatDates
TelechatDates = TelechatDatesProxy

View file

@ -242,136 +242,6 @@ class RescheduleOnAgendaTests(django.test.TestCase):
self.assertTrue(not draft.latest_event(TelechatDocEvent, "scheduled_for_telechat").returning_item)
self.assertEquals(draft.docevent_set.count(), events_before + 1)
class WorkingGroupActionsTestCaseREDESIGN(django.test.TestCase):
def setUp(self):
super(self.__class__, self).setUp()
curdir = os.path.dirname(os.path.abspath(__file__))
self.evaldir = os.path.join(curdir, "tmp-testdir")
os.mkdir(self.evaldir)
src = os.path.join(curdir, "fixtures", "sieve-charter.txt")
shutil.copy(src, self.evaldir)
settings.IESG_WG_EVALUATION_DIR = self.evaldir
def tearDown(self):
super(self.__class__, self).tearDown()
shutil.rmtree(self.evaldir)
def test_working_group_actions(self):
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
for wga in WGAction.objects.all():
self.assertTrue(wga.group_acronym.name in r.content)
self.assertTrue('(sieve)' in r.content)
def test_delete_wgaction(self):
make_test_data()
wga = WGAction.objects.all()[0]
url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(delete="1"))
self.assertEquals(r.status_code, 302)
self.assertTrue(not WGAction.objects.filter(pk=wga.pk))
def test_edit_wgaction(self):
make_test_data()
wga = WGAction.objects.all()[0]
url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
login_testing_unauthorized(self, "secretary", url)
# normal get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertEquals(len(q('form select[name=token_name]')), 1)
self.assertEquals(len(q('form select[name=telechat_date]')), 1)
# change
dates = TelechatDate.objects.active()
token_name = Person.objects.get(name="Ad No1").plain_name()
old = wga.pk
r = self.client.post(url, dict(status_date=dates[0].date.isoformat(),
token_name=token_name,
category="23",
note="Testing.",
telechat_date=dates[3].date.isoformat()))
self.assertEquals(r.status_code, 302)
wga = WGAction.objects.get(pk=old)
self.assertEquals(wga.status_date, dates[0].date)
self.assertEquals(wga.token_name, token_name)
self.assertEquals(wga.category, 23)
self.assertEquals(wga.note, "Testing.")
self.assertEquals(wga.telechat_date, dates[3].date)
def test_add_possible_wg(self):
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(add="1",
filename='sieve-charter.txt'))
self.assertEquals(r.status_code, 302)
# now we got back a URL we can use for adding, but first make
# sure we got a proposed group with the acronym
group = Group.objects.create(
name="Sieve test test",
acronym="sieve",
state_id="proposed",
type_id="wg",
parent=None
)
add_url = r['Location']
r = self.client.get(add_url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue('(sieve)' in r.content)
self.assertEquals(len(q('form select[name=token_name]')), 1)
self.assertEquals(q('form input[name=status_date]')[0].get("value"), "2010-05-07")
self.assertEquals(len(q('form select[name=telechat_date]')), 1)
wgas_before = WGAction.objects.all().count()
dates = TelechatDate.objects.active()
token_name = Person.objects.get(name="Ad No1").plain_name()
r = self.client.post(add_url,
dict(status_date=dates[0].date.isoformat(),
token_name=token_name,
category="23",
note="Testing.",
telechat_date=dates[3].date.isoformat()))
self.assertEquals(r.status_code, 302)
self.assertEquals(wgas_before + 1, WGAction.objects.all().count())
def test_delete_possible_wg(self):
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(delete="1",
filename='sieve-charter.txt'))
self.assertEquals(r.status_code, 200)
self.assertTrue('(sieve)' not in r.content)
class IesgUrlTestCase(SimpleUrlTestCase):
def testUrls(self):
self.doTestUrls(__file__)

View file

@ -39,6 +39,7 @@ from ietf.iesg import views
urlpatterns = patterns('',
(r'^telechat/.*$', 'django.views.generic.simple.redirect_to', { 'url': 'http://www.ietf.org/iesg/minutes.html' }),
(r'^ann/(?:ind|new|prev)/$', 'django.views.generic.simple.redirect_to', { 'url': "/iesg/decisions/", 'permanent': True }),
(r'^telechatdates/$', 'django.views.generic.simple.redirect_to', { 'url': '/admin/iesg/telechatdate/' }),
(r'^decisions/(?:(?P<year>[0-9]{4})/)?$', views.review_decisions),
(r'^agenda/(?:(?P<date>\d{4}-\d{2}-\d{2})/)?$', views.agenda),
@ -47,13 +48,10 @@ urlpatterns = patterns('',
(r'^agenda/(?:(?P<date>\d{4}-\d{2}-\d{2})/)?scribe_template.html$', views.agenda_scribe_template),
(r'^agenda/(?:(?P<date>\d{4}-\d{2}-\d{2})/)?moderator_package.html$', views.agenda_moderator_package),
(r'^agenda/(?:(?P<date>\d{4}-\d{2}-\d{2})/)?agenda_package.txt$', views.agenda_package),
(r'^agenda/documents.txt$', views.agenda_documents_txt),
(r'^agenda/documents/$', views.agenda_documents),
(r'^agenda/telechat-(?P<year>\d+)-(?P<month>\d+)-(?P<day>\d+)-docs.tgz', views.telechat_docs_tarfile),
(r'^agenda/telechat-(?:(?P<date>\d{4}-\d{2}-\d{2})-)?docs.tgz', views.telechat_docs_tarfile),
(r'^discusses/$', views.discusses),
(r'^milestones/$', views.milestones_needing_review),
(r'^telechatdates/$', 'django.views.generic.simple.redirect_to', { 'url': '/admin/iesg/telechatdate/' }),
url(r'^wgactions/$', views.working_group_actions, name="iesg_working_group_actions"),
url(r'^wgactions/add/$', views.edit_working_group_action, { 'wga_id': None }, name="iesg_add_working_group_action"),
url(r'^wgactions/(?P<wga_id>\d+)/$', views.edit_working_group_action, name="iesg_edit_working_group_action"),
)

View file

@ -46,8 +46,6 @@ from django.utils import simplejson as json
from django import forms
from ietf.idtracker.models import IDInternal, InternetDraft, AreaGroup, Position, IESGLogin, Acronym
from ietf.iesg.models import TelechatDates, TelechatAgendaItem, WGAction
from ietf.idrfc.idrfc_wrapper import IdWrapper, RfcWrapper
from ietf.iesg.models import TelechatDate, TelechatAgendaItem
@ -436,162 +434,3 @@ def milestones_needing_review(request):
),
context_instance=RequestContext(request))
def parse_wg_action_file(path):
f = open(path, 'rU')
line = f.readline()
while line and not line.strip():
line = f.readline()
# name
m = re.search(r'([^\(]*) \(', line)
if not m:
return None
name = m.group(1)
# acronym
m = re.search(r'\((\w+)\)', line)
if not m:
return None
acronym = m.group(1)
# date
line = f.readline()
m = re.search(r'(\d{4})-(\d{2})-(\d{2})', line)
while line and not m:
line = f.readline()
m = re.search(r'(\d{4})-(\d{2})-(\d{2})', line)
last_updated = None
if m:
try:
last_updated = datetime.date(int(m.group(1)), int(m.group(2)), int(m.group(3)))
except:
pass
# token
line = f.readline()
while line and not 'area director' in line.lower():
line = f.readline()
line = f.readline()
line = f.readline()
m = re.search(r'\s*(\w+)\s*', line)
token = ""
if m:
token = m.group(1)
return dict(filename=os.path.basename(path), name=name, acronym=acronym,
status_date=last_updated, token=token)
def get_possible_wg_actions():
res = []
charters = glob.glob(os.path.join(settings.IESG_WG_EVALUATION_DIR, '*-charter.txt'))
for path in charters:
d = parse_wg_action_file(path)
if d:
if not d['status_date']:
d['status_date'] = datetime.date(1900,1,1)
res.append(d)
res.sort(key=lambda x: x['status_date'])
return res
@role_required('Area Director', 'Secretariat')
def working_group_actions(request):
current_items = WGAction.objects.order_by('status_date').select_related()
if request.method == 'POST' and has_role(request.user, 'Secretariat'):
filename = request.POST.get('filename')
if filename and filename in os.listdir(settings.IESG_WG_EVALUATION_DIR):
if 'delete' in request.POST:
os.unlink(os.path.join(settings.IESG_WG_EVALUATION_DIR, filename))
if 'add' in request.POST:
d = parse_wg_action_file(os.path.join(settings.IESG_WG_EVALUATION_DIR, filename))
qstr = "?" + "&".join("%s=%s" % t for t in d.iteritems())
return HttpResponseRedirect(urlreverse('iesg_add_working_group_action') + qstr)
skip = [c.group_acronym.acronym for c in current_items]
possible_items = filter(lambda x: x['acronym'] not in skip,
get_possible_wg_actions())
return render_to_response("iesg/working_group_actions.html",
dict(current_items=current_items,
possible_items=possible_items),
context_instance=RequestContext(request))
class EditWGActionForm(forms.ModelForm):
token_name = forms.ChoiceField(required=True)
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False)
class Meta:
model = WGAction
fields = ['status_date', 'token_name', 'category', 'note']
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
# token name choices
self.fields['token_name'].choices = [("", "(None)")] + [(p.plain_name(), p.plain_name()) for p in IESGLogin.active_iesg().order_by('first_name')]
# telechat choices
dates = TelechatDates.objects.all()[0].dates()
init = kwargs['initial']['telechat_date']
if init and init not in dates:
dates.insert(0, init)
choices = [("", "(not on agenda)")]
for d in dates:
choices.append((d, d.strftime("%Y-%m-%d")))
self.fields['telechat_date'].choices = choices
@role_required('Secretariat')
def edit_working_group_action(request, wga_id):
if wga_id != None:
wga = get_object_or_404(WGAction, pk=wga_id)
else:
wga = WGAction()
try:
wga.group_acronym = Acronym.objects.get(acronym=request.GET.get('acronym'))
except Acronym.DoesNotExist:
pass
wga.token_name = request.GET.get('token')
try:
d = datetime.datetime.strptime(request.GET.get('status_date'), '%Y-%m-%d').date()
except:
d = datetime.date.today()
wga.status_date = d
wga.telechat_date = TelechatDates.objects.all()[0].date1
wga.agenda = True
initial = dict(telechat_date=wga.telechat_date if wga.agenda else None)
if request.method == 'POST':
if "delete" in request.POST:
wga.delete()
return HttpResponseRedirect(urlreverse('iesg_working_group_actions'))
form = EditWGActionForm(request.POST, instance=wga, initial=initial)
if form.is_valid():
form.save(commit=False)
wga.agenda = bool(form.cleaned_data['telechat_date'])
if wga.category in (11, 21):
wga.agenda = False
if wga.agenda:
wga.telechat_date = form.cleaned_data['telechat_date']
wga.save()
return HttpResponseRedirect(urlreverse('iesg_working_group_actions'))
else:
form = EditWGActionForm(instance=wga, initial=initial)
return render_to_response("iesg/edit_working_group_action.html",
dict(wga=wga,
form=form),
context_instance=RequestContext(request))

View file

@ -1,7 +1,7 @@
from django.core.urlresolvers import reverse
from django.test import TestCase
from ietf.iesg.models import TelechatDate, TelechatAgendaItem, WGAction
from ietf.iesg.models import TelechatDate, TelechatAgendaItem
from ietf.person.models import Person
from ietf.utils.test_data import make_test_data

View file

@ -45,16 +45,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<li><a href="{% url ietf.iesg.views.agenda_documents %}">Next Telechat</a></li>
<li><a href="{% url ietf.iesg.views.discusses %}">Discusses</a></li>
<li><a href="{% url ietf.iesg.views.milestones_needing_review %}">Milestones</a></li>
{# FIXME: this link should be removed when the old WG Actions are completely dead #}
<li><a href="{% url ietf.iesg.views.working_group_actions %}">Working Groups</a></li>
{% endif %}
{% if user|has_role:"Secretariat" %}
<li class="sect">Secretariat</li>
<li><a href="/admin/iesg/telechatdate/">Telechat Dates</a></li>
<li><a href="/admin/iesg/telechatagendaitem/">Management Items</a></li>
<li><a href="{% url ietf.iesg.views.milestones_needing_review %}">Milestones</a></li>
{# FIXME: this link should be removed when the old WG Actions are completely dead #}
<li><a href="{% url ietf.iesg.views.working_group_actions %}">Working Groups</a></li>
<li><a href="{% url ietf.sync.views.discrepancies %}">Sync discrepancies</a>
{% endif %}
{% streams_menu %}

View file

@ -1,30 +0,0 @@
{% extends "base.html" %}
{% block title %}Edit Working Group Action {{ wga.group_acronym.name }}{% endblock %}
{% block morecss %}
form table th {
vertical-align: top;
text-align: left;
font-weight: normal;
padding-top: 3px;
}
{% endblock %}
{% block content %}
{% load ietf_filters %}
<h1>{{ wga.group_acronym.name }} ({{ wga.group_acronym.acronym }})</h1>
<form action="" method="POST">
<table>
{{ form.as_table }}
</table>
<div class="actions">
<a href="{% url iesg_working_group_actions %}">Back</a>
<input type="submit" value="Save"/>
</div>
</form>
{% endblock %}

View file

@ -1,68 +0,0 @@
{% extends "base.html" %}
{% block title %}Working Group Actions{% endblock %}
{% block morecss %}
.working-group-action .name,
.working-group-action .edit {
padding-left: 10px;
}
.working-group-action form input {
margin-left: 10px;
}
{% endblock %}
{% block content %}
{% load ietf_filters %}
<h1>Working Group Actions</h1>
<p>These are the submitted WG descriptions and milestones for all
Proposed Working Groups and recharter submissions, along with
whatever status information is available.</p>
<p>NOTE: Explicit direction by the AD is required to add the group to
an IESG Telechat agenda.</p>
<h2>Current Items</h2>
<table>
{% for wga in current_items %}
<tr class="working-group-action">
<td>{{ wga.status_date|date:"Y, M d" }}</td>
<td class="name">{{ wga.group_acronym.name }} ({{ wga.group_acronym.acronym }})</td>
{% if user|in_group:"Secretariat" %}
<td class="edit">
<form action="{% url iesg_edit_working_group_action wga_id=wga.pk %}" method="POST">
<a href="{% url iesg_edit_working_group_action wga_id=wga.pk %}">Edit</a>
<input type="submit" name="delete" value="Delete"/>
</form>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
<h2>Possible Items</h2>
<table>
{% for wga in possible_items %}
<tr class="working-group-action">
<td>{{ wga.status_date|date:"Y, M d" }}</td>
<td class="name">{{ wga.name }} ({{ wga.acronym }})</td>
{% if user|in_group:"Secretariat" %}
<td class="edit">
<form action="{% url iesg_working_group_actions %}" method="POST">
<input type="hidden" name="filename" value="{{ wga.filename }}">
<input type="submit" name="add" value="Add"/>
<input class="permanent-delete" type="submit" name="delete" value="Delete permanently"/>
</form>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% endblock %}
{% block content_end %}
<script type="text/javascript" src="/js/working-group-actions.js"></script>
{% endblock %}

View file

@ -1,7 +1,7 @@
from django.conf import settings
from django.contrib.auth.models import User
from ietf.iesg.models import TelechatDate, WGAction
from ietf.iesg.models import TelechatDate
from ietf.ipr.models import IprDetail, IprDocAlias
from ietf.meeting.models import Meeting
from ietf.doc.models import *
@ -98,15 +98,6 @@ def make_test_data():
)
group.charter = charter
group.save()
WGAction.objects.create(
pk=group.pk,
note="",
status_date=datetime.date.today(),
agenda=1,
token_name="Aread",
category=13,
telechat_date=date2
)
# persons