function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
mintotsai@dev.jasminemintotsai@dev.jasmine 

Activity field level security reseting when using metadata api

When updating field level security for Activity fields for a profile using the Metadata api (from Rails Metaforce Gem), I am seeing the resetting of field level security for other fields.

For example, in the following code, when Activity.What is done, the Activity.Who is reset to not Visible.

MetadataUtils.admin_profile_field_permissions(metadataClient, 'Activity.'+'Who')
MetadataUtils.admin_profile_field_permissions(metadataClient, 'Activity.'+'What')

Here is the method for updating field level security,

def self.admin_profile_field_permissions(metadataClient, field)
    puts 'Field Permission: '+field
    metadataResponse = metadataClient.update_metadata(:profile, :fieldPermissions => [:field => field, :editable => true, :readable => true], :fullName => 'Admin')
    puts 'Success=' + metadataResponse.success.to_s
end

The problem is only happening for the Activity object. 
mintotsai@dev.jasminemintotsai@dev.jasmine
This is still happening. The same behavior happens with the Apex Metadata Api developed by FinancialForce (). There must be a bug in the Salesforce platform in how it's handling this. 

Here is the code using the Apex Metadata Api:
 
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();

MetadataService.Profile admin = new MetadataService.Profile();
admin.fullName = 'Admin';
admin.custom = false;

MetadataService.ProfileFieldLevelSecurity fieldSec = new MetadataService.ProfileFieldLevelSecurity();
fieldSec.field='Activity.'+fieldName;
fieldSec.editable=true;
fieldSec.readable=true;
admin.fieldPermissions  = new MetadataService.ProfileFieldLevelSecurity[] {fieldSec} ;
List<MetadataService.SaveResult> results =
     service.updateMetadata( new MetadataService.Metadata[] { admin });

Could someone from Salesforce look at this?