query("SELECT h.*,
tt1.tasktype_name AS task_type1,
tt2.tasktype_name AS task_type2,
los1.os_name AS operating_system1,
los2.os_name AS operating_system2,
lc1.category_name AS product_category1,
lc2.category_name AS product_category2,
p1.project_title AS project_id1,
p2.project_title AS project_id2,
lv1.version_name AS product_version1,
lv2.version_name AS product_version2,
ls1.status_name AS item_status1,
ls2.status_name AS item_status2,
lr.resolution_name,
c.date_added AS c_date_added,
c.user_id AS c_user_id,
att.orig_name
FROM {history} h
LEFT JOIN {list_tasktype} tt1 ON tt1.tasktype_id::text = h.old_value AND h.field_changed='task_type'
LEFT JOIN {list_tasktype} tt2 ON tt2.tasktype_id::text = h.new_value AND h.field_changed='task_type'
LEFT JOIN {list_os} los1 ON los1.os_id::text = h.old_value AND h.field_changed='operating_system'
LEFT JOIN {list_os} los2 ON los2.os_id::text = h.new_value AND h.field_changed='operating_system'
LEFT JOIN {list_category} lc1 ON lc1.category_id::text = h.old_value AND h.field_changed='product_category'
LEFT JOIN {list_category} lc2 ON lc2.category_id::text = h.new_value AND h.field_changed='product_category'
LEFT JOIN {list_status} ls1 ON ls1.status_id::text = h.old_value AND h.field_changed='item_status'
LEFT JOIN {list_status} ls2 ON ls2.status_id::text = h.new_value AND h.field_changed='item_status'
LEFT JOIN {list_resolution} lr ON lr.resolution_id::text = h.new_value AND h.event_type = 2
LEFT JOIN {projects} p1 ON p1.project_id::text = h.old_value AND h.field_changed='project_id'
LEFT JOIN {projects} p2 ON p2.project_id::text = h.new_value AND h.field_changed='project_id'
LEFT JOIN {comments} c ON c.comment_id::text = h.field_changed AND h.event_type = 5
LEFT JOIN {attachments} att ON att.attachment_id::text = h.new_value AND h.event_type = 7
LEFT JOIN {list_version} lv1 ON lv1.version_id::text = h.old_value
AND (h.field_changed='product_version' OR h.field_changed='closedby_version')
LEFT JOIN {list_version} lv2 ON lv2.version_id::text = h.new_value
AND (h.field_changed='product_version' OR h.field_changed='closedby_version')
WHERE h.task_id = ? $where
ORDER BY event_date ASC, history_id ASC, event_type ASC", array($task_id));
}
/**
* XXX: A mess,remove my in 1.0. No time for that, sorry.
*/
function event_description($history) {
$return = '';
global $fs, $baseurl, $details, $proj;
$translate = array('item_summary' => 'summary', 'project_id' => 'attachedtoproject',
'task_type' => 'tasktype', 'product_category' => 'category', 'item_status' => 'status',
'task_priority' => 'priority', 'operating_system' => 'operatingsystem', 'task_severity' => 'severity',
'product_version' => 'reportedversion', 'mark_private' => 'visibility',
'estimated_effort' => 'estimatedeffort');
// if somehing gets double escaped, add it here.
$noescape = array('new_value', 'old_value');
foreach($history as $key=> $value) {
if(!in_array($key, $noescape)) {
$history[$key] = Filters::noXSS($value);
}
}
$new_value = $history['new_value'];
$old_value = $history['old_value'];
switch($history['event_type']) {
case '3': //Field changed
if (!$new_value && !$old_value) {
$return .= eL('taskedited');
break;
}
$field = $history['field_changed'];
switch ($field) {
case 'item_summary':
case 'project_id':
case 'task_type':
case 'product_category':
case 'item_status':
case 'task_priority':
case 'operating_system':
case 'task_severity':
case 'product_version':
if($field == 'task_priority') {
$old_value = $fs->priorities[$old_value];
$new_value = $fs->priorities[$new_value];
} elseif($field == 'task_severity') {
$old_value = $fs->severities[$old_value];
$new_value = $fs->severities[$new_value];
} elseif($field == 'item_summary') {
$old_value = Filters::noXSS($old_value);
$new_value = Filters::noXSS($new_value);
} else {
$old_value = $history[$field . '1'];
$new_value = $history[$field . '2'];
}
$field = eL($translate[$field]);
break;
case 'closedby_version':
$field = eL('dueinversion');
$old_value = ($old_value == '0') ? eL('undecided') : $history['product_version1'];
$new_value = ($new_value == '0') ? eL('undecided') : $history['product_version2'];
break;
case 'due_date':
$field = eL('duedate');
$old_value = formatDate($old_value, false, eL('undecided'));
$new_value = formatDate($new_value, false, eL('undecided'));
break;
case 'percent_complete':
$field = eL('percentcomplete');
$old_value .= '%';
$new_value .= '%';
break;
case 'mark_private':
$field = eL($translate[$field]);
if ($old_value == 1) {
$old_value = eL('private');
} else {
$old_value = eL('public');
}
if ($new_value == 1) {
$new_value = eL('private');
} else {
$new_value = eL('public');
}
break;
case 'detailed_desc':
$field = "" . eL('details') . '';
if (!empty($details)) {
$details_previous = TextFormatter::render($old_value);
$details_new = TextFormatter::render($new_value);
}
$old_value = '';
$new_value = '';
break;
case 'estimated_effort':
$field = eL($translate[$field]);
$old_value = effort::secondsToString($old_value, $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);
$new_value = effort::secondsToString($new_value, $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);;
break;
}
$return .= eL('fieldchanged').": {$field}";
if ($old_value || $new_value) {
$return .= " ({$old_value} → {$new_value})";
}
break;
case '1': //Task opened
$return .= eL('taskopened');
break;
case '2': //Task closed
$return .= eL('taskclosed');
$return .= " ({$history['resolution_name']}";
if (!empty($old_value)) {
$return .= ': ' . TextFormatter::render($old_value, true);
}
$return .= ')';
break;
case '4': //Comment added
$return .= '' . eL('commentadded') . '';
break;
case '5': //Comment edited
$return .= "".eL('commentedited')."";
if ($history['c_date_added']) {
$return .= " (".eL('commentby').' ' . tpl_userlink($history['c_user_id']) . " - " . formatDate($history['c_date_added'], true) . ")";
}
if ($details) {
$details_previous = TextFormatter::render($old_value);
$details_new = TextFormatter::render($new_value);
}
break;
case '6': //Comment deleted
$return .= "".eL('commentdeleted')."";
if ($new_value != '' && $history['field_changed'] != '') {
$return .= " (". eL('commentby'). ' ' . tpl_userlink($new_value) . " - " . formatDate($history['field_changed'], true) . ")";
}
if (!empty($details)) {
$details_previous = TextFormatter::render($old_value);
$details_new = '';
}
break;
case '7': //Attachment added
$return .= eL('attachmentadded');
if ($history['orig_name']) {
$return .= ": ' . "{$history['orig_name']}";
} else if ($history['old_value']) {
$return .= ': ' . $history['old_value'];
}
break;
case '8': //Attachment deleted
$return .= eL('attachmentdeleted') . ': ' . Filters::noXSS($new_value);
break;
case '9': //Notification added
$return .= eL('notificationadded') . ': ' . tpl_userlink($new_value);
break;
case '10': //Notification deleted
$return .= eL('notificationdeleted') . ': ' . tpl_userlink($new_value);
break;
case '11': //Related task added
$return .= eL('relatedadded') . ': ' . tpl_tasklink($new_value);
break;
case '12': //Related task deleted
$return .= eL('relateddeleted') . ': ' . tpl_tasklink($new_value);
break;
case '13': //Task reopened
$return .= eL('taskreopened');
break;
case '14': //Task assigned
if (empty($old_value)) {
$users = explode(' ', trim($new_value));
$users = array_map('tpl_userlink', $users);
$return .= eL('taskassigned').' ';
$return .= implode(', ', $users);
} elseif (empty($new_value)) {
$return .= eL('assignmentremoved');
} else {
$users = explode(' ', trim($new_value));
$users = array_map('tpl_userlink', $users);
$return .= eL('taskreassigned').' ';
$return .= implode(', ', $users);
}
break;
// Mentioned in docs, not used anywhere. Will implement if suitable
// translations already exist, otherwise leave to 1.1. (Found translations)
case '15': // This task was added to another task's related list
$return .= eL('addedasrelated') . ': ' . tpl_tasklink($new_value);
break;
case '16': // This task was removed from another task's related list
$return .= eL('deletedasrelated') . ': ' . tpl_tasklink($new_value);
break;
case '17': //Reminder added
$return .= eL('reminderadded') . ': ' . tpl_userlink($new_value);
break;
case '18': //Reminder deleted
$return .= eL('reminderdeleted') . ': ' . tpl_userlink($new_value);
break;
case '19': //User took ownership
$return .= eL('ownershiptaken') . ': ' . tpl_userlink($new_value);
break;
case '20': //User requested task closure
$return .= eL('closerequestmade') . ' - ' . $new_value;
break;
case '21': //User requested task
$return .= eL('reopenrequestmade') . ' - ' . $new_value;
break;
case '22': // Dependency added
$return .= eL('depadded') . ': ' . tpl_tasklink($new_value);
break;
case '23': // Dependency added to other task
$return .= eL('depaddedother') . ': ' . tpl_tasklink($new_value);
break;
case '24': // Dependency removed
$return .= eL('depremoved') . ': ' . tpl_tasklink($new_value);
break;
case '25': // Dependency removed from other task
$return .= eL('depremovedother') . ': ' . tpl_tasklink($new_value);
break;
// 26 and 27 replaced by 0 (mark_private)
case '28': // PM request denied
$return .= eL('pmreqdenied') . ' - ' . $new_value;
break;
case '29': // User added to assignees list
$return .= eL('addedtoassignees');
break;
case '30': // user created
$return .= eL('usercreated');
break;
case '31': // user deleted
$return .= eL('userdeleted');
break;
case '32': // Subtask added
$return .= eL('subtaskadded') . ' ' . tpl_tasklink($new_value);
break;
case '33': // Subtask removed
$return .= eL('subtaskremoved') . ' ' . tpl_tasklink($new_value);
break;
case '34': // supertask added
$return .= eL('supertaskadded') . ' ' . tpl_tasklink($new_value);
break;
case '35': // supertask removed
$return .= eL('supertaskremoved') . ' ' . tpl_tasklink($new_value);
break;
}
if (isset($details_previous)) $GLOBALS['details_previous'] = $details_previous;
if (isset($details_new)) $GLOBALS['details_new'] = $details_new;
return $return;
}
?>