View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0013488 | Plugin - CsvImport | General | public | 2011-11-07 04:11 | 2017-04-01 00:14 |
| Reporter | jean-marc.raffolt | Assigned To | vboctor | ||
| Priority | high | Severity | major | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Summary | 0013488: Plugin cvs import and custom fields | ||||
| Description | Custom fields are not updated with the plugin cvs_import Create one custom field :
Create 3 bugs and export. In exported cvs file the column is OK
Import the file. 3 new bugs are created with good Summary, Description, Priority ... | ||||
| Tags | mantishub | ||||
| Attached Files | import_custom_fields.patch (1,580 bytes)
@@ -38,13 +38,12 @@ $t_custom_fields = array();
# Get custom field id of primary keys
foreach($t_linked_ids as $cf_id) {
$t_def = custom_field_get_definition($cf_id);
$t_custom_col_name = $g_custom_field_identifier . $t_def['name'];
-
- if(isset($f_columns[$t_custom_col_name])) {
- $t_custom_fields[$t_custom_fields] = $cf_id;
+ if(in_array($t_custom_col_name,$f_columns)) {
+ $t_custom_fields[$t_custom_col_name] = $cf_id;
}
if(isset($f_keys[$t_custom_col_name])) {
$f_keys[$t_custom_col_name] = $cf_id;
}
@@ -273,10 +272,12 @@ foreach( $t_file_content as $t_file_row ) {
$aColumn = 'category_id';
break;
default :
$valueSet = false;
+ $t_id = $t_custom_fields[$aColumn];
+ $t_def = custom_field_get_definition($t_id);
if(isset($t_custom_fields[$aColumn])) {
# Prepare value
$t_value = get_column_value( $aColumn , $t_file_row );
if( ($t_value != '') && ($t_def['type'] == CUSTOM_FIELD_TYPE_DATE) ) {
$t_value = is_numeric($t_value) ? $t_value : strtotime($t_value);
@@ -322,10 +323,11 @@ foreach( $t_file_content as $t_file_row ) {
}
}
# Set custom fields (can be set only after bug creation)
foreach($t_custom_fields_to_set as $t_id => $t_value) {
+ $t_def = custom_field_get_definition($t_id);
if( custom_field_set_value( $t_id, $t_bug_id, $t_value ) ) {
# Mantis core doesn't update "last_updated" when setting custom fields
bug_update_date( $t_bug_id );
}
else {
import_issues.php (11,242 bytes)
<?php
# Mantis - a php based bugtracking system
require_once( 'core.php' );
$t_core_path = config_get( 'core_path' );
require_once( $t_core_path . 'category_api.php' );
require_once( $t_core_path . 'database_api.php' );
require_once( $t_core_path . 'user_api.php' );
require_once( $t_core_path . 'bug_api.php' );
access_ensure_project_level( config_get( 'manage_site_threshold' ) );
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'import_issues_inc.php' );
# Check a project is selected
$g_project_id = helper_get_current_project();
if( $g_project_id == ALL_PROJECTS ) {
plugin_error( 'ERROR_ALL_PROJECT', ERROR );
}
# Get submitted data
$f_create_unknown_cats = gpc_get_bool( 'cb_create_unknown_cats' );
$f_import_file = gpc_get_string( 'import_file' );
$f_columns = gpc_get_string_array( 'columns' );
$f_skip_first = gpc_get_bool( 'cb_skip_first_line' );
$f_separator = gpc_get_string('edt_cell_separator');
$f_keys = gpc_get_string_array( 'cb_keys', array() );
# Convert the order-based key array to column-based key array
$t = array();
foreach($f_keys as $aKey) {
$t[$f_columns[$aKey]] = 'standard';
}
$f_keys = $t;
unset($t);
# Load custom field ids
$t_linked_ids = custom_field_get_linked_ids( $g_project_id );
$t_custom_fields = array();
# Get custom field id of primary keys
foreach($t_linked_ids as $cf_id) {
$t_def = custom_field_get_definition($cf_id);
$t_custom_col_name = $g_custom_field_identifier . $t_def['name'];
if(isset($f_columns[$t_custom_col_name])) {
$t_custom_fields[$t_custom_fields] = $cf_id;
}
if(isset($f_keys[$t_custom_col_name])) {
$f_keys[$t_custom_col_name] = $cf_id;
}
}
# Check given parameters - File
$t_file_content = array();
if( file_exists( $f_import_file ) ) {
$t_file_content = read_csv_file( $f_import_file );
} else {
error_parameters( plugin_lang_get( 'error_file_not_found' ) );
plugin_error( 'ERROR_FILE_FORMAT', ERROR );
}
# Check given parameters - Columns
if( count( $f_columns ) <= 0 ) {
trigger_error( ERROR_EMPTY_FIELD, ERROR );
}
# ignore_column have to be ... ignored
foreach ($f_columns as $key => $value) {
if ($value == 'ignore_column') {
unset($f_columns[$key]);
}
}
# Other columns check
if( count( $f_columns ) != count( array_unique( $f_columns ) ) ) {
error_parameters( plugin_lang_get( 'error_col_multiple' ) );
plugin_error( 'ERROR_FILE_FORMAT', ERROR );
}
# Some default values for filter
$t_page_number = 1;
$t_issues_per_page = 25;
$t_page_count = 0;
$t_issues_count = 0;
# Import file content
$t_success_count = array();
$t_failure_count = 0;
$t_error_messages = '';
# Determine import mode
$t_import_mode = 'all_new';
if(array_isearch( 'id', $f_columns ) !== false) {
$t_import_mode = 'by_id';
}
else {
if(count($f_keys) > 0) {
$t_import_mode = 'by_keys';
}
}
# Let's go
$t_dry_mode = false;
$lineNumber = 0;
helper_begin_long_process( );
foreach( $t_file_content as $t_file_row ) {
$lineNumber++;
$t_operation_type = 'undefined';
# Check if first row skipped
if( $lineNumber == 1 && $f_skip_first ) {
continue;
}
# Explode into elements
$t_file_row = read_csv_row( $t_file_row, $f_separator );
# Get Id
$t_bug_id = null;
switch($t_import_mode) {
case 'by_id' :
$t_operation_type = 'update';
$t_bug_id = get_column_value( 'id', $t_file_row );
break;
case 'by_keys' :
$t_filter = filter_get_default();
$t_filter[FILTER_PROPERTY_HIDE_STATUS_ID] = array(
'0' => META_FILTER_ANY,
);
$t_values_for_error = array();
foreach($f_keys as $aKey => $v) {
$filterValue = array(get_column_value( $aKey, $t_file_row, '' ));
if($v == 'standard') {
$t_filter[$aKey] = $filterValue;
}
else {
$t_filter['custom_fields'][$v] = $filterValue;
}
$t_values_for_error[] = $filterValue[0];
}
$t_issues = filter_get_bug_rows( $t_page_number, $t_issues_per_page, $t_page_count, $t_issues_count, $t_filter );
switch($t_issues_count) {
case 1:
$t_operation_type = 'update';
$t_bug_id = $t_issues[0]->id;
break;
case 0:
$t_operation_type = 'new';
$t_bug_id = null;
break;
default :
$t_bugs_id = array();
foreach($t_issues as $issue) {
$t_bugs_id[] = $issue->id;
}
$t_failure_count++;
$t_error_messages .= sprintf( $lineNumber . ' : ' . plugin_lang_get( 'error_keys' ), implode('/', $t_values_for_error),
implode('/', $t_bugs_id)) . '<br />';
continue 3;
}
break;
default :
$t_operation_type = 'new';
$t_bug_id = null;
}
# If new, set default parameters
if( $t_bug_id === null ) {
#Default bug will be with default values
$t_bug_data = new BugData;
$t_bug_data->project_id = $g_project_id;
$t_bug_data->category_id = get_csv_import_category_id($g_project_id, 'csv_imported');
$t_bug_data->reporter_id = auth_get_current_user_id();
$t_bug_data->priority = config_get( 'default_bug_priority' );
$t_bug_data->severity = config_get( 'default_bug_severity' );
$t_bug_data->reproducibility = config_get( 'default_bug_reproducibility' );
$t_bug_data->date_submitted = date('Y-m-d G:i:s');
$t_bug_data->handler_id = auth_get_current_user_id();
$t_bug_data->status = config_get( 'bug_submit_status' );
$t_bug_data->resolution = OPEN;
$t_bug_data->view_state = config_get( 'default_bug_view_status' );
$t_bug_data->profile_id = 0;
$t_bug_data->due_date = date_get_null();
} else {
# If existing bug
if( !bug_exists( $t_bug_id ) ) {
$t_failure_count++;
$t_error_messages .= sprintf( $lineNumber . ' : ' . plugin_lang_get( 'error_bug_not_exist' ), $t_bug_id) . '<br />';
continue;
}
$t_bug_data = bug_get( $t_bug_id, true );
if( $t_bug_data->project_id != $g_project_id ) {
$t_failure_count++;
$t_error_messages .= sprintf( $lineNumber . ' : ' . plugin_lang_get( 'error_bug_bad_project' ), $t_bug_id) . '<br />';
continue;
}
}
# From selected columns, get value
$detectChanges = false;
$callUpdate = false;
$t_custom_fields_to_set = array();
$t_date_submitted = null;
foreach($f_columns as $i => $aColumn) {
$v = null;
$valueSet = true;
switch($aColumn) {
case 'priority' :
case 'severity' :
case 'reproducibility' :
case 'projection' :
case 'eta' :
case 'view_state' :
$v = get_enum_column_value( $aColumn, $t_file_row, '' );
break;
case 'date_submitted' :
case 'last_updated' :
$v = get_date_column_value( $aColumn, $t_file_row, '' );
break;
case 'due_date' :
$v = get_date_column_value( $aColumn, $t_file_row, date_get_null() );
break;
case 'handler_id' :
case 'reporter_id' :
$v = get_user_column_value( $aColumn, $t_file_row, '' );
break;
case 'status' :
case 'resolution' :
$v = get_column_value( $aColumn, $t_file_row );
if($v != '' && !is_numeric($v)) {
$v = get_enum_column_value( $aColumn, $t_file_row, '' );
}
break;
case 'summary' :
case 'os' :
case 'os_build' :
case 'platform' :
case 'version' :
case 'target_version' :
case 'build' :
case 'description' :
case 'steps_to_reproduce' :
case 'additional_information' :
case 'fixed_in_version' :
$v = get_column_value( $aColumn, $t_file_row, '');
break;
case 'category' :
$v = get_category_column_value('category', $t_file_row, $t_bug_data->project_id , null );
if( $v == null ) {
$t_cat = trim ( get_column_value( 'category', $t_file_row ) );
if( $t_cat != '' && $f_create_unknown_cats ) {
get_csv_import_category_id($g_project_id, $t_cat);
$v = get_category_column_value('category', $t_file_row, $t_bug_data->project_id , '' );
}
}
$aColumn = 'category_id';
break;
default :
$valueSet = false;
if(isset($t_custom_fields[$aColumn])) {
# Prepare value
$t_value = get_column_value( $aColumn , $t_file_row );
if( ($t_value != '') && ($t_def['type'] == CUSTOM_FIELD_TYPE_DATE) ) {
$t_value = is_numeric($t_value) ? $t_value : strtotime($t_value);
}
# Have to be different
if( $t_bug_id && $t_value == custom_field_get_value( $t_id, $t_bug_id) ) {
continue;
}
$detectChanges = true;
$t_custom_fields_to_set[$t_id] = $t_value;
}
}
if( $valueSet && ($t_bug_id === null || $t_bug_data->$aColumn != $v) ) {
$detectChanges = true;
if($aColumn == 'date_submitted') {
$t_date_submitted = $v ;
}
else {
$t_bug_data->$aColumn = $v;
$callUpdate = true;
}
}
}
if( $t_operation_type == 'update' && !$detectChanges ) {
$t_operation_type = 'nothing';
}
$t_success_count[$t_operation_type]++;
# Set values
if(!$t_dry_mode && $t_operation_type != 'nothing') {
# Set non-custom fields
if( $t_bug_id === null) {
$t_bug_id = $t_bug_data->create();
} else {
if( $callUpdate ) {
$t_bug_data->update( true, ( false == $t_notify ) );
}
}
# Set custom fields (can be set only after bug creation)
foreach($t_custom_fields_to_set as $t_id => $t_value) {
if( custom_field_set_value( $t_id, $t_bug_id, $t_value ) ) {
# Mantis core doesn't update "last_updated" when setting custom fields
bug_update_date( $t_bug_id );
}
else {
$t_failure_count++;
$t_error_messages .= sprintf( $lineNumber . ' : ' . plugin_lang_get( 'error_custom_field' ),
$t_def['name'], $t_bug_data->summary) . '<br />';
continue;
}
}
# Set date_submitted (can be set only after bug creation)
if($t_date_submitted) {
bug_set_field( $t_bug_id, 'date_submitted', $t_date_submitted );
}
}
}
html_page_top1();
$t_redirect_url = 'view_all_bug_page.php';
if( $t_failure_count == 0 ) {
html_meta_redirect( $t_redirect_url );
}
html_page_top2();
?>
<br />
<div align="center">
<?php
echo sprintf( plugin_lang_get( 'result_update_success_ct' ), $t_success_count['update']) . '<br />';
echo sprintf( plugin_lang_get( 'result_import_success_ct' ), $t_success_count['new']) . '<br />';
echo sprintf( plugin_lang_get( 'result_nothing_success_ct' ), $t_success_count['nothing']) . '<br />';
if( $t_failure_count ) {
echo '<b>'.sprintf( plugin_lang_get( 'result_failure_ct' ), $t_failure_count) . ' :</b><br />';
echo $t_error_messages . '<br/>';
}
print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) );
?>
</div>
<?php
html_page_bottom1( __FILE__ );
| ||||
|
I encountered the same issue in my mantis installation. MantisBT Version 1.2.11 I've found the issue in import_issues.php and fixed it. I've attached a patch and the full import_issues.php file. (This fix could potentially have broken functionality to use custom fields as primary key. I don't really understand the implementation of that feature, and don't see how it could work. In any case, it doesn't look like it could work in it's current implementation anyway.) |
|
|
I made the change in release 1.2.14 and it seems to work. |
|
|
I'm testing mantisbt out at work and I ran into this blocking issue for me. MantisBT Version 1.2.15 I can add values to the custom fields after the issues are imported/created but they will not set when imported. I tried the changes in import_issues.php above but had the same results. Any help would be appreciated. |
|
|
Checkout the fix at: |
|