Skip to content

Commit 2daef52

Browse files
committed
This commit replaces the code defined group features with features held
in a database table: - Added a GroupFeatures model to the group models, and removed the old features.py - Added a agenda type for future use in showing different group types on different agendas. - Renamed the group feature has_materials to has_nonsession_materials. - Added API resources and admin support for the new tables. - Added a Directorate (with reviews) group type as complement to Directorate, to distinguish between directorates with and without reviews. - Adjusted tests as needed. - Updated the fixtures, and fixed the generate_fixtures script to include the new AgendaTypeName objects. There still exists about 70 instances of code comparing the group type with a list of types; most of these should probably be replaced with new features, instead, to make it possible to add new group types through the database table, rather than having to edit the code. That was the purpose of this refactoring from the start, but the presence of this large number of comparisons of group type against lists of types defeats the goal until we add appropriate features and replace the group type list comparisons. - Legacy-Id: 15316
1 parent 21f38a3 commit 2daef52

28 files changed

Lines changed: 1093 additions & 106 deletions

ietf/doc/templatetags/active_groups_menu.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
@register.simple_tag
99
def active_groups_menu():
10-
parents = GroupTypeName.objects.filter(slug__in=['ag','area','team','dir','program'])
10+
parents = GroupTypeName.objects.filter(slug__in=['ag','area','team','dir','review','program'])
1111
for p in parents:
1212
p.menu_url = '/%s/'%p.slug
1313
return render_to_string('base/menu_active_groups.html', { 'parents': parents })

ietf/doc/tests_review.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ def test_request_review(self):
5252
doc = WgDraftFactory(group__acronym='mars',rev='01')
5353
NewRevisionDocEventFactory(doc=doc,rev='01')
5454
RoleFactory(name_id='chair',person__user__username='marschairman',group=doc.group)
55-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
56-
review_team3 = ReviewTeamFactory(acronym="reviewteam3", name="Review Team3", type_id="dir", list_email="reviewteam3@ietf.org", parent=Group.objects.get(acronym="farfut"))
55+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
56+
review_team3 = ReviewTeamFactory(acronym="reviewteam3", name="Review Team3", type_id="review", list_email="reviewteam3@ietf.org", parent=Group.objects.get(acronym="farfut"))
5757
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
5858
RoleFactory(group=review_team3,person=rev_role.person,name_id='reviewer')
5959
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
@@ -111,7 +111,7 @@ def test_request_review_of_rfc(self):
111111
def test_doc_page(self):
112112

113113
doc = WgDraftFactory(group__acronym='mars',rev='01')
114-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
114+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
115115
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
116116
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
117117

@@ -132,7 +132,7 @@ def test_doc_page(self):
132132

133133
def test_review_request(self):
134134
doc = WgDraftFactory(group__acronym='mars',rev='01')
135-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
135+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
136136
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
137137
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
138138

@@ -145,7 +145,7 @@ def test_review_request(self):
145145

146146
def test_close_request(self):
147147
doc = WgDraftFactory(group__acronym='mars',rev='01')
148-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
148+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
149149
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
150150
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
151151
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
@@ -268,7 +268,7 @@ def get_skip_next(person):
268268

269269
def test_assign_reviewer(self):
270270
doc = WgDraftFactory(pages=2)
271-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
271+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
272272
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',person__name=u'Some Reviewer',name_id='reviewer')
273273
RoleFactory(group=review_team,person__user__username='marschairman',person__name=u'WG Cháir Man',name_id='reviewer')
274274
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
@@ -382,7 +382,7 @@ def test_assign_reviewer(self):
382382
def test_accept_reviewer_assignment(self):
383383

384384
doc = WgDraftFactory(group__acronym='mars',rev='01')
385-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
385+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
386386
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
387387
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='requested',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
388388

@@ -403,7 +403,7 @@ def test_accept_reviewer_assignment(self):
403403

404404
def test_reject_reviewer_assignment(self):
405405
doc = WgDraftFactory(group__acronym='mars',rev='01')
406-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
406+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
407407
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
408408
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
409409
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
@@ -476,7 +476,7 @@ def make_test_mbox_tarball(self, review_req):
476476

477477
def test_search_mail_archive(self):
478478
doc = WgDraftFactory(group__acronym='mars',rev='01')
479-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
479+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
480480
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
481481
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
482482
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
@@ -523,7 +523,7 @@ def test_search_mail_archive(self):
523523
def setup_complete_review_test(self):
524524
doc = WgDraftFactory(group__acronym='mars',rev='01')
525525
NewRevisionDocEventFactory(doc=doc,rev='01')
526-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
526+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
527527
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
528528
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
529529
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
@@ -804,7 +804,7 @@ def test_revise_review_enter_content(self):
804804

805805
def test_edit_comment(self):
806806
doc = WgDraftFactory(group__acronym='mars',rev='01')
807-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
807+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
808808
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
809809
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
810810
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
@@ -825,7 +825,7 @@ def test_edit_comment(self):
825825

826826
def test_edit_deadline(self):
827827
doc = WgDraftFactory(group__acronym='mars',rev='01')
828-
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="dir", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
828+
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
829829
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
830830
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
831831
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))

ietf/doc/views_doc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ def document_main(request, name, rev=None):
572572
latest_rev=latest_rev,
573573
snapshot=snapshot,
574574
can_manage_material=can_manage_material,
575-
in_group_materials_types = doc.group and doc.group.features.has_materials and doc.type_id in doc.group.features.material_types,
575+
in_group_materials_types = doc.group and doc.group.features.has_nonsession_materials and doc.type_id in doc.group.features.material_types,
576576
other_types=other_types,
577577
presentations=presentations,
578578
))

ietf/doc/views_material.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
@login_required
2121
def choose_material_type(request, acronym):
2222
group = get_object_or_404(Group, acronym=acronym)
23-
if not group.features.has_materials:
23+
if not group.features.has_nonsession_materials:
2424
raise Http404
2525

2626
return render(request, 'doc/material/choose_material_type.html', {
@@ -85,7 +85,7 @@ def edit_material(request, name=None, acronym=None, action=None, doc_type=None):
8585

8686
if action == "new":
8787
group = get_object_or_404(Group, acronym=acronym)
88-
if not group.features.has_materials:
88+
if not group.features.has_nonsession_materials:
8989
raise Http404
9090

9191
doc = None
@@ -95,7 +95,8 @@ def edit_material(request, name=None, acronym=None, action=None, doc_type=None):
9595
group = doc.group
9696
document_type = doc.type
9797

98-
if document_type not in DocTypeName.objects.filter(slug__in=group.features.material_types) and document_type.slug not in ['minutes','agenda','bluesheets',]:
98+
if (document_type not in DocTypeName.objects.filter(slug__in=group.features.material_types)
99+
and document_type.slug not in ['minutes','agenda','bluesheets',]):
99100
raise Http404
100101

101102

ietf/group/admin.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.utils.html import escape
1111
from django.utils.translation import ugettext as _
1212

13-
from ietf.group.models import (Group, GroupHistory, GroupEvent, GroupURL, GroupMilestone,
13+
from ietf.group.models import (Group, GroupFeatures, GroupHistory, GroupEvent, GroupURL, GroupMilestone,
1414
GroupMilestoneHistory, GroupStateTransitions, Role, RoleHistory, ChangeStateGroupEvent,
1515
MilestoneGroupEvent, )
1616

@@ -100,6 +100,25 @@ def send_one_reminder(self, request, object_id):
100100

101101
admin.site.register(Group, GroupAdmin)
102102

103+
class GroupFeaturesAdmin(admin.ModelAdmin):
104+
list_display = [
105+
'type',
106+
'customize_workflow',
107+
'has_chartering_process',
108+
'has_default_jabber',
109+
'has_dependencies',
110+
'has_documents',
111+
'has_nonsession_materials',
112+
'has_milestones',
113+
'has_reviews',
114+
'material_types',
115+
'agenda_type',
116+
'admin_roles',
117+
'about_page',
118+
'default_tab',
119+
]
120+
admin.site.register(GroupFeatures, GroupFeaturesAdmin)
121+
103122
class GroupHistoryAdmin(admin.ModelAdmin):
104123
list_display = ["time", "acronym", "name", "type"]
105124
list_display_links = ["acronym", "name"]

ietf/group/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ReviewTeamFactory(factory.DjangoModelFactory):
1919
class Meta:
2020
model = Group
2121

22-
type_id = 'dir'
22+
type_id = 'review'
2323
name = factory.Faker('sentence',nb_words=6)
2424
acronym = factory.Sequence(lambda n: 'acronym%d' %n)
2525
state_id = 'active'

ietf/group/features.py

Lines changed: 0 additions & 46 deletions
This file was deleted.

ietf/group/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
def roles_for_group_type(group_type):
2929
roles = ["chair", "secr", "techadv", "delegate", ]
30-
if group_type == "dir":
30+
if group_type == "review":
3131
roles.append("reviewer")
3232
return roles
3333

0 commit comments

Comments
 (0)