Beispiel #1
0
def test_can_undo_review(db, dummy_contribution, dummy_user, is1, fs1, ok1,
                         is2, fs2, ok2):
    from indico.modules.events.editing.operations import InvalidEditableState, undo_review
    editable = Editable(contribution=dummy_contribution,
                        type=EditableType.paper)
    rev1 = EditingRevision(editable=editable,
                           submitter=dummy_user,
                           initial_state=is1,
                           final_state=fs1)
    if is2 is not None:
        rev2 = EditingRevision(editable=editable,
                               submitter=dummy_user,
                               initial_state=is2,
                               final_state=fs2)
    db.session.flush()

    if ok1:
        undo_review(rev1)
    else:
        pytest.raises(InvalidEditableState, undo_review, rev1)

    if is2 is not None:
        if ok2:
            undo_review(rev2)
        else:
            pytest.raises(InvalidEditableState, undo_review, rev2)

    db.session.expire(
        editable)  # so a deleted revision shows up in the relationship
    if ok1:
        assert rev1.final_state == FinalRevisionState.none
        assert len(editable.revisions) == 1
    elif ok2:
        assert rev2.final_state == FinalRevisionState.none
        assert len(editable.revisions) == 2
Beispiel #2
0
def test_cannot_undo_review_old_rev(dummy_contribution, dummy_user):
    from indico.modules.events.editing.operations import InvalidEditableState, undo_review
    editable = Editable(contribution=dummy_contribution, type=EditableType.paper)
    rev1 = EditingRevision(editable=editable, submitter=dummy_user,
                           initial_state=InitialRevisionState.ready_for_review,
                           final_state=FinalRevisionState.needs_submitter_confirmation, reviewed_dt=now_utc())
    rev2 = EditingRevision(editable=editable, submitter=dummy_user,
                           initial_state=InitialRevisionState.needs_submitter_confirmation,
                           final_state=FinalRevisionState.needs_submitter_changes, reviewed_dt=now_utc())
    rev3 = EditingRevision(editable=editable, submitter=dummy_user,
                           initial_state=InitialRevisionState.ready_for_review)
    with pytest.raises(InvalidEditableState):
        undo_review(rev1)
    with pytest.raises(InvalidEditableState):
        undo_review(rev2)
    undo_review(rev3)
Beispiel #3
0
def create_new_editable(contrib, type_, submitter, files):
    editable = Editable(contribution=contrib, type=type_)
    revision = EditingRevision(submitter=submitter,
                               initial_state=InitialRevisionState.ready_for_review,
                               files=_make_editable_files(editable, files))
    editable.revisions.append(revision)
    db.session.flush()
    logger.info('Editable [%s] created by %s for %s', type_.name, submitter, contrib)
    return editable
Beispiel #4
0
def create_submitter_revision(prev_revision, user, files):
    _ensure_latest_revision(prev_revision)
    _ensure_state(prev_revision, final=FinalRevisionState.needs_submitter_changes)
    new_revision = EditingRevision(submitter=user,
                                   initial_state=InitialRevisionState.ready_for_review,
                                   files=_make_editable_files(prev_revision.editable, files),
                                   tags=prev_revision.tags)
    prev_revision.editable.revisions.append(new_revision)
    db.session.flush()
    logger.info('Revision %r created by submitter %s', new_revision, user)
Beispiel #5
0
def review_editable_revision(revision,
                             editor,
                             action,
                             comment,
                             tags,
                             files=None):
    _ensure_latest_revision(revision)
    _ensure_state(revision,
                  initial=InitialRevisionState.ready_for_review,
                  final=FinalRevisionState.none)
    revision.editor = editor
    revision.comment = comment
    revision.tags = tags
    revision.final_state = {
        EditingReviewAction.accept:
        FinalRevisionState.accepted,
        EditingReviewAction.reject:
        FinalRevisionState.rejected,
        EditingReviewAction.update:
        FinalRevisionState.needs_submitter_confirmation,
        EditingReviewAction.update_accept:
        FinalRevisionState.needs_submitter_confirmation,
        EditingReviewAction.request_update:
        FinalRevisionState.needs_submitter_changes,
    }[action]

    db.session.flush()
    if action == EditingReviewAction.accept:
        _ensure_publishable_files(revision)
        publish_editable_revision(revision)
    elif action in (EditingReviewAction.update,
                    EditingReviewAction.update_accept):
        final_state = FinalRevisionState.none
        editable_editor = None
        if action == EditingReviewAction.update_accept:
            final_state = FinalRevisionState.accepted
            editable_editor = editor
        new_revision = EditingRevision(
            submitter=editor,
            editor=editable_editor,
            initial_state=InitialRevisionState.needs_submitter_confirmation,
            final_state=final_state,
            files=_make_editable_files(revision.editable, files),
            tags=revision.tags)
        _ensure_publishable_files(new_revision)
        revision.editable.revisions.append(new_revision)
        if action == EditingReviewAction.update_accept:
            db.session.flush()
            publish_editable_revision(new_revision)
    db.session.flush()
    notify_editor_judgment(revision, session.user)
    logger.info('Revision %r reviewed by %s [%s]', revision, editor,
                action.name)
Beispiel #6
0
def replace_revision(revision, user, comment, files):
    _ensure_latest_revision(revision)
    _ensure_state(revision,
                  initial=(InitialRevisionState.new, InitialRevisionState.ready_for_review),
                  final=FinalRevisionState.none)
    revision.comment = comment
    revision.final_state = FinalRevisionState.replaced
    new_revision = EditingRevision(submitter=user,
                                   initial_state=revision.initial_state,
                                   files=_make_editable_files(revision.editable, files))
    revision.editable.revisions.append(new_revision)
    db.session.flush()
    logger.info('Revision %r replaced by %s', revision, user)
Beispiel #7
0
def replace_revision(revision, user, comment, files, tags, initial_state=None):
    ensure_latest_revision(revision)
    _ensure_state(revision,
                  initial=(InitialRevisionState.new,
                           InitialRevisionState.ready_for_review),
                  final=FinalRevisionState.none)
    revision.comment = comment
    revision.reviewed_dt = now_utc()
    revision.tags = tags
    revision.final_state = FinalRevisionState.replaced
    revision.editor = user
    new_revision = EditingRevision(submitter=revision.submitter,
                                   initial_state=(initial_state
                                                  or revision.initial_state),
                                   files=_make_editable_files(
                                       revision.editable, files))
    revision.editable.revisions.append(new_revision)
    db.session.flush()
    logger.info('Revision %r replaced by %s', revision, user)
Beispiel #8
0
def create_submitter_revision(prev_revision, user, files):
    ensure_latest_revision(prev_revision)
    try:
        _ensure_state(prev_revision,
                      initial=InitialRevisionState.ready_for_review,
                      final=FinalRevisionState.none)
        if prev_revision.editable.editor:
            raise InvalidEditableState
    except InvalidEditableState:
        _ensure_state(prev_revision,
                      final=FinalRevisionState.needs_submitter_changes)
    new_revision = EditingRevision(
        submitter=user,
        initial_state=InitialRevisionState.ready_for_review,
        files=_make_editable_files(prev_revision.editable, files),
        tags=prev_revision.tags)
    prev_revision.editable.revisions.append(new_revision)
    db.session.flush()
    notify_submitter_upload(new_revision)
    logger.info('Revision %r created by submitter %s', new_revision, user)
    return new_revision