Return a datetime object based on either the `delayed_for` argument
    (int/float/timedelta), which wille be added to the current datetime
    (`datetime.utcnow`), or the `delayed_until` one which must be a
    datetime object.
    Raise a `ValueError` exception if both are set, or a invalid type is
    used.
    Returns None if both arguments are None.

def compute_delayed_until(delayed_for=None, delayed_until=None):
    """
    Return a datetime object based on either the `delayed_for` argument
    (int/float/timedelta), which wille be added to the current datetime
    (`datetime.utcnow`), or the `delayed_until` one which must be a
    datetime object.
    Raise a `ValueError` exception if both are set, or a invalid type is
    used.
    Returns None if both arguments are None.
    """
    if delayed_until:
        if delayed_for:
            raise ValueError('delayed_until and delayed_for arguments are exclusive')
        if not isinstance(delayed_until, datetime):
            raise ValueError('Invalid delayed_until argument: must be a datetime object')

    if delayed_for:
        try:
            delayed_until = datetime.utcnow() + get_delta(delayed_for)
        except Exception:
            raise ValueError('Invalid delayed_for argument: must be an int, a float or a timedelta object')

    return delayed_until