mirror of
https://github.com/Noettore/fattureCCSR.git
synced 2025-10-15 03:36:39 +02:00
Unified login and session, checking credentials. Added logout action
Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
@@ -5,8 +5,6 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import requests
|
|
||||||
import requests_ntlm
|
|
||||||
import openpyxl
|
import openpyxl
|
||||||
import PyPDF2
|
import PyPDF2
|
||||||
import wx
|
import wx
|
||||||
@@ -47,8 +45,6 @@ def download_invoices(parent):
|
|||||||
invoices_info = get_invoices_info(parent.input_file_path)
|
invoices_info = get_invoices_info(parent.input_file_path)
|
||||||
invoices = invoices_info[1]
|
invoices = invoices_info[1]
|
||||||
|
|
||||||
session = requests.Session()
|
|
||||||
session.auth = requests_ntlm.HttpNtlmAuth("sr\\"+parent.login_dlg.username.GetValue(), parent.login_dlg.password.GetValue())
|
|
||||||
parent.log_dialog.log_text.AppendText("Inizio download fatture dal portale CCSR\n")
|
parent.log_dialog.log_text.AppendText("Inizio download fatture dal portale CCSR\n")
|
||||||
wx.Yield()
|
wx.Yield()
|
||||||
|
|
||||||
@@ -58,7 +54,7 @@ def download_invoices(parent):
|
|||||||
downloaded_count = 0
|
downloaded_count = 0
|
||||||
|
|
||||||
for invoice_id, invoice in invoices.items():
|
for invoice_id, invoice in invoices.items():
|
||||||
resp = session.get(invoice["url"])
|
resp = parent.session.get(invoice["url"])
|
||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
with open(tmp_dir+"/"+invoice_id+".pdf", "wb") as output_file:
|
with open(tmp_dir+"/"+invoice_id+".pdf", "wb") as output_file:
|
||||||
output_file.write(resp.content)
|
output_file.write(resp.content)
|
||||||
|
204
fatture_ccsr.py
204
fatture_ccsr.py
@@ -1,18 +1,20 @@
|
|||||||
"""This utility is used for downloading or converting to TRAF2000 invoices from a .csv or .xml report file"""
|
"""This utility is used for downloading or converting to TRAF2000 invoices from a .xlsx, .csv or .xml report file"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import tempfile
|
||||||
import wx
|
import wx
|
||||||
import wx.adv
|
import wx.adv
|
||||||
import requests
|
import requests
|
||||||
import requests_ntlm
|
import requests_ntlm
|
||||||
import tempfile
|
|
||||||
|
|
||||||
import downloader
|
import downloader
|
||||||
import traf2000_converter
|
import traf2000_converter
|
||||||
import exc
|
import exc
|
||||||
|
|
||||||
DOWNLOAD_ACTION = 1
|
LOGIN_ACTION = 0
|
||||||
CONVERT_ACTION = 2
|
LOGOUT_ACTION = 1
|
||||||
|
DOWNLOAD_ACTION = 10
|
||||||
|
CONVERT_ACTION = 20
|
||||||
|
|
||||||
def file_extension(file_path: str, allowed_ext: set = None) -> str:
|
def file_extension(file_path: str, allowed_ext: set = None) -> str:
|
||||||
"""Return the file extension if that's in the allowed extension set"""
|
"""Return the file extension if that's in the allowed extension set"""
|
||||||
@@ -32,7 +34,7 @@ class LogDialog(wx.Dialog):
|
|||||||
|
|
||||||
main_sizer = wx.BoxSizer(wx.VERTICAL)
|
main_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
self.log_text = wx.TextCtrl(self, wx.ID_ANY, size=(300, 200), style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL|wx.EXPAND)
|
self.log_text = wx.TextCtrl(self, wx.ID_ANY, size=(500, 200), style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL|wx.EXPAND)
|
||||||
log_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
log_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
log_sizer.Add(self.log_text, 1, wx.ALL|wx.EXPAND, 2)
|
log_sizer.Add(self.log_text, 1, wx.ALL|wx.EXPAND, 2)
|
||||||
|
|
||||||
@@ -86,96 +88,22 @@ class LoginDialog(wx.Dialog):
|
|||||||
|
|
||||||
self.SetSizerAndFit(main_sizer)
|
self.SetSizerAndFit(main_sizer)
|
||||||
|
|
||||||
|
def disconnect(self):
|
||||||
|
"""close session and reset input fields"""
|
||||||
|
self.username.SetValue('')
|
||||||
|
self.password.SetValue('')
|
||||||
|
self.GetParent().session.close()
|
||||||
|
self.logged_in = False
|
||||||
|
|
||||||
def on_login(self, _):
|
def on_login(self, _):
|
||||||
"""check credentials and login"""
|
"""check credentials and login"""
|
||||||
if self.username.GetValue() not in ("", None) and self.password.GetValue() not in ("", None):
|
if self.username.GetValue() not in ("", None) and self.password.GetValue() not in ("", None):
|
||||||
|
session = self.GetParent().session
|
||||||
|
session.auth = requests_ntlm.HttpNtlmAuth("sr\\"+self.username.GetValue(), self.password.GetValue())
|
||||||
|
if session.get('https://report.casadicurasanrossore.it:8443/Reports/browse/').status_code == 200:
|
||||||
self.logged_in = True
|
self.logged_in = True
|
||||||
self.Close()
|
self.Close()
|
||||||
|
|
||||||
# class FilePickerDialog(wx.Dialog):
|
|
||||||
# """file picker dialog for downloaded ccsr files"""
|
|
||||||
# def __init__(self, parent, title):
|
|
||||||
# super(FilePickerDialog, self).__init__(parent, wx.ID_ANY, title, style=wx.DEFAULT_DIALOG_STYLE)
|
|
||||||
|
|
||||||
# self.input_file_path = None
|
|
||||||
# self.input_file_ext = None
|
|
||||||
# self.output_file_path = None
|
|
||||||
# self.log_dialog = None
|
|
||||||
|
|
||||||
# main_sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
# input_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
# btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
|
|
||||||
# input_file_text = wx.StaticText(self, wx.ID_ANY, "Seleziona il file scaricato dal portale della CCSR")
|
|
||||||
# input_file_text.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
|
|
||||||
|
|
||||||
# input_file_doc = wx.StaticText(self, wx.ID_ANY, "Per scaricare le fatture selezionare il file .xlsx mentre per convertire i record in TRAF2000 selezionare il file .xml o .csv")
|
|
||||||
|
|
||||||
# self.input_file_picker = wx.FilePickerCtrl(self, 101, "", "Seleziona il .xlsx, .csv o .xml", "*.xlsx;*.csv;*.xml", style=wx.FLP_DEFAULT_STYLE)
|
|
||||||
# input_sizer.Add(self.input_file_picker, 1, wx.ALL|wx.EXPAND, 2)
|
|
||||||
# self.input_file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.file_picker_changed)
|
|
||||||
|
|
||||||
# self.download_btn = wx.Button(self, DOWNLOAD_ACTION, "Scarica Fatture")
|
|
||||||
# btn_sizer.Add(self.download_btn, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
# self.download_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
|
||||||
# self.download_btn.Disable()
|
|
||||||
|
|
||||||
# self.traf2000_btn = wx.Button(self, CONVERT_ACTION, "Genera TRAF2000")
|
|
||||||
# btn_sizer.Add(self.traf2000_btn, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
# self.traf2000_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
|
||||||
# self.traf2000_btn.Disable()
|
|
||||||
|
|
||||||
# main_sizer.Add(input_file_text, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
# main_sizer.Add(input_file_doc, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
# main_sizer.Add(input_sizer, 0, wx.ALL|wx.EXPAND, 2)
|
|
||||||
# main_sizer.Add(btn_sizer, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
|
|
||||||
# self.SetSizerAndFit(main_sizer)
|
|
||||||
|
|
||||||
# def file_picker_changed(self, event):
|
|
||||||
# """event raised when the input file path is changed"""
|
|
||||||
# self.input_file_path = event.GetEventObject().GetPath()
|
|
||||||
# try:
|
|
||||||
# self.input_file_ext = file_extension(self.input_file_path, (".xml", ".csv", ".xlsx"))
|
|
||||||
# except exc.NoFileError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# except exc.NoFileExtensionError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# except exc.WrongFileExtensionError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# if self.input_file_ext == ".xlsx":
|
|
||||||
# self.download_btn.Enable()
|
|
||||||
# self.traf2000_btn.Disable()
|
|
||||||
# elif self.input_file_ext in (".csv", ".xml"):
|
|
||||||
# self.traf2000_btn.Enable()
|
|
||||||
# self.download_btn.Disable()
|
|
||||||
# else:
|
|
||||||
# self.download_btn.Disable()
|
|
||||||
# self.traf2000_btn.Disable()
|
|
||||||
|
|
||||||
# def btn_onclick(self, event):
|
|
||||||
# """event raised when a button is clicked"""
|
|
||||||
# btn_id = event.GetEventObject().GetId()
|
|
||||||
# if btn_id == DOWNLOAD_ACTION:
|
|
||||||
# self.login_dlg.ShowModal()
|
|
||||||
# if self.login_dlg.logged_id:
|
|
||||||
# self.log_dialog = LogDialog(self, "Download delle fatture dal portale CCSR", DOWNLOAD_ACTION)
|
|
||||||
# self.log_dialog.Show()
|
|
||||||
# downloader.download_invoices(self)
|
|
||||||
# self.log_dialog.btn.Enable()
|
|
||||||
# elif btn_id == CONVERT_ACTION:
|
|
||||||
# self.log_dialog = LogDialog(self, "Conversione delle fatture in TRAF2000", CONVERT_ACTION)
|
|
||||||
# self.log_dialog.Show()
|
|
||||||
# try:
|
|
||||||
# traf2000_converter.convert(self)
|
|
||||||
# except exc.NoFileError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# except exc.NoFileExtensionError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# except exc.WrongFileExtensionError as handled_exception:
|
|
||||||
# print(handled_exception.args[0])
|
|
||||||
# self.log_dialog.btn.Enable()
|
|
||||||
|
|
||||||
class FattureCCSRFrame(wx.Frame):
|
class FattureCCSRFrame(wx.Frame):
|
||||||
"""main application frame"""
|
"""main application frame"""
|
||||||
def __init__(self, parent, title):
|
def __init__(self, parent, title):
|
||||||
@@ -185,23 +113,41 @@ class FattureCCSRFrame(wx.Frame):
|
|||||||
self.input_file_ext = None
|
self.input_file_ext = None
|
||||||
self.output_file_path = None
|
self.output_file_path = None
|
||||||
self.log_dialog = None
|
self.log_dialog = None
|
||||||
self.session = None
|
self.session = requests.Session()
|
||||||
|
|
||||||
super(FattureCCSRFrame, self).__init__(parent, wx.ID_ANY, title, size=(650, 150))
|
super(FattureCCSRFrame, self).__init__(parent, wx.ID_ANY, title, size=(520, 180))
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
main_sizer = wx.BoxSizer(wx.VERTICAL)
|
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
date_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
date_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
title_text = wx.StaticText(panel, wx.ID_ANY, "Utility per scaricare le fatture dal portale CCSR e generare il tracciato TeamSystem TRAF2000")
|
self.login_dlg = LoginDialog(self, "Inserisci le credenziali di login al portale della CCSR")
|
||||||
|
self.output_traf2000_dialog = wx.FileDialog(panel, "Scegli dove salvare il file TRAF2000", defaultFile="TRAF2000", style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
|
||||||
|
self.output_pdf_dialog = wx.FileDialog(panel, "Scegli dove salvare il .pdf con le fatture scaricate", defaultFile="fatture.pdf", style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
|
||||||
|
|
||||||
|
title_text = wx.StaticText(panel, wx.ID_ANY, "Utility Fatture Casa di Cura San Rossore")
|
||||||
title_text.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
|
title_text.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
|
||||||
|
|
||||||
desc_text = wx.StaticText(panel, wx.ID_ANY, "Seleziona le date di inizio e fine periodo delle fatture da gestire")
|
desc_text = wx.StaticText(panel, wx.ID_ANY, "Effettua il login poi seleziona le date di inizio e fine periodo delle fatture da gestire ed esegui un'azione")
|
||||||
|
|
||||||
self.start_date_picker = wx.adv.DatePickerCtrl(panel, dt=wx.DefaultDateTime)
|
start_date_lbl = wx.StaticText(self, wx.ID_ANY, "Dal:")
|
||||||
self.end_date_picker = wx.adv.DatePickerCtrl(panel, dt=wx.DefaultDateTime)
|
end_date_lbl = wx.StaticText(self, wx.ID_ANY, "Al:")
|
||||||
date_sizer.Add(self.start_date_picker, 0, wx.ALL|wx.CENTER, 2)
|
self.start_date_picker = wx.adv.DatePickerCtrl(panel, dt=wx.DateTime.Today().SetDay(1))
|
||||||
date_sizer.Add(self.end_date_picker, 0, wx.ALL|wx.CENTER, 2)
|
self.end_date_picker = wx.adv.DatePickerCtrl(panel, dt=wx.DateTime.Today())
|
||||||
|
date_sizer.Add(start_date_lbl, 0, wx.ALL|wx.CENTER, 2)
|
||||||
|
date_sizer.Add(self.start_date_picker, 1, wx.ALL|wx.CENTER, 2)
|
||||||
|
date_sizer.Add(end_date_lbl, 0, wx.ALL|wx.CENTER, 2)
|
||||||
|
date_sizer.Add(self.end_date_picker, 1, wx.ALL|wx.CENTER, 2)
|
||||||
|
self.start_date_picker.Disable()
|
||||||
|
self.end_date_picker.Disable()
|
||||||
|
|
||||||
|
self.login_btn = wx.Button(panel, LOGIN_ACTION, "Login")
|
||||||
|
self.login_btn.SetDefault()
|
||||||
|
self.login_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
||||||
|
|
||||||
|
self.logout_btn = wx.Button(panel, LOGOUT_ACTION, "Logout")
|
||||||
|
self.logout_btn.Hide()
|
||||||
|
self.logout_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
||||||
|
|
||||||
self.download_btn = wx.Button(panel, DOWNLOAD_ACTION, "Scarica Fatture")
|
self.download_btn = wx.Button(panel, DOWNLOAD_ACTION, "Scarica Fatture")
|
||||||
btn_sizer.Add(self.download_btn, 0, wx.ALL|wx.CENTER, 2)
|
btn_sizer.Add(self.download_btn, 0, wx.ALL|wx.CENTER, 2)
|
||||||
@@ -213,44 +159,64 @@ class FattureCCSRFrame(wx.Frame):
|
|||||||
self.traf2000_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
self.traf2000_btn.Bind(wx.EVT_BUTTON, self.btn_onclick)
|
||||||
self.traf2000_btn.Disable()
|
self.traf2000_btn.Disable()
|
||||||
|
|
||||||
self.login_dlg = LoginDialog(self, "Inserisci le credenziali di login al portale della CCSR")
|
self.main_sizer.Add(title_text, 0, wx.ALL|wx.CENTER, 2)
|
||||||
self.output_traf2000_dialog = wx.FileDialog(panel, "Scegli dove salvare il file TRAF2000", defaultFile="TRAF2000", style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
|
self.main_sizer.Add(desc_text, 0, wx.ALL|wx.CENTER, 2)
|
||||||
self.output_pdf_dialog = wx.FileDialog(panel, "Scegli dove salvare il .pdf con le fatture scaricate", defaultFile="fatture.pdf", style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
|
self.main_sizer.Add(self.login_btn, 0, wx.ALL|wx.CENTER, 4)
|
||||||
|
self.main_sizer.Add(self.logout_btn, 0, wx.ALL|wx.CENTER, 4)
|
||||||
|
self.main_sizer.Add(date_sizer, 0, wx.ALL|wx.EXPAND, 2)
|
||||||
|
self.main_sizer.Add(btn_sizer, 0, wx.ALL|wx.CENTER, 2)
|
||||||
|
|
||||||
main_sizer.Add(title_text, 0, wx.ALL|wx.CENTER, 2)
|
panel.SetSizerAndFit(self.main_sizer)
|
||||||
main_sizer.Add(desc_text, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
main_sizer.Add(date_sizer, 0, wx.ALL|wx.EXPAND, 2)
|
|
||||||
main_sizer.Add(btn_sizer, 0, wx.ALL|wx.CENTER, 2)
|
|
||||||
|
|
||||||
panel.SetSizer(main_sizer)
|
|
||||||
|
|
||||||
self.Show()
|
self.Show()
|
||||||
|
|
||||||
self.login_dlg.ShowModal()
|
def enable_on_login(self):
|
||||||
if self.login_dlg.logged_in:
|
"""enable and show what needed after login"""
|
||||||
self.download_btn.Enable()
|
self.download_btn.Enable()
|
||||||
self.traf2000_btn.Enable()
|
self.traf2000_btn.Enable()
|
||||||
|
self.start_date_picker.Enable()
|
||||||
|
self.end_date_picker.Enable()
|
||||||
|
self.login_btn.Hide()
|
||||||
|
self.logout_btn.Show()
|
||||||
|
self.main_sizer.Layout()
|
||||||
|
|
||||||
|
def disable_on_logout(self):
|
||||||
|
"""disable and hide what needed after logout"""
|
||||||
|
self.download_btn.Disable()
|
||||||
|
self.traf2000_btn.Disable()
|
||||||
|
self.start_date_picker.Disable()
|
||||||
|
self.end_date_picker.Disable()
|
||||||
|
self.login_dlg.disconnect()
|
||||||
|
self.logout_btn.Hide()
|
||||||
|
self.login_btn.Show()
|
||||||
|
self.main_sizer.Layout()
|
||||||
|
|
||||||
def btn_onclick(self, event):
|
def btn_onclick(self, event):
|
||||||
"""event raised when a button is clicked"""
|
"""event raised when a button is clicked"""
|
||||||
btn_id = event.GetEventObject().GetId()
|
btn_id = event.GetEventObject().GetId()
|
||||||
if not self.login_dlg.logged_in:
|
|
||||||
return None
|
|
||||||
|
|
||||||
self.session = requests.Session()
|
if btn_id == LOGIN_ACTION:
|
||||||
self.session.auth = requests_ntlm.HttpNtlmAuth("sr\\"+self.login_dlg.username.GetValue(), self.login_dlg.password.GetValue())
|
self.login_dlg.ShowModal()
|
||||||
|
if self.login_dlg.logged_in:
|
||||||
|
self.enable_on_login()
|
||||||
|
elif btn_id == LOGOUT_ACTION:
|
||||||
|
self.disable_on_logout()
|
||||||
|
else:
|
||||||
|
if not self.login_dlg.logged_in:
|
||||||
|
#TODO: error
|
||||||
|
return None
|
||||||
|
|
||||||
start_date = self.start_date_picker.GetValue().Format("%d/%m/%Y")
|
start_date = self.start_date_picker.GetValue().Format("%d/%m/%Y")
|
||||||
end_date = self.end_date_picker.GetValue().Format("%d/%m/%Y")
|
end_date = self.end_date_picker.GetValue().Format("%d/%m/%Y")
|
||||||
input_file_url = 'https://report.casadicurasanrossore.it:8443/reportserver?/STAT_FATTURATO_CTERZI&dataI='+start_date+'&dataF='+end_date+'&rs:Format='+('EXCELOPENXML' if btn_id == DOWNLOAD_ACTION else 'XML')
|
input_file_url = 'https://report.casadicurasanrossore.it:8443/reportserver?/STAT_FATTURATO_CTERZI&dataI='+start_date+'&dataF='+end_date+'&rs:Format='
|
||||||
print(input_file_url)
|
input_file_url += ('EXCELOPENXML' if btn_id == DOWNLOAD_ACTION else 'XML' if btn_id == CONVERT_ACTION else None)
|
||||||
|
|
||||||
downloaded_input_file = self.session.get(input_file_url)
|
downloaded_input_file = self.session.get(input_file_url)
|
||||||
if downloaded_input_file.status_code != 200:
|
if downloaded_input_file.status_code != 200:
|
||||||
#TODO: error
|
#TODO: error
|
||||||
print(downloaded_input_file.status_code)
|
return None
|
||||||
print(downloaded_input_file.content)
|
|
||||||
return
|
input_file_descriptor, self.input_file_path = tempfile.mkstemp(suffix=('.xlsx' if btn_id == DOWNLOAD_ACTION else '.xml' if btn_id == CONVERT_ACTION else None))
|
||||||
input_file_descriptor, self.input_file_path = tempfile.mkstemp(suffix=('.xlsx' if btn_id == DOWNLOAD_ACTION else '.xml'))
|
|
||||||
with open(input_file_descriptor, 'wb') as input_file:
|
with open(input_file_descriptor, 'wb') as input_file:
|
||||||
input_file.write(downloaded_input_file.content)
|
input_file.write(downloaded_input_file.content)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user