Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

using python 3: here is my code. i ALWAYS RATE MY ANSWER. tHANKS [[[[[[[[[[[[[[[

ID: 3829739 • Letter: U

Question

using python 3: here is my code. i ALWAYS RATE MY ANSWER. tHANKS

[[[[[[[[[[[[[[[[[[[[[

;here my 3 different codes:

prog12.py


def isValidPhone(tPhone):
   """

description: check if phone is valid
precondition: the function takes a parameter
"""
   validity = False
   # check if '(###)###-####'
   if len(tPhone)==13 and tPhone[0]=='(' and tPhone[4]==')' and tPhone[8]=='-':
       if tPhone[1:4].isdigit() and tPhone[5:8].isdigit() and tPhone[9:].isdigit():
           validity = True
    #check if '###-###-####'
   elif len(tPhone)==12 and tPhone[3]==tPhone[7]=='-':
       if tPhone[:3].isdigit() and tPhone[4:7].isdigit() and tPhone[8:].isdigit():
           validity = True
   return validity


class Text:
   def __init__(self, tmpPhoneStr, tmpArrivaleDate, tmpMsgTxt):
       """

description: The function check the phone arrivaldate and msgtxt
precondition: Itthe function takes 4 parameters

"""
       self._phoneNum = tmpPhoneStr
       self._date = tmpArrivaleDate
       self._msg = tmpMsgTxt
       self.setRead(False)

   def setRead(self, tmpIfRead):
      """
    
      precondition: the function takes a parameter

       """
      self.isRead = tmpIfRead
    
   def toList(self):
      """

description: the function return phone number, date and message
precondition: the function takes a parameter

"""
      return [self.getPhone(), self.getDate(), self.getMsg()]

   def getPhone(self):
      """

description: the function call the phone number

precondition:the function takes a parameter
"""
      return self._phoneNum

   def getDate(self):
      """

      description: the function call the date
      precondition: the function takes a parameter
      """
      return self._date

   def getMsg(self):
      """

description: the fuction get the message entered.

precondition:the function takes a parameter
"""
      return self._msg

   def isUnread(self):
      """

description: the function call the unread message
precondition: the function takes a parameter

"""
      return self._isRead

   def readMsg(self):
      """

description: the function call the read message
precondition: the function takes a parameter
"""
      self.setRead(True)
      return self._msg


def printMenu(tMessages):
   """

description: this function print the menu
precondition: the function takes a parameter
"""
   print(" MENU ")
   ct = 0
   for oneMessage in tMessages:
        ct += 1
        print(str(ct) + '. ' + oneMessage)
    
def isValidDate(string):
   """

description: Define a function myFormat which
accepts 3 parameters (a number, totalWidth, and numberDigitsRightOfDecimal).

precondition: the function takes a parameter
"""
   if len(string)==10 and string[2]==string[5]=="/" and string[:2].isdigit() and int(string[:2])<=12
    and string[3:5].isdigit() and int(string[3:5])<=31 and string[6:].isdigit() and int(string[6:])>0:
        return True
   else:
      return False

MENU_OPTIONS = ("Add New Message", "Count of messages", "Print Inbox",
                "Print individual message", "Retrieve list of unread messages",
                "Retrieve all messages from a particular phone number",
                "Retrieve all messages arrived after a date/time",
                "Delete individual message", "Delete all messages from a particular sender",
                "Delete all messages older than # of days", "Clear Inbox", "Quit")

MODESMS_INBOX:


from datetime import datetime, timedelta
from program12 import*
class SMS_Inbox:
   def __init__(self):
      """description: creates an empty inbox
         preconditions: none
      """
      self._messages=[]

   def printOneMessage(self, pos):
      """

      description: the function print the messages
      precondition: the function takes 2 parameters

      """
      print(self._messages[pos])

   def addNewArrival(self, tmpPhoneStr, tmpArrivalDate, tmpMsgStr):
      """

      description: adds a new message to the inbox (where the info for the message is
                   collected into a tuple with (boolean, ph, dt, msg)

      precondition: the function takes 4 parametersaccepts 3 parameters tmpPhoneStr is a string
                         tmpArrivalDate is an object of type datetime
                         tmpMsgStr is any string of characters
      """
       # returns True if successfully put inbox
       # check if valid phone number
      if isValidPhone(tmpPhoneStr) and len(tmpMsgStr)<=140:
           self._messages.append((False, tmpPhoneStr, tmpArrivalDate, tmpMsgStr) )
           return True
      else:
           return False

   def countMessages(self):
      """

      description: the function counts the number of messages
      precondition: None

      """
       # returns num messages in inbox
      return len(self._messages)

   def deleteMsg(self, pos):
      """
      description: removes a message from the inbox at that position
      precondition: tIndex is positive integer or zero
      """
      deleted = -1
       # returns 1 if message is deleted, or -1 if not
      if pos < len(self._messages)and pos >=0:
           self._messages.pop(int(pos))
           deleted = 1
      return deleted

   def deleteMsgsFromSender(self, tmpPhoneStr):
      """

      description: the function deletes all the message from
      that phone number
      precondition: tmpPhoneStr is a string

      """
       # returns number of messages deleted
      tmpNewInbox= []
      ct =0
      #countDeleted = len(self.getInbox())
      for text in self._messages:
           if text[1] == tmpPhoneStr:
               ct +=1
           else:
           #if text.getPhone() != tmpPhoneStr:
               tmpNewInbox.append(text)
               #countDeleted -= 1
      self._messages = tmpNewInbox
      return ct
   def deleteOlderMsgs(self, numDays):
      tmpNewInbox= []
      ct=0
      d1 = datetime.today()
      for text in self._messages:
         d2 = d1-text[2]
         d2 = d2.days
         if d2 <=numDays:
            tmpNewInbox.append(text)
         else:
            ct += 1
      self._messages = tmpNewInbox
      return ct

      """
    
      tmpNewInbox = []
      d1 = datetime.today()
      countDeleted = len(self.getInbox())
      #if (date.today() - text.getDate()).days >= numDays:
       # check that the number of days is valid
      if numDays < 0:
           return -1
      for text in self.getInbox():
         #d2 = timedelta(days)
         d2 = text.getDate()
         if (d1 - d2).days >= numDays:
           #(date.today() - text.getDate()) >= numDays:
               tmpNewInbox.append(tup)
               countDeleted -= 1
               self._messages = tmpNewInbox
         return countDeleted
     
      tmpNewInbox= []
      d1= datetime.today()
      countDeleted = len(self._messages)
      if numDays < 0:
           return -1
      for text in self._messages:
          totnumbDays = d1 - text[2]#timedelta object
          totnumbDays = totnumbDays.days
          if totnumbDays >= numDays:
             tmpNewInbox.append(text)
             countDeleted -=1# deleted
             self._messages = tmpNewInbox
          return countDeleted
          """
    
   def retrieveUnread(self):
      tmpNewInbox = []
      for text in self._messages:
         if text[0]== False:
            tmpNewInbox.append(text)
            text[0]= True
      return tmpNewInbox

   def retrieveMsgFromPhone(self, tmpPhoneStr):
      """

      description:
      precondition: the function takes 2 parameters
      """
        # returns list of phoneNumber lists
        # check that phoneNumber is valid
      if not isValidPhone(tmpPhoneStr):
            return []
       # otherwise get list of messages by phone numbers
      tmpInbox = []
      ct = 0
      for text in self._messages:
            print(text)
            if text[1] == [tmpPhoneStr]:
                # change text to read
                text = (True,text[1],text[2],text[3])
                self._messages[ct]= text
                tmpInbox.append(text)
      return tmpInbox

   def retrieveMsgsAfterDate(self, tmpDate):
      """

      description: the function retrieve a list of msgs after date
      precondition: the function takes 2 parameters
      """
       # return list of phoneNumber Lists
      tmpInbox = []
      ct = 0
       # check that the number of days is valid
      for text in self._messages:
         print(text)
         if text[2] > tmpDate:
            text = (True,text[1],text[2],text[3])
            self._messages[ct]= text
            tmpInbox.append(text)
      return tmpInbox

   def clearInbox(self):
       self._messages=[]
       return self._messages#return read to true

   #def getInbox(self):
      #"""
      #description: the list that contain subtuples holding infos for one message
      #precondition:
      #"""
      #return self._messages

   def __str__(self):
        tmpStr="{:20s}{:20s}{:12s}{:<140s}".format("SenderPhone", "Date/Time Recieved", "Read?", "Message")
        for text in self._messages:
            if text[0] == True:
            #if text.isUnread:
               read = "yes"
            else:
               read = "no"
            tmpStr+=" {!s:20s}{!s:20s}{!s:12s}{!s:<140s}".format(text[1],
            text[2].strftime('%m/%d/%Y'), read,text[3])
        return tmpStr
    


P12TEST:WHERE YOU SHOULD RUN THE CODE

from modsms_inbox import *
from datetime import *
myInbox = SMS_Inbox( )
print("***Empty inbox -- count is ", myInbox.countMessages())
print("***Inbox empty: ",myInbox)
result = myInbox.deleteMsg(5)
print("***Delete from Empty Inbox: FALSE ",result)

numDeleted = myInbox.deleteMsgsFromSender("111-222-3333")
if numDeleted == 0: print("no messages from 111-222-3333")


numDeleted = myInbox.deleteOlderMsgs(5)
if numDeleted == 0: print("***no older msgs deleted")
else: print("***Number msgs deleted: ", numDeleted)

listUnread = myInbox.retrieveUnread( )
print("***List of unread msgs: EMPTY", listUnread)

listUnread = myInbox.retrieveMsgsAfterDate(datetime(2017,1,1) )
print("***List of unread msgs: EMPTY", listUnread)

listUnread = myInbox.retrieveMsgFromPhone("111-111-1111" )
print("***List of unread msgs: EMPTY", listUnread)


print(" ***Adding 4 messages to inbox")
myInbox.addNewArrival("111-111-1111",datetime(2017,2,1), "Hi on Feb 1 2017")
myInbox.addNewArrival("222-222-2222",datetime(2017,4,1), "Hello on Apr 1 2017")
myInbox.addNewArrival("111-111-1111",datetime(2017,4,6), "Bye on Apr 6 2017")
myInbox.addNewArrival("222-222-2222",datetime(2017,4,18), "Hello on Apr 18 2017")


print(" ***Count of msgs should be 4: ",myInbox.countMessages() )

print(" ***Inbox after adding 4: ",myInbox)

listFrom2 = myInbox.retrieveMsgFromPhone("222-222-2222")
print(" ***Messages from 222-222-2222: Hello on Apr 1 2017, Apr 18 2017 ")
print("***Inbox should show True for msgs from 222-222-2222 ",myInbox)


print(" ***print one message -- #2 -- Bye on Apr 6 2017")
tmp = myInbox.printOneMessage(2); print(tmp)

print(" ***Retrieving msgs after April 2,2017 -- should be 2 of those")
listAfter = myInbox.retrieveMsgsAfterDate(datetime(2017,4,2))
print(" ***listAfterApr2 should be Apr6 and Apr 18: ",listAfter)
print(" ***Inbox all True except Feb 1 2017 ", myInbox)

print(" ***Deleting message 1 -- Hello from April 1 2017 GONE")
myInbox.deleteMsg(1)
print(myInbox)

print(" ***Deleting msgs from 111-111-1111: ")
myInbox.deleteMsgsFromSender("111-111-1111")
print("***ONLY ONE msg left ", myInbox)

print(" ***Adding 3 msgs, then deleting older")
myInbox.addNewArrival("111-111-1111",datetime(2015,2,1), "Hi on Feb 1 2017")
myInbox.addNewArrival("222-222-2222",datetime(2015,4,1), "Hello on Apr 1 2017")
myInbox.addNewArrival("111-111-1111",datetime(2015,4,6), "Bye on Apr 18 2017")
numDeleted = myInbox.deleteOlderMsgs(2)
print(" ***Number deleted should be 3: ",numDeleted)
print("***Only Hello on April 18 2017 should be left ",myInbox)

myInbox.clearInbox()
print(" ***Inbox cleared: ",myInbox)

;;WHEN I RUN THE CODE FROM THE P12 TEST, HERE IS MY OUTPUT: THE PROBLEM HERE IS THAT I SHOULD GET YES ON 222-222-2222

Inbox all True except Feb 1 2017: THIS PART HAS TO BE FIXED TOO

AND ***Number deleted should be 3: 5. SHOULD BE 3 INSTEAD OF 5

Python 3.4.3 (default, Nov 17 2016, 01:08:31)
[GCC 4.8.4] on linux
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
***Empty inbox -- count is 0
***Inbox empty: SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
***Delete from Empty Inbox: FALSE -1
no messages from 111-222-3333
***no older msgs deleted
***List of unread msgs: EMPTY []
***List of unread msgs: EMPTY []
***List of unread msgs: EMPTY []


***Adding 4 messages to inbox

***Count of msgs should be 4: 4

***Inbox after adding 4:
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
111-111-1111        02/01/2017          no          Hi on Feb 1 2017                                                                                                                          
222-222-2222        04/01/2017          no          Hello on Apr 1 2017                                                                                                                       
111-111-1111        04/06/2017          no          Bye on Apr 6 2017                                                                                                                         
222-222-2222        04/18/2017          no          Hello on Apr 18 2017                                                                                                                      
(False, '111-111-1111', datetime.datetime(2017, 2, 1, 0, 0), 'Hi on Feb 1 2017')
(False, '222-222-2222', datetime.datetime(2017, 4, 1, 0, 0), 'Hello on Apr 1 2017')
(False, '111-111-1111', datetime.datetime(2017, 4, 6, 0, 0), 'Bye on Apr 6 2017')
(False, '222-222-2222', datetime.datetime(2017, 4, 18, 0, 0), 'Hello on Apr 18 2017')

***Messages from 222-222-2222: Hello on Apr 1 2017, Apr 18 2017
***Inbox should show True for msgs from 222-222-2222
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
111-111-1111        02/01/2017          no          Hi on Feb 1 2017                                                                                                                          
222-222-2222        04/01/2017          no          Hello on Apr 1 2017                                                                                                                       
111-111-1111        04/06/2017          no          Bye on Apr 6 2017                                                                                                                         
222-222-2222        04/18/2017          no          Hello on Apr 18 2017                                                                                                                      

***print one message -- #2 -- Bye on Apr 6 2017
(False, '111-111-1111', datetime.datetime(2017, 4, 6, 0, 0), 'Bye on Apr 6 2017')
None

***Retrieving msgs after April 2,2017 -- should be 2 of those
(False, '111-111-1111', datetime.datetime(2017, 2, 1, 0, 0), 'Hi on Feb 1 2017')
(False, '222-222-2222', datetime.datetime(2017, 4, 1, 0, 0), 'Hello on Apr 1 2017')
(False, '111-111-1111', datetime.datetime(2017, 4, 6, 0, 0), 'Bye on Apr 6 2017')
(False, '222-222-2222', datetime.datetime(2017, 4, 18, 0, 0), 'Hello on Apr 18 2017')

***listAfterApr2 should be Apr6 and Apr 18:
[(True, '111-111-1111', datetime.datetime(2017, 4, 6, 0, 0), 'Bye on Apr 6 2017'), (True, '222-222-2222', datetime.datetime(2017, 4, 18, 0, 0), 'Hello on Apr 18 2017')]

***Inbox all True except Feb 1 2017
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
222-222-2222        04/18/2017          yes         Hello on Apr 18 2017                                                                                                                      
222-222-2222        04/01/2017          no          Hello on Apr 1 2017                                                                                                                       
111-111-1111        04/06/2017          no          Bye on Apr 6 2017                                                                                                                         
222-222-2222        04/18/2017          no          Hello on Apr 18 2017                                                                                                                      

***Deleting message 1 -- Hello from April 1 2017 GONE
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
222-222-2222        04/18/2017          yes         Hello on Apr 18 2017                                                                                                                      
111-111-1111        04/06/2017          no          Bye on Apr 6 2017                                                                                                                         
222-222-2222        04/18/2017          no          Hello on Apr 18 2017                                                                                                                      

***Deleting msgs from 111-111-1111:
***ONLY ONE msg left
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
222-222-2222        04/18/2017          yes         Hello on Apr 18 2017                                                                                                                      
222-222-2222        04/18/2017          no          Hello on Apr 18 2017                                                                                                                      

***Adding 3 msgs, then deleting older

***Number deleted should be 3: 5
***Only Hello on April 18 2017 should be left
SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   

***Inbox cleared: SenderPhone         Date/Time Recieved Read?       Message                                                                                                                                   
>>>

;;;;;;;;;;;;;;

Program 10 Creating and Using a Class Part 2 (20 pts) Use the UML diagram shown to create the class The private data should be a LIST of tuples. Each list will contain the information about a single text message For each text message, the following information should be included in the tuple o has BeenRead: Boolen o sender Phone: String o alTime datetime o msg Text: String The names of the class and the methods must be EXACTLY as specified! Your customer's programs DEPEND on this! Each method must have a signature that follows the specifications in the UML EXACTLY. For example, if the UML indicates a method has 1 integer parameter and 1 string parameter, your method must have EXACTLY that number and type of parameters Class SMS Inbox inbox List NOTE: the list will contain subtuples. Each subtuple holds the information for one message. You are REQUIRED to use the following structure for each sublist (has Been Read, (senderPhone,arrivalTime,msg Text) Example of how the inbox will look if the inbox is printed after 2 messages have been added and one has been read (False, '11 1-222-3333', datetime.datetime (2015, 1, 15, 8, 15) 'meet me at MSUM')], (True, '111-345-3678', datetime.datetime(2015, 10, 15, 7, 20), 'back at noon) constructor SMS Inbox str String prints the entire inbox printOneMessage(index integer): String +addNewArrival (senderPhone String, arriveTime datetime msg Text String

Explanation / Answer

from datetime import date

def isValidPhone(tPhone):
   validity = False
   # check if '(###)###-####'
   if len(tPhone)==13 and tPhone[0]=='(' and tPhone[4]==')' and tPhone[8]=='-':
       if tPhone[1:4].isdigit() and tPhone[5:8].isdigit() and tPhone[9:].isdigit():
           validity = True
   # check if '###-###-####'
   elif len(tPhone)==12 and tPhone[3]==tPhone[7]=='-':
       if tPhone[:3].isdigit() and tPhone[4:7].isdigit() and tPhone[8:].isdigit():
           validity = True
   return validity


class Text:
   def __init__(self, tmpPhoneStr, tmpArrivaleDate, tmpMsgTxt):
       self._phoneNum = tmpPhoneStr
       self._date = tmpArrivaleDate
       self._msg = tmpMsgTxt
       self.setRead(False)

   def setRead(self, tmpIfRead):
       self._isRead = tmpIfRead
      
   def toList(self):
       return [self.getPhone(), self.getDate(), self.getMsg()]
  
   def getPhone(self):
       return self._phoneNum

   def getDate(self):
       return self._date

   def getMsg(self):
       return self._msg

   def isUnread(self):
        return not self._isRead

   def readMsg(self):
        self.setRead(True)
        return self._msg

  

class SMSInbox:
   def __init__(self):
       self._messages=[]

   def printOneMessage(self, tmpIndex):
       print((self.getInbox()[tmpIndex]).toList())

   def addNewArrival(self, tmpPhoneStr, tmpArrivalDate, tmpMsgStr):
       # returns True if successfully put inbox
       # check if valid phone number
       if isValidPhone(tmpPhoneStr) and len(tmpMsgStr)<=140:
           self._messages.append(Text(tmpPhoneStr, tmpArrivalDate, tmpMsgStr))
           return True
       else:
           return False
  
   def countMessages(self):
       # returns num messages in inbox
       return len(self._messages)
  
   def deleteMsg(self, tIndex):
       deleted = -1
       # returns 1 if message is deleted, or -1 if not
       if tIndex.isdigit() and int(tIndex) < len(self.getInbox()):
           self._messages.pop(int(tIndex))
           deleted = 1
       return deleted

   def deleteAllMsgsFromSender(self, tmpPhoneStr):
       # returns number of messages deleted
       tmpNewInbox= []
       countDeleted = len(self.getInbox())
       for text in self.getInbox():
           if text.getPhone() != tmpPhoneStr:
               tmpNewInbox.append(text)
               countDeleted -= 1
       self._messages = tmpNewInbox
       return countDeleted

   def deleteOlderMsgs(self, numDays):
       # returns number of messages deleted
       tmpNewInbox = []
       countDeleted = len(self.getInbox())
       # check that the number of days is valid
       if numDays < 0:
           return -1
       for text in self.getInbox():
           if (date.today() - text.getDate()).days >= numDays:
               tmpNewInbox.append(text)
               countDeleted -= 1
       self._messages = tmpNewInbox
       return countDeleted
  
   def retrieveUnread(self):
       # returns list of list of phoneNumber List
       tmpNewInbox = []
       for text in self.getInbox():
           if text.isUnread():
                tmpNewInbox.append(text.getMsg())
       return tmpNewInbox
  
   def retrieveMsgFromPhone(self, tmpPhoneStr):
        # returns list of phoneNumber lists
        # check that phoneNumber is valid
       if not isValidPhone(tmpPhoneStr):
            return []
       # otherwise get list of messages by phone numbers
       tmpInbox = []
       for text in self.getInbox():
            if text.getPhone() == tmpPhoneStr:
                # change text to read
                text.readMsg()
                tmpInbox.append(text.toList())
       return tmpInbox
  
   def retrieveMsgsAfterDate(self, tmpDate):
       # return list of phoneNumber Lists
       tmpInbox = []
       # check that the number of days is valid
       for text in self.getInbox():
            if text.getDate() > tmpDate:
                # change text to read
                text.readMsg()
                tmpInbox.append(text.toList())
       return tmpInbox
  
   def clearInbox(self):
       self._messages=[]
  
   def getInbox(self):
       return self._messages

   def __str__(self):
        tmpStr="{:20s}{:20s}{:12s}{:<140s}".format("SenderPhone", "Date/Time Recieved", "Read?", "Message")
        for text in self.getInbox():
            read = "Yes"
            if text.isUnread:
                read = "No"
            tmpStr+=" {:20s}{:20s}{:12s}{:<140s}".format(text.getPhone(),
            text.getDate().strftime('%m/%d/%Y'), read, text.getMsg())
        return tmpStr

def printMenu(tMessages):
    print(" MENU ")
    ct = 0
    for oneMessage in tMessages:
        ct += 1
        print(str(ct) + '. ' + oneMessage)
      
def isValidDate(string):
    if len(string)==10 and string[2]==string[5]=="/" and string[:2].isdigit() and int(string[:2])<=12
    and string[3:5].isdigit() and int(string[3:5])<=31 and string[6:].isdigit() and int(string[6:])>0:
        return True
    return False

MENU_OPTIONS = ("Add New Message", "Count of messages", "Print Inbox",
                "Print individual message", "Retrieve list of unread messages",
                "Retrieve all messages from a particular phone number",
                "Retrieve all messages arrived after a date/time",
                "Delete individual message", "Delete all messages from a particular sender",
                "Delete all messages older than # of days", "Clear Inbox", "Quit")

inbox = SMSInbox()
# temporary
inbox.addNewArrival("123-123-1234", date(2016, 4, 19), "message1")
inbox.addNewArrival("000-000-0000", date(2015, 11, 8), "message2")
inbox.addNewArrival("123-123-1234", date(2015, 11, 9), "message3")
printMenu(MENU_OPTIONS)
choice = input(' Please enter your choice... ')
while choice != str(len(MENU_OPTIONS)):
    if choice == "1":
        # ask for input and then enter new message into inbox
        tmpPhone = input("Please enter a phone number to send the text from: ")
        if not isValidPhone(tmpPhone):
            tmpPhone = input("Bad Input -- Please enter a phone number to send the text from: ")
        tmpDate = input("Please enter a date (MM/DD/YYYY) in which the text was recieved: ")
        if not isValidDate(tmpDate):
            tmpDate = input("Bad Input -- Please enter a date (MM/DD/YYYY) in which the text was recieved: ")
        tmpDate = date(int(tmpDate[6:]), int(tmpDate[:2]), int(tmpDate[3:5]))
        tmpMsg = input("Please enter a message to send")
        inbox.addNewArrival(tmpPhone, tmpDate, tmpMsg)
  
    elif choice == "2":
        # print count of messages
        print(' Count of Messages:', inbox.countMessages()," ")
        input("Please press enter to continue")
      
    elif choice == "3":
        # print all messages
        print(inbox)
      
    elif choice == "4":
        # get individual message
        print(" Please enter an integer for which message you would like to print from 0 up to", end=" ")
        tmpIndex = input(inbox.countMessages()-1)
        if tmpIndex.isdigit():
            tmpIndex = int(tmpIndex)
        while tmpIndex not in range(inbox.countMessages()):
            print(" Error -- 0 up to", end=" ")
            tmpIndex = input(inbox.countMessages()-1)
            if tmpIndex.isdigit():
                 tmpIndex = int(tmpIndex)
        inbox.printOneMessage(tmpIndex)
  
    elif choice == "5":
        # get unread messages from phone
        if (len(inbox.retrieveUnread()) == 0):
            print("No Unread messages")
        else:
            for message in inbox.retrieveUnread():
                print(message)
      
    elif choice == "6":
        # get messages from phone
        tmpPhone = input("Please enter a phone number to see texts: ")
        if not isValidPhone(tmpPhone):
            tmpPhone = input("Bad Input -- Please enter a phone number to send the text from: ")
        print(inbox.retrieveMsgFromPhone(tmpPhone))
      
    elif choice == "7":
        # get all messages after a date
        tmpDate = input("Please enter a date (MM/DD/YYYY) in which the text was recieved: ")
        if not isValidDate(tmpDate):
            tmpDate = input("Bad Input -- Please enter a date (MM/DD/YYYY) in which the text was recieved: ")
        print(tmpDate[:2], tmpDate[3:5],tmpDate[-4:])
        tmpDate= date(int(tmpDate[-4:]),int(tmpDate[:2]),int(tmpDate[3:5]))
        print(inbox.retrieveMsgsAfterDate(tmpDate))
      
    elif choice == "8":
        # delete a message based on index
        print(inbox)
        print(" Please enter the index of the message you would like to delete from 0 to", end=" ")
        tmpIndex = input(inbox.countMessages()-1)
        inbox.deleteMsg(tmpIndex)
      
    elif choice == "9":
        # delete all messages from a sender
        print(inbox)
        tmpPhone = input("Please enter a phone number to delete all messages from: ")
        if not isValidPhone(tmpPhone):
            tmpPhone = input("Bad Input -- Please enter a phone number to delete all messages from: ")
        print(inbox.deleteAllMsgsFromSender(tmpPhone), "messages deleted")
      
  
    elif choice == "10":
        print(inbox)
        tmpDays = input("Please enter the number of days: ")
        if not tmpDays.isdigit():
            tmpDays = input("Bad Input -- Please enter the number of days old: ")
      
        print(inbox.deleteOlderMsgs(int(tmpDays)), "messages deleted")
      
    elif choice == "11":
        inbox.clearInbox()
      
    else:
        print("Bad Input!")
  
    printMenu(MENU_OPTIONS)
    choice = input(' Please enter your choice: ')