<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_user(self, username, email, directoryId=1, password=None, fullname=None, notify=False, active=True, ignore_existing=False, application_keys=None, ):
 """Create a new JIRA user. :param username: the username of the new user :type username: str :param email: email address of the new user :type email: str :param directoryId: The directory ID the new user should be a part of (Default: 1) :type directoryId: int :param password: Optional, the password for the new user :type password: Optional[str] :param fullname: Optional, the full name of the new user :type fullname: Optional[str] :param notify: Whether or not to send a notification to the new user. (Default: False) :type notify: bool :param active: Whether or not to make the new user active upon creation. (Default: True) :type active: bool :param ignore_existing: Whether or not to ignore and existing user. (Default: False) :type ignore_existing: bool :param applicationKeys: Keys of products user should have access to :type applicationKeys: Optional[list] :return: Whether or not the user creation was successful. :rtype: bool :raises JIRAError: If username already exists and `ignore_existing` has not been set to `True`. """

        if not fullname:
            fullname = username
        # TODO(ssbarnea): default the directoryID to the first directory in jira instead
        # of 1 which is the internal one.
        url = self._options['server'] + '/rest/api/latest/user'

        # implementation based on
        # https://docs.atlassian.com/jira/REST/ondemand/#d2e5173
        x = OrderedDict()

        x['displayName'] = fullname
        x['emailAddress'] = email
        x['name'] = username
        if password:
            x['password'] = password
        if notify:
            x['notification'] = 'True'
        if application_keys is not None:
            x['applicationKeys'] = application_keys

        payload = json.dumps(x)
        try:
            self._session.post(url, data=payload)
        except JIRAError as e:
            err = e.response.json()['errors']
            if 'username' in err and err['username'] == 'A user with that username already exists.' and ignore_existing:
                return True
            raise e
        return True