function show() { global $page, $db, $fs, $proj, $user; $page->setTitle($fs->prefs['page_title'] . L('roadmap')); // Get milestones $list_id = $db->x->GetOne('SELECT list_id FROM {fields} WHERE field_id = ?', null, $proj->prefs['roadmap_field']); $milestones = array(); if ($list_id) { $milestones = $db->x->getAll('SELECT list_item_id AS version_id, item_name AS version_name FROM {list_items} li WHERE list_id = ? AND version_tense = 3 ORDER BY list_position ASC', null, $list_id); } $data = array(); foreach ($milestones as $row) { // Get all tasks related to a milestone $all_tasks = $db->x->getAll('SELECT percent_complete, is_closed, t.* FROM {tasks} t LEFT JOIN {field_values} fv ON (fv.task_id = t.task_id AND field_id = ?) WHERE field_value = ? AND project_id = ?', null, array($proj->prefs['roadmap_field'], $row['version_id'], $proj->id)); $all_tasks = array_filter($all_tasks, array($user, 'can_view_task')); $percent_complete = 0; foreach ($all_tasks as $task) { if ($task['is_closed']) { $percent_complete += 100; } else { $percent_complete += $task['percent_complete']; } } $percent_complete = round($percent_complete / max(count($all_tasks), 1)); if (count($all_tasks)) { $tasks = $db->x->getAll('SELECT t.task_id, item_summary, detailed_desc, mark_private, fs.field_value AS field' . $fs->prefs['color_field'] . ', opened_by, content, task_token, t.project_id, prefix_id FROM {tasks} t LEFT JOIN {cache} ca ON (t.task_id = ca.topic AND ca.type = ? AND t.last_edited_time <= ca.last_updated) LEFT JOIN {field_values} f ON f.task_id = t.task_id LEFT JOIN {field_values} fs ON (fs.task_id = t.task_id AND fs.field_id = ?) WHERE f.field_value = ? AND f.field_id = ? AND t.project_id = ? AND is_closed = 0', null, array('rota', $fs->prefs['color_field'], $row['version_id'], $proj->prefs['roadmap_field'], $proj->id)); $count = count($tasks); for ($i = 0; $i < $count; $i++) { if (!$user->can_view_task($tasks[$i])) { unset($tasks[$i]); } } } $data[] = array('id' => $row['version_id'], 'open_tasks' => isset($tasks) ? $tasks : array(), 'percent_complete' => $percent_complete, 'all_tasks' => $all_tasks ? $all_tasks : array(), 'name' => $row['version_name']); unset($tasks); } if (Get::val('txt')) { $page = new FSTpl(); header('Content-Type: text/plain; charset=UTF-8'); $page->assign('data', $data); $page->display('roadmap.text.tpl'); exit; } else { $page->assign('data', $data); $page->pushTpl('roadmap.tpl'); } }
function show() { global $page, $db, $fs, $proj, $user; $page->setTitle($fs->prefs['page_title'] . L('changelog')); // Get milestones $list_id = $db->x->GetOne('SELECT list_id FROM {fields} WHERE field_id = ?', null, $proj->prefs['roadmap_field']); if (!$list_id) { trigger_error('Roadmap / changelog has not been configured in the project management area.', E_USER_ERROR); } $milestones = $db->x->getAll('SELECT list_item_id AS version_id, item_name AS version_name FROM {list_items} li WHERE list_id = ? AND (version_tense = 1 OR version_tense = 2) AND show_in_list = 1 ORDER BY list_position ASC', null, $list_id); $data = array(); $reasons = implode(',', explode(' ', $proj->prefs['changelog_reso'])); while ((list(, $row) = each($milestones)) && $reasons) { $tasks = $db->x->getAll('SELECT t.task_id, percent_complete, item_summary, detailed_desc, mark_private, fs.field_value AS field' . $fs->prefs['color_field'] . ', opened_by, task_token, t.project_id, prefix_id, li.item_name AS res_name, li.list_item_id AS res_id FROM {tasks} t LEFT JOIN {field_values} f ON f.task_id = t.task_id LEFT JOIN {field_values} fs ON (fs.task_id = t.task_id AND fs.field_id = ?) LEFT JOIN {list_items} li ON t.resolution_reason = li.list_item_id WHERE f.field_value = ? AND f.field_id = ? AND t.project_id = ? AND is_closed = 1 AND t.resolution_reason IN (' . $reasons . ') ORDER BY t.resolution_reason DESC', null, array($fs->prefs['color_field'], $row['version_id'], $proj->prefs['roadmap_field'], $proj->id)); $tasks = array_filter($tasks, array($user, 'can_view_task')); if (count($tasks)) { $resolutions = array(); foreach ($tasks as $task) { $resolutions[$task['res_name']] = isset($resolutions[$task['res_name']]) ? $resolutions[$task['res_name']] + 1 : 1; } $data[] = array('tasks' => $tasks, 'name' => $row['version_name'], 'resolutions' => $resolutions); } } if (Get::val('txt')) { $page = new FSTpl(); header('Content-Type: text/plain; charset=UTF-8'); $page->assign('data', $data); $page->display('changelog.text.tpl'); exit; } else { $page->assign('data', $data); $page->pushTpl('changelog.tpl'); } }
$prs[$p['project_id']] = $p; } $fs->projects = array_filter($prs, array($user, 'can_view_project')); // Get e-mail addresses of the admins if ($user->isAnon() && !$fs->prefs['user_notify']) { $sql = $db->Query('SELECT email_address FROM {users} u LEFT JOIN {users_in_groups} g ON u.user_id = g.user_id WHERE g.group_id = 1'); $page->assign('admin_emails', array_map(create_function('$x', 'return str_replace("@", "#", $x);'), $db->fetchCol($sql))); } // default title $page->setTitle($fs->prefs['page_title'] . $proj->prefs['project_title']); $page->assign('do', $do); $page->assign('supertask_id', $supertask_id); $page->pushTpl('header.tpl'); if (!defined('NO_DO')) { require_once BASEDIR . "/scripts/{$do}.php"; } else { # not nicest solution, NO_DO currently only used on register actions $page->pushTpl('register.ok.tpl'); } $page->pushTpl('footer.tpl'); $page->setTheme($proj->prefs['theme_style']); $page->render(); if (isset($_SESSION)) { // remove dupe data on error, since no submission happened if (isset($_SESSION['ERROR']) && isset($_SESSION['requests_hash'])) { $currentrequest = md5(serialize($_POST)); unset($_SESSION['requests_hash'][$currentrequest]); }
ORDER BY sort_names'); $fs->projects = array_filter($db->FetchAllArray($sql), array($user, 'can_view_project')); //exit; // Get e-mail addresses of the admins if ($user->isAnon() && !$fs->prefs['user_notify']) { $sql = $db->Query('SELECT email_address FROM {users} u LEFT JOIN {users_in_groups} g ON u.user_id = g.user_id WHERE g.group_id = 1'); $page->assign('admin_emails', array_map(create_function('$x', 'return str_replace("@", "#", $x);'), $db->fetchCol($sql))); } // default title $page->setTitle($fs->prefs['page_title'] . $proj->prefs['project_title']); $page->assign('do', $do); $page->assign('supertask_id', $supertask_id); $page->pushTpl('header.tpl'); // DB modifications? if (Req::has('action')) { require_once BASEDIR . '/includes/modify.inc.php'; } if (!defined('NO_DO')) { require_once BASEDIR . "/scripts/{$do}.php"; } $page->pushTpl('footer.tpl'); $page->setTheme($proj->prefs['theme_style']); $page->render(); if (isset($_SESSION)) { // remove dupe data on error, since no submission happened if (isset($_SESSION['ERROR']) && isset($_SESSION['requests_hash'])) { $currentrequest = md5(serialize($_POST)); unset($_SESSION['requests_hash'][$currentrequest]);
$page->assign('pm_pendingreq_num', $count); } // Get e-mail addresses of the admins if ($user->isAnon() && !$fs->prefs['user_notify']) { $amails = $db->x->getCol('SELECT email_address FROM {users} u LEFT JOIN {users_in_groups} g ON u.user_id = g.user_id WHERE g.group_id = 1'); $amails = array_map(create_function('$x', 'return str_replace("@", "#", $x);'), $amails); $page->assign('admin_emails', $amails); } // default title $page->setTitle($fs->prefs['page_title'] . $proj->prefs['project_title']); $page->setTheme($proj->prefs['theme_style']); $page->assign('do', $do); $page->pushTpl('header.tpl'); if (Flyspray::requestDuplicated()) { // Check that this page isn't being submitted twice FlysprayDo::error(array(ERROR_INPUT, L('error3'))); } /* XXX: * there is something fishy in the new design, users actions * should never require the admin specific class. */ $class = 'FlysprayDo' . $do; $mode = new $class(); $mode->show(Req::val('area')); if (isset($_SESSION)) { // remove dupe data on error, since no submission happened if (isset($_SESSION['ERROR']) && isset($_SESSION['requests_hash'])) { $currentrequest = md5(serialize($_POST));
foreach ($all_tasks as $task) { if ($task['is_closed']) { $percent_complete += 100; } else { $percent_complete += $task['percent_complete']; } } $percent_complete = round($percent_complete / max(count($all_tasks), 1)); $tasks = $db->Query('SELECT task_id, item_summary, detailed_desc, item_status, task_severity, task_priority, task_type, mark_private, opened_by, content, task_token, t.project_id,estimated_effort FROM {tasks} t LEFT JOIN {cache} ca ON (t.task_id = ca.topic AND ca.type = \'rota\' AND t.last_edited_time <= ca.last_updated) WHERE closedby_version = ? AND t.project_id = ? AND is_closed = 0', array($row['version_id'], $proj->id)); $tasks = $db->fetchAllArray($tasks); $count = count($tasks); for ($i = 0; $i < $count; $i++) { if (!$user->can_view_task($tasks[$i])) { unset($tasks[$i]); } } $data[] = array('id' => $row['version_id'], 'open_tasks' => $tasks, 'percent_complete' => $percent_complete, 'all_tasks' => $all_tasks, 'name' => $row['version_name']); } if (Get::val('txt')) { $page = new FSTpl(); header('Content-Type: text/plain; charset=UTF-8'); $page->uses('data', 'page'); $page->display('roadmap.text.tpl'); exit; } else { $page->uses('data', 'page'); $page->pushTpl('roadmap.tpl'); }
function show() { global $db, $page, $fs, $proj, $do; $page = new FSTpl(); $page->setTheme($proj->prefs['theme_style']); $page->assign('do', $do); $page->pushTpl('baseheader.tpl'); $assignees = ''; if (Get::val('onlyassignees')) { $assignees = 'AND (g.show_as_assignees = 1 OR g.is_admin = 1)'; } $query = 'SELECT g.group_id, g.group_name, g.group_desc, g.group_open, count(u.user_id) AS num_users FROM {groups} g LEFT JOIN {users_in_groups} uig ON uig.group_id = g.group_id LEFT JOIN {users} u ON (uig.user_id = u.user_id ' . $assignees . ') WHERE g.project_id = ? GROUP BY g.group_id'; $page->assign('groups', $db->x->getAll($query, null, $proj->id)); $page->assign('globalgroups', $db->x->getAll($query, null, 0)); // Search conditions $where = array(); $params = array(); foreach (array('user_name', 'real_name') as $key) { if (Post::val($key)) { $where[] = ' ' . $key . ' LIKE ? '; $params[] = '%' . Post::val($key) . '%'; } } $where = count($where) ? implode(' OR ', $where) : '1=1'; // fill the table with users if (Get::val('group_id', -1) > 0) { $order_keys = array('username' => 'user_name', 'realname' => 'real_name'); $order_column = $order_keys[Filters::enum(Get::val('order', 'username'), array_keys($order_keys))]; $sortorder = sprintf('ORDER BY %s %s, u.user_id ASC', $order_column, Filters::enum(Get::val('sort', 'desc'), array('asc', 'desc'))); $users = $db->x->getAll('SELECT u.user_id, user_name, real_name, email_address FROM {users} u LEFT JOIN {users_in_groups} uig ON uig.user_id = u.user_id LEFT JOIN {groups} g ON uig.group_id = g.group_id WHERE uig.group_id = ? ' . $assignees . ' AND ( ' . $where . ' )' . $sortorder, null, array_merge(array(Get::val('group_id')), $params)); // Offset and limit $user_list = array(); $offset = max(Get::num('pagenum') - 1, 0) * 20; for ($i = $offset; $i < $offset + 20 && $i < count($users); $i++) { $user_list[] = $users[$i]; } $page->assign('users', $user_list); } else { // be tricky ^^: show most assigned users $db->setLimit(20); $users = $db->x->getAll('SELECT a.user_id, u.user_name, u.real_name, email_address, count(a.user_id) AS a_count, CASE WHEN t.project_id = ? THEN 1 ELSE 0 END AS my_project FROM {assigned} a LEFT JOIN {users} u ON a.user_id = u.user_id LEFT JOIN {tasks} t ON a.task_id = t.task_id WHERE ( ' . $where . ' )' . ' AND u.account_enabled = 1 GROUP BY a.user_id ORDER BY my_project DESC, a_count DESC', null, array_merge(array($proj->id), $params)); $page->assign('users', $users); } $page->assign('usercount', count($users)); $page->setTitle($fs->prefs['page_title'] . L('userselect')); $page->pushTpl('userselect.tpl'); $page->finish(); }
function error($errno, $errstr = '', $errfile = '', $errline = 0) { global $db, $proj, $fs; $page = new FSTpl(); $page->pushTpl('header.tpl'); $page->assign('do', 'index'); $page->setTheme(isset($proj) ? $proj->prefs['theme_style'] : $fs->prefs['global_theme']); if (is_array($errno)) { list($errno, $errstr, $url) = array_pad($errno, 3, ''); } else { // ignore E_STRICT and @ if (($errno > E_ALL || !ini_get('error_reporting')) && (isset($errstr) && strpos($errstr, 'by reference') === false)) { return; } $errno = ERROR_INTERNAL; } if (isset($db) && is_object($db) && $db->inTransaction()) { $db->rollback(); // if possible, undo database queries } switch ($errno) { case ERROR_INTERNAL: $page->assign('file', str_replace(BASEDIR . DIRECTORY_SEPARATOR, '', $errfile)); $page->assign('line', $errline); case ERROR_PERMS: case ERROR_INPUT: @ob_clean(); // make sure that previous output is erased $page->assign('type', $errno); $page->assign('message', $errstr); $page->pushTpl('error.tpl'); $page->finish('footer.tpl'); case ERROR_RECOVER: if ($errstr) { $_SESSION['ERROR'] = $errstr; } if ($url) { Flyspray::Redirect($url); } break; case SUBMIT_OK: if ($errstr) { $_SESSION['SUCCESS'] = $errstr; } if ($url) { Flyspray::Redirect($url); } break; } }