Example #1
0
 def __init__(self, dbName="database"):
     self.db = FakeDb(dbName)
     self.status = 1
     self.mode = 0
     self.commands = {"help": self.helpMe,
             "add": [self.addPerson, self.addGroup, self.addEvent, self.addMessages],
             "save": self.saveDb,
             "load": self.loadDb,
             "quit": self.quit,
             "exit": self.quit,
             "group": self.groupPeople,
             "packages": self.assignPackage,
             "edit": [self.editPerson, self.editGroup, self.editEvent, self.editMessages],
             "list": [self.showDbPerson, self.showDbGroup, self.showDbEvent, self.showDbMessages],
             "table": [self.showTablePerson, self.showTableGroup, self.showTableEvent, self.showTableMessages],
             "Person": self.changeToPerson,
             "Group": self.changeToGroup,
             "Event": self.changeToEvent,
             "Messages": self.changeToMessages,
             "del": [self.deletePerson, self.deleteGroup, self.deleteEvent, self.deleteMessages]}
     self.commandsHelp = ["help\t: show help for commands",
             "Event, Group, Person, Messages\t: switch bettween modes",
             "\tadd\t: add mode in database",
             "\tdel\t: delete mode from database",
             "\tedit\t: edit mode in database",
             "\tlist\t: print mode in database",
             "\ttable\t: print mode database table",
             "packages\t: packages assign"
             "group\t: group people",
             "save\t: save changes in database",
             "load\t: load database",
             "quit\t: quit shell",
             "exit\t: quit shell"]
Example #2
0
class Shell(object):

    def __init__(self, dbName="database"):
        self.db = FakeDb(dbName)
        self.status = 1
        self.mode = 0
        self.commands = {"help": self.helpMe,
                "add": [self.addPerson, self.addGroup, self.addEvent, self.addMessages],
                "save": self.saveDb,
                "load": self.loadDb,
                "quit": self.quit,
                "exit": self.quit,
                "group": self.groupPeople,
                "packages": self.assignPackage,
                "edit": [self.editPerson, self.editGroup, self.editEvent, self.editMessages],
                "list": [self.showDbPerson, self.showDbGroup, self.showDbEvent, self.showDbMessages],
                "table": [self.showTablePerson, self.showTableGroup, self.showTableEvent, self.showTableMessages],
                "Person": self.changeToPerson,
                "Group": self.changeToGroup,
                "Event": self.changeToEvent,
                "Messages": self.changeToMessages,
                "del": [self.deletePerson, self.deleteGroup, self.deleteEvent, self.deleteMessages]}
        self.commandsHelp = ["help\t: show help for commands",
                "Event, Group, Person, Messages\t: switch bettween modes",
                "\tadd\t: add mode in database",
                "\tdel\t: delete mode from database",
                "\tedit\t: edit mode in database",
                "\tlist\t: print mode in database",
                "\ttable\t: print mode database table",
                "packages\t: packages assign"
                "group\t: group people",
                "save\t: save changes in database",
                "load\t: load database",
                "quit\t: quit shell",
                "exit\t: quit shell"]

    def go(self):
        while self.status == 1:
            inputText = input("command(" + self.db.dbName + "/" + str(self.modeName()) + ")> ").strip()
            resArray = {}
            for i in self.commands:
                res = re.search("^" + inputText + ".*", i)
                resArray[i] = res

            candidate = []
            for i in resArray:
                if resArray[i] != None:
                    candidate.append(i)

            if len(candidate) == 1:
                if type(self.commands[candidate[0]]) == list:
                    self.commands[candidate[0]][int(self.mode)]()
                else:
                    self.commands[candidate[0]]()
            elif len(candidate) > 1 and not(not inputText):
                print("do you mean:")
                for can in candidate:
                    print("\t", can)
            elif not(not inputText):
                print("use h/help for help.")

    def modeName(self):
        if self.mode == 0:
            return "Person"
        if self.mode == 1:
            return "Group"
        if self.mode == 2:
            return "Event"
        if self.mode == 3:
            return "Messages"

    def getDbName(self):
        name = input("\tEnter name of DB(leave blank for `" + self.db.dbName + "`): ")
        if not name:
            name = self.db.dbName
        return name

    def saveDb(self):
        name = self.getDbName()
        self.db.save(name)

    def loadDb(self):
        name = self.getDbName()
        self.db.load(name)

    def helpMe(self):
        print("    help:")
        for command in self.commandsHelp:
            print("\t", command)

    def changeToPerson(self):
        self.mode = 0

    def changeToGroup(self):
        self.mode = 1

    def changeToEvent(self):
        self.mode = 2

    def changeToMessages(self):
        self.mode = 3

    def checkBox(self, text):
        while True:
            check = input(text)
            try:
                check = int(check)
                if check == 0:
                    return False
                if check == 1:
                    return True
            except ValueError:
                if check == "":
                    return False

    def assignPackage(self):
        self.showTablePackages()
        mes = self.db.messagesDb.db
        mode = self.mode
        self.mode = 3
        pIndex = self.getNumber(mes, "choose package")
        if pIndex != None:
            while True:
                self.showTableGroup()
                groups = self.db.groupDb.db
                self.mode = 1
                gIndex = self.getNumber(groups, "choose group")
                if gIndex != None:
                    mes[pIndex].groups.append(groups[gIndex].name)
                yes = input("\t  More groups? Y/n: ")
                if yes.lower() == 'y' or yes.lower() == 'yes' or yes == "":
                    pass
                elif yes.lower() == 'n' or yes.lower() == 'no':
                    break
        self.mode = mode


    def addAtributes(self, event, edit = False):
        print("\t\tAtributes for "+event.name)
        while True:
            if edit is False or (event.name in self.db.groupDb.db[edit].eventsAtr) is False:
                facebook = self.checkBox("\t\t  send by Facebook:\t")
                sms = self.checkBox("\t\t  send by sms:\t\t")
                mail = self.checkBox("\t\t  send by e-mail:\t")
                show = self.checkBox("\t\t  show message:\t\t")
            else:
                oldAtr = self.db.groupDb.db[edit].eventsAtr[event.name]
                facebook = self.checkBox("\t\t  send by Facebook("+str(int(oldAtr.facebook))+"):\t")
                sms = self.checkBox("\t\t  send by sms("+str(int(oldAtr.sms))+"):\t")
                mail = self.checkBox("\t\t  send by e-mail("+str(int(oldAtr.mail))+"):\t")
                show = self.checkBox("\t\t  show message("+str(int(oldAtr.show))+"):\t")

            if facebook == True or sms == True or mail == True or show == True:
                break
            print("Choose atleast one atribute.")
        return Atribute(event, facebook, sms, mail, show)

    def addEvent(self, edit = False):
        if edit is False:
            name = input("\teventName: ")
            shortcut = input("\teventShortcut: ")
        else:
            oldEvent = self.db.eventDb.db[edit]
            name = input("\teventName("+oldEvent.name+"): ")
            shortcut = input("\teventShortcut("+oldEvent.shortcut+"): ")

        newEvent = Event(name, shortcut)

        if edit is False:
            self.db.eventDb.add(newEvent)
            for person in self.db.personDb.db:
                person.date[newEvent.name] = ""
        else:
            for person in self.db.personDb.db:
                tmp = person.__dict__
                change = tmp["date"][oldEvent.name]
                del tmp["date"][oldEvent.name]
                tmp["date"][newEvent.name] = change

            for group in self.db.groupDb.db:
                for atr in group.eventsAtr:
                    if group.eventsAtr[atr].event.name == oldEvent.name:
                        group.eventsAtr[atr].event = newEvent

            self.db.eventDb.edit(edit, newEvent)

    def addGroup(self, edit = False):
        if edit is False:
            name = input("    groupName: ")
        else:    
            name = input("    groupName("+self.db.groupDb.db[edit].name+"): ")

        print("\t#use 1: yes 0: no")
        print("\tAssign atributes to")
        eventsAtr = {}
        while True:
            check =False
            for event in self.db.eventDb.db:
                check = self.checkBox("\t  "+event.name+": ")
                if check == True:
                    eventAtr = self.addAtributes(event, edit)
                    eventsAtr[event.name] = eventAtr
                    atleastOne = True

            if atleastOne == True:
                break
            print("Choose atleast one. Atributes can't be assigned to nothing.")

        newGroup = Group(name, eventsAtr)
        if edit is False:
            self.db.groupDb.add(newGroup)
        else:
            group = self.db.groupDb.db[edit]
            for person in self.db.personDb.db:
                if (group.name in person.group) is True:
                    person.group.pop(person.group.index(group.name))
                    person.group.append(newGroup.name)

            self.db.groupDb.edit(edit, newGroup)

    def addMessages(self, edit = False):
        if edit is False:
            name = input("\tName of the package:\t")
        else:
            oldMessages = self.db.messagesDb.db[edit]
            name = input("\tName of the package("+oldMessages.name+"):\t")

        print("\t  **Use slots as <firstName> or <secondName> for better message")
        mList = []
        x = -1
        while True:
            x += 1
            if edit is False:
                message = input("\t\tmessage("+str(x)+"):\t")
            else:
                message = input("\t\tmessage("+str(x)+")("+oldMessages.mList[0]+"):\t")
            mList.append(message)

            yes = input("\t  More messages? Y/n: ")
            if yes.lower() == 'y' or yes.lower() == 'yes' or yes == "":
                pass
            elif yes.lower() == 'n' or yes.lower() == 'no':
                break

        newMessages = Messages(name,mList)
        if edit is False:
            self.db.messagesDb.add(newMessages)
        else:
            self.db.messagesDb.edit(edit, newMessages)

    def addPerson(self, edit = False):
        print("    add")
        if edit is False:
            firstName = input("\tfirstName: ")
            secondName = input("\tsecondName: ")
        else:
            oldPerson = self.db.personDb.db[edit]
            firstName = input("\tfirstName("+oldPerson.firstName+"): ")
            secondName = input("\tsecondName("+oldPerson.secondName+"): ")

        if edit is False:
            print("\t**Message slots will help you making better messages")
            dictPrint = ("\tSlots: <firstName> = "+firstName+", <secondName> = "+secondName)
            mSlots = {}
            while True:
                print(dictPrint)
                yes = input("\tMore slots? Y/n: ")
                if yes.lower() == 'y' or yes.lower() == 'yes' or yes == "":
                    pass
                elif yes.lower() == 'n' or yes.lower() == 'no':
                    break
                slotName = "<"+str(input("\tmessageSlotName: "))+">"
                slot = str(input("\tContent of "+slotName+": "))
                mSlots[slotName] = slot
                dictPrint += ", "+slotName+" = "+slot


        dates = {}
        for event in self.db.eventDb.db:
            while True:
                try:
                    if edit is False:
                        date = input("\t"+event.name+" YYYY-MM-DD: ")
                    else:
                        date = input("\t"+event.name+" YYYY-MM-DD("+str(oldPerson.date[event.name])+"): ")
                    if str(date) == "NaT":
                        date = ""
                    break    
                except ValueError:
                    pass
            dates[event.name] = date

        while True:
            if edit is False:
                mail = input("\tmail: ")
            else:
                mail = input("\tmail("+oldPerson.mail+"): ")
            if re.search(r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$", mail) != None:
                break

        while True:
            if edit is False:
                telNumber = input("\ttelNumber: ")
            else:
                telNumber = input("\ttelNumber("+str(oldPerson.telNumber)+"): ")
            if re.search(r"^((\+\d{3}\ )|\d)?\d{3}\ ?\d{3}\ ?\d{3}$",telNumber) != None:
                break

        if edit is False:
            facebook = input("\tfacebook: ")
        else:
            facebook = input("\tfacebook("+oldPerson.facebook+"): ")

        newPerson = Person(firstName, secondName, dates, mail, telNumber, facebook, mSlots)

        if edit is False:
            self.db.personDb.add(newPerson)
        else:
            self.db.personDb.edit(edit, newPerson)

    def getNumber(self, db, reason):
        number = None
        while number == None or number < -1 or number >= len(db):
            try:
                number = int(input("Insert id to "+reason+"(insert -1 to cancel): "))
            except ValueError:
                number = None
        while True and number != -1:
            if self.mode == 0:
                yes = input("Do you want to "+reason+"(" + db[number].firstName + " " + db[number].secondName +")? Y/n: ")
            if self.mode == 1 or self.mode == 2 or self.mode == 3:
                yes = input("Do you want to "+reason+"(" + db[number].name + ")? Y/n: ")
            if yes.lower() == 'y' or yes.lower() == 'yes' or yes == "":
                return number
            elif yes.lower() == 'n' or yes.lower() == 'no':
                break
        return None

    def groupPeople(self):
        groups = self.db.groupDb.db
        people = self.db.personDb.db
        cycle = True
        pList = []
        self.showTableGroup()
        self.mode = 1
        gIndex = self.getNumber(groups, "choose group")
        self.mode = 0
        if gIndex != None:
            while cycle is True:
                self.showTablePerson()
                pIndex = self.getNumber(people, "assign person")
                if (pIndex in pList) is False:
                    if pIndex != None:
                        pList.append(pIndex)
                else:
                    print("This person is already choosen.")

                while True:    
                    yes = input("Do you wish to choose another person? Y/n: ")
                    if yes.lower() == 'y' or yes.lower() == 'yes' or yes == "":
                        break
                    elif yes.lower() == 'n' or yes.lower() == 'no':
                        cycle = False
                        break
            for pIndex in pList:
                people[int(pIndex)].group=[]
                people[int(pIndex)].group.append(groups[gIndex].name)

    def editMessages(self):
        self.showTablePackages()
        number = self.getNumber(self.db.messagesDb.db, "edit")
        if number != None:
            self.addMessages(number)

    def editEvent(self):
        self.showTableEvent()
        number = self.getNumber(self.db.eventDb.db, "edit")
        if number != None:
            self.addEvent(number)

    def editGroup(self):
        self.showTableGroup()
        number = self.getNumber(self.db.groupDb.db, "edit")
        if number != None:
            self.addGroup(number)

    def editPerson(self):
        self.showTablePerson()
        number = self.getNumber(self.db.personDb.db, "edit")
        if number != None:
            self.addPerson(number)

    def deleteMessages(self):
        self.showTableMessages()
        number = self.getNumber(self.db.messagesDb.db, "delete")
        if number != None:
            self.removeMessages(number)

    def deleteEvent(self):
        self.showTableEvent()
        number = self.getNumber(self.db.eventDb.db, "delete")
        if number != None:
            oldEvent = self.db.eventDb.db[number]
            for person in self.db.personDb.db:
                tmp = person.__dict__
                del tmp["date"][oldEvent.name]

            for group in self.db.groupDb.db:
                for atr in group.eventsAtr:
                    if group.eventsAtr[atr].event.name == oldEvent.name:
                        del group.eventsAtr[atr]
                        break
                if len(group.eventsAtr) == 0:
                    print("Group("+group.name+") has been removed for having no atributes!")
                    self.removeGroup(self.db.groupDb.db.index(group))
            self.db.eventDb.remove(number)

    def removeGroup(self, number):
        group = self.db.groupDb.db[number]
        for person in self.db.personDb.db:
            if (group.name in person.group) is True:
                person.group.pop(person.group.index(group.name))
        self.db.groupDb.remove(number)

    def deleteGroup(self):
        self.showTableGroup()
        number = self.getNumber(self.db.groupDb.db, "delete")
        if number != None:
            self.removeGroup(number)

    def deletePerson(self):
        self.showTablePerson()
        number = self.getNumber(self.db.personDb.db, "delete")
        if number != None:
            self.db.personDb.remove(number)

    def showDbMessages(self):
        for package in self.db.messagesDb.db:
            print(package)

    def showDbEvent(self):
        for event in self.db.eventDb.db:
            print(event)

    def showDbGroup(self):
        for group in self.db.groupDb.db:
            print(group)

    def showDbPerson(self):
        for person in self.db.personDb.db:
            print(person)

    def quit(self):
        self.status = 0

    def showTablePackages(self):
        head = ["Package name",
                "Groups assigned"]

        content = []
        for package in self.db.messagesDb.db:
            dicti = {}
            dicti["name"] = package.name
            dicti["groups"] = package.groups
            content.append(dicti)

        self.showTable(head, content, ["name", "groups"])

    def showTableMessages(self):
        self.showTablePackages()
        index = self.getNumber(self.db.messagesDb.db, "choose package")
        if index != None:
            package = self.db.messagesDb.db[index]
            head = ["Messages from '"+package.name+"' package"]

            content = []
            for message in package.mList:
                dicti  = {}
                dicti["mList"] = message
                content.append(dicti)

            self.showTable(head, content, ["mList"])    

    def showTableEvent(self):
        head = Event.order

        content = []
        for event in self.db.eventDb.db:
            content.append(event.__dict__)

        self.showTable(head, content, Event.order)

    def showTableGroup(self):
        head = Group.order

        content = []
        for group in (self.db.groupDb.db):
            content.append(group.convert())

        self.showTable(head, content, Group.order)

    def showTablePerson(self):
        head = Person.order

        order = Person.order[:]
        for event in self.db.eventDb.db:
            order.append(event.name)
            head.append(event.name)
        order.append("group")
        head.append("group")

        content = []
        for person in self.db.personDb.db:
            content.append(person.convert())

        self.showTable(head, content, order)

    def showTable(self, head, content, order):
        spaceExtra = 2
        largestStr = {}
        length = []
        for x in head:
            largestStr[x] = len(x)
            length.append(1+len(x))

        for tmp in content:
            for i in range(len(order)):
                if largestStr[head[i]] < len(str(tmp[order[i]])):
                    largestStr[head[i]] = len(str(tmp[order[i]]))

        headStr = " ID\t"
        for i in range(len(head)-1):
            tabSize = (largestStr[head[i]]+1+spaceExtra-length[i])
            headStr += "|"+head[i]+(" "*tabSize)
        headStr += "|"+head[-1]
        print(headStr)

        print(" "+"-"*8*17)

        for count, tmp in enumerate(content):
            raw =" ["+str(count)+"]\t|"
            for i in range(len(order)-1):
                raw += str(tmp[order[i]])+" "*(largestStr[head[i]]+spaceExtra-len(str(tmp[order[i]])))+"|"
            raw += str(tmp[order[-1]])
            print(raw)