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
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)
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
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)
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)
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)
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)
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