diff --git a/ietf/utils/test_data.py b/ietf/utils/test_data.py index af9f7e9df..682d7bae0 100644 --- a/ietf/utils/test_data.py +++ b/ietf/utils/test_data.py @@ -92,7 +92,23 @@ def make_test_data(): group=group, email=wgchair, ) - + + # group delegate + u = User.objects.create(username="wgdelegate") + p = Person.objects.create( + name="WG Delegate", + ascii="WG Delegate", + user=u + ) + email = Email.objects.create( + address="wgdelegate@ietf.org", + person=p) + Role.objects.create( + name_id="delegate", + group=group, + email=email, + ) + # secretary u = User.objects.create(username="secretary") p = Person.objects.create( diff --git a/ietf/wgchairs/models.py b/ietf/wgchairs/models.py index 3b57827e3..8909c7e05 100644 --- a/ietf/wgchairs/models.py +++ b/ietf/wgchairs/models.py @@ -1,6 +1,7 @@ import datetime from django.db import models +from django.conf import settings from ietf.idtracker.models import (IETFWG, PersonOrOrgInfo, InternetDraft) @@ -11,7 +12,7 @@ class WGDelegate(models.Model): PersonOrOrgInfo, ) - wg = models.ForeignKey(IETFWG) + wg = models.ForeignKey(IETFWG, related_name="old_wgdelegate_set" if settings.USE_DB_REDESIGN_PROXY_CLASSES else None) def __unicode__(self): return "%s" % self.person @@ -19,7 +20,6 @@ class WGDelegate(models.Model): class Meta: verbose_name = "WG Delegate" - class ProtoWriteUp(models.Model): person = models.ForeignKey( PersonOrOrgInfo, @@ -43,3 +43,35 @@ class ProtoWriteUp(models.Model): blank=False, null=False, ) + +if settings.USE_DB_REDESIGN_PROXY_CLASSES: + from redesign.group.models import Role + class WGDelegateProxy(Role): + #person = models.ForeignKey(PersonOrOrgInfo) + @property + def person(self): + return self.email.person + #wg = models.ForeignKey(IETFWG) + @property + def wg(self): + return self.group + + def __unicode__(self): + return u"%s" % self.person + + class Meta: + proxy = True + + from redesign.doc.models import DocEvent + class ProtoWriteUpProxy(DocEvent): + #person = models.ForeignKey(PersonOrOrgInfo, blank=False, null=False) + #draft = models.ForeignKey(InternetDraft, blank=False, null=False) + #date = models.DateTimeField(default=datetime.datetime.now(), blank=False, null=False) + #writeup = models.TextField(blank=False, null=False) + class Meta: + proxy = True + + #WGDelegateOld = WGDelegate + WGDelegate = WGDelegateProxy + ProtoWriteUpOld = ProtoWriteUp + ProtoWriteUp = ProtoWriteUpProxy diff --git a/ietf/wgchairs/tests.py b/ietf/wgchairs/tests.py new file mode 100644 index 000000000..9f61eb9ef --- /dev/null +++ b/ietf/wgchairs/tests.py @@ -0,0 +1,51 @@ +import datetime, os, shutil + +from django.conf import settings +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse as urlreverse +import django.test +from StringIO import StringIO +from pyquery import PyQuery + +from ietf.utils.test_utils import login_testing_unauthorized +from ietf.utils.test_runner import mail_outbox +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 + +class ManageDelegatesTestCase(django.test.TestCase): + fixtures = ['names'] + + def test_delete_delegate(self): + make_test_data() + + url = urlreverse('manage_delegates', kwargs=dict(acronym="mars")) + login_testing_unauthorized(self, "secretary", url) + + delegates = Role.objects.filter(name="delegate", group__acronym="mars") + self.assertTrue(len(delegates) > 0) + + # get + r = self.client.get(url) + self.assertEquals(r.status_code, 200) + q = PyQuery(r.content) + self.assertEquals(len(q('form input[name=delete]')), len(delegates)) + + # delete + r = self.client.post(url, + dict(remove="1", + delete=[d.pk for d in delegates])) + self.assertEquals(r.status_code, 200) + q = PyQuery(r.content) + self.assertEquals(len(q('form input[name=delete]')), 0) + self.assertEquals(Role.objects.filter(name="delegate", group__acronym="mars").count(), 0) + + + + + +if not settings.USE_DB_REDESIGN_PROXY_CLASSES: + # the above tests only work with the new schema + del ManageDelegatesTestCase diff --git a/redesign/group/proxy.py b/redesign/group/proxy.py index 1084c7e2f..4f992538c 100644 --- a/redesign/group/proxy.py +++ b/redesign/group/proxy.py @@ -209,6 +209,10 @@ class IETFWG(Group): d = Dummy() d.all = self.chairs() return d + @property + def wgdelegate_set(self): + from ietf.wgchairs.models import WGDelegate + return WGDelegate.objects.filter(group=self, name="delegate") class Meta: proxy = True diff --git a/redesign/name/fixtures/names.xml b/redesign/name/fixtures/names.xml index 3baf7ee5d..0144b0e6b 100644 --- a/redesign/name/fixtures/names.xml +++ b/redesign/name/fixtures/names.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <django-objects version="1.0"> - <object pk="yes" model="name.ballotpositionname"> - <field type="CharField" name="name">Yes</field> + <object pk="noobj" model="name.ballotpositionname"> + <field type="CharField" name="name">No Objection</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="noobj" model="name.ballotpositionname"> - <field type="CharField" name="name">No Objection</field> + <object pk="yes" model="name.ballotpositionname"> + <field type="CharField" name="name">Yes</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> @@ -54,24 +54,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="iana-crd" model="name.docinfotagname"> - <field type="CharField" name="name">IANA coordination</field> - <field type="TextField" name="desc">RFC-Editor/IANA Registration Coordination</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="missref" model="name.docinfotagname"> - <field type="CharField" name="name">Missing references</field> - <field type="TextField" name="desc">Awaiting missing normative reference</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="fasttrac" model="name.docinfotagname"> - <field type="CharField" name="name">FastTrack</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="rfc-rev" model="name.docinfotagname"> <field type="CharField" name="name">Review by RFC Editor</field> <field type="TextField" name="desc"></field> @@ -102,12 +84,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="ref" model="name.docinfotagname"> - <field type="CharField" name="name">Holding for references</field> - <field type="TextField" name="desc">Holding for normative reference</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="point" model="name.docinfotagname"> <field type="CharField" name="name">Point Raised - writeup needed</field> <field type="TextField" name="desc">IESG discussions on the document have raised some issues that need to be brought to the attention of the authors/WG, but those issues have not been written down yet. (It is common for discussions during a telechat to result in such situations. An AD may raise a possible issue during a telechat and only decide as a result of that discussion whether the issue is worth formally writing up and bringing to the attention of the authors/WG). A document stays in the "Point Raised - Writeup Needed" state until *ALL* IESG comments that have been raised have been documented.</field> @@ -138,14 +114,14 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">5</field> </object> - <object pk="updates" model="name.docrelationshipname"> - <field type="CharField" name="name">Updates</field> + <object pk="replaces" model="name.docrelationshipname"> + <field type="CharField" name="name">Replaces</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="replaces" model="name.docrelationshipname"> - <field type="CharField" name="name">Replaces</field> + <object pk="updates" model="name.docrelationshipname"> + <field type="CharField" name="name">Updates</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> @@ -156,20 +132,8 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="reviews" model="name.docrelationshipname"> - <field type="CharField" name="name">Reviews</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="refs" model="name.docrelationshipname"> - <field type="CharField" name="name">References</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="rfc" model="name.docstatename"> - <field type="CharField" name="name">RFC</field> + <object pk="active" model="name.docstatename"> + <field type="CharField" name="name">Active</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> @@ -180,14 +144,8 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="repl" model="name.docstatename"> - <field type="CharField" name="name">Replaced</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="active" model="name.docstatename"> - <field type="CharField" name="name">Active</field> + <object pk="rfc" model="name.docstatename"> + <field type="CharField" name="name">RFC</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> @@ -198,12 +156,24 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="repl" model="name.docstatename"> + <field type="CharField" name="name">Replaced</field> + <field type="TextField" name="desc"></field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> <object pk="ietf-rm" model="name.docstatename"> <field type="CharField" name="name">Withdrawn by IETF</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="legacy" model="name.docstreamname"> + <field type="CharField" name="name">Legacy</field> + <field type="TextField" name="desc"></field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> <object pk="ietf" model="name.docstreamname"> <field type="CharField" name="name">IETF</field> <field type="TextField" name="desc"></field> @@ -216,12 +186,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="legacy" model="name.docstreamname"> - <field type="CharField" name="name">Legacy</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="iab" model="name.docstreamname"> <field type="CharField" name="name">IAB</field> <field type="TextField" name="desc"></field> @@ -234,18 +198,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="draft" model="name.doctypename"> - <field type="CharField" name="name">Draft</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="ext" model="name.doctypename"> - <field type="CharField" name="name">External</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="agenda" model="name.doctypename"> <field type="CharField" name="name">Agenda</field> <field type="TextField" name="desc"></field> @@ -264,6 +216,12 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="draft" model="name.doctypename"> + <field type="CharField" name="name">Draft</field> + <field type="TextField" name="desc"></field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> <object pk="liai-att" model="name.doctypename"> <field type="CharField" name="name">Liaison Attachment</field> <field type="TextField" name="desc"></field> @@ -318,15 +276,21 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="ag" model="name.grouptypename"> + <field type="CharField" name="name">AG</field> + <field type="TextField" name="desc">Area group</field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> <object pk="wg" model="name.grouptypename"> <field type="CharField" name="name">WG</field> - <field type="TextField" name="desc"></field> + <field type="TextField" name="desc">Working group</field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> <object pk="rg" model="name.grouptypename"> <field type="CharField" name="name">RG</field> - <field type="TextField" name="desc"></field> + <field type="TextField" name="desc">Research group</field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> @@ -342,15 +306,9 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="ag" model="name.grouptypename"> - <field type="CharField" name="name">AG</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="sdo" model="name.grouptypename"> - <field type="CharField" name="name">Standards Organization</field> - <field type="TextField" name="desc"></field> + <field type="CharField" name="name">SDO</field> + <field type="TextField" name="desc">Standards organization</field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> @@ -534,72 +492,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="auth" model="name.rfcdocstatename"> - <field type="CharField" name="name">AUTH</field> - <field type="TextField" name="desc">Awaiting author action</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="auth48" model="name.rfcdocstatename"> - <field type="CharField" name="name">AUTH48</field> - <field type="TextField" name="desc">Awaiting final author approval</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="edit" model="name.rfcdocstatename"> - <field type="CharField" name="name">EDIT</field> - <field type="TextField" name="desc">Approved by the stream manager (e.g., IESG, IAB, IRSG, ISE), awaiting processing and publishing</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="iana-crd" model="name.rfcdocstatename"> - <field type="CharField" name="name">IANA</field> - <field type="TextField" name="desc">RFC-Editor/IANA Registration Coordination</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="iesg" model="name.rfcdocstatename"> - <field type="CharField" name="name">IESG</field> - <field type="TextField" name="desc">Holding for IESG action</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="isr" model="name.rfcdocstatename"> - <field type="CharField" name="name">ISR</field> - <field type="TextField" name="desc">Independent Submission Review by the ISE </field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="isr-auth" model="name.rfcdocstatename"> - <field type="CharField" name="name">ISR-AUTH</field> - <field type="TextField" name="desc">Independent Submission awaiting author update, or in discussion between author and ISE</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="ref" model="name.rfcdocstatename"> - <field type="CharField" name="name">REF</field> - <field type="TextField" name="desc">Holding for normative reference</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="rfc-edit" model="name.rfcdocstatename"> - <field type="CharField" name="name">RFC-EDITOR</field> - <field type="TextField" name="desc">Awaiting final RFC Editor review before AUTH48</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="timeout" model="name.rfcdocstatename"> - <field type="CharField" name="name">TO</field> - <field type="TextField" name="desc">Time-out period during which the IESG reviews document for conflict/concurrence with other IETF working group work</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> - <object pk="missref" model="name.rfcdocstatename"> - <field type="CharField" name="name">MISSREF</field> - <field type="TextField" name="desc">Awaiting missing normative reference</field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="ad" model="name.rolename"> <field type="CharField" name="name">Area Director</field> <field type="TextField" name="desc"></field> @@ -636,12 +528,6 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="dir" model="name.rolename"> - <field type="CharField" name="name">Executive Director</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="execdir" model="name.rolename"> <field type="CharField" name="name">Executive Director</field> <field type="TextField" name="desc"></field> @@ -666,6 +552,12 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="delegate" model="name.rolename"> + <field type="CharField" name="name">Delegate</field> + <field type="TextField" name="desc"></field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> <object pk="schedw" model="name.sessionstatusname"> <field type="CharField" name="name">Waiting for Scheduling</field> <field type="TextField" name="desc"></field> @@ -768,16 +660,16 @@ <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> - <object pk="other" model="name.timeslottypename"> - <field type="CharField" name="name">Other</field> - <field type="TextField" name="desc"></field> - <field type="BooleanField" name="used">1</field> - <field type="IntegerField" name="order">0</field> - </object> <object pk="plenary" model="name.timeslottypename"> <field type="CharField" name="name">Plenary</field> <field type="TextField" name="desc"></field> <field type="BooleanField" name="used">1</field> <field type="IntegerField" name="order">0</field> </object> + <object pk="other" model="name.timeslottypename"> + <field type="CharField" name="name">Other</field> + <field type="TextField" name="desc"></field> + <field type="BooleanField" name="used">1</field> + <field type="IntegerField" name="order">0</field> + </object> </django-objects> \ No newline at end of file