class Function(object): logger = CustomAdapter(logging.getLogger(str(__name__)), None) func_dict = {} @debug(lvl=logging.NOTSET, prefix='') def __init__(self, model, name, req=False, sort=100): self.model = model self.name = name self.req = req self.sort = sort self.__field_desc = None self.upload_col = None Function.func_dict[self.name] = self @property @debug(lvl=logging.NOTSET, prefix='') def field_desc(self): return self.__field_desc @field_desc.setter @debug(lvl=logging.DEBUG, prefix='') def field_desc(self, value): self.__field_desc = value self.upload_col = self.model.table.c[self.__field_desc]
class IniDBSection(IniSection): logger = CustomAdapter(logging.getLogger(str(__name__)), None) section_dict = {} creds = [] @debug(lvl=logging.DEBUG, prefix="") def __init__(self, section, gui_obj): super().__init__(section, gui_obj) self.submit_btn = None self.creds = self.__class__.creds @debug(lvl=logging.DEBUG, prefix="") def add_pane(self): super().add_pane() self.submit_btn = ttk.Button(self.frame, text="Test Credentials", command=self.test_creds) self.submit_btn.grid(row=self.row_counter, column=0, pady=5) self.row_counter += 1 @debug(lvl=logging.DEBUG, prefix="") def test_creds(self): raise NotImplementedError @debug(lvl=logging.DEBUG, prefix="") def toggle_creds(self, good_creds): for credential in self.creds: self.key_dict.get(credential).bad = not good_creds
class CustAliasColumn(ColumnObject): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = None header = None abbrev = None metric = False cell_format = "InteriorTextCell" @staticmethod def apply_join(query): import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping import cep_price_console.db_management.ddi_data_warehouse as ddi_data_warehouse return query.outerjoin( ARW_PRF_Mapping.cust_alias_01_current.__table__, and_( ARW_PRF_Mapping.cust_alias_01_current.__table__.c.Cust_Num == ddi_data_warehouse.invoice_header.c.CUSTOMERCODE, ARW_PRF_Mapping.cust_alias_01_current.__table__.c.Prod_Num == ddi_data_warehouse.invoice_detail.c.PRODUCTCODE ) ) @staticmethod @debug(lvl=logging.NOTSET, prefix="") def table(): import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping return ARW_PRF_Mapping.cust_alias_01_current
class DateFrame(ttk.Frame): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, parent, *args, **kwargs): self.parent = parent # noinspection PyArgumentList super().__init__(self.parent, *args, **kwargs) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.date_start = DateSelection(self, style="even.dflt.TLabel", row=1, column=0, label_text="Start Date: ") self.date_end = DateSelection(self, style="even.dflt.TLabel", row=2, column=0, label_text="End Date: ") # @debug(lvl=logging.DEBUG, prefix='') # def regrid(self): # for date_selection in DateSelection.date_selection_dict.values(): # date_selection.regrid() # @debug(lvl=logging.DEBUG, prefix='') def ungrid(self): self.date_start.value = None self.date_start.entry.set_date(None) self.date_end.value = None self.date_end.entry.set_date(None) self.grid_remove()
class ProdUOMColumn(ColumnObject): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = None header = None abbrev = None metric = False cell_format = "InteriorTextCell" @staticmethod def apply_join(query): import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping return query.outerjoin( ARW_PRF_Mapping.prod_uom_v2_01_current.__table__, and_( ARW_PRF_Mapping.prod_uom_v2_01_current.__table__.c.Prod_Num == ARW_PRF_Mapping.prod_main_01_current.__table__.c.Prod_Num, ARW_PRF_Mapping.prod_uom_v2_01_current.__table__.c.UOM == ARW_PRF_Mapping.prod_main_01_current.__table__.c.Display_UOM, ) ) @staticmethod @debug(lvl=logging.NOTSET, prefix="") def table(): import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping return ARW_PRF_Mapping.prod_uom_v2_01_current
class Loading(tk.Toplevel): from cep_price_console.utils.log_utils import CustomAdapter, debug logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, master, *args, **kwargs): self.master = master self.root = self.master.root super().__init__(self.root, *args, **kwargs)
class HorizontalHandle(Handle): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def _on_dragging(self, event): x = event.x_root - self.master.winfo_rootx() - self._dx self.master.sash_place(self._sash_index, x, 1) # noinspection PyProtectedMember self.master._update_position_all_handles()
class ActionIndicator(Step): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, view, *args, **kwargs): super().__init__(namely=str(ActionIndicator.__name__), order=5, view=view, *args, **kwargs)
class Row(object): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.NOTSET, prefix='') def __init__(self, wb, row_num_one_indexed): self.wb = wb self.row_num_one_indexed = row_num_one_indexed self.row_cells = []
class UnitOfMeasure(Step): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, view, *args, **kwargs): super().__init__(namely=str(ColumnMapping.__name__), order=5, view=view, *args, **kwargs)
def mssql_init_engine(): global mssql_engine global mssql_base global mssql_session_maker mssql_base.metadata.bind = mssql_engine mssql_session_maker = sessionmaker(bind=mssql_engine) CustomAdapter(logging.getLogger('sqlalchemy.engine')) from cep_price_console.db_management.mssql_database import MSSQL_Database MSSQL_Database.prepare(mssql_engine)
class UOMFactorDesc(ProdUOMColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "UOM_Factor_Desc" header = "UOM Qty" abbrev = "UOM Qty" metric = False cell_format = "InteriorTextCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().__table__.c.UOM_Factor_Desc
class PrimVendPartNum(ProdMainColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Primary_Vend_Part_Num" header = "Prim. Vend. Part Num." abbrev = "Prim. Vend. Part Num." metric = False cell_format = "InteriorTextCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().__table__.c.Primary_Vend_Part_Num
class QuantityShipped(InvoiceDetailColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Quantity_Shipped" header = "Quantity Shipped" abbrev = "Qty. Shipped" metric = True cell_format = "InteriorIntCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().c.QUANTITYSHIPPED
class CustPartNum(CustAliasColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Cust_Part_Num" header = "Cust Part Number" abbrev = "Cust. Part Num." metric = False cell_format = "InteriorTextCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().__table__.c.Cust_Part_Num
class L1Price(ProdMainColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "L1_Price" header = "L1 Price" abbrev = "L1 Price" metric = False cell_format = "InteriorTextCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().__table__.c.L1_Price
class GLProfit(InvoiceDetailColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "GL_Profit" header = "GL Profit" abbrev = "GL Profit" metric = True cell_format = "InteriorCurrencyCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().c.EXTENDEDGLPROFIT
class Commission(InvoiceDetailColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Commission" header = "Commission" abbrev = "Commission" metric = True cell_format = "InteriorCurrencyCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().c.COMMISSION
class OriginalQuantity(InvoiceDetailColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Original_Quantity" header = "Original Quantity" abbrev = "Orig. Qty." metric = True cell_format = "InteriorIntCell" @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().c.ORIGINALQUANTITY
class Handle(ttk.Frame): logger = CustomAdapter(logging.getLogger(str(__name__)), None) def __init__(self, panedwindow, sash_index, disallow_dragging=False, on_click=None, *args, **kwargs): image = kwargs.pop("image", None) # noinspection PyArgumentList super().__init__(panedwindow, *args, **kwargs) self._sash_index = sash_index if image: self._event_area = ttk.Label(self, image=image) self._event_area.pack() else: self._event_area = self self._center = int(self._event_area.winfo_reqwidth() / 2), int( self._event_area.winfo_reqheight() / 2) if disallow_dragging: if on_click: self._event_area.bind('<Button-1>', lambda event: on_click()) else: # noinspection PyProtectedMember self._event_area.bind('<Button-1>', self._initiate_motion) # noinspection PyProtectedMember self._event_area.bind('<B1-Motion>', self._on_dragging) # noinspection PyProtectedMember self._event_area.bind('<ButtonRelease-1>', self.master._on_release) @debug(lvl=logging.DEBUG, prefix='') def _initiate_motion(self, event): self.master._active_sash = self._sash_index self._dx = event.x self._dy = event.y @property @debug(lvl=logging.DEBUG, prefix='') def sash_index(self): return self._sash_index @debug(lvl=logging.DEBUG, prefix='') def _on_dragging(self, event): raise NotImplementedError
class PanedEntryFrame(ttk.Frame): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, master, toplevel, *args, **kwargs): self.toplevel = toplevel # noinspection PyArgumentList super().__init__(master, *args, **kwargs) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) # TODO: give it a clear name # TODO: use this name in a panedwindow-specific dictionary # TODO: use this name to remove it print("widgetName: {}".format(self.master.widgetName)) print("winfo_name: {}".format(self.master.winfo_name())) entry_validation = (self.register(self.validate_selection), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') self.entry_var = tk.StringVar() self.entry = ttk.Entry(self, textvariable=self.entry_var, validate='focusout', validatecommand=entry_validation) self.entry.grid(row=0, column=0, sticky=tk.NSEW) self.close_btn = ttk.Button(self, text="x", command=self.remove, width=1) self.close_btn.grid(row=0, column=1, sticky=tk.NE) @debug(lvl=logging.DEBUG, prefix='') def remove(self): something = self.master.nametowidget(".pricelist.paned_outer.{}".format(self.winfo_name())) self.master.remove(something) # noinspection PyUnusedLocal @debug(lvl=logging.DEBUG, prefix='') def validate_selection(self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name): # if value_if_allowed != "": return True
class Step(ttk.Frame): logger = CustomAdapter(logging.getLogger(str(__name__)), None) step_dict = {} @debug(lvl=logging.DEBUG, prefix='') def __init__(self, view, namely, order, *args, **kwargs): self.order = order self.namely = namely self.view = view # noinspection PyArgumentList super().__init__(self.view, *args, **kwargs) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.grid(row=0, column=0, sticky=tk.NSEW) self.frame_cmd = ttk.Frame(self) self.frame_cmd.grid(row=1, column=0, sticky=tk.SE) self.frame_main = ttk.Frame(self) self.frame_main.grid(row=0, column=0, sticky=tk.NSEW) self.btn_next = ttk.Button(self.frame_cmd) self.btn_next.config(text="Proceed") self.btn_next.state(['disabled']) self.btn_next.grid(row=0, column=3) self.btn_next.bind("<ButtonRelease-1>", self.next) self.btn_prev = ttk.Button(self.frame_cmd) self.btn_prev.config(text="Previous") self.btn_prev.grid(row=0, column=2) self.btn_prev.bind("<ButtonRelease-1>", self.prev) self.complete = False Step.step_dict[self.namely] = self center_window(win_obj=self.view) @debug(lvl=logging.DEBUG, prefix='') def open(self): self.grid() @debug(lvl=logging.DEBUG, prefix='') def close(self): self.grid_remove() @debug(lvl=logging.DEBUG, prefix='') def next(self, *args): pass @debug(lvl=logging.DEBUG, prefix='') def prev(self, *args): pass
def mysql_init_engine(): global mysql_engine global mysql_base global mysql_session_maker mysql_base.metadata.bind = mysql_engine mysql_session_maker = sessionmaker(bind=mysql_engine) CustomAdapter(logging.getLogger('sqlalchemy.engine')) import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping if hasattr(ARW_PRF_Mapping, "InformReflection"): ARW_PRF_Mapping.InformReflection.prepare(mysql_engine) from cep_price_console.db_management.ddi_data_warehouse import DDIDataWarehouse DDIDataWarehouse.prepare(mysql_engine)
class PanedWindowHorizontal(PanedWindowBase): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__( self, master, # name, size=60, sashpad=2, disallow_dragging=False, on_click=None, cursor=None, opaqueresize=True, *args, **kwargs): # noinspection SpellCheckingInspection image = tk.PhotoImage( data= "R0lGODlhGAADAPIFAEBAQGBgYICAgLu7u8zMzAAAAAAAAAAAACH5BAEAAAUALAAAAAAY" "AAMAAAMaWBJQym61N2UZJTisb96fpxGD4JBmgZ4lKyQAOw==") super().__init__( master, # name, orient=tk.HORIZONTAL, size=size, sashpad=sashpad, disallow_dragging=disallow_dragging, on_click=on_click, image=image, cursor=cursor, opaqueresize=opaqueresize, handle_class=HorizontalHandle, *args, **kwargs) @debug(lvl=logging.DEBUG, prefix='') def _update_position_all_handles(self): for sash_index, handle in enumerate(self._handle_list): x, y = super().sash_coord(sash_index) handle.place(x=x) @debug(lvl=logging.DEBUG, prefix='') def _on_configure_pane(self, sash_index): x, y = super().sash_coord(sash_index) self._handle_list[sash_index].place(x=x)
class IniSection(object): logger = CustomAdapter(logging.getLogger(str(__name__)), None) section_dict = {} @debug(lvl=logging.DEBUG, prefix="") def __init__(self, section, gui_obj, *args, **kw): self.frame = None self.lbl = None self.section = section self.gui_obj = gui_obj self.gui_obj.section_dict[str(self)] = self self.missing = True self.row_counter = 1 self.key_dict = {} self.style_prefix = None IniSection.section_dict[str(self)] = self @debug(lvl=logging.DEBUG, prefix="") def add_pane(self): self.frame = ttk.Frame(self.gui_obj.paned_sections) self.frame.columnconfigure(1, weight=1) self.frame.config(padding=5) self.lbl = ttk.Label(self.frame, text=str(self)) self.lbl.grid(row=0, column=0, columnspan=2) if len(self.gui_obj.paned_sections.panes()) % 2 == 0: self.style_prefix = "even" else: self.style_prefix = "odd" self.frame.configure(style="{}.group.TFrame".format(self.style_prefix)) self.lbl.configure( style="{}.heading3.TLabel".format(self.style_prefix)) self.populate() @debug(lvl=logging.DEBUG, prefix="") def populate(self): for key in self.key_dict.values(): key.grid(self.row_counter) self.row_counter += 1 @classmethod @debug(lvl=logging.DEBUG, prefix="") def reset_dict(cls): cls.section_dict = {} def __str__(self): return self.section
class AcctFrame(ttk.Frame): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, parent, *args, **kwargs): self.parent = parent # noinspection PyArgumentList super().__init__(self.parent, *args, **kwargs) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.parent_scroll_frame = ttk.Frame(self, style="odd.group.TFrame", padding=5) self.parent_scroll_frame.rowconfigure(0, weight=1) self.parent_scroll_frame.columnconfigure(0, weight=1) self.parent_scroll_frame.grid(row=0, column=0, sticky=tk.NSEW) self.scroll_frame = VerticalScrolledFrame(self.parent_scroll_frame) self.paned_window = tk.PanedWindow(self.scroll_frame, orient=tk.VERTICAL, name="acct_period") self.paned_window.rowconfigure(0, weight=1) self.paned_window.columnconfigure(0, weight=1) self.paned_window.grid(row=0, column=0, sticky=tk.NSEW) self.add_option_btn = ttk.Button(self, text="Add Period", command=self.add_option) self.add_option_btn.grid(row=1, column=0) self.acct_period_selection = [] @debug(lvl=logging.DEBUG, prefix='') def add_option(self): something = AcctPeriod(acct_frame=self, acct_paned_window=self.paned_window) self.acct_period_selection.append(something) self.paned_window.add(something, sticky=tk.NSEW, stretch="never") self.scroll_frame.event_generate("<Configure>") # noinspection PyUnusedLocal @debug(lvl=logging.DEBUG, prefix='') def validate_selection(self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name): # if value_if_allowed != "": return True
class UploadMapping(object): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.NOTSET, prefix='') def __init__(self, mapping_id, datatype, label, col_obj, ws_col_obj=None, static_value=None): self.mapping_id = mapping_id self.datatype = datatype self.label = label self.col_obj = col_obj self.ws_col_obj = ws_col_obj self.static_value = static_value
class ProdNumInv(InvoiceDetailColumn): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = "Prod_Num" header = "Product Num" abbrev = "Prod. Num" metric = False cell_format = "InteriorTextCell" @debug(lvl=logging.NOTSET, prefix="") def grid_init(self, key, list_frame, parent, **kwargs): super().grid_init(key, list_frame, parent, **kwargs) # self.sel_check_btn.state(['selected', 'disabled']) self.delete_item.grid_forget() @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): return cls.table().c.PRODUCTCODE
class ColumnObject(OrderableListItemEntryCheckbutton): logger = CustomAdapter(logging.getLogger(str(__name__)), None) label = None header = None abbrev = None metric = False cell_format = "InteriorTextCell" @debug(lvl=logging.NOTSET, prefix='') def __init__(self, show_check=False, checkbox_label=""): self.label = self.__class__.label self.header = self.__class__.header self.abbrev = self.__class__.abbrev self.metric = self.__class__.metric super().__init__(title=self.header, dflt_entry=self.abbrev, show_check=show_check, checkbox_label=checkbox_label) @debug(lvl=logging.NOTSET, prefix='') def labeled_col(self): return self.column().label(self.entry_var.get()) @staticmethod @debug(lvl=logging.NOTSET, prefix="") def table(self): raise NotImplementedError @classmethod @debug(lvl=logging.NOTSET, prefix="") def column(cls): raise NotImplementedError @staticmethod @debug(lvl=logging.NOTSET, prefix="") def apply_join(query): raise NotImplementedError @debug(lvl=logging.NOTSET, prefix='') def __str__(self): return self.abbrev
class PriceList(tk.Toplevel): logger = CustomAdapter(logging.getLogger(str(__name__)), None) @debug(lvl=logging.DEBUG, prefix='') def __init__(self, master, *args, **kwargs): # ttk.Frame.place self.master = master self.name = str(PriceList.__name__).lower() super().__init__(name=self.name, *args, **kwargs) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.title("Filtering Criteria") self.iconbitmap(config.ICON_FILE) self.protocol("WM_DELETE_WINDOW", self.close) self.paned_outer = PanedWindowVertical(self, name="paned_outer", sashrelief=tk.RAISED, sashwidth=7) self.paned_outer.grid(row=0, column=0, sticky=tk.NSEW) print(dir(self.paned_outer)) for thing in range(1, 5): something = PanedEntryFrame(master=self.paned_outer, name=str(thing), toplevel=self) self.paned_outer.add(something, width=something.winfo_reqwidth(), pady=5, padx=5, stretch="always") center_window(win_obj=self) @debug(lvl=logging.DEBUG, prefix='') def close(self): msgbox = messagebox.askokcancel("Quit", "Do you want to quit?", parent=self) if msgbox: self.destroy()