Skip to content

Commit 140ebaa

Browse files
committed
* Fix some decorators in private index and private merge views
* Add edit chair test * Add new roles in nomcom_test_data function * Add member rolename to name app fixtures * Change urls names See ietf-tools#904 ietf-tools#919 - Legacy-Id: 5163
1 parent 8b0c358 commit 140ebaa

6 files changed

Lines changed: 175 additions & 40 deletions

File tree

ietf/name/fixtures/names.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,12 @@
649649
<field type="BooleanField" name="used">True</field>
650650
<field type="IntegerField" name="order">0</field>
651651
</object>
652+
<object pk="member" model="name.rolename">
653+
<field type="CharField" name="name">Member</field>
654+
<field type="TextField" name="desc"></field>
655+
<field type="BooleanField" name="used">True</field>
656+
<field type="IntegerField" name="order">0</field>
657+
</object>
652658
<object pk="schedw" model="name.sessionstatusname">
653659
<field type="CharField" name="name">Waiting for Scheduling</field>
654660
<field type="TextField" name="desc"></field>

ietf/nomcom/forms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def done(self, request, cleaned_data):
112112
person=member['person'],
113113
email=member['email_obj'])
114114

115-
return HttpResponseRedirect(reverse('edit_members', kwargs={'year': self.year}))
115+
return HttpResponseRedirect(reverse('nomcom_edit_members', kwargs={'year': self.year}))
116116

117117

118118
class EditChairForm(BaseNomcomForm, forms.Form):
@@ -167,7 +167,7 @@ def done(self, request, cleaned_data):
167167
person=chair_info['person'],
168168
email=chair_info['email_obj'])
169169

170-
return HttpResponseRedirect(reverse('edit_chair', kwargs={'year': self.year}))
170+
return HttpResponseRedirect(reverse('nomcom_edit_chair', kwargs={'year': self.year}))
171171

172172

173173
class EditPublicKeyForm(BaseNomcomForm, forms.ModelForm):

ietf/nomcom/test_data.py

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
from django.contrib.auth.models import User
22

3-
from ietf.group.models import Group
3+
from ietf.group.models import Group, Role
44
from ietf.person.models import Email, Person
5-
from ietf.name.models import GroupStateName, GroupTypeName
6-
from ietf.nomcom.models import NomCom, Position, NomineePosition, Nominee
5+
from ietf.name.models import RoleName
6+
from ietf.nomcom.models import NomCom, Position, Nominee
7+
8+
COMMUNITY_USER = 'plain'
9+
CHAIR_USER = 'chair'
10+
MEMBER_USER = 'member'
11+
SECRETARIAT_USER = 'secretariat'
12+
EMAIL_DOMAIN = '@example.com'
13+
14+
USERS = [COMMUNITY_USER, CHAIR_USER, MEMBER_USER, SECRETARIAT_USER]
715

816
POSITIONS = {
917
"GEN": "IETF Chair/Gen AD",
@@ -21,25 +29,55 @@
2129

2230

2331
def nomcom_test_data():
32+
# groups
2433
group, created = Group.objects.get_or_create(name='IAB/IESG Nominating Committee 2013/2014',
25-
state=GroupStateName.objects.get(slug='active'),
26-
type=GroupTypeName.objects.get(slug='nomcom'),
34+
state_id='active',
35+
type_id='nomcom',
2736
acronym='nomcom2013')
2837
nomcom, created = NomCom.objects.get_or_create(group=group)
29-
u, created = User.objects.get_or_create(username="plain", password="plain")
30-
plainman, created = Person.objects.get_or_create(
31-
name="Plain Man",
32-
ascii="Plain Man",
33-
user=u)
34-
email, cerated = Email.objects.get_or_create(
35-
address="plain@example.com",
36-
person=plainman)
38+
39+
secretariat, created = Group.objects.get_or_create(name="Secretariat",
40+
acronym="secretariat",
41+
state_id="active",
42+
type_id="ietf",
43+
parent=None)
44+
# users
45+
for user in USERS:
46+
u, created = User.objects.get_or_create(username=user, password=user)
47+
person, created = Person.objects.get_or_create(
48+
name=user,
49+
ascii=user,
50+
user=u)
51+
email, created = Email.objects.get_or_create(
52+
address="%s%s" % (user, EMAIL_DOMAIN),
53+
person=person)
54+
55+
if user == CHAIR_USER:
56+
role, created = RoleName.objects.get_or_create(slug="chair")
57+
Role.objects.get_or_create(name=role,
58+
group=group,
59+
person=person,
60+
email=email)
61+
if user == MEMBER_USER:
62+
role, created = RoleName.objects.get_or_create(slug="member")
63+
Role.objects.get_or_create(name=role,
64+
group=group,
65+
person=person,
66+
email=email)
67+
if user == SECRETARIAT_USER:
68+
role, created = RoleName.objects.get_or_create(slug="secr")
69+
Role.objects.create(name=role,
70+
group=secretariat,
71+
person=person,
72+
email=email)
73+
# nominee
74+
email = Email.objects.get(person__name=COMMUNITY_USER)
75+
nominee, created = Nominee.objects.get_or_create(email=email)
76+
77+
# positions
3778
for name, description in POSITIONS.iteritems():
3879
position, created = Position.objects.get_or_create(nomcom=nomcom,
3980
name=name,
4081
description=description,
4182
is_open=True,
4283
incumbent=email)
43-
Position.objects.get(name='GEN')
44-
nominee, created = Nominee.objects.get_or_create(email=email)
45-
nominee_position, created = NomineePosition.objects.get_or_create(position=position, nominee=nominee)

ietf/nomcom/tests.py

Lines changed: 106 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
from django.db import IntegrityError
77
from django.core.urlresolvers import reverse
88
from django.core.files import File
9+
from django.contrib.formtools.preview import security_hash
910

1011
from ietf.utils.test_utils import login_testing_unauthorized
1112
from ietf.utils.pipe import pipe
12-
from ietf.nomcom.test_data import nomcom_test_data
13+
14+
from ietf.nomcom.test_data import nomcom_test_data, COMMUNITY_USER, CHAIR_USER, \
15+
MEMBER_USER, SECRETARIAT_USER, EMAIL_DOMAIN
1316
from ietf.nomcom.models import NomineePosition, Position, Nominee, \
1417
NomineePositionState, Feedback, FeedbackType
18+
from ietf.nomcom.forms import EditChairForm
1519

1620

1721
class NomcomViewsTest(TestCase):
@@ -26,32 +30,117 @@ def setUp(self):
2630
nomcom_test_data()
2731
self.year = 2013
2832

29-
def test_home_view(self):
30-
"""Verify home view"""
31-
url = reverse('nomcom_index', kwargs={'year': self.year})
33+
# private urls
34+
self.private_index_url = reverse('nomcom_private_index', kwargs={'year': self.year})
35+
self.private_merge_url = reverse('nomcom_private_merge', kwargs={'year': self.year})
36+
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
37+
self.edit_chair_url = reverse('nomcom_edit_chair', kwargs={'year': self.year})
38+
self.public_key_url = reverse('nomcom_edit_publickey', kwargs={'year': self.year})
39+
40+
# public urls
41+
self.index_url = reverse('nomcom_index', kwargs={'year': self.year})
42+
self.requirements_url = reverse('nomcom_requirements', kwargs={'year': self.year})
43+
self.questionnaires_url = reverse('nomcom_questionnaires', kwargs={'year': self.year})
44+
self.comments_url = reverse('nomcom_comments', kwargs={'year': self.year})
45+
self.nominate_url = reverse('nomcom_nominate', kwargs={'year': self.year})
46+
47+
def access_member_url(self, url):
48+
login_testing_unauthorized(self, COMMUNITY_USER, url)
49+
login_testing_unauthorized(self, CHAIR_USER, url)
50+
self.check_url_status(url, 200)
51+
self.client.logout()
52+
login_testing_unauthorized(self, MEMBER_USER, url)
3253
self.check_url_status(url, 200)
3354

34-
def test_nominate_view(self):
35-
"""Verify nominate view"""
36-
url = reverse('nomcom_nominate', kwargs={'year': self.year})
37-
login_testing_unauthorized(self, 'kaligula', url)
55+
def access_chair_url(self, url):
56+
login_testing_unauthorized(self, COMMUNITY_USER, url)
57+
login_testing_unauthorized(self, MEMBER_USER, url)
58+
login_testing_unauthorized(self, CHAIR_USER, url)
3859
self.check_url_status(url, 200)
3960

61+
def test_private_index_view(self):
62+
"""Verify private home view"""
63+
self.access_member_url(self.private_index_url)
64+
self.client.logout()
65+
66+
def test_private_merge_view(self):
67+
"""Verify private merge view"""
68+
# TODO: complete merge nominations
69+
self.access_chair_url(self.private_merge_url)
70+
self.client.logout()
71+
72+
def test_edit_members_view(self):
73+
"""Verify edit member view"""
74+
# TODO: complete chage edit memebers
75+
self.access_chair_url(self.edit_members_url)
76+
self.client.logout()
77+
78+
def change_chair(self, user):
79+
test_data = {'chair': '%s%s' % (user, EMAIL_DOMAIN),
80+
'stage': 1}
81+
# preview
82+
self.client.post(self.edit_chair_url, test_data)
83+
84+
hash = security_hash(None, EditChairForm(test_data))
85+
test_data.update({'hash': hash, 'stage': 2})
86+
87+
# submit
88+
self.client.post(self.edit_chair_url, test_data)
89+
90+
def test_edit_chair_view(self):
91+
"""Verify edit chair view"""
92+
login_testing_unauthorized(self, COMMUNITY_USER, self.edit_chair_url)
93+
login_testing_unauthorized(self, CHAIR_USER, self.edit_chair_url)
94+
login_testing_unauthorized(self, SECRETARIAT_USER, self.edit_chair_url)
95+
self.check_url_status(self.edit_chair_url, 200)
96+
97+
self.change_chair(COMMUNITY_USER)
98+
99+
# check chair actions
100+
self.client.login(remote_user=COMMUNITY_USER)
101+
url = reverse('nomcom_edit_members', kwargs={'year': self.year})
102+
self.check_url_status(url, 200)
103+
url = reverse('nomcom_edit_publickey', kwargs={'year': self.year})
104+
self.check_url_status(url, 200)
105+
106+
# revert edit nomcom chair
107+
login_testing_unauthorized(self, SECRETARIAT_USER, self.edit_chair_url)
108+
self.change_chair(CHAIR_USER)
109+
self.client.logout()
110+
111+
def test_edit_publickey_view(self):
112+
"""Verify edit publickey view"""
113+
# TODO: complete chage edit public key
114+
login_testing_unauthorized(self, COMMUNITY_USER, self.public_key_url)
115+
login_testing_unauthorized(self, CHAIR_USER, self.public_key_url)
116+
self.check_url_status(self.public_key_url, 200)
117+
self.client.logout()
118+
119+
def test_index_view(self):
120+
"""Verify home view"""
121+
self.check_url_status(self.index_url, 200)
122+
40123
def test_requirements_view(self):
41124
"""Verify requirements view"""
42-
url = reverse('nomcom_requirements', kwargs={'year': self.year})
43-
self.check_url_status(url, 200)
125+
self.check_url_status(self.requirements_url, 200)
44126

45127
def test_questionnaires_view(self):
46128
"""Verify questionnaires view"""
47-
url = reverse('nomcom_questionnaires', kwargs={'year': self.year})
48-
self.check_url_status(url, 200)
129+
self.check_url_status(self.questionnaires_url, 200)
49130

50131
def test_comments_view(self):
51132
"""Verify comments view"""
52-
url = reverse('nomcom_comments', kwargs={'year': self.year})
53-
login_testing_unauthorized(self, 'plain', url)
54-
self.check_url_status(url, 200)
133+
# TODO: comments view
134+
login_testing_unauthorized(self, COMMUNITY_USER, self.comments_url)
135+
self.check_url_status(self.comments_url, 200)
136+
self.client.logout()
137+
138+
def test_nominate_view(self):
139+
"""Verify nominate view"""
140+
# TODO: complete to do a nomination
141+
login_testing_unauthorized(self, COMMUNITY_USER, self.nominate_url)
142+
self.check_url_status(self.nominate_url, 200)
143+
self.client.logout()
55144

56145

57146
class NomineePositionStateSaveTest(TestCase):
@@ -60,7 +149,7 @@ class NomineePositionStateSaveTest(TestCase):
60149

61150
def setUp(self):
62151
nomcom_test_data()
63-
self.nominee = Nominee.objects.get(email__address="plain@example.com")
152+
self.nominee = Nominee.objects.get(email__person__name=COMMUNITY_USER)
64153

65154
def test_state_autoset(self):
66155
"""Verify state is autoset correctly"""
@@ -132,7 +221,7 @@ def generate_cert(self):
132221

133222
def test_encrypted_comments(self):
134223

135-
nominee = Nominee.objects.get(email__address="plain@example.com")
224+
nominee = Nominee.objects.get(email__person__name=COMMUNITY_USER)
136225
position = Position.objects.get(name='OAM')
137226
nomcom = position.nomcom
138227

ietf/nomcom/urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
urlpatterns = patterns('ietf.nomcom.views',
66
url(r'^(?P<year>\d{4})/private/$', 'private_index', name='nomcom_private_index'),
77
url(r'^(?P<year>\d{4})/private/merge/$', 'private_merge', name='nomcom_private_merge'),
8-
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='edit_members'),
9-
url(r'^(?P<year>\d{4})/private/edit-chair/$', EditChairFormPreview(EditChairForm), name='edit_chair'),
10-
url(r'^(?P<year>\d{4})/private/edit-publickey/$', 'edit_publickey', name='edit_publickey'),
8+
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
9+
url(r'^(?P<year>\d{4})/private/edit-chair/$', EditChairFormPreview(EditChairForm), name='nomcom_edit_chair'),
10+
url(r'^(?P<year>\d{4})/private/edit-publickey/$', 'edit_publickey', name='nomcom_edit_publickey'),
1111

1212
url(r'^(?P<year>\d{4})/$', 'index', name='nomcom_index'),
1313
url(r'^(?P<year>\d{4})/requirements/$', 'requirements', name='nomcom_requirements'),

ietf/nomcom/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def index(request, year):
2424
'template': template}, RequestContext(request))
2525

2626

27-
@member_required(role='chair')
27+
@member_required(role='member')
2828
def private_index(request, year):
2929
nomcom = get_nomcom_by_year(year)
3030
is_nomcom_member(request.user, nomcom)
@@ -34,8 +34,9 @@ def private_index(request, year):
3434
'selected': 'index'}, RequestContext(request))
3535

3636

37-
@member_required(role='member')
37+
@member_required(role='chair')
3838
def private_merge(request, year):
39+
# TODO: complete merge nominations
3940
nomcom = get_nomcom_by_year(year)
4041
is_nomcom_member(request.user, nomcom)
4142
return render_to_response('nomcom/private_merge.html',
@@ -86,6 +87,7 @@ def nominate(request, year):
8687

8788
@login_required
8889
def comments(request, year):
90+
# TODO: complete to do comments
8991
nomcom = get_nomcom_by_year(year)
9092
return render_to_response('nomcom/comments.html',
9193
{'nomcom': nomcom,

0 commit comments

Comments
 (0)