Skip to content

Commit

Permalink
Adding view and controller for versions. fixes #181
Browse files Browse the repository at this point in the history
  • Loading branch information
carolyncole committed Sep 2, 2015
1 parent ec2aa61 commit ffe44fc
Show file tree
Hide file tree
Showing 9 changed files with 190 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ def update
render action: 'edit'
end

def versions
@version_list = version_list
end

# this is provided so that implementing application can override this behavior and map params to different attributes
def update_metadata
# attrs_without_visibility_info = actor.interpret_visibility(attributes)
Expand All @@ -100,6 +104,10 @@ def update_metadata

protected

def version_list
CurationConcerns::VersionListPresenter.new(@generic_file.original_file.versions.all)
end

def wants_to_revert?
params.key?(:revision) && params[:revision] != @generic_file.latest_content_version.label
end
Expand Down
18 changes: 18 additions & 0 deletions app/presenters/curation_concerns/version_list_presenter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module CurationConcerns
class VersionListPresenter
def initialize(version_list)
@raw_list = version_list
end

delegate :each, to: :wrapped_list

private

def wrapped_list
@wrapped_list ||=
@raw_list.map { |v| CurationConcerns::VersionPresenter.new(v) } # wrap each item in a presenter
.sort { |a, b| b.version.created <=> a.version.created } # sort list of versions based on creation date
.tap { |l| l.first.try(:current!) } # set the first version to the current version
end
end
end
27 changes: 27 additions & 0 deletions app/presenters/curation_concerns/version_presenter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module CurationConcerns
class VersionPresenter
attr_reader :version, :current

def initialize(version)
@version = version
@current = false
end

delegate :label, :uri, to: :version
alias_method :current?, :current

def current!
@current = true
end

def created
@created ||= version.created.to_time.to_formatted_s(:long_ordinal)
@created
end

def committer
vc = VersionCommitter.where(version_id: @version.uri)
vc.empty? ? nil : vc.first.committer_login
end
end
end
23 changes: 23 additions & 0 deletions app/views/curation_concerns/base/_versioning.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<div id="versioning_display" class="tab-pane">
<h2>Versions</h2>
<div class="well">

<%= form_for [main_app, :curation_concerns, curation_concern], html: { multipart: true } do |f| %>
<h3>Restore Previous Version</h3>
<% @version_list.each do |version| %>
<div class="form-group">
<div class="col-xs-12">
<label class="radio <%= version.current? ? 'disabled' : '' %>">
<%= radio_button_tag(:revision, version.label, false, disabled: version.current?, required: 'required') %>
<%= version.current? ? 'Current version:' : 'Restore from' %>
<%= version.created %> [by <%= version.committer %>]
</label>
</div>
</div>
<% end %>
<div id="save_version_note" class="alert hide">You must click &quot;Save Revision&quot; to revert a previous version of this file</div>
<%= f.button '<i class="glyphicon glyphicon-save"></i> Save Revision'.html_safe, type: 'submit', class: 'btn btn-primary', onclick: "confirmation_needed = false;", name: "revert_submit", id: "revert_submit" %>
<% end %>

</div> <!-- /well -->
</div> <!-- /row -->
6 changes: 6 additions & 0 deletions app/views/curation_concerns/base/versions.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<% provide :page_title, curation_concern_page_title(curation_concern) %>
<% provide :page_header do %>
<h2>Manage Your Work</h2>
<% end%>
<%#= curation_concern.to_json %>
<%= render 'versioning' %>
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ module Ability
def curation_concerns_permissions
unless current_user.new_record?
can :create, CurationConcerns::ClassifyConcern
# TODO: Shouldn't this be in `everyone_can_create_curation_concerns` ?
can :create, ::GenericFile
end

# user can version if they can edit
alias_action :versions, to: :update

if user_groups.include? 'admin'
can [:create, :discover, :show, :read, :edit, :update, :destroy], :all
end
Expand All @@ -23,6 +24,7 @@ def curation_concerns_permissions
# to submit content
def everyone_can_create_curation_concerns
return if current_user.new_record?
can :create, ::GenericFile
can :create, [CurationConcerns.config.curation_concerns]
can :create, ::Collection
end
Expand Down
37 changes: 21 additions & 16 deletions spec/abilities/generic_file_abilities_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
let(:creating_user) { user }
let(:current_user) { user }
it do
should be_able_to(:create, GenericFile.new)
should be_able_to(:read, generic_file)
should be_able_to(:update, generic_file)
should_not be_able_to(:delete, generic_file)
is_expected.to be_able_to(:create, GenericFile.new)
is_expected.to be_able_to(:versions, generic_file)
is_expected.to be_able_to(:read, generic_file)
is_expected.to be_able_to(:update, generic_file)
is_expected.to_not be_able_to(:delete, generic_file)
end
end

Expand All @@ -29,32 +30,36 @@
let(:creating_user) { user }
let(:current_user) { manager_user }
it do
should be_able_to(:create, ::GenericFile.new)
should be_able_to(:read, generic_file)
should be_able_to(:update, generic_file)
should be_able_to(:destroy, generic_file)
is_expected.to be_able_to(:create, GenericFile.new)
is_expected.to be_able_to(:versions, generic_file)
is_expected.to be_able_to(:read, generic_file)
is_expected.to be_able_to(:update, generic_file)
is_expected.to be_able_to(:destroy, generic_file)
end
end

describe 'another authenticated user' do
let(:creating_user) { FactoryGirl.create(:user) }
let(:current_user) { user }

it do
should be_able_to(:create, ::GenericFile.new)
should_not be_able_to(:read, generic_file)
should_not be_able_to(:update, generic_file)
should_not be_able_to(:delete, generic_file)
is_expected.to be_able_to(:create, GenericFile.new)
is_expected.to_not be_able_to(:versions, generic_file)
is_expected.to_not be_able_to(:read, generic_file)
is_expected.to_not be_able_to(:update, generic_file)
is_expected.to_not be_able_to(:delete, generic_file)
end
end

describe 'a nil user' do
let(:creating_user) { FactoryGirl.create(:user) }
let(:current_user) { nil }
it do
should_not be_able_to(:create, GenericFile.new)
should_not be_able_to(:read, generic_file)
should_not be_able_to(:update, generic_file)
should_not be_able_to(:delete, generic_file)
is_expected.to_not be_able_to(:create, GenericFile.new)
is_expected.to_not be_able_to(:versions, generic_file)
is_expected.to_not be_able_to(:read, generic_file)
is_expected.to_not be_able_to(:update, generic_file)
is_expected.to_not be_able_to(:delete, generic_file)
end
end
end
Expand Down
32 changes: 32 additions & 0 deletions spec/presenters/curation_concerns/version_list_presenter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'spec_helper'

describe CurationConcerns::VersionListPresenter, :no_clean do
let(:resource_version) do
ActiveFedora::VersionsGraph::ResourceVersion.new.tap do |v|
v.uri = 'http://example.com/version1'
v.label = 'version1'
v.created = '2014-12-09T02:03:18.296Z'
end
end

let(:resource_version2) do
ActiveFedora::VersionsGraph::ResourceVersion.new.tap do |v|
v.uri = 'http://example.com/version2'
v.label = 'version2'
v.created = '2014-12-19T02:03:18.296Z'
end
end

subject { described_class.new([resource_version, resource_version2]) }

describe "#each" do
it "yields version_presenters" do
versions_descending = []
subject.each do |v|
expect(v).to be_kind_of CurationConcerns::VersionPresenter
versions_descending.push(v.label)
end
expect(versions_descending).to eq ['version2', 'version1']
end
end
end
51 changes: 51 additions & 0 deletions spec/presenters/curation_concerns/version_presenter_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
require 'spec_helper'

describe CurationConcerns::VersionPresenter, :no_clean do
let(:resource_version) do
ActiveFedora::VersionsGraph::ResourceVersion.new.tap do |v|
v.uri = 'http://example.com/version1'
v.label = 'version1'
v.created = '2014-12-09T02:03:18.296Z'
end
end

let(:presenter) { described_class.new(resource_version) }

describe "#label" do
subject { presenter.label }
it { is_expected.to eq 'version1' }
end

describe "#uri" do
subject { presenter.uri }
it { is_expected.to eq 'http://example.com/version1' }
end

describe "#created" do
before do
# Stub out the local timezone to (+08:00)
t2 = Time.new(2014, 12, 8, 18, 3, 18, 8)
allow_any_instance_of(Time).to receive(:getlocal).and_return(t2)
end
subject { presenter.created }
it { is_expected.to eq "December 8th, 2014 18:03" }
end

describe "#current?" do
subject { presenter.current? }
it { is_expected.to be false }

context "when current! is set" do
before { presenter.current! }
it { is_expected.to be true }
end
end

describe "#committer" do
before do
VersionCommitter.create(version_id: resource_version.uri, committer_login: 'jill')
end
subject { presenter.committer }
it { is_expected.to eq 'jill' }
end
end

0 comments on commit ffe44fc

Please sign in to comment.