Skip to content

Commit 3d45530

Browse files
author
Daniel Seichter
authored
Merge pull request #41 from dseichter/enhanced_logging
Enhanced logging
2 parents afe1b6a + c78cefd commit 3d45530

17 files changed

+574
-95
lines changed

images/batch.png

-1.63 KB
Loading

images/config.png

6.21 KB
Loading

images/single.png

-1.46 KB
Loading

src/VATValidation.fbp

Lines changed: 385 additions & 5 deletions
Large diffs are not rendered by default.

src/batch.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
import settings
1919

2020
# import common libraries
21-
import logging
2221
import json
2322
import pandas as pd
2423

25-
logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
24+
import logging_config # Setup the logging # noqa: F401
25+
import logging
26+
27+
logger = logging.getLogger(__name__)
2628

2729
columns = ["key1", "key2", "ownvat", "foreignvat", "company", "street", "zip", "town"]
2830

@@ -50,7 +52,7 @@ def validatebatch(inputfile, outputfile="", type="vies", lang="en"):
5052
resultcode = processjson(inputfile, outputfile, type, lang)
5153
return resultcode
5254
case _:
53-
print("Unsupported file format")
55+
logger.error("Unsupported file format")
5456
return 127
5557

5658

@@ -96,7 +98,7 @@ def processcsv(inputfile, outputfile, type, lang):
9698
dataframe = pd.DataFrame(results)
9799

98100
# save the dateframe to a csv file
99-
dataframe.to_csv(outputfile, index=False, header=False)
101+
dataframe.to_csv(outputfile, index=False, header=False, sep=settings.load_value_from_json_file("delimiter"))
100102

101103
return 0
102104

@@ -138,7 +140,7 @@ def processxlsx(inputfile, outputfile, type, lang):
138140
# load the results into a DataFrame
139141
dataframe = pd.DataFrame(results)
140142

141-
# save the dateframe to a csv file
143+
# save the dateframe to a xlsx file
142144
dataframe.to_excel(outputfile, index=False, header=False)
143145

144146
return 0

src/gui.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,9 @@ def __init__( self, parent ):
196196
self.panelBatch.SetSizer( fgSizer3 )
197197
self.panelBatch.Layout()
198198
fgSizer3.Fit( self.panelBatch )
199-
self.m_notebook3.AddPage( self.panelBatch, _(u"Batch"), True )
199+
self.m_notebook3.AddPage( self.panelBatch, _(u"Batch"), False )
200200
self.panelConfig = wx.Panel( self.m_notebook3, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
201-
fgSizer31 = wx.FlexGridSizer( 0, 2, 0, 0 )
201+
fgSizer31 = wx.FlexGridSizer( 0, 3, 0, 0 )
202202
fgSizer31.AddGrowableCol( 1 )
203203
fgSizer31.SetFlexibleDirection( wx.BOTH )
204204
fgSizer31.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
@@ -211,6 +211,9 @@ def __init__( self, parent ):
211211
self.textCtrlConfigOwnVat = wx.TextCtrl( self.panelConfig, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
212212
fgSizer31.Add( self.textCtrlConfigOwnVat, 0, wx.ALL, 5 )
213213

214+
215+
fgSizer31.Add( ( 0, 0), 1, wx.EXPAND, 5 )
216+
214217
self.staticTextConfigInterface = wx.StaticText( self.panelConfig, wx.ID_ANY, _(u"Interface"), wx.DefaultPosition, wx.DefaultSize, 0 )
215218
self.staticTextConfigInterface.Wrap( -1 )
216219

@@ -221,6 +224,9 @@ def __init__( self, parent ):
221224
self.comboBoxConfigInterface.SetSelection( 0 )
222225
fgSizer31.Add( self.comboBoxConfigInterface, 0, wx.ALL, 5 )
223226

227+
228+
fgSizer31.Add( ( 0, 0), 1, wx.EXPAND, 5 )
229+
224230
self.staticTextConfigLanguage = wx.StaticText( self.panelConfig, wx.ID_ANY, _(u"Language"), wx.DefaultPosition, wx.DefaultSize, 0 )
225231
self.staticTextConfigLanguage.Wrap( -1 )
226232

@@ -231,6 +237,9 @@ def __init__( self, parent ):
231237
self.comboBoxConfigLanguage.SetSelection( 0 )
232238
fgSizer31.Add( self.comboBoxConfigLanguage, 0, wx.ALL, 5 )
233239

240+
241+
fgSizer31.Add( ( 0, 0), 1, wx.EXPAND, 5 )
242+
234243
self.staticTextConfigCSVDelimiter = wx.StaticText( self.panelConfig, wx.ID_ANY, _(u"CSV delimiter"), wx.DefaultPosition, wx.DefaultSize, 0 )
235244
self.staticTextConfigCSVDelimiter.Wrap( -1 )
236245

@@ -242,14 +251,43 @@ def __init__( self, parent ):
242251

243252
fgSizer31.Add( self.textConfigCSVdelimiter, 0, wx.ALL, 5 )
244253

254+
255+
fgSizer31.Add( ( 0, 0), 1, wx.EXPAND, 5 )
256+
257+
self.staticTextConfigLogfile = wx.StaticText( self.panelConfig, wx.ID_ANY, _(u"Logfile"), wx.DefaultPosition, wx.DefaultSize, 0 )
258+
self.staticTextConfigLogfile.Wrap( -1 )
259+
260+
fgSizer31.Add( self.staticTextConfigLogfile, 0, wx.ALL, 5 )
261+
262+
self.textCtrlConfigLogfile = wx.TextCtrl( self.panelConfig, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
263+
self.textCtrlConfigLogfile.SetMinSize( wx.Size( 400,-1 ) )
264+
265+
fgSizer31.Add( self.textCtrlConfigLogfile, 1, wx.ALL|wx.EXPAND, 5 )
266+
267+
self.buttonConfigLogfile = wx.Button( self.panelConfig, wx.ID_ANY, _(u"Logfile"), wx.DefaultPosition, wx.DefaultSize, 0 )
268+
fgSizer31.Add( self.buttonConfigLogfile, 0, wx.ALL, 5 )
269+
270+
self.staticTextConfigLogLevel = wx.StaticText( self.panelConfig, wx.ID_ANY, _(u"Loglevel"), wx.DefaultPosition, wx.DefaultSize, 0 )
271+
self.staticTextConfigLogLevel.Wrap( -1 )
272+
273+
fgSizer31.Add( self.staticTextConfigLogLevel, 0, wx.ALL, 5 )
274+
275+
comboBoxConfigLoglevelChoices = [ _(u"DEBUG"), _(u"ERROR") ]
276+
self.comboBoxConfigLoglevel = wx.ComboBox( self.panelConfig, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, comboBoxConfigLoglevelChoices, 0 )
277+
self.comboBoxConfigLoglevel.SetSelection( 1 )
278+
fgSizer31.Add( self.comboBoxConfigLoglevel, 0, wx.ALL, 5 )
279+
280+
281+
fgSizer31.Add( ( 0, 0), 1, wx.EXPAND, 5 )
282+
245283
self.buttonSaveConfig = wx.Button( self.panelConfig, wx.ID_ANY, _(u"Save"), wx.DefaultPosition, wx.DefaultSize, 0 )
246284
fgSizer31.Add( self.buttonSaveConfig, 0, wx.ALL, 5 )
247285

248286

249287
self.panelConfig.SetSizer( fgSizer31 )
250288
self.panelConfig.Layout()
251289
fgSizer31.Fit( self.panelConfig )
252-
self.m_notebook3.AddPage( self.panelConfig, _(u"Configuration"), False )
290+
self.m_notebook3.AddPage( self.panelConfig, _(u"Configuration"), True )
253291

254292
bSizer2.Add( self.m_notebook3, 1, wx.EXPAND |wx.ALL, 5 )
255293

@@ -286,6 +324,7 @@ def __init__( self, parent ):
286324
self.buttonClear.Bind( wx.EVT_BUTTON, self.clearFields )
287325
self.buttonValidateSingle.Bind( wx.EVT_BUTTON, self.validateSingle )
288326
self.buttonValidateBatch.Bind( wx.EVT_BUTTON, self.validateBatch )
327+
self.buttonConfigLogfile.Bind( wx.EVT_BUTTON, self.openLogfile )
289328
self.buttonSaveConfig.Bind( wx.EVT_BUTTON, self.saveConfig )
290329
self.Bind( wx.EVT_MENU, self.vatvalidationClose, id = self.menuitemFileClose.GetId() )
291330
self.Bind( wx.EVT_MENU, self.vatvalidationGitHub, id = self.menuitemHelpSupport.GetId() )
@@ -309,6 +348,9 @@ def validateSingle( self, event ):
309348
def validateBatch( self, event ):
310349
event.Skip()
311350

351+
def openLogfile( self, event ):
352+
event.Skip()
353+
312354
def saveConfig( self, event ):
313355
event.Skip()
314356

src/helper.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
import json
1818
import logging
1919

20+
logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
2021

21-
VERSION = "v2024-08-17"
22+
VERSION = "v2024-11-06"
2223
UPDATEURL = 'https://api.github.com/repos/dseichter/VATValidation/releases/latest'
2324
RELEASES = 'https://github.com/dseichter/VATValidation/releases'
2425
NAME = 'VAT-Validation'

src/logging_config.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import logging
2+
import settings
3+
4+
5+
def setup_logging():
6+
7+
settings.create_config()
8+
log_file = settings.load_value_from_json_file("logfilename")
9+
10+
# Create a logger
11+
logger = logging.getLogger()
12+
# get loglevel from environment
13+
loglevel = settings.load_value_from_json_file("loglevel")
14+
if loglevel == "DEBUG":
15+
logger.setLevel(logging.DEBUG)
16+
if loglevel == "INFO":
17+
logger.setLevel(logging.INFO)
18+
if loglevel == "ERROR":
19+
logger.setLevel(logging.ERROR)
20+
21+
# Create a file handler
22+
file_handler = logging.FileHandler(log_file)
23+
if loglevel == "DEBUG":
24+
file_handler.setLevel(logging.DEBUG)
25+
if loglevel == "INFO":
26+
file_handler.setLevel(logging.INFO)
27+
if loglevel == "ERROR":
28+
file_handler.setLevel(logging.ERROR)
29+
30+
# Create a formatter and set it for the handlers
31+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
32+
file_handler.setFormatter(formatter)
33+
34+
# Add the handlers to the logger
35+
logger.addHandler(file_handler)
36+
37+
38+
# Call the setup_logging function to configure logging
39+
setup_logging()

src/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
wxPython==4.2.2; sys_platform != "linux"
2-
https://github.com/dseichter/wxpython-whl/releases/download/4.2.1/wxPython-4.2.1-cp312-cp312-linux_x86_64.whl; sys_platform == "linux"
2+
https://github.com/dseichter/wxpython-whl/releases/download/4.2.2/wxPython-4.2.2-cp312-cp312-linux_x86_64.whl; sys_platform == "linux"
33
urllib3==2.2.3
44
pandas==2.2.3
55
numpy==2.1.3

src/settings.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# along with this program. If not, see <https://www.gnu.org/licenses/>.
1515

1616
import json
17+
import tempfile
1718

1819
CONFIGFILE = 'config.json'
1920

@@ -41,6 +42,19 @@ def create_config():
4142
with open(CONFIGFILE, 'r') as f:
4243
data = json.load(f)
4344

45+
# check and add missing keys
46+
if 'language' not in data:
47+
data['language'] = 'en'
48+
if 'interface' not in data:
49+
data['interface'] = 'vies'
50+
if 'delimiter' not in data:
51+
data['delimiter'] = '|'
52+
if 'logfilename' not in data:
53+
log_dir = tempfile.gettempdir()
54+
data['logfilename'] = f'{log_dir}/vatvalidation.log'
55+
if 'loglevel' not in data:
56+
data['loglevel'] = 'ERROR'
57+
4458
with open(CONFIGFILE, 'w') as f:
4559
json.dump(data, f, indent=4, sort_keys=True)
4660

0 commit comments

Comments
 (0)