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.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -2
  3. data/Gemfile +10 -1
  4. data/History.md +21 -0
  5. data/SUFIA_VERSION +1 -1
  6. data/app/assets/images/orcid.png +0 -0
  7. data/app/assets/javascripts/sufia.js +1 -1
  8. data/app/assets/javascripts/sufia/batch_edit.js +36 -54
  9. data/app/assets/javascripts/sufia/edit_metadata.js +10 -11
  10. data/app/assets/javascripts/sufia/permissions.js +2 -26
  11. data/app/assets/stylesheets/sufia.css.scss +10 -2
  12. data/app/assets/stylesheets/sufia/_batch-edit.scss +8 -6
  13. data/app/assets/stylesheets/sufia/_dashboard.scss +10 -0
  14. data/app/assets/stylesheets/sufia/_settings.scss +1 -0
  15. data/app/assets/stylesheets/sufia/_styles.scss +5 -3
  16. data/app/controllers/batch_controller.rb +9 -6
  17. data/app/controllers/batch_edits_controller.rb +2 -2
  18. data/app/controllers/collections_controller.rb +19 -3
  19. data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +30 -29
  20. data/app/controllers/concerns/sufia/breadcrumbs.rb +8 -3
  21. data/app/controllers/concerns/sufia/files_controller_behavior.rb +19 -7
  22. data/app/controllers/concerns/sufia/users_controller_behavior.rb +14 -2
  23. data/app/controllers/single_use_links_viewer_controller.rb +5 -1
  24. data/app/forms/sufia/forms/batch_edit_form.rb +6 -0
  25. data/app/forms/sufia/forms/collection_edit_form.rb +17 -0
  26. data/app/forms/sufia/forms/generic_file_edit_form.rb +16 -0
  27. data/app/helpers/generic_file_helper.rb +3 -47
  28. data/app/helpers/sufia/permissions_helper.rb +29 -0
  29. data/app/helpers/sufia/sufia_helper_behavior.rb +11 -0
  30. data/app/inputs/multi_value_with_help_input.rb +8 -0
  31. data/app/inputs/select_with_help_input.rb +3 -0
  32. data/app/inputs/select_with_modal_help_input.rb +36 -0
  33. data/app/inputs/with_help_icon.rb +32 -0
  34. data/app/models/concerns/sufia/solr_document_behavior.rb +1 -1
  35. data/app/presenters/sufia/collection_presenter.rb +29 -0
  36. data/app/presenters/sufia/generic_file_presenter.rb +14 -0
  37. data/app/presenters/sufia/presenter_renderer.rb +53 -0
  38. data/app/views/batch/_metadata.html.erb +10 -44
  39. data/app/views/batch/_more_metadata.html.erb +3 -2
  40. data/app/views/batch/edit.html.erb +2 -2
  41. data/app/views/batch_edits/edit.html.erb +13 -17
  42. data/app/views/collections/_form.html.erb +5 -5
  43. data/app/views/collections/_show_descriptions.html.erb +8 -10
  44. data/app/views/collections/edit.html.erb +8 -9
  45. data/app/views/collections/edit_fields/_description.html.erb +1 -2
  46. data/app/views/dashboard/_index_partials/_stats.html.erb +3 -3
  47. data/app/views/generic_files/_descriptions.html.erb +5 -8
  48. data/app/views/generic_files/_permission_form.html.erb +8 -17
  49. data/app/views/generic_files/_show_descriptions.html.erb +3 -4
  50. data/app/views/generic_files/edit.html.erb +1 -2
  51. data/app/views/generic_files/jq_upload.json.jbuilder +8 -0
  52. data/app/views/records/edit_fields/_default.html.erb +5 -10
  53. data/app/views/records/edit_fields/_description.html.erb +5 -10
  54. data/app/views/records/edit_fields/_resource_type.html.erb +2 -5
  55. data/app/views/records/edit_fields/_rights.html.erb +3 -9
  56. data/app/views/single_use_links_viewer/show.html.erb +10 -16
  57. data/app/views/users/_profile.html.erb +1 -2
  58. data/app/views/users/_user_info.html.erb +20 -3
  59. data/app/views/users/edit.html.erb +11 -2
  60. data/app/views/users/show.html.erb +1 -1
  61. data/config/locales/sufia.en.yml +46 -26
  62. data/config/routes.rb +1 -1
  63. data/lib/generators/sufia/install_generator.rb +4 -0
  64. data/lib/sufia.rb +4 -0
  65. data/lib/sufia/form_builder.rb +16 -0
  66. data/lib/sufia/version.rb +1 -1
  67. data/spec/actors/generic_file/actor_spec.rb +1 -2
  68. data/spec/controllers/batch_controller_spec.rb +16 -48
  69. data/spec/controllers/batch_edits_controller_spec.rb +27 -16
  70. data/spec/controllers/collections_controller_spec.rb +81 -61
  71. data/spec/controllers/generic_files_controller_spec.rb +17 -2
  72. data/spec/controllers/users_controller_spec.rb +13 -3
  73. data/spec/features/collection_spec.rb +93 -88
  74. data/spec/features/users_spec.rb +1 -1
  75. data/spec/forms/collection_edit_form_spec.rb +20 -0
  76. data/spec/forms/generic_file_edit_form_spec.rb +26 -0
  77. data/spec/helpers/generic_file_helper_spec.rb +33 -7
  78. data/spec/helpers/permissions_helper_spec.rb +21 -0
  79. data/spec/inputs/multi_value_with_help_input_spec.rb +25 -0
  80. data/spec/inputs/select_with_modal_help_input_spec.rb +21 -0
  81. data/spec/jobs/batch_update_job_spec.rb +11 -14
  82. data/spec/lib/sufia/breadcrumbs_spec.rb +46 -8
  83. data/spec/models/generic_file_spec.rb +0 -13
  84. data/spec/models/user_spec.rb +23 -0
  85. data/spec/presenters/presenter_renderer_spec.rb +19 -0
  86. data/spec/presenters/sufia/generic_file_presenter_spec.rb +12 -0
  87. data/spec/spec_helper.rb +5 -0
  88. data/spec/support/input_support.rb +12 -0
  89. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  90. data/spec/views/batch/edit.html.erb_spec.rb +13 -23
  91. data/spec/views/batch_edits/edit.html.erb_spec.rb +19 -0
  92. data/spec/views/collections/_form.html.erb_spec.rb +26 -28
  93. data/spec/views/collections/_show_descriptions.html.erb_spec.rb +15 -9
  94. data/spec/views/dashboard/index_spec.rb +2 -2
  95. data/spec/views/generic_file/_permission_form.html.erb_spec.rb +23 -0
  96. data/spec/views/generic_file/edit.html.erb_spec.rb +5 -0
  97. data/spec/views/generic_file/show.html.erb_spec.rb +5 -0
  98. data/sufia-models/app/actors/sufia/generic_file/actor.rb +1 -1
  99. data/sufia-models/app/jobs/batch_update_job.rb +5 -5
  100. data/sufia-models/app/models/batch.rb +7 -3
  101. data/sufia-models/app/models/concerns/sufia/collection.rb +7 -25
  102. data/sufia-models/app/models/concerns/sufia/generic_file.rb +0 -1
  103. data/sufia-models/app/models/concerns/sufia/generic_file/export.rb +2 -2
  104. data/sufia-models/app/models/concerns/sufia/generic_file/indexing.rb +4 -13
  105. data/sufia-models/app/models/concerns/sufia/generic_file/metadata.rb +1 -1
  106. data/sufia-models/app/models/concerns/sufia/user.rb +24 -17
  107. data/sufia-models/app/models/sufia/orcid_validator.rb +8 -0
  108. data/sufia-models/app/services/sufia/generic_file_indexing_service.rb +13 -0
  109. data/sufia-models/app/services/sufia/indexing_service.rb +15 -0
  110. data/sufia-models/lib/generators/sufia/models/abstract_migration_generator.rb +30 -0
  111. data/sufia-models/lib/generators/sufia/models/cached_stats_generator.rb +3 -47
  112. data/sufia-models/lib/generators/sufia/models/install_generator.rb +11 -31
  113. data/sufia-models/lib/generators/sufia/models/orcid_field_generator.rb +19 -0
  114. data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +2 -31
  115. data/sufia-models/lib/generators/sufia/models/templates/config/redis.yml +3 -0
  116. data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +3 -0
  117. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_orcid_to_users.rb +5 -0
  118. data/sufia-models/lib/generators/sufia/models/upgrade400_generator.rb +2 -33
  119. data/sufia-models/lib/generators/sufia/models/user_stats_generator.rb +31 -0
  120. data/sufia-models/lib/sufia/models/engine.rb +1 -0
  121. data/sufia-models/lib/sufia/models/version.rb +1 -1
  122. data/sufia-models/sufia-models.gemspec +5 -5
  123. data/sufia.gemspec +2 -3
  124. metadata +49 -39
  125. data/app/assets/javascripts/sufia/multiForm.js +0 -67
  126. data/app/helpers/records_helper.rb +0 -4
  127. data/app/helpers/sufia/records_helper_behavior.rb +0 -68
  128. data/app/views/batch_edits/update_edit.js.erb +0 -5
  129. data/app/views/collections/_edit_descriptions.html.erb +0 -18
  130. data/app/views/collections/edit_fields/_title.html.erb +0 -3
  131. data/app/views/generic_files/_field_form.html.erb +0 -20
  132. data/app/views/records/_edit_field.html.erb +0 -22
  133. data/app/views/records/edit_fields/_suffix.html.erb +0 -10
  134. data/app/views/records/edit_fields/_type.html.erb +0 -8
  135. data/app/views/users/_social_media_info.html.erb +0 -20
  136. data/spec/helpers/records_helper_spec.rb +0 -102
  137. data/spec/models/generic_file/web_form_spec.rb +0 -35
  138. data/sufia-models/app/models/concerns/sufia/generic_file/accessible_attributes.rb +0 -87
  139. 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
- @collection = mock_model(Collection)
7
- allow(view).to receive(:blacklight_config).and_return(Blacklight::Configuration.new)
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 modified'
17
- expect(rendered).to include('itemprop="date_modified"')
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 = generic_file.sanitize_attributes(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, params)
11
+ def initialize(login, batch_id, title, file_attributes, visibility)
12
12
  self.login = login
13
- self.title = params[:title] || {}
14
- self.file_attributes = params[:generic_file]
15
- self.visibility = params[:visibility]
16
- self.batch_id = params[: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
- def to_solr(solr_doc={})
21
- super.tap do |solr_doc|
22
- solr_doc[Solrizer.solr_name('noid', Sufia::GenericFile::Indexing.noid_indexer)] = noid
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
- '%~' => Application.config.application_name,
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
- # Unstemmed, searchable, stored
7
- def self.noid_indexer
8
- @noid_indexer ||= Solrizer::Descriptor.new(:text, :indexed, :stored)
9
- end
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::DC.title, multiple: false
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
- # Setup accessible (or protected) attributes for your model
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
- return self.email
58
+ self.email
44
59
  end
45
60
 
46
61
  def name
47
- return self.display_name.titleize || self.user_key rescue self.user_key
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
- return nil
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
- # -*- encoding : utf-8 -*-
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