Définir un workflow par catégorie de ticket dans Mantis Bug Tracker

Cet article explique comment définir un workflow de validation différent en fonction de la catégorie d’un ticket dans la solution Mantis Bug Tracker (tests réalisés en version 2.25.2).

Dans un premier temps, créer un nouveau fichier nommé « custom_api.php » dans le dossier « core » avec le contenu suivant afin de définir une nouvelle méthode pour récupérer le nom de la catégorie en fonction du numéro de ticket :

				
					<?php

/** Get Category_ID of currently opened BUG
* @param int p_bug_id
*/
function bug_get_category_ID( $p_bug_id ) {
    db_param_push();
	$t_query = 'SELECT category_id
				  FROM {bug}
				  WHERE bug_text_id='. db_param();

	$result = db_query( $t_query, array( $p_bug_id ), 1 );
	$row = db_result( $result );

	if( false === $row ) {
		return false;
	} else {
		return $row;
	}
}
?>
				
			

Editez maintenant le fichier « config/config_inc.php » et ajoutez le contenu suivant pour avoir 3 workflow :

  1. le premier pour les évolutions « feature »
  2. le second pour les anomalies « bug »
  3. un dernier pour tout le reste

Vous pouvez changer les valeurs « feature » et « bug » à la fin des variables « $g_status_enum_workflow_ » en fonction du nom exact de vos catégories.

				
					$g_status_enum_string = '10:new,20:feedback,30:acknowledged,40:confirmed,50:assigned,80:resolved,90:closed';

$g_status_enum_workflow_feature = array (
  10 => '20:assigned',
  20 => '40:confirmed,30:acknowledged,50:assigned,80:resolved,90:closed',
  30 => '20:assigned',
  40 => '50:assigned,20:assigned,30:acknowledged,90:closed',
  50 => '80:resolved,20:assigned,40:confirmed',
  80 => '90:closed',
  90 => '20:assigned,10:new',
);

$g_status_enum_workflow_bug = array (
  10 => '20:assigned',
  20 => '90:closed,10:new',
  90 => '20:assignedg',
);

$g_status_enum_workflow_default = array (
  10 => '20:assigned',
  20 => '40:confirmed,30:acknowledged,50:assigned,80:resolved,90:closed',
  30 => '20:assigned',
  40 => '50:assigned,20:assigned,30:acknowledged,90:closed',
  50 => '80:Rechnungsstellung,20:in Bearbeitung,90:closed',
  80 => '90:closed',
  90 => '20:assigned,10:new',
);
				
			

Maintenant qu’on a les outils pour bien faire, on peut les utiliser là où il faut. 

Editez le fichier  « core/print_api.php » et ajoutez l’import du fichier « custom_api.php » en haut du fichier :

				
					require_api( 'custom_api.php' );
				
			

Toujours dans le fichier « core/print_api.php », modifiez  le début de la méthode « get_status_option_list » par le contenu suivant afin de rechercher le bon workflow définit dans le fichier « config/config_inc.php » :

				
					function get_status_option_list( $p_user_auth = 0, $p_current_value = 0, $p_show_current = true, $p_add_close = false, $p_project_id = ALL_PROJECTS, $bug_id = 0 ) {

	$t_config_var_value = config_get( 'status_enum_string', null, null, $p_project_id );

	if (config_get( 'status_enum_workflow_' . category_get_name( bug_get_category_ID( $bug_id ))  , null, null, $p_project_id ) != null) {
		$t_enum_workflow = config_get( 'status_enum_workflow_' . category_get_name( bug_get_category_ID( $bug_id )), null, null, $p_project_id );
	} else {
		$t_enum_workflow = config_get( 'status_enum_workflow_default', null, null, $p_project_id );
	}

	if( count( $t_enum_workflow ) < 1 /*..... */
				
			

Toujours dans le fichier « core/print_api.php », modifiez  le début de la méthode « print_status_option_list » par le contenu suivant afin d’ajouter un nouveau paramètre :

				
					function print_status_option_list( $p_select_label, $p_current_value = 0, $p_allow_close = false, $p_project_id = ALL_PROJECTS, $p_bug_id = 0 ) {
	
	$t_current_auth = access_get_project_level( $p_project_id );

	$t_enum_list = get_status_option_list( $t_current_auth, $p_current_value, true, $p_allow_close, $p_project_id, $p_bug_id );

/* .....*/
				
			

Editez maintenant le fichier « bug_view_inc.php » et recherchez l’appel de la méthode « get_status_option_list » afin d’ajoutez le paramètre supplémentaire du numéro de ticket :

				
					/* ... */
function bug_view_button_bug_change_status( BugData $p_bug ) {
	$t_current_access = access_get_project_level( $p_bug->project_id );

	$t_enum_list = get_status_option_list(
		$t_current_access,
		$p_bug->status,
		false,
		# Add close if user is bug's reporter, still has rights to report issues
		# (to prevent users downgraded to viewers from updating issues) and
		# reporters are allowed to close their own issues
		(  bug_is_user_reporter( $p_bug->id, auth_get_current_user_id() )
		&& access_has_bug_level( config_get( 'report_bug_threshold' ), $p_bug->id )
		&& ON == config_get( 'allow_reporter_close' )
		),
		$p_bug->project_id,
		$p_bug->id );

/* ... */
				
			

On fait la même chose dans le fichier « bug_report_page.php » :

				
					/* ... */
	$t_resolution_options = get_status_option_list(
		access_get_project_level( $t_project_id ),
		config_get( 'bug_submit_status' ),
		true,
		ON == config_get( 'allow_reporter_close' ),
		$t_project_id,
		$f_master_bug_id );
/* ... */
				
			

Ensuite il faut rechercher la méthode « print_status_option_list » dans le fichier « bug_update_page.php » afin d’ajouter le numéro de ticket en paramètre supplémentaire :

				
					/* ... */
print_status_option_list( 'status', $t_bug->status,
	access_can_close_bug( $t_bug ),
	$t_bug->project_id,
	$t_bug->id );
/* ... */
				
			

Pour terminer, éditez le fichier « code/config_api.php » pour désactiver les warning d’api car nous avons fait des choses pas très orthodoxe il faut bien le reconnaitre :

				
					/* ... */
function config_get_global( $p_option, $p_default = null ) {
	global $g_cache_config_eval;

	$t_var_name = 'g_' . $p_option;
	if( isset( $GLOBALS[$t_var_name] ) ) {
		if( !isset( $g_cache_config_eval[$t_var_name] ) ) {
			$t_value = config_eval( $GLOBALS[$t_var_name], true );
			$g_cache_config_eval[$t_var_name] = $t_value;
		} else {
			$t_value = $g_cache_config_eval[$t_var_name];
		}
		return $t_value;
	} else {
		# unless we were allowing for the option not to exist by passing
		#  a default, trigger a WARNING
		if( null === $p_default ) {
			error_parameters( $p_option );
			//trigger_error( ERROR_CONFIG_OPT_NOT_FOUND, WARNING ); /* Commentez cette ligne */
		}
		return $p_default;
	}
}
/* ... */
				
			

Conclusion :

  • c’est quand même des changements assez important et je ne mesure pas encore tous les impacts donc à vos risques et périls
  • si vous effectuez une migration vers une version plus récente : pensez à faire une sauvegarde de ces fichiers dans un coin (le mieux étant de pousser le projet sur un git)

Laisser un commentaire