sufia 6.0.0.beta1 → 6.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +12 -2
- data/Gemfile +10 -1
- data/History.md +21 -0
- data/SUFIA_VERSION +1 -1
- data/app/assets/images/orcid.png +0 -0
- data/app/assets/javascripts/sufia.js +1 -1
- data/app/assets/javascripts/sufia/batch_edit.js +36 -54
- data/app/assets/javascripts/sufia/edit_metadata.js +10 -11
- data/app/assets/javascripts/sufia/permissions.js +2 -26
- data/app/assets/stylesheets/sufia.css.scss +10 -2
- data/app/assets/stylesheets/sufia/_batch-edit.scss +8 -6
- data/app/assets/stylesheets/sufia/_dashboard.scss +10 -0
- data/app/assets/stylesheets/sufia/_settings.scss +1 -0
- data/app/assets/stylesheets/sufia/_styles.scss +5 -3
- data/app/controllers/batch_controller.rb +9 -6
- data/app/controllers/batch_edits_controller.rb +2 -2
- data/app/controllers/collections_controller.rb +19 -3
- data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +30 -29
- data/app/controllers/concerns/sufia/breadcrumbs.rb +8 -3
- data/app/controllers/concerns/sufia/files_controller_behavior.rb +19 -7
- data/app/controllers/concerns/sufia/users_controller_behavior.rb +14 -2
- data/app/controllers/single_use_links_viewer_controller.rb +5 -1
- data/app/forms/sufia/forms/batch_edit_form.rb +6 -0
- data/app/forms/sufia/forms/collection_edit_form.rb +17 -0
- data/app/forms/sufia/forms/generic_file_edit_form.rb +16 -0
- data/app/helpers/generic_file_helper.rb +3 -47
- data/app/helpers/sufia/permissions_helper.rb +29 -0
- data/app/helpers/sufia/sufia_helper_behavior.rb +11 -0
- data/app/inputs/multi_value_with_help_input.rb +8 -0
- data/app/inputs/select_with_help_input.rb +3 -0
- data/app/inputs/select_with_modal_help_input.rb +36 -0
- data/app/inputs/with_help_icon.rb +32 -0
- data/app/models/concerns/sufia/solr_document_behavior.rb +1 -1
- data/app/presenters/sufia/collection_presenter.rb +29 -0
- data/app/presenters/sufia/generic_file_presenter.rb +14 -0
- data/app/presenters/sufia/presenter_renderer.rb +53 -0
- data/app/views/batch/_metadata.html.erb +10 -44
- data/app/views/batch/_more_metadata.html.erb +3 -2
- data/app/views/batch/edit.html.erb +2 -2
- data/app/views/batch_edits/edit.html.erb +13 -17
- data/app/views/collections/_form.html.erb +5 -5
- data/app/views/collections/_show_descriptions.html.erb +8 -10
- data/app/views/collections/edit.html.erb +8 -9
- data/app/views/collections/edit_fields/_description.html.erb +1 -2
- data/app/views/dashboard/_index_partials/_stats.html.erb +3 -3
- data/app/views/generic_files/_descriptions.html.erb +5 -8
- data/app/views/generic_files/_permission_form.html.erb +8 -17
- data/app/views/generic_files/_show_descriptions.html.erb +3 -4
- data/app/views/generic_files/edit.html.erb +1 -2
- data/app/views/generic_files/jq_upload.json.jbuilder +8 -0
- data/app/views/records/edit_fields/_default.html.erb +5 -10
- data/app/views/records/edit_fields/_description.html.erb +5 -10
- data/app/views/records/edit_fields/_resource_type.html.erb +2 -5
- data/app/views/records/edit_fields/_rights.html.erb +3 -9
- data/app/views/single_use_links_viewer/show.html.erb +10 -16
- data/app/views/users/_profile.html.erb +1 -2
- data/app/views/users/_user_info.html.erb +20 -3
- data/app/views/users/edit.html.erb +11 -2
- data/app/views/users/show.html.erb +1 -1
- data/config/locales/sufia.en.yml +46 -26
- data/config/routes.rb +1 -1
- data/lib/generators/sufia/install_generator.rb +4 -0
- data/lib/sufia.rb +4 -0
- data/lib/sufia/form_builder.rb +16 -0
- data/lib/sufia/version.rb +1 -1
- data/spec/actors/generic_file/actor_spec.rb +1 -2
- data/spec/controllers/batch_controller_spec.rb +16 -48
- data/spec/controllers/batch_edits_controller_spec.rb +27 -16
- data/spec/controllers/collections_controller_spec.rb +81 -61
- data/spec/controllers/generic_files_controller_spec.rb +17 -2
- data/spec/controllers/users_controller_spec.rb +13 -3
- data/spec/features/collection_spec.rb +93 -88
- data/spec/features/users_spec.rb +1 -1
- data/spec/forms/collection_edit_form_spec.rb +20 -0
- data/spec/forms/generic_file_edit_form_spec.rb +26 -0
- data/spec/helpers/generic_file_helper_spec.rb +33 -7
- data/spec/helpers/permissions_helper_spec.rb +21 -0
- data/spec/inputs/multi_value_with_help_input_spec.rb +25 -0
- data/spec/inputs/select_with_modal_help_input_spec.rb +21 -0
- data/spec/jobs/batch_update_job_spec.rb +11 -14
- data/spec/lib/sufia/breadcrumbs_spec.rb +46 -8
- data/spec/models/generic_file_spec.rb +0 -13
- data/spec/models/user_spec.rb +23 -0
- data/spec/presenters/presenter_renderer_spec.rb +19 -0
- data/spec/presenters/sufia/generic_file_presenter_spec.rb +12 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/input_support.rb +12 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- data/spec/views/batch/edit.html.erb_spec.rb +13 -23
- data/spec/views/batch_edits/edit.html.erb_spec.rb +19 -0
- data/spec/views/collections/_form.html.erb_spec.rb +26 -28
- data/spec/views/collections/_show_descriptions.html.erb_spec.rb +15 -9
- data/spec/views/dashboard/index_spec.rb +2 -2
- data/spec/views/generic_file/_permission_form.html.erb_spec.rb +23 -0
- data/spec/views/generic_file/edit.html.erb_spec.rb +5 -0
- data/spec/views/generic_file/show.html.erb_spec.rb +5 -0
- data/sufia-models/app/actors/sufia/generic_file/actor.rb +1 -1
- data/sufia-models/app/jobs/batch_update_job.rb +5 -5
- data/sufia-models/app/models/batch.rb +7 -3
- data/sufia-models/app/models/concerns/sufia/collection.rb +7 -25
- data/sufia-models/app/models/concerns/sufia/generic_file.rb +0 -1
- data/sufia-models/app/models/concerns/sufia/generic_file/export.rb +2 -2
- data/sufia-models/app/models/concerns/sufia/generic_file/indexing.rb +4 -13
- data/sufia-models/app/models/concerns/sufia/generic_file/metadata.rb +1 -1
- data/sufia-models/app/models/concerns/sufia/user.rb +24 -17
- data/sufia-models/app/models/sufia/orcid_validator.rb +8 -0
- data/sufia-models/app/services/sufia/generic_file_indexing_service.rb +13 -0
- data/sufia-models/app/services/sufia/indexing_service.rb +15 -0
- data/sufia-models/lib/generators/sufia/models/abstract_migration_generator.rb +30 -0
- data/sufia-models/lib/generators/sufia/models/cached_stats_generator.rb +3 -47
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +11 -31
- data/sufia-models/lib/generators/sufia/models/orcid_field_generator.rb +19 -0
- data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +2 -31
- data/sufia-models/lib/generators/sufia/models/templates/config/redis.yml +3 -0
- data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +3 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/add_orcid_to_users.rb +5 -0
- data/sufia-models/lib/generators/sufia/models/upgrade400_generator.rb +2 -33
- data/sufia-models/lib/generators/sufia/models/user_stats_generator.rb +31 -0
- data/sufia-models/lib/sufia/models/engine.rb +1 -0
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia-models/sufia-models.gemspec +5 -5
- data/sufia.gemspec +2 -3
- metadata +49 -39
- data/app/assets/javascripts/sufia/multiForm.js +0 -67
- data/app/helpers/records_helper.rb +0 -4
- data/app/helpers/sufia/records_helper_behavior.rb +0 -68
- data/app/views/batch_edits/update_edit.js.erb +0 -5
- data/app/views/collections/_edit_descriptions.html.erb +0 -18
- data/app/views/collections/edit_fields/_title.html.erb +0 -3
- data/app/views/generic_files/_field_form.html.erb +0 -20
- data/app/views/records/_edit_field.html.erb +0 -22
- data/app/views/records/edit_fields/_suffix.html.erb +0 -10
- data/app/views/records/edit_fields/_type.html.erb +0 -8
- data/app/views/users/_social_media_info.html.erb +0 -20
- data/spec/helpers/records_helper_spec.rb +0 -102
- data/spec/models/generic_file/web_form_spec.rb +0 -35
- data/sufia-models/app/models/concerns/sufia/generic_file/accessible_attributes.rb +0 -87
- data/sufia-models/app/models/concerns/sufia/generic_file/web_form.rb +0 -62
@@ -2,24 +2,30 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'collections/_show_descriptions.html.erb', :type => :view do
|
4
4
|
context 'displaying a custom collection' do
|
5
|
+
let(:collection) do
|
6
|
+
mock_model(Collection,
|
7
|
+
resource_type: [], creator: [], contributor: [], tag: [],
|
8
|
+
rights: [], publisher: [], date_created: ['2000-01-01'], subject: [],
|
9
|
+
language: [], identifier: [], based_near: [], related_url: [],
|
10
|
+
members: ['foo', 'bar'], bytes: 123456678
|
11
|
+
)
|
12
|
+
end
|
5
13
|
before do
|
6
|
-
|
7
|
-
|
8
|
-
allow(@collection).to receive(:date_modified).and_return(["today"])
|
9
|
-
allow(@collection).to receive(:terms_for_display).and_return([:date_modified])
|
10
|
-
allow(@collection).to receive(:members).and_return(["foo","bar"])
|
11
|
-
allow(@collection).to receive(:bytes).and_return(123456678)
|
14
|
+
assign(:presenter, presenter)
|
15
|
+
assign(:collection, collection)
|
12
16
|
end
|
13
17
|
|
18
|
+
let(:presenter) { Sufia::CollectionPresenter.new(collection) }
|
19
|
+
|
20
|
+
|
14
21
|
it "should draw the metadata fields for collection" do
|
15
22
|
render
|
16
|
-
expect(rendered).to have_content 'Date
|
17
|
-
expect(rendered).to include('itemprop="
|
23
|
+
expect(rendered).to have_content 'Date Created'
|
24
|
+
expect(rendered).to include('itemprop="dateCreated"')
|
18
25
|
expect(rendered).to have_content 'Total Items'
|
19
26
|
expect(rendered).to have_content '2'
|
20
27
|
expect(rendered).to have_content 'Size'
|
21
28
|
expect(rendered).to have_content '118 MB'
|
22
29
|
end
|
23
30
|
end
|
24
|
-
|
25
31
|
end
|
@@ -64,8 +64,8 @@ describe "dashboard/index.html.erb", :type => :view do
|
|
64
64
|
expect(@sidebar).to include '<span class="badge">2</span>'
|
65
65
|
expect(@sidebar).to include '<span class="badge">15</span>'
|
66
66
|
expect(@sidebar).to include '<span class="badge">3</span>'
|
67
|
-
expect(@sidebar).to include '1 View'
|
68
|
-
expect(@sidebar).to include '3 Downloads'
|
67
|
+
expect(@sidebar).to include '<span class="badge-optional">1</span> View'
|
68
|
+
expect(@sidebar).to include '<span class="badge-optional">3</span> Downloads'
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should show the statistics before the profile" do
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'generic_files/_permission_form.html.erb', :type => :view do
|
4
|
+
let(:generic_file) {
|
5
|
+
stub_model(GenericFile, noid: '123',
|
6
|
+
depositor: 'bob',
|
7
|
+
resource_type: ['Dataset'])
|
8
|
+
}
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(controller).to receive(:current_user).and_return(stub_model(User))
|
12
|
+
allow(generic_file).to receive(:permissions).and_return([])
|
13
|
+
form_for(generic_file, url: '/update') do |f|
|
14
|
+
@f = f
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should draw the permissions form without error" do
|
19
|
+
render 'generic_files/permission_form.html.erb', f: @f
|
20
|
+
expect(rendered).to have_css("input#new_user_name_skel")
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -19,10 +19,15 @@ describe 'generic_files/edit.html.erb', :no_clean do
|
|
19
19
|
resource_type: ['Book', 'Dataset'])
|
20
20
|
}
|
21
21
|
|
22
|
+
let(:form) {
|
23
|
+
Sufia::Forms::GenericFileEditForm.new(generic_file)
|
24
|
+
}
|
25
|
+
|
22
26
|
before do
|
23
27
|
allow(generic_file).to receive(:content).and_return(content)
|
24
28
|
allow(controller).to receive(:current_user).and_return(stub_model(User))
|
25
29
|
assign(:generic_file, generic_file)
|
30
|
+
assign(:form, form)
|
26
31
|
assign(:version_list, version_list)
|
27
32
|
end
|
28
33
|
|
@@ -28,6 +28,10 @@ describe 'generic_files/show.html.erb', :type => :view do
|
|
28
28
|
subject: ['Biology', 'Physiology', 'Ethnography'])
|
29
29
|
end
|
30
30
|
|
31
|
+
let(:presenter) {
|
32
|
+
Sufia::GenericFilePresenter.new(generic_file)
|
33
|
+
}
|
34
|
+
|
31
35
|
before do
|
32
36
|
allow(generic_file).to receive(:content).and_return(content)
|
33
37
|
allow(controller).to receive(:current_user).and_return(depositor)
|
@@ -36,6 +40,7 @@ describe 'generic_files/show.html.erb', :type => :view do
|
|
36
40
|
allow(view).to receive(:blacklight_config).and_return(Blacklight::Configuration.new)
|
37
41
|
allow(view).to receive(:on_the_dashboard?).and_return(false)
|
38
42
|
assign(:generic_file, generic_file)
|
43
|
+
assign(:presenter, presenter)
|
39
44
|
assign(:events, [])
|
40
45
|
assign(:notify_number, 0)
|
41
46
|
end
|
@@ -56,7 +56,7 @@ module Sufia::GenericFile
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def update_metadata(attributes, visibility)
|
59
|
-
generic_file.attributes =
|
59
|
+
generic_file.attributes = attributes
|
60
60
|
update_visibility(visibility)
|
61
61
|
generic_file.date_modified = DateTime.now
|
62
62
|
remove_from_feature_works if generic_file.visibility_changed? && !generic_file.public?
|
@@ -8,12 +8,12 @@ class BatchUpdateJob
|
|
8
8
|
|
9
9
|
attr_accessor :login, :title, :file_attributes, :batch_id, :visibility, :saved, :denied
|
10
10
|
|
11
|
-
def initialize(login,
|
11
|
+
def initialize(login, batch_id, title, file_attributes, visibility)
|
12
12
|
self.login = login
|
13
|
-
self.title =
|
14
|
-
self.file_attributes =
|
15
|
-
self.visibility =
|
16
|
-
self.batch_id =
|
13
|
+
self.title = title || {}
|
14
|
+
self.file_attributes = file_attributes
|
15
|
+
self.visibility = visibility
|
16
|
+
self.batch_id = batch_id
|
17
17
|
self.saved = []
|
18
18
|
self.denied = []
|
19
19
|
end
|
@@ -10,6 +10,9 @@ class Batch < ActiveFedora::Base
|
|
10
10
|
property :status, predicate: ::RDF::DC.type
|
11
11
|
|
12
12
|
def self.find_or_create(id)
|
13
|
+
# FIXME potential race condition in this method. Consider that `find' may raise
|
14
|
+
# ObjectNotFound in multiple processes. However, Fedora should raise an error
|
15
|
+
# if we try to create two objects with the same id.
|
13
16
|
begin
|
14
17
|
Batch.find(id)
|
15
18
|
rescue ActiveFedora::ObjectNotFoundError
|
@@ -17,9 +20,10 @@ class Batch < ActiveFedora::Base
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
class << self
|
24
|
+
# override the default indexing service
|
25
|
+
def indexer
|
26
|
+
Sufia::IndexingService
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -5,41 +5,16 @@ module Sufia
|
|
5
5
|
include Sufia::ModelMethods
|
6
6
|
include Sufia::Noid
|
7
7
|
include Sufia::GenericFile::Permissions
|
8
|
-
include Sufia::GenericFile::WebForm # provides initialize_fields method
|
9
8
|
|
10
9
|
included do
|
11
10
|
before_save :update_permissions
|
12
11
|
validates :title, presence: true
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def terms_for_display
|
17
|
-
terms_for_editing - [:title, :description]
|
18
|
-
end
|
19
|
-
|
20
|
-
def terms_for_editing
|
21
|
-
[:resource_type, :title, :creator, :contributor, :description, :tag,
|
22
|
-
:rights, :publisher, :date_created, :subject, :language, :identifier,
|
23
|
-
:based_near, :related_url]
|
24
|
-
end
|
25
|
-
|
26
|
-
# Test to see if the given field is required
|
27
|
-
# @param [Symbol] key a field
|
28
|
-
# @return [Boolean] is it required or not
|
29
|
-
def required?(key)
|
30
|
-
self.class.validators_on(key).any?{|v| v.kind_of? ActiveModel::Validations::PresenceValidator}
|
31
12
|
end
|
32
13
|
|
33
14
|
def to_param
|
34
15
|
noid
|
35
16
|
end
|
36
17
|
|
37
|
-
def to_solr(solr_doc={})
|
38
|
-
super.tap do |solr_doc|
|
39
|
-
solr_doc[Solrizer.solr_name("noid", Sufia::GenericFile::Indexing.noid_indexer)] = noid
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
18
|
def update_permissions
|
44
19
|
self.visibility = "open"
|
45
20
|
end
|
@@ -50,5 +25,12 @@ module Sufia
|
|
50
25
|
members.reduce(0) { |sum, gf| sum + gf.file_size.first.to_i }
|
51
26
|
end
|
52
27
|
|
28
|
+
module ClassMethods
|
29
|
+
# override the default indexing service
|
30
|
+
def indexer
|
31
|
+
Sufia::IndexingService
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
53
35
|
end
|
54
36
|
end
|
@@ -9,7 +9,6 @@ module Sufia
|
|
9
9
|
include Sufia::GenericFile::Export
|
10
10
|
include Sufia::GenericFile::Characterization
|
11
11
|
include Sufia::GenericFile::Permissions
|
12
|
-
include Sufia::GenericFile::WebForm
|
13
12
|
include Sufia::GenericFile::Derivatives
|
14
13
|
include Sufia::GenericFile::Trophies
|
15
14
|
include Sufia::GenericFile::Featured
|
@@ -21,8 +21,8 @@ module Sufia
|
|
21
21
|
'%G' => [:language],
|
22
22
|
'%[' => [:date_modified],
|
23
23
|
'%9' => [:resource_type],
|
24
|
-
'%~' =>
|
25
|
-
'%W' => t('sufia.institution_name')
|
24
|
+
'%~' => I18n.t('sufia.product_name'),
|
25
|
+
'%W' => I18n.t('sufia.institution_name')
|
26
26
|
}
|
27
27
|
text = []
|
28
28
|
text << "%0 GenericFile"
|
@@ -3,19 +3,10 @@ module Sufia
|
|
3
3
|
module Indexing
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def to_solr(solr_doc={})
|
12
|
-
super.tap do |solr_doc|
|
13
|
-
solr_doc[Solrizer.solr_name('label')] = label
|
14
|
-
solr_doc[Solrizer.solr_name('noid', Sufia::GenericFile::Indexing.noid_indexer)] = noid
|
15
|
-
solr_doc[Solrizer.solr_name('file_format')] = file_format
|
16
|
-
solr_doc[Solrizer.solr_name('file_format', :facetable)] = file_format
|
17
|
-
solr_doc['all_text_timv'] = full_text.content
|
18
|
-
solr_doc = index_collection_ids(solr_doc)
|
6
|
+
module ClassMethods
|
7
|
+
# override the default indexing service
|
8
|
+
def indexer
|
9
|
+
Sufia::GenericFileIndexingService
|
19
10
|
end
|
20
11
|
end
|
21
12
|
end
|
@@ -5,7 +5,7 @@ module Sufia
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
|
8
|
-
property :label, predicate: ::RDF::
|
8
|
+
property :label, predicate: ActiveFedora::RDF::Fcrepo::Model.downloadFilename, multiple: false
|
9
9
|
|
10
10
|
property :depositor, predicate: ::RDF::URI.new("http://id.loc.gov/vocabulary/relators/dpt"), multiple: false do |index|
|
11
11
|
index.as :symbol, :stored_searchable
|
@@ -18,33 +18,50 @@ module Sufia::User
|
|
18
18
|
# Users should be followable
|
19
19
|
acts_as_followable
|
20
20
|
|
21
|
-
#
|
21
|
+
# Set up proxy-related relationships
|
22
22
|
has_many :proxy_deposit_requests, foreign_key: 'receiving_user_id'
|
23
|
-
|
24
23
|
has_many :deposit_rights_given, foreign_key: 'grantor_id', class_name: 'ProxyDepositRights', dependent: :destroy
|
25
24
|
has_many :can_receive_deposits_from, through: :deposit_rights_given, source: :grantee
|
26
|
-
|
27
25
|
has_many :deposit_rights_received, foreign_key: 'grantee_id', class_name: 'ProxyDepositRights', dependent: :destroy
|
28
26
|
has_many :can_make_deposits_for, through: :deposit_rights_received, source: :grantor
|
29
27
|
|
28
|
+
# Validate and normalize ORCIDs
|
29
|
+
validates_with OrcidValidator
|
30
|
+
after_validation :normalize_orcid
|
31
|
+
|
32
|
+
# Set up user profile avatars
|
30
33
|
mount_uploader :avatar, AvatarUploader, mount_on: :avatar_file_name
|
31
34
|
validates_with AvatarValidator
|
35
|
+
|
32
36
|
has_many :trophies
|
33
37
|
attr_accessor :update_directory
|
34
38
|
end
|
35
39
|
|
40
|
+
# Coerce the ORCID into URL format
|
41
|
+
def normalize_orcid
|
42
|
+
# Skip normalization if:
|
43
|
+
# 1. validation has already flagged the ORCID as invalid
|
44
|
+
# 2. the orcid field is blank
|
45
|
+
# 3. the orcid is already in its normalized form
|
46
|
+
return if self.errors[:orcid].first.present? || self.orcid.blank? || self.orcid.starts_with?('http://orcid.org/')
|
47
|
+
bare_orcid = /\d{4}-\d{4}-\d{4}-\d{4}/.match(self.orcid).string
|
48
|
+
self.orcid = "http://orcid.org/#{bare_orcid}"
|
49
|
+
end
|
50
|
+
|
36
51
|
# Format the json for select2 which requires just an id and a field called text.
|
37
52
|
# If we need an alternate format we should probably look at a json template gem
|
38
53
|
def as_json(opts = nil)
|
39
|
-
{id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key}
|
54
|
+
{ id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key }
|
40
55
|
end
|
41
56
|
|
42
57
|
def email_address
|
43
|
-
|
58
|
+
self.email
|
44
59
|
end
|
45
60
|
|
46
61
|
def name
|
47
|
-
|
62
|
+
self.display_name.titleize || raise
|
63
|
+
rescue
|
64
|
+
self.user_key
|
48
65
|
end
|
49
66
|
|
50
67
|
# Redefine this for more intuitive keys in Redis
|
@@ -61,7 +78,7 @@ module Sufia::User
|
|
61
78
|
|
62
79
|
# method needed for messaging
|
63
80
|
def mailboxer_email(obj=nil)
|
64
|
-
|
81
|
+
nil
|
65
82
|
end
|
66
83
|
|
67
84
|
# The basic groups method, override or will fallback to Sufia::Ldap::User
|
@@ -80,14 +97,6 @@ module Sufia::User
|
|
80
97
|
end
|
81
98
|
|
82
99
|
module ClassMethods
|
83
|
-
|
84
|
-
def permitted_attributes
|
85
|
-
[:email, :login, :display_name, :address, :admin_area,
|
86
|
-
:department, :title, :office, :chat_id, :website, :affiliation,
|
87
|
-
:telephone, :avatar, :group_list, :groups_last_update, :facebook_handle,
|
88
|
-
:twitter_handle, :googleplus_handle, :linkedin_handle, :remove_avatar]
|
89
|
-
end
|
90
|
-
|
91
100
|
def current
|
92
101
|
Thread.current[:user]
|
93
102
|
end
|
@@ -119,7 +128,5 @@ module Sufia::User
|
|
119
128
|
def from_url_component(component)
|
120
129
|
User.find_by_user_key(component.gsub(/-dot-/, '.'))
|
121
130
|
end
|
122
|
-
|
123
131
|
end
|
124
|
-
|
125
132
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Sufia
|
2
|
+
class OrcidValidator < ActiveModel::Validator
|
3
|
+
def validate(record)
|
4
|
+
return if record.orcid.blank?
|
5
|
+
record.errors.add(:orcid, 'must be a string of 19 characters, e.g., "0000-0000-0000-0000"') unless /\d{4}-\d{4}-\d{4}-\d{4}/.match(record.orcid)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Sufia
|
2
|
+
class GenericFileIndexingService < IndexingService
|
3
|
+
def generate_solr_document
|
4
|
+
super.tap do |solr_doc|
|
5
|
+
solr_doc[Solrizer.solr_name('label')] = object.label
|
6
|
+
solr_doc[Solrizer.solr_name('file_format')] = object.file_format
|
7
|
+
solr_doc[Solrizer.solr_name('file_format', :facetable)] = object.file_format
|
8
|
+
solr_doc['all_text_timv'] = object.full_text.content
|
9
|
+
solr_doc = object.index_collection_ids(solr_doc)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Sufia
|
2
|
+
class IndexingService < ActiveFedora::IndexingService
|
3
|
+
|
4
|
+
# Unstemmed, searchable, stored
|
5
|
+
def self.noid_indexer
|
6
|
+
@noid_indexer ||= Solrizer::Descriptor.new(:text, :indexed, :stored)
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate_solr_document
|
10
|
+
super.tap do |solr_doc|
|
11
|
+
solr_doc[Solrizer.solr_name("noid", Sufia::IndexingService.noid_indexer)] = object.noid
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'rails/generators'
|
3
|
+
require 'rails/generators/migration'
|
4
|
+
|
5
|
+
class Sufia::Models::AbstractMigrationGenerator < Rails::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
# Implement the required interface for Rails::Generators::Migration.
|
9
|
+
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
10
|
+
def self.next_migration_number(path)
|
11
|
+
if @prev_migration_nr
|
12
|
+
@prev_migration_nr += 1
|
13
|
+
else
|
14
|
+
if last_migration = Dir[File.join(path, '*.rb')].sort.last
|
15
|
+
@prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
|
16
|
+
else
|
17
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
18
|
+
end
|
19
|
+
end
|
20
|
+
@prev_migration_nr.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def better_migration_template(file)
|
26
|
+
migration_template "migrations/#{file}", "db/migrate/#{file}"
|
27
|
+
rescue Rails::Generators::Error => e
|
28
|
+
say_status("warning", e.message, :yellow)
|
29
|
+
end
|
30
|
+
end
|
@@ -1,32 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'rails/generators'
|
3
|
-
require 'rails/generators/migration'
|
4
|
-
|
5
|
-
class Sufia::Models::CachedStatsGenerator < Rails::Generators::Base
|
6
|
-
include Rails::Generators::Migration
|
1
|
+
require_relative 'abstract_migration_generator'
|
7
2
|
|
3
|
+
class Sufia::Models::CachedStatsGenerator < Sufia::Models::AbstractMigrationGenerator
|
8
4
|
source_root File.expand_path('../templates', __FILE__)
|
9
|
-
argument :model_name, type: :string , default: "user"
|
10
5
|
|
11
6
|
desc """
|
12
7
|
This generator adds the ability to cache usage stats to your application:
|
13
8
|
1. Creates several database migrations if they do not exist in /db/migrate
|
14
|
-
2. Adds stats methods to the user model
|
15
9
|
"""
|
16
|
-
# Implement the required interface for Rails::Generators::Migration.
|
17
|
-
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
18
|
-
def self.next_migration_number(path)
|
19
|
-
if @prev_migration_nr
|
20
|
-
@prev_migration_nr += 1
|
21
|
-
else
|
22
|
-
if last_migration = Dir[File.join(path, '*.rb')].sort.last
|
23
|
-
@prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
|
24
|
-
else
|
25
|
-
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
26
|
-
end
|
27
|
-
end
|
28
|
-
@prev_migration_nr.to_s
|
29
|
-
end
|
30
10
|
|
31
11
|
def banner
|
32
12
|
say_status("warning", "ADDING STATS CACHING-RELATED SUFIA MODELS", :yellow)
|
@@ -34,35 +14,11 @@ This generator adds the ability to cache usage stats to your application:
|
|
34
14
|
|
35
15
|
# Setup the database migrations
|
36
16
|
def copy_migrations
|
37
|
-
# Can't get this any more DRY, because we need this order.
|
38
17
|
[
|
39
18
|
'create_file_view_stats.rb',
|
40
|
-
'create_file_download_stats.rb'
|
41
|
-
'create_user_stats.rb'
|
19
|
+
'create_file_download_stats.rb'
|
42
20
|
].each do |file|
|
43
21
|
better_migration_template file
|
44
22
|
end
|
45
23
|
end
|
46
|
-
|
47
|
-
def add_stats_mixin_to_user_model
|
48
|
-
file_path = "app/models/#{model_name.underscore}.rb"
|
49
|
-
|
50
|
-
if File.exists?(file_path)
|
51
|
-
inject_into_file file_path, after: /include Sufia\:\:User.*$/ do
|
52
|
-
"\n include Sufia::UserUsageStats"
|
53
|
-
end
|
54
|
-
else
|
55
|
-
puts " \e[31mFailure\e[0m Sufia requires a user object. This generators assumes that the model is defined in the file #{file_path}, which does not exist. If you used a different name, please re-run the generator and provide that name as an argument. Such as \b rails -g sufia client"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def better_migration_template(file)
|
62
|
-
begin
|
63
|
-
migration_template "migrations/#{file}", "db/migrate/#{file}"
|
64
|
-
rescue Rails::Generators::Error => e
|
65
|
-
say_status("warning", e.message, :yellow)
|
66
|
-
end
|
67
|
-
end
|
68
24
|
end
|