def __saveNewItem(self, item, srcAbsPath=None, dstRelPath=None):
        #We do not need any info, that can be in item.data_ref object at this point.
        #But if it is not None, it may break the creation of tags/fields.
        #Don't worry, item.data_ref will be assigned a new DataRef instance later (if required).
        item.data_ref = None

        user_login = item.user_login
        if hlp.is_none_or_empty(user_login):
            raise err.AccessError("Argument user_login shouldn't be null or empty.")

        user = self._session.query(db.User).get(user_login)
        if user is None:
            raise err.AccessError("User with login {} doesn't exist.".format(user_login))

        #Making copies of tags and fields
        item_tags_copy = item.item_tags[:]
        item_fields_copy = item.item_fields[:]

        # Storing the item without tags and fields (for now)
        del item.item_tags[:]
        del item.item_fields[:]
        self._session.add(item)
        self._session.flush()

        tagNamesToAdd = map(lambda itag: itag.tag.name, item_tags_copy)
        operations.ItemOperations.addTags(self._session, item, tagNamesToAdd, user_login)

        nameValuePairsToAdd = map(lambda ifield: (ifield.field.name, ifield.field_value),
                                  item_fields_copy)
        operations.ItemOperations.addOrUpdateFields(self._session, item, nameValuePairsToAdd,
                                                    user_login)

        isDataRefRequired = not hlp.is_none_or_empty(srcAbsPath)
        if isDataRefRequired:
            operations.ItemOperations.addUntrackedFile(self._session, item,
                                                   self._repoBasePath,
                                                   srcAbsPath, dstRelPath,
                                                   user_login)

        self._session.commit()
        item_id = item.id
        self._session.expunge(item)
        return item_id