Port shepherd management, adding tests

- Legacy-Id: 3401
This commit is contained in:
Ole Laursen 2011-08-30 11:33:47 +00:00
parent d6590c4b89
commit 7e3b621a05
6 changed files with 166 additions and 16 deletions

View file

@ -1,3 +1,5 @@
import datetime
from django import forms
from django.conf import settings
from django.core.mail import EmailMessage
@ -181,6 +183,31 @@ class RemoveDelegateForm(RelatedWGForm):
WGDelegate.objects.filter(pk__in=delegates).delete()
self.set_message('success', 'Delegates removed')
def assign_shepherd(user, internetdraft, shepherd):
if internetdraft.shepherd == shepherd:
return
from redesign.doc.models import save_document_in_history, DocEvent, Document
# saving the proxy object is a bit of a mess, so convert it to a
# proper document
doc = Document.objects.get(name=internetdraft.name)
save_document_in_history(doc)
e = DocEvent(doc=doc, by=user.get_profile())
if not shepherd:
e.desc = u"Unassigned shepherd"
else:
e.desc = u"Changed shepherd to %s" % shepherd.name
e.type = "changed_document"
e.save()
doc.time = e.time
doc.shepherd = shepherd
doc.save()
# update proxy too
internetdraft.shepherd = shepherd
class AddDelegateForm(RelatedWGForm):
@ -225,8 +252,11 @@ class AddDelegateForm(RelatedWGForm):
self.create_delegate(person)
def assign_shepherd(self, person):
self.shepherd.shepherd = person
self.shepherd.save()
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
assign_shepherd(self.user, self.shepherd, person)
else:
self.shepherd.shepherd = person
self.shepherd.save()
self.next_form = AddDelegateForm(wg=self.wg, user=self.user, shepherd=self.shepherd)
self.next_form.set_message('success', 'Shepherd assigned successfully')

View file

@ -1,3 +1,4 @@
from django.conf import settings
from django import template
from ietf.ietfworkflows.utils import get_state_for_draft
@ -23,6 +24,10 @@ def wgchairs_admin_options(context, wg):
@register.simple_tag
def writeup(doc):
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
e = doc.latest_event(type="changed_protocol_writeup")
return e.text if e else ""
writeup = doc.protowriteup_set.all()
if not writeup.count():
return ''
@ -32,6 +37,10 @@ def writeup(doc):
@register.simple_tag
def writeupdate(doc):
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
e = doc.latest_event(type="changed_protocol_writeup")
return e.time if e else ""
writeup = doc.protowriteup_set.all()
if not writeup.count():
return ''

View file

@ -14,6 +14,7 @@ from ietf.utils.test_data import make_test_data
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from redesign.person.models import Person, Email
from redesign.group.models import Group, Role
from redesign.doc.models import Document
class ManageDelegatesTestCase(django.test.TestCase):
fixtures = ['names']
@ -93,7 +94,94 @@ class ManageDelegatesTestCase(django.test.TestCase):
self.assertTrue("new delegate" in r.content)
self.assertTrue(Email.objects.get(address="plain@example.com").person.name in r.content)
class ManageShepherdsTestCase(django.test.TestCase):
fixtures = ['names']
def test_manage_shepherds(self):
make_test_data()
url = urlreverse('manage_shepherds', kwargs=dict(acronym="mars"))
login_testing_unauthorized(self, "secretary", url)
# setup test documents
group = Group.objects.get(acronym="mars")
from redesign.doc.models import Document
common = dict(group=group,
state_id="active",
ad=Person.objects.get(user__username="ad"),
type_id="draft")
Document.objects.create(name="test-no-shepherd",
title="No shepherd",
shepherd=None,
**common)
Document.objects.create(name="test-shepherd-me",
title="Shepherd me",
shepherd=Person.objects.get(user__username="secretary"),
**common)
Document.objects.create(name="test-shepherd-other", title="Shepherd other",
shepherd=Person.objects.get(user__username="plain"),
**common)
# get and make sure they are divided correctly
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertEquals(len(q('div#noshepherd a:contains("No shepherd")')), 1)
self.assertEquals(len(q('div#mydocs a:contains("Shepherd me")')), 1)
self.assertEquals(len(q('div#othershepherds a:contains("Shepherd other")')), 1)
def test_set_shepherd(self):
draft = make_test_data()
url = urlreverse('doc_managing_shepherd', kwargs=dict(acronym="mars", name=draft.name))
login_testing_unauthorized(self, "secretary", url)
# get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertEquals(len(q('input[type=submit][name=setme]')), 1)
# set me
events_before = draft.docevent_set.count()
r = self.client.post(url,
dict(setme="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue(draft.shepherd)
self.assertEquals(draft.shepherd.user.username, "secretary")
self.assertEquals(draft.docevent_set.count(), events_before + 1)
# get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
self.assertTrue(Person.objects.get(user__username="secretary").name in r.content)
q = PyQuery(r.content)
self.assertEquals(len(q('input[type=submit][name=remove_shepherd]')), 1)
# unassign
events_before = draft.docevent_set.count()
r = self.client.post(url,
dict(remove_shepherd="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue(not draft.shepherd)
self.assertEquals(draft.docevent_set.count(), events_before + 1)
# change to existing person
events_before = draft.docevent_set.count()
r = self.client.post(url,
dict(email="plain@example.com",
form_type="single"))
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue("Shepherd assigned" in r.content)
self.assertTrue(Email.objects.get(address="plain@example.com").person.name in r.content)
self.assertEquals(draft.docevent_set.count(), events_before + 1)
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
# the above tests only work with the new schema
del ManageDelegatesTestCase
del ManageShepherdsTestCase

View file

@ -92,6 +92,9 @@ def manage_workflow(request, acronym):
}, RequestContext(request))
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from ietf.wgchairs.forms import assign_shepherd
def managing_shepherd(request, acronym, name):
"""
View for managing the assigned shepherd of a document.
@ -107,11 +110,17 @@ def managing_shepherd(request, acronym, name):
add_form = add_form_factory(request, wg, user, shepherd=doc)
if request.method == 'POST':
if request.POST.get('remove_shepherd'):
doc.shepherd = None
doc.save()
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
assign_shepherd(user, doc, None)
else:
doc.shepherd = None
doc.save()
elif request.POST.get('setme'):
doc.shepherd = person
doc.save()
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
assign_shepherd(user, doc, person)
else:
doc.shepherd = person
doc.save()
elif add_form.is_valid():
add_form.save()
add_form = add_form.get_next_form()
@ -132,16 +141,18 @@ def wg_shepherd_documents(request, acronym):
return HttpResponseForbidden('You have no permission to access this view')
current_person = get_person_for_user(user)
form = SearchForm({'by': 'group', 'group': str(wg.group_acronym.acronym),
'activeDrafts': 'on'})
if not form.is_valid():
raise ValueError("form did not validate")
(docs, meta) = search_query(form.cleaned_data)
base_qs = InternetDraft.objects.filter(pk__in=[i.id._draft.pk for i in docs if i.id]).select_related('status')
documents_no_shepherd = base_qs.filter(shepherd__isnull=True)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
base_qs = InternetDraft.objects.filter(group=wg, state="active").select_related("status").order_by('title')
else:
form = SearchForm({'by': 'group', 'group': str(wg.group_acronym.acronym),
'activeDrafts': 'on'})
if not form.is_valid():
raise ValueError("form did not validate")
(docs, meta) = search_query(form.cleaned_data)
base_qs = InternetDraft.objects.filter(pk__in=[i.id._draft.pk for i in docs if i.id]).select_related('status')
documents_no_shepherd = base_qs.filter(shepherd=None)
documents_my = base_qs.filter(shepherd=current_person)
documents_other = base_qs.exclude(shepherd__isnull=True).exclude(shepherd__pk__in=[current_person.pk, 0])
documents_other = base_qs.exclude(shepherd=None).exclude(shepherd__pk__in=[current_person.pk, 0])
context = {
'no_shepherd': documents_no_shepherd,
'my_documents': documents_my,

View file

@ -210,6 +210,9 @@ EVENT_TYPES = [
("requested_resurrect", "Requested resurrect"),
("completed_resurrect", "Completed resurrect"),
("published_rfc", "Published RFC"),
# WG events
("changed_protocol_writeup", "Changed protocol writeup"),
# IESG events
("started_iesg_process", "Started IESG process on document"),

View file

@ -25,12 +25,16 @@ class Acronym(Group):
def name_key(self):
return self.name.upper()
@property
def ietfwg(self):
return IETFWG().from_object(self)
def __str__(self):
return self.acronym
def __unicode__(self):
return self.acronym
class Meta:
proxy = True
@ -102,6 +106,11 @@ class IETFWG(Group):
),
always_filter=dict(type__in=("wg", "individ")))
def from_object(self, base):
for f in base._meta.fields:
setattr(self, f.name, getattr(base, f.name))
return self
ACTIVE=1
#group_acronym = models.OneToOneField(Acronym, primary_key=True, editable=False)
@property