class AppointmentInput(simpledialog.Dialog):
    def body(self, master):
        self.parent = master
        self.frame = tk.Frame(self.parent)
        self.resizable(width=False, height=False)
        self.storage = StorageDb('wfm.sqlite')
        self.settings = Settings()
        self.helper = Helper()
        self.init_variables()
        self.create_dispatcherEntries()
        self.frame.pack(expand=1, fill="both")
        
    def init_variables(self):
        self.value = tk.StringVar()
        self.description = tk.StringVar()
        self.active = tk.IntVar()
        self.selected_id = tk.IntVar()
        self.is_OK = tk.BooleanVar()

        self.TABLE = 'dispatchers'
        selected_table = self.settings.GetSetting('selected_table') # get selected id from settings
        if self.helper.is_notEmpty(selected_table):
            self.TABLE = selected_table
        action = self.settings.GetSetting('action_button') # get selected id from settings
        if action and action == 'EDIT':
            id = self.settings.GetSetting('selected_id') # get selected id from settings
            if id :
                row = self.storage.GetResults("select * from %s where id = %s" % (self.TABLE, id))
                if len(row)>0:
                    self.value.set(row[0]['value'])
                    self.description.set(row[0]['description'])
                    self.active.set(row[0]['active'])
        pass

    def create_dispatcherEntries(self):
        self.lbl_Header = tk.Label(self.frame, text="Appointment Search Options", font='Tahoma 8 bold', fg = 'gray')
        self.lbl_Header.grid(row=0, column=0, columnspan=4, sticky='W', padx=1, pady=6)
        self.lbl_Note = tk.Label(self.frame, text="Please provide your desired appointment search filter", fg ='green')
        self.lbl_Note.grid(row=1, column=0, columnspan=5, sticky='W', padx=5, pady=2)
        
        self.lbl_value = tk.Label(self.frame, text="Value:")
        self.lbl_value.grid(row=2, column=0, sticky='W', padx=5, pady=2)
        self.txt_value = tk.Entry(self.frame, textvariable=self.value, width=40)
        self.txt_value.grid(row=2, column=1, sticky="W", padx=4, pady=2)

        self.lbl_desc = tk.Label(self.frame, text="Description:")
        self.lbl_desc.grid(row=3, column=0, sticky='W', padx=5, pady=2)
        self.txt_desc = tk.Entry(self.frame, textvariable=self.description, width=60)
        self.txt_desc.grid(row=3, column=1, sticky="W", padx=4, pady=2)
        
        self.chk_active = tk.Checkbutton(self.frame, text="Active", variable=self.active,onvalue=1, offvalue=0)
        self.chk_active.grid(row=4, column=1, columnspan =3,sticky='W', pady=2)
        pass

    def ok(self):
        self.is_OK.set(True)
        self.destroy()
    def cancel(self):
        self.is_OK.set(False)
        self.destroy()
class DispatcherDialog(simpledialog.Dialog):
    def body(self, master):
        self.parent = master
        self.frame = tk.Frame(self.parent)
        self.resizable(width=False, height=False)
        self.iconbitmap('tarsier.ico')
		
        self.storage = StorageDb('wfm.sqlite')
        self.settings = Settings()
        self.helper = Helper()
        self.init_variables()

        self.tab_control = ttk.Notebook(self.parent)
        self.img_tab = {}
        self.tabs = ["Appointment Booking Detail"]
        for tab in self.tabs:
            tabPage = ttk.Frame(self.tab_control)   # first page, which would get widgets gridded into it
            self.img_tab[tab] = PhotoImage(file=str("images/%s.png" % tab.replace(' ','')))
            self.tab_control.add(tabPage, text= tab, image =self.img_tab[tab], compound=LEFT)
            if tab is 'Authentication':
                #self.create_authTab(tabPage)
                pass
            else:
                self.create_dispatcherTab(tabPage)
                pass

        self.init_dispatchers()

        self.btn_add = tk.Button(self.frame, text='Add', image= self.img_add,compound= LEFT, command=self.add_dispatcher)
        self.btn_add.grid(row=0, column=0, sticky="E", padx=2, pady=2)
        
        self.btn_edit = tk.Button(self.frame, text='Edit', image= self.img_edit,compound= LEFT,command=self.edit_dispatcher)
        self.btn_edit.grid(row=0, column=2, sticky="E", padx=2, pady=2)

        self.btn_delete = tk.Button(self.frame, text='Delete', image= self.img_remove,compound= LEFT,command=self.delete_dispatcher)
        self.btn_delete.grid(row=0, column=3, sticky="E", padx=2, pady=2)

        self.tab_control.pack(expand=1, fill="both")
        self.frame.pack(expand=1, fill="both")
        
    def init_variables(self):
        self.value = tk.StringVar()
        self.description = tk.StringVar()
        self.active = tk.IntVar()
        self.selected_id = tk.StringVar()
        
        self.img_add = PhotoImage(file="images/list_add.png") 
        self.img_edit = PhotoImage(file="images/list_edit.png") 
        self.img_remove = PhotoImage(file="images/list_remove.png") 
        self.img_warning = PhotoImage(file="images/warning.png") 
        self.img_active = PhotoImage(file="images/yes.png") 
        self.img_notactive = PhotoImage(file="images/no.png") 
        
        self.DISPATCHERS = 'dispatchers'
        self.TABLE = 'dispatchers'
        selected_table = self.settings.GetSetting('selected_table') # get selected id from settings
        if self.helper.is_notEmpty(selected_table):
            self.TABLE = selected_table

        pass

    def create_dispatcherTab(self, tabPage):
        self.treeAppointment = ttk.Treeview(tabPage, selectmode='browse')
        verticalScroll = ttk.Scrollbar(tabPage, orient='vertical', command=self.treeAppointment.yview)
        verticalScroll.pack(side='right', fill='y')
        horScroll = ttk.Scrollbar(tabPage, orient='horizontal', command=self.treeAppointment.xview)
        horScroll.pack(side='bottom', fill='x')
        
        self.treeAppointment.configure(yscrollcommand=verticalScroll.set)
        self.treeAppointment.configure(xscrollcommand=horScroll.set)

        self.treeAppointment['columns'] = ('value','description', 'active')
        #self.treeAppointment['show'] = 'headings'
        self.treeAppointment.heading("#0", text='id', anchor='w')
        #self.treeAppointment.column("#0", anchor="w", width=20)
        self.treeAppointment.heading('value', text='Value')
        self.treeAppointment.column('value', anchor='w')
        self.treeAppointment.heading('description', text='Description')
        self.treeAppointment.column('description', anchor='w')
        self.treeAppointment.heading('active', text='Active')
        self.treeAppointment.column('active', anchor='center', width=20)
        self.treeAppointment.pack(expand=1, fill='both')
        pass

    def init_dispatchers(self):
        self.treeAppointment.delete(*self.treeAppointment.get_children())
        rows = self.storage.FetchAllRows(self.TABLE)
        if len(rows) > 0:
            for row in rows:
                img = self.img_notactive
                if row['active'] ==1:
                    img = self.img_active
                self.treeAppointment.insert('', 'end',  image =  img, text=row['id'], values= (row['value'],row['description'],row['active']))
        else:
            self.treeAppointment.insert('', 'end', image =  self.img_warning, text='', values= ('No data found!','',''))
        self.treeAppointment.bind('<ButtonRelease-1>', self.itemClicked)
        self.selected_id.set('') # clear selected id
        self.settings.SetSettings('selected_id', '') # clear selected id from settings
        pass
    

    def itemClicked(self, event):
        #print('Item clicked....')
        curItem = self.treeAppointment.focus()
        self.selected_id.set(self.treeAppointment.item(curItem, "text"))
        #print(self.selected_id.get())
        self.settings.SetSettings('selected_id', self.selected_id.get())
       # print(self.treeAppointment.item(curItem))
       # print(self.treeAppointment.item(curItem, "text"))
       # print(self.treeAppointment.item(curItem, "values")[0])

    def add_dispatcher(self):
        self.settings.SetSettings('action_button', 'ADD') # set an action button that in dialog
        d = AppointmentInput(self.parent,title='Add '+ self.TABLE.title())
        if d.is_OK.get() is True:
            print ('OK........')
            if self.helper.is_notEmpty(d.value.get()) and self.helper.is_notEmpty(d.description.get()):
                content_val = {}
                content_val['value'] = self.helper.trim_spaces(d.value.get())
                content_val['description'] = self.helper.trim_spaces(d.description.get())
                content_val['active'] = 1
                if self.storage.IsExist(self.TABLE, 'value', d.value.get().strip()):
                    self.storage.UpdateParameterized(self.TABLE, content_val, "value='" + d.value.get().strip() + "'")
                else:
                    self.storage.InsertParameterized(self.TABLE, content_val)
                self.init_dispatchers()
        pass
    def edit_dispatcher(self):
        self.settings.SetSettings('action_button', 'EDIT') # set an action button that in dialog
        if self.helper.is_notEmpty(self.selected_id.get()):
            d = AppointmentInput(self.parent,title='Edit '+ self.TABLE.title())
            if self.helper.is_notEmpty(d.value.get()) and self.helper.is_notEmpty(d.description.get()):
                content_val = {}
                content_val['value'] = self.helper.trim_spaces(d.value.get())
                content_val['description'] = self.helper.trim_spaces(d.description.get())
                content_val['active'] =d.active.get()
                self.storage.UpdateParameterized(self.TABLE, content_val, "id=" + str(self.selected_id.get()))
                self.init_dispatchers()
        pass
    
    def delete_dispatcher(self):
        self.settings.SetSettings('action_button', 'DELETE') # set an action button that in dialog
        pass

    def get_selectedId(self):
        return self.selected_id.get()
class Application(Frame):
    WFM_TABLE = 'all_data'

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.init_externalClasses()
        self.init_globalVariables()
        self.init_settings()
        self.init_uiImages()
        self.parent = parent

        self.parent.protocol("WM_DELETE_WINDOW", self.onExit)
        self.parent.bind("<Destroy>", lambda e: self.onExit)

        self.initMenubar()
        self.initToolbar()
        self.initPanedWindow()
        self.create_StatusBar()
        #self.LoadTable()
        self.parent.config(menu=self.menubar)
        self.pack()

        self.start_dataThread()

        if self.is_loading == False:
            self.treeview.bind('<ButtonRelease-1>', self.itemClicked)

        #self.grid(sticky = (N,S,W,E))
        #self.parent.grid_rowconfigure(0, weight = 1)
        #self.parent.grid_columnconfigure(0, weight = 1)
    def start_dataThread(self):
        try:
            self.thread = Thread(target=self.load_dataTable,
                                 name=str(datetime.datetime.now()))
            self.is_loading = True
            self.progressbar.pack(side=LEFT)
            # change the cursor
            self.parent.config(cursor="wait")
            # force Tk to update
            self.parent.update()

            # start the thread and progress bar
            self.thread.start()
            self.progressbar.start()
            # check in 50 milliseconds if the thread has finished
            self.parent.after(50, self.loading_completed)
        except:
            pass

    def init_externalClasses(self):
        self.storage = StorageDb('wfm.sqlite')
        self._helper = Helper()
        self.settings = Settings()
        #self.component = Components()

    def init_settings(self):
        self.kill_ie.set(self.settings.GetSetting('kill_ie'))
        self.is_visible.set(self.settings.GetSetting('is_visible'))
        self.parser.set(self.settings.GetSetting('parser'))
        self.is_send.set(self.settings.GetSetting('send'))
        self.is_append.set(self.settings.GetSetting('append'))
        self.folder_location.set(self.settings.GetSetting('exportto'))
        self.multi_attachments.set(self.settings.GetSetting('multi_attach'))
        self.is_subfolder.set(self.settings.GetSetting('subfolder'))
        self.is_subject.set(self.settings.GetSetting('is_subject'))
        self.is_filename.set(self.settings.GetSetting('is_filename'))
        self.username.set(self.settings.GetSetting('username'))
        self.password.set(self.settings.GetSetting('password'))
        self.url_login.set(self.settings.GetSetting('url_login'))
        self.url_main.set(self.settings.GetSetting('url_main'))
        self.default_subject.set(self.settings.GetSetting('default_subject'))
        self.default_filename.set(self.settings.GetSetting('default_filename'))
        self.overwite_existing.set(
            self.settings.GetSetting('overwite_existing'))
        self.auto_export.set(self.settings.GetSetting('auto_export'))
        self.workspace_name.set(self.settings.GetSetting('workspace_name'))
        self.wfm_table.set(self.settings.GetSetting('wfm_table'))
        self.date_from.set(
            self.settings.GetSetting('selected_dateFrom').strip())
        self.date_to.set(self.settings.GetSetting('selected_dateTo').strip())
        self.set_WFMTable(self.wfm_table.get()
                          )  # set wfm table to all variable handle with it
        #self.set_WFMTable(TABLE_ALLDATA) # set wfm table to all variable handle with it

        self.date_filter = []
        rows = self.storage.GetResults(
            'select distinct(CabinetNo) from %s order by CabinetNo asc' %
            (self.wfm_table.get()))
        if len(rows) > 0:
            for r in rows:
                self.date_filter.append(r['CabinetNo'])

    def init_globalVariables(self):
        self.images_tools = {}
        self.images_menu = {}
        self.images_navs = {}
        self.filename = StringVar()
        self.wfm_table = StringVar()
        self.image_folder = StringVar()
        self.search_keyword = StringVar()
        self.lbl_status = StringVar()
        self.lbl_wfmTable = StringVar()
        self.filter = StringVar()
        self.count_page = StringVar()
        self.rows_count = StringVar()
        self.workspace_name = StringVar()

        self.progress = IntVar()
        self.progress.set(0)
        self.progress_maximum = IntVar()
        self.progress_maximum.set(100)

        # Settings variables
        self.is_append = IntVar()
        self.is_send = IntVar()
        self.is_subject = IntVar()
        self.is_subfolder = IntVar()
        self.is_filename = IntVar()
        self.multi_attachments = IntVar()
        self.overwite_existing = IntVar()
        self.auto_export = IntVar()
        self.default_subject = StringVar()
        self.default_filename = StringVar()
        self.folder_location = StringVar()
        self.url_login = StringVar()
        self.url_main = StringVar()
        self.username = StringVar()
        self.password = StringVar()
        self.parser = StringVar()
        self.date_from = StringVar()
        self.date_to = StringVar()
        self.kill_ie = IntVar()
        self.is_visible = IntVar()
        self.bullet = "*"  # specifies bullet character

        self.is_loading = False

        self.openfdialog_filter = 'Open supported files'
        self.savefdialog_filter = 'Save As created file'
        self.menus = {
            "File": [
                "New", "Start Crawl", "Refresh", "-", "Save", "Save As...",
                "-", "Print Preview", "Preferences...", "-", "Exit"
            ],
            "Appointment": ["Companies", "Dispatchers", "Status"],
            "Options": ["Server Connection", "Recipients", "-", "Preferences"],
            "View": [
                "check#Workspace", "check#Toolbar", "check#Statusbar", "-",
                "check#Large Icons"
            ],
            "Help": ["Documentation", "About"]
        }
        self.tools = {
            "File": [
                "New", "StartCrawl", "Refresh", "All", "-", "Save", "SaveAs",
                "PrintPreview", "-"
            ],
            "Appointment": ["Companies", "Dispatchers", "Status", "-"],
            "Options": ["ServerConnection", "Recipients", "Preferences", "-"],
            "Help": ["Documentation", "About"]
        }
        self.navs = ["nav_first", "nav_previous", "nav_next", "nav_last"]

        self.img_workpaces = PhotoImage(file="images/Workpaces.png")
        self.img_errors = PhotoImage(file="images/CrawlErrors.png")
        self.img_find = PhotoImage(file="images/Find.png")
        self.img_filter = PhotoImage(file="images/filter.png")
        self.img_filter_advanced = PhotoImage(
            file="images/filter_advanced.png")
        self.img_works = PhotoImage(file="images/works.png")
        self.img_error = PhotoImage(file="images/error.png")
        self.img_warning = PhotoImage(file="images/warning.png")

    def init_uiImages(self):
        self.image_path = os.path.join(
            os.path.dirname(os.path.realpath(__file__)), "images")
        self.image_folder = os.path.join(self.image_path, '16')
        if False:
            self.image_folder = os.path.join(self.image_path, '32')
        print(self.image_folder)

    def new_Crawl(self):
        pass

    def doClickEvent(self, index, tag):
        if self.is_loading == True:  # block click event if loading data in process
            return

        if tag.find('check#') != -1:
            print('index: %s label: %s' % (index, tag))
            print(self.check[index].get())
        else:
            if tag is 'Open':
                self.filename = filedialog.askopenfilename(
                    initialdir="/",
                    title=self.openfdialog_filter,
                    filetypes=(("Supported Files (*.py)", "*.py"),
                               ("All Files", "*.*")))
                print(self.filename)
            elif tag.find('Server') != -1:
                s = ServerDialog(self.parent, title=tag)
            elif tag is 'SaveAs':
                self.filename = filedialog.asksaveasfilename(
                    initialdir="/",
                    title=self.savefdialog_filter,
                    filetypes=(("Supported Files (*.py)", "*.py"),
                               ("All Files", "*.*")))
            elif tag is 'Recipients':
                r = RecipientDialog(self.parent, title="Email Addresses ")
            elif tag is 'New':
                c = ConfigCrawlDialog(self.parent, title="New Crawl")
                self.init_settings()
                self.init_workspaces()
            elif tag.find('Preferences') != -1:
                o = OptionsDialog(self.parent, title=tag)
            elif tag.find('About') != -1:
                a = AboutDialog(self.parent, title=tag)
            elif tag.find('Dispatchers') != -1:
                self.settings.SetSettings(
                    'selected_table',
                    'dispatchers')  # set an action button that in dialog
                d = DispatcherDialog(self.parent, title=tag)
            elif tag.find('Companies') != -1:
                self.settings.SetSettings(
                    'selected_table',
                    'companies')  # set an action button that in dialog
                d = DispatcherDialog(self.parent, title=tag)
            elif tag.find('Refresh') != -1:
                self.init_workspaces()
                self.start_dataThread()
            elif tag.find('All') != -1:
                res = messagebox.askquestion(
                    'Load All Crawled Data',
                    'This may take a few time.\nAre you sure you want to load all crawled data from WFM?'
                )
                if res == 'yes':
                    self.set_WFMTable(TABLE_ALLDATA)
                    self.start_dataThread()
            elif tag.find('Status') != -1:
                self.settings.SetSettings(
                    'selected_table',
                    'status')  # set an action button that in dialog
                d = DispatcherDialog(self.parent, title=tag)

            elif tag.find('Exit') != -1:
                self.onExit()
            elif tag.find('StartCrawl') != -1:
                if self.kill_ie.get() == 1:
                    self.process.kill_process('iexplore.exe')

                self.crawlDialog = CrawlerDialog(self.parent)  # init GUI
                #self.crawler = Crawler(self.crawlDialog) #init Controller
                #self.crawler.startCrawler()

            else:
                print('doClickEvent  index: %s label: %s' % (index, tag))

    def initMenubar(self):
        images_folder_format = "images/16/%s-%s.png"
        self.menubar = Menu(self.parent)
        filemenu = Menu(self.menubar, tearoff=0)

        self.check_menus = []
        self.check = {}
        index = 0
        for key, value in self.menus.items():
            topMenu = Menu(self.menubar, tearoff=0)
            for menu in value:
                if menu is "-":
                    topMenu.add_separator()
                else:
                    if menu.startswith('check#'):
                        trim_name = menu.replace('check#', '')
                        self.check[index] = StringVar(
                        )  #handles check state dynamically by check menu index
                        topMenu.add_checkbutton(
                            label=trim_name,
                            variable=self.check[index],
                            onvalue=1,
                            offvalue=0,
                            command=(lambda tag=menu, i=index: self.
                                     doClickEvent(i, tag)))
                        self.check_menus.append((index, trim_name))
                        index += 1
                    else:
                        self.images_menu[menu] = PhotoImage(
                            file=str(images_folder_format %
                                     (key,
                                      self._helper.non_alphanumeric(menu))))
                        topMenu.add_command(
                            label=menu,
                            compound=LEFT,
                            image=self.images_menu[menu],
                            command=lambda tag=menu: self.doClickEvent(0, tag))
            self.menubar.add_cascade(label=key, menu=topMenu)

    def initToolbar(self):
        self.toolbar = Frame(self.parent, bd=1, relief=RAISED)
        images_folder_format = "images/16/%s-%s.png"
        if False:
            images_folder_format = "images/32/%s-%s.png"

        for key, value in self.tools.items():
            for tool in value:
                self.images_tools[tool] = PhotoImage(
                    file=str(images_folder_format % (key, tool)))
                self.btn_tool = Button(
                    self.toolbar,
                    image=self.images_tools[tool],
                    text=tool,
                    relief=FLAT,
                    justify=CENTER,
                    command=lambda tag=tool: self.doClickEvent(0, tag))
                self.btn_tool.image = self.images_tools[tool]
                if tool is "-":
                    self.btn_tool.configure(state=NORMAL)
                self.btn_tool.pack(side=LEFT, padx=2, pady=2)
                #toolbars.append((tool, btn_tool))
        self.toolbar.pack(side=TOP, fill=X)

    def initPanedWindow(self):
        #self.paned_window = PanedWindow(bg="green")
        self.paned_window = PanedWindow()
        self.paned_window.pack(fill=BOTH, expand=1)

        self.leftPaneComponents()

        self.top_paned_window = PanedWindow(self.paned_window, orient=VERTICAL)
        self.paned_window.add(self.top_paned_window)

        top_frame = ttk.Frame(self.top_paned_window)
        nav_buttons = ['<<', '<', '>', '>>']

        #for b in nav_buttons:
        for b in self.navs:
            self.images_navs[b] = PhotoImage(file=str('images/%s.png' % (b)))
            btn_nav = Button(top_frame,
                             image=self.images_navs[b],
                             text=b,
                             relief=GROOVE,
                             justify=CENTER,
                             command=lambda tag=b: self.doClickEvent(0, tag))
            #btn_nav = Button(top_frame, text= b,relief=GROOVE)
            btn_nav.pack(side=LEFT, padx=0, pady=0)
        top_frame.pack(fill=X, padx=200)
        self.top_paned_window.add(top_frame)
        cbox_CountPage = ttk.Combobox(top_frame,
                                      textvariable=self.count_page,
                                      state="readonly",
                                      width=4)
        cbox_CountPage.bind('<Return>')
        cbox_CountPage['values'] = ('All', '10', '25', '50', '75', '100',
                                    '150', '200')
        cbox_CountPage.current(0)
        cbox_CountPage.pack(side=LEFT, padx=1, pady=1)
        lbl_Search = Label(top_frame, text="Search:")
        lbl_Search.pack(side=LEFT, padx=1, pady=1)
        txt_Search = Entry(top_frame,
                           text='Keyword',
                           textvariable=self.search_keyword)
        txt_Search.pack(side=LEFT, padx=1, pady=1)
        btn_Search = Button(
            top_frame,
            text='Find',
            image=self.img_find,
            relief=GROOVE,
            justify=CENTER,
            command=lambda tag='Find': self.doClickEvent(0, tag))
        btn_Search.pack(side=LEFT, padx=1, pady=1)

        lbl_Filter = Label(top_frame, text="Filter:")
        lbl_Filter.pack(side=LEFT, padx=1, pady=1)
        cbox_Filter = ttk.Combobox(top_frame,
                                   textvariable=self.filter,
                                   state="readonly",
                                   width=10)
        cbox_Filter.bind('<Return>')
        cbox_Filter['values'] = self.date_filter
        #cbox_Filter.current(0)
        cbox_Filter.pack(side=LEFT, padx=1, pady=1)
        #cbox_Filter.grid(row=1, column=1, columnspan=7, sticky="WE", pady=3)
        btn_Filter = Button(
            top_frame,
            text='Filter',
            image=self.img_filter,
            relief=GROOVE,
            justify=CENTER,
            command=lambda tag='Filter': self.doClickEvent(0, tag))
        btn_Filter.pack(side=LEFT, padx=1, pady=1)
        btn_FilterAdvanced = Button(
            top_frame,
            text='Filter Advanced',
            image=self.img_filter_advanced,
            relief=GROOVE,
            justify=CENTER,
            command=lambda tag='Filter Advanced': self.doClickEvent(0, tag))
        btn_FilterAdvanced.pack(side=LEFT, padx=1, pady=1)

        label = Label(top_frame,
                      textvariable=self.rows_count,
                      bd=1,
                      relief=FLAT,
                      anchor=W)
        self.rows_count.set('15 of 40')
        label.pack(side=LEFT, fill=X)

        self.initTable()

    def create_StatusBar(self):
        self.status_frame = Frame(self.parent, bd=1, relief=GROOVE)
        self.status_frame.pack(fill=X)
        label = Label(self.status_frame,
                      textvariable=self.lbl_status,
                      anchor=W)
        self.lbl_status.set('Ready...')
        label.pack(side=LEFT)
        self.progressbar = ttk.Progressbar(self.status_frame,
                                           orient='horizontal',
                                           variable=self.progress,
                                           maximum=self.progress_maximum.get(),
                                           length=200)
        #self.progressbar.pack(expand=True, fill=BOTH, side=TOP)
        self.progressbar.pack(side=LEFT)
        #self.progress_load.start(0)

        lbl_TableDummy = Label(self.status_frame, text='Workspace:', anchor=W)
        lbl_TableDummy.pack(side=LEFT)
        lbl_Table = Label(self.status_frame,
                          text='Table:',
                          textvariable=self.lbl_wfmTable,
                          anchor=E,
                          fg='blue')
        self.lbl_wfmTable.set(self.wfm_table.get())
        lbl_Table.pack(side=LEFT)

    def leftPaneComponents(self):
        tabControl = ttk.Notebook(self.paned_window,
                                  width=200)  # Create Tab Control
        tabPage1 = ttk.Frame(tabControl)  # Create a tab
        tabPage2 = ttk.Frame(tabControl)  # Create a tab

        self.treeWorkspace = ttk.Treeview(tabPage1, selectmode='browse')
        verticalScroll = ttk.Scrollbar(tabPage1,
                                       orient='vertical',
                                       command=self.treeWorkspace.yview)
        verticalScroll.pack(side='right', fill='y')
        horScroll = ttk.Scrollbar(tabPage1,
                                  orient='horizontal',
                                  command=self.treeWorkspace.xview)
        horScroll.pack(side='bottom', fill='x')

        self.treeWorkspace.configure(yscrollcommand=verticalScroll.set)
        self.treeWorkspace.configure(xscrollcommand=horScroll.set)

        self.treeWorkspace['columns'] = ('count', 'details')
        #self.treeWorkspace['show'] = 'headings'
        self.treeWorkspace.heading("#0", text='Name', anchor='w')
        #self.treeWorkspace.column("#0", anchor="w", width=40)
        self.treeWorkspace.heading('count', text='Count')
        self.treeWorkspace.column('count',
                                  stretch='yes',
                                  anchor='center',
                                  width=14)
        self.treeWorkspace.heading('details', text='Details')
        self.treeWorkspace.column('details', anchor='center', width=20)

        self.init_workspaces()
        self.treeWorkspace.pack(expand=1, fill='both')

        tabPage1.pack(expand=1, fill="both")  # Pack to make visible
        tabPage2.pack(fill="both")  # Pack to make visible
        tabControl.add(tabPage1,
                       text='Workspaces',
                       image=self.img_workpaces,
                       compound=LEFT)  # Add the tab
        tabControl.add(tabPage2,
                       text='Error Links',
                       image=self.img_errors,
                       compound=LEFT)  # Add the tab
        tabControl.pack(expand=1, fill="both")  # Pack to make visible
        self.paned_window.add(tabControl)

    def init_workspaces(self):
        self.treeWorkspace.delete(*self.treeWorkspace.get_children())
        rows = self.storage.FetchAllRows(WORKSPACES)
        if len(rows) > 0:
            for row in rows:
                self.treeWorkspace.insert('',
                                          'end',
                                          image=self.img_works,
                                          text=row['name'],
                                          values=(row['count'],
                                                  row['details']))

            self.treeWorkspace.bind("<Double-1>", self.onDoubleClickWorkspace)
        else:
            self.treeWorkspace.insert('',
                                      'end',
                                      image=self.img_error,
                                      text='No data found!',
                                      values=('', ''))
        pass

    def initTable(self):
        self.treeview = ttk.Treeview(self.top_paned_window)

        #cols = self.storage.FetchAllColumns(TABLE_ALLDATA)
        cols = self.storage.FetchAllColumns(self.WFM_TABLE)
        self.columns = []
        if len(cols) > 0:
            for c in cols:
                col_name = c[1].strip()
                if col_name != 'id' and col_name != 'JobActivityList':
                    #print(col_name)
                    self.columns.append(col_name)
            self.treeview['columns'] = self.columns
            self.treeview.heading("#0", text='ID')
            self.treeview.column("#0", anchor='w', width=50)
            for c in self.columns:
                #self.treeview.heading(c, text=c.title())
                self.treeview.heading(c, text=c)
                self.treeview.column(c, anchor='w')

        ysb = Scrollbar(orient=VERTICAL, command=self.treeview.yview)
        xsb = Scrollbar(orient=HORIZONTAL, command=self.treeview.xview)
        self.treeview['yscroll'] = ysb.set
        self.treeview['xscroll'] = xsb.set

        # add tree and scrollbars to frame
        self.treeview.grid(in_=self.top_paned_window,
                           row=0,
                           column=0,
                           sticky=(N, S, W, E),
                           pady=50)
        ysb.grid(in_=self.top_paned_window, row=0, column=1, sticky="NS")
        xsb.grid(in_=self.top_paned_window, row=3, column=0, sticky="EW")

        self.top_paned_window.add(self.treeview)
        self.top_paned_window.rowconfigure(0, weight=1)
        self.top_paned_window.columnconfigure(0, weight=1)

    def load_dataTable(self):

        self.treeview.delete(*self.treeview.get_children())
        #rows = self.storage.FetchAllRows(TABLE_ALLDATA)
        rows = self.storage.FetchAllRows(self.WFM_TABLE)
        self.progress_maximum.set(
            len(rows))  # set maximum value of progressbar
        self.progressbar['maximum'] = len(rows)
        i = 1
        if len(rows) > 0:
            for row in rows:
                values = []
                id = row['id']
                for col in self.columns:
                    values.append(row[col])
                #time.sleep(0.1)
                self.progress.set(i)
                self.lbl_status.set('Loading ...%s of %s ' %
                                    (i, self.progress_maximum.get()))
                self.treeview.insert("", "end", text=id, values=values)
                #del values[:]
                #del values
                i += 1

        #self.treeview.bind('<ButtonRelease-1>', self.itemClicked)

    def loading_completed(self):
        if self.thread.is_alive():
            # if the thread is still alive check again in 50 milliseconds
            self.parent.after(50, self.loading_completed)
        else:
            # if thread has finished stop and reset everything
            self.progressbar.stop()
            self.progressbar.pack_forget()
            #self.browse_button.config(state="enabled")
            self.parent.config(cursor="")
            self.parent.update()
            self.is_loading = False
            self.lbl_status.set('Ready...')
            self.treeview.bind('<ButtonRelease-1>', self.onItemClicked)
            self.treeview.bind("<Double-1>", self.onDoubleClick)

    def onItemClicked(self, event):
        if self.is_loading == True:  # do nothing if data loading is still in progress
            return
        try:
            curItem = self.treeview.focus()
            print(self.treeview.item(curItem))
            print(self.treeview.item(curItem, "text"))
            print(self.treeview.item(curItem, "values")[0])
        except:
            pass

    def onDoubleClick(self, event):
        if self.is_loading == True:  # do nothing if data loading is still in progress
            return
        item = self.treeview.selection()[0]
        print("you clicked on", self.treeview.item(item, "text"))

    def onDoubleClickWorkspace(self, event):
        if self.is_loading == True:  # do nothing if data loading is still in progress
            return
        item = self.treeWorkspace.selection()[0]
        ws = self._helper.non_alphanumeric(
            self.treeWorkspace.item(item, "text")).lower()
        if self._helper.is_notEmpty(ws):
            print("you clicked on", ws)
            self.set_WFMTable(ws)
            self.start_dataThread(
            )  # start loading all data from selected workspace

    def set_WFMTable(self, table):
        self.wfm_table.set(table)
        self.WFM_TABLE = table
        self.settings.SetSettings('wfm_table', table)
        self.lbl_wfmTable.set(table)

    def onExit(self):
        try:
            if messagebox.askokcancel("Quit", "Do you want to quit?"):
                self.parent.destroy()
        except:
            pass
示例#4
0
class ServerDialog(simpledialog.Dialog):
    def body(self, master):
        frame = tk.Frame(master, width=500)
        self.resizable(width=False, height=False)
        self.iconbitmap('tarsier.ico')

        self.settings = Settings()
        self.arp = ArpTable()

        self.bullet = "*"  # specifies bullet character
        self.hostname = tk.StringVar()
        self.username = tk.StringVar()
        self.password = tk.StringVar()
        self.database = tk.StringVar()

        self.hostname.set(self.settings.GetSetting('server_hostname'))
        self.username.set(self.settings.GetSetting('server_username'))
        self.password.set(self.settings.GetSetting('server_password'))
        self.database.set(self.settings.GetSetting('server_database'))

        self.frame_server = tk.LabelFrame(frame, text="Server Authentication")
        self.frame_server.grid(row=0, column=0, sticky='W')
        self.frame_server.grid(padx=5, pady=5)

        self.lbl_Spacer1 = tk.Label(self.frame_server, text="", width=4)
        self.lbl_Spacer1.grid(row=0,
                              column=4,
                              columnspan=5,
                              sticky='W',
                              padx=5,
                              pady=2)

        self.lbl_hostname = tk.Label(self.frame_server, text="   Hostname:")
        self.lbl_hostname.grid(row=1, column=0, sticky='E', padx=5, pady=2)

        self.cbox_hostname = ttk.Combobox(self.frame_server,
                                          textvariable=self.hostname,
                                          state="readonly",
                                          width=28)
        self.cbox_hostname.bind('<Return>')
        self.cbox_hostname['values'] = self.arp.get_ips('192')
        self.cbox_hostname.current(0)
        self.cbox_hostname.grid(row=1,
                                column=1,
                                columnspan=2,
                                sticky="W",
                                pady=2)

        #self.txt_hostname = tk.Entry(self.frame_server, textvariable=self.hostname, width=28)
        #self.txt_hostname.grid(row=1, column=1,columnspan=2, sticky="W", pady=2)

        self.lbl_username = tk.Label(self.frame_server, text="   Username:"******"W",
                               pady=2)

        self.lbl_password = tk.Label(self.frame_server, text="Password:"******"W",
                               pady=2)

        self.lbl_database = tk.Label(self.frame_server, text="Database:")
        self.lbl_database.grid(row=4, column=0, sticky='E', padx=5, pady=2)

        self.txt_database = tk.Entry(self.frame_server,
                                     textvariable=self.database,
                                     width=31)
        self.txt_database.grid(row=4,
                               column=1,
                               columnspan=2,
                               sticky="W",
                               pady=2)

        self.lbl_Spacer1 = tk.Label(self.frame_server, text="", width=4)
        self.lbl_Spacer1.grid(row=5,
                              column=4,
                              columnspan=5,
                              sticky='W',
                              padx=5,
                              pady=2)

        frame.pack(expand=1, fill='both')

    def ok(self):
        self.settings.SetSettings('server_hostname', self.hostname.get())
        self.settings.SetSettings('server_username', self.username.get())
        self.settings.SetSettings('server_password', self.password.get())
        self.settings.SetSettings('server_database', self.database.get())
        self.destroy()
示例#5
0
class OptionsDialog(simpledialog.Dialog):
    def body(self, master):
        self.parent = master
        self.frame = tk.Frame(self.parent, width=400)
        self.resizable(width=False, height=False)
        self.iconbitmap('tarsier.ico')

        self.helper = Helper()
        self.settings = Settings()

        self.init_variables()

        self.tab_control = ttk.Notebook(self.parent)
        self.img_tab = {}
        self.tabs = ["General", "Export", "WFM", "Parser"]
        for tab in self.tabs:
            tabPage = ttk.Frame(
                self.tab_control
            )  # first page, which would get widgets gridded into it
            self.img_tab[tab] = PhotoImage(file=str("images/%s.png" % tab))
            self.tab_control.add(tabPage,
                                 text=tab,
                                 image=self.img_tab[tab],
                                 compound=LEFT)
            if tab is 'General':
                self.create_generalTab(tabPage)
            if tab is 'Export':
                self.create_exportTab(tabPage)
            if tab is 'WFM':
                self.create_sitesTab(tabPage)
            if tab is 'Parser':
                self.create_parserTab(tabPage)
        self.tab_control.pack(expand=1, fill="both")  # Pack to make visible

        self.frame.pack(expand=1, fill="both")
        self.strg = StorageDb('wfm.sqlite')

        fields = {}
        fields['id'] = 'INTEGER PRIMARY KEY AUTOINCREMENT'
        fields['email'] = 'VARCHAR (50)'
        fields['active'] = 'INTEGER'
        self.strg.CreateTable('recipients', fields)

    def init_variables(self):
        self.is_append = tk.IntVar()
        self.is_send = tk.IntVar()
        self.is_subject = tk.IntVar()
        self.default_subject = tk.StringVar()
        self.multi_attachments = tk.IntVar()
        self.is_subfolder = tk.IntVar()
        self.is_filename = tk.IntVar()
        self.is_visible = tk.IntVar()
        self.kill_ie = tk.IntVar()
        self.default_filename = tk.StringVar()
        self.folder_location = tk.StringVar()
        self.overwite_existing = tk.IntVar()
        self.auto_export = tk.IntVar()
        self.url_login = tk.StringVar()
        self.url_main = tk.StringVar()

        self.username = tk.StringVar()
        self.password = tk.StringVar()
        self.parser = tk.StringVar()

        self.bullet = "*"  # specifies bullet character

        self.kill_ie.set(self.settings.GetSetting('kill_ie'))
        self.parser.set(self.settings.GetSetting('parser'))
        self.is_send.set(self.settings.GetSetting('send'))
        self.is_append.set(self.settings.GetSetting('append'))
        self.folder_location.set(self.settings.GetSetting('exportto'))
        self.multi_attachments.set(self.settings.GetSetting('multi_attach'))
        self.is_subfolder.set(self.settings.GetSetting('subfolder'))
        self.is_subject.set(self.settings.GetSetting('is_subject'))
        self.is_filename.set(self.settings.GetSetting('is_filename'))
        self.username.set(self.settings.GetSetting('username'))
        self.password.set(self.settings.GetSetting('password'))
        self.url_login.set(self.settings.GetSetting('url_login'))
        self.url_main.set(self.settings.GetSetting('url_main'))
        self.default_subject.set(self.settings.GetSetting('default_subject'))
        self.default_filename.set(self.settings.GetSetting('default_filename'))
        self.overwite_existing.set(
            self.settings.GetSetting('overwite_existing'))
        self.auto_export.set(self.settings.GetSetting('auto_export'))

        self.default_urlLogin = "******"
        self.default_urlMain = "https://wfm.coach.com/wfm/dailyview_entry?matrixAction=APPTBOOKINGDTL_ENTRY"

    def create_generalTab(self, parentTab):
        self.lbl_Gen = tk.Label(parentTab,
                                text="Email configuration",
                                font='Tahoma 8 bold',
                                fg='gray')
        self.lbl_Gen.grid(row=0,
                          column=0,
                          columnspan=2,
                          sticky='W',
                          padx=1,
                          pady=4)
        self.lbl_NoteGen = tk.Label(parentTab,
                                    text="Options in sending crawled data.",
                                    fg='darkgray')
        self.lbl_NoteGen.grid(row=1,
                              column=0,
                              columnspan=2,
                              sticky='W',
                              padx=5,
                              pady=1)

        self.chk_isAppend = tk.Checkbutton(
            parentTab,
            text="Append crawled data per Activity",
            variable=self.is_append,
            onvalue=1,
            offvalue=0)
        self.chk_isAppend.grid(row=2,
                               column=0,
                               columnspan=3,
                               sticky='W',
                               pady=2)

        self.chk_isSend = tk.Checkbutton(parentTab,
                                         text="Send after crawling",
                                         variable=self.is_send,
                                         onvalue=1,
                                         offvalue=0)
        self.chk_isSend.grid(row=3, column=0, columnspan=3, sticky='W', pady=2)

        self.chk_isSubject = tk.Checkbutton(parentTab,
                                            text="Default email subject:",
                                            variable=self.is_subject,
                                            onvalue=1,
                                            offvalue=0,
                                            command=self.is_subjectChecked)
        self.chk_isSubject.grid(row=4, column=0, sticky='W', pady=2)

        self.txt_subject = tk.Entry(parentTab,
                                    textvariable=self.default_subject,
                                    state="readonly",
                                    width=40)
        self.txt_subject.grid(row=4,
                              column=1,
                              columnspan=3,
                              sticky="WE",
                              pady=2)

        self.lbl_AttachmentMode = tk.Label(parentTab,
                                           text="Email attachment mode",
                                           font='Tahoma 8 bold')
        self.lbl_AttachmentMode.grid(row=5,
                                     column=0,
                                     columnspan=3,
                                     sticky='W',
                                     padx=1,
                                     pady=6)

        self.rbtn_single = tk.Radiobutton(parentTab,
                                          text="Attach exported single file",
                                          variable=self.multi_attachments,
                                          value=1,
                                          command=self.is_multiAttach)
        self.rbtn_single.grid(row=6,
                              column=0,
                              columnspan=3,
                              sticky='W',
                              padx=5,
                              pady=0)

        self.rbtn_multi = tk.Radiobutton(
            parentTab,
            text="Attach all exported file(s) inside folder",
            variable=self.multi_attachments,
            value=2,
            command=self.is_multiAttach)
        self.rbtn_multi.grid(row=7,
                             column=0,
                             columnspan=3,
                             sticky='W',
                             padx=5,
                             pady=0)

    def create_exportTab(self, parentTab):
        self.lbl_Exp = tk.Label(parentTab,
                                text="Export configuration",
                                font='Tahoma 8 bold',
                                fg='gray')
        self.lbl_Exp.grid(row=0,
                          column=0,
                          columnspan=2,
                          sticky='W',
                          padx=1,
                          pady=4)
        self.lbl_NoteExp = tk.Label(parentTab,
                                    text="Options in exporting crawled data.",
                                    fg='darkgray')
        self.lbl_NoteExp.grid(row=1,
                              column=0,
                              columnspan=2,
                              sticky='W',
                              padx=5,
                              pady=1)

        self.chk_isDateSubfolder = tk.Checkbutton(
            parentTab,
            text="Create Date subfolder",
            variable=self.is_subfolder,
            onvalue=1,
            offvalue=0,
            command=self.is_filenameChecked)
        self.chk_isDateSubfolder.grid(row=2,
                                      column=0,
                                      columnspan=4,
                                      sticky='W',
                                      pady=2)

        self.chk_isFilename = tk.Checkbutton(parentTab,
                                             text="Filename",
                                             variable=self.is_filename,
                                             onvalue=1,
                                             offvalue=0,
                                             command=self.is_filenameChecked)
        self.chk_isFilename.grid(row=3, column=0, sticky='W', pady=2)

        self.txt_filename = tk.Entry(parentTab,
                                     width=40,
                                     textvariable=self.default_filename,
                                     state="readonly")
        self.txt_filename.grid(row=3,
                               column=1,
                               columnspan=4,
                               sticky="WE",
                               pady=2)

        self.lbl_folder = tk.Label(parentTab, text="Export To:")
        self.lbl_folder.grid(row=4, column=0, sticky='W', padx=5, pady=2)

        self.txt_folder = tk.Entry(parentTab,
                                   width=40,
                                   textvariable=self.folder_location,
                                   state="readonly")
        self.txt_folder.grid(row=4,
                             column=1,
                             columnspan=4,
                             sticky="WE",
                             pady=2)

        self.img_browse = PhotoImage(file="images/browse.png")
        self.btn_browseFolder = tk.Button(parentTab,
                                          text="Browse",
                                          image=self.img_browse,
                                          compound=LEFT,
                                          command=self.getFolder)
        self.btn_browseFolder.grid(row=4, column=5, sticky='W', padx=5, pady=2)

        self.chk_overwiteExisting = tk.Checkbutton(
            parentTab,
            text="Overwite existing file if exist",
            variable=self.overwite_existing,
            onvalue=1,
            offvalue=0)
        self.chk_overwiteExisting.grid(row=5,
                                       column=0,
                                       columnspan=4,
                                       sticky='W',
                                       pady=2)

        self.chk_autoExport = tk.Checkbutton(
            parentTab,
            text="Automatic export crawled data",
            variable=self.auto_export,
            onvalue=1,
            offvalue=0)
        self.chk_autoExport.grid(row=6,
                                 column=0,
                                 columnspan=4,
                                 sticky='W',
                                 pady=2)

    def create_sitesTab(self, parentTab):
        self.lbl_WFM = tk.Label(parentTab,
                                text="WFM Authentication",
                                font='Tahoma 8 bold',
                                fg='gray')
        self.lbl_WFM.grid(row=0,
                          column=0,
                          columnspan=2,
                          sticky='W',
                          padx=1,
                          pady=4)
        self.lbl_Note = tk.Label(parentTab,
                                 text="Credentials use to login WFM site.",
                                 fg='darkgray')
        self.lbl_Note.grid(row=1,
                           column=0,
                           columnspan=2,
                           sticky='W',
                           padx=5,
                           pady=1)

        self.lbl_username = tk.Label(parentTab, text="   Username:"******"WE",
                               pady=2)

        self.lbl_password = tk.Label(parentTab, text="Password:"******"WE",
                               pady=2)

        self.lbl_Note1 = tk.Label(
            parentTab,
            text=
            "A predefined urls use in crawling, enter your url to modified.",
            fg='green')
        self.lbl_Note1.grid(row=4,
                            column=0,
                            columnspan=2,
                            sticky='W',
                            padx=5,
                            pady=2)

        self.lbl_Login = tk.Label(parentTab, text="Login URL:")
        self.lbl_Login.grid(row=5, column=0, sticky='W', padx=5, pady=2)

        #self.txt_urlLogin = tk.Entry(parentTab, width=50, justify=LEFT, textvariable=self.url_login)
        #self.txt_urlLogin.grid(row=5, column=1, columnspan=4, sticky="WE", pady=2)
        self.txt_urlLogin = tk.Text(parentTab, height=3, width=38)
        self.txt_urlLogin.grid(row=5,
                               column=1,
                               columnspan=4,
                               sticky="WE",
                               pady=2)
        self.txt_urlLogin.insert(tk.END, self.url_login.get())
        self.lbl_Main = tk.Label(parentTab, text="Main URL:")
        self.lbl_Main.grid(row=6, column=0, sticky='W', padx=5, pady=2)

        #self.txt_urlMain = tk.Entry(parentTab, width=50, justify=LEFT, textvariable=self.url_main)
        #self.txt_urlMain.grid(row=3, column=1, columnspan=4, sticky="WE", pady=2)
        self.txt_urlMain = tk.Text(parentTab, height=3, width=38)
        self.txt_urlMain.grid(row=6,
                              column=1,
                              columnspan=4,
                              sticky="WE",
                              pady=2)
        self.txt_urlMain.insert(tk.END, self.url_main.get())
        pass

    def create_parserTab(self, parentTab):
        self.lbl_Spacer2 = tk.Label(
            parentTab,
            fg="gray",
            wraplength=350,
            justify=LEFT,
            text=
            "For development purpose only.\nEnter parser (html.parser or lxml) or leave blank if you don't want to set parser."
        )
        self.lbl_Spacer2.grid(row=0,
                              column=0,
                              columnspan=4,
                              sticky='W',
                              padx=1,
                              pady=4)

        self.lbl_parser = tk.Label(parentTab, text="Parser:")
        self.lbl_parser.grid(row=1, column=0, sticky='E', padx=5, pady=2)

        self.txt_parser = tk.Entry(parentTab,
                                   textvariable=self.parser,
                                   width=23)
        self.txt_parser.grid(row=1,
                             column=1,
                             columnspan=4,
                             sticky="WE",
                             pady=2)

        self.lbl_Ex = tk.Label(parentTab,
                               text="Example ",
                               fg='gray',
                               justify=tk.LEFT)
        self.lbl_Ex.grid(row=2, column=0, sticky='E', padx=1, pady=1)

        self.lbl_Spacer1 = tk.Label(parentTab,
                                    text="html.parser\nlxml",
                                    fg='blue',
                                    justify=tk.LEFT)
        self.lbl_Spacer1.grid(row=2,
                              column=1,
                              columnspan=4,
                              sticky='W',
                              padx=1,
                              pady=1)

        self.chk_isKillProcess = tk.Checkbutton(
            parentTab,
            text="Kill Internet Explorer process.",
            variable=self.kill_ie,
            onvalue=1,
            offvalue=0)
        self.chk_isKillProcess.grid(row=3,
                                    column=0,
                                    columnspan=4,
                                    sticky='W',
                                    pady=2)

        self.chk_isVisible = tk.Checkbutton(
            parentTab,
            text="Internet Explorer visiblity during crawling.",
            variable=self.is_visible,
            onvalue=1,
            offvalue=0)
        self.chk_isVisible.grid(row=4,
                                column=0,
                                columnspan=4,
                                sticky='W',
                                pady=2)

    def is_multiAttach(self):
        self.settings.SetSettings('multi_attach', self.multi_attachments.get())

    def is_subjectChecked(self):
        checked = self.is_subject.get()
        if checked and checked == 1:
            self.txt_subject['state'] = "normal"
        else:
            self.default_subject.set('')
            self.txt_subject['state'] = "readonly"
        self.settings.SetSettings('is_subject', checked)
        self.settings.SetSettings('default_subject',
                                  self.default_subject.get())

    def getFolder(self):
        folder = filedialog.askdirectory(
            parent=self,
            initialdir="/",
            title=
            'Please select a directory where you want to export Crawled Data')
        if self.helper.is_notEmpty(folder):
            self.helper.resolveDirectory(folder)
            self.settings.SetSettings('exportto', folder)
            self.folder_location.set(folder)

    def is_filenameChecked(self):
        checked = self.is_filename.get()
        if checked and checked == 1:
            self.txt_filename['state'] = "normal"
        else:
            self.default_filename.set('')
            self.txt_filename['state'] = "readonly"
        self.settings.SetSettings('is_filename', checked)
        self.settings.SetSettings('default_filename',
                                  self.default_filename.get())

    def ok(self):
        ul = self.txt_urlLogin.get("1.0", "end-1c")
        um = self.txt_urlMain.get("1.0", "end-1c")
        if ul.strip() is None:
            ul = self.default_urlLogin
        if um.strip() is None:
            um = self.default_urlMain

        self.settings.SetSettings('send', self.is_send.get())
        self.settings.SetSettings('append', self.is_append.get())
        self.settings.SetSettings('subfolder', self.is_subfolder.get())
        self.settings.SetSettings('exportto', self.folder_location.get())
        self.settings.SetSettings('multi_attach', self.multi_attachments.get())
        self.settings.SetSettings('username', self.username.get())
        self.settings.SetSettings('password', self.password.get())
        self.settings.SetSettings('url_login', ul)
        self.settings.SetSettings('url_main', um)
        self.settings.SetSettings('default_subject',
                                  self.default_subject.get())
        self.settings.SetSettings('overwite_existing',
                                  self.overwite_existing.get())
        self.settings.SetSettings('auto_export', self.auto_export.get())
        self.settings.SetSettings('parser', self.parser.get())
        self.settings.SetSettings('kill_ie', self.kill_ie.get())
        self.settings.SetSettings('default_subject',
                                  self.default_subject.get())
        self.settings.SetSettings('default_filename',
                                  self.default_filename.get())
        self.settings.SetSettings('is_subject', self.is_subject.get())
        self.settings.SetSettings('is_filename', self.is_filename.get())
        self.settings.SetSettings('is_visible', self.is_visible.get())

        self.destroy()
class ConfigCrawlDialog(simpledialog.Dialog):
    def body(self, master):
        self.parent = master
        self.frame = tk.Frame(self.parent, width=500)
        self.resizable(width=False, height=False)
        self.iconbitmap('tarsier.ico')

        self.storage = StorageDb('wfm.sqlite')
        self.appt_helper = AppointmentHelper()
        self.settings = Settings()
        self.helper = Helper()

        self.init_variables()
        self.tab_control = ttk.Notebook(self.parent)
        self.img_tab = {}
        self.tabs = ["Appointment Booking Detail", "Authentication"]
        for tab in self.tabs:
            tabPage = ttk.Frame(
                self.tab_control
            )  # first page, which would get widgets gridded into it
            self.img_tab[tab] = PhotoImage(file=str("images/%s.png" %
                                                    tab.replace(' ', '')))
            self.tab_control.add(tabPage,
                                 text=tab,
                                 image=self.img_tab[tab],
                                 compound=LEFT)
            if tab is 'Authentication':
                self.create_authTab(tabPage)
            else:
                self.create_filterTab(tabPage)
        self.tab_control.pack(expand=1, fill="both")  # Pack to make visible

        self.frame.pack(expand=1, fill="both", padx=8, pady=5)

    def init_variables(self):
        self.kill_ie = tk.IntVar()
        self.is_visible = tk.IntVar()
        self.company_id = tk.StringVar()
        self.dispatcher_id = tk.StringVar()
        self.status = tk.StringVar()
        self.appt_company_id = tk.StringVar()
        self.appt_dispatcher_id = tk.StringVar()
        self.appt_status = tk.StringVar()
        self.selected_dateFrom = tk.StringVar()
        self.selected_dateTo = tk.StringVar()

        self.username = tk.StringVar()
        self.password = tk.StringVar()

        self.bullet = "*"  # specifies bullet character

        self.is_visible.set(self.settings.GetSetting('is_visible'))
        self.kill_ie.set(self.settings.GetSetting('kill_ie'))
        self.company_id.set(self.settings.GetSetting('company_id'))
        self.dispatcher_id.set(self.settings.GetSetting('dispatcher_id'))
        self.status.set(self.settings.GetSetting('status'))
        self.username.set(self.settings.GetSetting('username'))
        self.password.set(self.settings.GetSetting('password'))

        self.year = time.localtime()[0]
        self.month = time.localtime()[1]
        self.day = time.localtime()[2]
        self.strdate = (str(self.month).zfill(2) + "/" +
                        str(self.day).zfill(2) + "/" + str(self.year))
        self.selected_dateFrom.set(self.strdate)
        self.selected_dateTo.set(self.strdate)

        date_from = self.settings.GetSetting('selected_dateFrom').strip()
        date_to = self.settings.GetSetting('selected_dateTo').strip()
        if date_from and date_from.strip():
            self.selected_dateFrom.set(date_from)
        if date_to and date_to.strip():
            self.selected_dateTo.set(date_to)

        self.companies_id = []
        self.dispachers_id = []
        self.appt_activity = []
        self.appt_statuses = []

        rows_dis = self.storage.GetResults(
            'select * from dispatchers where active =1')
        if len(rows_dis) > 0:
            for row in rows_dis:
                self.dispachers_id.append(row['value'] + ' - ' +
                                          row['description'])

        rows_comps = self.storage.GetResults(
            'select * from companies where active =1')
        if len(rows_comps) > 0:
            for row in rows_comps:
                self.companies_id.append(row['value'] + ' - ' +
                                         row['description'])

        rows_stats = self.storage.GetResults(
            'select * from status where active =1')
        if len(rows_stats) > 0:
            for row in rows_stats:
                self.appt_statuses.append(row['value'] + ' - ' +
                                          row['description'])

        rows_acts = self.storage.GetResults(
            'select * from activities where active =1')
        if len(rows_acts) > 0:
            for row in rows_acts:
                self.appt_activity.append(row['value'])

        self.img_dateTo = PhotoImage(file="images/date_to.png")
        self.img_dateFrom = PhotoImage(file="images/date_from.png")

    def create_filterTab(self, tabPage):
        self.lbl_AttachmentMode = tk.Label(tabPage,
                                           text="Appointment Search Options",
                                           font='Tahoma 8 bold',
                                           fg='gray')
        self.lbl_AttachmentMode.grid(row=0,
                                     column=0,
                                     columnspan=5,
                                     sticky='W',
                                     padx=1,
                                     pady=6)
        self.lbl_Note = tk.Label(
            tabPage,
            text="Please provide your desired appointment search filter",
            fg='green')
        self.lbl_Note.grid(row=1,
                           column=0,
                           columnspan=5,
                           sticky='W',
                           padx=5,
                           pady=2)

        self.lbl_companyId = tk.Label(tabPage, text="Company ID:")
        self.lbl_companyId.grid(row=2, column=0, sticky='W', padx=5, pady=2)

        self.cbox_companyId = ttk.Combobox(tabPage,
                                           textvariable=self.company_id,
                                           state="readonly",
                                           width=50)
        self.cbox_companyId.bind('<Return>')
        self.cbox_companyId['values'] = self.companies_id
        #self.cbox_companyId.current(0) # select index 0 by default
        self.cbox_companyId.grid(row=2,
                                 column=1,
                                 columnspan=5,
                                 sticky="W",
                                 pady=3)

        self.lbl_dispatcherId = tk.Label(tabPage, text="Dispatcher ID:")
        self.lbl_dispatcherId.grid(row=3, column=0, sticky='W', padx=5, pady=2)

        self.cbox_dispatcherId = ttk.Combobox(tabPage,
                                              textvariable=self.dispatcher_id,
                                              state="readonly",
                                              width=60)
        self.cbox_dispatcherId.bind('<Return>')
        self.cbox_dispatcherId['values'] = self.dispachers_id
        #self.cbox_dispatcherId.current(0) # select index 0 by default
        self.cbox_dispatcherId.grid(row=3,
                                    column=1,
                                    columnspan=5,
                                    sticky="W",
                                    pady=3)

        self.lbl_apptStatus = tk.Label(tabPage, text="Appt Status:")
        self.lbl_apptStatus.grid(row=4, column=0, sticky='E', padx=5, pady=2)

        self.cbox_apptStatus = ttk.Combobox(tabPage,
                                            textvariable=self.status,
                                            state="readonly")
        self.cbox_apptStatus.bind('<<ComboboxStatus>>')
        self.cbox_apptStatus['values'] = self.appt_statuses
        #self.cbox_apptStatus.current(0) # select index 0 by default
        self.cbox_apptStatus.grid(row=4,
                                  column=1,
                                  columnspan=5,
                                  sticky="WE",
                                  pady=2)

        self.lbl_Spacer1 = tk.Label(tabPage, text="")
        self.lbl_Spacer1.grid(row=5,
                              column=0,
                              columnspan=5,
                              sticky='E',
                              padx=5,
                              pady=4)

        self.lbl_dateFrom = tk.Label(tabPage, text="Date From:")
        self.lbl_dateFrom.grid(row=6, column=0, sticky='E', padx=5, pady=2)

        self.txt_dateFrom = tk.Entry(tabPage,
                                     textvariable=self.selected_dateFrom,
                                     state="readonly",
                                     width=14)
        self.txt_dateFrom.grid(row=6, column=1, sticky="WE", pady=2)

        self.btn_dateFrom = tk.Button(
            tabPage,
            image=self.img_dateFrom,
            text="...",
            command=lambda: self.getCalendarDate("from"))
        self.btn_dateFrom.grid(row=6, column=2, sticky='W', padx=5, pady=2)

        self.lbl_dateTo = tk.Label(tabPage, text="Date To:")
        self.lbl_dateTo.grid(row=6, column=3, sticky='E', padx=5, pady=2)

        self.txt_dateTo = tk.Entry(tabPage,
                                   textvariable=self.selected_dateTo,
                                   state="readonly",
                                   width=14)
        self.txt_dateTo.grid(row=6, column=4, sticky="WE", pady=2)

        self.btn_dateTo = tk.Button(tabPage,
                                    image=self.img_dateTo,
                                    text="...",
                                    command=lambda: self.getCalendarDate("to"))
        self.btn_dateTo.grid(row=6, column=5, sticky='W', padx=5, pady=2)

    def create_authTab(self, tabPage):
        self.lbl_WFM = tk.Label(tabPage,
                                text="WFM Authentication",
                                font='Tahoma 8 bold',
                                fg='gray')
        self.lbl_WFM.grid(row=0,
                          column=0,
                          columnspan=2,
                          sticky='W',
                          padx=1,
                          pady=4)
        self.lbl_Note = tk.Label(tabPage,
                                 text="Credentials use to login WFM site.",
                                 fg='darkgray')
        self.lbl_Note.grid(row=1,
                           column=0,
                           columnspan=2,
                           sticky='W',
                           padx=5,
                           pady=1)

        self.lbl_username = tk.Label(tabPage, text="   Username:"******"WE",
                               pady=2)

        self.lbl_password = tk.Label(tabPage, text="Password:"******"WE",
                               pady=2)

        self.lbl_Other = tk.Label(tabPage,
                                  text="Other crawler options",
                                  font='Tahoma 8 bold',
                                  fg='gray')
        self.lbl_Other.grid(row=4,
                            column=0,
                            columnspan=2,
                            sticky='W',
                            padx=1,
                            pady=4)
        self.lbl_OtherNote = tk.Label(
            tabPage,
            text="Please provide some of ccrawling options.",
            fg='darkgray')
        self.lbl_OtherNote.grid(row=5,
                                column=0,
                                columnspan=2,
                                sticky='W',
                                padx=5,
                                pady=1)

        self.chk_isKillProcess = tk.Checkbutton(
            tabPage,
            text="Kill opened Internet Explorer process.",
            variable=self.kill_ie,
            onvalue=1,
            offvalue=0)
        self.chk_isKillProcess.grid(row=6,
                                    column=0,
                                    columnspan=4,
                                    sticky='W',
                                    pady=2)

        self.chk_isVisible = tk.Checkbutton(
            tabPage,
            text="Internet Explorer visiblity during crawling.",
            variable=self.is_visible,
            onvalue=1,
            offvalue=0)
        self.chk_isVisible.grid(row=7,
                                column=0,
                                columnspan=4,
                                sticky='W',
                                pady=2)

    def getCalendarDate(self, date_state):
        datee = datetime.datetime.strptime(self.selected_dateTo.get(),
                                           "%m/%d/%Y")
        if (date_state == "from"):
            datee = datetime.datetime.strptime(self.selected_dateTo.get(),
                                               "%m/%d/%Y")

        #cd = CalendarDialog(self.parent,title="Calendar", year= str(datee.year), month= str(datee.month))
        cd = CalendarDialog(self.parent, title="Calendar")
        result = cd.result
        if (result and result != ''):
            if (date_state == "from"):
                self.selected_dateFrom.set(result.strftime("%m/%d/%Y"))
            else:
                self.selected_dateTo.set(result.strftime("%m/%d/%Y"))

    def getCurrentDate(self, ):
        return time.strftime("%Y-%m-%d")

    def getCurrentTime(self, ):
        return time.strftime("%I:%M:%S %p")

    def ok(self):
        self.settings.SetSettings('username', self.username.get())
        self.settings.SetSettings('password', self.password.get())
        self.settings.SetSettings('selected_dateFrom',
                                  self.selected_dateFrom.get())
        self.settings.SetSettings('selected_dateTo',
                                  self.selected_dateTo.get())
        self.settings.SetSettings('is_visible', self.is_visible.get())
        self.settings.SetSettings('kill_ie', self.kill_ie.get())

        self.appt_company_id = self.appt_helper.get_value(
            self.company_id.get())
        self.appt_dispatcher_id = self.appt_helper.get_value(
            self.dispatcher_id.get())
        self.appt_status = self.appt_helper.get_value(
            self.cbox_apptStatus.get()).replace('#', 'Any')

        if self.helper.is_notEmpty(
                self.appt_company_id) and self.helper.is_notEmpty(
                    self.appt_dispatcher_id) and self.helper.is_notEmpty(
                        self.appt_status):
            self.settings.SetSettings('appt_company_id', self.appt_company_id)
            self.settings.SetSettings('appt_dispatcher_id',
                                      self.appt_dispatcher_id)
            self.settings.SetSettings('appt_status', self.appt_status)
            self.settings.SetSettings('company_id', self.company_id.get())
            self.settings.SetSettings('dispatcher_id',
                                      self.dispatcher_id.get())
            self.settings.SetSettings('status', self.status.get())
            ws = []
            ws.append(self.appt_company_id)
            ws.append(self.appt_dispatcher_id)
            ws.append(self.appt_status)
            ws.append((self.selected_dateFrom.get() + "-" +
                       self.selected_dateTo.get()).replace("/", "."))
            work_name = "wfm-" + " ".join(ws)
            code = self.helper.non_alphanumeric(work_name).lower()

            content_val = {}
            content_val['name'] = work_name
            content_val['count'] = '0'
            content_val['details'] = self.appt_helper.get_currentDate()
            content_val['date_from'] = self.selected_dateFrom.get()
            content_val['date_to'] = self.selected_dateTo.get()
            content_val['company_id'] = self.appt_company_id
            content_val['dispatcher_id'] = self.appt_dispatcher_id
            content_val['status'] = self.appt_status
            content_val['code'] = code

            self.add_workspace(content_val, code)  # add new workspace
            self.storage.CreateWFMTable(code)  # create table for WFM
            self.storage.CreateLinksTable(
                code + '_links')  # create table for WFM links

            self.settings.SetSettings('workspace_name', work_name)
            self.settings.SetSettings('wfm_table', code)
            self.destroy()

    def add_workspace(self, content_val, code):
        if self.storage.IsExist(WORKSPACES, 'code', code):
            self.storage.UpdateParameterized(WORKSPACES, content_val,
                                             "code='" + code + "'")
        else:
            self.storage.InsertParameterized(WORKSPACES, content_val)