if (count($item) == 1) { $email_details = Support::getEmailDetails(Email_Account::getAccountByEmail($item[0]), $item[0]); $tpl->assign(array('issue_summary' => $email_details['sup_subject'], 'issue_description' => $email_details['seb_body'])); // also auto pre-fill the customer contact text fields if (CRM::hasCustomerIntegration($prj_id)) { $sender_email = Mail_Helper::getEmailAddress($email_details['sup_from']); try { $contact = $crm->getContactByEmail($sender_email); $tpl->assign('contact_details', $contact->getDetails()); } catch (CRMException $e) { } } } } } $tpl->assign(array('cats' => Category::getAssocList($prj_id), 'priorities' => Priority::getAssocList($prj_id), 'severities' => Severity::getList($prj_id), 'users' => Project::getUserAssocList($prj_id, 'active', User::getRoleID('Customer')), 'releases' => Release::getAssocList($prj_id), 'custom_fields' => Custom_Field::getListByProject($prj_id, 'report_form'), 'max_attachment_size' => Attachment::getMaxAttachmentSize(), 'max_attachment_bytes' => Attachment::getMaxAttachmentSize(true), 'field_display_settings' => Project::getFieldDisplaySettings($prj_id), 'groups' => Group::getAssocList($prj_id), 'products' => Product::getList(false))); $prefs = Prefs::get($usr_id); $tpl->assign('user_prefs', $prefs); $tpl->assign('zones', Date_Helper::getTimezoneList()); if (Auth::getCurrentRole() == User::getRoleID('Customer')) { $crm = CRM::getInstance(Auth::getCurrentProject()); $customer_contact_id = User::getCustomerContactID($usr_id); $contact = $crm->getContact($customer_contact_id); $customer_id = Auth::getCurrentCustomerID(); $customer = $crm->getCustomer($customer_id); // TODOCRM: Pull contacts via ajax when user selects contract $tpl->assign(array('customer_id' => $customer_id, 'contact_id' => $customer_contact_id, 'customer' => $customer, 'contact' => $contact)); } $clone_iss_id = isset($_GET['clone_iss_id']) ? (int) $_GET['clone_iss_id'] : null; if ($clone_iss_id && Access::canCloneIssue($clone_iss_id, $usr_id)) { $tpl->assign(Issue::getCloneIssueTemplateVariables($clone_iss_id));
* please see the COPYING and AUTHORS files * that were distributed with this source code. */ require_once __DIR__ . '/../../init.php'; $tpl = new Template_Helper(); $tpl->setTemplate('manage/severities.tpl.html'); Auth::checkAuthentication(); $role_id = Auth::getCurrentRole(); if ($role_id < User::ROLE_MANAGER) { Misc::setMessage('Sorry, you are not allowed to access this page.', Misc::MSG_ERROR); $tpl->displayTemplate(); exit; } @($prj_id = $_POST['prj_id'] ? $_POST['prj_id'] : $_GET['prj_id']); $tpl->assign('project', Project::getDetails($prj_id)); if (@$_POST['cat'] == 'new') { $res = Severity::insert($prj_id, $_POST['title'], $_POST['description'], $_POST['rank']); Misc::mapMessages($res, array(1 => array('Thank you, the severity was added successfully.', Misc::MSG_INFO), -1 => array('An error occurred while trying to add the severity.', Misc::MSG_ERROR), -2 => array('Please enter the title for this new severity.', Misc::MSG_ERROR))); } elseif (@$_POST['cat'] == 'update') { $res = Severity::update($_POST['id'], $_POST['title'], $_POST['description'], $_POST['rank']); Misc::mapMessages($res, array(1 => array('Thank you, the severity was added successfully.', Misc::MSG_INFO), -1 => array('An error occurred while trying to add the severity.', Misc::MSG_ERROR), -2 => array('Please enter the title for this new severity.', Misc::MSG_ERROR))); } elseif (@$_POST['cat'] == 'delete') { Severity::remove($_POST['items']); } if (@$_GET['cat'] == 'edit') { $tpl->assign('info', Severity::getDetails($_GET['id'])); } elseif (@$_GET['cat'] == 'change_rank') { Severity::changeRank($prj_id, $_GET['id'], $_GET['rank']); } $tpl->assign('list', Severity::getList($prj_id)); $tpl->displayTemplate();
/** * Returns an array of active filters * * @param array $options The options array * @return array */ public static function getActiveFilters($options) { $prj_id = Auth::getCurrentProject(); $filter_info = self::getFiltersInfo(); $return = array(); foreach ($filter_info as $filter_key => $filter) { $display = false; if (isset($filter['param']) && isset($options[$filter['param']])) { $filter_details = $options[$filter['param']]; } if (isset($filter['is_custom'])) { // custom fields $fld_id = $filter['fld_id']; if (!isset($options['custom_field'][$fld_id]) || empty($options['custom_field'][$fld_id])) { continue; } elseif ($filter['fld_type'] == 'date' && empty($options['custom_field'][$fld_id]['Year'])) { continue; } elseif ($filter['fld_type'] == 'integer') { if (!isset($options['custom_field'][$fld_id]['value']) || empty($options['custom_field'][$fld_id]['value'])) { continue; } else { $filter_details = $options['custom_field'][$fld_id]; switch ($filter_details['filter_type']) { case 'ge': $display = ev_gettext('%1$s or greater', $filter_details['value']); break; case 'le': $display = ev_gettext('%1$s or less', $filter_details['value']); break; case 'gt': $display = ev_gettext('Greater than %1$s', $filter_details['value']); break; case 'lt': $display = ev_gettext('Less than %1$s', $filter_details['value']); break; default: $display = $filter_details['value']; } } } elseif (in_array($filter['fld_type'], array('multiple', 'combo'))) { $display = implode(', ', Custom_Field::getOptions($fld_id, $options['custom_field'][$fld_id])); } else { $display = $options['custom_field'][$fld_id]; } } elseif (!isset($options[$filter['param']]) || empty($options[$filter['param']]) || in_array($filter_key, array('sort_order', 'sort_by', 'rows', 'search_type'))) { continue; } elseif (isset($filter['is_date']) && $filter['is_date'] == true) { if (!empty($filter_details['Year']) || isset($filter_details['time_period'])) { switch ($filter_details['filter_type']) { case 'in_past': $display = ev_gettext('In Past %1$s hours', $filter_details['time_period']); break; case 'null': $display = ev_gettext('Is NULL'); break; case 'between': $end = $options[$filter['param'] . '_end']; $display = ev_gettext('Is between %1$s-%2$s-%3$s AND %4$s-%5$s-%6$s', $filter_details['Year'], $filter_details['Month'], $filter_details['Day'], $end['Year'], $end['Month'], $end['Day']); break; case 'greater': $display = ev_gettext('Is greater than %1$s-%2$s-%3$s', $filter_details['Year'], $filter_details['Month'], $filter_details['Day']); break; case 'less': $display = ev_gettext('Is less than %1$s-%2$s-%3$s', $filter_details['Year'], $filter_details['Month'], $filter_details['Day']); } } } elseif ($filter['param'] == 'status') { $statuses = Status::getAssocStatusList($prj_id); $display = $statuses[$filter_details]; } elseif ($filter['param'] == 'category') { $categories = Category::getAssocList($prj_id); if (is_array($filter_details)) { $active_categories = array(); foreach ($filter_details as $category) { $active_categories[] = $categories[$category]; } $display = implode(', ', $active_categories); } else { $display = $categories[$filter_details]; } } elseif ($filter['param'] == 'priority') { $priorities = Priority::getAssocList($prj_id); $display = $priorities[$filter_details]; } elseif ($filter['param'] == 'severity') { $severities = Severity::getAssocList($prj_id); $display = $severities[$filter_details]; } elseif ($filter['param'] == 'users') { if ($filter_details == -1) { $display = ev_gettext('un-assigned'); } elseif ($filter_details == -2) { $display = ev_gettext('myself and un-assigned'); } elseif ($filter_details == -3) { $display = ev_gettext('myself and my group'); } elseif ($filter_details == -4) { $display = ev_gettext('myself, un-assigned and my group'); } elseif (substr($filter_details, 0, 3) == 'grp') { $display = ev_gettext('%1$s Group', Group::getName(substr($filter_details, 4))); } else { $display = User::getFullName($filter_details); } } elseif ($filter['param'] == 'hide_closed') { if ($filter_details == true) { $display = ev_gettext('Yes'); } } elseif ($filter['param'] == 'reporter') { $display = User::getFullName($filter_details); } elseif ($filter['param'] == 'release') { $display = Release::getTitle($filter_details); } elseif ($filter['param'] == 'customer_id') { try { $crm = CRM::getInstance($prj_id); $customer = $crm->getCustomer($filter_details); $display = $customer->getName(); } catch (CRMException $e) { $display = $filter_details; } } elseif ($filter['param'] == 'product') { $display = Product::getTitle($filter_details); } else { $display = $filter_details; } if ($display != false) { $return[$filter['title']] = array('value' => $display, 'remove_link' => 'list.php?view=clearandfilter&' . self::buildUrl($filter_info, $options, $filter_key, true)); } } return $return; }
/** * Method to update the details of a specific issue. * * @param integer $issue_id The issue ID * @return integer 1 if the update worked, -1 or -2 otherwise */ public static function update($issue_id) { $issue_id = (int) $issue_id; $usr_id = Auth::getUserID(); $prj_id = self::getProjectID($issue_id); $workflow = Workflow::preIssueUpdated($prj_id, $issue_id, $usr_id, $_POST); if ($workflow !== true) { return $workflow; } // get all of the 'current' information of this issue $current = self::getDetails($issue_id); $associated_issues = isset($_POST['associated_issues']) ? explode(',', $_POST['associated_issues']) : array(); self::updateAssociatedIssuesRelations($issue_id, $associated_issues); $assignments_changed = false; if (@$_POST['keep_assignments'] == 'no') { // only change the issue-user associations if there really were any changes $old_assignees = array_merge($current['assigned_users'], $current['assigned_inactive_users']); if (!empty($_POST['assignments'])) { $new_assignees = @$_POST['assignments']; } else { $new_assignees = array(); } $assignment_notifications = array(); // remove people from the assignment list, if appropriate foreach ($old_assignees as $assignee) { if (!in_array($assignee, $new_assignees)) { self::deleteUserAssociation($issue_id, $assignee); $assignments_changed = true; } } // add people to the assignment list, if appropriate foreach ($new_assignees as $assignee) { if (!in_array($assignee, $old_assignees)) { self::addUserAssociation($usr_id, $issue_id, $assignee); Notification::subscribeUser($usr_id, $issue_id, $assignee, Notification::getDefaultActions($issue_id, User::getEmail($assignee), 'issue_update'), true); $assignment_notifications[] = $assignee; $assignments_changed = true; } } if (count($assignment_notifications) > 0) { Notification::notifyNewAssignment($assignment_notifications, $issue_id); } } if (empty($_POST['estimated_dev_time'])) { $_POST['estimated_dev_time'] = 0; } $params = array('iss_updated_date' => Date_Helper::getCurrentDateGMT(), 'iss_last_public_action_date' => Date_Helper::getCurrentDateGMT(), 'iss_last_public_action_type' => 'updated', 'iss_sta_id' => $_POST['status'], 'iss_summary' => $_POST['summary'], 'iss_description' => $_POST['description']); if (isset($_POST['release'])) { $params['iss_pre_id'] = $_POST['release']; } if (isset($_POST['percentage_complete'])) { $params['iss_percent_complete'] = $_POST['percentage_complete']; } if (isset($_POST['group'])) { $params['iss_grp_id'] = $_POST['group']; } if (isset($_POST['estimated_dev_time'])) { $params['iss_dev_time'] = $_POST['estimated_dev_time']; } if (isset($_POST['trigger_reminders'])) { $params['iss_trigger_reminders'] = $_POST['trigger_reminders']; } if (isset($_POST['resolution'])) { $params['iss_res_id'] = $_POST['resolution']; } if (!empty($_POST['category'])) { $params['iss_prc_id'] = $_POST['category']; } if (@$_POST['keep'] == 'no') { $params['iss_pre_id'] = $_POST['release']; } if (!empty($_POST['expected_resolution_date'])) { $params['iss_expected_resolution_date'] = $_POST['expected_resolution_date']; } else { $params['iss_expected_resolution_date'] = null; } if (isset($_POST['private'])) { $params['iss_private'] = $_POST['private']; } if (isset($_POST['priority'])) { $params['iss_pri_id'] = $_POST['priority']; } if (isset($_POST['severity'])) { $params['iss_sev_id'] = $_POST['severity']; } if (isset($_POST['scheduled_release'])) { $params['iss_pre_id'] = $_POST['scheduled_release']; } $stmt = 'UPDATE {{%issue}} SET ' . DB_Helper::buildSet($params) . ' WHERE iss_id=?'; $params[] = $issue_id; try { DB_Helper::getInstance()->query($stmt, $params); } catch (DbException $e) { return -1; } // change product if (isset($_POST['product'])) { $product_changes = Product::updateProductsByIssue($issue_id, $_POST['product'], $_POST['product_version']); } // add change to the history (only for changes on specific fields?) $updated_fields = array(); if ($current['iss_expected_resolution_date'] != $_POST['expected_resolution_date']) { $updated_fields['Expected Resolution Date'] = History::formatChanges($current['iss_expected_resolution_date'], $_POST['expected_resolution_date']); } if (isset($_POST['category']) && $current['iss_prc_id'] != $_POST['category']) { $updated_fields['Category'] = History::formatChanges(Category::getTitle($current['iss_prc_id']), Category::getTitle($_POST['category'])); } if (isset($_POST['release']) && $current['iss_pre_id'] != $_POST['release']) { $updated_fields['Release'] = History::formatChanges(Release::getTitle($current['iss_pre_id']), Release::getTitle($_POST['release'])); } if (isset($_POST['priority']) && $current['iss_pri_id'] != $_POST['priority']) { $updated_fields['Priority'] = History::formatChanges(Priority::getTitle($current['iss_pri_id']), Priority::getTitle($_POST['priority'])); Workflow::handlePriorityChange($prj_id, $issue_id, $usr_id, $current, $_POST); } if (isset($_POST['severity']) && $current['iss_sev_id'] != $_POST['severity']) { $updated_fields['Severity'] = History::formatChanges(Severity::getTitle($current['iss_sev_id']), Severity::getTitle($_POST['severity'])); Workflow::handleSeverityChange($prj_id, $issue_id, $usr_id, $current, $_POST); } if (isset($_POST['scheduled_release']) && $current['iss_pre_id'] != $_POST['scheduled_release']) { $updated_fields['Scheduled Release'] = History::formatChanges(Release::getTitle($current['iss_pre_id']), Release::getTitle($_POST['scheduled_release'])); } if (isset($_POST['status']) && $current['iss_sta_id'] != $_POST['status']) { // clear out the last-triggered-reminder flag when changing the status of an issue Reminder_Action::clearLastTriggered($issue_id); // if old status was closed and new status is not, clear closed data from issue. $old_status_details = Status::getDetails($current['iss_sta_id']); if ($old_status_details['sta_is_closed'] == 1) { $new_status_details = Status::getDetails($_POST['status']); if ($new_status_details['sta_is_closed'] != 1) { self::clearClosed($issue_id); } } $updated_fields['Status'] = History::formatChanges(Status::getStatusTitle($current['iss_sta_id']), Status::getStatusTitle($_POST['status'])); } if (isset($_POST['resolution']) && $current['iss_res_id'] != $_POST['resolution']) { $updated_fields['Resolution'] = History::formatChanges(Resolution::getTitle($current['iss_res_id']), Resolution::getTitle($_POST['resolution'])); } if (isset($_POST['estimated_dev_time']) && $current['iss_dev_time'] != $_POST['estimated_dev_time']) { $updated_fields['Estimated Dev. Time'] = History::formatChanges(Misc::getFormattedTime($current['iss_dev_time'] * 60), Misc::getFormattedTime($_POST['estimated_dev_time'] * 60)); } if ($current['iss_summary'] != $_POST['summary']) { $updated_fields['Summary'] = ''; } if (isset($_POST['percentage_complete']) && $current['iss_original_percent_complete'] != $_POST['percentage_complete']) { $updated_fields['Percentage complete'] = History::formatChanges($current['iss_original_percent_complete'], $_POST['percentage_complete']); } if ($current['iss_original_description'] != $_POST['description']) { $updated_fields['Description'] = ''; } if (isset($_POST['private']) && $_POST['private'] != $current['iss_private']) { $updated_fields['Private'] = History::formatChanges(Misc::getBooleanDisplayValue($current['iss_private']), Misc::getBooleanDisplayValue($_POST['private'])); } if (isset($_POST['product']) && count($product_changes) > 0) { $updated_fields['Product'] = implode('; ', $product_changes); } if (isset($_POST['custom_fields']) && count($_POST['custom_fields']) > 0) { $updated_custom_fields = Custom_Field::updateValues($issue_id, $_POST['custom_fields']); } else { $updated_custom_fields = array(); } if (count($updated_fields) > 0) { // log the changes $changes = ''; $i = 0; foreach ($updated_fields as $key => $value) { if ($i > 0) { $changes .= '; '; } if ($key != 'Summary' && $key != 'Description') { $changes .= "{$key}: {$value}"; } else { $changes .= "{$key}"; } $i++; } History::add($issue_id, $usr_id, 'issue_updated', 'Issue updated ({changes}) by {user}', array('changes' => $changes, 'user' => User::getFullName($usr_id))); } if (count($updated_fields) > 0 || count($updated_custom_fields) > 0) { // send notifications for the issue being updated Notification::notifyIssueUpdated($issue_id, $current, $_POST, $updated_custom_fields); } // record group change as a separate change if (isset($_POST['group']) && $current['iss_grp_id'] != (int) $_POST['group']) { History::add($issue_id, $usr_id, 'group_changed', 'Group changed ({changes}) by {user}', array('changes' => History::formatChanges(Group::getName($current['iss_grp_id']), Group::getName($_POST['group'])), 'user' => User::getFullName($usr_id))); } // now update any duplicates, if any $update_dupe = array('Category', 'Release', 'Priority', 'Release', 'Resolution'); $intersect = array_intersect($update_dupe, array_keys($updated_fields)); if ($current['duplicates'] != '' && count($intersect) > 0) { self::updateDuplicates($issue_id); } // if there is customer integration, mark last customer action if (CRM::hasCustomerIntegration($prj_id) && User::getRoleByUser($usr_id, $prj_id) == User::ROLE_CUSTOMER) { self::recordLastCustomerAction($issue_id); } if ($assignments_changed) { // XXX: we may want to also send the email notification for those "new" assignees Workflow::handleAssignmentChange(self::getProjectID($issue_id), $issue_id, $usr_id, self::getDetails($issue_id), @$_POST['assignments'], false); } Workflow::handleIssueUpdated($prj_id, $issue_id, $usr_id, $current, $_POST); // Move issue to another project if (isset($_POST['move_issue']) and User::getRoleByUser($usr_id, $prj_id) >= User::ROLE_DEVELOPER) { $new_prj_id = (int) @$_POST['new_prj']; if ($prj_id != $new_prj_id && array_key_exists($new_prj_id, Project::getAssocList($usr_id))) { if (User::getRoleByUser($usr_id, $new_prj_id) >= User::ROLE_REPORTER) { $res = self::moveIssue($issue_id, $new_prj_id); if ($res == -1) { return $res; } } else { return -1; } } } return 1; }
/** * Returns the options associated with a specific field * * @param string $field_name The name of the field * @param integer $issue_id The ID of the issue * @return array An array of options for the specified field */ private static function getOptions($field_name, $issue_id) { $prj_id = Issue::getProjectID($issue_id); switch ($field_name) { case 'assignee': $users = Project::getUserAssocList($prj_id, 'active', User::ROLE_CUSTOMER); $current_assignees = Issue::getAssignedUserIDs($issue_id); foreach ($current_assignees as $usr_id) { if (!isset($users[$usr_id])) { $users[$usr_id] = User::getFullName($usr_id); } asort($users); } return $users; case 'priority': return Priority::getAssocList($prj_id); case 'severity': return Severity::getAssocList($prj_id); } return array(); }
foreach ($facs as $fac) { $alogs[$fac->name] = intval($fac->val); } $facs = $syslog_daily->todays_severities()->findAll(); foreach ($facs as $fac) { $slogs[$fac->name] = intval($fac->val); } foreach ($alogs as $key => $val) { if (!isset($slogs[$key])) { $slogs[$key] = 0; } } $archive_logs = ksort($alogs); $system_logs = ksort($slogs); foreach ($alogs as $key => $val) { $labels[] = Severity::model()->findByPk($key)->name; } $this->Widget('ext.highcharts.HighchartsWidget', array('options' => array('chart' => array('type' => 'bar'), 'credits' => array('enabled' => false), 'title' => array('text' => 'Messages per Severity Today'), 'xAxis' => array('categories' => $labels), 'yAxis' => array('title' => array('text' => 'Messages Today')), 'series' => array(array('name' => 'Archive', 'data' => array_values($alogs)), array('name' => 'Syslog', 'data' => array_values($slogs)))))); $alogs = $slogs = $labels = array(); $facs = $archive_daily->todays_hosts()->findAll(); foreach ($facs as $fac) { $alogs[$fac->name] = intval($fac->val); } $facs = $syslog_daily->todays_hosts()->findAll(); foreach ($facs as $fac) { $slogs[$fac->name] = intval($fac->val); } foreach ($alogs as $key => $val) { if (!isset($slogs[$key])) { $slogs[$key] = 0; }
} if (count($groups) > 0 && Auth::getCurrentRole() > User::getRoleID('Customer')) { foreach ($groups as $grp_id => $grp_name) { $assign_options["grp:{$grp_id}"] = ev_gettext('Group') . ': ' . $grp_name; } } $assign_options += $users; $list = Search::getListing($prj_id, $options, $pagerRow, $rows); $tpl->assign('list', $list['list']); $tpl->assign('list_info', $list['info']); $tpl->assign('csv_data', base64_encode(@$list['csv'])); $tpl->assign('match_modes', Search::getMatchModes()); $tpl->assign('supports_excerpts', Search::doesBackendSupportExcerpts()); $tpl->assign('columns', Display_Column::getColumnsToDisplay($prj_id, 'list_issues')); $tpl->assign('priorities', Priority::getAssocList($prj_id)); $tpl->assign('severities', Severity::getAssocList($prj_id)); $tpl->assign('status', Status::getAssocStatusList($prj_id)); $tpl->assign('assign_options', $assign_options); $tpl->assign('custom', Filter::getAssocList($prj_id)); $tpl->assign('csts', Filter::getListing(true)); $tpl->assign('active_filters', Filter::getActiveFilters($options)); $tpl->assign('categories', Category::getAssocList($prj_id)); $tpl->assign('releases', Release::getAssocList($prj_id, true)); $tpl->assign('reporters', Project::getReporters($prj_id)); $tpl->assign(array('products' => Product::getAssocList(false))); $prefs = Prefs::get($usr_id); $tpl->assign('refresh_rate', $prefs['list_refresh_rate'] * 60); $tpl->assign('refresh_page', 'list.php'); // items needed for bulk update tool if (Auth::getCurrentRole() > User::getRoleID('Developer')) { $tpl->assign('users', $users);
$statuses = Status::getAssocStatusList($prj_id, false); } if (!empty($details['iss_sta_id']) && empty($statuses[$details['iss_sta_id']])) { $statuses[$details['iss_sta_id']] = Status::getStatusTitle($details['iss_sta_id']); } $columns = array(0 => array(), 1 => array()); if (CRM::hasCustomerIntegration($prj_id) and !empty($details['iss_customer_id'])) { $columns[0][] = array('title' => 'Customer', 'field' => 'customer_0'); $columns[1][] = array('title' => 'Customer Contract', 'field' => 'customer_1'); } $categories = Category::getAssocList($prj_id); if (count($categories) > 0) { $columns[0][] = array('title' => ev_gettext('Category'), 'data' => $details['prc_title'], 'field' => 'category'); } $columns[0][] = array('title' => ev_gettext('Status'), 'data' => $details['sta_title'], 'data_bgcolor' => $details['status_color'], 'field' => 'status'); $severities = Severity::getAssocList($prj_id); if (count($severities) > 0) { $columns[0][] = array('title' => ev_gettext('Severity'), 'data' => $details['sev_title'], 'field' => 'severity'); } $priorities = Priority::getAssocList($prj_id); if (count($priorities) > 0 && (!isset($issue_fields_display['priority']) || $issue_fields_display['priority'] != false)) { if (isset($issue_fields_display['priority']['min_role']) && $issue_fields_display['priority']['min_role'] > User::getRoleID('Customer')) { $bgcolor = APP_INTERNAL_COLOR; } else { $bgcolor = ''; } $columns[0][] = array('title' => ev_gettext('Priority'), 'data' => $details['pri_title'], 'title_bgcolor' => $bgcolor, 'field' => 'priority'); } $releases = Release::getAssocList($prj_id); if (count($releases) > 0 && $role_id != User::getRoleID('Customer')) { $columns[0][] = array('title' => ev_gettext('Scheduled Release'), 'data' => $details['pre_title'], 'title_bgcolor' => APP_INTERNAL_COLOR);
// generate options for assign list. If there are groups and user is above a customer, include groups $groups = Group::getAssocList($prj_id); $users = Project::getUserAssocList($prj_id, 'active', User::getRoleID('Customer')); $assign_options = array('' => ev_gettext('Any'), '-1' => ev_gettext('un-assigned'), '-2' => ev_gettext('myself and un-assigned')); if (Auth::isAnonUser()) { unset($assign_options['-2']); } elseif (User::getGroupID(Auth::getUserID()) != '') { $assign_options['-3'] = ev_gettext('myself and my group'); $assign_options['-4'] = ev_gettext('myself, un-assigned and my group'); } if (count($groups) > 0 && $role_id > User::getRoleID('Customer')) { foreach ($groups as $grp_id => $grp_name) { $assign_options["grp:{$grp_id}"] = 'Group: ' . $grp_name; } } $assign_options += $users; $tpl->assign(array('cats' => Category::getAssocList($prj_id), 'priorities' => Priority::getList($prj_id), 'severities' => Severity::getList($prj_id), 'status' => Status::getAssocStatusList($prj_id), 'users' => $assign_options, 'releases' => Release::getAssocList($prj_id, true), 'custom' => Filter::getListing($prj_id), 'custom_fields' => Custom_Field::getListByProject($prj_id, ''), 'reporters' => Project::getReporters($prj_id), 'products' => Product::getAssocList(false))); if (!empty($_GET['custom_id'])) { $check_perm = true; if (Filter::isGlobal($_GET['custom_id'])) { if ($role_id >= User::getRoleID('Manager')) { $check_perm = false; } } $options = Filter::getDetails($_GET['custom_id'], $check_perm); } else { $options = array(); $options['cst_rows'] = APP_DEFAULT_PAGER_SIZE; } $tpl->assign('options', $options); $tpl->displayTemplate();
/** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. * * @param * integer the ID of the model to be loaded * */ public function loadModel($id) { $model = Severity::model()->findByPk($id); if ($model === null) { throw new CHttpException(404, 'The requested page does not exist.'); } return $model; }
if (!empty($auto_switched_from)) { $tpl->assign(array('project_auto_switched' => 1, 'old_project' => Project::getName($auto_switched_from))); } $issue_fields_display = Issue_Field::getFieldsToDisplay($issue_id, 'view_issue'); // figure out what data to show in each column $columns = array(0 => array(), 1 => array()); if (CRM::hasCustomerIntegration($prj_id) and !empty($details['iss_customer_id'])) { $columns[0][] = array('title' => 'Customer', 'field' => 'customer_0'); $columns[1][] = array('title' => 'Customer Contract', 'field' => 'customer_1'); } $cats = Category::getList($prj_id); if (count($cats) > 0) { $columns[0][] = array('title' => ev_gettext('Category'), 'data' => $details['prc_title'], 'field' => 'category'); } $columns[0][] = array('title' => ev_gettext('Status'), 'data' => $details['sta_title'], 'data_bgcolor' => $details['status_color'], 'field' => 'status'); $severities = Severity::getList($prj_id); if (count($severities) > 0) { $columns[0][] = array('title' => ev_gettext('Severity'), 'data' => $details['sev_title'], 'field' => 'severity'); } if (!isset($issue_fields_display['priority']) || $issue_fields_display['priority'] != false) { if (isset($issue_fields_display['priority']['min_role']) && $issue_fields_display['priority']['min_role'] > User::getRoleID('Customer')) { $bgcolor = APP_INTERNAL_COLOR; } else { $bgcolor = ''; } $columns[0][] = array('title' => ev_gettext('Priority'), 'data' => $details['pri_title'], 'title_bgcolor' => $bgcolor, 'field' => 'priority'); } $releases = Release::getAssocList($prj_id); if (count($releases) > 0 && $role_id != User::getRoleID('Customer')) { $columns[0][] = array('title' => ev_gettext('Scheduled Release'), 'data' => $details['pre_title'], 'title_bgcolor' => APP_INTERNAL_COLOR); }
/** * Method used to send a diff-style notification email to the issue * subscribers about updates to its attributes. * * @param integer $issue_id The issue ID * @param array $old The old issue details * @param array $new The new issue details * @param array $updated_custom_fields An array of the custom fields that were changed. */ public static function notifyIssueUpdated($issue_id, $old, $new, $updated_custom_fields) { $prj_id = Issue::getProjectID($issue_id); $diffs = array(); if (@$new['keep_assignments'] == 'no') { if (empty($new['assignments'])) { $new['assignments'] = array(); } $assign_diff = Misc::arrayDiff($old['assigned_users'], $new['assignments']); if (count($assign_diff) > 0) { $diffs[] = '-' . ev_gettext('Assignment List') . ': ' . $old['assignments']; @($diffs[] = '+' . ev_gettext('Assignment List') . ': ' . implode(', ', User::getFullName($new['assignments']))); } } if (isset($new['expected_resolution_date']) && @$old['iss_expected_resolution_date'] != $new['expected_resolution_date']) { $diffs[] = '-' . ev_gettext('Expected Resolution Date') . ': ' . $old['iss_expected_resolution_date']; $diffs[] = '+' . ev_gettext('Expected Resolution Date') . ': ' . $new['expected_resolution_date']; } if (isset($new['category']) && $old['iss_prc_id'] != $new['category']) { $diffs[] = '-' . ev_gettext('Category') . ': ' . Category::getTitle($old['iss_prc_id']); $diffs[] = '+' . ev_gettext('Category') . ': ' . Category::getTitle($new['category']); } if (isset($new['release']) && $old['iss_pre_id'] != $new['release']) { $diffs[] = '-' . ev_gettext('Release') . ': ' . Release::getTitle($old['iss_pre_id']); $diffs[] = '+' . ev_gettext('Release') . ': ' . Release::getTitle($new['release']); } if (isset($new['priority']) && $old['iss_pri_id'] != $new['priority']) { $diffs[] = '-' . ev_gettext('Priority') . ': ' . Priority::getTitle($old['iss_pri_id']); $diffs[] = '+' . ev_gettext('Priority') . ': ' . Priority::getTitle($new['priority']); } if (isset($new['severity']) && $old['iss_sev_id'] != $new['severity']) { $diffs[] = '-' . ev_gettext('Severity') . ': ' . Severity::getTitle($old['iss_sev_id']); $diffs[] = '+' . ev_gettext('Severity') . ': ' . Severity::getTitle($new['severity']); } if (isset($new['status']) && $old['iss_sta_id'] != $new['status']) { $diffs[] = '-' . ev_gettext('Status') . ': ' . Status::getStatusTitle($old['iss_sta_id']); $diffs[] = '+' . ev_gettext('Status') . ': ' . Status::getStatusTitle($new['status']); } if (isset($new['resolution']) && $old['iss_res_id'] != $new['resolution']) { $diffs[] = '-' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($old['iss_res_id']); $diffs[] = '+' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($new['resolution']); } if (isset($new['estimated_dev_time']) && $old['iss_dev_time'] != $new['estimated_dev_time']) { $diffs[] = '-' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($old['iss_dev_time'] * 60); $diffs[] = '+' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($new['estimated_dev_time'] * 60); } if (isset($new['summary']) && $old['iss_summary'] != $new['summary']) { $diffs[] = '-' . ev_gettext('Summary') . ': ' . $old['iss_summary']; $diffs[] = '+' . ev_gettext('Summary') . ': ' . $new['summary']; } if (isset($new['percent_complete']) && $old['iss_original_percent_complete'] != $new['percent_complete']) { $diffs[] = '-' . ev_gettext('Percent complete') . ': ' . $old['iss_original_percent_complete']; $diffs[] = '+' . ev_gettext('Percent complete') . ': ' . $new['percent_complete']; } if (isset($new['description']) && $old['iss_description'] != $new['description']) { $old['iss_description'] = explode("\n", $old['iss_original_description']); $new['description'] = explode("\n", $new['description']); $diff = new Text_Diff($old['iss_description'], $new['description']); $renderer = new Text_Diff_Renderer_unified(); $desc_diff = explode("\n", trim($renderer->render($diff))); $diffs[] = 'Description:'; foreach ($desc_diff as $diff) { $diffs[] = $diff; } } $data = Issue::getDetails($issue_id); $data['diffs'] = implode("\n", $diffs); $data['updated_by'] = User::getFullName(Auth::getUserID()); $all_emails = array(); $role_emails = array(User::ROLE_VIEWER => array(), User::ROLE_REPORTER => array(), User::ROLE_CUSTOMER => array(), User::ROLE_USER => array(), User::ROLE_DEVELOPER => array(), User::ROLE_MANAGER => array(), User::ROLE_ADMINISTRATOR => array()); $users = self::getUsersByIssue($issue_id, 'updated'); foreach ($users as $user) { if (empty($user['sub_usr_id'])) { $email = $user['sub_email']; // non users are treated as "Viewers" for permission checks $role = User::ROLE_VIEWER; } else { $prefs = Prefs::get($user['sub_usr_id']); if (Auth::getUserID() == $user['sub_usr_id'] && (empty($prefs['receive_copy_of_own_action'][$prj_id]) || $prefs['receive_copy_of_own_action'][$prj_id] == false)) { continue; } $email = User::getFromHeader($user['sub_usr_id']); $role = $user['pru_role']; } // now add it to the list of emails if (!empty($email) && !in_array($email, $all_emails)) { $all_emails[] = $email; $role_emails[$role][] = $email; } } // get additional email addresses to notify $additional_emails = Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'issue_updated', array('old' => $old, 'new' => $new)); $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, User::ROLE_VIEWER)); foreach ($additional_emails as $email) { if (!in_array($email, $all_emails)) { $role_emails[User::ROLE_VIEWER][] = $email; } } // send email to each role separately due to custom field restrictions foreach ($role_emails as $role => $emails) { if (count($emails) > 0) { $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, $role)); if (!empty($data['custom_field_diffs']) || !empty($data['diffs'])) { self::notifySubscribers($issue_id, $emails, 'updated', $data, ev_gettext('Updated'), false); } } } }
// wouldn't make much sense to create a reminder for a 'Not Prioritized' // issue, so let's remove that as an option $priorities = array_flip(Priority::getAssocList($info['rem_prj_id'])); unset($priorities['Not Prioritized']); $tpl->assign('priorities', array_flip($priorities)); $tpl->assign('severities', Severity::getAssocList($info['rem_prj_id'])); $tpl->assign('products', Product::getAssocList()); } elseif (@$_GET['cat'] == 'change_rank') { Reminder::changeRank($_GET['id'], $_GET['rank']); } elseif (!empty($_GET['prj_id'])) { $tpl->assign('info', array('rem_prj_id' => $_GET['prj_id'])); $tpl->assign('issues', Reminder::getIssueAssocListByProject($_GET['prj_id'])); // wouldn't make much sense to create a reminder for a 'Not Prioritized' // issue, so let's remove that as an option $priorities = array_flip(Priority::getAssocList($_GET['prj_id'])); unset($priorities['Not Prioritized']); $tpl->assign('priorities', array_flip($priorities)); $tpl->assign('severities', Severity::getAssocList($_GET['prj_id'])); $tpl->assign('products', Product::getAssocList()); // only show customers and support levels if the selected project really needs it $project_has_customer_integration = CRM::hasCustomerIntegration($_GET['prj_id']); $tpl->assign('project_has_customer_integration', $project_has_customer_integration); if ($project_has_customer_integration) { $crm = CRM::getInstance($_GET['prj_id']); $tpl->assign('customers', $crm->getCustomerAssocList()); $tpl->assign('support_levels', $crm->getSupportLevelAssocList()); } } $tpl->assign('project_list', Project::getAll()); $tpl->assign('list', Reminder::getAdminList()); $tpl->displayTemplate();
/** * Method used to send a diff-style notification email to the issue * subscribers about updates to its attributes. * * @param integer $issue_id The issue ID * @param array $old The old issue details * @param array $new The new issue details */ public static function notifyIssueUpdated($issue_id, $old, $new) { $prj_id = Issue::getProjectID($issue_id); $diffs = array(); if (@$new['keep_assignments'] == 'no') { if (empty($new['assignments'])) { $new['assignments'] = array(); } $assign_diff = Misc::arrayDiff($old['assigned_users'], $new['assignments']); if (count($assign_diff) > 0) { $diffs[] = '-' . ev_gettext('Assignment List') . ': ' . $old['assignments']; @($diffs[] = '+' . ev_gettext('Assignment List') . ': ' . implode(', ', User::getFullName($new['assignments']))); } } if (isset($new['expected_resolution_date']) && @$old['iss_expected_resolution_date'] != $new['expected_resolution_date']) { $diffs[] = '-' . ev_gettext('Expected Resolution Date') . ': ' . $old['iss_expected_resolution_date']; $diffs[] = '+' . ev_gettext('Expected Resolution Date') . ': ' . $new['expected_resolution_date']; } if (isset($new['category']) && $old['iss_prc_id'] != $new['category']) { $diffs[] = '-' . ev_gettext('Category') . ': ' . Category::getTitle($old['iss_prc_id']); $diffs[] = '+' . ev_gettext('Category') . ': ' . Category::getTitle($new['category']); } if (isset($new['release']) && $old['iss_pre_id'] != $new['release']) { $diffs[] = '-' . ev_gettext('Release') . ': ' . Release::getTitle($old['iss_pre_id']); $diffs[] = '+' . ev_gettext('Release') . ': ' . Release::getTitle($new['release']); } if (isset($new['priority']) && $old['iss_pri_id'] != $new['priority']) { $diffs[] = '-' . ev_gettext('Priority') . ': ' . Priority::getTitle($old['iss_pri_id']); $diffs[] = '+' . ev_gettext('Priority') . ': ' . Priority::getTitle($new['priority']); } if (isset($new['severity']) && $old['iss_sev_id'] != $new['severity']) { $diffs[] = '-' . ev_gettext('Severity') . ': ' . Severity::getTitle($old['iss_sev_id']); $diffs[] = '+' . ev_gettext('Severity') . ': ' . Severity::getTitle($new['severity']); } if (isset($new['status']) && $old['iss_sta_id'] != $new['status']) { $diffs[] = '-' . ev_gettext('Status') . ': ' . Status::getStatusTitle($old['iss_sta_id']); $diffs[] = '+' . ev_gettext('Status') . ': ' . Status::getStatusTitle($new['status']); } if (isset($new['resolution']) && $old['iss_res_id'] != $new['resolution']) { $diffs[] = '-' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($old['iss_res_id']); $diffs[] = '+' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($new['resolution']); } if (isset($new['estimated_dev_time']) && $old['iss_dev_time'] != $new['estimated_dev_time']) { $diffs[] = '-' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($old['iss_dev_time'] * 60); $diffs[] = '+' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($new['estimated_dev_time'] * 60); } if (isset($new['summary']) && $old['iss_summary'] != $new['summary']) { $diffs[] = '-' . ev_gettext('Summary') . ': ' . $old['iss_summary']; $diffs[] = '+' . ev_gettext('Summary') . ': ' . $new['summary']; } if (isset($new['percent_complete']) && $old['iss_original_percent_complete'] != $new['percent_complete']) { $diffs[] = '-' . ev_gettext('Percent complete') . ': ' . $old['iss_original_percent_complete']; $diffs[] = '+' . ev_gettext('Percent complete') . ': ' . $new['percent_complete']; } if (isset($new['description']) && $old['iss_description'] != $new['description']) { $old['iss_description'] = explode("\n", $old['iss_original_description']); $new['description'] = explode("\n", $new['description']); $diff = new Text_Diff($old['iss_description'], $new['description']); $renderer = new Text_Diff_Renderer_unified(); $desc_diff = explode("\n", trim($renderer->render($diff))); $diffs[] = 'Description:'; foreach ($desc_diff as $diff) { $diffs[] = $diff; } } $emails = array(); $users = self::getUsersByIssue($issue_id, 'updated'); $user_emails = Project::getUserEmailAssocList(Issue::getProjectID($issue_id), 'active', User::getRoleID('Customer')); // FIXME: $user_emails unused $user_emails = array_map(function ($s) { return strtolower($s); }, $user_emails); foreach ($users as $user) { if (empty($user['sub_usr_id'])) { $email = $user['sub_email']; } else { $prefs = Prefs::get($user['sub_usr_id']); if (Auth::getUserID() == $user['sub_usr_id'] && (empty($prefs['receive_copy_of_own_action'][$prj_id]) || $prefs['receive_copy_of_own_action'][$prj_id] == false)) { continue; } $email = User::getFromHeader($user['sub_usr_id']); } // now add it to the list of emails if (!empty($email) && !in_array($email, $emails)) { $emails[] = $email; } } // get additional email addresses to notify $emails = array_merge($emails, Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'issue_updated', array('old' => $old, 'new' => $new))); $data = Issue::getDetails($issue_id); $data['diffs'] = implode("\n", $diffs); $data['updated_by'] = User::getFullName(Auth::getUserID()); self::notifySubscribers($issue_id, $emails, 'updated', $data, ev_gettext('Updated'), false); }
/** {@inheritdoc} */ public function __construct($message = '', $code = 0, $filename = __FILE__, $lineNo = __LINE__, array $context = array()) { $severity = Severity::fromPhpErrorNo($code); parent::__construct($message, $code, $severity, $filename, $lineNo); $this->context = $context; }