2008-07-25 08:26:05 +00:00
< ? php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2008 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
2008-11-14 14:41:51 +00:00
Pluf :: loadFunction ( 'Pluf_HTTP_URL_urlForView' );
2008-07-25 08:26:05 +00:00
/**
* Base definition of an issue .
*
* An issue can have labels , comments , can be starred by people .
*/
class IDF_Issue extends Pluf_Model
{
public $_model = __CLASS__ ;
function init ()
{
$this -> _a [ 'table' ] = 'idf_issues' ;
$this -> _a [ 'model' ] = __CLASS__ ;
$this -> _a [ 'cols' ] = array (
// It is mandatory to have an "id" column.
'id' =>
array (
'type' => 'Pluf_DB_Field_Sequence' ,
'blank' => true ,
),
'project' =>
array (
'type' => 'Pluf_DB_Field_Foreignkey' ,
'model' => 'IDF_Project' ,
'blank' => false ,
'verbose' => __ ( 'project' ),
'relate_name' => 'issues' ,
),
'summary' =>
array (
'type' => 'Pluf_DB_Field_Varchar' ,
'blank' => false ,
'size' => 250 ,
'verbose' => __ ( 'summary' ),
),
'submitter' =>
array (
'type' => 'Pluf_DB_Field_Foreignkey' ,
'model' => 'Pluf_User' ,
'blank' => false ,
'verbose' => __ ( 'submitter' ),
'relate_name' => 'submitted_issue' ,
),
'owner' =>
array (
'type' => 'Pluf_DB_Field_Foreignkey' ,
'model' => 'Pluf_User' ,
'blank' => true , // no owner when submitted.
'is_null' => true ,
'verbose' => __ ( 'owner' ),
'relate_name' => 'owned_issue' ,
),
'interested' =>
array (
'type' => 'Pluf_DB_Field_Manytomany' ,
'model' => 'Pluf_User' ,
'blank' => true ,
'verbose' => __ ( 'interested users' ),
'help_text' => __ ( 'Interested users will get an email notification when the issue is changed.' ),
),
'tags' =>
array (
'type' => 'Pluf_DB_Field_Manytomany' ,
'blank' => true ,
'model' => 'IDF_Tag' ,
'verbose' => __ ( 'labels' ),
),
'status' =>
array (
'type' => 'Pluf_DB_Field_Foreignkey' ,
'blank' => false ,
'model' => 'IDF_Tag' ,
'verbose' => __ ( 'status' ),
),
'creation_dtime' =>
array (
'type' => 'Pluf_DB_Field_Datetime' ,
'blank' => true ,
'verbose' => __ ( 'creation date' ),
),
'modif_dtime' =>
array (
'type' => 'Pluf_DB_Field_Datetime' ,
'blank' => true ,
'verbose' => __ ( 'modification date' ),
),
);
$this -> _a [ 'idx' ] = array (
'modif_dtime_idx' =>
array (
'col' => 'modif_dtime' ,
'type' => 'normal' ,
),
);
$table = $this -> _con -> pfx . 'idf_issue_idf_tag_assoc' ;
$this -> _a [ 'views' ] = array (
'join_tags' =>
array (
'join' => 'LEFT JOIN ' . $table
. ' ON idf_issue_id=id' ,
),
);
}
function __toString ()
{
return $this -> id . ' - ' . $this -> summary ;
}
function _toIndex ()
{
2008-08-13 16:26:36 +00:00
$r = array ();
foreach ( $this -> get_comments_list () as $c ) {
$r [] = $c -> _toIndex ();
}
$str = str_repeat ( $this -> summary . ' ' , 4 ) . ' ' . implode ( ' ' , $r );
return Pluf_Text :: cleanString ( html_entity_decode ( $str , ENT_QUOTES , 'UTF-8' ));
2008-07-25 08:26:05 +00:00
}
2008-08-07 21:12:24 +00:00
function preSave ( $create = false )
2008-07-25 08:26:05 +00:00
{
if ( $this -> id == '' ) {
$this -> creation_dtime = gmdate ( 'Y-m-d H:i:s' );
}
$this -> modif_dtime = gmdate ( 'Y-m-d H:i:s' );
}
2008-08-07 21:12:24 +00:00
function postSave ( $create = false )
2008-07-25 08:26:05 +00:00
{
2008-08-13 19:28:42 +00:00
IDF_Search :: index ( $this );
2008-11-14 14:41:51 +00:00
if ( $create ) {
IDF_Timeline :: insert ( $this , $this -> get_project (),
$this -> get_submitter ());
}
}
/**
* Returns an HTML fragment used to display this issue in the
* timeline .
*
* The request object is given to be able to check the rights and
* as such create links to other items etc . You can consider that
* if displayed , you can create a link to it .
*
* @ param Pluf_HTTP_Request
* @ return Pluf_Template_SafeString
*/
public function timelineFragment ( $request )
{
$submitter = $this -> get_submitter ();
$ic = ( in_array ( $this -> status , $request -> project -> getTagIdsByStatus ( 'closed' ))) ? 'issue-c' : 'issue-o' ;
$url = Pluf_HTTP_URL_urlForView ( 'IDF_Views_Issue::view' ,
array ( $request -> project -> shortname ,
$this -> id ));
return Pluf_Template :: markSafe ( sprintf ( __ ( '<a href="%1$s" class="%2$s" title="View issue">Issue %3$d</a> <em>%4$s</em> created by %5$s' ), $url , $ic , $this -> id , Pluf_esc ( $this -> summary ), Pluf_esc ( $submitter )));
2008-07-25 08:26:05 +00:00
}
}