def piece_is_blocked_diagonal(piece, position, board):
    """
    Returns True if the diagonal path of piece to position is blocked.
    It does not check for whether there is a piece at the final destination
    since a move may be a valid attack. In addition, if position is not a
    diagonal movement of the initial, then True is returned since the piece
    is "blocked"
    >>> board = Board(empty=True)
    >>> queen = Queen(WHITE, locate("d1"))
    >>> board.add_piece(queen)
    >>> board.add_piece(Pawn(BLACK, locate("h5")))
    >>> board.add_piece(Pawn(WHITE, locate("c2"))) # Set up board
    >>> piece_is_blocked_diagonal(queen, locate("d1"), board) # Not valid move
    True
    >>> piece_is_blocked_diagonal(queen, locate("e2"), board) # Valid move
    False
    >>> piece_is_blocked_diagonal(queen, locate("f3"), board) # Valid move
    False
    >>> piece_is_blocked_diagonal(queen, locate("h5"), board) # Valid (see above)
    False
    >>> piece_is_blocked_diagonal(queen, locate("c2"), board) # Valid (see above)
    False
    >>> piece_is_blocked_diagonal(queen, locate("a4"), board) # Not valid move
    True
    >>> piece_is_blocked_diagonal(queen, locate("h1"), board) # Wrong move
    True
    >>> piece_is_blocked_diagonal(queen, locate("a2"), board) # Wrong move
    True
    """
    row_change = position.row - piece.position.row
    col_change = position.col - piece.position.col

    n = abs(row_change)
    m = abs(col_change)

    if n == m and n != 0:
        row_unit = row_change // n
        col_unit = col_change // m

        for i in range(1, n):
            if board.get_piece(piece.position + (row_unit * i, col_unit * i)):
                return True
        return False
    return True