Example #1
0
class AddressBook(object):
    """
    Address Book containing people, groups and members
    It offers APIs for storing, retreiving and searching people and groups
    """
    def __init__(self):
        self._people = People()
        self._groups = Groups()
        self._members = Members(self._people, self._groups)

    def addPerson(self, firstName, lastName, emailAddresses, phoneNumbers):
        """
        Add person to phone book
        :param firstName: First name of the person
        :param lastName: Last name of the person
        :param emailAddresses: List of email addresses
        :param phoneNumbers: List of phone numbers
        :return: A dictionary of person
        :exception If the person with same first name and last name already exists
        :exception If the email and phone number is not a list
        """
        return self._people.addPerson(firstName, lastName, emailAddresses,
                                      phoneNumbers)

    def addGroup(self, name):
        """
        Add group to address book
        :param name: Name of the group
        :return: Name of the group
        :exception: if the group already exists
        """
        return self._groups.addGroup(name)

    def addMember(self, groupName, personFirstName, personLastName):
        """
        Add a person to group
        :param groupName: Group name
        :param personFirstName: First name of person
        :param personLastName: Last name of person
        :return: True if saved, Flase otherwise
        """
        return self._members.addMember(groupName, personFirstName,
                                       personLastName)

    def getGroupMembers(self, groupName):
        """
        Get the list of group members
        :param groupName: Name of the group
        :return: None if invalid group, else list of people in the group
        """
        group = self._groups.getGroup(groupName)
        if group:
            peopleKeys = self._members.findPeople(group)
            people = [self._people.findPerson(person) for person in peopleKeys]
            return people
        return None

    def getGroups(self, firstName, lastName):
        """
        Get the list of groups
        :param firstName: First name of the person
        :param lastName: Last name of the person
        :return: List of group names else None if person does not exist
        """
        person = self._people.findPerson(firstName + lastName)
        if person:
            group = self._members.findGroups(person['firstName'] +
                                             person['lastName'])
            return group
        return None

    def findPersonByName(self, **kwargs):
        """
        Find the person by name
        :param kwargs: firstName, lastName or both
        :return: list of people found
        """
        return self._people.findPeople(**kwargs)

    def findPersonByEmail(self, emailAddress):
        """
        Find the person by email
        :param emailAddress: Email address
        :return: List of people with the given email address
        """
        firstNameLastNameList = self._people.findByEmail(emailAddress)
        return [self._people.findPerson(p) for p in firstNameLastNameList]