Skip to content
Advertisement

How do I search inventory by characters in the items name no matter if its uppercase or lowercase? [closed]

I have an inventory program that works but has one problem. My program lets you add, remove, update, search, and print inventory items, qty, and ID number. Search(option 4) needs to be able to search an inventory item by characters in its name. For example, if Oranges are in inventory, I should be able to type or and it can pull it up and display all the information about it including name, qty, and ID number.

The problem: Currently search only works if you type in the ID number. Question: how do I change over this search function without causing issues for my other program options. I will attach the full program, but the problem is in def search.

Code:

import os
import json

class Inventory:
    def __init__(self):
        #AT LAUNCH GROUPS AND LOADING FUNCTION
        self.items = {}
        self.load()

    def remove(self, ID):
        #REMOVING ITEMS FOR LISTS AND OUTPUT DOCUMENT
        del self.items[str(ID)]
        self.save()

    def add(self, ID, name, qty):
        #ADDING ITEMS FOR LISTS AND OUTPUT DOCUMENT
        self.items[str(ID)] = {"name": name, "qty": qty}
        self.save()

    def update(self, ID, update):
        #UPDATING ITEMS FOR LISTS AND OUTPUT DOCUMENT
        self.items[str(ID)]["qty"] += update
        self.save()

    def search(self, query):
        for id in self.items:
            if str(query) == id:
                return id, self.items[id]['name'], self.items[id]['qty']
        return None

    def __str__(self):
        #FORMATTING
        out = ""
        for id, d in self.items.items():
            out += f"ID Number : {id} nItem Name : {d['name']}nQuantity : {d['qty']}n"
            out += "----------n"
        return out
    
    def save(self):
        #WHERE TO SAVE TO
        with open('data.txt','w') as outfile:
           json.dump(self.items, outfile)

    def load(self):
        #WHERE TO PUT DATA FROM WHEN RELAUNCHING PROGRAM
        try:
            with open('data.txt','r') as json_file:
               self.items = json.load(json_file)
        except:
            print("Can't load old inventory, starting fresh")
            self.items = {}


def menuDisplay():
    #MENU FOR PROGRAM 
    """Display the menu"""
    print('=============================')
    print('= Inventory Management Menu =')
    print('=============================')
    print('(1) Add New Item to Inventory')
    print('(2) Remove Item from Inventory')
    print('(3) Update Inventory')
    print('(4) Search Item in Inventory')
    print('(5) Print Inventory Report')
    print('(99) Quit')


def add_one_item(inventory):
    #ADDING PROMPT AND ERROR CHECKING
    print('Adding Inventory')
    print('================')
    while True:
        try:
            new_ID = int(input("Enter an ID number for the item: "))
            if inventory.search(new_ID):
                print("ID number is taken, please enter a different ID number")
                continue
            new_name = input('Enter the name of the item: ')
            new_qty = int(input("Enter the quantity of the item: "))
            inventory.add(new_ID, new_name, new_qty)
            break
        except Exception as e:
            print("Invalid choice! try again! " + str(e))
            print()


def remove_one_item(inventory):
    #REMOVING PROMPT AND ERROR CHECKING
    print('Removing Inventory')
    print('==================')
    removing = int(input("Enter the item's ID number to remove from inventory: "))
    inventory.remove(removing)


def ask_exit_or_continue():
    #OPTION TO CONTINUE OR QUITE PROGRAM
    return int(input('Enter 98 to continue or 99 to exit: '))


def update_inventory(inventory):
    #UPDATING PROMPT AND ERROR CHECKING
    print('Updating Inventory')
    print('==================')
    while True:
        try:
            ID = int(input("Enter the item's ID number to update: "))
            if inventory.search(ID):
                update = int(input("Enter the updated quantity. Enter 5 for additional or -5 for less: "))
                inventory.update(ID, update)
            else:
                print("ID number is not in the system, please enter a different ID number")
                continue
            break
        except Exception as e:
            print("Invalid choice! try again! " + str(e))
            print()

def search_inventory(inventory):
    #SEARCHING PROMPT AND ERROR CHECKING
    print('Searching Inventory')
    print('===================')
    search = input("Enter the name of the item: ")
    result = inventory.search(search)
    if result is None:
        print("Item not in inventory")
    else:
        ID, name, qty = result
        print('ID Number: ', ID)
        print('Item:     ', name)
        print('Quantity: ', qty)
        print('----------')


def print_inventory(inventory):
    #PRINT CURRENT LIST OF ITEMS IN INVENTORY
    print('Current Inventory')
    print('=================')
    print(inventory)


def main():
    #PROGRAM RUNNING COMMAND AND ERROR CHECKING
    inventory = Inventory()
    while True:
        try:
            menuDisplay()
            CHOICE = int(input("Enter choice: "))
            if CHOICE in [1, 2, 3, 4, 5]:
                if CHOICE == 1:
                    add_one_item(inventory)
                elif CHOICE == 2:
                    remove_one_item(inventory)
                elif CHOICE == 3:
                    update_inventory(inventory)
                elif CHOICE == 4:
                    search_inventory(inventory)
                elif CHOICE == 5:
                    print_inventory(inventory)
                exit_choice = ask_exit_or_continue()
                if exit_choice == 99:
                    exit()
            elif CHOICE == 99:
                exit()
        except Exception as e:
            print("Invalid choice! try again!"+str(e))
            print()

        # If the user pick an invalid choice,
        # the program will come to here and
        # then loop back.


main()

Advertisement

Answer

Add by parameter and send that along with your query.

def search(self, query, by):
    if by == "id":
        for id in self.items:
            if str(query) == id:
                return id, self.items[id]['name'], self.items[id]['qty']
    elif by == "name":
        for id in self.items:
            if str(query) == self.items[id]['name']:
                return id, self.items[id]['name'], self.items[id]['qty']
    elif by == "qty":
        for id in self.items:
            if str(query) == self.items[id]['qty']:
                return id, self.items[id]['name'], self.items[id]['qty']
    return None
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement