sufia-models 4.0.0.beta2 → 4.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
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