Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Csv import: GncDateFormat ->date_locale #2010

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions gnucash/import-export/csv-imp/assistant-csv-price-import.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <glib/gi18n.h>
#include <stdlib.h>

#include "gnc-locale-utils.hpp"
#include "gnc-ui.h"
#include "gnc-uri-utils.h"
#include "gnc-ui-util.h"
Expand Down Expand Up @@ -659,8 +660,8 @@ CsvImpPriceAssist::CsvImpPriceAssist ()

/* Add in the date format combo box and hook it up to an event handler. */
date_format_combo = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new());
for (auto& date_fmt : GncDate::c_formats)
gtk_combo_box_text_append_text (date_format_combo, _(date_fmt.m_fmt.c_str()));
for (auto locale : gnc_get_available_locales())
gtk_combo_box_text_append_text (date_format_combo, _(locale.c_str()));
gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo), 0);
g_signal_connect (G_OBJECT(date_format_combo), "changed",
G_CALLBACK(csv_price_imp_preview_date_fmt_sel_cb), this);
Expand Down Expand Up @@ -1159,7 +1160,11 @@ CsvImpPriceAssist::preview_update_encoding (const char* encoding)
void
CsvImpPriceAssist::preview_update_date_format ()
{
price_imp->date_format (gtk_combo_box_get_active (GTK_COMBO_BOX(date_format_combo)));
if (char *text = gtk_combo_box_text_get_active_text(date_format_combo))
{
price_imp->date_locale (text);
g_free (text);
}
preview_refresh_table ();
}

Expand Down Expand Up @@ -1764,8 +1769,12 @@ CsvImpPriceAssist::preview_refresh ()
(price_imp->file_format() != GncImpFileFormat::CSV));

// This section deals with the combo's and character encoding
gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo),
price_imp->date_format());
auto locales = gnc_get_available_locales();
auto locale_it = std::find (locales.begin(), locales.end(), price_imp->date_locale());
if (locale_it != locales.end())
gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo),
std::distance (locales.begin(), locale_it));

gtk_combo_box_set_active (GTK_COMBO_BOX(currency_format_combo),
price_imp->currency_format());
go_charmap_sel_set_encoding (encselector, price_imp->encoding().c_str());
Expand Down
20 changes: 15 additions & 5 deletions gnucash/import-export/csv-imp/assistant-csv-trans-import.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "gnc-ui-util.h"
#include "dialog-utils.h"

#include "gnc-locale-utils.hpp"
#include "gnc-component-manager.h"

#include "gnc-state.h"
Expand Down Expand Up @@ -602,8 +603,9 @@ CsvImpTransAssist::CsvImpTransAssist ()

/* Add in the date format combo box and hook it up to an event handler. */
date_format_combo = GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new());
for (auto& date_fmt : GncDate::c_formats)
gtk_combo_box_text_append_text (date_format_combo, _(date_fmt.m_fmt.c_str()));
for (auto locale : gnc_get_available_locales())
gtk_combo_box_text_append_text (date_format_combo, _(locale.c_str()));

gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo), 0);
g_signal_connect (G_OBJECT(date_format_combo), "changed",
G_CALLBACK(csv_tximp_preview_date_fmt_sel_cb), this);
Expand Down Expand Up @@ -1137,7 +1139,11 @@ CsvImpTransAssist::preview_update_encoding (const char* encoding)
void
CsvImpTransAssist::preview_update_date_format ()
{
tx_imp->date_format (gtk_combo_box_get_active (GTK_COMBO_BOX(date_format_combo)));
if (char *text = gtk_combo_box_text_get_active_text(date_format_combo))
{
tx_imp->date_locale (text);
g_free (text);
}
preview_refresh_table ();
}

Expand Down Expand Up @@ -1690,8 +1696,12 @@ CsvImpTransAssist::preview_refresh ()
(tx_imp->file_format() != GncImpFileFormat::CSV));

// Set Date & Currency Format and Character encoding
gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo),
tx_imp->date_format());
auto locales = gnc_get_available_locales();
auto locale_it = std::find (locales.begin(), locales.end(), tx_imp->date_locale());
if (locale_it != locales.end())
gtk_combo_box_set_active (GTK_COMBO_BOX(date_format_combo),
std::distance (locales.begin(), locale_it));

gtk_combo_box_set_active (GTK_COMBO_BOX(currency_format_combo),
tx_imp->currency_format());
go_charmap_sel_set_encoding (encselector, tx_imp->encoding().c_str());
Expand Down
2 changes: 1 addition & 1 deletion gnucash/import-export/csv-imp/gnc-imp-props-price.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ void GncImportPrice::set (GncPricePropType prop_type, const std::string& value,
{
case GncPricePropType::DATE:
m_date.reset();
m_date = GncDate(value, GncDate::c_formats[m_date_format].m_fmt); // Throws if parsing fails
m_date = GncDate(value, m_date_locale); // Throws if parsing fails
break;

case GncPricePropType::AMOUNT:
Expand Down
6 changes: 3 additions & 3 deletions gnucash/import-export/csv-imp/gnc-imp-props-price.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,11 @@ GncNumeric parse_amount_price (const std::string &str, int currency_format);
struct GncImportPrice
{
public:
GncImportPrice (int date_format, int currency_format) : m_date_format{date_format},
GncImportPrice (std::string date_locale, int currency_format) : m_date_locale{date_locale},
m_currency_format{currency_format}{};

void set (GncPricePropType prop_type, const std::string& value, bool enable_test_empty);
void set_date_format (int date_format) { m_date_format = date_format ;}
void set_date_locale (std::string date_locale) { m_date_locale = date_locale ;}
void set_currency_format (int currency_format) { m_currency_format = currency_format ;}
void reset (GncPricePropType prop_type);
std::string verify_essentials (void);
Expand All @@ -102,7 +102,7 @@ struct GncImportPrice
std::string errors();

private:
int m_date_format;
std::string m_date_locale;
int m_currency_format;
std::optional<GncDate> m_date;
std::optional<GncNumeric> m_amount;
Expand Down
8 changes: 3 additions & 5 deletions gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ void GncPreTrans::set (GncTransPropType prop_type, const std::string& value)
case GncTransPropType::DATE:
m_date.reset();
if (!value.empty())
m_date = GncDate(value, GncDate::c_formats[m_date_format].m_fmt); // Throws if parsing fails
m_date = GncDate(value, m_date_locale);
else if (!m_multi_split)
throw std::invalid_argument (
(bl::format (std::string{_("Date field can not be empty if 'Multi-split' option is unset.\n")}) %
Expand Down Expand Up @@ -527,15 +527,13 @@ void GncPreSplit::set (GncTransPropType prop_type, const std::string& value)
case GncTransPropType::REC_DATE:
m_rec_date.reset();
if (!value.empty())
m_rec_date = GncDate (value,
GncDate::c_formats[m_date_format].m_fmt); // Throws if parsing fails
m_rec_date = GncDate (value, m_date_locale); // Throws if parsing fails
break;

case GncTransPropType::TREC_DATE:
m_trec_date.reset();
if (!value.empty())
m_trec_date = GncDate (value,
GncDate::c_formats[m_date_format].m_fmt); // Throws if parsing fails
m_trec_date = GncDate (value, m_date_locale); // Throws if parsing fails
break;

default:
Expand Down
14 changes: 7 additions & 7 deletions gnucash/import-export/csv-imp/gnc-imp-props-tx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,11 @@ struct DraftTransaction
class GncPreTrans
{
public:
GncPreTrans(int date_format, bool multi_split)
: m_date_format{date_format}, m_multi_split{multi_split}, m_currency{nullptr} {};
GncPreTrans(const std::string date_locale, bool multi_split)
: m_date_locale{date_locale}, m_multi_split{multi_split}, m_currency{nullptr} {};

void set (GncTransPropType prop_type, const std::string& value);
void set_date_format (int date_format) { m_date_format = date_format ;}
void set_date_locale (const std::string date_locale) { m_date_locale = date_locale ;}
void set_multi_split (bool multi_split) { m_multi_split = multi_split ;}
void reset (GncTransPropType prop_type);
StrVec verify_essentials (void);
Expand Down Expand Up @@ -190,7 +190,7 @@ class GncPreTrans


private:
int m_date_format;
std::string m_date_locale;
bool m_multi_split;
std::optional<std::string> m_differ;
std::optional<GncDate> m_date;
Expand Down Expand Up @@ -221,12 +221,12 @@ class GncPreTrans
class GncPreSplit
{
public:
GncPreSplit (int date_format, int currency_format) : m_date_format{date_format},
GncPreSplit (const std::string date_locale, int currency_format) : m_date_locale{date_locale},
m_currency_format{currency_format} {};
void set (GncTransPropType prop_type, const std::string& value);
void reset (GncTransPropType prop_type);
void add (GncTransPropType prop_type, const std::string& value);
void set_date_format (int date_format) { m_date_format = date_format ;}
void set_date_locale (const std::string date_locale) { m_date_locale = date_locale ;}
void set_currency_format (int currency_format) { m_currency_format = currency_format; }
void set_pre_trans (std::shared_ptr<GncPreTrans> pre_trans) { m_pre_trans = pre_trans; }
std::shared_ptr<GncPreTrans> get_pre_trans (void) { return m_pre_trans; }
Expand All @@ -241,7 +241,7 @@ class GncPreSplit
void UpdateCrossSplitCounters ();

std::shared_ptr<GncPreTrans> m_pre_trans;
int m_date_format;
std::string m_date_locale;
int m_currency_format;
std::optional<std::string> m_action;
std::optional<Account*> m_account;
Expand Down
10 changes: 5 additions & 5 deletions gnucash/import-export/csv-imp/gnc-imp-settings-csv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>

#include "gnc-locale-utils.hpp"
#include "Account.h"
#include "gnc-state.h"
#include "gnc-ui-util.h"
Expand Down Expand Up @@ -150,7 +151,7 @@ CsvImportSettings::load (void)
if (key_char)
g_free (key_char);

m_date_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_DATE, &key_error);
m_date_locale = g_key_file_get_string (keyfile, group.c_str(), CSV_DATE, &key_error);
m_load_error |= handle_load_error (&key_error, group);

m_currency_format = g_key_file_get_integer (keyfile, group.c_str(), CSV_CURRENCY, &key_error);
Expand Down Expand Up @@ -203,13 +204,12 @@ CsvImportSettings::save (void)
(m_file_format == GncImpFileFormat::CSV) ? true : false);

g_key_file_set_string (keyfile, group.c_str(), CSV_SEP, m_separators.c_str());
g_key_file_set_integer (keyfile, group.c_str(), CSV_DATE, m_date_format);
g_key_file_set_string (keyfile, group.c_str(), CSV_DATE, m_date_locale.c_str());
std::ostringstream cmt_ss;
cmt_ss << "Supported date formats: ";
int fmt_num = 0;
std::for_each (GncDate::c_formats.cbegin(), GncDate::c_formats.cend(),
[&cmt_ss, &fmt_num](const GncDateFormat& fmt)
{ cmt_ss << fmt_num++ << ": '" << fmt.m_fmt << "', "; });
for (auto loc : gnc_get_available_locales())
cmt_ss << fmt_num++ << ": '" << loc << "', ";
auto cmt = cmt_ss.str().substr(0, static_cast<long>(cmt_ss.tellp()) - 2);
g_key_file_set_comment (keyfile, group.c_str(), CSV_DATE, cmt.c_str(), nullptr);
g_key_file_set_integer (keyfile, group.c_str(), CSV_CURRENCY, m_currency_format);
Expand Down
4 changes: 2 additions & 2 deletions gnucash/import-export/csv-imp/gnc-imp-settings-csv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ enum SETTINGS_COL {SET_GROUP, SET_NAME};
struct CsvImportSettings
{
CsvImportSettings() : m_file_format (GncImpFileFormat::CSV), m_encoding {"UTF-8"},
m_date_format {0}, m_currency_format {0},
m_date_locale {"en_AU"}, m_currency_format {0},
m_skip_start_lines{0}, m_skip_end_lines{0}, m_skip_alt_lines (false),
m_separators {","}, m_load_error {false} { }
virtual ~CsvImportSettings() = default;
Expand All @@ -75,7 +75,7 @@ void remove (void);
std::string m_name; // Name given to this preset by the user
GncImpFileFormat m_file_format; // CSV import Format
std::string m_encoding; // File encoding
int m_date_format; // Date Active id
std::string m_date_locale; // Date Active id
int m_currency_format; // Currency Active id
uint32_t m_skip_start_lines; // Number of header rows to skip
uint32_t m_skip_end_lines; // Number of footer rows to skip
Expand Down
10 changes: 5 additions & 5 deletions gnucash/import-export/csv-imp/gnc-import-price.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,15 +213,15 @@ void GncPriceImport::currency_format (int currency_format)
}
int GncPriceImport::currency_format () { return m_settings.m_currency_format; }

void GncPriceImport::date_format (int date_format)
void GncPriceImport::date_locale (std::string date_locale)
{
m_settings.m_date_format = date_format;
m_settings.m_date_locale = date_locale;

/* Reparse all date related columns */
std::vector<GncPricePropType> dates = { GncPricePropType::DATE };
reset_formatted_column (dates);
}
int GncPriceImport::date_format () { return m_settings.m_date_format; }
std::string GncPriceImport::date_locale () { return m_settings.m_date_locale; }

/** Converts raw file data using a new encoding. This function must be
* called after load_file only if load_file guessed
Expand Down Expand Up @@ -385,7 +385,7 @@ void GncPriceImport::tokenize (bool guessColTypes)
auto length = tokenized_line.size();
if (length > 0)
m_parsed_lines.push_back (std::make_tuple (tokenized_line, std::string(),
std::make_shared<GncImportPrice>(date_format(), currency_format()),
std::make_shared<GncImportPrice>(date_locale(), currency_format()),
false));
if (length > max_cols)
max_cols = length;
Expand Down Expand Up @@ -750,7 +750,7 @@ GncPriceImport::set_column_type_price (uint32_t position, GncPricePropType type,
/* Reset date and currency formats for each price props object
* to ensure column updates use the most recent one
*/
std::get<PL_PREPRICE>(*parsed_lines_it)->set_date_format (m_settings.m_date_format);
std::get<PL_PREPRICE>(*parsed_lines_it)->set_date_locale (m_settings.m_date_locale);
std::get<PL_PREPRICE>(*parsed_lines_it)->set_currency_format (m_settings.m_currency_format);

uint32_t row = parsed_lines_it - m_parsed_lines.begin();
Expand Down
4 changes: 2 additions & 2 deletions gnucash/import-export/csv-imp/gnc-import-price.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ class GncPriceImport
void currency_format (int currency_format);
int currency_format ();

void date_format (int date_format);
int date_format ();
void date_locale (std::string date_locale);
std::string date_locale ();

void encoding (const std::string& encoding);
std::string encoding ();
Expand Down
14 changes: 7 additions & 7 deletions gnucash/import-export/csv-imp/gnc-import-tx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,17 +228,17 @@ void GncTxImport::currency_format (int currency_format)
}
int GncTxImport::currency_format () { return m_settings.m_currency_format; }

void GncTxImport::date_format (int date_format)
void GncTxImport::date_locale (std::string date_locale)
{
m_settings.m_date_format = date_format;
m_settings.m_date_locale = date_locale;

/* Reparse all date related columns */
std::vector<GncTransPropType> dates = { GncTransPropType::DATE,
GncTransPropType::REC_DATE,
GncTransPropType::TREC_DATE};
reset_formatted_column (dates);
}
int GncTxImport::date_format () { return m_settings.m_date_format; }
std::string GncTxImport::date_locale () { return m_settings.m_date_locale; }

/** Converts raw file data using a new encoding. This function must be
* called after load_file only if load_file guessed
Expand Down Expand Up @@ -407,8 +407,8 @@ void GncTxImport::tokenize (bool guessColTypes)
auto length = tokenized_line.size();
if (length > 0)
{
auto pretrans = std::make_shared<GncPreTrans>(date_format(), m_settings.m_multi_split);
auto presplit = std::make_shared<GncPreSplit>(date_format(), currency_format());
auto pretrans = std::make_shared<GncPreTrans>(date_locale(), m_settings.m_multi_split);
auto presplit = std::make_shared<GncPreSplit>(date_locale(), currency_format());
presplit->set_pre_trans (std::move (pretrans));
m_parsed_lines.push_back (std::make_tuple (tokenized_line, ErrMap(),
presplit->get_pre_trans(), std::move (presplit), false));
Expand Down Expand Up @@ -781,7 +781,7 @@ void GncTxImport::update_pre_trans_props (parse_line_t& parsed_line, uint32_t co

/* Reset date format for each trans props object
* to ensure column updates use the most recent one */
trans_props->set_date_format (m_settings.m_date_format);
trans_props->set_date_locale (m_settings.m_date_locale);
trans_props->set_multi_split (m_settings.m_multi_split);

if ((old_type > GncTransPropType::NONE) && (old_type <= GncTransPropType::TRANS_PROPS))
Expand Down Expand Up @@ -820,7 +820,7 @@ void GncTxImport::update_pre_split_props (parse_line_t& parsed_line, uint32_t co
auto trans_props = std::get<PL_PRETRANS> (parsed_line);
/* Reset date format for each split props object
* to ensure column updates use the most recent one */
split_props->set_date_format (m_settings.m_date_format);
split_props->set_date_locale (m_settings.m_date_locale);
if (m_settings.m_multi_split && trans_props->is_part_of( m_parent))
split_props->set_pre_trans (m_parent);
else
Expand Down
4 changes: 2 additions & 2 deletions gnucash/import-export/csv-imp/gnc-import-tx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ class GncTxImport
void currency_format (int currency_format);
int currency_format ();

void date_format (int date_format);
int date_format ();
void date_locale (std::string date_locale);
std::string date_locale ();

void encoding (const std::string& encoding);
std::string encoding ();
Expand Down
2 changes: 2 additions & 0 deletions gnucash/import-export/csv-imp/gnc-tokenizer-csv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,6 @@ class GncCsvTokenizer : public GncTokenizer
std::string m_sep_str = ",";
};

void gnc_filter_locales (StrVec& candidate_locales, const StrVec dates);

#endif
22 changes: 22 additions & 0 deletions gnucash/import-export/csv-imp/gnc-tokenizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,25 @@ GncTokenizer::get_tokens()
{
return m_tokenized_contents;
}



using StrVec = std::vector<std::string>;
#include "gnc-datetime.hpp"

void
gnc_filter_locales (StrVec& candidate_locales, const StrVec dates)
{
StrVec new_candidate_locales;
new_candidate_locales.reserve (candidate_locales.size());

for (const auto& date : dates)
{
new_candidate_locales.clear ();
for (const auto& locale : candidate_locales)
try { GncDate (date, locale); new_candidate_locales.push_back (locale); }
catch (const std::exception&) {};

std::swap (candidate_locales, new_candidate_locales);
}
}
Loading
Loading