def update_room(room, args): acl_entries = args.pop('acl_entries', None) if acl_entries: current = { e.principal: get_unified_permissions(e) for e in room.acl_entries } update_principals_permissions(room, current, acl_entries) _populate_room(room, args) db.session.flush()
def _process(self): roles = {} event_permissions = event_permissions_schema.dump(self.event).get('acl_entries', {}) roles['global'] = self._map_event_to_track_permissions(event_permissions) tracks = Track.query.with_parent(self.event).options(subqueryload('acl_entries')) tracks_by_id = {str(track.id): track for track in tracks} for track in tracks: roles[str(track.id)] = track_permissions_schema.dump(track).get('acl_entries', {}) form = AbstractReviewingRolesForm(event=self.event, obj=FormDefaults(roles=roles)) if form.validate_on_submit(): role_data = form.data['roles'] # Update global permissions global_conveners = [] global_reviewers = [] global_roles = role_data.pop('global') for identifier, permissions in global_roles: principal = principal_from_identifier(identifier, allow_groups=True, allow_event_roles=True, event_id=self.event.id) if 'convene' in permissions: global_conveners.append(principal) if 'review' in permissions: global_reviewers.append(principal) update_object_principals(self.event, global_conveners, permission='convene_all_abstracts') update_object_principals(self.event, global_reviewers, permission='review_all_abstracts') # Update track specific permissions track_conveners = [] track_reviewers = [] for (track_id, track_roles) in role_data.items(): acl_entries = {} for identifier, permissions in track_roles: principal = principal_from_identifier(identifier, allow_groups=True, allow_event_roles=True, event_id=self.event.id) acl_entries[principal] = set(permissions) if 'convene' in permissions: track_conveners.append(principal) if 'review' in permissions: track_reviewers.append(principal) track = tracks_by_id[track_id] current = {e.principal: get_unified_permissions(e) for e in track.acl_entries} update_principals_permissions(track, current, acl_entries) # Update event ACL for track and global permissions all_conveners = set(global_conveners + track_conveners) all_reviewers = set(global_reviewers + track_reviewers) update_object_principals(self.event, all_conveners, permission='track_convener') update_object_principals(self.event, all_reviewers, permission='abstract_reviewer') flash(_("Abstract reviewing roles have been updated."), 'success') logger.info("Abstract reviewing roles of %s have been updated by %s", self.event, session.user) return jsonify_data() return jsonify_form(form, skip_labels=True, form_header_kwargs={'id': 'reviewing-role-form'}, disabled_until_change=False)