sufia-models 6.0.0 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/jobs/audit_job.rb +0 -1
  3. data/app/jobs/batch_update_job.rb +2 -2
  4. data/app/models/batch.rb +1 -1
  5. data/app/models/concerns/sufia/ability.rb +14 -7
  6. data/app/models/concerns/sufia/collection_behavior.rb +36 -3
  7. data/app/models/concerns/sufia/generic_file/characterization.rb +47 -18
  8. data/app/models/concerns/sufia/generic_file/metadata.rb +3 -0
  9. data/app/models/concerns/sufia/user.rb +36 -2
  10. data/app/models/datastreams/fits_datastream.rb +1 -5
  11. data/app/models/file_usage.rb +20 -3
  12. data/app/services/sufia/generic_file_audit_service.rb +24 -0
  13. data/app/services/sufia/generic_file_indexing_service.rb +3 -0
  14. data/app/services/sufia/noid.rb +7 -6
  15. data/lib/generators/sufia/models/abstract_migration_generator.rb +1 -1
  16. data/lib/generators/sufia/models/arkivo_api_generator.rb +39 -0
  17. data/lib/generators/sufia/models/cached_stats_generator.rb +1 -1
  18. data/lib/generators/sufia/models/clamav_generator.rb +19 -0
  19. data/lib/generators/sufia/models/fulltext_generator.rb +1 -1
  20. data/lib/generators/sufia/models/install_generator.rb +7 -1
  21. data/lib/generators/sufia/models/orcid_field_generator.rb +1 -1
  22. data/lib/generators/sufia/models/proxies_generator.rb +1 -1
  23. data/lib/generators/sufia/models/templates/config/arkivo.yml +6 -0
  24. data/lib/generators/sufia/models/templates/config/arkivo_constraint.rb +11 -0
  25. data/lib/generators/sufia/models/templates/config/redis_config.rb +1 -1
  26. data/lib/generators/sufia/models/templates/config/resque.rake +16 -0
  27. data/lib/generators/sufia/models/templates/config/sufia.rb +5 -8
  28. data/lib/generators/sufia/models/templates/config/zotero.yml +6 -0
  29. data/lib/generators/sufia/models/templates/migrations/add_arkivo_to_users.rb +8 -0
  30. data/lib/generators/sufia/models/update_content_blocks_generator.rb +1 -1
  31. data/lib/generators/sufia/models/upgrade400_generator.rb +2 -2
  32. data/lib/generators/sufia/models/usagestats_generator.rb +1 -1
  33. data/lib/generators/sufia/models/user_stats_generator.rb +1 -1
  34. data/lib/sufia/models/engine.rb +9 -9
  35. data/lib/sufia/models/file_content/versions.rb +0 -5
  36. data/lib/sufia/models/stats/user_stat_importer.rb +24 -4
  37. data/lib/sufia/models/utils.rb +17 -0
  38. data/lib/sufia/models/version.rb +1 -1
  39. data/lib/sufia/permissions/writable.rb +8 -7
  40. data/lib/tasks/migrate.rake +1 -1
  41. data/lib/tasks/sufia-models_tasks.rake +18 -2
  42. data/sufia-models.gemspec +2 -2
  43. metadata +30 -19
  44. data/app/services/sufia/id_service.rb +0 -45
  45. data/lib/generators/sufia/models/templates/config/mailboxer.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c12a4f1425665634659dfd88233a2c365594589d
4
- data.tar.gz: 06d1405c0b4f1537c071700faadc20a0264f34e8
3
+ metadata.gz: 88115b1a7a645491dcff7e47680ae4f2f4699d5f
4
+ data.tar.gz: c6348bf5e986f9b0666b5f8c3494fc8c864e74ae
5
5
  SHA512:
6
- metadata.gz: 07a66fa4a7b7c950459a91143ac460859ce38edc9a7d336badb586bbaed916c168fe468dcdcad36405fa8d653774db8ad1acc9a9da07ab42b06e066ba18a6c1e
7
- data.tar.gz: ae73b9db8e0607bfb3dcfcab6aef808a8b88be53b8447c66db279a6071ec8433f024dfdac404a5c5167865a6df153f22b03854e625df929175fe07f98cb6a93b
6
+ metadata.gz: 43f9323fcfa7cd7d73ce861dcb42c4fd2df22f7b09c3975d4fe18a654a66d39a49c07990399ef97106cfe4c9738420faafec1f0f7b3ef8c0281da8277204e3b9
7
+ data.tar.gz: bab9cc33d1e179f8b6e590429710d328c2571626a56dd4884e37ce0deb883ec2327cee36d502291f1a9c3f80d9342b1d6833eabb1a666140af81616edbbb67db
@@ -20,7 +20,6 @@ class AuditJob < ActiveFedoraIdBasedJob
20
20
  end
21
21
 
22
22
  def run
23
- fixity_ok = false
24
23
  log = run_audit
25
24
  fixity_ok = (log.pass == 1)
26
25
  unless fixity_ok
@@ -62,11 +62,11 @@ class BatchUpdateJob
62
62
 
63
63
  def send_user_success_message user, batch
64
64
  message = saved.count > 1 ? multiple_success(batch.id, saved) : single_success(batch.id, saved.first)
65
- User.batchuser.send_message(user, message, success_subject, sanitize_text = false)
65
+ User.batchuser.send_message(user, message, success_subject, false)
66
66
  end
67
67
 
68
68
  def send_user_failure_message user, batch
69
69
  message = denied.count > 1 ? multiple_failure(batch.id, denied) : single_failure(batch.id, denied.first)
70
- User.batchuser.send_message(user, message, failure_subject, sanitize_text = false)
70
+ User.batchuser.send_message(user, message, failure_subject, false)
71
71
  end
72
72
  end
data/app/models/batch.rb CHANGED
@@ -26,7 +26,7 @@ class Batch < ActiveFedora::Base
26
26
  def self.safe_create(id)
27
27
  begin
28
28
  Batch.create(id: id)
29
- rescue ActiveFedora::IllegalOperation => ex
29
+ rescue ActiveFedora::IllegalOperation
30
30
  # This is the exception thrown by LDP when we attempt to
31
31
  # create a duplicate object. If we can find the object
32
32
  # then we are good to go.
@@ -19,7 +19,7 @@ module Sufia
19
19
  can :transfer, String do |id|
20
20
  depositor_for_document(id) == current_user.user_key
21
21
  end
22
- can :create, ProxyDepositRequest if user_groups.include? 'registered'
22
+ can :create, ProxyDepositRequest if registered_user?
23
23
  can :accept, ProxyDepositRequest, receiving_user_id: current_user.id, status: 'pending'
24
24
  can :reject, ProxyDepositRequest, receiving_user_id: current_user.id, status: 'pending'
25
25
  # a user who sent a proxy deposit request can cancel it if it's pending.
@@ -31,16 +31,16 @@ module Sufia
31
31
  end
32
32
 
33
33
  def featured_work_abilities
34
- can [:create, :destroy, :update], FeaturedWork if user_groups.include? 'admin'
34
+ can [:create, :destroy, :update], FeaturedWork if admin_user?
35
35
  end
36
36
 
37
37
  def generic_file_abilities
38
38
  can :view_share_work, [GenericFile]
39
- can :create, [GenericFile, Collection] if user_groups.include? 'registered'
39
+ can :create, [GenericFile, Collection] if registered_user?
40
40
  end
41
41
 
42
42
  def editor_abilities
43
- if user_groups.include? 'admin'
43
+ if admin_user?
44
44
  can :create, TinymceAsset
45
45
  can [:create, :update], ContentBlock
46
46
  end
@@ -53,9 +53,16 @@ module Sufia
53
53
 
54
54
  private
55
55
 
56
- def depositor_for_document(document_id)
57
- ::GenericFile.load_instance_from_solr(document_id).depositor
58
- end
56
+ def depositor_for_document(document_id)
57
+ ::GenericFile.load_instance_from_solr(document_id).depositor
58
+ end
59
59
 
60
+ def registered_user?
61
+ user_groups.include? 'registered'
62
+ end
63
+
64
+ def admin_user?
65
+ user_groups.include? 'admin'
66
+ end
60
67
  end
61
68
  end
@@ -15,10 +15,43 @@ module Sufia
15
15
  self.visibility = "open"
16
16
  end
17
17
 
18
- # Compute the sum of each file in the collection
19
- # Return an integer of the result
18
+ # Compute the sum of each file in the collection using Solr to
19
+ # avoid having to hit Fedora
20
+ #
21
+ # @return [Fixnum] size of collection in bytes
22
+ # @raise [RuntimeError] unsaved record does not exist in solr
20
23
  def bytes
21
- members.reduce(0) { |sum, gf| sum + gf.content.size.to_i }
24
+ rows = members.count
25
+ return 0 if rows == 0
26
+
27
+ raise "Collection must be saved to query for bytes" if new_record?
28
+
29
+ query = ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: file_model)
30
+ args = {
31
+ fq: "{!join from=hasCollectionMember_ssim to=id}id:#{id}",
32
+ fl: "id, #{file_size_field}",
33
+ rows: rows
34
+ }
35
+
36
+ files = ActiveFedora::SolrService.query(query, args)
37
+ files.reduce(0) { |sum, f| sum += f[file_size_field].to_i }
22
38
  end
39
+
40
+ protected
41
+ # Field to look up when locating the size of each file in Solr.
42
+ # Override for your own installation if using something different
43
+ def file_size_field
44
+ Solrizer.solr_name('file_size', stored_integer_descriptor)
45
+ end
46
+
47
+ # Override if you are storing your file size in a different way
48
+ def stored_integer_descriptor
49
+ Sufia::GenericFileIndexingService::STORED_INTEGER
50
+ end
51
+
52
+ # Override if not using GenericFiles
53
+ def file_model
54
+ ::GenericFile.to_class_uri
55
+ end
23
56
  end
24
57
  end
@@ -4,23 +4,52 @@ module Sufia
4
4
  extend ActiveSupport::Concern
5
5
  included do
6
6
  contains "characterization", class_name: 'FitsDatastream'
7
- has_attributes :mime_type, datastream: :characterization, multiple: false
8
- has_attributes :format_label, :file_size, :last_modified,
9
- :filename, :original_checksum, :rights_basis,
10
- :copyright_basis, :copyright_note,
11
- :well_formed, :valid, :status_message,
12
- :file_title, :file_author, :page_count,
13
- :file_language, :word_count, :character_count,
14
- :paragraph_count, :line_count, :table_count,
15
- :graphics_count, :byte_order, :compression,
16
- :color_space, :profile_name,
17
- :profile_version, :orientation, :color_map,
18
- :image_producer, :capture_device,
19
- :scanning_software, :exif_version,
20
- :gps_timestamp, :latitude, :longitude,
21
- :character_set, :markup_basis,
22
- :markup_language, :bit_depth,
23
- :channels, :data_format, :offset, :frame_rate, datastream: :characterization, multiple: true
7
+ property :mime_type, delegate_to: 'characterization', multiple: false do |index|
8
+ index.as :stored_searchable
9
+ end
10
+ property :format_label, delegate_to: 'characterization'
11
+ property :file_size, delegate_to: 'characterization'
12
+ property :last_modified, delegate_to: 'characterization'
13
+ property :filename, delegate_to: 'characterization'
14
+ property :original_checksum, delegate_to: 'characterization'
15
+ property :rights_basis, delegate_to: 'characterization'
16
+ property :copyright_basis, delegate_to: 'characterization'
17
+ property :copyright_note, delegate_to: 'characterization'
18
+ property :well_formed, delegate_to: 'characterization'
19
+ property :valid, delegate_to: 'characterization'
20
+ property :status_message, delegate_to: 'characterization'
21
+ property :file_title, delegate_to: 'characterization'
22
+ property :file_author, delegate_to: 'characterization'
23
+ property :page_count, delegate_to: 'characterization'
24
+ property :file_language, delegate_to: 'characterization'
25
+ property :word_count, delegate_to: 'characterization'
26
+ property :character_count, delegate_to: 'characterization'
27
+ property :paragraph_count, delegate_to: 'characterization'
28
+ property :line_count, delegate_to: 'characterization'
29
+ property :table_count, delegate_to: 'characterization'
30
+ property :graphics_count, delegate_to: 'characterization'
31
+ property :byte_order, delegate_to: 'characterization'
32
+ property :compression, delegate_to: 'characterization'
33
+ property :color_space, delegate_to: 'characterization'
34
+ property :profile_name, delegate_to: 'characterization'
35
+ property :profile_version, delegate_to: 'characterization'
36
+ property :orientation, delegate_to: 'characterization'
37
+ property :color_map, delegate_to: 'characterization'
38
+ property :image_producer, delegate_to: 'characterization'
39
+ property :capture_device, delegate_to: 'characterization'
40
+ property :scanning_software, delegate_to: 'characterization'
41
+ property :exif_version, delegate_to: 'characterization'
42
+ property :gps_timestamp, delegate_to: 'characterization'
43
+ property :latitude, delegate_to: 'characterization'
44
+ property :longitude, delegate_to: 'characterization'
45
+ property :character_set, delegate_to: 'characterization'
46
+ property :markup_basis, delegate_to: 'characterization'
47
+ property :markup_language, delegate_to: 'characterization'
48
+ property :bit_depth, delegate_to: 'characterization'
49
+ property :channels, delegate_to: 'characterization'
50
+ property :data_format, delegate_to: 'characterization'
51
+ property :offset, delegate_to: 'characterization'
52
+ property :frame_rate, delegate_to: 'characterization'
24
53
 
25
54
  end
26
55
 
@@ -71,7 +100,7 @@ module Sufia
71
100
 
72
101
  def characterization_terms
73
102
  h = {}
74
- self.characterization.class.terminology.terms.each_pair do |k, v|
103
+ FitsDatastream.terminology.terms.each_pair do |k, v|
75
104
  next unless v.respond_to? :proxied_term
76
105
  term = v.proxied_term
77
106
  begin
@@ -11,6 +11,8 @@ module Sufia
11
11
  index.as :symbol, :stored_searchable
12
12
  end
13
13
 
14
+ property :arkivo_checksum, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#arkivoChecksum'), multiple: false
15
+
14
16
  property :relative_path, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#relativePath'), multiple: false
15
17
 
16
18
  property :import_url, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#importUrl'), multiple: false do |index|
@@ -91,6 +93,7 @@ module Sufia
91
93
  rescue
92
94
  puts "tables for vocabularies missing"
93
95
  end
96
+ type ::RDF::URI.new('http://pcdm.org/models#Object')
94
97
  end
95
98
 
96
99
  end
@@ -1,3 +1,5 @@
1
+ require 'oauth'
2
+
1
3
  module Sufia::User
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -33,10 +35,37 @@ module Sufia::User
33
35
  mount_uploader :avatar, AvatarUploader, mount_on: :avatar_file_name
34
36
  validates_with AvatarValidator
35
37
 
38
+ # Add token to authenticate Arkivo API calls
39
+ after_initialize :set_arkivo_token, unless: :persisted? if Sufia.config.arkivo_api
40
+
36
41
  has_many :trophies
37
42
  attr_accessor :update_directory
38
43
  end
39
44
 
45
+ def zotero_token
46
+ self[:zotero_token].blank? ? nil : Marshal::load(self[:zotero_token])
47
+ end
48
+
49
+ def zotero_token=(value)
50
+ if value.blank?
51
+ # Resetting the token
52
+ self[:zotero_token] = value
53
+ else
54
+ self[:zotero_token] = Marshal::dump(value)
55
+ end
56
+ end
57
+
58
+ def set_arkivo_token
59
+ self.arkivo_token ||= token_algorithm
60
+ end
61
+
62
+ def token_algorithm
63
+ loop do
64
+ token = SecureRandom.base64(24)
65
+ return token if User.find_by(arkivo_token: token).nil?
66
+ end
67
+ end
68
+
40
69
  # Coerce the ORCID into URL format
41
70
  def normalize_orcid
42
71
  # Skip normalization if:
@@ -77,8 +106,13 @@ module Sufia::User
77
106
 
78
107
  def trophy_files
79
108
  trophies.map do |t|
80
- ::GenericFile.load_instance_from_solr(t.generic_file_id)
81
- end
109
+ begin
110
+ ::GenericFile.load_instance_from_solr(t.generic_file_id)
111
+ rescue ActiveFedora::ObjectNotFoundError
112
+ logger.error("Invalid trophy for user #{user_key} (generic file id #{t.generic_file_id})")
113
+ nil
114
+ end
115
+ end.compact
82
116
  end
83
117
 
84
118
  # method needed for messaging
@@ -1,10 +1,6 @@
1
1
  class FitsDatastream < ActiveFedora::OmDatastream
2
2
  include OM::XML::Document
3
3
 
4
- def prefix(_)
5
- ""
6
- end
7
-
8
4
  set_terminology do |t|
9
5
  t.root(path: "fits",
10
6
  xmlns: "http://hul.harvard.edu/ois/xml/ns/fits/fits_output",
@@ -12,7 +8,7 @@ class FitsDatastream < ActiveFedora::OmDatastream
12
8
  t.identification {
13
9
  t.identity {
14
10
  t.format_label(path: {attribute: "format"})
15
- t.mime_type(path: {attribute: "mimetype"}, index_as: [:stored_searchable])
11
+ t.mime_type(path: {attribute: "mimetype"})
16
12
  }
17
13
  }
18
14
  t.fileinfo {
@@ -9,13 +9,30 @@ class FileUsage
9
9
 
10
10
  self.id = id
11
11
  self.path = Sufia::Engine.routes.url_helpers.generic_file_path(id)
12
- earliest = Sufia.config.analytic_start_date
13
- self.created = ::GenericFile.find(id).create_date
14
- self.created = earliest > created ? earliest : created unless earliest.blank?
12
+ self.created = date_for_analytics(file)
15
13
  self.downloads = FileDownloadStat.to_flots FileDownloadStat.statistics(id, created, user_id)
16
14
  self.pageviews = FileViewStat.to_flots FileViewStat.statistics(id, created, user_id)
17
15
  end
18
16
 
17
+ # file.date_uploaded reflects the date the file was uploaded by the user
18
+ # and therefore (if available) the date that we want to use for the stats
19
+ # file.create_date reflects the date the file was added to Fedora. On data
20
+ # migrated from one repository to another the created_date can be later
21
+ # than the date the file was uploaded.
22
+ def date_for_analytics(file)
23
+ earliest = Sufia.config.analytic_start_date
24
+ date_uploaded = string_to_date file.date_uploaded
25
+ date_analytics = date_uploaded ? date_uploaded : file.create_date
26
+ return date_analytics if earliest.blank?
27
+ earliest > date_analytics ? earliest : date_analytics
28
+ end
29
+
30
+ def string_to_date(date_str)
31
+ return DateTime.parse(date_str)
32
+ rescue ArgumentError, TypeError
33
+ return nil
34
+ end
35
+
19
36
  def total_downloads
20
37
  self.downloads.reduce(0) { |total, result| total + result[1].to_i }
21
38
  end
@@ -45,6 +45,17 @@ module Sufia
45
45
  end
46
46
 
47
47
  def audit_stat
48
+ # Only access version if we can (file was loaded from fedora)
49
+ if generic_file.content.respond_to? :has_versions?
50
+ audit_stat_by_version
51
+
52
+ # file loaded from solr
53
+ else
54
+ audit_stat_by_id
55
+ end
56
+ end
57
+
58
+ def audit_stat_by_version
48
59
  audit_results = audit.collect { |result| result["pass"] }
49
60
 
50
61
  # check how many non runs we had
@@ -59,6 +70,19 @@ module Sufia
59
70
  end
60
71
  end
61
72
 
73
+ # Check the file by only what is in the audit log.
74
+ # Do not try to access the versions if we do not have access to them.
75
+ # This occurs when a file is loaded from solr instead of fedora
76
+ def audit_stat_by_id
77
+ audit_results = ChecksumAuditLog.logs_for(generic_file.id, "content").collect { |result| result["pass"] }
78
+
79
+ if audit_results.length > 0
80
+ audit_results.reduce(true) { |sum, value| sum && value }
81
+ else
82
+ 'Audits have not yet been run on this file.'
83
+ end
84
+ end
85
+
62
86
  def audit_file(file, uri, label = nil)
63
87
  latest_audit = ChecksumAuditLog.logs_for(generic_file.id, file).first
64
88
  return latest_audit unless needs_audit?(latest_audit)
@@ -1,11 +1,14 @@
1
1
  module Sufia
2
2
  class GenericFileIndexingService < ActiveFedora::IndexingService
3
+ STORED_INTEGER = Solrizer::Descriptor.new(:integer, :stored)
4
+
3
5
  def generate_solr_document
4
6
  super.tap do |solr_doc|
5
7
  solr_doc[Solrizer.solr_name('label')] = object.label
6
8
  solr_doc[Solrizer.solr_name('file_format')] = object.file_format
7
9
  solr_doc[Solrizer.solr_name('file_format', :facetable)] = object.file_format
8
10
  solr_doc['all_text_timv'] = object.full_text.content
11
+ solr_doc[Solrizer.solr_name('file_size', STORED_INTEGER)] = object.content.size.to_i
9
12
  end
10
13
  end
11
14
  end
@@ -1,3 +1,5 @@
1
+ require 'active_fedora/noid'
2
+
1
3
  module Sufia
2
4
  module Noid
3
5
  extend ActiveSupport::Concern
@@ -5,18 +7,17 @@ module Sufia
5
7
  ## This overrides the default behavior, which is to ask Fedora for an id
6
8
  # @see ActiveFedora::Persistence.assign_id
7
9
  def assign_id
8
- Sufia::IdService.mint if Sufia.config.enable_noids
10
+ service.mint if Sufia.config.enable_noids
9
11
  end
10
12
 
11
13
  def to_param
12
14
  id
13
15
  end
14
16
 
15
- class << self
16
- # Create a pairtree like path for the given identifier
17
- def treeify(identifier)
18
- (identifier.scan(/..?/).first(4) + [identifier]).join('/')
17
+ private
18
+
19
+ def service
20
+ @service ||= ActiveFedora::Noid::Service.new
19
21
  end
20
- end
21
22
  end
22
23
  end
@@ -25,6 +25,6 @@ class Sufia::Models::AbstractMigrationGenerator < Rails::Generators::Base
25
25
  def better_migration_template(file)
26
26
  migration_template "migrations/#{file}", "db/migrate/#{file}"
27
27
  rescue Rails::Generators::Error => e
28
- say_status("warning", e.message, :yellow)
28
+ say_status("error", e.message, :red)
29
29
  end
30
30
  end
@@ -0,0 +1,39 @@
1
+ require_relative 'abstract_migration_generator'
2
+
3
+ class Sufia::Models::ArkivoApiGenerator < Sufia::Models::AbstractMigrationGenerator
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ desc """
7
+ This generator sets up Zotero/Arkivo API integration for your application:
8
+ """
9
+
10
+ def banner
11
+ say_status("info", "ADDING ZOTERO/ARKIVO API INTEGRATION", :blue)
12
+ end
13
+
14
+ # Turn on the feature set in Sufia's config
15
+ def inject_arkivo_config
16
+ inject_into_file 'config/initializers/sufia.rb', after: /^Sufia\.config do.*$/ do
17
+ "\n # Sufia can integrate with Zotero's Arkivo service for automatic deposit\n" +
18
+ " # of Zotero-managed research items.\n" +
19
+ " # Defaults to false. See README for more info\n" +
20
+ " config.arkivo_api = true\n"
21
+ end
22
+ end
23
+
24
+ # Copy the routing constraint over
25
+ def copy_routing_constraint
26
+ copy_file 'config/arkivo_constraint.rb', 'config/initializers/arkivo_constraint.rb'
27
+ end
28
+
29
+ # Copy the database migration
30
+ def copy_migration
31
+ better_migration_template 'add_arkivo_to_users.rb'
32
+ end
33
+
34
+ # Copy the config files for Zotero and Arkivo
35
+ def copy_config_files
36
+ copy_file 'config/arkivo.yml', 'config/arkivo.yml'
37
+ copy_file 'config/zotero.yml', 'config/zotero.yml'
38
+ end
39
+ end
@@ -9,7 +9,7 @@ This generator adds the ability to cache usage stats to your application:
9
9
  """
10
10
 
11
11
  def banner
12
- say_status("warning", "ADDING STATS CACHING-RELATED SUFIA MODELS", :yellow)
12
+ say_status("info", "ADDING STATS CACHING-RELATED SUFIA MODELS", :blue)
13
13
  end
14
14
 
15
15
  # Setup the database migrations
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+
4
+ class Sufia::Models::ClamavGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ desc """
8
+ This generator makes the following changes to your application:
9
+ 1. Generates clamav initializer
10
+ """
11
+
12
+ def banner
13
+ say_status("info", "Generating clamav initializers", :blue)
14
+ end
15
+
16
+ def create_initializer_file
17
+ copy_file 'config/clamav.rb', 'config/initializers/clamav.rb'
18
+ end
19
+ end
@@ -11,7 +11,7 @@ This generator makes the following changes to your application:
11
11
  """
12
12
 
13
13
  def banner
14
- say_status("warning", "GENERATING SUFIA FULL-TEXT", :yellow)
14
+ say_status("info", "GENERATING SUFIA FULL-TEXT", :blue)
15
15
  end
16
16
 
17
17
  # Copy Sufia's solrconfig into the dir from which the jetty:config task pulls
@@ -17,7 +17,7 @@ This generator makes the following changes to your application:
17
17
  10. Runs user stats generator
18
18
  """
19
19
  def banner
20
- say_status("warning", "GENERATING SUFIA MODELS", :yellow)
20
+ say_status("info", "GENERATING SUFIA MODELS", :blue)
21
21
  end
22
22
 
23
23
  # Setup the database migrations
@@ -65,6 +65,7 @@ This generator makes the following changes to your application:
65
65
  copy_file 'config/redis_config.rb', 'config/initializers/redis_config.rb'
66
66
  copy_file 'config/resque_admin.rb', 'config/initializers/resque_admin.rb'
67
67
  copy_file 'config/resque_config.rb', 'config/initializers/resque_config.rb'
68
+ copy_file 'config/resque.rake', 'lib/tasks/resque.rake'
68
69
  end
69
70
 
70
71
  def create_collection
@@ -103,4 +104,9 @@ This generator makes the following changes to your application:
103
104
  def user_stats
104
105
  generate 'sufia:models:user_stats'
105
106
  end
107
+
108
+ # Adds clamav initializtion
109
+ def clamav
110
+ generate 'sufia:models:clamav'
111
+ end
106
112
  end
@@ -9,7 +9,7 @@ This generator adds a field to hold users' ORCIDs to your application:
9
9
  """
10
10
 
11
11
  def banner
12
- say_status("warning", "ADDING ORCID FIELD TO USER MODEL", :yellow)
12
+ say_status("info", "ADDING ORCID FIELD TO USER MODEL", :blue)
13
13
  end
14
14
 
15
15
  # Setup the database migration
@@ -9,7 +9,7 @@ This generator adds proxies and transfers to your application:
9
9
  """
10
10
 
11
11
  def banner
12
- say_status("warning", "ADDING PROXY/TRANSFER-RELATED SUFIA MODELS", :yellow)
12
+ say_status("info", "ADDING PROXY/TRANSFER-RELATED SUFIA MODELS", :blue)
13
13
  end
14
14
 
15
15
  # Setup the database migrations
@@ -0,0 +1,6 @@
1
+ development:
2
+ url: http://localhost:8888/
3
+ test:
4
+ url: http://localhost:8888/
5
+ production:
6
+ url: http://production.host/
@@ -0,0 +1,11 @@
1
+ module Sufia
2
+ class ArkivoConstraint
3
+ def self.matches?(request)
4
+ # Add your own logic here to authorize trusted connections to
5
+ # the API e.g., if your installation of Arkivo runs on a host
6
+ # with the 10.0.0.3 IP address, you could use:
7
+ # request.remote_ip == '10.0.0.3'
8
+ false
9
+ end
10
+ end
11
+ end
@@ -11,6 +11,7 @@ if defined?(PhusionPassenger)
11
11
  $redis = Redis.new(host: config[:host], port: config[:port], thread_safe: true) rescue nil
12
12
  Resque.redis = $redis
13
13
  Resque.redis.client.reconnect if Resque.redis
14
+ Resque.redis.namespace = "#{Sufia.config.redis_namespace}:#{Rails.env}"
14
15
  end
15
16
  end
16
17
  else
@@ -18,7 +19,6 @@ else
18
19
  $redis = Redis.new(host: config[:host], port: config[:port], thread_safe: true) rescue nil
19
20
  end
20
21
 
21
-
22
22
  # Code borrowed from Obie's Redis patterns talk at RailsConf'12
23
23
  Nest.class_eval do
24
24
  def initialize(key, redis=$redis)
@@ -0,0 +1,16 @@
1
+ # Load the Rails app all the time.
2
+ # See https://github.com/resque/resque/wiki/FAQ for more details
3
+ require 'resque/pool'
4
+ require 'resque/pool/tasks'
5
+
6
+ # This provides access to the Rails env within all Resque workers
7
+ task "resque:setup" => :environment
8
+
9
+ task 'resque:pool:setup' do
10
+ ActiveRecord::Base.connection.disconnect!
11
+
12
+ Resque::Pool.after_prefork do |j|
13
+ ActiveRecord::Base.establish_connection
14
+ Resque.redis.client.reconnect
15
+ end
16
+ end
@@ -1,7 +1,5 @@
1
- # Returns an array containing the vhost 'CoSign service' value and URL
2
1
  Sufia.config do |config|
3
-
4
- config.fits_to_desc_mapping= {
2
+ config.fits_to_desc_mapping = {
5
3
  file_title: :title,
6
4
  file_author: :creator
7
5
  }
@@ -118,15 +116,14 @@ Sufia.config do |config|
118
116
  # Specify how many seconds back from the current time that we should show by default of the user's activity on the user's dashboard
119
117
  # config.activity_to_show_default_seconds_since_now = 24*60*60
120
118
 
119
+ # Sufia can integrate with Zotero's Arkivo service for automatic deposit
120
+ # of Zotero-managed research items.
121
+ # config.arkivo_api = false
122
+
121
123
  # Specify a date you wish to start collecting Google Analytic statistics for.
122
124
  # Leaving it blank will set the start date to when ever the file was uploaded by
123
125
  # NOTE: if you have always sent analytics to GA for downloads and page views leave this commented out
124
126
  # config.analytic_start_date = DateTime.new(2014,9,10)
125
- #
126
- # Method of converting ids into URIs for storage in Fedora
127
- # config.translate_uri_to_id = lambda { |uri| uri.to_s.split('/')[-1] }
128
- # config.translate_id_to_uri = lambda { |id|
129
- # "#{ActiveFedora.fedora.host}#{ActiveFedora.fedora.base_path}/#{Sufia::Noid.treeify(id)}" }
130
127
 
131
128
  # If browse-everything has been configured, load the configs. Otherwise, set to nil.
132
129
  begin
@@ -0,0 +1,6 @@
1
+ #
2
+ # To integrate your app with Zotero, set ENV variables with your API info
3
+ #
4
+ zotero:
5
+ client_key: <%= ENV["ZOTERO_CLIENT_KEY"] %>
6
+ client_secret: <%= ENV["ZOTERO_CLIENT_SECRET"] %>
@@ -0,0 +1,8 @@
1
+ class AddArkivoToUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :users, :arkivo_token, :string
4
+ add_column :users, :arkivo_subscription, :string
5
+ add_column :users, :zotero_token, :binary
6
+ add_column :users, :zotero_userid, :string
7
+ end
8
+ end
@@ -8,7 +8,7 @@ This generator creates a database migration to add an external_key column to the
8
8
  """
9
9
 
10
10
  def banner
11
- say_status("warning", "CREATING MIGRATION FILE", :yellow)
11
+ say_status("info", "CREATING MIGRATION FILE", :blue)
12
12
  end
13
13
 
14
14
  def copy_migrations
@@ -12,7 +12,7 @@ This generator for upgrading sufia-models from 3.7.2 to 4.0 makes the following
12
12
  """
13
13
 
14
14
  def banner
15
- say_status("warning", "UPGRADING SUFIA MODELS", :yellow)
15
+ say_status("info", "UPGRADING SUFIA MODELS", :blue)
16
16
  end
17
17
 
18
18
  # Setup the database migrations
@@ -44,7 +44,7 @@ This generator for upgrading sufia-models from 3.7.2 to 4.0 makes the following
44
44
  " # Defaults to FALSE\n" +
45
45
  " # Requires a Google Analytics id and OAuth2 keyfile. See README for more info\n" +
46
46
  " #config.analytics = false\n"
47
- end
47
+ end
48
48
  end
49
49
 
50
50
  # Sets up full-text indexing (Solr config + jars)
@@ -10,7 +10,7 @@ This generator makes the following changes to your application:
10
10
  """
11
11
 
12
12
  def banner
13
- say_status("warning", "GENERATING SUFIA USAGE STATS", :yellow)
13
+ say_status("info", "GENERATING SUFIA USAGE STATS", :blue)
14
14
  end
15
15
 
16
16
  def create_configuration_file
@@ -9,7 +9,7 @@ This generator adds usage stats methods to the user model in your application:
9
9
  """
10
10
 
11
11
  def banner
12
- say_status("warning", "ADDING USER STATS-RELATED ABILITIES TO SUFIA MODELS", :yellow)
12
+ say_status("info", "ADDING USER STATS-RELATED ABILITIES TO SUFIA MODELS", :blue)
13
13
  end
14
14
 
15
15
  # Setup the database migrations
@@ -14,11 +14,11 @@ module Sufia
14
14
  # Set some configuration defaults
15
15
  config.persistent_hostpath = "http://localhost/files/"
16
16
  config.enable_ffmpeg = false
17
- config.noid_template = '.reeddeeddk'
18
17
  config.ffmpeg_path = 'ffmpeg'
19
18
  config.fits_message_length = 5
20
19
  config.temp_file_base = nil
21
20
  config.enable_noids = true
21
+ config.noid_template = '.reeddeeddk'
22
22
  config.minter_statefile = '/tmp/minter-state'
23
23
  config.redis_namespace = "sufia"
24
24
  config.fits_path = "fits.sh"
@@ -29,14 +29,12 @@ module Sufia
29
29
  config.queue = Sufia::Resque::Queue
30
30
  config.max_notifications_for_dashboard = 5
31
31
  config.activity_to_show_default_seconds_since_now = 24*60*60
32
+ config.arkivo_api = false
33
+ config.retry_unless_sleep = 0.0
32
34
 
33
- # Defaulting analytic start date to when ever the file was uploaded by leaving it blank
35
+ # Defaulting analytic start date to whenever the file was uploaded by leaving it blank
34
36
  config.analytic_start_date = nil
35
37
 
36
- config.translate_uri_to_id = lambda { |uri| uri.to_s.split('/')[-1] }
37
- config.translate_id_to_uri = lambda { |id|
38
- "#{ActiveFedora.fedora.host}#{ActiveFedora.fedora.base_path}/#{Sufia::Noid.treeify(id)}" }
39
-
40
38
  config.autoload_paths += %W(
41
39
  #{config.root}/app/models/datastreams
42
40
  )
@@ -53,11 +51,11 @@ module Sufia
53
51
  initializer 'requires' do
54
52
  require 'activerecord-import'
55
53
  require 'hydra/derivatives'
54
+ require 'active_fedora/noid'
56
55
  require 'sufia/models/file_content'
57
56
  require 'sufia/models/file_content/versions'
58
57
  require 'sufia/models/user_local_directory_behavior'
59
58
  require 'sufia/noid'
60
- require 'sufia/id_service'
61
59
  require 'sufia/analytics'
62
60
  require 'sufia/pageview'
63
61
  require 'sufia/download'
@@ -70,8 +68,10 @@ module Sufia
70
68
  Hydra::Derivatives.fits_path = c.fits_path
71
69
  Hydra::Derivatives.enable_ffmpeg = c.enable_ffmpeg
72
70
 
73
- ActiveFedora::Base.translate_uri_to_id = c.translate_uri_to_id
74
- ActiveFedora::Base.translate_id_to_uri = c.translate_id_to_uri
71
+ ActiveFedora::Base.translate_uri_to_id = ActiveFedora::Noid.config.translate_uri_to_id
72
+ ActiveFedora::Base.translate_id_to_uri = ActiveFedora::Noid.config.translate_id_to_uri
73
+ ActiveFedora::Noid.config.template = c.noid_template
74
+ ActiveFedora::Noid.config.statefile = c.minter_statefile
75
75
  end
76
76
  end
77
77
  end
@@ -1,11 +1,6 @@
1
1
  module Sufia
2
2
  module FileContent
3
3
  module Versions
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- has_many_versions
8
- end
9
4
 
10
5
  def latest_version
11
6
  versions.last unless versions.empty?
@@ -7,6 +7,7 @@ module Sufia
7
7
  @verbose = options[:verbose]
8
8
  @logging = options[:logging]
9
9
  @delay_secs = options[:delay_secs].to_f
10
+ @number_of_retries = options[:number_of_retries].to_i
10
11
  end
11
12
 
12
13
  def import
@@ -14,14 +15,17 @@ module Sufia
14
15
  sorted_users.each do |user|
15
16
  start_date = date_since_last_cache(user)
16
17
 
18
+ # this user has already been processed today continue without delay
19
+ next if start_date.to_date >= Date.today
20
+
17
21
  stats = {}
18
22
  file_ids_for_user(user).each do |file_id|
19
- view_stats = FileViewStat.statistics(file_id, start_date, user.id)
20
- stats = tally_results(view_stats, :views, stats)
23
+ view_stats = rescue_and_retry("Retried FileViewStat on #{user} for file #{file_id} too many times.") { FileViewStat.statistics(file_id, start_date, user.id) }
24
+ stats = tally_results(view_stats, :views, stats) unless view_stats.blank?
21
25
  delay
22
26
 
23
- dl_stats = FileDownloadStat.statistics(file_id, start_date, user.id)
24
- stats = tally_results(dl_stats, :downloads, stats)
27
+ dl_stats = rescue_and_retry("Retried FileDownloadStat on #{user} for file #{file_id} too many times.") { FileDownloadStat.statistics(file_id, start_date, user.id) }
28
+ stats = tally_results(dl_stats, :downloads, stats) unless dl_stats.blank?
25
29
  delay
26
30
  end
27
31
 
@@ -47,6 +51,22 @@ private
47
51
  sleep @delay_secs
48
52
  end
49
53
 
54
+ def rescue_and_retry(fail_message)
55
+ retry_count = 0
56
+ begin
57
+ return yield
58
+ rescue StandardError => e
59
+ retry_count += 1
60
+ if retry_count < @number_of_retries
61
+ delay
62
+ retry
63
+ else
64
+ log_message fail_message
65
+ log_message "Last exception #{e}"
66
+ end
67
+ end
68
+ end
69
+
50
70
  def date_since_last_cache(user)
51
71
  last_cached_stat = UserStat.where(user_id: user.id).order(date: :asc).last
52
72
 
@@ -1,12 +1,28 @@
1
+ # This module includes utility methods
1
2
  module Sufia
2
3
  module Utils
3
4
  extend ActiveSupport::Concern
4
5
 
6
+ # retry the block if the conditional call is true unless we hit the maximum tries
7
+ #
8
+ # @param number_of_tries [enumerator] maximum number of times to retry the block (eg. 7.times)
9
+ # @param condition [#call] conditional to call and see if we SHOULD retry
10
+ # @yeild block [] code you want to run and retry
11
+ #
12
+ # @return result of the block call
5
13
  def retry_unless(number_of_tries, condition, &block)
6
14
  self.class.retry_unless(number_of_tries, condition, &block)
7
15
  end
8
16
 
9
17
  module ClassMethods
18
+
19
+ # retry the block if the conditional call is true unless we hit the maximum tries
20
+ #
21
+ # @param number_of_tries [enumerator] maximum number of times to retry the block
22
+ # @param condition [#call] conditional to call and see if we SHOULD retry
23
+ # @yeild block [] code you want to run and retry
24
+ #
25
+ # @return result of the block call
10
26
  def retry_unless(number_of_tries, condition, &block)
11
27
  raise ArgumentError, "First argument must be an enumerator" unless number_of_tries.is_a? Enumerator
12
28
  raise ArgumentError, "Second argument must be a lambda" unless condition.respond_to? :call
@@ -14,6 +30,7 @@ module Sufia
14
30
  number_of_tries.each do
15
31
  result = block.call
16
32
  return result unless condition.call
33
+ sleep(Sufia.config.retry_unless_sleep) if Sufia.config.retry_unless_sleep > 0
17
34
  end
18
35
  raise RuntimeError, "retry_unless could not complete successfully. Try upping the # of tries?"
19
36
  end
@@ -1,5 +1,5 @@
1
1
  module Sufia
2
2
  module Models
3
- VERSION = "6.0.0"
3
+ VERSION = "6.1.0"
4
4
  end
5
5
  end
@@ -13,7 +13,7 @@ module Sufia
13
13
 
14
14
  def paranoid_permissions
15
15
  valid = true
16
- VALIDATIONS.each do |validation|
16
+ paranoid_edit_permissions.each do |validation|
17
17
  if validation[:condition].call(self)
18
18
  errors[validation[:key]] ||= []
19
19
  errors[validation[:key]] << validation[:message]
@@ -23,12 +23,13 @@ module Sufia
23
23
  return valid
24
24
  end
25
25
 
26
- VALIDATIONS = [
27
- {key: :edit_users, message: 'Depositor must have edit access', condition: lambda { |obj| !obj.edit_users.include?(obj.depositor) }},
28
- {key: :edit_groups, message: 'Public cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('public') }},
29
- {key: :edit_groups, message: 'Registered cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('registered') }}
30
- ]
31
-
26
+ def paranoid_edit_permissions
27
+ [
28
+ {key: :edit_users, message: 'Depositor must have edit access', condition: lambda { |obj| !obj.edit_users.include?(obj.depositor) }},
29
+ {key: :edit_groups, message: 'Public cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('public') }},
30
+ {key: :edit_groups, message: 'Registered cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('registered') }}
31
+ ]
32
+ end
32
33
 
33
34
  def clear_permissions!
34
35
  self.permissions = []
@@ -1,4 +1,4 @@
1
- namespace :sufia do
1
+ namespace :sufia do
2
2
  namespace :migrate do
3
3
 
4
4
  desc "Migrate proxy deposits"
@@ -8,6 +8,20 @@ namespace :solr do
8
8
  end
9
9
 
10
10
  namespace :sufia do
11
+ namespace :user do
12
+ desc 'Populate user tokens'
13
+ task tokens: :environment do
14
+ unless Sufia.config.arkivo_api
15
+ puts "Zotero integration is not enabled"
16
+ next
17
+ end
18
+ User.where(arkivo_token: nil).each do |user|
19
+ user.set_arkivo_token
20
+ user.save
21
+ end
22
+ end
23
+ end
24
+
11
25
  namespace :jetty do
12
26
 
13
27
  FULLTEXT_JARS = %w(
@@ -66,8 +80,10 @@ end
66
80
 
67
81
  def download_from_maven url, dst
68
82
  full_url = '/remotecontent?filepath=' + url
69
- file = File.open(dst, "w")
70
- Net::HTTP.start("search.maven.org") do |http|
83
+ file = File.open(dst, "wb")
84
+ endpoint = Net::HTTP.new('search.maven.org', 443)
85
+ endpoint.use_ssl = true
86
+ endpoint.start do |http|
71
87
  puts "Fetching #{full_url}"
72
88
  begin
73
89
  http.request_get(full_url) do |resp|
data/sufia-models.gemspec CHANGED
@@ -30,13 +30,13 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency 'activeresource', "~> 4.0" # No longer a dependency of rails 4.0
31
31
 
32
32
  spec.add_dependency "hydra-head", "~> 9.0"
33
- spec.add_dependency "active-fedora", "~> 9.0"
33
+ spec.add_dependency "active-fedora", "~> 9.1", ">= 9.1.1"
34
34
  spec.add_dependency "hydra-collections", [">= 5.0.2", "< 6.0"]
35
35
  spec.add_dependency 'hydra-derivatives', '~> 1.0'
36
+ spec.add_dependency 'active_fedora-noid', '~> 0.1'
36
37
  spec.add_dependency 'nest', '~> 1.1'
37
38
  spec.add_dependency 'resque', '~> 1.23'
38
39
  spec.add_dependency 'resque-pool', '~> 0.3'
39
- spec.add_dependency 'noid', '~> 0.6'
40
40
  spec.add_dependency 'mailboxer', '~> 0.12'
41
41
  spec.add_dependency 'acts_as_follower', '>= 0.1.1', '< 0.3'
42
42
  spec.add_dependency 'carrierwave', '~> 0.9'
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
4
+ version: 6.1.0
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-03-27 00:00:00.000000000 Z
11
+ date: 2015-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,14 +86,20 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '9.0'
89
+ version: '9.1'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 9.1.1
90
93
  type: :runtime
91
94
  prerelease: false
92
95
  version_requirements: !ruby/object:Gem::Requirement
93
96
  requirements:
94
97
  - - "~>"
95
98
  - !ruby/object:Gem::Version
96
- version: '9.0'
99
+ version: '9.1'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 9.1.1
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: hydra-collections
99
105
  requirement: !ruby/object:Gem::Requirement
@@ -129,61 +135,61 @@ dependencies:
129
135
  - !ruby/object:Gem::Version
130
136
  version: '1.0'
131
137
  - !ruby/object:Gem::Dependency
132
- name: nest
138
+ name: active_fedora-noid
133
139
  requirement: !ruby/object:Gem::Requirement
134
140
  requirements:
135
141
  - - "~>"
136
142
  - !ruby/object:Gem::Version
137
- version: '1.1'
143
+ version: '0.1'
138
144
  type: :runtime
139
145
  prerelease: false
140
146
  version_requirements: !ruby/object:Gem::Requirement
141
147
  requirements:
142
148
  - - "~>"
143
149
  - !ruby/object:Gem::Version
144
- version: '1.1'
150
+ version: '0.1'
145
151
  - !ruby/object:Gem::Dependency
146
- name: resque
152
+ name: nest
147
153
  requirement: !ruby/object:Gem::Requirement
148
154
  requirements:
149
155
  - - "~>"
150
156
  - !ruby/object:Gem::Version
151
- version: '1.23'
157
+ version: '1.1'
152
158
  type: :runtime
153
159
  prerelease: false
154
160
  version_requirements: !ruby/object:Gem::Requirement
155
161
  requirements:
156
162
  - - "~>"
157
163
  - !ruby/object:Gem::Version
158
- version: '1.23'
164
+ version: '1.1'
159
165
  - !ruby/object:Gem::Dependency
160
- name: resque-pool
166
+ name: resque
161
167
  requirement: !ruby/object:Gem::Requirement
162
168
  requirements:
163
169
  - - "~>"
164
170
  - !ruby/object:Gem::Version
165
- version: '0.3'
171
+ version: '1.23'
166
172
  type: :runtime
167
173
  prerelease: false
168
174
  version_requirements: !ruby/object:Gem::Requirement
169
175
  requirements:
170
176
  - - "~>"
171
177
  - !ruby/object:Gem::Version
172
- version: '0.3'
178
+ version: '1.23'
173
179
  - !ruby/object:Gem::Dependency
174
- name: noid
180
+ name: resque-pool
175
181
  requirement: !ruby/object:Gem::Requirement
176
182
  requirements:
177
183
  - - "~>"
178
184
  - !ruby/object:Gem::Version
179
- version: '0.6'
185
+ version: '0.3'
180
186
  type: :runtime
181
187
  prerelease: false
182
188
  version_requirements: !ruby/object:Gem::Requirement
183
189
  requirements:
184
190
  - - "~>"
185
191
  - !ruby/object:Gem::Version
186
- version: '0.6'
192
+ version: '0.3'
187
193
  - !ruby/object:Gem::Dependency
188
194
  name: mailboxer
189
195
  requirement: !ruby/object:Gem::Requirement
@@ -377,30 +383,35 @@ files:
377
383
  - app/services/sufia/analytics.rb
378
384
  - app/services/sufia/generic_file_audit_service.rb
379
385
  - app/services/sufia/generic_file_indexing_service.rb
380
- - app/services/sufia/id_service.rb
381
386
  - app/services/sufia/noid.rb
382
387
  - app/services/sufia/repository_audit_service.rb
383
388
  - config/locales/sufia.en.yml
384
389
  - lib/generators/sufia/models/abstract_migration_generator.rb
390
+ - lib/generators/sufia/models/arkivo_api_generator.rb
385
391
  - lib/generators/sufia/models/cached_stats_generator.rb
392
+ - lib/generators/sufia/models/clamav_generator.rb
386
393
  - lib/generators/sufia/models/fulltext_generator.rb
387
394
  - lib/generators/sufia/models/install_generator.rb
388
395
  - lib/generators/sufia/models/orcid_field_generator.rb
389
396
  - lib/generators/sufia/models/proxies_generator.rb
390
397
  - lib/generators/sufia/models/templates/app/models/collection.rb
391
398
  - lib/generators/sufia/models/templates/config/analytics.yml
399
+ - lib/generators/sufia/models/templates/config/arkivo.yml
400
+ - lib/generators/sufia/models/templates/config/arkivo_constraint.rb
392
401
  - lib/generators/sufia/models/templates/config/clamav.rb
393
- - lib/generators/sufia/models/templates/config/mailboxer.rb
394
402
  - lib/generators/sufia/models/templates/config/mime_types.rb
395
403
  - lib/generators/sufia/models/templates/config/redis.yml
396
404
  - lib/generators/sufia/models/templates/config/redis_config.rb
397
405
  - lib/generators/sufia/models/templates/config/resque-pool.yml
406
+ - lib/generators/sufia/models/templates/config/resque.rake
398
407
  - lib/generators/sufia/models/templates/config/resque_admin.rb
399
408
  - lib/generators/sufia/models/templates/config/resque_config.rb
400
409
  - lib/generators/sufia/models/templates/config/setup_mail.rb
401
410
  - lib/generators/sufia/models/templates/config/solrconfig.xml
402
411
  - lib/generators/sufia/models/templates/config/sufia.rb
412
+ - lib/generators/sufia/models/templates/config/zotero.yml
403
413
  - lib/generators/sufia/models/templates/migrations/acts_as_follower_migration.rb
414
+ - lib/generators/sufia/models/templates/migrations/add_arkivo_to_users.rb
404
415
  - lib/generators/sufia/models/templates/migrations/add_avatars_to_users.rb
405
416
  - lib/generators/sufia/models/templates/migrations/add_external_key_to_content_blocks.rb
406
417
  - lib/generators/sufia/models/templates/migrations/add_groups_to_users.rb
@@ -470,7 +481,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
470
481
  version: '0'
471
482
  requirements: []
472
483
  rubyforge_project:
473
- rubygems_version: 2.4.6
484
+ rubygems_version: 2.4.5
474
485
  signing_key:
475
486
  specification_version: 4
476
487
  summary: Models and services for sufia
@@ -1,45 +0,0 @@
1
- require 'noid'
2
-
3
- module Sufia
4
- module IdService
5
-
6
- def self.noid_template
7
- Sufia.config.noid_template
8
- end
9
-
10
- @minter = ::Noid::Minter.new(template: noid_template)
11
- @semaphore = Mutex.new
12
- def self.valid?(identifier)
13
- # remove the fedora namespace since it's not part of the noid
14
- noid = identifier#.split(":").last
15
- @minter.valid? noid
16
- end
17
- def self.mint
18
- @semaphore.synchronize do
19
- while true
20
- id = self.next_id
21
- return id unless ActiveFedora::Base.exists?(id)
22
- end
23
- end
24
- end
25
-
26
- protected
27
-
28
- def self.next_id
29
- id = ''
30
- File.open(Sufia.config.minter_statefile, File::RDWR|File::CREAT, 0644) do |f|
31
- f.flock(File::LOCK_EX)
32
- yaml = YAML::load(f.read)
33
- yaml = {template: noid_template} unless yaml
34
- minter = ::Noid::Minter.new(yaml)
35
- id = minter.mint
36
- f.rewind
37
- yaml = YAML::dump(minter.dump)
38
- f.write yaml
39
- f.flush
40
- f.truncate(f.pos)
41
- end
42
- id
43
- end
44
- end
45
- end
@@ -1,17 +0,0 @@
1
- Mailboxer.setup do |config|
2
-
3
- #Configures if you applications uses or no the email sending for Notifications and Messages
4
- config.uses_emails = true
5
-
6
- #Configures the default from for the email sent for Messages and Notifications of Mailboxer
7
- config.default_from = "no-reply@mailboxer.com"
8
-
9
- #Configures the methods needed by mailboxer
10
- config.email_method = :mailboxer_email
11
- config.name_method = :name
12
-
13
- #Configures if you use or not a search engine and wich one are you using
14
- #Supported enignes: [:solr,:sphinx]
15
- config.search_enabled = false
16
- config.search_engine = :solr
17
- end