app/libraries/ProjectUtilities.php (271 lines of code) (raw):

<?php use Airavata\API\Error\AiravataClientException; use Airavata\API\Error\AiravataSystemException; use Airavata\API\Error\InvalidRequestException; use Airavata\Facades\Airavata; use Airavata\Model\Workspace\Project; use Airavata\Model\Group\ResourcePermissionType; class ProjectUtilities { /** * Get all projects owned by the given user * @param $username * @return null */ public static function get_all_user_projects($gatewayId, $username) { $userProjects = null; try { $userProjects = Airavata::getUserProjects(Session::get('authz-token'), $gatewayId, $username, -1, 0); // Add a optionLabel that disambiguates shared projects foreach ($userProjects as $project) { $optionLabel = $project->name; if ($project->owner != Session::get('username')) { $optionLabel = $optionLabel . ' (owned by ' . $project->owner . ')'; } $project->optionLabel = $optionLabel; } //var_dump( $userProjects); exit; } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('<p>There was a problem getting the user\'s projects. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>'); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('<p>There was a problem getting the user\'s projects. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>'); } catch (AiravataSystemException $ase) { if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR { CommonUtilities::print_warning_message('<p>You must create a project before you can create an experiment. Click <a href="' . URL::to('/') . '/project/create">here</a> to create a project.</p>'); } else { CommonUtilities::print_error_message('<p>There was a problem getting the user\'s projects. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>'); } } return $userProjects; } public static function get_all_user_writeable_projects($gatewayId, $username) { $writeableProjects = array(); $userProjects = ProjectUtilities::get_all_user_projects($gatewayId, $username); if (Config::get('pga_config.airavata')["data-sharing-enabled"]){ foreach($userProjects as $project) { if (SharingUtilities::userCanWrite($username, $project->projectID)) { $writeableProjects[] = $project; } } } else { $writeableProjects = $userProjects; } return $writeableProjects; } /** * Get the project with the given ID * @param $projectId * @return null */ public static function get_project($projectId) { try { return Airavata::getProject(Session::get('authz-token'), $projectId); } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('<p>There was a problem getting the project. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>'); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('<p>There was a problem getting the project. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>AiravataClientException: ' . $ace->getMessage() . '</p>'); } catch (AiravataSystemException $ase) { CommonUtilities::print_error_message('<p>There was a problem getting the project. Please try again later or submit a bug report using the link in the Help menu.</p>' . '<p>AiravataSystemException!<br><br>' . $ase->getMessage() . '</p>'); } } /** * Create a select input and populate it with project options from the database */ public static function create_project_select($projectId = null, $editable = true) { $editable ? $disabled = '' : $disabled = 'disabled'; if ($editable) { // this should only return projects the user can write $userProjects = ProjectUtilities::get_all_user_writeable_projects(Session::get("gateway_id"), Session::get('username')); } else { $userProjects = ProjectUtilities::get_all_user_projects(Session::get("gateway_id"), Session::get('username')); } echo '<select class="form-control" name="project" id="project" required ' . $disabled . '>'; if (sizeof($userProjects) > 0) { foreach ($userProjects as $project) { if ($project->projectID == $projectId) { $selected = 'selected'; } else { $selected = ''; } echo '<option value="' . htmlspecialchars($project->projectID) . '" ' . $selected . '>' . htmlspecialchars($project->optionLabel) . '</option>'; } } echo '</select>'; } //moved from create project view. public static function create_project() { $project = new Project(); $project->owner = Session::get('username'); $project->name = $_POST['project-name']; $project->description = $_POST['project-description']; $project->gatewayId = Config::get('pga_config.airavata')['gateway-id']; $projectId = null; try { $projectId = Airavata::createProject(Session::get('authz-token'), Config::get('pga_config.airavata')['gateway-id'], $project); if ($projectId) { CommonUtilities::print_success_message("<p>Project " . htmlspecialchars($_POST['project-name']) . " created!</p>" . '<p>You will be redirected to the summary page shortly, or you can <a href="project/summary?projId=' . urlencode($projectId) . '">go directly</a> to the project summary page.</p>'); } else { CommonUtilities::print_error_message("Error creating project ". htmlspecialchars($_POST['project-name']) . "!"); } } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage()); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage()); } catch (AiravataSystemException $ase) { CommonUtilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage()); } if (Config::get('pga_config.airavata')["data-sharing-enabled"]){ $share = $_POST['share-settings']; ProjectUtilities::share_project($projectId, json_decode($share)); } return $projectId; } public static function create_default_project($username) { $project = new Project(); $project->owner = $username; $project->name = "Default Project"; $project->gatewayId = Config::get('pga_config.airavata')['gateway-id']; $project->description = "This is the default project for user " . $project->owner; $projectId = null; try { $projectId = Airavata::createProject(Session::get('authz-token'), Config::get('pga_config.airavata')['gateway-id'], $project); if (Config::get('pga_config.airavata')["data-sharing-enabled"]){ $share = new stdClass(); $share->{$username} = new stdClass(); $share->{$username}->read = true; $share->{$username}->write = true; ProjectUtilities::share_project($projectId, $share); } } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage()); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage()); } catch (AiravataSystemException $ase) { CommonUtilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage()); } return $projectId; } /** * Get experiments in project * @param $projectId * @return array|null */ public static function get_experiments_in_project($projectId) { $experiments = array(); try { $experiments = Airavata::getExperimentsInProject(Session::get('authz-token'), $projectId, -1, 0); } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage()); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage()); } catch (AiravataSystemException $ase) { CommonUtilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage()); } catch (TTransportException $tte) { CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage()); } for($i = 0; $i < count($experiments); $i++) { if (!SharingUtilities::userCanRead(Session::get("username"), $experiments[$i]->experimentId)) { array_splice($experiments, $i, 1); } } return $experiments; } public static function update_project($projectId, $projectDetails) { $updatedProject = new Project(); $updatedProject->owner = $projectDetails->owner; $updatedProject->name = $projectDetails->name; $updatedProject->description = $projectDetails->description; $updatedProject->gatewayId = Config::get('pga_config.airavata')['gateway-id']; Airavata::updateProject(Session::get('authz-token'), $projectId, $updatedProject); if (Config::get('pga_config.airavata')["data-sharing-enabled"] && array_key_exists('share-settings', $_POST)){ $share = $_POST['share-settings']; ProjectUtilities::share_project($projectId, json_decode($share)); } } public static function get_all_user_accessible_projects_with_pagination($limit, $offset) { $projects = array(); try { $projects = $projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"), Session::get("username"), [], $limit, $offset); } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage()); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage()); } catch (AiravataSystemException $ase) { if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR { CommonUtilities::print_info_message('<p>You have not created any projects yet, so no results will be returned!</p> <p>Click <a href="create_project.php">here</a> to create a new project.</p>'); } else { CommonUtilities::print_error_message('There was a problem with Airavata. Please try again later, or report a bug using the link in the Help menu.'); //print_error_message('AiravataSystemException!<br><br>' . $ase->airavataErrorType . ': ' . $ase->getMessage()); } } catch (TTransportException $tte) { CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage()); } return $projects; } public static function get_proj_search_results_with_pagination($searchKey, $searchValue, $limit, $offset) { $projects = array(); try { switch ($searchKey) { case 'project-name': $filters[\Airavata\Model\Experiment\ProjectSearchFields::PROJECT_NAME] = $searchValue; $projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"), Session::get("username"), $filters, $limit, $offset); break; case 'project-description': $filters[\Airavata\Model\Experiment\ProjectSearchFields::PROJECT_DESCRIPTION] = $searchValue; $projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"), Session::get("username"), $filters, $limit, $offset); break; } } catch (InvalidRequestException $ire) { CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage()); } catch (AiravataClientException $ace) { CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage()); } catch (AiravataSystemException $ase) { if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR { CommonUtilities::print_info_message('<p>You have not created any projects yet, so no results will be returned!</p> <p>Click <a href="create_project.php">here</a> to create a new project.</p>'); } else { CommonUtilities::print_error_message('There was a problem with Airavata. Please try again later, or report a bug using the link in the Help menu.'); //print_error_message('AiravataSystemException!<br><br>' . $ase->airavataErrorType . ': ' . $ase->getMessage()); } } catch (TTransportException $tte) { CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage()); } return $projects; } /** * Set sharing settings for a given project. * @param projectId * @param $users A map of username => {read_permission, write_permission} */ private static function share_project($projectId, $users) { $project = Airavata::getProject(Session::get("authz-token"), $projectId); $users->{$project->owner} = new stdClass(); $users->{$project->owner}->read = true; $users->{$project->owner}->write = true; $wadd = array(); $wrevoke = array(); $radd = array(); $rrevoke = array(); foreach ($users as $user => $perms) { if ($perms->write) { $wadd[$user] = ResourcePermissionType::WRITE; } else { $wrevoke[$user] = ResourcePermissionType::WRITE; } if ($perms->read) { $radd[$user] = ResourcePermissionType::READ; } else { $rrevoke[$user] = ResourcePermissionType::READ; } } GrouperUtilities::shareResourceWithUsers($projectId, $wadd); GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $wrevoke); GrouperUtilities::shareResourceWithUsers($projectId, $radd); GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $rrevoke); } }