##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Undo Interfaces

$Id: interfaces.py 27082 2004-08-12 20:03:58Z srichter $
"""

from zope.interface import Interface

class UndoError(Exception):
    pass

class IUndo(Interface):
    """Undo functionality"""

    def getTransactions(context=None, first=0, last=-20):
        """Return a sequence of mapping objects describing
        transactions, ordered by date, descending:

        Keys of mapping objects:

          id           -> internal id for zodb
          principal    -> principal that invoked the transaction
          datetime     -> datetime object of time
          description  -> description/note (string)

          Extended information (not necessarily available):
          request_type -> type of request that caused transaction
          request_info -> request information, e.g. URL, method
          location     -> location of the object that was modified
          undo         -> boolean value, indicated an undo transaction

        If 'context' is None, all transactions will be listed,
        otherwise only transactions for that location.

        It skips the 'first' most recent transactions; i.e. if first
        is N, then the first transaction returned will be the Nth
        transaction.

        If last is less than zero, then its absolute value is the
        maximum number of transactions to return.  Otherwise if last
        is N, then only the N most recent transactions following start
        are considered.
        """

    def undoTransactions(ids):
        """Undo the transactions specified in the sequence 'ids'.
        """

class IPrincipalUndo(Interface):
    """Undo functionality for one specific principal"""

    def getPrincipalTransactions(principal, context=None, first=0, last=-20):
        """Returns transactions invoked by the given principal.

        See IUndo.getTransactions() for more information
        """

    def undoPrincipalTransactions(principal, ids):
        """Undo the transactions invoked by 'principal' with the given
        'ids'. Raise UndoError if a transaction is listed among 'ids'
        that does not belong to 'principal'.
        """

class IUndoManager(IUndo, IPrincipalUndo):
    """Utility to provide both global and principal-specific undo
    functionality
    """
