@@ -83,6 +83,7 @@ def default_roles():
8383 attendee = [
8484 Permission .EVENT_VIEW ,
8585 Permission .EVENT_EXHIBITION_CONTACT ,
86+ Permission .EVENT_CHAT_DIRECT ,
8687 ]
8788 viewer = attendee + [Permission .ROOM_VIEW , Permission .ROOM_CHAT_READ ]
8889 participant = viewer + [
@@ -1526,6 +1527,13 @@ def get_all_permissions(self, user):
15261527 event_trait_grants = self ._get_trait_grants_with_defaults ()
15271528 event_roles = self .roles if self .roles is not None else default_roles ()
15281529
1530+ # Track if user has any organizer/admin role
1531+ has_organizer_role = False
1532+ organizer_roles = {'admin' , 'apiuser' , 'scheduleuser' , 'video_stage_manager' ,
1533+ 'video_channel_manager' , 'video_announcement_manager' ,
1534+ 'video_user_viewer' , 'video_user_moderator' , 'video_room_manager' ,
1535+ 'video_kiosk_manager' , 'video_config_manager' }
1536+
15291537 for role , required_traits in event_trait_grants .items ():
15301538 if (
15311539 isinstance (required_traits , list )
@@ -1535,18 +1543,25 @@ def get_all_permissions(self, user):
15351543 )
15361544 and (required_traits or allow_empty_traits )
15371545 ):
1538- role_perms = event_roles .get (role , SYSTEM_ROLES .get (role , []))
1539-
1540- direct_messaging_def = VIDEO_PERMISSION_BY_FIELD .get ('can_video_direct_message' )
1541- if direct_messaging_def and role != 'video_direct_messaging' :
1542- direct_messaging_trait = direct_messaging_def .trait_value (self .slug )
1543- has_direct_messaging_trait = direct_messaging_trait in user .traits
1544-
1545- if not has_direct_messaging_trait :
1546- direct_message_value = Permission .EVENT_CHAT_DIRECT .value
1547- role_perms = [p for p in role_perms if (p if isinstance (p , str ) else p .value ) != direct_message_value ]
1546+ if role in organizer_roles :
1547+ has_organizer_role = True
15481548
1549+ role_perms = event_roles .get (role , SYSTEM_ROLES .get (role , []))
15491550 result [self ].update (role_perms )
1551+
1552+ # If user has organizer/admin role but doesn't have direct messaging trait, remove EVENT_CHAT_DIRECT
1553+ # This ensures organizers only get direct messaging if explicitly granted via team permissions
1554+ # Attendees (without organizer roles) always keep EVENT_CHAT_DIRECT
1555+ if has_organizer_role :
1556+ direct_messaging_def = VIDEO_PERMISSION_BY_FIELD .get ('can_video_direct_message' )
1557+ if direct_messaging_def :
1558+ direct_messaging_trait = direct_messaging_def .trait_value (self .slug )
1559+ traits = user .traits or []
1560+ has_direct_messaging_trait = direct_messaging_trait in traits
1561+
1562+ if not has_direct_messaging_trait :
1563+ direct_message_value = Permission .EVENT_CHAT_DIRECT .value
1564+ result [self ] = {p for p in result [self ] if (p if isinstance (p , str ) else p .value ) != direct_message_value }
15501565
15511566 for room in self .rooms .all ():
15521567 room_trait_grants = room .trait_grants if room .trait_grants is not None else {}
0 commit comments