/**
  * Takes post data and prepares it for setting the membership on the group.
  * Adds and removes users to group based on a form's userMembershipData
  * @param $form
  * @param $group
  * @return boolean. True if membership was set successfully.
  */
 public static function setMembershipFromForm($form, $group)
 {
     assert('$group instanceof Group');
     assert('$form instanceof GroupUserMembershipForm');
     $removedUsers = array();
     $addedUsers = array();
     foreach ($group->users as $index => $user) {
         if (empty($form->userMembershipData[$user->id]) && !$user->isSystemUser && !$user->isRootUser) {
             $removedUsers[] = $user;
         }
     }
     foreach ($removedUsers as $user) {
         $group->users->remove($user);
     }
     $users = GroupUserMembershipFormUtil::makeUsersFromUserMembershipData($form->userMembershipData);
     foreach ($users as $user) {
         if (!$group->users->contains($user)) {
             $group->users->add($user);
             $addedUsers[] = $user;
         }
     }
     $group->save();
     foreach ($removedUsers as $user) {
         AllPermissionsOptimizationUtil::userRemovedFromGroup($group, $user);
     }
     foreach ($addedUsers as $user) {
         AllPermissionsOptimizationUtil::userAddedToGroup($group, $user);
     }
     if (!empty($removedUsers)) {
         ReadPermissionsSubscriptionUtil::userRemovedFromGroup();
     }
     if (!empty($addedUsers)) {
         ReadPermissionsSubscriptionUtil::userAddedToGroup();
     }
     return true;
 }