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))