1111# Django imports
1212from django import forms
1313from django .utils .html import mark_safe # type:ignore
14+ from django .db .models import F
1415
1516# IETF imports
16- from ietf .group .models import Group , GroupHistory , GroupStateName
17- from ietf .name .models import ReviewTypeName
17+ from ietf .group .models import Group , GroupHistory , GroupStateName , GroupFeatures
18+ from ietf .name .models import ReviewTypeName , RoleName
1819from ietf .person .fields import SearchableEmailsField , PersonEmailChoiceField
19- from ietf .person .models import Person
20+ from ietf .person .models import Person , Email
2021from ietf .review .models import ReviewerSettings , UnavailablePeriod , ReviewSecretarySettings
2122from ietf .review .policies import get_reviewer_queue_policy
2223from ietf .review .utils import close_review_request_states
2324from ietf .utils .textupload import get_cleaned_text_file_content
24- from ietf .utils .text import strip_suffix
2525#from ietf.utils.ordereddict import insert_after_in_ordered_dict
2626from ietf .utils .fields import DatepickerDateField , MultiEmailField
2727
2828# --- Constants --------------------------------------------------------
2929
3030MAX_GROUP_DELEGATES = 3
3131
32- # --- Utility Functions ------------------------------------------------
33-
34- def roles_for_group_type (group_type ):
35- roles = ["chair" , "secr" , "techadv" , "delegate" , ]
36- if group_type == "review" :
37- roles .append ("reviewer" )
38- return roles
39-
4032# --- Forms ------------------------------------------------------------
4133
4234class StatusUpdateForm (forms .Form ):
@@ -65,14 +57,7 @@ class GroupForm(forms.Form):
6557 name = forms .CharField (max_length = 80 , label = "Name" , required = True )
6658 acronym = forms .CharField (max_length = 40 , label = "Acronym" , required = True )
6759 state = forms .ModelChoiceField (GroupStateName .objects .all (), label = "State" , required = True )
68-
69- # roles
70- chair_roles = SearchableEmailsField (label = "Chairs" , required = False , only_users = True )
71- secr_roles = SearchableEmailsField (label = "Secretaries" , required = False , only_users = True )
72- techadv_roles = SearchableEmailsField (label = "Technical Advisors" , required = False , only_users = True )
73- delegate_roles = SearchableEmailsField (label = "Delegates" , required = False , only_users = True , max_entries = MAX_GROUP_DELEGATES ,
74- help_text = mark_safe ("Chairs can delegate the authority to update the state of group documents - at most %s persons at a given time." % MAX_GROUP_DELEGATES ))
75- reviewer_roles = SearchableEmailsField (label = "Reviewers" , required = False , only_users = True )
60+ # Note that __init__ will add role fields here
7661 ad = forms .ModelChoiceField (Person .objects .filter (role__name = "ad" , role__group__state = "active" , role__group__type = 'area' ).order_by ('name' ), label = "Shepherding AD" , empty_label = "(None)" , required = False )
7762
7863 parent = forms .ModelChoiceField (Group .objects .filter (state = "active" ).order_by ('name' ), empty_label = "(None)" , required = False )
@@ -85,16 +70,39 @@ class GroupForm(forms.Form):
8570 def __init__ (self , * args , ** kwargs ):
8671 self .group = kwargs .pop ('group' , None )
8772 self .group_type = kwargs .pop ('group_type' , False )
73+ if self .group :
74+ self .used_roles = self .group .used_roles or self .group .features .default_used_roles
75+ else :
76+ self .used_roles = GroupFeatures .objects .get (type = self .group_type ).default_used_roles
8877 if "field" in kwargs :
8978 field = kwargs ["field" ]
9079 del kwargs ["field" ]
91- if field in roles_for_group_type ( self .group_type ) :
80+ if field in self .used_roles :
9281 field = field + "_roles"
9382 else :
9483 field = None
9584
9685 super (self .__class__ , self ).__init__ (* args , ** kwargs )
9786
87+ for role_slug in self .used_roles :
88+ role_name = RoleName .objects .get (slug = role_slug )
89+ fieldname = '%s_roles' % role_slug
90+ field_args = {
91+ 'label' : role_name .name ,
92+ 'required' : False ,
93+ 'only_users' : True ,
94+ }
95+ if fieldname == 'delegate_roles' :
96+ field_args ['max_entries' ] = MAX_GROUP_DELEGATES
97+ field_args ['help_text' ] = mark_safe ("Chairs can delegate the authority to update the state of group documents - at most %s persons at a given time." % MAX_GROUP_DELEGATES )
98+ self .fields [fieldname ] = SearchableEmailsField (** field_args )
99+ self .fields [fieldname ].initial = Email .objects .filter (person__role__name_id = role_slug ,person__role__group = self .group ,person__role__email__pk = F ('pk' )).distinct ()
100+
101+ self .adjusted_field_order = ['name' ,'acronym' ,'state' ]
102+ for role_slug in self .used_roles :
103+ self .adjusted_field_order .append ('%s_roles' % role_slug )
104+ self .order_fields (self .adjusted_field_order )
105+
98106 if self .group_type == "rg" :
99107 self .fields ["state" ].queryset = self .fields ["state" ].queryset .exclude (slug__in = ("bof" , "bof-conc" ))
100108
@@ -116,10 +124,6 @@ def __init__(self, *args, **kwargs):
116124 self .fields ['parent' ].queryset = self .fields ['parent' ].queryset .filter (type = "area" )
117125 self .fields ['parent' ].label = "IETF Area"
118126
119- role_fields_to_remove = (set (strip_suffix (attr , "_roles" ) for attr in self .fields if attr .endswith ("_roles" ))
120- - set (roles_for_group_type (self .group_type )))
121- for r in role_fields_to_remove :
122- del self .fields [r + "_roles" ]
123127 if field :
124128 keys = list (self .fields .keys ())
125129 for f in keys :
0 commit comments