00001 <?php
00002 # This file is part of the Savane project
00003 # <http://gna.org/projects/savane/>
00004 #
00005 # $Id: format.php 5496 2006-02-25 13:54:21Z toddy $
00006 #
00007 # Copyright 1999-2000 (c) The SourceForge Crew
00008 # Copyright 2001-2002 (c) Laurent Julliard, CodeX Team, Xerox
00009 #
00010 # Copyright 2003-2006 (c) Mathieu Roy <yeupou--gnu.org>
00011 # Yves Perrin <yves.perrin--cern.ch>
00012 #
00013 # The Savane project is free software; you can redistribute it and/or
00014 # modify it under the terms of the GNU General Public License
00015 # as published by the Free Software Foundation; either version 2
00016 # of the License, or (at your option) any later version.
00017 #
00018 # The Savane project is distributed in the hope that it will be useful,
00019 # but WITHOUT ANY WARRANTY; without even the implied warranty of
00020 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00021 # GNU General Public License for more details.
00022 #
00023 # You should have received a copy of the GNU General Public License
00024 # along with the Savane project; if not, write to the Free Software
00025 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
00026
00027
00028 function format_item_details ($item_id, $group_id, $ascii=false, $item_assigned_to=false,$quoted=false)
00029 {
00030 ## ASCII must not be translated
00031
00032
00033 # Format the details rows from trackers_history
00034 global $sys_datefmt;
00035
00036 if (!$ascii && user_get_preference("reverse_comments_order"))
00037 { $result = trackers_data_get_followups($item_id, false); }
00038 else
00039 { $result=trackers_data_get_followups($item_id); }
00040 $rows=db_numrows($result);
00041
00042 # No followup comment -> return now
00043 if ($rows <= 0)
00044 {
00045 if ($ascii)
00046 $out = "";
00047 else
00048 $out = '<span class="warn">'._("No Followups Have Been Posted").'</span>';
00049 return $out;
00050 }
00051
00052 # Header first
00053 if ($ascii)
00054 {
00055 $out .= " _______________________________________________________\n\nFollow-up Comments:\n\n";
00056 }
00057 else
00058 {
00059 $title_arr=array();
00060 $title_arr[]=_("Comment");
00061 $title_arr[]=_("Posted By");
00062
00063 $out .= html_build_list_table_top ($title_arr);
00064 }
00065
00066 # Loop throuh the follow-up comments and format them
00067 for ($i=0; $i < $rows; $i++)
00068 {
00069
00070 $comment_type = db_result($result, $i, 'comment_type');
00071 if ($comment_type == 'None')
00072 { $comment_type = ''; }
00073 else
00074 { $comment_type = '['.$comment_type.']'; }
00075
00076 if ($ascii)
00077 {
00078 $fmt = "\n-------------------------------------------------------\n".
00079 "Date: %-30sBy: %s\n";
00080 if ($comment_type)
00081 { $fmt .= "%s\n%s"; }
00082 else
00083 { $fmt .= "%s%s"; }
00084 $fmt .= "\n";
00085 }
00086
00087 # I wish we had sprintf argument swapping in PHP3 but
00088 # we dont so do it the ugly way...
00089 if ($ascii)
00090 {
00091 if (db_result($result, $i, 'realname'))
00092 {
00093 $name = db_result($result, $i, 'realname')." <".db_result($result, $i, 'user_name').">";
00094 }
00095 else
00096 {
00097 $name = "Anonymous"; # must no be translated, part of mails notifs
00098 }
00099 $out .= sprintf($fmt,
00100 format_date($sys_datefmt,db_result($result, $i, 'date')),
00101 $name,
00102 $comment_type,
00103 utils_unconvert_htmlspecialchars(db_result($result, $i, 'old_value'))
00104 );
00105 }
00106 else
00107 {
00108 if ($comment_type)
00109 {
00110 # put the comment type in strong
00111 $comment_type = '<strong>'.$comment_type.'</strong><br />';
00112 }
00113
00114 if (!user_get_preference("reverse_comments_order"))
00115 {
00116 $comment_number = ($rows-$i);
00117 }
00118 else
00119 {
00120 $comment_number = ($i+1);
00121 }
00122
00123 $class = utils_get_alt_row_color($i);
00124 unset($icon, $assignee);
00125
00126 # Find out the user id of the comment author
00127 $poster_id = user_getid(db_result($result, $i, 'user_name'));
00128
00129 # Ignore user 100 (anonymous)
00130 if ($poster_id != 100)
00131 {
00132
00133 # Cosmetics if the user is assignee
00134 if ($item_assigned_to == db_result($result, $i, 'user_name'))
00135 {
00136 # Highlight the latest comment of the assignee
00137 if ($previous != 1)
00138 {
00139 $class = "boxhighlight";
00140 $previous = 1;
00141 }
00142
00143 $assignee = 1;
00144 }
00145
00146 # Cosmetics if the user is project member (we wont go as far
00147 # as presenting a different icon for specific roles, like
00148 # manager etc..
00149
00150 if (member_check($poster_id, $group_id, 'A'))
00151 {
00152 # Project admin case: if the group is the admin group,
00153 # show the specific site admin icon
00154 if ($group_id == $GLOBALS[sys_group_id])
00155 {
00156 $icon = "site-admin";
00157 $icon_alt = _("Site Administrator");
00158 }
00159 else
00160 {
00161 $icon = "project-admin";
00162 $icon_alt = _("Project Administrator");
00163 }
00164 }
00165 elseif (member_check($poster_id, $group_id))
00166 {
00167 # Simple project member
00168 $icon = "project-member";
00169 $icon_alt = _("Project Member");
00170 }
00171 }
00172
00173 if (! $quoted)
00174 {
00175 $text_to_markup = db_result($result, $i, 'old_value');
00176 }
00177 else
00178 {
00179 $text_to_markup = str_replace("\n", "> ",
00180 wordwrap("\n".db_result($result, $i, 'old_value'), 78, "\r\n"));
00181 }
00182
00183 $out .= "\n".'<tr class="'.$class.'"><td valign="top">';
00184 $out .= '<a name="comment'.$comment_number.'" href="#comment'.$comment_number.'" class="preinput">';
00185 $out .= format_date($sys_datefmt,db_result($result, $i, 'date'));
00186 $out .= ', '.sprintf(_("comment #%s:"), $comment_number).'</a>'.$comment_type;
00187 $out .= utils_rich_markup($text_to_markup).'</td>';
00188 $out .= '<td valign="top" align="center">'.utils_user_link(db_result($result, $i, 'user_name'),db_result($result, $i, 'realname'));
00189
00190 if ($icon)
00191 {
00192 $out .= '<br /><span class="help" title="'.$icon_alt.'"><img src="'.$GLOBALS['sys_home'].'images/'.SV_THEME.'.theme/'.$icon.'.png" alt="'.$icon_alt.'" /></span>';
00193 }
00194
00195 if ($assignee)
00196 {
00197 $out .= '<span class="help" title="'._("In charge of this item.").'"><img src="'.$GLOBALS['sys_home'].'images/'.SV_THEME.'.theme/assignee.png" alt="'._("In charge of this item.").'" /></span>';
00198 }
00199
00200 $out .= '</td></tr>';
00201
00202 }
00203 }
00204
00205 # final touch...
00206 $out .= ($ascii ? "\n\n\n" : "</table>");
00207
00208 return($out);
00209 }
00210
00211
00212
00213 function format_item_changes ($changes,$item_id,$group_id)
00214 {
00215
00216
00217 # ASCII must not be translated
00218
00219 global $sys_datefmt;
00220
00221 # FIXME: strange, with %25s it does not behave exactly like
00222 # trackers_field_label_display
00223 $fmt = "%24s: %23s => %-23s\n";
00224
00225 $separator = "\n _______________________________________________________\n\n";
00226
00227 # Process most of the fields
00228 reset($changes);
00229 while (list($field,$h) = each($changes))
00230 {
00231
00232 # If both removed and added items are empty skip - Sanity check
00233 if (!$h['del'] && !$h['add'])
00234 { continue; }
00235
00236 if ($field == "details" || $field == "attach")
00237 { continue; }
00238
00239 # Since details is used for followups (creepy!), we are forced to play
00240 # with "realdetails" non existant field.
00241 if ($field == "realdetails")
00242 { $field = "details"; }
00243
00244 $label = trackers_data_get_label($field);
00245 if (!$label)
00246 { $label = $field; }
00247 $out .= sprintf($fmt, $label, $h['del'],$h['add']);
00248 }
00249
00250 if ($out)
00251 {
00252 $out = "Update of ".utils_get_tracker_prefix(ARTIFACT)." #".$item_id." (project ".group_getunixname($group_id)."):\n\n".$out;
00253 }
00254
00255
00256 # Process special cases: follow-up comments
00257 if ($changes['details'])
00258 {
00259
00260 if ($out)
00261 { $out .= $separator; }
00262
00263 $out_com = "Follow-up Comment #".db_numrows(trackers_data_get_followups($item_id));
00264 if (!$out)
00265 {
00266 $out_com .= ", ".utils_get_tracker_prefix(ARTIFACT)." #".$item_id." (project ".group_getunixname($group_id).")";
00267 }
00268
00269 $out_com .= ":\n\n";
00270 if ($changes['details']['type'] != 'None' && $changes['details']['type'] != '(Error - Not Found)')
00271 {
00272 $out_com .= '['.$changes['details']['type']."]\n";
00273 }
00274 $out_com .= utils_unconvert_htmlspecialchars($changes['details']['add']);
00275 unset($changes['details']);
00276
00277 $out .= $out_com;
00278 }
00279
00280
00281 # Process special cases: file attachment
00282 if ($changes['attach'])
00283 {
00284 if ($out)
00285 { $out .= $separator; }
00286
00287 $out_att = "Additional Item Attachment";
00288 if (!$out)
00289 {
00290 $out_att .= ", ".utils_get_tracker_prefix(ARTIFACT)." #".$item_id." (project ".group_getunixname($group_id).")";
00291 }
00292 $out_att .= ":\n\n";
00293 $out_att .= sprintf("File name: %-30s Size:%d KB\n",$changes['attach']['name'],
00294 intval($changes['attach']['size']/1024) );
00295 $out_att .= $changes['attach']['description']."\n".'<'.$changes['attach']['href'].'>';
00296 unset($changes['attach']);
00297
00298 $out .= $out_att;
00299 }
00300
00301 return $out;
00302
00303 }
00304
00305
00306 function format_item_attached_files ($item_id,$group_id,$ascii=false,$sober=false)
00307 {
00308
00309 global $sys_datefmt, $HTML;
00310
00311 # ASCII must not be translated
00312
00313 if (!$sober)
00314 {
00315 $result=trackers_data_get_attached_files($item_id);
00316 }
00317 else
00318 {
00319 # In sober output, we assume that files are interesting in their
00320 # chronological order.
00321 # For instance, on the cookbook, if screenshots are provided, the author
00322 # of the item is likely to have posted them in the order of their use.
00323 # On the other hand, on non-sober output, what matters is the latest
00324 # submitted item.
00325 $result=trackers_data_get_attached_files($item_id, 'ASC');
00326 }
00327 $rows=db_numrows($result);
00328
00329 # No file attached -> return now
00330 if ($rows <= 0)
00331 {
00332 if ($ascii)
00333 $out = "";
00334 else
00335 $out = '<span class="warn">'._("No files currently attached").'</span>';
00336 return $out;
00337 }
00338
00339 # Header first
00340 if ($ascii)
00341 {
00342 $out .= " _______________________________________________________\n\nFile Attachments:\n\n";
00343 }
00344 else
00345 {
00346 if (!$sober)
00347 {
00348 $out .= $HTML->box_top(_("Attached Files"),'',1);
00349 }
00350 }
00351
00352 # Determine what the print out format is based on output type (Ascii, HTML
00353 if ($ascii)
00354 {
00355 $fmt = "\n-------------------------------------------------------\n".
00356 "Date: %s Name: %s Size: %s By: %s\n%s\n%s";
00357 }
00358
00359 # Loop throuh the attached files and format them
00360 for ($i=0; $i < $rows; $i++)
00361 {
00362
00363 $item_file_id = db_result($result, $i, 'file_id');
00364 if ($ascii)
00365 {
00366 $href = $GLOBALS['sys_home'].ARTIFACT."/download.php?file_id=$item_file_id";
00367 }
00368 else
00369 {
00370 $href = $GLOBALS['sys_home'].ARTIFACT."/download.php?file_id=$item_file_id";
00371 }
00372
00373 if ($ascii)
00374 {
00375 $out .= sprintf($fmt,
00376 format_date($sys_datefmt,db_result($result, $i, 'date')),
00377 db_result($result, $i, 'filename'),
00378 utils_filesize(0, intval(db_result($result, $i, 'filesize'))),
00379 db_result($result, $i, 'user_name'),
00380 db_result($result, $i, 'description'),
00381 '<http:
00382 }
00383 else
00384 {
00385 unset($html_delete);
00386 if (member_check(0,$group_id,member_create_tracker_flag(ARTIFACT).'2') && !$sober)
00387 {
00388 $html_delete = '<span class="trash"><a href="'.$PHP_SELF.'?func=delete_file&item_id='.$item_id.'&item_file_id='.$item_file_id.'">'.
00389 '<img src="'.$GLOBALS['sys_home'].'images/'.SV_THEME.'.theme/trash.png" class="icon" alt="'._("Delete").'" /></a></span>';
00390 }
00391
00392
00393 if (!$sober)
00394 {
00395 $out .= '<div class="'.utils_get_alt_row_color($i).'">'.$html_delete;
00396 }
00397 else
00398 {
00399 $out .= '<div> - ';
00400 }
00401
00402 $out .= '<a href="'.$href.'">file #'.$item_file_id.'</a>'._(": ").' ';
00403
00404 if (!$sober)
00405 {
00406 $out .= sprintf(_('%s added by %s'), '<a href="'.$href.'">'.db_result($result, $i, 'filename').'</a>', utils_user_link(db_result($result, $i, 'user_name')));
00407 }
00408 else
00409 {
00410 $out .= '<a href="'.$href.'">'.db_result($result, $i, 'filename').'</a>';
00411 }
00412
00413 $out .= ' <span class="smaller">('.utils_filesize(0, intval(db_result($result, $i, 'filesize')));
00414
00415 if (db_result($result, $i, 'filetype'))
00416 {
00417 $out .= ' - '.db_result($result, $i, 'filetype');
00418 }
00419
00420 if (db_result($result, $i, 'description'))
00421 {
00422 $out .= ' - '
00423 .utils_basic_markup(db_result($result, $i, 'description'));
00424 }
00425 $out .= ')</span></div>';
00426 }
00427 }
00428
00429 # final touch...
00430
00431 if ($ascii || $sober)
00432 {
00433 $out .= "\n";
00434 }
00435 else
00436 {
00437 $out .= $HTML->box_bottom(1);
00438 }
00439
00440 return($out);
00441
00442 }
00443
00444
00445
00446 function format_item_cc_list ($item_id,$group_id, $ascii=false)
00447 {
00448 # ASCII must not be translated
00449 global $sys_datefmt, $HTML;
00450
00451
00452
00453
00454
00455 $result=trackers_data_get_cc_list($item_id);
00456 $rows=db_numrows($result);
00457
00458 # No file attached -> return now
00459 if ($rows <= 0)
00460 {
00461 if ($ascii)
00462 {
00463 $out .= "";
00464 }
00465 else
00466 {
00467 $out = '<span class="warn">'._("CC list is empty").'</span>';
00468 }
00469 return $out;
00470 }
00471
00472 # Header first an determine what the print out format is
00473 # based on output type (Ascii, HTML)
00474 if ($ascii)
00475 {
00476 $out .= " _______________________________________________________\n\n"."Carbon-Copy List:\n\n";
00477 $fmt = "%-35s | %s\n";
00478 $out .= sprintf($fmt, 'CC Address', 'Comment');
00479 $out .= "------------------------------------+-----------------------------\n";
00480 }
00481 else
00482 {
00483 $out .= $HTML->box_top(_("Carbon-Copy List"),'',1);
00484 }
00485
00486 # Loop through the cc and format them
00487 for ($i=0; $i < $rows; $i++)
00488 {
00489
00490 if ($ascii)
00491 {
00492 # We wont provide the CC address in the mail, we keep that
00493 # information only on the web interface
00494 $email = "Available only the item webpage";
00495 }
00496 else
00497 {
00498 $email = utils_email(db_result($result, $i, 'email'));
00499 }
00500 $item_cc_id = db_result($result, $i, 'bug_cc_id');
00501
00502 # If the CC is a user point to its user page.
00503 # Do not build mailto, we do not need to help spammers.
00504 $res_username = user_get_result_set_from_unix($email);
00505 if ($res_username && (db_numrows($res_username) == 1))
00506 { $href_cc = utils_user_link($email); }
00507 else
00508 { $href_cc = $email; }
00509
00510 if ($ascii)
00511 {
00512 $out .= sprintf($fmt, $email, db_result($result, $i, 'comment'));
00513 }
00514 else
00515 {
00516
00517 # show CC delete icon if one of the condition is met:
00518 # a) current user is a tracker manager
00519 # b) then CC name is the current user
00520 # c) the CC email address matches the one of the current user
00521 # d) the current user is the person who added a given name in CC list
00522 if (member_check(0,$group_id,member_create_tracker_flag(ARTIFACT).'2') ||
00523 (user_getname(user_getid()) == $email) ||
00524 (user_getemail(user_getid()) == $email) ||
00525 (user_getname(user_getid()) == db_result($result, $i, 'user_name') ))
00526 {
00527 $html_delete = '<span class="trash"><a href="'.$PHP_SELF.'?func=delete_cc&item_id='.$item_id.'&item_cc_id='.$item_cc_id.'">'.
00528 '<img src="'.$GLOBALS['sys_home'].'images/'.SV_THEME.'.theme/trash.png" class="icon" alt="'._("Delete").'" /></a></span>';
00529 }
00530 else
00531 {
00532 $html_delete = '';
00533 }
00534
00535 $out .= '<li class="'.utils_get_alt_row_color($i).'">'.$html_delete.
00536 sprintf(_('%s added by %s'), $email, utils_user_link(db_result($result, $i, 'user_name')));
00537 if (db_result($result, $i, 'comment'))
00538 {
00539 $out .= ' <span class="smaller">('.utils_basic_markup(db_result($result, $i, 'comment')).')</span>';
00540 }
00541
00542 #$href_cc,
00543 # format_date($sys_datefmt,db_result($result, $i, 'date')),
00544 # $html_delete);
00545 }
00546 }
00547
00548 # final touch...
00549 $out .= ($ascii ? "\n" : $HTML->box_bottom(1));
00550
00551 return($out);
00552
00553 }
00554
00555 ?>