public function save_permissions(ServiceMediawiki $service, HTTPRequest $request)
 {
     $this->assertUserIsProjectAdmin($service, $request);
     if ($request->isPost()) {
         $project = $request->getProject();
         $new_mapping_list = $this->getSelectedMappingsFromRequest($request, $project);
         $this->mapper->saveMapping($new_mapping_list, $project);
         $this->manager->saveCompatibilityViewOption($project, $request->get('enable_compatibility_view'));
         if (!$this->requestIsRestore($request)) {
             $selected_read_ugroup = $request->get('read_ugroups');
             if ($selected_read_ugroup) {
                 $override_collection = new PermissionsNormalizerOverrideCollection();
                 $normalized_ids = $this->permissions_normalizer->getNormalizedUGroupIds($project, $selected_read_ugroup, $override_collection);
                 if ($this->manager->saveReadAccessControl($project, $normalized_ids)) {
                     $override_collection->emitFeedback(MediawikiManager::READ_ACCESS);
                 }
             }
             $selected_write_ugroup = $request->get('write_ugroups');
             if ($selected_write_ugroup) {
                 $override_collection = new PermissionsNormalizerOverrideCollection();
                 $normalized_ids = $this->permissions_normalizer->getNormalizedUGroupIds($project, $selected_write_ugroup, $override_collection);
                 if ($this->manager->saveWriteAccessControl($project, $normalized_ids)) {
                     $override_collection->emitFeedback(MediawikiManager::WRITE_ACCESS);
                 }
             }
         }
         if ($this->requestIsRestore($request)) {
             $GLOBALS['Response']->addFeedback(Feedback::INFO, $GLOBALS['Language']->getText('plugin_mediawiki', 'options_restored'));
         } else {
             $GLOBALS['Response']->addFeedback(Feedback::INFO, $GLOBALS['Language']->getText('plugin_mediawiki', 'options_saved'));
         }
     }
     $GLOBALS['Response']->redirect(MEDIAWIKI_BASE_URL . '/forge_admin?' . http_build_query(array('group_id' => $request->get('group_id'))));
 }
 /**
  * @param Project $project
  * @param type $object_id
  * @param type $permission_type
  * @param array $ugroup_ids
  *
  * @return PermissionsNormalizerOverrideCollection
  * @throws PermissionDaoException
  */
 public function savePermissions(Project $project, $object_id, $permission_type, array $ugroup_ids)
 {
     $normalizer = new PermissionsNormalizer();
     $override_collection = new PermissionsNormalizerOverrideCollection();
     $normalized_ugroup_ids = $normalizer->getNormalizedUGroupIds($project, $ugroup_ids, $override_collection);
     $cleared = $this->_permission_dao->clearPermission($permission_type, $object_id);
     if (!$cleared) {
         throw new PermissionDaoException("Database issue while clearPermission {$permission_type}, {$object_id}: " . $this->_permission_dao->getDa()->getErrorMessage());
     }
     foreach ($normalized_ugroup_ids as $ugroup_id) {
         $added = $this->_permission_dao->addPermission($permission_type, $object_id, $ugroup_id);
         if (!$added) {
             throw new PermissionDaoException("Database issue while addPermission {$permission_type}, {$object_id}, {$ugroup_id}: " . $this->_permission_dao->getDa()->getErrorMessage());
         }
     }
     $this->_permission_dao->addHistory($project->getID(), $permission_type, $object_id);
     return $override_collection;
 }