203 lines
8.6 KiB
Python
203 lines
8.6 KiB
Python
import os
|
|
from QT.Main_Window import Main_Window, QtWidgets
|
|
from QT import QT
|
|
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
|
|
import logging
|
|
|
|
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)
|
|
sp = QtWidgets.QSplitter (self)
|
|
self._order_display = Order_Display (self)
|
|
self._log = App_State.Log_View (parent = self)
|
|
sp.addWidget (self._order_display)
|
|
sp.addWidget (self._log)
|
|
sp.setOrientation (QT.Vertical)
|
|
self.setCentralWidget (sp)
|
|
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 ()
|
|
sim_archive = pathlib.Path (state.imos_sim_root) / "Archive"
|
|
iroot = pathlib.Path (state.imos_factory_root)
|
|
orders = self._find_orders (iroot / App_State.imos_done_dir)
|
|
with schema.orm.db_session :
|
|
for o in orders :
|
|
self._update_order_in_database (sim_archive, o)
|
|
orders = set (o.stem for o in orders)
|
|
for o in schema.Order.select (active = True) :
|
|
if o.basket_no not in orders :
|
|
o.active = False
|
|
self._order_display.update_orders ()
|
|
# end def scan_orders_directory
|
|
|
|
def _update_order_in_database (self, sim_archive, xml_file) :
|
|
basket_no = xml_file.stem
|
|
if True :
|
|
order = schema.Order.get (basket_no = basket_no, active = True)
|
|
xml_file = sim_archive / xml_file.name
|
|
xml = etree.parse (xml_file).getroot ()
|
|
com = xml.xpath ("//TEXT_SHORT") [0].text
|
|
user,line = xml.xpath ("//INFO8") [0].text.split ("/")
|
|
if not order :
|
|
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 = f"Auftrag importiert {basket_no}"
|
|
, order = order
|
|
)
|
|
else :
|
|
pl = schema.Production_Line.get (short = line)
|
|
if ( (order.commission != com)
|
|
or (order.imos_user != user)
|
|
or (order.production_line != pl)
|
|
) :
|
|
order.set ( commission = com
|
|
, imos_user = user
|
|
, production_line = pl
|
|
)
|
|
schema.Action \
|
|
( user = schema.User [App_State.user_id]
|
|
, date = schema.datetime.now ()
|
|
, action_kind = 2
|
|
, action =
|
|
f"Auftrag geändert fom XML {basket_no}"
|
|
, order = order
|
|
)
|
|
order.active = True
|
|
# end def _update_order_in_database
|
|
|
|
def _restore_settings (self) :
|
|
super ()._restore_settings ()
|
|
sp = self.centralWidget ()
|
|
settings = self.settings
|
|
settings.beginGroup ("main-splitter")
|
|
settings.setValue ("geometry", sp.saveGeometry ())
|
|
settings.setValue ("windowState", sp.saveState ())
|
|
settings.endGroup ()
|
|
self._order_display.restore_settings (settings)
|
|
self._log.restore_settings (settings)
|
|
# end def _restore_settings
|
|
|
|
def save_settings (self) :
|
|
settings = self.settings
|
|
sp = self.centralWidget ()
|
|
super ().save_settings ()
|
|
settings.beginGroup ("main-splitter")
|
|
sp.restoreGeometry (settings.value ("geometry" ))
|
|
sp.restoreState (settings.value ("windowState"))
|
|
settings.endGroup ()
|
|
self._order_display.save_settings (settings)
|
|
self._log.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 :
|
|
App_State.L.error ("### 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 ()
|
|
logging.basicConfig \
|
|
( level = logging.DEBUG
|
|
, format = "%(asctime)s - %(levelname)s - %(message)s"
|
|
, datefmt = "%Y-%m-%d %H:%M:%S"
|
|
)
|
|
Order_Processing.run (Order_Processing.load_settings (cmd))
|