order-processing/designbox_orders.py

151 lines
6.0 KiB
Python

import os
from QT.Main_Window import Main_Window, QtWidgets
from Order_Display import Order_Display
from Login import Login_Dialog
from App_State import App_State
import designbox_orders_rc
import schema
import pathlib
from lxml import etree
class Order_Processing (Main_Window) :
APP_NAME = "Designbox Orders"
VERSION = "0.5"
APP_ORGANISATION = ("designbox-orders", "glaser-co.at")
APP_DIR = os.path.dirname (__file__)
@classmethod
def _load_app_settings (cls, settings) :
settings.beginGroup ("TempSettings")
result = {"database" : settings.value ("database")}
result = {"username" : settings.value ("username")}
settings.endGroup ()
return result
# end def _load_app_settings
def _setupActions (self, app) :
super ()._setupActions (app)
self._add_action ("test", "Scan Dir", self.scan_orders_directory)
# end def _setupActions
def _setupGui (self) :
self.main_menu = QtWidgets.QMenuBar (self)
self.setMenuBar (self.main_menu)
file = QtWidgets.QMenu ("& File")
self.main_menu.addMenu (file)
self.tool_bar_file = self.addToolBar ("File")
self.tool_bar_file.setObjectName ("tb_file")
for a, l in ( ( self.actions.exit
, (file, self.tool_bar_file)
)
, ( (self.actions.test), (self.tool_bar_file, ))
) :
for x in l :
x.addAction (a)
self.setCentralWidget (Order_Display (self))
settings = self.settings
settings.beginGroup ("TempSettings")
user_id = settings.value ("user_id")
settings.endGroup ()
with schema.orm.db_session :
App_State.user_id = schema.User [user_id].id
self.scan_orders_directory ()
# end def _setupGui
def _find_orders (self, root_path : pathlib.Path) :
result = set ()
for path, dirs, files in root_path.walk () :
for f in files :
if f.endswith (".txt") :
xml_name = (path / f).with_suffix (".xml")
if xml_name.exists () :
result.add (xml_name)
for d in dirs :
result.intersection_update (self._find_orders (root_path / d))
return result
# end def _find_orders
def scan_orders_directory (self) :
with schema.orm.db_session :
state = schema.State.get ()
orders = self._find_orders (pathlib.Path (state.imos_export_dir))
with schema.orm.db_session :
for o in orders :
self._update_order_in_database (o)
self.centralWidget ().update_orders ()
# end def scan_orders_directory
def _update_order_in_database (self, xml_file) :
basket_no = xml_file.stem
if True :
order = schema.Order.get (basket_no = basket_no)
if not order :
xml = etree.parse (xml_file).getroot ()
com = xml.xpath ("//TEXT_SHORT") [0].text
user,line = xml.xpath ("//RETAILER") [0].text.split ("/")
order = schema.Order \
( basket_no = basket_no
, state = 0
, commission = com
, imos_user = user
, production_line = schema.Production_Line.get (short = line)
, active = True
)
schema.Action \
( user = schema.User [App_State.user_id]
, date = schema.datetime.now ()
, action_kind = 1
, action = "Auftrag importiert"
, order = order
)
# end def _update_order_in_database
def _restore_settings (self) :
super ()._restore_settings ()
self.centralWidget ().restore_settings (self.settings)
# end def _restore_settings
def save_settings (self) :
settings = self.settings
super ().save_settings ()
self.centralWidget ().save_settings (settings)
settings.beginGroup ("TempSettings")
settings.setValue ("user_id", App_State.user_id)
settings.endGroup ()
# end def save_settings
@classmethod
def pre_main_window_action (cls, settings) :
settings.beginGroup ("TempSettings")
db_file = settings.value ("database")
user_id = settings.value ("user_id")
settings.endGroup ()
schema.db.bind (provider = "sqlite", filename = db_file)
schema.db.generate_mapping (create_tables = False)
username = ""
if user_id :
with schema.orm.db_session :
username = schema.User [user_id].username
if False :
login = Login_Dialog (username)
if login.exec () == 1 :
settings.beginGroup ("TempSettings")
settings.setValue ("user_id", login.user_id)
settings.endGroup ()
return True
else :
print ("### Login skipped")
return True
# end def pre_main_window_action
# end class Order_Processing
if __name__ == "__main__" :
import argparse
parser = argparse.ArgumentParser ()
parser.add_argument ("-s","--settings-file", type = str)
parser.add_argument ("-d", "--database", type = str)
cmd = parser.parse_args ()
Order_Processing.run (Order_Processing.load_settings (cmd))