sufia-models 6.0.0.rc2 → 6.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/actors/sufia/generic_file/actor.rb +12 -8
  3. data/app/jobs/batch_update_job.rb +2 -2
  4. data/app/jobs/import_url_job.rb +5 -3
  5. data/app/jobs/ingest_local_file_job.rb +46 -0
  6. data/app/jobs/resolrize_job.rb +1 -8
  7. data/app/models/batch.rb +0 -7
  8. data/app/models/concerns/sufia/ability.rb +1 -1
  9. data/app/models/concerns/sufia/{collection.rb → collection_behavior.rb} +1 -13
  10. data/app/models/concerns/sufia/generic_file/batches.rb +3 -4
  11. data/app/models/concerns/sufia/generic_file/export.rb +1 -1
  12. data/app/models/concerns/sufia/generic_file/featured.rb +1 -4
  13. data/app/models/concerns/sufia/generic_file/metadata.rb +7 -7
  14. data/app/models/concerns/sufia/generic_file/trophies.rb +1 -2
  15. data/app/models/concerns/sufia/generic_file/virus_check.rb +16 -11
  16. data/app/models/concerns/sufia/model_methods.rb +1 -14
  17. data/app/models/concerns/sufia/user.rb +5 -0
  18. data/app/models/file_usage.rb +1 -1
  19. data/app/models/file_view_stat.rb +1 -1
  20. data/app/models/sufia/collection.rb +5 -0
  21. data/app/services/sufia/generic_file_indexing_service.rb +1 -1
  22. data/app/services/sufia/id_service.rb +1 -2
  23. data/app/services/sufia/noid.rb +4 -24
  24. data/lib/generators/sufia/models/install_generator.rb +6 -1
  25. data/lib/generators/sufia/models/templates/app/models/collection.rb +2 -0
  26. data/lib/generators/sufia/models/templates/config/resque_config.rb +1 -1
  27. data/lib/generators/sufia/models/templates/config/solrconfig.xml +46 -0
  28. data/lib/generators/sufia/models/templates/config/sufia.rb +9 -5
  29. data/lib/generators/sufia/models/templates/migrations/add_external_key_to_content_blocks.rb +6 -0
  30. data/lib/generators/sufia/models/update_content_blocks_generator.rb +18 -0
  31. data/lib/sufia/messages.rb +11 -12
  32. data/lib/sufia/models/engine.rb +2 -1
  33. data/lib/sufia/models/stats/user_stat_importer.rb +9 -5
  34. data/lib/sufia/models/version.rb +1 -1
  35. data/sufia-models.gemspec +5 -5
  36. metadata +17 -20
  37. data/app/models/collection.rb +0 -3
  38. data/app/services/sufia/indexing_service.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61b522c3064c907375bcbad951e0878c3b692fac
4
- data.tar.gz: a4074b935257278771c9e4808d8c8dd5c87ebc48
3
+ metadata.gz: 51e106549a813b6bf42150ec4287e9579e171dad
4
+ data.tar.gz: 987fd56596a1da6b517205ddb9581b8c21fae645
5
5
  SHA512:
6
- metadata.gz: 73aacb00e97352fbaad299467c98ca52349d11b8070da097aa565403ebf46398e3550d97066b3242b56180d14b9604ef1ab76c6b5b1714cee03c3cec8789ad4b
7
- data.tar.gz: 3ae78655ec6badec1106aeebe2833729591744c877bd1571ed87da3314dfa4fc49fff1f0637dd303f34661778996ea6b33dc129475d3aa0156dd4ce12aefaf54
6
+ metadata.gz: c1fd765adfeacd91d0ccb197e4b9920f82d3ddf1aba32d1fabf0c403ea35eb0c6d28b3a7304e3b3850abf1a1ddec9c67b1076c764cf5e13b1388674cff138417
7
+ data.tar.gz: 3b399d52d64a204e6151833a0bb87bb22e61b50464767faba06e3d67084d6ddaa11acfe9abfd2047ec08b36251b372c059cabc0183fc6c7672421d292ca96943
@@ -15,8 +15,9 @@ module Sufia::GenericFile
15
15
  # create_metadata(batch_id) { |gf| gf.save }
16
16
  def create_metadata(batch_id)
17
17
  generic_file.apply_depositor_metadata(user)
18
- generic_file.date_uploaded = Date.today
19
- generic_file.date_modified = Date.today
18
+ time_in_utc = DateTime.now.new_offset(0)
19
+ generic_file.date_uploaded = time_in_utc
20
+ generic_file.date_modified = time_in_utc
20
21
  generic_file.creator = [user.name]
21
22
 
22
23
  if batch_id
@@ -27,8 +28,10 @@ module Sufia::GenericFile
27
28
  yield(generic_file) if block_given?
28
29
  end
29
30
 
30
- def create_content(file, file_name, dsid)
31
- generic_file.add_file(file, dsid, file_name.truncate(255))
31
+ def create_content(file, file_name, path, mime_type)
32
+ generic_file.add_file(file, path: path, original_name: file_name, mime_type: mime_type)
33
+ generic_file.label ||= file_name
34
+ generic_file.title = [file_name] if generic_file.title.blank?
32
35
  save_characterize_and_record_committer do
33
36
  if Sufia.config.respond_to?(:after_create_content)
34
37
  Sufia.config.after_create_content.call(generic_file, user)
@@ -46,8 +49,8 @@ module Sufia::GenericFile
46
49
  end
47
50
  end
48
51
 
49
- def update_content(file, datastream_id)
50
- generic_file.add_file(file, datastream_id, file.original_filename)
52
+ def update_content(file, path)
53
+ generic_file.add_file(file, path: path, original_name: file.original_filename, mime_type: file.content_type)
51
54
  save_characterize_and_record_committer do
52
55
  if Sufia.config.respond_to?(:after_update_content)
53
56
  Sufia.config.after_update_content.call(generic_file, user)
@@ -83,6 +86,7 @@ module Sufia::GenericFile
83
86
  end
84
87
 
85
88
  # Takes an optional block and executes the block if the save was successful.
89
+ # returns false if the save was unsuccessful
86
90
  def save_and_record_committer
87
91
  save_tries = 0
88
92
  begin
@@ -124,10 +128,10 @@ module Sufia::GenericFile
124
128
  end
125
129
 
126
130
  private
131
+
127
132
  def remove_from_feature_works
128
- featured_work = FeaturedWork.find_by_generic_file_id(generic_file.noid)
133
+ featured_work = FeaturedWork.find_by_generic_file_id(generic_file.id)
129
134
  featured_work.destroy unless featured_work.nil?
130
135
  end
131
-
132
136
  end
133
137
  end
@@ -61,12 +61,12 @@ class BatchUpdateJob
61
61
  end
62
62
 
63
63
  def send_user_success_message user, batch
64
- message = saved.count > 1 ? multiple_success(batch.noid, saved) : single_success(batch.noid, saved.first)
64
+ message = saved.count > 1 ? multiple_success(batch.id, saved) : single_success(batch.id, saved.first)
65
65
  User.batchuser.send_message(user, message, success_subject, sanitize_text = false)
66
66
  end
67
67
 
68
68
  def send_user_failure_message user, batch
69
- message = denied.count > 1 ? multiple_failure(batch.noid, denied) : single_failure(batch.noid, denied.first)
69
+ message = denied.count > 1 ? multiple_failure(batch.id, denied) : single_failure(batch.id, denied.first)
70
70
  User.batchuser.send_message(user, message, failure_subject, sanitize_text = false)
71
71
  end
72
72
  end
@@ -12,9 +12,9 @@ class ImportUrlJob < ActiveFedoraPidBasedJob
12
12
  user = User.find_by_user_key(generic_file.depositor)
13
13
 
14
14
  Tempfile.open(pid.gsub('/', '_')) do |f|
15
- path = copy_remote_file(generic_file.import_url, f)
15
+ path, mime_type = copy_remote_file(generic_file.import_url, f)
16
16
  # attach downloaded file to generic file stubbed out
17
- if Sufia::GenericFile::Actor.new(generic_file, user).create_content(f, path, 'content')
17
+ if Sufia::GenericFile::Actor.new(generic_file, user).create_content(f, path, 'content', mime_type)
18
18
  # add message to user for downloaded file
19
19
  message = "The file (#{generic_file.label}) was successfully imported."
20
20
  job_user.send_message(user, message, 'File Import')
@@ -31,9 +31,11 @@ class ImportUrlJob < ActiveFedoraPidBasedJob
31
31
  http = Net::HTTP.new(uri.host, uri.port)
32
32
  http.use_ssl = uri.scheme == "https" # enable SSL/TLS
33
33
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
34
+ mime_type = nil
34
35
 
35
36
  http.start do
36
37
  http.request_get(uri.request_uri) do |resp|
38
+ mime_type = resp.content_type
37
39
  resp.read_body do |segment|
38
40
  f.write(segment)
39
41
  end
@@ -41,7 +43,7 @@ class ImportUrlJob < ActiveFedoraPidBasedJob
41
43
  end
42
44
 
43
45
  f.rewind
44
- uri.path
46
+ return uri.path, mime_type
45
47
  end
46
48
 
47
49
  def job_user
@@ -0,0 +1,46 @@
1
+ class IngestLocalFileJob
2
+ attr_accessor :directory, :filename, :user_key, :generic_file_id
3
+
4
+ def queue_name
5
+ :ingest
6
+ end
7
+
8
+ def initialize(generic_file_id, directory, filename, user_key)
9
+ self.generic_file_id = generic_file_id
10
+ self.directory = directory
11
+ self.filename = filename
12
+ self.user_key = user_key
13
+ end
14
+
15
+ #TODO this should use Actor#create_content
16
+ def run
17
+ user = User.find_by_user_key(user_key)
18
+ raise "Unable to find user for #{user_key}" unless user
19
+ generic_file = GenericFile.find(generic_file_id)
20
+ path = File.join(directory, filename)
21
+
22
+ actor = Sufia::GenericFile::Actor.new(generic_file, user)
23
+
24
+ if actor.create_content(File.open(path), filename, 'content', mime_type(filename))
25
+ FileUtils.rm(path)
26
+ Sufia.queue.push(ContentDepositEventJob.new(generic_file.id, user_key))
27
+
28
+ message = "The file (#{File.basename(filename)}) was successfully deposited."
29
+ subject = 'Local file ingest'
30
+ else
31
+ message = "There was a problem depositing #{File.basename(filename)}. Please contact a system admin."
32
+ subject = 'Local file ingest error'
33
+ end
34
+
35
+ job_user.send_message(user, message, subject)
36
+ end
37
+
38
+ def job_user
39
+ User.batchuser
40
+ end
41
+
42
+ def mime_type(file_name)
43
+ mime_types = MIME::Types.of(file_name)
44
+ mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
45
+ end
46
+ end
@@ -4,13 +4,6 @@ class ResolrizeJob
4
4
  end
5
5
 
6
6
  def run
7
- require 'active_fedora/version'
8
- active_fedora_version = Gem::Version.new(ActiveFedora::VERSION)
9
- minimum_feature_version = Gem::Version.new('6.4.4')
10
- if active_fedora_version >= minimum_feature_version
11
- ActiveFedora::Base.reindex_everything("pid~#{Sufia.config.id_namespace}:*")
12
- else
13
- ActiveFedora::Base.reindex_everything
14
- end
7
+ ActiveFedora::Base.reindex_everything
15
8
  end
16
9
  end
data/app/models/batch.rb CHANGED
@@ -19,11 +19,4 @@ class Batch < ActiveFedora::Base
19
19
  Batch.create(id: id)
20
20
  end
21
21
  end
22
-
23
- class << self
24
- # override the default indexing service
25
- def indexer
26
- Sufia::IndexingService
27
- end
28
- end
29
22
  end
@@ -37,7 +37,7 @@ module Sufia
37
37
  def editor_abilities
38
38
  if user_groups.include? 'admin'
39
39
  can :create, TinymceAsset
40
- can :update, ContentBlock
40
+ can [:create, :update], ContentBlock
41
41
  end
42
42
  end
43
43
 
@@ -1,5 +1,5 @@
1
1
  module Sufia
2
- module Collection
2
+ module CollectionBehavior
3
3
  extend ActiveSupport::Concern
4
4
  include Hydra::Collection
5
5
  include Sufia::ModelMethods
@@ -11,10 +11,6 @@ module Sufia
11
11
  validates :title, presence: true
12
12
  end
13
13
 
14
- def to_param
15
- noid
16
- end
17
-
18
14
  def update_permissions
19
15
  self.visibility = "open"
20
16
  end
@@ -24,13 +20,5 @@ module Sufia
24
20
  def bytes
25
21
  members.reduce(0) { |sum, gf| sum + gf.file_size.first.to_i }
26
22
  end
27
-
28
- module ClassMethods
29
- # override the default indexing service
30
- def indexer
31
- Sufia::IndexingService
32
- end
33
- end
34
-
35
23
  end
36
24
  end
@@ -11,16 +11,15 @@ module Sufia
11
11
  # to each file when it is done uploading. The Batch object is not created
12
12
  # until all objects are done uploading and the user is redirected to
13
13
  # BatchController#edit. Therefore, we must handle the case where
14
- # self.batch_id is set but self.batch returns nil.
14
+ # batch_id is set but batch returns nil.
15
15
  def related_files
16
- return [] if batch.nil?
16
+ return [] unless batch
17
17
  batch.generic_files.reject { |sibling| sibling.id == id }
18
18
  end
19
19
 
20
20
  # Is this file in the middle of being processed by a batch?
21
21
  def processing?
22
- return false if self.batch.blank? || !self.batch.methods.include?(:status)
23
- (!self.batch.status.empty?) && (self.batch.status.count == 1) && (self.batch.status[0] == "processing")
22
+ try(:batch).try(:status) == ['processing'.freeze]
24
23
  end
25
24
 
26
25
  end
@@ -42,7 +42,7 @@ module Sufia
42
42
  end
43
43
 
44
44
  def persistent_url
45
- "#{Sufia.config.persistent_hostpath}#{noid}"
45
+ "#{Sufia.config.persistent_hostpath}#{id}"
46
46
  end
47
47
 
48
48
  # MIME type: 'application/x-openurl-ctx-kev'
@@ -3,12 +3,9 @@ module Sufia
3
3
  module Featured
4
4
  extend ActiveSupport::Concern
5
5
 
6
-
7
6
  def featured?
8
- FeaturedWork.where(generic_file_id: noid).exists?
7
+ FeaturedWork.where(generic_file_id: id).exists?
9
8
  end
10
-
11
9
  end
12
10
  end
13
11
  end
14
-
@@ -46,10 +46,17 @@ module Sufia
46
46
  property :date_created, predicate: ::RDF::DC.created do |index|
47
47
  index.as :stored_searchable
48
48
  end
49
+
50
+ # We reserve date_uploaded for the original creation date of the record.
51
+ # For example, when migrating data from a fedora3 repo to fedora4,
52
+ # fedora's system created date will reflect the date when the record
53
+ # was created in fedora4, but the date_uploaded will preserve the
54
+ # original creation date from the old repository.
49
55
  property :date_uploaded, predicate: ::RDF::DC.dateSubmitted, multiple: false do |index|
50
56
  index.type :date
51
57
  index.as :stored_sortable
52
58
  end
59
+
53
60
  property :date_modified, predicate: ::RDF::DC.modified, multiple: false do |index|
54
61
  index.type :date
55
62
  index.as :stored_sortable
@@ -86,13 +93,6 @@ module Sufia
86
93
  end
87
94
  end
88
95
 
89
- # Add a schema.org itemtype
90
- def itemtype
91
- # Look up the first non-empty resource type value in a hash from the config
92
- Sufia.config.resource_types_to_schema[resource_type.to_a.reject { |type| type.empty? }.first] || 'http://schema.org/CreativeWork'
93
- rescue
94
- 'http://schema.org/CreativeWork'
95
- end
96
96
  end
97
97
  end
98
98
  end
@@ -7,9 +7,8 @@ module Sufia
7
7
  end
8
8
 
9
9
  def cleanup_trophies
10
- Trophy.destroy_all(generic_file_id: self.noid)
10
+ Trophy.destroy_all(generic_file_id: self.id)
11
11
  end
12
-
13
12
  end
14
13
  end
15
14
  end
@@ -10,23 +10,28 @@ module Sufia
10
10
  # Default behavior is to raise a validation error and halt the save if a virus is found
11
11
  def detect_viruses
12
12
  return unless content.changed?
13
- path = if content.content.respond_to?(:path)
14
- content.content.path
15
- else
16
- Tempfile.open('') do |t|
17
- t.binmode
18
- t.write(content.content)
19
- t.close
20
- t.path
21
- end
22
- end
23
- Sufia::GenericFile::Actor.virus_check(path)
13
+ Sufia::GenericFile::Actor.virus_check(local_path_for_content)
24
14
  true
25
15
  rescue Sufia::VirusFoundError => virus
26
16
  logger.warn(virus.message)
27
17
  errors.add(:base, virus.message)
28
18
  false
29
19
  end
20
+
21
+ private
22
+
23
+ def local_path_for_content
24
+ if content.content.respond_to?(:path)
25
+ content.content.path
26
+ else
27
+ Tempfile.open('') do |t|
28
+ t.binmode
29
+ t.write(content.content)
30
+ t.close
31
+ t.path
32
+ end
33
+ end
34
+ end
30
35
  end
31
36
  end
32
37
  end
@@ -3,20 +3,7 @@ module Sufia
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- include Hydra::ModelMethods
7
- end
8
-
9
- # OVERRIDE to support Hydra::Datastream::Properties which does not
10
- # respond to :depositor_values but :depositor
11
- # Adds metadata about the depositor to the asset and ads +depositor_id+ to
12
- # its individual edit permissions.
13
- def apply_depositor_metadata(depositor)
14
- depositor_id = depositor.respond_to?(:user_key) ? depositor.user_key : depositor
15
-
16
- self.edit_users += [depositor_id]
17
- self.depositor = depositor_id
18
-
19
- return true
6
+ include Hydra::WithDepositor
20
7
  end
21
8
 
22
9
  def to_s
@@ -54,6 +54,11 @@ module Sufia::User
54
54
  { id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key }
55
55
  end
56
56
 
57
+ # Populate user instance with attributes from remote system (e.g., LDAP)
58
+ # There is no default implementation -- override this in your application
59
+ def populate_attributes
60
+ end
61
+
57
62
  def email_address
58
63
  self.email
59
64
  end
@@ -8,7 +8,7 @@ class FileUsage
8
8
  user_id = user ? user.id : nil
9
9
 
10
10
  self.id = id
11
- self.path = Sufia::Engine.routes.url_helpers.generic_file_path(Sufia::Noid.noidify(id))
11
+ self.path = Sufia::Engine.routes.url_helpers.generic_file_path(id)
12
12
  earliest = Sufia.config.analytic_start_date
13
13
  self.created = ::GenericFile.find(id).create_date
14
14
  self.created = earliest > created ? earliest : created unless earliest.blank?
@@ -12,7 +12,7 @@ class FileViewStat < ActiveRecord::Base
12
12
  # Sufia::Download is sent to Sufia::Analytics.profile as #sufia__download
13
13
  # see Legato::ProfileMethods.method_name_from_klass
14
14
  def self.ga_statistics start_date, file_id
15
- path = Sufia::Engine.routes.url_helpers.generic_file_path(Sufia::Noid.noidify(file_id))
15
+ path = Sufia::Engine.routes.url_helpers.generic_file_path(file_id)
16
16
  Sufia::Analytics.profile.sufia__pageview(sort: 'date', start_date: start_date).for_path(path)
17
17
  end
18
18
  end
@@ -0,0 +1,5 @@
1
+ module Sufia
2
+ class Collection < ActiveFedora::Base
3
+ include Sufia::CollectionBehavior
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Sufia
2
- class GenericFileIndexingService < IndexingService
2
+ class GenericFileIndexingService < ActiveFedora::IndexingService
3
3
  def generate_solr_document
4
4
  super.tap do |solr_doc|
5
5
  solr_doc[Solrizer.solr_name('label')] = object.label
@@ -9,12 +9,11 @@ module Sufia
9
9
 
10
10
  @minter = ::Noid::Minter.new(template: noid_template)
11
11
  @pid = $$
12
- #@namespace = Sufia.config.id_namespace
13
12
  @semaphore = Mutex.new
14
13
  def self.valid?(identifier)
15
14
  # remove the fedora namespace since it's not part of the noid
16
15
  noid = identifier#.split(":").last
17
- return @minter.valid? noid
16
+ @minter.valid? noid
18
17
  end
19
18
  def self.mint
20
19
  @semaphore.synchronize do
@@ -3,40 +3,20 @@ module Sufia
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  ## This overrides the default behavior, which is to ask Fedora for a pid
6
- # @see ActiveFedora::Sharding.assign_pid
7
- def assign_pid
8
- Sufia::IdService.mint
6
+ # @see ActiveFedora::Persistence.assign_id
7
+ def assign_id
8
+ Sufia::IdService.mint if Sufia.config.enable_noids
9
9
  end
10
10
 
11
- def noid
12
- Noid.noidify(id)
13
- end
14
-
15
- # Redefine this for more intuitive keys in Redis
16
11
  def to_param
17
- noid
12
+ id
18
13
  end
19
14
 
20
15
  class << self
21
- def noidify(identifier)
22
- String(identifier).split(":").last
23
- end
24
-
25
16
  # Create a pairtree like path for the given identifier
26
17
  def treeify(identifier)
27
18
  (identifier.scan(/..?/).first(4) + [identifier]).join('/')
28
19
  end
29
-
30
- def namespaceize(identifier)
31
- return identifier if identifier.include?(':')
32
- "#{namespace}:#{identifier}"
33
- end
34
-
35
- protected
36
-
37
- def namespace
38
- Sufia.config.id_namespace
39
- end
40
20
  end
41
21
  end
42
22
  end
@@ -37,7 +37,8 @@ This generator makes the following changes to your application:
37
37
  'add_linkedin_to_users.rb',
38
38
  'create_tinymce_assets.rb',
39
39
  'create_content_blocks.rb',
40
- 'create_featured_works.rb'
40
+ 'create_featured_works.rb',
41
+ 'add_external_key_to_content_blocks.rb'
41
42
  ].each do |file|
42
43
  better_migration_template file
43
44
  end
@@ -67,6 +68,10 @@ This generator makes the following changes to your application:
67
68
  copy_file 'config/resque_config.rb', 'config/initializers/resque_config.rb'
68
69
  end
69
70
 
71
+ def create_collection
72
+ copy_file 'app/models/collection.rb', 'app/models/collection.rb'
73
+ end
74
+
70
75
  def install_mailboxer
71
76
  generate "mailboxer:install"
72
77
  end
@@ -0,0 +1,2 @@
1
+ class Collection < Sufia::Collection
2
+ end
@@ -2,4 +2,4 @@ config = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'redis.yml')
2
2
  Resque.redis = Redis.new(host: config[:host], port: config[:port], thread_safe: true)
3
3
 
4
4
  Resque.inline = Rails.env.test?
5
- Resque.redis.namespace = "#{Sufia.config.id_namespace}:#{Rails.env}"
5
+ Resque.redis.namespace = "#{Sufia.config.redis_namespace}:#{Rails.env}"
@@ -18,6 +18,52 @@
18
18
 
19
19
  <dataDir>${solr.data.dir:}</dataDir>
20
20
 
21
+ <!-- The default high-performance update handler -->
22
+ <updateHandler class="solr.DirectUpdateHandler2">
23
+
24
+ <!-- Enables a transaction log, used for real-time get, durability, and
25
+ and solr cloud replica recovery. The log can grow as big as
26
+ uncommitted changes to the index, so use of a hard autoCommit
27
+ is recommended (see below).
28
+ "dir" - the target directory for transaction logs, defaults to the
29
+ solr data directory. -->
30
+ <updateLog>
31
+ <str name="dir">${solr.ulog.dir:}</str>
32
+ </updateLog>
33
+
34
+ <!-- AutoCommit
35
+ Perform a hard commit automatically under certain conditions.
36
+ Instead of enabling autoCommit, consider using "commitWithin"
37
+ when adding documents.
38
+ http://wiki.apache.org/solr/UpdateXmlMessages
39
+ maxDocs - Maximum number of documents to add since the last
40
+ commit before automatically triggering a new commit.
41
+ maxTime - Maximum amount of time in ms that is allowed to pass
42
+ since a document was added before automatically
43
+ triggering a new commit.
44
+ openSearcher - if false, the commit causes recent index changes
45
+ to be flushed to stable storage, but does not cause a new
46
+ searcher to be opened to make those changes visible.
47
+ If the updateLog is enabled, then it's highly recommended to
48
+ have some sort of hard autoCommit to limit the log size.
49
+ -->
50
+ <autoCommit>
51
+ <maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
52
+ <openSearcher>false</openSearcher>
53
+ </autoCommit>
54
+
55
+ <!-- softAutoCommit is like autoCommit except it causes a
56
+ 'soft' commit which only ensures that changes are visible
57
+ but does not ensure that data is synced to disk. This is
58
+ faster and more near-realtime friendly than a hard commit.
59
+ -->
60
+
61
+ <autoSoftCommit>
62
+ <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
63
+ </autoSoftCommit>
64
+
65
+ </updateHandler>
66
+
21
67
  <requestHandler name="search" class="solr.SearchHandler" default="true">
22
68
  <!-- default values for query parameters can be specified, these
23
69
  will be overridden by parameters in the request
@@ -6,9 +6,6 @@ Sufia.config do |config|
6
6
  file_author: :creator
7
7
  }
8
8
 
9
- # Specify a different template for your repositories unique identifiers
10
- # config.noid_template = ".reeddeeddk"
11
-
12
9
  config.max_days_between_audits = 7
13
10
 
14
11
  config.max_notifications_for_dashboard = 5
@@ -105,8 +102,15 @@ Sufia.config do |config|
105
102
  # If you have ffmpeg installed and want to transcode audio and video uncomment this line
106
103
  # config.enable_ffmpeg = true
107
104
 
108
- # Specify the Fedora pid prefix:
109
- # config.id_namespace = "sufia"
105
+ # Sufia uses NOIDs for files and collections instead of Fedora UUIDs
106
+ # where NOID = 10-character string and UUID = 32-character string w/ hyphens
107
+ # config.enable_noids = true
108
+
109
+ # Specify a different template for your repository's NOID IDs
110
+ # config.noid_template = ".reeddeeddk"
111
+
112
+ # Specify the prefix for Redis keys:
113
+ # config.redis_namespace = "sufia"
110
114
 
111
115
  # Specify the path to the file characterization tool:
112
116
  # config.fits_path = "fits.sh"
@@ -0,0 +1,6 @@
1
+ class AddExternalKeyToContentBlocks < ActiveRecord::Migration
2
+ def change
3
+ add_column :content_blocks, :external_key, :string
4
+ remove_index :content_blocks, :name
5
+ end
6
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'abstract_migration_generator'
2
+
3
+ class Sufia::Models::UpdateContentBlocksGenerator < Sufia::Models::AbstractMigrationGenerator
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ desc """
7
+ This generator creates a database migration to add an external_key column to the content_blocks table (if the migration doesn't already exist). This allows you to associate a user_key with a featured_researcher entry.
8
+ """
9
+
10
+ def banner
11
+ say_status("warning", "CREATING MIGRATION FILE", :yellow)
12
+ end
13
+
14
+ def copy_migrations
15
+ better_migration_template 'add_external_key_to_content_blocks.rb'
16
+ end
17
+
18
+ end
@@ -46,22 +46,21 @@ module Sufia
46
46
  end
47
47
 
48
48
  def link_to_file file
49
- link_to(file.to_s, Sufia::Engine.routes.url_helpers.generic_file_path(file.noid))
49
+ link_to(file.to_s, Sufia::Engine.routes.url_helpers.generic_file_path(file))
50
50
  end
51
51
 
52
52
  private
53
53
 
54
- def success_link files
55
- link_to I18n.t("sufia.messages.success.multiple.link"), "#",
56
- rel: "popover",
57
- data: { content: file_list(files).html_safe, title: I18n.t("sufia.messages.success.title") }
58
- end
59
-
60
- def failure_link files
61
- link_to I18n.t("sufia.messages.failure.multiple.link"), "#",
62
- rel: "popover",
63
- data: { content: file_list(files).html_safe, title: I18n.t("sufia.messages.failure.title") }
64
- end
54
+ def success_link files
55
+ link_to I18n.t("sufia.messages.success.multiple.link"), "#",
56
+ rel: "popover",
57
+ data: { content: file_list(files).html_safe, title: I18n.t("sufia.messages.success.title") }
58
+ end
65
59
 
60
+ def failure_link files
61
+ link_to I18n.t("sufia.messages.failure.multiple.link"), "#",
62
+ rel: "popover",
63
+ data: { content: file_list(files).html_safe, title: I18n.t("sufia.messages.failure.title") }
64
+ end
66
65
  end
67
66
  end
@@ -18,8 +18,9 @@ module Sufia
18
18
  config.ffmpeg_path = 'ffmpeg'
19
19
  config.fits_message_length = 5
20
20
  config.temp_file_base = nil
21
+ config.enable_noids = true
21
22
  config.minter_statefile = '/tmp/minter-state'
22
- config.id_namespace = "sufia"
23
+ config.redis_namespace = "sufia"
23
24
  config.fits_path = "fits.sh"
24
25
  config.enable_contact_form_delivery = false
25
26
  config.browse_everything = nil
@@ -12,11 +12,11 @@ module Sufia
12
12
  start_date = date_since_last_cache(user)
13
13
 
14
14
  stats = {}
15
- files_for_user(user).each do |file|
16
- view_stats = FileViewStat.statistics(file.id, start_date, user.id)
15
+ file_ids_for_user(user).each do |file_id|
16
+ view_stats = FileViewStat.statistics(file_id, start_date, user.id)
17
17
  stats = tally_results(view_stats, :views, stats)
18
18
 
19
- dl_stats = FileDownloadStat.statistics(file.id, start_date, user.id)
19
+ dl_stats = FileDownloadStat.statistics(file_id, start_date, user.id)
20
20
  stats = tally_results(dl_stats, :downloads, stats)
21
21
  end
22
22
 
@@ -38,8 +38,12 @@ private
38
38
  end
39
39
  end
40
40
 
41
- def files_for_user(user)
42
- ::GenericFile.where(Solrizer.solr_name('depositor', :symbol) => user.user_key)
41
+ def file_ids_for_user(user)
42
+ ids = []
43
+ ::GenericFile.find_in_batches("#{Solrizer.solr_name('depositor', :symbol)}:\"#{user.user_key}\"", fl:"id") do |group|
44
+ ids.concat group.map { |doc| doc["id"] }
45
+ end
46
+ ids
43
47
  end
44
48
 
45
49
  # For each date, add the view and download counts for this
@@ -1,5 +1,5 @@
1
1
  module Sufia
2
2
  module Models
3
- VERSION = "6.0.0.rc2"
3
+ VERSION = "6.0.0.rc3"
4
4
  end
5
5
  end
data/sufia-models.gemspec CHANGED
@@ -26,13 +26,13 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "bundler", "~> 1.3"
27
27
  spec.add_development_dependency "rake", "~> 10.3"
28
28
 
29
- spec.add_dependency 'rails', '~> 4.0', '< 5.0.0'
29
+ spec.add_dependency 'rails', '~> 4.0'
30
30
  spec.add_dependency 'activeresource', "~> 4.0" # No longer a dependency of rails 4.0
31
31
 
32
- spec.add_dependency "hydra-head", "~> 9.0.0.rc3"
33
- spec.add_dependency "active-fedora", "~> 9.0.0.rc3"
34
- spec.add_dependency "hydra-collections", "~> 4.0.0.rc2"
35
- spec.add_dependency 'hydra-derivatives', '~> 1.0.0.rc1'
32
+ spec.add_dependency "hydra-head", "~> 9.0"
33
+ spec.add_dependency "active-fedora", "~> 9.0"
34
+ spec.add_dependency "hydra-collections", "~> 4.0"
35
+ spec.add_dependency 'hydra-derivatives', '~> 1.0'
36
36
  spec.add_dependency 'nest', '~> 1.1'
37
37
  spec.add_dependency 'resque', '~> 1.23'
38
38
  spec.add_dependency 'resque-pool', '~> 0.3'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sufia-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.rc2
4
+ version: 6.0.0.rc3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Friesen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-16 00:00:00.000000000 Z
11
+ date: 2015-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -45,9 +45,6 @@ dependencies:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '4.0'
48
- - - "<"
49
- - !ruby/object:Gem::Version
50
- version: 5.0.0
51
48
  type: :runtime
52
49
  prerelease: false
53
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -55,9 +52,6 @@ dependencies:
55
52
  - - "~>"
56
53
  - !ruby/object:Gem::Version
57
54
  version: '4.0'
58
- - - "<"
59
- - !ruby/object:Gem::Version
60
- version: 5.0.0
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: activeresource
63
57
  requirement: !ruby/object:Gem::Requirement
@@ -78,56 +72,56 @@ dependencies:
78
72
  requirements:
79
73
  - - "~>"
80
74
  - !ruby/object:Gem::Version
81
- version: 9.0.0.rc3
75
+ version: '9.0'
82
76
  type: :runtime
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
80
  - - "~>"
87
81
  - !ruby/object:Gem::Version
88
- version: 9.0.0.rc3
82
+ version: '9.0'
89
83
  - !ruby/object:Gem::Dependency
90
84
  name: active-fedora
91
85
  requirement: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - "~>"
94
88
  - !ruby/object:Gem::Version
95
- version: 9.0.0.rc3
89
+ version: '9.0'
96
90
  type: :runtime
97
91
  prerelease: false
98
92
  version_requirements: !ruby/object:Gem::Requirement
99
93
  requirements:
100
94
  - - "~>"
101
95
  - !ruby/object:Gem::Version
102
- version: 9.0.0.rc3
96
+ version: '9.0'
103
97
  - !ruby/object:Gem::Dependency
104
98
  name: hydra-collections
105
99
  requirement: !ruby/object:Gem::Requirement
106
100
  requirements:
107
101
  - - "~>"
108
102
  - !ruby/object:Gem::Version
109
- version: 4.0.0.rc2
103
+ version: '4.0'
110
104
  type: :runtime
111
105
  prerelease: false
112
106
  version_requirements: !ruby/object:Gem::Requirement
113
107
  requirements:
114
108
  - - "~>"
115
109
  - !ruby/object:Gem::Version
116
- version: 4.0.0.rc2
110
+ version: '4.0'
117
111
  - !ruby/object:Gem::Dependency
118
112
  name: hydra-derivatives
119
113
  requirement: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - "~>"
122
116
  - !ruby/object:Gem::Version
123
- version: 1.0.0.rc1
117
+ version: '1.0'
124
118
  type: :runtime
125
119
  prerelease: false
126
120
  version_requirements: !ruby/object:Gem::Requirement
127
121
  requirements:
128
122
  - - "~>"
129
123
  - !ruby/object:Gem::Version
130
- version: 1.0.0.rc1
124
+ version: '1.0'
131
125
  - !ruby/object:Gem::Dependency
132
126
  name: nest
133
127
  requirement: !ruby/object:Gem::Requirement
@@ -321,12 +315,12 @@ files:
321
315
  - app/jobs/characterize_job.rb
322
316
  - app/jobs/create_derivatives_job.rb
323
317
  - app/jobs/import_url_job.rb
318
+ - app/jobs/ingest_local_file_job.rb
324
319
  - app/jobs/resolrize_job.rb
325
320
  - app/models/batch.rb
326
321
  - app/models/checksum_audit_log.rb
327
- - app/models/collection.rb
328
322
  - app/models/concerns/sufia/ability.rb
329
- - app/models/concerns/sufia/collection.rb
323
+ - app/models/concerns/sufia/collection_behavior.rb
330
324
  - app/models/concerns/sufia/file_stat_utils.rb
331
325
  - app/models/concerns/sufia/generic_file.rb
332
326
  - app/models/concerns/sufia/generic_file/batches.rb
@@ -366,6 +360,7 @@ files:
366
360
  - app/models/subject_local_authority_entry.rb
367
361
  - app/models/sufia/avatar_uploader.rb
368
362
  - app/models/sufia/avatar_validator.rb
363
+ - app/models/sufia/collection.rb
369
364
  - app/models/sufia/download.rb
370
365
  - app/models/sufia/orcid_validator.rb
371
366
  - app/models/sufia/pageview.rb
@@ -376,7 +371,6 @@ files:
376
371
  - app/services/sufia/generic_file_audit_service.rb
377
372
  - app/services/sufia/generic_file_indexing_service.rb
378
373
  - app/services/sufia/id_service.rb
379
- - app/services/sufia/indexing_service.rb
380
374
  - app/services/sufia/noid.rb
381
375
  - app/services/sufia/repository_audit_service.rb
382
376
  - config/locales/sufia.en.yml
@@ -386,6 +380,7 @@ files:
386
380
  - lib/generators/sufia/models/install_generator.rb
387
381
  - lib/generators/sufia/models/orcid_field_generator.rb
388
382
  - lib/generators/sufia/models/proxies_generator.rb
383
+ - lib/generators/sufia/models/templates/app/models/collection.rb
389
384
  - lib/generators/sufia/models/templates/config/analytics.yml
390
385
  - lib/generators/sufia/models/templates/config/clamav.rb
391
386
  - lib/generators/sufia/models/templates/config/mailboxer.rb
@@ -400,6 +395,7 @@ files:
400
395
  - lib/generators/sufia/models/templates/config/sufia.rb
401
396
  - lib/generators/sufia/models/templates/migrations/acts_as_follower_migration.rb
402
397
  - lib/generators/sufia/models/templates/migrations/add_avatars_to_users.rb
398
+ - lib/generators/sufia/models/templates/migrations/add_external_key_to_content_blocks.rb
403
399
  - lib/generators/sufia/models/templates/migrations/add_groups_to_users.rb
404
400
  - lib/generators/sufia/models/templates/migrations/add_ldap_attrs_to_user.rb
405
401
  - lib/generators/sufia/models/templates/migrations/add_linkedin_to_users.rb
@@ -418,6 +414,7 @@ files:
418
414
  - lib/generators/sufia/models/templates/migrations/create_trophies.rb
419
415
  - lib/generators/sufia/models/templates/migrations/create_user_stats.rb
420
416
  - lib/generators/sufia/models/templates/migrations/create_version_committers.rb
417
+ - lib/generators/sufia/models/update_content_blocks_generator.rb
421
418
  - lib/generators/sufia/models/upgrade400_generator.rb
422
419
  - lib/generators/sufia/models/usagestats_generator.rb
423
420
  - lib/generators/sufia/models/user_stats_generator.rb
@@ -461,7 +458,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
461
458
  version: 1.3.1
462
459
  requirements: []
463
460
  rubyforge_project:
464
- rubygems_version: 2.4.3
461
+ rubygems_version: 2.2.2
465
462
  signing_key:
466
463
  specification_version: 4
467
464
  summary: Models and services for sufia
@@ -1,3 +0,0 @@
1
- class Collection < ActiveFedora::Base
2
- include Sufia::Collection
3
- end
@@ -1,15 +0,0 @@
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