Beispiel #1
0
    def init(self):
        bg_color = 'black'
        btn_fg = 'white'

        self['bg'] = 'black'
        tk.Label(self, textvariable=self.controller.frames["HomePage"].home_page_welcome_label_var, font=self.title_font, bg='black', fg='white').pack(side=tk.TOP, fill=tk.X)

        home_frame = tk.Frame(master=self, bg=bg_color)
        home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        home_frame.grid_rowconfigure(1, weight=1)
        home_frame.grid_columnconfigure(0, weight=1)
        home_frame.grid_columnconfigure(1, weight=1)

        viewer_frame = tk.LabelFrame(home_frame, bg=bg_color)
        viewer_frame.grid(row=0, column=0, columnspan=3, sticky='ew')
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_rowconfigure(0, weight=1)
        #search menu
        self.init_search_frame(viewer_frame)

        #options row
        tk.Button(home_frame, text="Back", bg='red', fg=btn_fg, command=self.on_back, font=self.title_font).grid(row=2, column=0, padx=35, pady=15, sticky='w')
        tk.Label(home_frame, text="Advanced Option For Admins", fg='light green', bg=home_frame['bg'], font=self.title_font).grid(row=2, column=1, columnspan=2, padx=10, pady=10)

        #table
        columns_names = ['User Id', 'First Name', 'Last Name', 'Location Id', 'Email', 'Phone', 'Username', 'Password', 'Account Type']
        self.table = TableFrame(home_frame, columns_names)
        self.table.grid(row=1, column=0, columnspan=3, sticky="nesw", padx=5, pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)
Beispiel #2
0
    def init(self):
        self.button_shipping['bg'] = 'dark orange'
        bg_color = 'gold'
        viewer_frame = tk.LabelFrame(self, bg=bg_color)
        viewer_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_columnconfigure(1, weight=1)
        viewer_frame.grid_columnconfigure(2, weight=1)
        viewer_frame.grid_columnconfigure(3, weight=1)
        viewer_frame.grid_rowconfigure(2, weight=1)

        # ------------search_bar------------------
        self.init_search_frame(viewer_frame)
        self.init_insert_frame(viewer_frame)
        self.init_update_frame(viewer_frame)
        self.init_delete_frame(viewer_frame)

        columns_names = list(
            map("".join,
                self.controller.get_columns_name('pbd_shipping_methods')))
        self.table = TableFrame(viewer_frame, columns_names)
        self.table.grid(row=2,
                        column=0,
                        columnspan=4,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)
Beispiel #3
0
    def init(self):
        self.button_product['bg'] = 'dark orange'
        bg_color = 'gold'
        viewer_frame = tk.LabelFrame(self, bg=bg_color)
        viewer_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_columnconfigure(1, weight=1)
        viewer_frame.grid_columnconfigure(2, weight=1)
        viewer_frame.grid_columnconfigure(3, weight=1)
        viewer_frame.grid_rowconfigure(2, weight=1)

        # ------------search_bar------------------
        self.init_search_frame(viewer_frame)
        self.init_insert_frame(viewer_frame)
        self.init_update_frame(viewer_frame)
        self.init_delete_frame(viewer_frame)

        columns_names = [
            'PRODUCT ID', 'PRODUCT NAME', 'PRICE', 'QUANTITY', 'DATE UPDATED',
            'SHOP ID', 'DESCRIPTION', 'AVAILABLE QUANTITY'
        ]
        self.table = TableFrame(viewer_frame, columns_names)
        self.table.grid(row=2,
                        column=0,
                        columnspan=4,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)
Beispiel #4
0
class AdvancedAdminPage(TitlePage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def init(self):
        bg_color = 'black'
        btn_fg = 'white'

        self['bg'] = 'black'
        tk.Label(self, textvariable=self.controller.frames["HomePage"].home_page_welcome_label_var, font=self.title_font, bg='black', fg='white').pack(side=tk.TOP, fill=tk.X)

        home_frame = tk.Frame(master=self, bg=bg_color)
        home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        home_frame.grid_rowconfigure(1, weight=1)
        home_frame.grid_columnconfigure(0, weight=1)
        home_frame.grid_columnconfigure(1, weight=1)

        viewer_frame = tk.LabelFrame(home_frame, bg=bg_color)
        viewer_frame.grid(row=0, column=0, columnspan=3, sticky='ew')
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_rowconfigure(0, weight=1)
        #search menu
        self.init_search_frame(viewer_frame)

        #options row
        tk.Button(home_frame, text="Back", bg='red', fg=btn_fg, command=self.on_back, font=self.title_font).grid(row=2, column=0, padx=35, pady=15, sticky='w')
        tk.Label(home_frame, text="Advanced Option For Admins", fg='light green', bg=home_frame['bg'], font=self.title_font).grid(row=2, column=1, columnspan=2, padx=10, pady=10)

        #table
        columns_names = ['User Id', 'First Name', 'Last Name', 'Location Id', 'Email', 'Phone', 'Username', 'Password', 'Account Type']
        self.table = TableFrame(home_frame, columns_names)
        self.table.grid(row=1, column=0, columnspan=3, sticky="nesw", padx=5, pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def on_select(self, event):
        pass

    def on_back(self):
        self.controller.show_frame('HomePage')

    def init_search_frame(self, master, row=0, column=0):
        width_label = 12
        self.search_frame = tk.LabelFrame(master, bg='gray85', text='Search', fg='green')
        self.search_frame.grid(row=row, column=column, pady=10)

        user_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        user_search_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(user_search_frame, text='User Id', bg=user_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.user_id_entry = tk.Entry(user_search_frame)
        self.user_id_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(user_search_frame, text='Search', command=self.search_user).grid(row=0, column=2)

        first_name_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        first_name_search_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(first_name_search_frame, text='First Name', bg=first_name_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.first_name_entry = tk.Entry(first_name_search_frame)
        self.first_name_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(first_name_search_frame, text='Search', command=self.search_first_name).grid(row=0, column=2)

        last_name_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        last_name_search_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(last_name_search_frame, text='Last Name', bg=last_name_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.last_name_entry= tk.Entry(last_name_search_frame)
        self.last_name_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(last_name_search_frame, text='Search', command=self.search_last_name).grid(row=0, column=2)

        location_id_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        location_id_search_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(location_id_search_frame, text='Location_id: ', bg=location_id_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.location_id_entry = tk.Entry(location_id_search_frame)
        self.location_id_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(location_id_search_frame, text='Search', command=self.search_location_id).grid(row=0, column=2)

        ###### second column
        email_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        email_search_frame.grid(row=0, column=1, pady=5, padx=5, sticky='w')
        tk.Label(email_search_frame, text='Email', bg=email_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.email_entry = tk.Entry(email_search_frame)
        self.email_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(email_search_frame, text='Search', command=self.search_email).grid(row=0, column=2)

        phone_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        phone_search_frame.grid(row=1, column=1, pady=5, padx=5, sticky='w')
        tk.Label(phone_search_frame, text='Phone', bg=phone_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.phone_entry = tk.Entry(phone_search_frame)
        self.phone_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(phone_search_frame, text='Search', command=self.search_phone).grid(row=0, column=2)

        username_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        username_search_frame.grid(row=2, column=1, pady=5, padx=5, sticky='w')
        tk.Label(username_search_frame, text='Username', bg=username_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.username_entry = tk.Entry(username_search_frame)
        self.username_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(username_search_frame, text='Search', command=self.search_username).grid(row=0, column=2)

        account_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        account_search_frame.grid(row=3, column=1, pady=5, padx=5, sticky='w')
        tk.Label(account_search_frame, text='Account Type: ', bg=account_search_frame['bg'], fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.account_entry = tk.Entry(account_search_frame)
        self.account_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(account_search_frame, text='Search', command=self.search_account).grid(row=0, column=2)

        option_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        option_search_frame.grid(row=4, column=0, columnspan=2, pady=5, padx=5, sticky='ew')
        option_search_frame.grid_columnconfigure(0, weight=1)
        self.search_by_all_categories_button = tk.Button(option_search_frame, text='Search By All Categories (Without User Id)', command=self.global_search, bg='light cyan',
                  fg='red')
        self.search_by_all_categories_button.grid(row=0, column=0, columnspan=2, padx=5, pady=5)

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        query_select = self.controller.run_query("SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a where "
                                                 "a.user_id=u.user_id")
        for row in query_select:
            self.table.insert('', 'end', values=row)

    def search_user(self):
        log.info("Search User Id")
        name = self.user_id_entry.get()
        if not name.isdigit() and name != '':
            messagebox.showinfo("Error Search", "User Id is not number")
            return
        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and u.user_id={}".format(name)
        self.search(name, query)

    def search(self, name, query):
        self.table.clear_table()
        if name == '':
            self.populate_the_table_with_all_values()
        else:
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def search_first_name(self):
        log.info("Search First Name")
        name = self.first_name_entry.get()

        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(u.first_name) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def search_last_name(self):
        log.info("Search Last Name")
        name = self.last_name_entry.get()

        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(u.last_name) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def search_location_id(self):
        log.info("Search Location Id")
        name = self.location_id_entry.get()
        if not name.isdigit() and name != '':
            messagebox.showinfo("Error Search", "Location Id is not number")
            return
        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and u.location_id={}".format(name)
        self.search(name, query)

    def search_email(self):
        log.info("Search Email")
        name = self.email_entry.get()

        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(u.email) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def search_phone(self):
        log.info("Search Phone")
        name = self.phone_entry.get()
        if not name.isdigit() and name != '':
            messagebox.showinfo("Error Search", "Phone Number is not number")
            return
        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(u.phone) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def search_username(self):
        log.info("Search Username")
        name = self.username_entry.get()

        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(a.username) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def search_account(self):
        log.info("Search Account")
        name = self.account_entry.get()

        name = self.controller.add_escape_characters(name)
        query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                "where a.user_id=u.user_id and lower(a.account_type) like '%{}%' escape '#'".format(name.lower())
        self.search(name, query)

    def global_search(self):
        log.info("Search Global")

        first_name = self.first_name_entry.get()
        first_name = self.controller.add_escape_characters(first_name)

        last_name = self.last_name_entry.get()
        last_name = self.controller.add_escape_characters(last_name)

        location_id = self.location_id_entry.get()
        if not location_id.isdigit() and location_id != '':
            messagebox.showinfo("Error Search", "Location Id is not number")
            return
        location_id = self.controller.add_escape_characters(location_id)

        email = self.email_entry.get()
        email = self.controller.add_escape_characters(email)

        phone = self.phone_entry.get()
        if not phone.isdigit() and phone != '':
            messagebox.showinfo("Error Search", "Phone Number is not number")
            return
        phone = self.controller.add_escape_characters(phone)

        username = self.username_entry.get()
        username = self.controller.add_escape_characters(username)

        account = self.account_entry.get()
        account = self.controller.add_escape_characters(account)
        if location_id != '':
            query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                    "where a.user_id=u.user_id and lower(u.first_name) like '%{}%' escape '#'" \
                    "and lower(u.last_name) like '%{}%' escape '#'" \
                    "and u.location_id={}" \
                    "and lower(u.email) like '%{}%' escape '#'" \
                    "and lower(u.phone) like '%{}%' escape '#'" \
                    "and lower(a.username) like '%{}%' escape '#'" \
                    "and lower(a.account_type) like '%{}%' escape '#'".format(first_name.lower(), last_name.lower(), location_id, email.lower(), phone, username.lower(),
                                                                              account.lower())
        else:
            query = "SELECT u.user_id, u.first_name, u.last_name, u.location_id, u.email, u.phone, a.username, decode(a.account_type, 'admin', lpad('*', length(a.password), '*'), a.password), a.account_type from app_users u, accounts a " \
                    "where a.user_id=u.user_id and lower(u.first_name) like '%{}%' escape '#'" \
                    "and lower(u.last_name) like '%{}%' escape '#'" \
                    "and lower(u.email) like '%{}%' escape '#'" \
                    "and lower(u.phone) like '%{}%' escape '#'" \
                    "and lower(a.username) like '%{}%' escape '#'" \
                    "and lower(a.account_type) like '%{}%' escape '#'".format(first_name.lower(), last_name.lower(),
                                                                              email.lower(), phone,
                                                                              username.lower(),
                                                                              account.lower())
        self.table.clear_table()
        query_select = self.controller.run_query(query)
        for row in query_select:
            self.table.insert('', 'end', values=row)
Beispiel #5
0
class ShippingPage(BasicPage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def init(self):
        self.button_shipping['bg'] = 'dark orange'
        bg_color = 'gold'
        viewer_frame = tk.LabelFrame(self, bg=bg_color)
        viewer_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_columnconfigure(1, weight=1)
        viewer_frame.grid_columnconfigure(2, weight=1)
        viewer_frame.grid_columnconfigure(3, weight=1)
        viewer_frame.grid_rowconfigure(2, weight=1)

        # ------------search_bar------------------
        self.init_search_frame(viewer_frame)
        self.init_insert_frame(viewer_frame)
        self.init_update_frame(viewer_frame)
        self.init_delete_frame(viewer_frame)

        columns_names = list(
            map("".join,
                self.controller.get_columns_name('pbd_shipping_methods')))
        self.table = TableFrame(viewer_frame, columns_names)
        self.table.grid(row=2,
                        column=0,
                        columnspan=4,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def OnDoubleClick(self, event):
        item = self.table.tree.identify('item', event.x, event.y)
        print("you clicked on", self.table.tree.item(item, "values"))

    def on_select(self, event):
        self.selected_item = event.widget.item(event.widget.selection()[0],
                                               "values")
        self.shipping_name_delete_var.set(self.selected_item[1])
        self.delivering_price_delete_var.set(self.selected_item[2])
        from bd_gui import BdGui
        BdGui.set_entry_text(self.shipping_provider_update,
                             self.selected_item[1])
        BdGui.set_entry_text(self.price_update, self.selected_item[2])

    def init_search_frame(self, master, row=0, column=0):
        width_label = 13
        self.search_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Search',
                                          fg='green')
        self.search_frame.grid(row=row, column=column, pady=10, padx=5)

        shipping_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        shipping_search_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shipping_search_frame,
                 text='Shipping Provider',
                 bg=shipping_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shipping_name_search = tk.Entry(shipping_search_frame)
        self.shipping_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(shipping_search_frame,
                  text='Search',
                  command=self.search_provider).grid(row=0, column=2)

        price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        price_search_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_search_frame,
                 text='Delivering Price',
                 bg=price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_name_search = tk.Entry(price_search_frame)
        self.price_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(price_search_frame, text='Search',
                  command=self.search_price).grid(row=0, column=2)

        min_price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        min_price_search_frame.grid(row=2,
                                    column=0,
                                    pady=5,
                                    padx=5,
                                    sticky='w')
        tk.Label(min_price_search_frame,
                 text='Min Price',
                 bg=min_price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.min_price_name_search = tk.Entry(min_price_search_frame)
        self.min_price_name_search.grid(row=0, column=1, padx=5, pady=5)

        max_price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        max_price_search_frame.grid(row=3,
                                    column=0,
                                    pady=5,
                                    padx=5,
                                    sticky='w')
        tk.Label(max_price_search_frame,
                 text='Max Price',
                 bg=max_price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.max_price_name_search = tk.Entry(max_price_search_frame)
        self.max_price_name_search.grid(row=0, column=1, padx=5, pady=5)

        option_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        option_search_frame.grid(row=4, column=0, pady=5, padx=5, sticky='ew')
        self.search_by_product_id = tk.IntVar()
        ttk.Checkbutton(option_search_frame,
                        text="Shipping Id",
                        variable=self.search_by_product_id,
                        command=self.on_check_product_id).grid(row=0,
                                                               column=0,
                                                               padx=5,
                                                               pady=5)
        tk.Button(option_search_frame,
                  text='Search By Price Range',
                  command=self.search_price_range,
                  bg='light cyan',
                  fg='red').grid(row=0, column=1, padx=5, pady=5)

    def on_check_product_id(self):
        pass

    def search_for_provider_equal(self, provider):
        provider = provider.replace('\'', '\'\'')
        query = "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods where lower(provider)='{}'".format(
            provider.lower())
        query_select = self.controller.run_query(query)
        return query_select

    def search_for_provider_like(self, provider):
        provider = self.controller.add_escape_characters(provider)
        query = "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods where lower(provider) like '%{}%'".format(
            provider.lower())
        query_select = self.controller.run_query(query)
        return query_select

    def search_provider(self):
        log.info("Search_Provider Shipping Page")
        if self.search_by_product_id.get():
            name = self.shipping_name_search.get()
            if not name.isdigit():
                from tkinter import messagebox
                messagebox.showinfo("Search Error", "Shipping Id invalid")
                return
            else:
                query = "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods where shipping_id={}".format(
                    name)
                query_select = self.controller.run_query(query)
                self.table.clear_table()
                for row in query_select:
                    self.table.insert('', 'end', values=row)
        else:
            self.table.clear_table()
            name = self.shipping_name_search.get()
            if name == '':
                self.populate_the_table_with_all_values()
            else:
                for row in self.search_for_provider_like(name):
                    self.table.insert('', 'end', values=row)

    def search_price(self):
        log.info("Search_Price Shipping Page")
        self.table.clear_table()

        price = self.price_name_search.get()
        if price == '':
            self.populate_the_table_with_all_values()
        else:
            if not self.is_number(price):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error", "Price is not number")
                return
            query = "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods where delivering_price={}".format(
                price)
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def search_price_range(self):
        log.info("Search_Price Range Shipping Page")
        self.table.clear_table()

        price_min = self.min_price_name_search.get()
        price_max = self.max_price_name_search.get()
        if price_min == '' and price_max == '':
            self.populate_the_table_with_all_values()
        else:
            if not self.is_number(price_min, zero_permited=True):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error", "Price MIN is not number")
                return
            if not self.is_number(price_max, zero_permited=True):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error", "Price MAX is not number")
                return
            if price_min == '':
                price_min = '0'
            if price_max == '':
                price_max = '999999'
            query = "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods where delivering_price between {} and {}".format(
                price_min, price_max)
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def init_insert_frame(self, master, row=0, column=1):
        width_label = 13
        self.insert_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Insert',
                                          fg='green')
        self.insert_frame.grid(row=row, column=column, pady=10)

        shipping_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        shipping_insert_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shipping_insert_frame,
                 text='Shipping Provider',
                 bg=shipping_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shipping_name_insert = tk.Entry(shipping_insert_frame)
        self.shipping_name_insert.grid(row=0, column=1, padx=5, pady=5)

        price_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        price_insert_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_insert_frame,
                 text='Delivering Price',
                 bg=price_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_insert = tk.Entry(price_insert_frame)
        self.price_insert.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.insert_frame,
                  text='Insert',
                  command=self.insert,
                  bg='light cyan',
                  fg='red').grid(row=2, column=0, padx=5, pady=5)

    def init_update_frame(self, master, row=0, column=2):
        width_label = 13
        self.update_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Update',
                                          fg='green')
        self.update_frame.grid(row=row, column=column, pady=10)

        shipping_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        shipping_update_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shipping_update_frame,
                 text='Shipping Provider',
                 bg=shipping_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shipping_provider_update = tk.Entry(shipping_update_frame)
        self.shipping_provider_update.grid(row=0, column=1, padx=5, pady=5)

        street_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        street_update_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(street_update_frame,
                 text='Delivering Price',
                 bg=street_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_update = tk.Entry(street_update_frame)
        self.price_update.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.update_frame,
                  text='Update',
                  command=self.update,
                  bg='light cyan',
                  fg='red').grid(row=2, column=0, padx=5, pady=5)

    def init_delete_frame(self, master, row=0, column=3):
        width_label = 13
        width_text_label = 20
        self.delete_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Delete',
                                          fg='green')
        self.delete_frame.grid(row=row, column=column, pady=10)

        shipping_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        shipping_delete_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shipping_delete_frame,
                 text='Shipping Provider',
                 bg=shipping_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shipping_name_delete_var = tk.StringVar()
        tk.Label(shipping_delete_frame,
                 textvariable=self.shipping_name_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        price_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        price_delete_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_delete_frame,
                 text='Delivering Price',
                 bg=price_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.delivering_price_delete_var = tk.StringVar()
        tk.Label(price_delete_frame,
                 textvariable=self.delivering_price_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.delete_frame,
                  text='Delete',
                  command=self.delete,
                  bg='light cyan',
                  fg='red').grid(row=2, column=0, padx=5, pady=5)

    def delete(self):
        log.info("Delete Shipping Page")
        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Delete Error", "Item not selected")
            return
        name = self.shipping_name_delete_var.get()

        name = name.replace('\'', '\'\'')
        try:
            self.controller.run_procedure('SHIPPING_PACK.delete_item', [name])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Delete Error", "Can't delete shipping.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def is_empty(self, provider, price):
        from tkinter import messagebox
        if provider == '':
            messagebox.showinfo("Insert Error", "Provider Name required")
            return True
        if price == '':
            messagebox.showinfo("Insert Error", "Price Name required")
            return True

    def provider_exists(self, provider):
        from tkinter import messagebox
        if self.search_for_provider_equal(provider):
            messagebox.showinfo("Insert Error",
                                "Shipping Method already exists")
            return True
        return False

    def insert(self):
        log.info("Insert Shipping Page")
        name = self.shipping_name_insert.get()
        if not self.string_length_is_okay(
                name, text='Shipping Provider', length=100):
            return
        name = name.strip()

        price = self.price_insert.get()
        if self.is_empty(name, price) or self.provider_exists(name):
            return
        if not self.is_number(price):
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Price is not number")
            return

        name = name.replace('\'', '\'\'')
        try:
            self.controller.run_procedure('SHIPPING_PACK.insert_item',
                                          [name, price])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Insert error", "Can't insert shipping.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def update(self):
        log.info("Update Shipping Page")
        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Item not selected")
            return
        name = self.shipping_provider_update.get()
        if not self.string_length_is_okay(
                name, text='Shipping Provider', length=100):
            return
        name = name.strip()
        price = self.price_update.get()

        if self.is_empty(name, price):
            return

        log.info("Update provider {} to price {}".format(name, price))
        if not self.is_number(price) and price != "":
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Price is not number")
            return

        old_name = self.shipping_name_delete_var.get().replace('\'', '\'\'')

        name = name.replace('\'', '\'\'')
        try:
            self.controller.run_procedure('SHIPPING_PACK.update_item',
                                          [old_name, name, price])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Update error", "Can't update shipping.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        query_select = self.controller.run_query(
            "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods"
        )
        for row in query_select:
            self.table.insert('', 'end', values=row)
Beispiel #6
0
class ShopPage(BasicPage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def fetch_data(self):
        self.populate_the_table_with_all_values()

    def init(self):
        self.button_shop['bg'] = 'dark orange'

        bg_color = 'gold'
        viewer_frame = tk.LabelFrame(self, bg=bg_color)
        viewer_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_columnconfigure(1, weight=1)
        viewer_frame.grid_columnconfigure(2, weight=1)
        viewer_frame.grid_columnconfigure(3, weight=1)
        viewer_frame.grid_rowconfigure(2, weight=1)

        #------------search_bar------------------
        self.init_search_frame(viewer_frame)
        self.init_insert_frame(viewer_frame)
        self.init_update_frame(viewer_frame)
        self.init_delete_frame(viewer_frame)

        query = list(
            map("".join, self.controller.get_columns_name('pbd_shops')))[:3]
        query.extend(
            list(
                map("".join,
                    self.controller.get_columns_name('pbd_locations')))[1:])
        self.table = TableFrame(viewer_frame, query)
        self.table.grid(row=2,
                        column=0,
                        columnspan=4,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def OnDoubleClick(self, event):
        item = self.table.tree.identify('item', event.x, event.y)
        print("you clicked on", self.table.tree.item(item, "values"))

    def on_select(self, event):
        self.selected_item = event.widget.item(event.widget.selection()[0],
                                               "values")
        self.shop_name_var.set(self.selected_item[1])
        self.stocks_name_var.set(self.selected_item[2])
        self.street_name_var.set(self.selected_item[3])
        self.city_name_var.set(self.selected_item[4])
        self.country_name_var.set(self.selected_item[5])
        from bd_gui import BdGui
        BdGui.set_entry_text(self.shop_name_update_entry,
                             self.selected_item[1])
        BdGui.set_entry_text(self.stocks_update_entry, self.selected_item[2])
        BdGui.set_entry_text(self.street_name_update_entry,
                             self.selected_item[3])
        BdGui.set_entry_text(self.city_name_update_entry,
                             self.selected_item[4])
        BdGui.set_entry_text(self.country_name_update_entry,
                             self.selected_item[5])

    def init_search_frame(self, master, row=0, column=0):
        width_label = 7
        self.search_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Search',
                                          fg='green')
        self.search_frame.grid(row=row, column=column, pady=10)

        shop_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        shop_search_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_search_frame,
                 text='Shop/Id',
                 bg=shop_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_name_search = tk.Entry(shop_search_frame)
        self.shop_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(shop_search_frame, text='Search',
                  command=self.search_shop).grid(row=0, column=2)

        street_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        street_search_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(street_search_frame,
                 text='Street',
                 bg=street_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.street_name_search = tk.Entry(street_search_frame)
        self.street_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(street_search_frame,
                  text='Search',
                  command=self.search_street).grid(row=0, column=2)

        city_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        city_search_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(city_search_frame,
                 text='City',
                 bg=city_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.city_name_search = tk.Entry(city_search_frame)
        self.city_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(city_search_frame, text='Search',
                  command=self.search_city).grid(row=0, column=2)

        country_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        country_search_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(country_search_frame,
                 text='Country: ',
                 bg=country_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.country_name_search = tk.Entry(country_search_frame)
        self.country_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(country_search_frame,
                  text='Search',
                  command=self.search_country).grid(row=0, column=2)

        option_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        option_search_frame.grid(row=4, column=0, pady=5, padx=5, sticky='ew')
        self.search_by_shop_id = tk.IntVar()
        from tkinter import ttk
        ttk.Checkbutton(option_search_frame,
                        text="Shop Id",
                        variable=self.search_by_shop_id,
                        command=self.on_check_shop_id).grid(row=0,
                                                            column=0,
                                                            padx=5,
                                                            pady=5)
        self.search_by_all_categories_button = tk.Button(
            option_search_frame,
            text='Search By All Categories',
            command=self.global_search,
            bg='light cyan',
            fg='red')
        self.search_by_all_categories_button.grid(row=0,
                                                  column=1,
                                                  padx=5,
                                                  pady=5)

    def on_check_shop_id(self):
        if self.search_by_shop_id.get():
            self.search_by_all_categories_button['state'] = tk.DISABLED
        else:
            self.search_by_all_categories_button['state'] = tk.NORMAL

    def init_insert_frame(self, master, row=0, column=1):
        width_label = 7
        self.insert_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Insert',
                                          fg='green')
        self.insert_frame.grid(row=row, column=column, pady=10)

        shop_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        shop_insert_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_insert_frame,
                 text='Shop: ',
                 bg=shop_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_name_insert = tk.Entry(shop_insert_frame)
        self.shop_name_insert.grid(row=0, column=1, padx=5, pady=5)

        stocks_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        stocks_insert_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(stocks_insert_frame,
                 text='Stocks: ',
                 bg=stocks_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.stocks_name_insert = tk.Entry(stocks_insert_frame)
        self.stocks_name_insert.grid(row=0, column=1, padx=5, pady=5)

        street_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        street_insert_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(street_insert_frame,
                 text='Street: ',
                 bg=street_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.street_name_insert = tk.Entry(street_insert_frame)
        self.street_name_insert.grid(row=0, column=1, padx=5, pady=5)

        city_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        city_insert_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(city_insert_frame,
                 text='City: ',
                 bg=city_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.city_name_insert = tk.Entry(city_insert_frame)
        self.city_name_insert.grid(row=0, column=1, padx=5, pady=5)

        country_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        country_insert_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(country_insert_frame,
                 text='Country: ',
                 bg=country_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.country_name_insert = tk.Entry(country_insert_frame)
        self.country_name_insert.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.insert_frame,
                  text='Insert',
                  command=self.insert,
                  bg='light cyan',
                  fg='red').grid(row=5, column=0, padx=5, pady=5)

    def init_update_frame(self, master, row=0, column=2):
        width_label = 7
        self.update_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Update',
                                          fg='green')
        self.update_frame.grid(row=row, column=column, pady=10)

        shop_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        shop_update_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_update_frame,
                 text='Shop: ',
                 bg=shop_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_name_update_entry = tk.Entry(shop_update_frame)
        self.shop_name_update_entry.grid(row=0, column=1, padx=5, pady=5)

        stocks_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        stocks_update_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(stocks_update_frame,
                 text='Stocks: ',
                 bg=stocks_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.stocks_update_entry = tk.Entry(stocks_update_frame)
        self.stocks_update_entry.grid(row=0, column=1, padx=5, pady=5)

        street_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        street_update_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(street_update_frame,
                 text='Street: ',
                 bg=street_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.street_name_update_entry = tk.Entry(street_update_frame)
        self.street_name_update_entry.grid(row=0, column=1, padx=5, pady=5)

        city_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        city_update_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(city_update_frame,
                 text='City: ',
                 bg=city_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.city_name_update_entry = tk.Entry(city_update_frame)
        self.city_name_update_entry.grid(row=0, column=1, padx=5, pady=5)

        country_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        country_update_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(country_update_frame,
                 text='Country: ',
                 bg=country_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.country_name_update_entry = tk.Entry(country_update_frame)
        self.country_name_update_entry.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.update_frame,
                  text='Update',
                  command=self.update,
                  bg='light cyan',
                  fg='red').grid(row=5, column=0, padx=5, pady=5)

    def init_delete_frame(self, master, row=0, column=3):
        width_label = 7
        width_text_label = 17
        self.delete_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Delete',
                                          fg='green')
        self.delete_frame.grid(row=row, column=column, pady=10)

        shop_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        shop_delete_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_delete_frame,
                 text='Shop: ',
                 bg=shop_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_name_var = tk.StringVar()
        tk.Label(shop_delete_frame,
                 textvariable=self.shop_name_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        stocks_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        stocks_delete_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(stocks_delete_frame,
                 text='Stocks: ',
                 bg=stocks_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.stocks_name_var = tk.StringVar()
        tk.Label(stocks_delete_frame,
                 textvariable=self.stocks_name_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        street_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        street_delete_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(street_delete_frame,
                 text='Street: ',
                 bg=street_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.street_name_var = tk.StringVar()
        tk.Label(street_delete_frame,
                 textvariable=self.street_name_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        city_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        city_delete_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(city_delete_frame,
                 text='City: ',
                 bg=city_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.city_name_var = tk.StringVar()
        tk.Label(city_delete_frame,
                 textvariable=self.city_name_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        country_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        country_delete_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(country_delete_frame,
                 text='Country: ',
                 bg=country_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.country_name_var = tk.StringVar()
        tk.Label(country_delete_frame,
                 textvariable=self.country_name_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.delete_frame,
                  text='Delete',
                  command=self.delete,
                  bg='light cyan',
                  fg='red').grid(row=5, column=0, padx=5, pady=5)

    def delete(self):
        log.info("Delete Shop Page")
        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Delete Error", "Item not selected")
            return

        shop_name = self.shop_name_var.get()
        street = self.street_name_var.get()
        city = self.city_name_var.get()
        country = self.country_name_var.get()

        try:
            self.controller.run_procedure('SHOP_PKG.delete_shop',
                                          [shop_name, street, city, country])
        except cx_Oracle.IntegrityError:
            from tkinter import messagebox
            messagebox.showinfo(
                "Delete Error", "Can't delete shop because orders are present")
            return
        self.populate_the_table_with_all_values()

    def search_for_shop(self, shop_name, street_name, city_name, country_name):
        shop_name_temp = shop_name.replace('\'', '\'\'')
        street_name_temp = street_name.replace('\'', '\'\'')
        city_name_temp = city_name.replace('\'', '\'\'')
        country_name_temp = country_name.replace('\'', '\'\'')
        query = "SELECT shop_id, shop_name, street_address, city, country from pbd_shops s, pbd_locations l where s.location_id = l.location_id and " \
                "lower(s.shop_name)='{}'and lower(l.street_address) = '{}' and lower(l.city) = '{}' and lower(l.country) = '{}'".format(shop_name_temp.lower(), street_name_temp.lower(), city_name_temp.lower(), country_name_temp.lower())
        query_select = self.controller.run_query(query)
        return query_select

    def global_search(self):
        shop_name = self.shop_name_search.get()
        street_name = self.street_name_search.get()
        country_name = self.country_name_search.get()
        city_name = self.city_name_search.get()
        self.table.clear_table()

        if shop_name + street_name + country_name + city_name == "":
            self.populate_the_table_with_all_values()
        else:
            shop_name = self.controller.add_escape_characters(shop_name)
            street_name = self.controller.add_escape_characters(street_name)
            country_name = self.controller.add_escape_characters(country_name)
            city_name = self.controller.add_escape_characters(city_name)
            query = "SELECT shop_id, shop_name, stocks, street_address, city, country from pbd_shops s, pbd_locations l where s.location_id = l.location_id and " \
                    "lower(shop_name) like '%{}%' escape '#' and lower(street_address) like '%{}%' escape '#' " \
                    "and lower(city) like '%{}%' escape '#' and lower(country) like '%{}%' escape '#'".format(
                shop_name.lower(), street_name.lower(), city_name.lower(), country_name.lower())
            query_select = self.controller.run_query(query)
            for row in self.search_for_shop(shop_name, street_name,
                                            country_name, city_name):
                self.table.insert('', 'end', values=row)

    def is_empty(self, shop_name, street, city, country, check_existence=True):
        from tkinter import messagebox
        if shop_name == '':
            messagebox.showinfo("Insert Error", "Shop Name required")
            return True
        if street == '':
            messagebox.showinfo("Insert Error", "Street Name required")
            return True
        if city == '':
            messagebox.showinfo("Insert Error", "City Name required")
            return True
        if country == '':
            messagebox.showinfo("Insert Error", "Country Name required")
            return True
        if check_existence:
            shops = self.search_for_shop(shop_name, street, city, country)
            if shops:
                messagebox.showinfo("Insert Error", "Shop already exists")
                return True
        return False

    def insert(self):
        log.info("Insert Shop Page")

        shop_name = self.shop_name_insert.get()
        if not self.string_length_is_okay(shop_name, text='Shop Name'):
            return
        shop_name = shop_name.strip()

        stocks = self.stocks_name_insert.get()

        street = self.street_name_insert.get()
        if not self.string_length_is_okay(
                street, text='Street Address', length=50):
            return
        street = street.strip()

        city = self.city_name_insert.get()
        if not self.string_length_is_okay(city, text='City Name', length=30):
            return
        city = city.strip()

        country = self.country_name_insert.get()
        if not self.string_length_is_okay(
                country, text='Country Name', length=30):
            return
        country = country.strip()

        if self.is_empty(shop_name, street, city, country):
            return

        if not self.is_number(stocks):
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Stocks is not number")
            return

        if not self.is_word_letters_and_spaces(country):
            from tkinter import messagebox
            messagebox.showinfo(
                "Country Name Error",
                "Country Name should contains only letters and spaces")
            return
        if not self.is_word_letters_and_spaces(city):
            from tkinter import messagebox
            messagebox.showinfo(
                "City Name Error",
                "City Name should contains only letters and spaces")
            return
        self.controller.run_procedure(
            'SHOP_PKG.insert_shop', [shop_name, stocks, street, city, country])
        self.populate_the_table_with_all_values()

    def update(self):
        log.info("Update Shop Page")

        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Item not selected")
            return

        shop_name = self.shop_name_update_entry.get()
        if not self.string_length_is_okay(shop_name, text='Shop Name'):
            return
        shop_name = shop_name.strip()

        stocks = self.stocks_update_entry.get()
        if not self.is_number(stocks):
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Stocks is not number")
            return

        street = self.street_name_update_entry.get()
        if not self.string_length_is_okay(
                street, text='Street Address', length=50):
            return
        street = street.strip()

        city = self.city_name_update_entry.get()
        if not self.string_length_is_okay(city, text='City Name', length=30):
            return
        city = city.strip()

        country = self.country_name_update_entry.get()
        if not self.string_length_is_okay(
                country, text='Country Name', length=30):
            return
        country = country.strip()

        if stocks == self.stocks_name_var.get(
        ) and shop_name == self.shop_name_var.get(
        ) and street == self.street_name_var.get(
        ) and city == self.city_name_var.get(
        ) and country == self.country_name_var.get():
            return
        if self.is_empty(shop_name,
                         street,
                         city,
                         country,
                         check_existence=False):
            return

        if not self.is_word_letters_and_spaces(country):
            from tkinter import messagebox
            messagebox.showinfo(
                "Country Name Error",
                "Country Name should contains only letters and spaces")
            return
        if not self.is_word_letters_and_spaces(city):
            from tkinter import messagebox
            messagebox.showinfo(
                "City Name Error",
                "City Name should contains only letters and spaces")
            return

        shop_name_to_delete = self.shop_name_var.get()
        street_to_delete = self.street_name_var.get()
        city_to_delete = self.city_name_var.get()
        country_to_delete = self.country_name_var.get()

        self.controller.run_procedure('SHOP_PKG.update_shop', [
            shop_name, stocks, street, city, country, street_to_delete,
            shop_name_to_delete, city_to_delete, country_to_delete
        ])
        self.populate_the_table_with_all_values()

    def search_shop(self):
        log.info("Search_Shop Shop Page")
        if self.search_by_shop_id.get():
            name = self.shop_name_search.get()
            if not name.isdigit():
                from tkinter import messagebox
                messagebox.showinfo("Search Error", "Shop Id invalid")
                return
            else:
                query = "SELECT shop_id, shop_name, street_address, city, country from pbd_shops s, pbd_locations l where s.location_id = l.location_id and s.shop_id={}".format(
                    name)
                query_select = self.controller.run_query(query)
                self.table.clear_table()
                for row in query_select:
                    self.table.insert('', 'end', values=row)
        else:
            name = self.shop_name_search.get()
            name = self.controller.add_escape_characters(name)
            query = "SELECT shop_id, shop_name, street_address, city, country from {} s, {} l where s.location_id = l.location_id and lower(shop_name) like '%{}%' escape '#'".format(
                'pbd_shops', 'pbd_locations', name.lower())
            self.search(name, query)

    def search_street(self):
        log.info("Search_Street Shop Page")

        name = self.street_name_search.get()
        name = self.controller.add_escape_characters(name)
        query = "SELECT shop_id, shop_name, street_address, city, country from {} s, {} l where s.location_id = l.location_id and lower(street_address) like '%{}%' escape '#'".format(
            'pbd_shops', 'pbd_locations', name.lower())
        self.search(name, query)

    def search_country(self):
        log.info("Search_Country Shop Page")

        name = self.country_name_search.get()
        name = self.controller.add_escape_characters(name)
        query = "SELECT shop_id, shop_name, street_address, city, country from {} s, {} l where s.location_id = l.location_id and lower(country) like '%{}%' escape '#'".format(
            'pbd_shops', 'pbd_locations', name.lower())
        self.search(name, query)

    def search_city(self):
        log.info("Search_City Shop Page")

        name = self.city_name_search.get()
        name = self.controller.add_escape_characters(name)
        query = "SELECT shop_id, shop_name, street_address, city, country from {} s, {} l where s.location_id = l.location_id and lower(city) like '%{}%' escape '#'".format(
            'pbd_shops', 'pbd_locations', name.lower())
        self.search(name, query)

    def search(self, name, query):
        self.table.clear_table()
        if name == '':
            self.populate_the_table_with_all_values()
        else:
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        query_select = self.controller.run_query(
            "SELECT shop_id, shop_name, stocks, street_address, city, country from {} s, {} l where s.location_id = l.location_id"
            .format('pbd_shops', 'pbd_locations'))
        for row in query_select:
            self.table.insert('', 'end', values=row)

    def shop_exists(self, shop_name, location_id):
        query_select = self.controller.run_query(
            "SELECT shop_id from pbd_shops s where lower(s.shop_name) = '{}' and s.location_id = {}"
            .format(shop_name.lower(), location_id))
        return bool(query_select)
Beispiel #7
0
class HomePage(BasicPage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def get_product_tuples(self):
        query_select = self.controller.run_query(
            "SELECT p.product_id, p.product_name, p.price from products p order by p.product_name"
        )
        return query_select

    def get_product_price(self, product_id):
        query_select = self.controller.run_query(
            "SELECT price from products where product_id={}".format(
                product_id))
        return query_select

    def get_shipping_tuples(self):
        query_select = self.controller.run_query(
            "SELECT shipping_id, provider, delivering_price from shipping_methods order by provider"
        )
        return query_select

    def init(self):
        self.button_home['bg'] = 'dark orange'
        bg_color = 'gold'
        btn_fg = 'white'
        width_label = 20
        width_entry = 20

        text_font = tkfont.Font(family='Helvetica', size=13)
        button_font = tkfont.Font(family='Helvetica', size=10)

        self.home_page_welcome_label_var = tk.StringVar()
        tk.Label(self,
                 textvariable=self.home_page_welcome_label_var,
                 font=self.title_font,
                 bg=bg_color,
                 fg='black').pack(side=tk.TOP, fill=tk.X)

        home_frame = tk.Frame(master=self, bg=bg_color)
        home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        home_frame.grid_rowconfigure(1, weight=1)
        home_frame.grid_columnconfigure(0, weight=1)
        home_frame.grid_columnconfigure(1, weight=1)

        #buy menu
        order_menu = tk.LabelFrame(home_frame,
                                   text="Buy",
                                   fg='blue',
                                   width=10,
                                   bg='light gray')
        order_menu.grid(row=0, column=0, columnspan=3, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Id/ Product/ Price',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=0, padx=5, pady=5)
        self.product_id_combo = ttk.Combobox(order_menu,
                                             state='readonly',
                                             width=width_entry * 2,
                                             values=self.get_product_tuples())
        self.product_id_combo.grid(row=1, column=0, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Quantity',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=1, padx=5, pady=5)
        self.quantity_combo = ttk.Combobox(order_menu,
                                           width=width_entry,
                                           values=[x for x in range(1, 1000)])
        self.quantity_combo.grid(row=1, column=1, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Id/ Shipping/ Price',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=2, padx=5, pady=5)
        self.ship_combo = ttk.Combobox(order_menu,
                                       width=width_entry * 2,
                                       state='readonly',
                                       values=self.get_shipping_tuples())
        self.ship_combo.grid(row=1, column=2, padx=5, pady=5)

        tk.Button(order_menu,
                  text="Buy",
                  command=self.on_buy,
                  width=10,
                  bg='red',
                  fg=btn_fg,
                  font=tkfont.Font(family='Helvetica',
                                   size=15)).grid(row=2,
                                                  column=0,
                                                  columnspan=3,
                                                  padx=5,
                                                  pady=15)

        #options row
        tk.Button(home_frame,
                  text="Logout",
                  command=self.on_logout,
                  bg='red',
                  fg=btn_fg,
                  font=self.title_font).grid(row=2,
                                             column=0,
                                             padx=35,
                                             pady=15,
                                             sticky='w')
        tk.Button(home_frame,
                  text="Refresh",
                  command=self.on_refresh,
                  bg='blue',
                  fg=btn_fg,
                  font=self.title_font).grid(row=2,
                                             column=1,
                                             padx=35,
                                             pady=15,
                                             sticky='w')
        self.advanced_options_button = tk.Button(home_frame,
                                                 text="Advanced Options",
                                                 command=self.on_advanced_opt,
                                                 bg='black',
                                                 fg=btn_fg,
                                                 font=self.title_font)
        self.advanced_options_button.grid(row=2,
                                          column=2,
                                          padx=35,
                                          pady=15,
                                          sticky='e')

        #table
        columns_names = [
            'Order Id', 'Product Name', 'Price', 'Quantity',
            'Shipping Provider', 'Provider Price', 'Total Amount',
            'Date Ordered'
        ]
        self.table = TableFrame(home_frame, columns_names)
        self.table.grid(row=1,
                        column=0,
                        columnspan=3,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def on_refresh(self):
        if not self.session_is_allright():
            return
        self.populate_the_table_with_all_values()

    def on_logout(self):
        from tkinter import messagebox
        if messagebox.askokcancel("Logout",
                                  "Are you sure you want to logout?"):
            self.controller.show_frame("LoginPage")

    @staticmethod
    def fields_are_empty(product_id, amount, shipping_id):
        from tkinter import messagebox
        if product_id == '':
            messagebox.showinfo("Buy Error", "Product id required")
            return True
        if amount == '':
            messagebox.showinfo("Buy Error", "Quantity required")
            return True
        if shipping_id == '':
            messagebox.showinfo("Buy Error", "Shipping id required")
            return True
        return False

    def on_buy(self):
        if not self.session_is_allright():
            return
        from tkinter import messagebox

        product_id = self.product_id_combo.get().split(' ')[0]
        amount = self.quantity_combo.get()
        shipping_id = self.ship_combo.get().split(' ')[0]

        if self.fields_are_empty(product_id, amount, shipping_id):
            return
        if not amount.isdigit() or not self.is_number(amount,
                                                      max_range=1_0000):
            messagebox.showinfo("Buy error", "Amount is not valid number")
            return

        if not messagebox.askokcancel(
                "Buy", "Are you sure you want to buy this item?"):
            return

        try:
            query = "INSERT INTO orders (user_id, shipping_id, product_id, quantity, total_amount) VALUES ({}, {}, {}, {}, {})"\
                .format(self.controller.user_info['user_id'], shipping_id, product_id, amount, str(int(self.get_shipping_price(shipping_id)) + int(amount)*int(self.get_product_price(product_id)[0][0])))
            self.controller.run_query(query)
        except KeyError:
            messagebox.showinfo("Account Error", "User invalid")
            self.controller.show_frame('LoginPage')
        self.populate_the_table_with_all_values()

    def get_shipping_price(self, shipping_id):
        query = "SELECT delivering_price from shipping_methods where shipping_id={}".format(
            shipping_id)
        return self.controller.run_query(query)[0][0]

    def on_select(self, event):
        pass

    def on_advanced_opt(self):
        # if not self.session_is_allright():
        #     return
        self.controller.show_frame("AdvancedAdminPage")

    def update_buy(self):
        self.product_id_combo['values'] = self.get_product_tuples()
        self.ship_combo['values'] = self.get_shipping_tuples()

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        if self.controller.user_info:
            query_select = self.controller.run_query(
                "SELECT o.order_id, p.product_name, p.price, o.quantity, ship.provider, ship.delivering_price, o.total_amount, o.date_ordered from orders o, products p, shipping_methods ship "
                "where o.product_id = p.product_id and o.shipping_id=ship.shipping_id and o.user_id={} order by p.product_name"
                .format(self.controller.user_info['user_id']))
            for row in query_select:
                self.table.insert('', 'end', values=row)
Beispiel #8
0
    def init(self):
        self.button_home['bg'] = 'dark orange'
        bg_color = 'gold'
        btn_fg = 'white'
        width_label = 20
        width_entry = 20

        text_font = tkfont.Font(family='Helvetica', size=13)
        button_font = tkfont.Font(family='Helvetica', size=10)

        self.home_page_welcome_label_var = tk.StringVar()
        tk.Label(self,
                 textvariable=self.home_page_welcome_label_var,
                 font=self.title_font,
                 bg=bg_color,
                 fg='black').pack(side=tk.TOP, fill=tk.X)

        home_frame = tk.Frame(master=self, bg=bg_color)
        home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        home_frame.grid_rowconfigure(1, weight=1)
        home_frame.grid_columnconfigure(0, weight=1)
        home_frame.grid_columnconfigure(1, weight=1)

        #buy menu
        order_menu = tk.LabelFrame(home_frame,
                                   text="Buy",
                                   fg='blue',
                                   width=10,
                                   bg='light gray')
        order_menu.grid(row=0, column=0, columnspan=3, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Id/ Product/ Price',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=0, padx=5, pady=5)
        self.product_id_combo = ttk.Combobox(order_menu,
                                             state='readonly',
                                             width=width_entry * 2,
                                             values=self.get_product_tuples())
        self.product_id_combo.grid(row=1, column=0, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Quantity',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=1, padx=5, pady=5)
        self.quantity_combo = ttk.Combobox(order_menu,
                                           width=width_entry,
                                           values=[x for x in range(1, 1000)])
        self.quantity_combo.grid(row=1, column=1, padx=5, pady=5)

        tk.Label(order_menu,
                 text='Id/ Shipping/ Price',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=2, padx=5, pady=5)
        self.ship_combo = ttk.Combobox(order_menu,
                                       width=width_entry * 2,
                                       state='readonly',
                                       values=self.get_shipping_tuples())
        self.ship_combo.grid(row=1, column=2, padx=5, pady=5)

        tk.Button(order_menu,
                  text="Buy",
                  command=self.on_buy,
                  width=10,
                  bg='red',
                  fg=btn_fg,
                  font=tkfont.Font(family='Helvetica',
                                   size=15)).grid(row=2,
                                                  column=0,
                                                  columnspan=3,
                                                  padx=5,
                                                  pady=15)

        #options row
        tk.Button(home_frame,
                  text="Logout",
                  command=self.on_logout,
                  bg='red',
                  fg=btn_fg,
                  font=self.title_font).grid(row=2,
                                             column=0,
                                             padx=35,
                                             pady=15,
                                             sticky='w')
        tk.Button(home_frame,
                  text="Refresh",
                  command=self.on_refresh,
                  bg='blue',
                  fg=btn_fg,
                  font=self.title_font).grid(row=2,
                                             column=1,
                                             padx=35,
                                             pady=15,
                                             sticky='w')
        self.advanced_options_button = tk.Button(home_frame,
                                                 text="Advanced Options",
                                                 command=self.on_advanced_opt,
                                                 bg='black',
                                                 fg=btn_fg,
                                                 font=self.title_font)
        self.advanced_options_button.grid(row=2,
                                          column=2,
                                          padx=35,
                                          pady=15,
                                          sticky='e')

        #table
        columns_names = [
            'Order Id', 'Product Name', 'Price', 'Quantity',
            'Shipping Provider', 'Provider Price', 'Total Amount',
            'Date Ordered'
        ]
        self.table = TableFrame(home_frame, columns_names)
        self.table.grid(row=1,
                        column=0,
                        columnspan=3,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)
Beispiel #9
0
class HomePage(BasicPage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def get_product_tuples(self):
        query_select = self.controller.run_query(
            "SELECT p.product_id, p.product_name, p.price, p.available_quantity quantity from pbd_products p order by p.product_name"
        )
        return query_select

    def get_product_price(self, product_id):
        query_select = self.controller.run_query(
            "SELECT price from pbd_products where product_id={}".format(
                product_id))
        return query_select

    def get_shipping_tuples(self):
        query_select = self.controller.run_query(
            "SELECT shipping_id, provider, delivering_price from pbd_shipping_methods order by provider"
        )
        return query_select

    def init(self):
        self.button_home['bg'] = 'dark orange'
        bg_color = 'gold'
        btn_fg = 'white'
        width_label = 20
        width_entry = 20

        text_font = tkfont.Font(family='Helvetica', size=13)
        button_font = tkfont.Font(family='Helvetica', size=10)

        self.home_page_welcome_label_var = tk.StringVar()
        tk.Label(self,
                 textvariable=self.home_page_welcome_label_var,
                 font=self.title_font,
                 bg=bg_color,
                 fg='black').pack(side=tk.TOP, fill=tk.X)

        home_frame = tk.Frame(master=self, bg=bg_color)
        home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        home_frame.grid_rowconfigure(1, weight=1)
        home_frame.grid_columnconfigure(0, weight=1)
        home_frame.grid_columnconfigure(1, weight=1)

        #buy menu
        order_menu = tk.LabelFrame(home_frame,
                                   text="Buy",
                                   fg='blue',
                                   width=10,
                                   bg='light gray')
        order_menu.grid(row=0, column=0, columnspan=3, padx=5, pady=5)

        # Label + Combobox -> select product
        tk.Label(order_menu, text='Id/ Product/ Price/ Av Qty', font=text_font, bg=order_menu['bg'],
                 fg='red', width=width_label)\
            .grid(row=0, column=0, padx=5, pady=5)
        self.product_id_combo = ttk.Combobox(order_menu,
                                             state='readonly',
                                             width=width_entry * 2,
                                             values=self.get_product_tuples())
        self.product_id_combo.grid(row=1, column=0, padx=5, pady=5)

        # Label + Combobox -> select quantity
        tk.Label(order_menu,
                 text='Quantity',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=1, padx=5, pady=5)
        self.quantity_combo = ttk.Combobox(order_menu,
                                           width=width_entry,
                                           values=[x for x in range(1, 1000)])
        self.quantity_combo.grid(row=1, column=1, padx=5, pady=5)

        # Label + Combobox -> select shipping
        tk.Label(order_menu, text='Id/ Shipping/ Price', font=text_font, bg=order_menu['bg'], fg='red',
                 width=width_label)\
            .grid(row=0, column=2, padx=5, pady=5)
        self.ship_combo = ttk.Combobox(order_menu,
                                       width=width_entry * 2,
                                       state='readonly',
                                       values=self.get_shipping_tuples())
        self.ship_combo.grid(row=1, column=2, padx=5, pady=5)

        # Label + Entry -> insert data
        tk.Label(order_menu,
                 text='Purchase data',
                 font=text_font,
                 bg=order_menu['bg'],
                 fg='red',
                 width=width_label).grid(row=0, column=3, padx=5, pady=5)
        self.order_entry = ttk.Entry(order_menu, width=width_entry * 2)
        self.order_entry.insert(0, 'YYYY-MM-DD')
        self.order_entry.grid(row=1, column=3, padx=5, pady=5)

        # Buy button
        tk.Button(order_menu, text="Buy", command=self.on_buy, width=10, bg='red', fg=btn_fg,
                  font=tkfont.Font(family='Helvetica', size=15))\
            .grid(row=2, column=0, columnspan=4, padx=5, pady=15)

        # Options row
        tk.Button(home_frame, text="Logout", command=self.on_logout, bg='red', fg=btn_fg, font=self.title_font)\
            .grid(row=2, column=0, padx=35, pady=15, sticky='w')
        tk.Button(home_frame, text="Refresh", command=self.on_refresh, bg='blue', fg=btn_fg, font=self.title_font)\
            .grid(row=2, column=1, padx=35, pady=15, sticky='w')
        self.advanced_options_button = tk.Button(home_frame,
                                                 text="Advanced Options",
                                                 command=self.on_advanced_opt,
                                                 bg='black',
                                                 fg=btn_fg,
                                                 font=self.title_font)
        self.advanced_options_button.grid(row=2,
                                          column=2,
                                          padx=35,
                                          pady=15,
                                          sticky='e')

        # Table
        columns_names = [
            'Order Id', 'Product Name', 'Price', 'Quantity',
            'Shipping Provider', 'Provider Price', 'Total Amount',
            'Date Ordered'
        ]
        self.table = TableFrame(home_frame, columns_names)
        self.table.grid(row=1,
                        column=0,
                        columnspan=3,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def on_refresh(self):
        if not self.session_is_allright():
            return
        self.populate_the_table_with_all_values()

    def on_logout(self):
        from tkinter import messagebox
        if messagebox.askokcancel("Logout",
                                  "Are you sure you want to logout?"):
            self.controller.show_frame("LoginPage")

    @staticmethod
    def fields_are_empty(product_id, amount, shipping_id, purchase_date):
        from tkinter import messagebox
        if product_id == '':
            messagebox.showinfo("Buy Error", "Product id required")
            return True
        if amount == '':
            messagebox.showinfo("Buy Error", "Quantity required")
            return True
        if shipping_id == '':
            messagebox.showinfo("Buy Error", "Shipping id required")
            return True
        if purchase_date == '':
            messagebox.showinfo("Buy Error", "Purchase date required")
            return True
        return False

    def is_valid_date(self, purchase_date: str) -> bool:
        pattern = r'(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
        match = re.search(pattern, purchase_date)
        return True if match else False

    def on_buy(self):
        if not self.session_is_allright():
            return
        from tkinter import messagebox

        # Extract data from inputs
        product_id = self.product_id_combo.get().split(' ')[0]
        amount = self.quantity_combo.get()
        shipping_id = self.ship_combo.get().split(' ')[0]
        purchase_date: str = self.order_entry.get()

        if self.fields_are_empty(product_id, amount, shipping_id,
                                 purchase_date):
            return
        if not amount.isdigit() or not self.is_number(amount,
                                                      max_range=1_0000):
            messagebox.showinfo("Buy error", "Amount is not valid number")
            return
        if not self.is_valid_date(purchase_date):
            messagebox.showinfo("Buy error", "The purchase date is not valid.")
            return
        purchase_date = date(*map(int, purchase_date.split('-')))

        if not messagebox.askokcancel(
                "Buy", "Are you sure you want to buy this item?"):
            return

        try:
            self.controller.run_procedure('ORDERS_PACK.insert_item', [
                self.controller.user_info['user_id'], shipping_id, product_id,
                amount,
                str(
                    int(self.get_shipping_price(shipping_id)) + int(amount) *
                    int(self.get_product_price(product_id)[0][0])),
                purchase_date
            ])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Purchase error", "Can't purchase items.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        except KeyError:
            messagebox.showinfo("Account Error", "User invalid")
            self.controller.show_frame('LoginPage')
        self.populate_the_table_with_all_values()

    def get_shipping_price(self, shipping_id):
        query = "SELECT delivering_price from pbd_shipping_methods where shipping_id={}".format(
            shipping_id)
        return self.controller.run_query(query)[0][0]

    def on_select(self, event):
        pass

    def on_advanced_opt(self):
        # if not self.session_is_allright():
        #     return
        self.controller.show_frame("AdvancedAdminPage")

    def update_buy(self):
        self.product_id_combo['values'] = self.get_product_tuples()
        self.ship_combo['values'] = self.get_shipping_tuples()

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        if self.controller.user_info:
            query_select = self.controller.run_query(
                "SELECT o.order_id, p.product_name, p.price, o.quantity, ship.provider, ship.delivering_price, o.total_amount, o.date_ordered from pbd_orders o, pbd_products p, pbd_shipping_methods ship "
                "where o.product_id = p.product_id and o.shipping_id=ship.shipping_id and o.user_id={} order by p.product_name"
                .format(self.controller.user_info['user_id']))
            for row in query_select:
                self.table.insert('', 'end', values=row)
Beispiel #10
0
class ProductPage(BasicPage):
    def __init__(self, parent, controller):
        super().__init__(parent, controller)
        self.init()

    def init(self):
        self.button_product['bg'] = 'dark orange'
        bg_color = 'gold'
        viewer_frame = tk.LabelFrame(self, bg=bg_color)
        viewer_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        viewer_frame.grid_columnconfigure(0, weight=1)
        viewer_frame.grid_columnconfigure(1, weight=1)
        viewer_frame.grid_columnconfigure(2, weight=1)
        viewer_frame.grid_columnconfigure(3, weight=1)
        viewer_frame.grid_rowconfigure(2, weight=1)

        # ------------search_bar------------------
        self.init_search_frame(viewer_frame)
        self.init_insert_frame(viewer_frame)
        self.init_update_frame(viewer_frame)
        self.init_delete_frame(viewer_frame)

        columns_names = [
            'PRODUCT ID', 'PRODUCT NAME', 'PRICE', 'QUANTITY', 'DATE UPDATED',
            'SHOP ID', 'DESCRIPTION', 'AVAILABLE QUANTITY'
        ]
        self.table = TableFrame(viewer_frame, columns_names)
        self.table.grid(row=2,
                        column=0,
                        columnspan=4,
                        sticky="nesw",
                        padx=5,
                        pady=5)
        self.populate_the_table_with_all_values()
        self.table.tree.bind('<<TreeviewSelect>>', self.on_select)

    def OnDoubleClick(self, event):
        item = self.table.tree.identify('item', event.x, event.y)
        print("you clicked on", self.table.tree.item(item, "values"))

    def on_select(self, event):
        self.selected_item = event.widget.item(event.widget.selection()[0],
                                               "values")
        self.product_name_delete_var.set(self.selected_item[1])
        self.price_delete_var.set(self.selected_item[2])
        self.quantity_delete_var.set(self.selected_item[3])
        self.date_delete_var.set(self.selected_item[4].split()[0])
        self.shop_id_delete_var.set(self.selected_item[5])
        self.description_delete_var.set(self.selected_item[6])
        from bd_gui import BdGui
        BdGui.set_entry_text(self.product_name_update, self.selected_item[1])
        BdGui.set_entry_text(self.price_update, self.selected_item[2])
        BdGui.set_entry_text(self.quantity_update, self.selected_item[3])
        BdGui.set_entry_text(self.date_update,
                             self.selected_item[4].split()[0])
        BdGui.set_entry_text(self.shop_id_update, self.selected_item[5])
        BdGui.set_entry_text(self.description_update, self.selected_item[6])

    def init_search_frame(self, master, row=0, column=0):
        width_label = 7
        self.search_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Search',
                                          fg='green')
        self.search_frame.grid(row=row, column=column, pady=10, padx=5)

        product_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        product_search_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(product_search_frame,
                 text='Product/Id',
                 bg=product_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.product_name_search = tk.Entry(product_search_frame)
        self.product_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(product_search_frame,
                  text='Search',
                  command=self.search_product).grid(row=0, column=2)

        price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        price_search_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_search_frame,
                 text='Price',
                 bg=price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_name_search = tk.Entry(price_search_frame)
        self.price_name_search.grid(row=0, column=1, padx=5, pady=5)
        tk.Button(price_search_frame, text='Search',
                  command=self.search_price).grid(row=0, column=2)

        min_price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        min_price_search_frame.grid(row=2,
                                    column=0,
                                    pady=5,
                                    padx=5,
                                    sticky='w')
        tk.Label(min_price_search_frame,
                 text='Min Price',
                 bg=min_price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.min_price_name_search = tk.Entry(min_price_search_frame)
        self.min_price_name_search.grid(row=0, column=1, padx=5, pady=5)

        max_price_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        max_price_search_frame.grid(row=3,
                                    column=0,
                                    pady=5,
                                    padx=5,
                                    sticky='w')
        tk.Label(max_price_search_frame,
                 text='Max Price',
                 bg=max_price_search_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.max_price_name_search = tk.Entry(max_price_search_frame)
        self.max_price_name_search.grid(row=0, column=1, padx=5, pady=5)

        option_search_frame = tk.LabelFrame(self.search_frame, bg='gray94')
        option_search_frame.grid(row=4, column=0, pady=5, padx=5, sticky='ew')
        self.search_by_product_id = tk.IntVar()
        from tkinter import ttk
        ttk.Checkbutton(option_search_frame,
                        text="Product Id",
                        variable=self.search_by_product_id,
                        command=self.on_check_product_id).grid(row=0,
                                                               column=0,
                                                               padx=5,
                                                               pady=5)
        self.search_by_price_range_btn = tk.Button(
            option_search_frame,
            text='Search By Price Range',
            command=self.search_price_range,
            bg='light cyan',
            fg='red')
        self.search_by_price_range_btn.grid(row=0, column=1, padx=5, pady=5)

    def fetch_data(self):
        self.populate_the_table_with_all_values()

    def on_check_product_id(self):
        pass

    def search_for_product_equal(self, product, price, shop_id, description):
        product = product.replace('\'', '\'\'')
        description = description.replace('\'', '\'\'')
        if description != 'None' and description != '':
            query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where lower(product_name)='{}' and price={} and shop_id={} and lower(description)='{}'".format(
                product.lower(), price, shop_id, description.lower())
        else:
            query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where lower(product_name)='{}' and price={} and shop_id={} and description is NULL".format(
                product.lower(), price, shop_id)
        query_select = self.controller.run_query(query)
        return query_select

    def search_for_product_like(self, product):
        product = self.controller.add_escape_characters(product)
        query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where lower(product_name) like '%{}%'".format(
            product.lower())
        query_select = self.controller.run_query(query)
        return query_select

    def search_product(self):
        log.info("Search_Provider product Page")
        if self.search_by_product_id.get():
            name = self.product_name_search.get()
            if not name.isdigit():
                from tkinter import messagebox
                messagebox.showinfo("Search Error", "Product Id invalid")
                return
            else:
                query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where product_id={}".format(
                    name)
                query_select = self.controller.run_query(query)
                self.table.clear_table()
                for row in query_select:
                    self.table.insert('', 'end', values=row)
        else:
            self.table.clear_table()
            name = self.product_name_search.get()
            if name == '':
                self.populate_the_table_with_all_values()
            else:
                for row in self.search_for_product_like(name):
                    self.table.insert('', 'end', values=row)

    def exist_shop_id(self, shop_id):
        query = "SELECT shop_id from pbd_shops where shop_id={}".format(
            shop_id)
        query_select = self.controller.run_query(query)
        if query_select:
            return True
        else:
            return False

    def search_price(self):
        log.info("Search_Price product Page")
        self.table.clear_table()

        price = self.price_name_search.get()
        if price == '':
            self.populate_the_table_with_all_values()
        else:
            if not self.is_number(price):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error", "Price is not number")
                return
            query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where price={}".format(
                price)
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def search_price_range(self):
        log.info("Search_Price Range product Page")
        self.table.clear_table()

        price_min = self.min_price_name_search.get()
        price_max = self.max_price_name_search.get()
        if price_min == '' and price_max == '':
            self.populate_the_table_with_all_values()
        else:
            if not self.is_number(price_min, zero_permited=True):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error",
                                    "Price MIN is not a valid number")
                return
            if not self.is_number(price_max, zero_permited=True):
                from tkinter import messagebox
                messagebox.showinfo("Insert Error",
                                    "Price MAX is not a valid number")
                return
            if price_min == '':
                price_min = '0'
            if price_max == '':
                price_max = '999999'
            query = "SELECT product_id, product_name, price, shop_id, description from pbd_products where price between {} and {}".format(
                price_min, price_max)
            query_select = self.controller.run_query(query)
            for row in query_select:
                self.table.insert('', 'end', values=row)

    def init_insert_frame(self, master, row=0, column=1):
        width_label = 13
        self.insert_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Insert',
                                          fg='green')
        self.insert_frame.grid(row=row, column=column, pady=10)

        product_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        product_insert_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(product_insert_frame,
                 text='Product Name',
                 bg=product_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.product_name_insert = tk.Entry(product_insert_frame)
        self.product_name_insert.grid(row=0, column=1, padx=5, pady=5)

        price_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        price_insert_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_insert_frame,
                 text='Price',
                 bg=price_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_insert = tk.Entry(price_insert_frame)
        self.price_insert.grid(row=0, column=1, padx=5, pady=5)

        # Quantity
        quantity_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        quantity_insert_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(quantity_insert_frame,
                 text='Quantity',
                 bg=quantity_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.quantity_insert = tk.Entry(quantity_insert_frame)
        self.quantity_insert.grid(row=0, column=1, padx=5, pady=5)

        # Purchase date
        date_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        date_insert_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(date_insert_frame,
                 text='Date updated',
                 bg=date_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.date_insert = tk.Entry(date_insert_frame)
        self.date_insert.grid(row=0, column=1, padx=5, pady=5)

        # Shop ID
        shop_id_insert_frame = tk.LabelFrame(self.insert_frame, bg='gray94')
        shop_id_insert_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_id_insert_frame,
                 text='Shop Id',
                 bg=shop_id_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_id_insert = tk.Entry(shop_id_insert_frame)
        self.shop_id_insert.grid(row=0, column=1, padx=5, pady=5)

        # Description
        description_insert_frame = tk.LabelFrame(self.insert_frame,
                                                 bg='gray94')
        description_insert_frame.grid(row=5,
                                      column=0,
                                      pady=5,
                                      padx=5,
                                      sticky='w')
        tk.Label(description_insert_frame,
                 text='Description',
                 bg=description_insert_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.description_insert = tk.Entry(description_insert_frame)
        self.description_insert.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.insert_frame,
                  text='Insert',
                  command=self.insert,
                  bg='light cyan',
                  fg='red').grid(row=6, column=0, padx=5, pady=5)

    def init_update_frame(self, master, row=0, column=2):
        width_label = 13
        self.update_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Update',
                                          fg='green')
        self.update_frame.grid(row=row, column=column, pady=10)

        product_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        product_update_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(product_update_frame,
                 text='Product Name',
                 bg=product_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.product_name_update = tk.Entry(product_update_frame)
        self.product_name_update.grid(row=0, column=1, padx=5, pady=5)

        price_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        price_update_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_update_frame,
                 text='Price',
                 bg=price_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_update = tk.Entry(price_update_frame)
        self.price_update.grid(row=0, column=1, padx=5, pady=5)

        quantity_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        quantity_update_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(quantity_update_frame,
                 text='Quantity',
                 bg=quantity_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.quantity_update = tk.Entry(quantity_update_frame)
        self.quantity_update.grid(row=0, column=1, padx=5, pady=5)

        # Purchase date
        date_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        date_update_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(date_update_frame,
                 text='Date updated',
                 bg=date_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.date_update = tk.Entry(date_update_frame)
        self.date_update.grid(row=0, column=1, padx=5, pady=5)

        shop_id_update_frame = tk.LabelFrame(self.update_frame, bg='gray94')
        shop_id_update_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_id_update_frame,
                 text='Shop Id',
                 bg=shop_id_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_id_update = tk.Entry(shop_id_update_frame)
        self.shop_id_update.grid(row=0, column=1, padx=5, pady=5)

        description_update_frame = tk.LabelFrame(self.update_frame,
                                                 bg='gray94')
        description_update_frame.grid(row=5,
                                      column=0,
                                      pady=5,
                                      padx=5,
                                      sticky='w')
        tk.Label(description_update_frame,
                 text='Description',
                 bg=description_update_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.description_update = tk.Entry(description_update_frame)
        self.description_update.grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.update_frame,
                  text='Update',
                  command=self.update,
                  bg='light cyan',
                  fg='red').grid(row=6, column=0, padx=5, pady=5)

    def init_delete_frame(self, master, row=0, column=3):
        width_label = 13
        width_text_label = 20
        self.delete_frame = tk.LabelFrame(master,
                                          bg='gray85',
                                          text='Delete',
                                          fg='green')
        self.delete_frame.grid(row=row, column=column, pady=10)

        product_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        product_delete_frame.grid(row=0, column=0, pady=5, padx=5, sticky='w')
        tk.Label(product_delete_frame,
                 text='Product',
                 bg=product_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.product_name_delete_var = tk.StringVar()
        tk.Label(product_delete_frame,
                 textvariable=self.product_name_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        price_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        price_delete_frame.grid(row=1, column=0, pady=5, padx=5, sticky='w')
        tk.Label(price_delete_frame,
                 text='Price',
                 bg=price_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.price_delete_var = tk.StringVar()
        tk.Label(price_delete_frame,
                 textvariable=self.price_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        quantity_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        quantity_delete_frame.grid(row=2, column=0, pady=5, padx=5, sticky='w')
        tk.Label(quantity_delete_frame,
                 text='Quantity',
                 bg=quantity_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.quantity_delete_var = tk.StringVar()
        tk.Label(quantity_delete_frame,
                 textvariable=self.quantity_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)
        date_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        date_delete_frame.grid(row=3, column=0, pady=5, padx=5, sticky='w')
        tk.Label(date_delete_frame,
                 text='Date updated',
                 bg=date_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.date_delete_var = tk.StringVar()
        tk.Label(date_delete_frame,
                 textvariable=self.date_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        shop_id_delete_frame = tk.LabelFrame(self.delete_frame, bg='gray94')
        shop_id_delete_frame.grid(row=4, column=0, pady=5, padx=5, sticky='w')
        tk.Label(shop_id_delete_frame,
                 text='Shop Id',
                 bg=shop_id_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.shop_id_delete_var = tk.StringVar()
        tk.Label(shop_id_delete_frame,
                 textvariable=self.shop_id_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        description_delete_frame = tk.LabelFrame(self.delete_frame,
                                                 bg='gray94')
        description_delete_frame.grid(row=5,
                                      column=0,
                                      pady=5,
                                      padx=5,
                                      sticky='w')
        tk.Label(description_delete_frame,
                 text='Description',
                 bg=description_delete_frame['bg'],
                 fg='dark orange',
                 width=width_label).grid(row=0, column=0)
        self.description_delete_var = tk.StringVar()
        tk.Label(description_delete_frame,
                 textvariable=self.description_delete_var,
                 width=width_text_label).grid(row=0, column=1, padx=5, pady=5)

        tk.Button(self.delete_frame,
                  text='Delete',
                  command=self.delete,
                  bg='light cyan',
                  fg='red').grid(row=6, column=0, padx=5, pady=5)

    def delete(self):
        log.info("Delete product Page")
        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Delete Error", "Item not selected")
            return

        name = self.product_name_delete_var.get().replace('\'', '\'\'')
        if not name:
            return
        price = self.price_delete_var.get()
        shop_id = self.shop_id_delete_var.get()

        try:
            self.controller.run_procedure('PRODUCTS_PACK.delete_item',
                                          [name, price, shop_id])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Delete error", "Can't delete product.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def fields_are_empty(self, name, price, shop_id):
        from tkinter import messagebox
        if name == '':
            messagebox.showinfo("Insert Error", "Product Name required")
            return True
        if price == '':
            messagebox.showinfo("Insert Error", "Price Name required")
            return True
        if shop_id == '':
            messagebox.showinfo("Insert Error", "Shop Id Name required")
            return True

    def product_exists(self, name, price, shop_id, description):
        from tkinter import messagebox
        if self.search_for_product_equal(name, price, shop_id, description):
            messagebox.showinfo("Insert Error", "Product already exists")
            return True
        return False

    def insert(self):
        log.info("Insert product Page")
        price = self.price_insert.get()
        shop_id = self.shop_id_insert.get()
        quantity = self.quantity_insert.get()

        name = self.product_name_insert.get()
        if not self.string_length_is_okay(name, text='Product Name'):
            return
        name = name.strip()

        description = self.description_insert.get()
        if not self.string_length_is_okay(
                description, text='Description Name', length=100):
            return
        description = description.strip()

        date_updated = self.date_insert.get()
        if not self.is_valid_date(date_updated):
            return
        date_updated = date(*map(int, date_updated.split('-')))

        if not self.is_number(price):
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Price is not number")
            return
        if not shop_id.isdigit():
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Shop Id is not number")
            return
        if not quantity.isdigit():
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Quantity Id is not number")
            return
        if not self.exist_shop_id(shop_id):
            from tkinter import messagebox
            messagebox.showinfo("Insert Error", "Shop Id does not exist")
            return

        if self.fields_are_empty(name, price, shop_id) or self.product_exists(
                name, price, shop_id, description):
            return

        try:
            self.controller.run_procedure(
                'PRODUCTS_PACK.insert_item',
                [name, price, date_updated, quantity, shop_id, description])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Insert error", "Can't insert product.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return
        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def update(self):
        log.info("Update product Page")
        if not self.table.is_item_selected():
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Item not selected")
            return

        price = self.price_update.get()
        shop_id = self.shop_id_update.get()
        quantity = self.quantity_update.get()

        name = self.product_name_update.get()
        if not self.string_length_is_okay(name, text='Product Name'):
            return
        name = name.strip()

        description = self.description_update.get()
        if not self.string_length_is_okay(
                description, text='Description Name', length=100):
            return
        description = description.strip()

        date_updated = self.date_update.get()
        if not self.is_valid_date(date_updated):
            return
        date_updated = date(*map(int, date_updated.split('-')))

        if not self.is_number(price):
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Price is not number")
            return
        if not shop_id.isdigit():
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Shop Id is not number")
            return
        if not quantity.isdigit():
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Quantity is not number")
            return
        if not self.exist_shop_id(shop_id):
            from tkinter import messagebox
            messagebox.showinfo("Update Error", "Shop Id does not exist")
            return

        if self.fields_are_empty(
                name, price, shop_id
        ):  #or self.product_exists(name, price, shop_id, description):
            return

        old_name = self.product_name_delete_var.get()
        old_price = self.price_delete_var.get()
        old_shop_id = self.shop_id_delete_var.get()

        if description == 'None':
            description = ''

        try:
            self.controller.run_procedure('PRODUCTS_PACK.update_item', [
                name, price, date_updated, quantity, shop_id, description,
                old_name, old_price, old_shop_id
            ])
        except cx_Oracle.DatabaseError as exc_db_err:
            from tkinter import messagebox
            messagebox.showinfo(
                "Update error", "Can't update product.\n{}".format(
                    exc_db_err.args[0].message.split("\n")[0]))
            return

        self.populate_the_table_with_all_values()
        self.controller.frames["HomePage"].update_buy()

    def populate_the_table_with_all_values(self):
        self.table.clear_table()
        query_select = self.controller.run_query(
            "SELECT p.product_id, p.product_name, p.price, " +
            "p.available_quantity as quantity, p.date_acquired, p.shop_id, p.description, "
            +
            "(available_quantity - NVL((SELECT SUM(quantity) FROM pbd_orders o "
            +
            "WHERE o.product_id = p.product_id), 0)) as available_quantity " +
            "from pbd_products p")
        for row in query_select:
            self.table.insert('', 'end', values=row)

    def is_valid_date(self, purchase_date: str) -> bool:
        pattern = r'(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
        match = re.search(pattern, purchase_date)
        return True if match else False