7777 ChangeStateGroupEvent , GroupFeatures )
7878from ietf .group .utils import (get_charter_text , can_manage_all_groups_of_type ,
7979 milestone_reviewer_for_group_type , can_provide_status_update ,
80- can_manage_materials ,
80+ can_manage_materials , group_attribute_change_desc ,
8181 construct_group_menu_context , get_group_materials ,
82- save_group_in_history , can_manage_group ,
82+ save_group_in_history , can_manage_group , update_role_set ,
8383 get_group_or_404 , setup_default_community_list_for_group , )
8484#
8585from ietf .ietfauth .utils import has_role , is_authorized_in_group
@@ -873,13 +873,6 @@ def group_photos(request, group_type=None, acronym=None):
873873def edit (request , group_type = None , acronym = None , action = "edit" , field = None ):
874874 """Edit or create a group, notifying parties as
875875 necessary and logging changes as group events."""
876- def desc (attr , new , old ):
877- entry = "%(attr)s changed to <b>%(new)s</b> from %(old)s"
878- if new_group :
879- entry = "%(attr)s changed to <b>%(new)s</b>"
880-
881- return entry % dict (attr = attr , new = new , old = old )
882-
883876 def format_resources (resources , fs = "\n " ):
884877 res = []
885878 for r in resources :
@@ -896,7 +889,11 @@ def diff(attr, name):
896889 return
897890 v = getattr (group , attr )
898891 if clean [attr ] != v :
899- changes .append ((attr , clean [attr ], desc (name , clean [attr ], v )))
892+ changes .append ((
893+ attr ,
894+ clean [attr ],
895+ group_attribute_change_desc (name , clean [attr ], v if v else None )
896+ ))
900897 setattr (group , attr , clean [attr ])
901898
902899 if action == "edit" :
@@ -972,47 +969,33 @@ def diff(attr, name):
972969
973970 title = f .label
974971
975- new = clean [attr ]
976- old = Email .objects .filter (role__group = group , role__name = slug ).select_related ("person" )
977- if set (new ) != set (old ):
978- changes .append ((attr , new , desc (title ,
979- ", " .join (sorted (x .get_name () for x in new )),
980- ", " .join (sorted (x .get_name () for x in old )))))
981- group .role_set .filter (name = slug ).delete ()
982- for e in new :
983- Role .objects .get_or_create (name_id = slug , email = e , group = group , person = e .person )
984- if not e .origin or (e .person .user and e .origin == e .person .user .username ):
985- e .origin = "role: %s %s" % (group .acronym , slug )
986- e .save ()
987-
988- added = set (new ) - set (old )
989- deleted = set (old ) - set (new )
990- if added :
991- change_text = title + ' added: ' + ", " .join (x .name_and_email () for x in added )
992- personnel_change_text += change_text + "\n "
993- if deleted :
994- change_text = title + ' deleted: ' + ", " .join (x .name_and_email () for x in deleted )
995- personnel_change_text += change_text + "\n "
996-
997- today = datetime .date .today ()
998- for deleted_email in deleted :
999- # Verify the person doesn't have a separate reviewer role for the group with a different address
1000- if not group .role_set .filter (name_id = 'reviewer' ,person = deleted_email .person ).exists ():
1001- active_assignments = ReviewAssignment .objects .filter (
1002- review_request__team = group ,
1003- reviewer__person = deleted_email .person ,
1004- state_id__in = ['accepted' , 'assigned' ],
1005- )
1006- for assignment in active_assignments :
1007- if assignment .review_request .deadline > today :
1008- assignment .state_id = 'withdrawn'
1009- else :
1010- assignment .state_id = 'no-response'
1011- # save() will update review_request state to 'requested'
1012- # if needed, so that the review can be assigned to someone else
1013- assignment .save ()
1014-
1015- changed_personnel .update (set (old )^ set (new ))
972+ added , deleted = update_role_set (group , slug , clean [attr ], request .user .person )
973+ changed_personnel .update (added | deleted )
974+ if added :
975+ change_text = title + ' added: ' + ", " .join (x .name_and_email () for x in added )
976+ personnel_change_text += change_text + "\n "
977+ if deleted :
978+ change_text = title + ' deleted: ' + ", " .join (x .name_and_email () for x in deleted )
979+ personnel_change_text += change_text + "\n "
980+
981+ today = datetime .date .today ()
982+ for deleted_email in deleted :
983+ # Verify the person doesn't have a separate reviewer role for the group with a different address
984+ if not group .role_set .filter (name_id = 'reviewer' ,person = deleted_email .person ).exists ():
985+ active_assignments = ReviewAssignment .objects .filter (
986+ review_request__team = group ,
987+ reviewer__person = deleted_email .person ,
988+ state_id__in = ['accepted' , 'assigned' ],
989+ )
990+ for assignment in active_assignments :
991+ if assignment .review_request .deadline > today :
992+ assignment .state_id = 'withdrawn'
993+ else :
994+ assignment .state_id = 'no-response'
995+ # save() will update review_request state to 'requested'
996+ # if needed, so that the review can be assigned to someone else
997+ assignment .save ()
998+
1016999
10171000 if personnel_change_text != "" :
10181001 changed_personnel = [ str (p ) for p in changed_personnel ]
@@ -1030,7 +1013,15 @@ def diff(attr, name):
10301013 value = parts [1 ]
10311014 display_name = ' ' .join (parts [2 :]).strip ('()' )
10321015 group .groupextresource_set .create (value = value , name_id = name , display_name = display_name )
1033- changes .append (('resources' , new_resources , desc ('Resources' , ", " .join (new_resources ), ", " .join (old_resources ))))
1016+ changes .append ((
1017+ 'resources' ,
1018+ new_resources ,
1019+ group_attribute_change_desc (
1020+ 'Resources' ,
1021+ ", " .join (new_resources ),
1022+ ", " .join (old_resources ) if old_resources else None
1023+ )
1024+ ))
10341025
10351026 group .time = datetime .datetime .now ()
10361027
0 commit comments