sufia-models 4.0.0.beta2 → 4.0.0.beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/actors/sufia/generic_file/actor.rb +118 -0
  3. data/app/models/batch.rb +3 -3
  4. data/app/models/checksum_audit_log.rb +3 -3
  5. data/app/models/collection.rb +41 -0
  6. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file.rb +33 -43
  7. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/accessible_attributes.rb +3 -3
  8. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/audit.rb +12 -18
  9. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/characterization.rb +1 -8
  10. data/app/models/concerns/sufia/generic_file/derivatives.rb +26 -0
  11. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/export.rb +13 -13
  12. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/featured.rb +0 -0
  13. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/metadata.rb +0 -0
  14. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/mime_types.rb +15 -1
  15. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/permissions.rb +5 -1
  16. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/reload_on_save.rb +0 -0
  17. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/trophies.rb +0 -0
  18. data/app/models/concerns/sufia/generic_file/versions.rb +16 -0
  19. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/virus_check.rb +2 -3
  20. data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/web_form.rb +9 -2
  21. data/app/models/concerns/sufia/properties_datastream_behavior.rb +3 -4
  22. data/app/models/concerns/sufia/user.rb +2 -2
  23. data/app/models/datastreams/fits_datastream.rb +137 -136
  24. data/app/models/datastreams/generic_file_rdf_datastream.rb +6 -0
  25. data/app/models/datastreams/paranoid_rights_datastream.rb +3 -3
  26. data/app/models/file_usage.rb +53 -0
  27. data/app/models/follow.rb +2 -4
  28. data/app/models/geo_names_resource.rb +5 -7
  29. data/app/models/local_authority.rb +14 -14
  30. data/app/models/single_use_link.rb +1 -1
  31. data/app/models/sufia/download.rb +9 -0
  32. data/app/models/trophy.rb +1 -1
  33. data/app/services/sufia/{usage_statistics.rb → analytics.rb} +1 -24
  34. data/app/services/sufia/id_service.rb +2 -2
  35. data/lib/generators/sufia/models/install_generator.rb +5 -2
  36. data/lib/generators/sufia/models/templates/config/setup_mail.rb +1 -1
  37. data/lib/generators/sufia/models/templates/config/sufia.rb +5 -3
  38. data/lib/generators/sufia/models/templates/migrations/acts_as_follower_migration.rb +6 -6
  39. data/lib/generators/sufia/models/templates/migrations/create_checksum_audit_logs.rb +2 -3
  40. data/lib/generators/sufia/models/templates/migrations/create_local_authorities.rb +20 -20
  41. data/lib/sufia/ability.rb +1 -1
  42. data/lib/sufia/models/engine.rb +3 -9
  43. data/lib/sufia/models/file_content/versions.rb +3 -3
  44. data/lib/sufia/models/jobs/active_fedora_pid_based_job.rb +6 -2
  45. data/lib/sufia/models/jobs/batch_update_job.rb +6 -10
  46. data/lib/sufia/models/jobs/characterize_job.rb +1 -13
  47. data/lib/sufia/models/jobs/create_derivatives_job.rb +14 -0
  48. data/lib/sufia/models/jobs/import_url_job.rb +27 -23
  49. data/lib/sufia/models/version.rb +1 -1
  50. data/lib/tasks/sufia-models_tasks.rake +1 -1
  51. data/sufia-models.gemspec +1 -1
  52. metadata +65 -64
  53. data/lib/sufia/models/generic_file/actions.rb +0 -50
  54. data/lib/sufia/models/generic_file/derivatives.rb +0 -31
  55. data/lib/sufia/models/generic_file/thumbnail.rb +0 -37
  56. data/lib/sufia/models/generic_file/versions.rb +0 -16
  57. data/lib/sufia/models/jobs/transcode_audio_job.rb +0 -15
  58. data/lib/sufia/models/jobs/transcode_video_job.rb +0 -15
  59. data/lib/sufia/models/solr_document_behavior.rb +0 -118
@@ -1,50 +0,0 @@
1
- module Sufia::GenericFile
2
- # Actions are decoupled from controller logic so that they may be called from a controller or a background job.
3
- module Actions
4
- def self.create_metadata(generic_file, user, batch_id)
5
- generic_file.apply_depositor_metadata(user)
6
- generic_file.date_uploaded = Date.today
7
- generic_file.date_modified = Date.today
8
- generic_file.creator = user.name
9
-
10
- if batch_id
11
- generic_file.add_relationship("isPartOf", "info:fedora/#{Sufia::Noid.namespaceize(batch_id)}")
12
- else
13
- logger.warn "unable to find batch to attach to"
14
- end
15
- yield(generic_file) if block_given?
16
- generic_file.save!
17
- end
18
-
19
- def self.create_content(generic_file, file, file_name, dsid, user)
20
- generic_file.add_file(file, dsid, file_name)
21
-
22
- save_tries = 0
23
- begin
24
- generic_file.save!
25
- rescue RSolr::Error::Http => error
26
- logger.warn "GenericFilesController::create_and_save_generic_file Caught RSOLR error #{error.inspect}"
27
- save_tries+=1
28
- # fail for good if the tries is greater than 3
29
- raise error if save_tries >=3
30
- sleep 0.01
31
- retry
32
- end
33
-
34
- generic_file.record_version_committer(user)
35
- if Sufia.config.respond_to?(:after_create_content)
36
- Sufia.config.after_create_content.call(generic_file, user)
37
- end
38
- end
39
-
40
- def self.virus_check(file)
41
- path = file.is_a?(String) ? file : file.path
42
- unless defined?(ClamAV)
43
- logger.warn "Virus checking disabled, #{path} not checked"
44
- return
45
- end
46
- scan_result = ClamAV.instance.scanfile(path)
47
- raise Sufia::VirusFoundError.new("A virus was found in #{path}: #{scan_result}") unless scan_result == 0
48
- end
49
- end
50
- end
@@ -1,31 +0,0 @@
1
- module Sufia
2
- module GenericFile
3
- module Derivatives
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- include Hydra::Derivatives
8
-
9
- makes_derivatives do |obj|
10
- case obj.mime_type
11
- when *pdf_mime_types
12
- obj.transform_datastream :content,
13
- { :thumbnail => {size: "338x493", datastream: 'thumbnail'} }
14
- when *audio_mime_types
15
- obj.transform_datastream :content,
16
- { :mp3 => {format: 'mp3', datastream: 'mp3'},
17
- :ogg => {format: 'ogg', datastream: 'ogg'} }, processor: :audio
18
- when *video_mime_types
19
- obj.transform_datastream :content,
20
- { :webm => {format: "webm", datastream: 'webm'},
21
- :mp4 => {format: "mp4", datastream: 'mp4'} }, processor: :video
22
- when *image_mime_types
23
- obj.transform_datastream :content, { :thumbnail => {size: "200x150>", datastream: 'thumbnail'} }
24
- end
25
- end
26
- end
27
-
28
- end
29
- end
30
- end
31
-
@@ -1,37 +0,0 @@
1
- module Sufia
2
- module GenericFile
3
- module Thumbnail
4
- extend ActiveSupport::Concern
5
- # Create thumbnail requires that the characterization has already been run (so mime_type, width and height is available)
6
- # and that the object is already has a pid set
7
- def create_thumbnail
8
- return unless self.content.has_content?
9
-
10
- if video?
11
- create_video_thumbnail
12
- else
13
- create_derivatives
14
- end
15
- self.save
16
- end
17
-
18
- protected
19
- def create_video_thumbnail
20
- return unless Sufia.config.enable_ffmpeg
21
-
22
- output_file = Dir::Tmpname.create(['sufia', ".png"], Sufia.config.temp_file_base){}
23
- content.to_tempfile do |f|
24
- # we could use something like this in order to find a frame in the middle.
25
- #ffprobe -show_files video.avi 2> /dev/null | grep duration | cut -d= -f2 53.399999
26
- command = "#{Sufia.config.ffmpeg_path} -i \"#{f.path}\" -loglevel quiet -vf \"scale=338:-1\" -r 1 -t 1 #{output_file}"
27
- system(command)
28
- raise "Unable to execute command \"#{command}\"" unless $?.success?
29
- end
30
-
31
- self.thumbnail.content = File.open(output_file, 'rb').read
32
- self.thumbnail.mimeType = 'image/png'
33
- end
34
-
35
- end
36
- end
37
- end
@@ -1,16 +0,0 @@
1
- module Sufia
2
- module GenericFile
3
- module Versions
4
- def record_version_committer(user)
5
- version = content.latest_version
6
- # content datastream not (yet?) present
7
- return if version.nil?
8
- VersionCommitter.create(:obj_id => version.pid,
9
- :datastream_id => version.dsid,
10
- :version_id => version.versionID,
11
- :committer_login => user.user_key)
12
- end
13
-
14
- end
15
- end
16
- end
@@ -1,15 +0,0 @@
1
- # Created by: Justin Coyne
2
- # 7 Feb 2013
3
- # An asyncronous job for transcoding audio files using FFMpeg
4
-
5
- class TranscodeAudioJob < ActiveFedoraPidBasedJob
6
- def queue_name
7
- :audio
8
- end
9
-
10
- def run
11
- generic_file.create_derivatives
12
- generic_file.save
13
- end
14
-
15
- end
@@ -1,15 +0,0 @@
1
- # Created by: Justin Coyne
2
- # 13 Dec 2012
3
- # An asyncronous job for transcoding video files using FFMpeg
4
-
5
- class TranscodeVideoJob < ActiveFedoraPidBasedJob
6
- def queue_name
7
- :video
8
- end
9
-
10
- def run
11
- generic_file.create_derivatives
12
- generic_file.save
13
- end
14
- end
15
-
@@ -1,118 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- module Sufia
3
- module SolrDocumentBehavior
4
- def title_or_label
5
- title || label
6
- end
7
-
8
- ##
9
- # Give our SolrDocument an ActiveModel::Naming appropriate route_key
10
- def route_key
11
- get(Solrizer.solr_name('has_model', :symbol)).split(':').last.downcase
12
- end
13
-
14
- def to_param
15
- noid
16
- end
17
-
18
- ##
19
- # Offer the source (ActiveFedora-based) model to Rails for some of the
20
- # Rails methods (e.g. link_to).
21
- # @example
22
- # link_to '...', SolrDocument(:id => 'bXXXXXX5').new => <a href="/dams_object/bXXXXXX5">...</a>
23
- def to_model
24
- m = ActiveFedora::Base.load_instance_from_solr(id, self)
25
- return self if m.class == ActiveFedora::Base
26
- m
27
- end
28
-
29
- def noid
30
- self[Solrizer.solr_name('noid', Sufia::GenericFile.noid_indexer)]
31
- end
32
-
33
- def date_uploaded
34
- field = self[Solrizer.solr_name("desc_metadata__date_uploaded", :stored_sortable, type: :date)]
35
- return unless field.present?
36
- begin
37
- Date.parse(field).to_formatted_s(:standard)
38
- rescue
39
- logger.info "Unable to parse date: #{field.first.inspect} for #{self['id']}"
40
- end
41
- end
42
-
43
- def depositor(default = '')
44
- val = Array(self[Solrizer.solr_name("depositor")]).first
45
- val.present? ? val : default
46
- end
47
-
48
- def title
49
- Array(self[Solrizer.solr_name('desc_metadata__title')]).first
50
- end
51
-
52
- def description
53
- Array(self[Solrizer.solr_name('desc_metadata__description')]).first
54
- end
55
-
56
- def label
57
- Array(self[Solrizer.solr_name('label')]).first
58
- end
59
-
60
- def file_format
61
- Array(self[Solrizer.solr_name('file_format')]).first
62
- end
63
-
64
- def creator
65
- Array(self[Solrizer.solr_name("desc_metadata__creator")]).first
66
- end
67
-
68
- def tags
69
- Array(self[Solrizer.solr_name("desc_metadata__tag")])
70
- end
71
-
72
- def resource_type
73
- Array(self[Solrizer.solr_name("desc_metadata__resource_type")])
74
- end
75
-
76
- def mime_type
77
- Array(self[Solrizer.solr_name("mime_type")]).first
78
- end
79
-
80
- def read_groups
81
- Array(self[::Ability.read_group_field])
82
- end
83
-
84
- def edit_groups
85
- Array(self[::Ability.edit_group_field])
86
- end
87
-
88
- def edit_people
89
- Array(self[::Ability.edit_user_field])
90
- end
91
-
92
- def public?
93
- read_groups.include?('public')
94
- end
95
-
96
- def registered?
97
- read_groups.include?('registered')
98
- end
99
-
100
- def pdf?
101
- ['application/pdf'].include? self.mime_type
102
- end
103
-
104
- def image?
105
- ['image/png','image/jpeg', 'image/jpg', 'image/jp2', 'image/bmp', 'image/gif'].include? self.mime_type
106
- end
107
-
108
- def video?
109
- ['video/mpeg', 'video/mp4', 'video/webm', 'video/x-msvideo', 'video/avi', 'video/quicktime', 'application/mxf'].include? self.mime_type
110
- end
111
-
112
- def audio?
113
- # audio/x-wave is the mime type that fits 0.6.0 returns for a wav file.
114
- # audio/mpeg is the mime type that fits 0.6.0 returns for an mp3 file.
115
- ['audio/mp3', 'audio/mpeg', 'audio/x-wave', 'audio/x-wav', 'audio/ogg'].include? self.mime_type
116
- end
117
- end
118
- end