Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ANW-725 Spawn with default values #2686

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions common/spec/lib/factory_bot_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ def few_or_none(key)
content_description { generate(:generic_description) }
condition_description { generate(:generic_description) }
accession_date { generate(:yyyy_mm_dd) }
extents { [build(:json_extent)] }
end

factory :json_active_edits, class: JSONModel(:active_edits) do
Expand Down
9 changes: 2 additions & 7 deletions frontend/app/controllers/accessions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ def show

def new
@accession = Accession.new({:accession_date => Date.today.strftime('%Y-%m-%d')})._always_valid!
defaults = user_defaults('accession')
@accession.update(defaults.values) if defaults

if params[:accession_id]
acc = Accession.find(params[:accession_id], find_opts)
Expand All @@ -49,13 +51,6 @@ def new
flash.now[:info] = I18n.t("accession._frontend.messages.spawned", JSONModelI18nWrapper.new(:accession => acc))
flash[:spawned_from_accession] = acc.id
end

elsif user_prefs['default_values']
defaults = DefaultValues.get 'accession'

if defaults
@accession.update(defaults.values)
end
end
end

Expand Down
5 changes: 5 additions & 0 deletions frontend/app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,11 @@ def user_prefs
session[:preferences] || self.class.user_preferences(session)
end

def user_defaults(record_type)
default_values = user_prefs['default_values']
DefaultValues.get(record_type) if default_values
end

helper_method :browse_columns
def browse_columns
@browse_columns ||= if session[:repo_id]
Expand Down
14 changes: 5 additions & 9 deletions frontend/app/controllers/resources_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ def show

def new
@resource = Resource.new(:title => I18n.t("resource.title_default", :default => ""))._always_valid!
defaults = user_defaults('resource')
if defaults
@resource.update(defaults.values)
@form_title = "#{I18n.t('actions.new_prefix')} #{I18n.t('resource._singular')}"
end

if params[:accession_id]
acc = Accession.find(params[:accession_id], find_opts)
Expand All @@ -55,15 +60,6 @@ def new
flash.now[:info] = I18n.t("resource._frontend.messages.spawned", JSONModelI18nWrapper.new(:accession => acc).enable_parse_mixed_content!(url_for(:root)))
flash[:spawned_from_accession] = acc.id
end

elsif user_prefs['default_values']
defaults = DefaultValues.get 'resource'

if defaults
@resource.update(defaults.values)
@form_title = "#{I18n.t('actions.new_prefix')} #{I18n.t('resource._singular')}"
end

end

return render_aspace_partial :partial => "resources/new_inline" if params[:inline]
Expand Down
1 change: 1 addition & 0 deletions frontend/app/models/accession.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ def prepare_for_clone(values)
values.delete('deaccessions')
values.delete('collection_management')
values.delete('classification')
values.delete_if { |k, v| v.respond_to?(:empty?) && v.empty? }
end

end
10 changes: 8 additions & 2 deletions frontend/app/models/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ def populate_from_accession(accession)

self.notes = notes

self.update(values)

self.rights_statements = Array(accession.rights_statements).map {|rights_statement|
rights_statement.clone.tap {|r| r.delete('identifier')}
}
Expand All @@ -73,7 +71,15 @@ def populate_from_accession(accession)
if !self.lang_materials || self.lang_materials.empty?
self.lang_materials = [JSONModel(:lang_material).new._always_valid!]
end

prepare_for_clone(values)
self.update(values)
end

private

def prepare_for_clone(values)
values.delete_if { |k, v| v.respond_to?(:empty?) && v.empty? }
end

end
2 changes: 1 addition & 1 deletion frontend/app/views/accessions/_toolbar.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<%= render_aspace_partial :partial => "shared/event_dropdown", :locals => {:record => @accession } %>
<% end %>
<% if not @accession.suppressed %>
<div class="btn btn-inline-form">
<div id="spawn-dropdown" class="btn btn-inline-form">
<a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">
<%= I18n.t "actions.spawn" %>
<span class="caret"></span>
Expand Down
6 changes: 6 additions & 0 deletions frontend/spec/aspace_helper.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
module ASpaceHelpers
include Capybara::DSL

def apply_session_to_controller(controller, username, password)
session = User.login(username, password)
User.establish_session(controller, session, username)
controller.session[:repo_id] = JSONModel.repository
end

def resource_edit_url(resource)
"#{resource.uri.sub(%r{/repositories/\d+}, '')}/edit"
end
Expand Down
51 changes: 48 additions & 3 deletions frontend/spec/controllers/resource_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,23 @@
set_repo($repo)
end

let(:default_values) {
DefaultValues.new(
JSONModel(:default_values).from_hash({
'record_type': 'resource',
'defaults': {
'publish': true,
"extents": [{"portion": "whole"}],
"lang_materials": [{"language_and_script": {"language": "eng", "script": "Latn"}}]
}
})
)
}

it "sets export menu's 'include unpublished' checkbox per user preferences" do
resource = create(:json_resource, instances: [])
session = User.login('admin', 'admin')
User.establish_session(controller, session, 'admin')
controller.session[:repo_id] = JSONModel.repository

apply_session_to_controller(controller, 'admin', 'admin')
# pretend preference is include_unpublished
allow(controller).to receive(:user_prefs).and_return('include_unpublished' => true)
get :edit, params: {id: resource.id, inline: true}
Expand All @@ -28,4 +39,38 @@
expect(response.body).not_to match /id="include-unpublished"[^>]+checked/
expect(response.body).not_to match /id="include-unpublished-marc"[^>]+checked/
end

it "applies default values to a new resource" do
apply_session_to_controller(controller, 'admin', 'admin')
allow(controller).to receive(:user_defaults).with('resource').and_return(default_values)
get :new
result = Capybara.string(response.body)
result.find(:css, '#resource_extents__0__portion_ option[@selected="selected"]') do |selected|
expect(selected.text).to eq('Whole')
end
result.find(:css,
'#resource_lang_materials__0__language_and_script__script_ option[@selected="selected"]'
) do |selected|
expect(selected.text).to eq('Latin')
end
end

it "spawns a resource from an accession with default values" do
accession = create(:json_accession, extents: [ build(:json_extent, portion: 'part') ])

apply_session_to_controller(controller, 'admin', 'admin')
allow(controller).to receive(:user_defaults).with('resource').and_return(default_values)
get :new, params: {accession_id: accession.id, inline: true}
expect(response.body).to match /spawned from Accession/
result = Capybara.string(response.body)
result.find(:css, '#resource_extents__0__portion_ option[@selected="selected"]') do |selected|
expect(selected.text).not_to eq('Whole') # from defaults
expect(selected.text).to eq('Part') # from accession
end
result.find(:css,
'#resource_lang_materials__0__language_and_script__script_ option[@selected="selected"]'
) do |selected|
expect(selected.text).to eq('Latin')
end
end
end