@@ -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 + [
@@ -1532,6 +1533,13 @@ def get_all_permissions(self, user):
15321533 event_trait_grants = self ._get_trait_grants_with_defaults ()
15331534 event_roles = self .roles if self .roles is not None else default_roles ()
15341535
1536+ # Track if user has any organizer/admin role
1537+ has_organizer_role = False
1538+ organizer_roles = {'admin' , 'apiuser' , 'scheduleuser' , 'video_stage_manager' ,
1539+ 'video_channel_manager' , 'video_announcement_manager' ,
1540+ 'video_user_viewer' , 'video_user_moderator' , 'video_room_manager' ,
1541+ 'video_kiosk_manager' , 'video_config_manager' }
1542+
15351543 for role , required_traits in event_trait_grants .items ():
15361544 if (
15371545 isinstance (required_traits , list )
@@ -1541,18 +1549,25 @@ def get_all_permissions(self, user):
15411549 )
15421550 and (required_traits or allow_empty_traits )
15431551 ):
1544- role_perms = event_roles .get (role , SYSTEM_ROLES .get (role , []))
1545-
1546- direct_messaging_def = VIDEO_PERMISSION_BY_FIELD .get ('can_video_direct_message' )
1547- if direct_messaging_def and role != 'video_direct_messaging' :
1548- direct_messaging_trait = direct_messaging_def .trait_value (self .slug )
1549- has_direct_messaging_trait = direct_messaging_trait in user .traits
1550-
1551- if not has_direct_messaging_trait :
1552- direct_message_value = Permission .EVENT_CHAT_DIRECT .value
1553- role_perms = [p for p in role_perms if (p if isinstance (p , str ) else p .value ) != direct_message_value ]
1552+ if role in organizer_roles :
1553+ has_organizer_role = True
15541554
1555+ role_perms = event_roles .get (role , SYSTEM_ROLES .get (role , []))
15551556 result [self ].update (role_perms )
1557+
1558+ # If user has organizer/admin role but doesn't have direct messaging trait, remove EVENT_CHAT_DIRECT
1559+ # This ensures organizers only get direct messaging if explicitly granted via team permissions
1560+ # Attendees (without organizer roles) always keep EVENT_CHAT_DIRECT
1561+ if has_organizer_role :
1562+ direct_messaging_def = VIDEO_PERMISSION_BY_FIELD .get ('can_video_direct_message' )
1563+ if direct_messaging_def :
1564+ direct_messaging_trait = direct_messaging_def .trait_value (self .slug )
1565+ traits = user .traits or []
1566+ has_direct_messaging_trait = direct_messaging_trait in traits
1567+
1568+ if not has_direct_messaging_trait :
1569+ direct_message_value = Permission .EVENT_CHAT_DIRECT .value
1570+ result [self ] = {p for p in result [self ] if (p if isinstance (p , str ) else p .value ) != direct_message_value }
15561571
15571572 for room in self .rooms .all ():
15581573 room_trait_grants = room .trait_grants if room .trait_grants is not None else {}
0 commit comments