/** * Add sidebars to project overview page * * @param array $sidebars * @param Project $project * @param User $user * @return null */ function system_handle_on_project_overview_sidebars(&$sidebars, &$project, &$user) { // only project leader, system administrators and project manages can see last activity $can_see_last_activity = $user->isProjectLeader($project) || $user->isAdministrator() || $user->isProjectManager(); $project_users = $project->getUsers(); if (is_foreachable($project_users)) { $smarty =& Smarty::instance(); require_once SYSTEM_MODULE_PATH . '/helpers/function.user_link.php'; require_once SMARTY_PATH . '/plugins/modifier.ago.php'; $output = ''; $sorted_users = Users::groupByCompany($project_users); foreach ($sorted_users as $sorted_user) { $company = $sorted_user['company']; $users = $sorted_user['users']; if (is_foreachable($users)) { $output .= '<h3><a href="' . $company->getViewUrl() . '">' . clean($company->getName()) . '</a></h3>'; $output .= '<ul class="company_users">'; foreach ($users as $current_user) { $last_seen = ''; if ($can_see_last_activity && $user->getId() != $current_user->getId()) { $last_seen = smarty_modifier_ago($current_user->getLastActivityOn()); } // if $output .= '<li><span class="icon_holder"><img src="' . $current_user->getAvatarUrl() . '" /></span> ' . smarty_function_user_link(array('user' => $current_user), $smarty) . ' ' . $last_seen . '</li>'; } // foreach $output .= '</ul>'; } // if } // foreach $sidebars[] = array('label' => lang('People on This Project'), 'is_important' => false, 'id' => 'project_people', 'body' => $output); } // if }
/** * Handle on project options event * * @param NamedList $options * @param Project $project * @param User $user * @return null */ function project_exporter_handle_on_project_options(&$options, $project, $user) { if ($user->isAdministrator() || $user->isProjectLeader($project) || $user->isProjectManager()) { $options->add('export_project', array('url' => assemble_url('project_exporter', array('project_id' => $project->getId())), 'text' => lang('Export Project'))); } // }
/** * Return all groups ordered by name * * This function will return only groups visible to given user * * If $return_all is set to true all groups will be loaded and returned. * This is used in situations where we need all of them regardels of user * previous assignments (like select project group helper) * * @param User $user * @param boolean $return_all * @return array */ function findAll($user, $return_all = false) { if ($return_all || $user->isAdministrator() || $user->isProjectManager()) { return ProjectGroups::find(array('order' => 'name')); } // if $project_ids = Projects::findProjectIdsByUser($user); if (is_foreachable($project_ids)) { $projects_table = TABLE_PREFIX . 'projects'; $project_groups_table = TABLE_PREFIX . 'project_groups'; return ProjectGroups::findBySQL("SELECT DISTINCT {$project_groups_table}.* FROM {$projects_table}, {$project_groups_table} WHERE {$project_groups_table}.id = {$projects_table}.group_id AND {$projects_table}.id IN (?) ORDER BY {$project_groups_table}.name", array($project_ids)); } else { return null; } // if }
/** * Return true if $user can delete this group * * @param User $user * @return boolean */ function canDelete($user) { return ($user->isProjectManager() || $user->isAdministrator()) && $this->getProjectsCount() == 0 && ProjectGroups::count() > 1; }
/** * Paginate trashed objects * * @param User $user * @param integer $page * @param integer $per_page * @return null */ function paginateTrashed($user, $page = 1, $per_page = 30) { if ($user->isAdministrator() || $user->isProjectManager()) { return ProjectObjects::paginate(array('conditions' => array("state = ? AND visibility >= ?", STATE_DELETED, $user->getVisibility()), 'order' => 'updated_on'), $page, $per_page); } else { $type_filter = ProjectUsers::getVisibleTypesFilter($user, array(PROJECT_STATUS_ACTIVE, PROJECT_STATUS_PAUSED, PROJECT_STATUS_CANCELED, PROJECT_STATUS_COMPLETED)); if ($type_filter) { return ProjectObjects::paginate(array('conditions' => array($type_filter . ' AND state = ? AND visibility >= ?', STATE_DELETED, $user->getVisibility()), 'order' => 'updated_on'), $page, $per_page); } else { return array(null, new Pager(1, 0, $per_page)); } // if } // if }
/** * Return project ID => project name map for a given user * * If $all_for_admins_and_pms is set to true system will return all projects * if user is administrator or project manager * * @param User $user * @param array $statuses * @param array $exclude_ids * @param boolean $all_for_admins_and_pms * @return null */ function findNamesByUser($user, $statuses = null, $exclude_ids = null, $all_for_admins_and_pms = false) { $projects_table = TABLE_PREFIX . 'projects'; $project_users_table = TABLE_PREFIX . 'project_users'; $exclude_filter = null; if (is_foreachable($exclude_ids)) { $exclude_filter = " AND {$projects_table}.id NOT IN (" . implode(', ', $exclude_ids) . ") "; } // if if ($all_for_admins_and_pms && ($user->isAdministrator() || $user->isProjectManager())) { if ($statuses) { $rows = db_execute_all("SELECT {$projects_table}.id, {$projects_table}.name FROM {$projects_table} WHERE {$projects_table}.type = ? AND {$projects_table}.status IN (?) {$exclude_filter} ORDER BY {$projects_table}.name", PROJECT_TYPE_NORMAL, $statuses); } else { $rows = db_execute_all("SELECT {$projects_table}.id, {$projects_table}.name FROM {$projects_table} WHERE {$projects_table}.type = ? {$exclude_filter} ORDER BY {$projects_table}.name", PROJECT_TYPE_NORMAL); } // if } else { if ($statuses) { $rows = db_execute_all("SELECT {$projects_table}.id, {$projects_table}.name FROM {$projects_table}, {$project_users_table} WHERE {$project_users_table}.user_id = ? AND {$project_users_table}.project_id = {$projects_table}.id AND {$projects_table}.type = ? AND {$projects_table}.status IN (?) {$exclude_filter} ORDER BY {$projects_table}.name", $user->getId(), PROJECT_TYPE_NORMAL, $statuses); } else { $rows = db_execute_all("SELECT {$projects_table}.id, {$projects_table}.name FROM {$projects_table}, {$project_users_table} WHERE {$project_users_table}.user_id = ? AND {$project_users_table}.project_id = {$projects_table}.id AND {$projects_table}.type = ? {$exclude_filter} ORDER BY {$projects_table}.name", $user->getId(), PROJECT_TYPE_NORMAL); } // if } // if $result = array(); if (is_foreachable($rows)) { foreach ($rows as $row) { $result[(int) $row['id']] = $row['name']; } // foreach } // if return $result; }
/** * Returns true if $user can change this users permissions on a $project * * @param User $user * @param Project $project * @return boolean */ function canChangeProjectPermissions($user, $project) { if ($user->isProjectLeader($project) || $user->isProjectManager() || $user->isAdministrator()) { return false; } // if return $this->isProjectLeader($project) || $this->isPeopleManager() || $this->isAdministrator(); }
/** * Returns true if $user is member of $project * * @param User $user * @param Project $project * @param boolean $use_cache * @return boolean */ function isProjectMember($user, $project, $use_cache = true) { static $cache = array(); $user_id = $user->getId(); $project_id = $project->getId(); if ($use_cache && isset($cache[$project_id]) && isset($cache[$project_id][$user_id])) { return $cache[$project_id][$user_id]; } // if if (!isset($cache[$project_id])) { $cache[$project_id] = array(); } // if if (!isset($cache[$project_id][$user_id])) { $cache[$project_id][$user_id] = array(); } // if if ($user->isAdministrator() || $user->isProjectManager()) { $cache[$project_id][$user_id] = true; } else { $cache[$project_id][$user_id] = (bool) ProjectUsers::count(array('user_id = ? AND project_id = ?', $user_id, $project_id)); } // if return $cache[$project_id][$user_id]; }
/** * Returns true if $user can see $profile calendar * * @param User $user * @param User $profile * @return boolean */ function can_access_profile_calendar($user, $profile) { return $user->isProjectManager(); }
/** * Can use delete this object * * @param User $user * @return boolean */ function canDelete($user) { return $user->isProjectManager() || $user->isAdministrator(); }
/** * Return object ID-s by user * * @param User $user * @return array */ function findObjectIdsByUser($user) { $project_objects_table = TABLE_PREFIX . 'project_objects'; $starred_objects_table = TABLE_PREFIX . 'starred_objects'; if ($user->isProjectManager()) { $rows = db_execute_all("SELECT object_id FROM {$starred_objects_table} WHERE user_id = ?", $user->getId()); } else { $type_filter = ProjectUsers::getVisibleTypesFilter($user, array(PROJECT_STATUS_ACTIVE, PROJECT_STATUS_PAUSED, PROJECT_STATUS_CANCELED, PROJECT_STATUS_COMPLETED)); if ($type_filter) { $rows = db_execute_all("SELECT {$project_objects_table}.id AS 'object_id' FROM {$project_objects_table}, {$starred_objects_table} WHERE {$type_filter} AND {$starred_objects_table}.object_id = {$project_objects_table}.id AND {$starred_objects_table}.user_id = ? AND {$project_objects_table}.state >= ? AND {$project_objects_table}.visibility >= ? ORDER BY {$project_objects_table}.priority DESC", $user->getId(), STATE_VISIBLE, $user->getVisibility()); } else { $rows = null; } // if } // if $result = array(); if (is_foreachable($rows)) { foreach ($rows as $row) { $result[] = (int) $row['object_id']; } // foreach } // if return $result; }
/** * Return true if specific user can copy this object * * @param User $user * @return boolean */ function canCopy($user) { if (!$this->can_be_copied) { return false; } // if return $user->isProjectManager() || $user->isProjectLeader($this->getProject()); }
/** * Returns true if user can delete this category * * @param User $user * @return boolean */ function canDelete($user) { return $user->isProjectLeader($this->getProject()) || $user->isProjectManager(); }