コード例 #1
0
class SearchZendesk:
    """
    Class to search users, tickets and organizations
    """
    def __init__(self):
        """
        Constructor for SearchZendesk class
        """
        self.main_choices = {
            1: "Select 1 to search Zendesk",
            2: "Select 2 to view a list of searchable fields",
            3: "Exit"
        }  # main menu choices

        self.sub_choices = {
            1: "Select 1 to search users",
            2: "Select 2 to search tickets",
            3: "Select 3 to search organizations",
            4: "Select 4 to go back to main menu"
        }  # search menu choices

        self.user = User()  # instantiates user class
        self.ticket = Ticket()  # instantiates ticket class
        self.organization = Organization()  # instantiates organization class

    def print_main_menu(self):
        """
        prints main menu
        """
        print(2 * "*", f"{Colors.BOLD}Select options: {Colors.ENDC}", 2 * "*",
              "\n")
        for (k, v) in self.main_choices.items():
            print(str(k) + ". " + v)
        print("\n")
        print(66 * "-")

    def print_sub_menu(self):
        """
        prints search menu
        """
        print("\n")
        print(2 * "*",
              f"{Colors.BOLD}Select from the following menu: {Colors.ENDC}",
              2 * "*", "\n")
        for (k, v) in self.sub_choices.items():
            print(str(k) + ". " + v)
        print("\n")
        print(66 * "-")

    @staticmethod
    def print_results(results):
        """
        prints search results
        :param results: list of search results
        """
        if len(results) == 0:
            print("No results found.")
        else:
            for res in results:
                print("\n".join([(key + (30 - len(key)) * " " + str(value))
                                 for (key, value) in res.items()]))
                print(80 * "-")

    def get_menu_response(self):
        """
        main method to input search queries and retrieve results
        :return: search results
        """
        print("\n")
        print(
            23 * "*",
            f"{Colors.BOLD}{Colors.BLUE}Welcome to Zendesk Search{Colors.ENDC}",
            23 * "*")
        print("\n")

        main_loop = True

        while main_loop:  # outer loop to receive main menu options
            self.print_main_menu()  # print main menu
            try:
                choice = int(
                    input("Enter your choice [" +
                          str(min(self.main_choices.keys())) + "-" +
                          str(max(self.main_choices.keys())) + "]: "))
                if choice == 1:
                    sub_loop = True
                    while sub_loop:
                        self.print_sub_menu()  # print sub menu
                        try:
                            sub_choice = int(
                                input("Enter your choice [" +
                                      str(min(self.sub_choices.keys())) + "-" +
                                      str(max(self.sub_choices.keys())) +
                                      "]: "))
                            if sub_choice == 1:  # search users
                                query = self.get_query(self.user.fields)
                                results = self.search_users(query)
                                self.print_results(results)
                            elif sub_choice == 2:  # search tickets
                                query = self.get_query(self.ticket.fields)
                                results = self.search_tickets(query)
                                self.print_results(results)
                            elif sub_choice == 3:  # search organization
                                query = self.get_query(
                                    self.organization.fields)
                                results = self.search_organizations(query)
                                self.print_results(results)
                            elif sub_choice == 4:  # terminate sub loop
                                sub_loop = False
                            else:
                                input(
                                    "Wrong option selection. Enter any key to try again.."
                                )
                        except ValueError:
                            input(
                                "Wrong option selection. Enter any key to try again.."
                            )
                elif choice == 2:
                    self.user.print_fields()  # prints user fields
                    self.ticket.print_fields()  # prints ticket fields
                    self.organization.print_fields(
                    )  # prints organization fields
                elif choice == 3:
                    main_loop = False  # terminate main loop
                else:
                    input(
                        "Wrong option selection. Enter any key to try again..")
                print("\n")
            except ValueError:
                input("Wrong option selection. Enter any key to try again..")

    def search_users(self, query):
        """
        searches users for the given query
        :param query: Term query
        :return: search results
        """
        return self.user.search(query)

    def search_tickets(self, query):
        """
        searches tickets for the given query
        :param query: Term query
        :return: search results
        """
        return self.ticket.search(query)

    def search_organizations(self, query):
        """
        searches organizations for the given query
        :param query: Term query
        :return: search results
        """
        return self.organization.search(query)

    @staticmethod
    def get_query(fields):
        """
        Returns a term query from user input
        :param fields: list of searchable fields
        :return: Term query
        """
        multi_fields_flag = True
        terms = []

        print("Choose from the following fields:\n" + "\n".join(fields) + "\n")
        field = input("Enter search term:")
        while field not in fields:
            print(
                "Search term not found. Choose a search term from the following fields:\n"
                + "\n".join(fields) + "\n")
            field = input("Enter search term:")
        value = input("Enter search value:")
        terms.append(Term(field, value))

        while multi_fields_flag:
            print("Choose from the following fields:\n" + "\n".join(fields) +
                  "\n")
            field = input("Enter search term or press enter to search:")
            if field == "":
                return And(terms)
            else:
                while field not in fields:
                    print(
                        "Search term not found. Choose a search term from the following fields:\n"
                        + "\n".join(fields) + "\n")
                    field = input("Enter search term:")
                    if field == "":
                        return And(terms)
                value = input("Enter search value:")
                terms.append(Term(field, value))
        return And(terms)