Hello,
I believed I had solved my permissions issue earlier in this thread:
Unique Permissions per Document in Document Folder in Document Library set via JavaScript
And I got most of it done, yet I'm having trouble with it removing and resetting rights. It appears to remove the users from the file lists every time. It has success on setting the ReadOnly rights to everyone for the files that are in the list returned by the CamlQuery. It doesn't seem to always set the rights for the all the requested users each time. Some get the contribute rights set to their user name/loginName, yet sometimes it skips the users in the memberList. Luckily it doesn't add users that were not requested. :o)
Here are my code snippets:
Function to initiate changes of file permissions
function assignPermissionsToFiles() { var siteurl = _spPageContextInfo.webServerRelativeUrl; var planName = selectedFile.Title; var listTitle = "_plPlanLibrary"; SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { var clientContext = new SP.ClientContext(siteurl); var roleAssignments = clientContext.get_web().get_roleAssignments(); var lists = clientContext.get_web().get_lists(); var docLibrary = lists.getByTitle(listTitle); var camlQuery = new SP.CamlQuery(); camlQuery.set_viewXML('<View Scope="RecursiveAll">' + '<Query>' + '<Where>' + '<Contains>' + '<FieldRef Name="FileDirRef" />' + '<Value Type="Text">' + planName + '</Value>' + '</Contains>' + '</Where>' + '</Query>' + '</View>'); var fileList = docLibrary.getItems(camlQuery); clientContext.load(fileList); clientContext.executeQueryAsync( function (sender, args) { //success function var listEnumerator = fileList.getEnumerator(); var fileRemoveCallbacks = []; //remove old user assignments and assign new while (listEnumerator.moveNext()) { var fileItem = listEnumerator.get_current(); fileRemoveCallbacks.push(removeFileRights(clientContext, fileItem)); } $.when.apply($, fileRemoveCallbacks).done(function() { console.info('file removal callbacks done.'); }) }, function (sender, args) { //error function console.info('file List Request failed for ' + fileName); console.info('Message:'); console.info(args.get_message()); console.info('stackTrace:'); console.info(args.get_stackTrace()); } ); }); // SP.SOD. end for clientContext of file list retrieval }
Function to remove rights from files:
function removeFileRights(context, fileItem) { var defRemoveRights = $.Deferred(); var fileReadOnlyCallbacks = []; fileItem.breakRoleInheritance(true); var fileId = fileItem.get_item('ID'); var fileName = fileItem.get_item('FileLeafRef'); console.info('remove rights fileName: ' + fileName); for (var memberCount = 0; memberCount < oldMemberList.length; memberCount++) { var memberId = oldMemberList[memberCount].Id; var memberTitle = oldMemberList[memberCount].Title; fileItem.get_roleAssignments().getByPrincipalId(memberId).deleteObject(); context.load(fileItem); context.executeQueryAsync( function(sender, args) { // on Success userRemoved(memberTitle, fileName); defRemoveRights.resolve(); }, function(sender, args) { // on Fail userRemoveFailed(sender, args); } ); } // end for loop removal of existing members fileReadOnlyCallbacks.push(assignReadOnlyRights(context, fileItem)); $.when.apply($, fileReadOnlyCallbacks).done(function() { console.info('file readonly callbacks done'); }); return defRemoveRights.promise(); }
function userRemoved(memberTitle, fileName) {
console.info('remove user, ' + memberTitle + ' from ' fileName.');
}function userRemoveFailed(sender, args) {
console.info('userRemoveFailed Message:');
console.info(args.get_message());
console.info('stackTrace:');
console.info(args.get_stackTrace());
}
Function to set read only rights to everyone:
function assignReadOnlyRights (context, fileItem) {
var defReadOnly = $.Deferred();
var fileAssignmentCallbacks = [];
var fileName = fileItem.get_item('FileLeafRef');
console.info('readonly right fileName: ' + fileName);
// set ReadOnly to all files for Everyone
var allUserObj = context.get_web().ensureUser("c:0(.s|true");
var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(context);
collRoleDefinitionBinding.add(context.get_web().get_roleDefinitions().getByType(SP.RoleType.reader));
fileItem.get_roleAssignments().add(allUserObj, collRoleDefintionBinding)
context.load(allUserObj);
context.load(fileItem);
context.executeQueryAsync(
function() { // on Success
readOnlySet(fileName);
defReadOnly.resolve();
},
function(sender, args) { // on Fail
readOnlySetFailed(sender, args)
}
);
fileAssignmentCallback.push(assignFileRights(context, fileItem));
$.when.apply($, fileAssignmentCallbacks).done { function() {
console.info('file assignment callbacks done');
});
return defReadOnly.promise();
}
function readOnlySet(fileName) {
console.info('Role set to ReadOnly for item' +
fileName +
' and new role assignment for Everyone');
}
function readOnlySetFailed(sender, args) { // error function
console.info('readOnlySet Message:');
console.info(args.get_message());
console.info('stackTrace:');
console.info(args.get_stackTrace());
}Function to set individual users' permissions to contribute
function assignFileRights(context, fileItem) {
var defFileRights = $.Deferred();
var fileId = fileItem.get_item('ID');
var fileName = fileItem.get_item('FileLeafRef');
console.info('assign rights fileName:' + fileName);
for (var plannerIdCount = 0; plannerIdCount < memberList.length; plannerIdCount++) {
var plannerId = memberList[plannerIdCount].Id;
var plannerTitle = memberList[plannerIdCount].Title;
var plannerLoginName = memberList[plannerIdCount].Name;
var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(context);
collRoleDefintionBinding.add(context.get_web().get_roleDefinitions().getByType(SP.RoleType.contributor));
var userObj = context.get_web().ensureUser(plannerLoginName);
fileItem.getRoleAssignments().add(userObj, collReoleDefinitionBinding);
context.load(userObj);
context.load(fileItem);
context.executeQueryAsync(
function() { // on Success
contributeSet(fileName, plannerTitle);
defFileRights.resolve();
},
function(sender, args) { // on Fail
contributeSetFailed(sender, args);
}
);
} // end for loop of file Contribute rights allocation
defFileRights.promise();
}
function contributeSet(fileName, plannerTitle) {
console.info('Contribute Role for item ' +
fileName +
' assignment for ' +
plannerTitle);
}
function contributeSetFailed(sender, args) {
console.info('contributeSetFailed Message:');
console.info(args.get_message());
console.info('stackTrace:');
console.info(args.get_stackTrace());
}Any ideas for getting the file assignment working consistently.
Thank You