from attribution import AttributionReport __author__ = 'tsouza' import Tkinter as tk import tkFileDialog import tkMessageBox from utils import get_dropbox_dir class AttributeGUI(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.salesforce_filename = None self.deposit_filename = None self.output_directoryname = None self.defaults = { 'sf_label': u"", 'dp_label': u"", 'output_label': u"" } self.reset() def reset(self): self.initGUI() self.report = AttributionReport(months=6, footer_length=6) # TODO MAKE MONTHS A DROPDOWN self._check_ready_to_run() def initGUI(self): self.title('Attribution Report') self.grid() self.minsize(width=300, height=200) # Input self.input_frame = self.setup_input_frame() self.input_frame.grid(row=0, column=0) self.rowconfigure(0, weight=0) # Output self.output_frame = self.setup_output_frame() self.output_frame.grid(row=1, column=0) self.rowconfigure(1, weight=0) # Run self.run_frame = self.setup_run_frame() self.run_frame.grid(row=2, column=0) self.rowconfigure(2, weight=0) self.update() self.minsize(self.winfo_width(), self.winfo_height()) self.resizable(True, False) def setup_input_frame(self): input_frame = tk.LabelFrame(text="Input Files") input_frame.grid() row = 0 input_frame.sf_button = tk.Button(input_frame, text=u"Browse", command=self.sf_click) input_frame.sf_button.grid(column=0, row=row) input_frame.sf_label_var = tk.StringVar() input_frame.sf_label = tk.Label(input_frame, textvariable=input_frame.sf_label_var, anchor="w") input_frame.sf_label.grid(column=1, row=row, sticky='nsew') input_frame.sf_label_var.set(self.defaults['sf_label']) row += 1 input_frame.dp_button = tk.Button(input_frame, text=u"Browse", command=self.dp_click) input_frame.dp_button.grid(column=0, row=row) input_frame.dp_label_var = tk.StringVar() input_frame.dp_label = tk.Label(input_frame, textvariable=input_frame.dp_label_var, anchor="w") input_frame.dp_label.grid(column=1, row=row, sticky='nsew') input_frame.dp_label_var.set(self.defaults['dp_label']) input_frame.grid_columnconfigure(1, weight=1) return input_frame def setup_output_frame(self): output_frame = tk.LabelFrame(text="Output Directory") output_frame.grid() row = 0 output_frame.output_button = tk.Button(output_frame, text=u"Browse", command=self.output_click) output_frame.output_button.grid(column=0, row=row) output_frame.output_label_var = tk.StringVar() output_frame.sf_label = tk.Label(output_frame, textvariable=output_frame.output_label_var, anchor="w") output_frame.sf_label.grid(column=1, row=row, sticky='nsew') output_frame.output_label_var.set(self.defaults['output_label']) output_frame.grid_columnconfigure(0, weight=1) return output_frame def setup_run_frame(self): run_frame = tk.LabelFrame(text="Output Directory") run_frame.grid() row = 0 run_frame.run_button = tk.Button(run_frame, text=u"Run", command=self.run_click) run_frame.run_button.grid(column=0, row=row) run_frame.grid_columnconfigure(0, weight=1) return run_frame def sf_click(self): self.salesforce_filename = tkFileDialog.askopenfilename( title="Salesforce Export File", initialdir=get_dropbox_dir(), filetypes=( ("Comma Separated", "*.csv"), ("Excel", "*.xls"), ("Excel", "*.xlsx"), ) ) if self.salesforce_filename: df_parse_successful = self.report.set_dataframe_sf(self.salesforce_filename) if df_parse_successful: self.input_frame.sf_label_var.set(self.salesforce_filename) else: self.input_frame.sf_label_var.set(self.defaults['sf_label']) tkMessageBox.showerror( "Column Mismatch", ("At a minimum, the Salesforce file must have the following columns:\n\n" "{0}\n\n" "Please re-run and select a proper file.".format(", ".join(self.report.REQUIRED_SF_COLUMNS)) ) ) self._check_ready_to_run() def dp_click(self): self.deposit_filename = tkFileDialog.askopenfilename( title="Deposit Data Export File", initialdir=get_dropbox_dir(), filetypes=( ("Comma Separated", "*.csv"), ("Excel", "*.xls"), ("Excel", "*.xlsx"), ) ) if self.deposit_filename: df_parse_successful = self.report.set_dataframe_deposit(self.deposit_filename) if df_parse_successful: self.input_frame.dp_label_var.set(self.deposit_filename) else: self.input_frame.dp_label_var.set(self.defaults['dp_label']) tkMessageBox.showerror( "Column Mismatch", "At a minimum, the Deposit Data file must have the following columns:\n\n" "{0}\n\n" "Please re-run and select a proper file.".format( ",\n".join(self.report.REQUIRED_DP_COLUMNS))) self._check_ready_to_run() def output_click(self): self.output_directoryname = tkFileDialog.askdirectory( initialdir=get_dropbox_dir(), ) if self.output_directoryname: self.report.set_output_dir(self.output_directoryname) self.output_frame.output_label_var.set(self.output_directoryname) self._check_ready_to_run() def _check_ready_to_run(self): if self.report.salesforce_df is not None and self.report.deposit_df is not None and self.report.output_dir: self.run_frame.run_button.config(state=tk.NORMAL) else: self.run_frame.run_button.config(state=tk.DISABLED) self.update() def run_click(self): try: self.report.run() self.report.save() except Exception, e: tkMessageBox.showerror("EXCEPTION", str(e)) self.quit() return self.reset() def main(): app = AttributeGUI() app.mainloop() if __name__ == "__main__": main()