sufia-models 6.2.0 → 6.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/actors/sufia/generic_file/actor.rb +4 -7
- data/app/jobs/active_fedora_id_based_job.rb +1 -1
- data/app/jobs/active_fedora_pid_based_job.rb +1 -2
- data/app/jobs/audit_job.rb +1 -1
- data/app/jobs/batch_update_job.rb +6 -6
- data/app/jobs/create_derivatives_job.rb +2 -3
- data/app/jobs/import_url_job.rb +8 -5
- data/app/jobs/ingest_local_file_job.rb +1 -1
- data/app/models/batch.rb +15 -21
- data/app/models/checksum_audit_log.rb +0 -1
- data/app/models/concerns/sufia/ability.rb +5 -0
- data/app/models/concerns/sufia/collection_behavior.rb +3 -2
- data/app/models/concerns/sufia/file_stat_utils.rb +19 -21
- data/app/models/concerns/sufia/generic_file/batches.rb +1 -3
- data/app/models/concerns/sufia/generic_file/characterization.rb +11 -16
- data/app/models/concerns/sufia/generic_file/content.rb +0 -1
- data/app/models/concerns/sufia/generic_file/derivatives.rb +2 -2
- data/app/models/concerns/sufia/generic_file/export.rb +50 -59
- data/app/models/concerns/sufia/generic_file/full_text_indexing.rb +15 -18
- data/app/models/concerns/sufia/generic_file/metadata.rb +0 -2
- data/app/models/concerns/sufia/generic_file/mime_types.rb +9 -9
- data/app/models/concerns/sufia/generic_file/permissions.rb +0 -1
- data/app/models/concerns/sufia/generic_file/proxy_deposit.rb +0 -1
- data/app/models/concerns/sufia/generic_file/querying.rb +9 -5
- data/app/models/concerns/sufia/generic_file/trophies.rb +1 -1
- data/app/models/concerns/sufia/generic_file/versions.rb +0 -4
- data/app/models/concerns/sufia/model_methods.rb +0 -1
- data/app/models/concerns/sufia/user.rb +15 -15
- data/app/models/concerns/sufia/user_usage_stats.rb +0 -2
- data/app/models/datastreams/fits_datastream.rb +25 -25
- data/app/models/domain_term.rb +2 -3
- data/app/models/featured_work.rb +3 -5
- data/app/models/file_download_stat.rb +3 -4
- data/app/models/file_usage.rb +10 -11
- data/app/models/file_view_stat.rb +3 -3
- data/app/models/follow.rb +1 -1
- data/app/models/geo_names_resource.rb +3 -3
- data/app/models/group.rb +1 -3
- data/app/models/local_authority.rb +26 -28
- data/app/models/proxy_deposit_request.rb +9 -9
- data/app/models/single_use_link.rb +10 -18
- data/app/models/sufia/download.rb +2 -2
- data/app/models/sufia/pageview.rb +1 -1
- data/app/models/trophy.rb +2 -4
- data/app/services/sufia/analytics.rb +10 -11
- data/app/services/sufia/generic_file_audit_service.rb +11 -12
- data/app/services/sufia/repository_audit_service.rb +1 -1
- data/config/locales/sufia.en.yml +2 -0
- data/lib/generators/sufia/models/abstract_migration_generator.rb +7 -6
- data/lib/generators/sufia/models/install_generator.rb +3 -3
- data/lib/generators/sufia/models/templates/config/arkivo_constraint.rb +1 -1
- data/lib/generators/sufia/models/templates/config/clamav.rb +1 -1
- data/lib/generators/sufia/models/templates/config/redis_config.rb +13 -5
- data/lib/generators/sufia/models/templates/config/resque_admin.rb +2 -2
- data/lib/generators/sufia/models/templates/config/resque_config.rb +1 -1
- data/lib/generators/sufia/models/templates/config/sufia.rb +10 -4
- data/lib/generators/sufia/models/templates/migrations/create_checksum_audit_logs.rb +1 -1
- data/lib/generators/sufia/models/templates/migrations/create_file_download_stats.rb +1 -1
- data/lib/generators/sufia/models/templates/migrations/create_file_view_stats.rb +1 -1
- data/lib/generators/sufia/models/templates/migrations/create_local_authorities.rb +1 -1
- data/lib/generators/sufia/models/update_content_blocks_generator.rb +0 -1
- data/lib/generators/sufia/models/upgrade600_generator.rb +0 -1
- data/lib/generators/sufia/models/user_stats_generator.rb +2 -2
- data/lib/sufia/messages.rb +17 -17
- data/lib/sufia/models.rb +1 -1
- data/lib/sufia/models/active_fedora/redis.rb +1 -4
- data/lib/sufia/models/active_record/redis.rb +2 -3
- data/lib/sufia/models/engine.rb +12 -7
- data/lib/sufia/models/file_content/versions.rb +0 -1
- data/lib/sufia/models/resque.rb +2 -2
- data/lib/sufia/models/stats/user_stat_importer.rb +65 -67
- data/lib/sufia/models/user_local_directory_behavior.rb +9 -13
- data/lib/sufia/models/utils.rb +1 -2
- data/lib/sufia/models/version.rb +1 -1
- data/lib/sufia/permissions.rb +0 -1
- data/lib/sufia/permissions/readable.rb +0 -1
- data/lib/sufia/permissions/writable.rb +20 -23
- data/lib/tasks/sufia-models_tasks.rake +18 -0
- data/sufia-models.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8aaf1e2e42b84b0e4a1331a69fa75380c39b5d8
|
4
|
+
data.tar.gz: aa45e5332b4d18964bd006da94f500081a848b46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78bd0e47f109f0c8eecfc861458d6ba77726f77ca72f1eb42f2e8969a0fc7409c1f7739b2c1f3c649eb847e658788b45c6cfd0a2c1817ef5c640f3e6e9546ce1
|
7
|
+
data.tar.gz: 991b122862009f831320945391d228c1068259b27d1102e44176ed5dea353cb9d366a93b8776f978da8cd0b688c31734247ea1c97267f07fbe03d0c8692d0ae4
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Sufia::GenericFile
|
2
2
|
# Actions are decoupled from controller logic so that they may be called from a controller or a background job.
|
3
3
|
class Actor
|
4
|
-
|
5
4
|
attr_reader :generic_file, :user
|
6
5
|
|
7
6
|
def initialize(generic_file, user)
|
@@ -73,9 +72,7 @@ module Sufia::GenericFile
|
|
73
72
|
def destroy
|
74
73
|
generic_file.destroy
|
75
74
|
FeaturedWork.where(generic_file_id: generic_file.id).destroy_all
|
76
|
-
if Sufia.config.respond_to?(:after_destroy)
|
77
|
-
Sufia.config.after_destroy.call(generic_file.id, user)
|
78
|
-
end
|
75
|
+
Sufia.config.after_destroy.call(generic_file.id, user) if Sufia.config.respond_to?(:after_destroy)
|
79
76
|
end
|
80
77
|
|
81
78
|
# Takes an optional block and executes the block if the save was successful.
|
@@ -93,9 +90,9 @@ module Sufia::GenericFile
|
|
93
90
|
return false unless generic_file.save
|
94
91
|
rescue RSolr::Error::Http => error
|
95
92
|
ActiveFedora::Base.logger.warn "Sufia::GenericFile::Actor::save_and_record_committer Caught RSOLR error #{error.inspect}"
|
96
|
-
save_tries+=1
|
93
|
+
save_tries += 1
|
97
94
|
# fail for good if the tries is greater than 3
|
98
|
-
raise error if save_tries >=3
|
95
|
+
raise error if save_tries >= 3
|
99
96
|
sleep 0.01
|
100
97
|
retry
|
101
98
|
end
|
@@ -116,7 +113,7 @@ module Sufia::GenericFile
|
|
116
113
|
return
|
117
114
|
end
|
118
115
|
scan_result = ClamAV.instance.scanfile(path)
|
119
|
-
raise Sufia::VirusFoundError
|
116
|
+
raise Sufia::VirusFoundError, "A virus was found in #{path}: #{scan_result}" unless scan_result == 0
|
120
117
|
end
|
121
118
|
end
|
122
119
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
class ActiveFedoraPidBasedJob < ActiveFedoraIdBasedJob
|
2
2
|
extend Deprecation
|
3
|
-
def self.extended(
|
3
|
+
def self.extended(_document)
|
4
4
|
Deprecation.warn ActiveFedoraPidBasedJob, "ActiveFedoraPidBasedJob is deprecated; use ActiveFedoraIdBasedJob instead."
|
5
5
|
end
|
6
6
|
end
|
7
|
-
|
data/app/jobs/audit_job.rb
CHANGED
@@ -27,7 +27,7 @@ class AuditJob < ActiveFedoraIdBasedJob
|
|
27
27
|
login = generic_file.depositor
|
28
28
|
user = User.find_by_user_key(login)
|
29
29
|
logger.warn "User '#{login}' not found" unless user
|
30
|
-
job_user = User.audituser
|
30
|
+
job_user = User.audituser
|
31
31
|
file_title = generic_file.title.first
|
32
32
|
message = "The audit run at #{log.created_at} for #{file_title} (#{uri}) failed."
|
33
33
|
subject = FAIL
|
@@ -19,8 +19,8 @@ class BatchUpdateJob
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def run
|
22
|
-
batch = Batch.find_or_create(
|
23
|
-
user = User.find_by_user_key(
|
22
|
+
batch = Batch.find_or_create(batch_id)
|
23
|
+
user = User.find_by_user_key(login)
|
24
24
|
|
25
25
|
batch.generic_files.each do |gf|
|
26
26
|
update_file(gf, user)
|
@@ -43,7 +43,7 @@ class BatchUpdateJob
|
|
43
43
|
end
|
44
44
|
gf.title = title[gf.id] if title[gf.id]
|
45
45
|
gf.attributes = file_attributes
|
46
|
-
gf.visibility= visibility
|
46
|
+
gf.visibility = visibility
|
47
47
|
|
48
48
|
save_tries = 0
|
49
49
|
begin
|
@@ -52,7 +52,7 @@ class BatchUpdateJob
|
|
52
52
|
save_tries += 1
|
53
53
|
ActiveFedora::Base.logger.warn "BatchUpdateJob caught RSOLR error on #{gf.id}: #{error.inspect}"
|
54
54
|
# fail for good if the tries is greater than 3
|
55
|
-
raise error if save_tries >=3
|
55
|
+
raise error if save_tries >= 3
|
56
56
|
sleep 0.01
|
57
57
|
retry
|
58
58
|
end #
|
@@ -60,12 +60,12 @@ class BatchUpdateJob
|
|
60
60
|
saved << gf
|
61
61
|
end
|
62
62
|
|
63
|
-
def send_user_success_message
|
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
65
|
User.batchuser.send_message(user, message, success_subject, false)
|
66
66
|
end
|
67
67
|
|
68
|
-
def send_user_failure_message
|
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
70
|
User.batchuser.send_message(user, message, failure_subject, false)
|
71
71
|
end
|
@@ -5,9 +5,8 @@ class CreateDerivativesJob < ActiveFedoraIdBasedJob
|
|
5
5
|
|
6
6
|
def run
|
7
7
|
return unless generic_file.content.has_content?
|
8
|
-
if generic_file.video?
|
9
|
-
|
10
|
-
end
|
8
|
+
return if generic_file.video? && !Sufia.config.enable_ffmpeg
|
9
|
+
|
11
10
|
generic_file.create_derivatives
|
12
11
|
generic_file.save
|
13
12
|
end
|
data/app/jobs/import_url_job.rb
CHANGED
@@ -3,7 +3,6 @@ require 'uri'
|
|
3
3
|
require 'tempfile'
|
4
4
|
|
5
5
|
class ImportUrlJob < ActiveFedoraIdBasedJob
|
6
|
-
|
7
6
|
def queue_name
|
8
7
|
:import_url
|
9
8
|
end
|
@@ -11,8 +10,12 @@ class ImportUrlJob < ActiveFedoraIdBasedJob
|
|
11
10
|
def run
|
12
11
|
user = User.find_by_user_key(generic_file.depositor)
|
13
12
|
|
14
|
-
Tempfile.open(id.
|
13
|
+
Tempfile.open(id.tr('/', '_')) do |f|
|
15
14
|
path, mime_type = copy_remote_file(generic_file.import_url, f)
|
15
|
+
|
16
|
+
# reload the generic file once the data is copied since this is a long running task
|
17
|
+
generic_file.reload
|
18
|
+
|
16
19
|
# attach downloaded file to generic file stubbed out
|
17
20
|
if Sufia::GenericFile::Actor.new(generic_file, user).create_content(f, path, 'content', mime_type)
|
18
21
|
# add message to user for downloaded file
|
@@ -24,12 +27,12 @@ class ImportUrlJob < ActiveFedoraIdBasedJob
|
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
|
-
def copy_remote_file(
|
30
|
+
def copy_remote_file(_import_url, f)
|
28
31
|
f.binmode
|
29
32
|
# download file from url
|
30
33
|
uri = URI(generic_file.import_url)
|
31
34
|
http = Net::HTTP.new(uri.host, uri.port)
|
32
|
-
http.use_ssl = uri.scheme == "https"
|
35
|
+
http.use_ssl = uri.scheme == "https" # enable SSL/TLS
|
33
36
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
34
37
|
mime_type = nil
|
35
38
|
|
@@ -43,7 +46,7 @@ class ImportUrlJob < ActiveFedoraIdBasedJob
|
|
43
46
|
end
|
44
47
|
|
45
48
|
f.rewind
|
46
|
-
|
49
|
+
[uri.path, mime_type]
|
47
50
|
end
|
48
51
|
|
49
52
|
def job_user
|
@@ -12,7 +12,7 @@ class IngestLocalFileJob
|
|
12
12
|
self.user_key = user_key
|
13
13
|
end
|
14
14
|
|
15
|
-
#TODO this should use Actor#create_content
|
15
|
+
# TODO: this should use Actor#create_content
|
16
16
|
def run
|
17
17
|
user = User.find_by_user_key(user_key)
|
18
18
|
raise "Unable to find user for #{user_key}" unless user
|
data/app/models/batch.rb
CHANGED
@@ -10,27 +10,21 @@ class Batch < ActiveFedora::Base
|
|
10
10
|
property :status, predicate: ::RDF::DC.type
|
11
11
|
|
12
12
|
def self.find_or_create(id)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
safe_create(id)
|
17
|
-
end
|
13
|
+
Batch.find(id)
|
14
|
+
rescue ActiveFedora::ObjectNotFoundError
|
15
|
+
safe_create(id)
|
18
16
|
end
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# then we are good to go.
|
33
|
-
Batch.find(id)
|
34
|
-
end
|
35
|
-
end
|
18
|
+
# This method handles most race conditions gracefully.
|
19
|
+
# If a batch with the same ID is created by another thread
|
20
|
+
# we fetch the batch that was created (rather than throwing
|
21
|
+
# an error) and continute.
|
22
|
+
def self.safe_create(id)
|
23
|
+
Batch.create(id: id)
|
24
|
+
rescue ActiveFedora::IllegalOperation
|
25
|
+
# This is the exception thrown by LDP when we attempt to
|
26
|
+
# create a duplicate object. If we can find the object
|
27
|
+
# then we are good to go.
|
28
|
+
Batch.find(id)
|
29
|
+
end
|
36
30
|
end
|
@@ -12,6 +12,7 @@ module Sufia
|
|
12
12
|
featured_work_abilities
|
13
13
|
editor_abilities
|
14
14
|
stats_abilities
|
15
|
+
citation_abilities
|
15
16
|
proxy_deposit_abilities
|
16
17
|
end
|
17
18
|
|
@@ -51,6 +52,10 @@ module Sufia
|
|
51
52
|
alias_action :stats, to: :read
|
52
53
|
end
|
53
54
|
|
55
|
+
def citation_abilities
|
56
|
+
alias_action :citation, to: :read
|
57
|
+
end
|
58
|
+
|
54
59
|
private
|
55
60
|
|
56
61
|
def depositor_for_document(document_id)
|
@@ -16,7 +16,7 @@ module Sufia
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# Compute the sum of each file in the collection using Solr to
|
19
|
-
# avoid having to hit Fedora
|
19
|
+
# avoid having to hit Fedora
|
20
20
|
#
|
21
21
|
# @return [Fixnum] size of collection in bytes
|
22
22
|
# @raise [RuntimeError] unsaved record does not exist in solr
|
@@ -34,10 +34,11 @@ module Sufia
|
|
34
34
|
}
|
35
35
|
|
36
36
|
files = ActiveFedora::SolrService.query(query, args)
|
37
|
-
files.reduce(0) { |sum, f| sum
|
37
|
+
files.reduce(0) { |sum, f| sum + f[file_size_field].to_i }
|
38
38
|
end
|
39
39
|
|
40
40
|
protected
|
41
|
+
|
41
42
|
# Field to look up when locating the size of each file in Solr.
|
42
43
|
# Override for your own installation if using something different
|
43
44
|
def file_size_field
|
@@ -1,35 +1,33 @@
|
|
1
1
|
module Sufia
|
2
2
|
module FileStatUtils
|
3
|
-
|
4
|
-
|
5
|
-
stats.map {|stat| stat.to_flot}
|
3
|
+
def to_flots(stats)
|
4
|
+
stats.map(&:to_flot)
|
6
5
|
end
|
7
6
|
|
8
|
-
def convert_date
|
7
|
+
def convert_date(date_time)
|
9
8
|
date_time.to_datetime.to_i * 1000
|
10
9
|
end
|
11
10
|
|
12
11
|
private
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
def cached_stats(file_id, start_date, _method)
|
14
|
+
stats = where(file_id: file_id).order(date: :asc)
|
15
|
+
ga_start_date = stats.size > 0 ? stats[stats.size - 1].date + 1.day : start_date.to_date
|
16
|
+
{ ga_start_date: ga_start_date, cached_stats: stats.to_a }
|
17
|
+
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
19
|
+
def combined_stats(file_id, start_date, object_method, ga_key, user_id = nil)
|
20
|
+
stat_cache_info = cached_stats(file_id, start_date, object_method)
|
21
|
+
stats = stat_cache_info[:cached_stats]
|
22
|
+
if stat_cache_info[:ga_start_date] < Date.today
|
23
|
+
ga_stats = ga_statistics(stat_cache_info[:ga_start_date], file_id)
|
24
|
+
ga_stats.each do |stat|
|
25
|
+
lstat = new file_id: file_id, date: stat[:date], object_method => stat[ga_key], user_id: user_id
|
26
|
+
lstat.save unless Date.parse(stat[:date]) == Date.today
|
27
|
+
stats << lstat
|
28
|
+
end
|
29
29
|
end
|
30
|
+
stats
|
30
31
|
end
|
31
|
-
stats
|
32
|
-
end
|
33
|
-
|
34
32
|
end
|
35
33
|
end
|
@@ -50,7 +50,6 @@ module Sufia
|
|
50
50
|
property :data_format, delegate_to: 'characterization'
|
51
51
|
property :offset, delegate_to: 'characterization'
|
52
52
|
property :frame_rate, delegate_to: 'characterization'
|
53
|
-
|
54
53
|
end
|
55
54
|
|
56
55
|
def width
|
@@ -80,19 +79,16 @@ module Sufia
|
|
80
79
|
|
81
80
|
# Populate GenericFile's properties with fields from FITS (e.g. Author from pdfs)
|
82
81
|
def append_metadata
|
83
|
-
terms =
|
82
|
+
terms = characterization_terms
|
84
83
|
Sufia.config.fits_to_desc_mapping.each_pair do |k, v|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
proxy_term
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
# these are single-valued terms which cannot be appended to
|
94
|
-
self.send("#{v}=", term_value)
|
95
|
-
end
|
84
|
+
next unless terms.key?(k)
|
85
|
+
Array.wrap(terms[k]).each do |term_value|
|
86
|
+
proxy_term = send(v)
|
87
|
+
if proxy_term.is_a?(Array)
|
88
|
+
proxy_term << term_value unless proxy_term.include?(term_value)
|
89
|
+
else
|
90
|
+
# these are single-valued terms which cannot be appended to
|
91
|
+
send("#{v}=", term_value)
|
96
92
|
end
|
97
93
|
end
|
98
94
|
end
|
@@ -100,11 +96,11 @@ module Sufia
|
|
100
96
|
|
101
97
|
def characterization_terms
|
102
98
|
h = {}
|
103
|
-
FitsDatastream.terminology.terms.each_pair do |
|
99
|
+
FitsDatastream.terminology.terms.each_pair do |_k, v|
|
104
100
|
next unless v.respond_to? :proxied_term
|
105
101
|
term = v.proxied_term
|
106
102
|
begin
|
107
|
-
value =
|
103
|
+
value = send(term.name)
|
108
104
|
h[term.name] = value unless value.empty?
|
109
105
|
rescue NoMethodError
|
110
106
|
next
|
@@ -112,7 +108,6 @@ module Sufia
|
|
112
108
|
end
|
113
109
|
h
|
114
110
|
end
|
115
|
-
|
116
111
|
end
|
117
112
|
end
|
118
113
|
end
|
@@ -9,7 +9,7 @@ module Sufia
|
|
9
9
|
makes_derivatives do |obj|
|
10
10
|
case obj.mime_type
|
11
11
|
when *pdf_mime_types
|
12
|
-
obj.transform_file :content,
|
12
|
+
obj.transform_file :content, thumbnail: { format: 'jpg', size: '338x493', datastream: 'thumbnail' }
|
13
13
|
when *office_document_mime_types
|
14
14
|
obj.transform_file :content, { thumbnail: { format: 'jpg', size: '200x150>', datastream: 'thumbnail' } }, processor: :document
|
15
15
|
when *audio_mime_types
|
@@ -17,7 +17,7 @@ module Sufia
|
|
17
17
|
when *video_mime_types
|
18
18
|
obj.transform_file :content, { webm: { format: 'webm', datastream: 'webm' }, mp4: { format: 'mp4', datastream: 'mp4' }, thumbnail: { format: 'jpg', datastream: 'thumbnail' } }, processor: :video
|
19
19
|
when *image_mime_types
|
20
|
-
obj.transform_file :content,
|
20
|
+
obj.transform_file :content, thumbnail: { format: 'jpg', size: '200x150>', datastream: 'thumbnail' }
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -4,8 +4,8 @@ module Sufia
|
|
4
4
|
# MIME: 'application/x-endnote-refer'
|
5
5
|
def export_as_endnote
|
6
6
|
end_note_format = {
|
7
|
-
'%T' => [:title,
|
8
|
-
'%Q' => [:title,
|
7
|
+
'%T' => [:title, ->(x) { x.first }],
|
8
|
+
'%Q' => [:title, ->(x) { x.drop(1) }],
|
9
9
|
'%A' => [:creator],
|
10
10
|
'%C' => [:publication_place],
|
11
11
|
'%D' => [:date_created],
|
@@ -30,15 +30,15 @@ module Sufia
|
|
30
30
|
if mapping.is_a? String
|
31
31
|
values = [mapping]
|
32
32
|
else
|
33
|
-
values =
|
33
|
+
values = send(mapping[0]) if self.respond_to? mapping[0]
|
34
34
|
values = mapping[1].call(values) if mapping.length == 2
|
35
35
|
values = Array(values)
|
36
36
|
end
|
37
|
-
next if values.empty?
|
37
|
+
next if values.empty? || values.first.nil?
|
38
38
|
spaced_values = values.join("; ")
|
39
39
|
text << "#{endnote_key} #{spaced_values}"
|
40
40
|
end
|
41
|
-
|
41
|
+
text.join("\n")
|
42
42
|
end
|
43
43
|
|
44
44
|
def persistent_url
|
@@ -65,10 +65,10 @@ module Sufia
|
|
65
65
|
rights: 'rights'
|
66
66
|
}
|
67
67
|
field_map.each do |element, kev|
|
68
|
-
values =
|
69
|
-
next if values.empty?
|
68
|
+
values = send(element)
|
69
|
+
next if values.empty? || values.first.nil?
|
70
70
|
values.each do |value|
|
71
|
-
export_text << "rft.#{kev}=#{CGI
|
71
|
+
export_text << "rft.#{kev}=#{CGI.escape(value.to_s)}"
|
72
72
|
end
|
73
73
|
end
|
74
74
|
export_text.join('&') unless export_text.blank?
|
@@ -79,24 +79,24 @@ module Sufia
|
|
79
79
|
authors_list = []
|
80
80
|
authors_list_final = []
|
81
81
|
|
82
|
-
#setup formatted author list
|
83
|
-
authors =
|
82
|
+
# setup formatted author list
|
83
|
+
authors = author_list
|
84
84
|
authors.each do |author|
|
85
85
|
next if author.blank?
|
86
86
|
authors_list.push(abbreviate_name(author))
|
87
87
|
end
|
88
88
|
authors_list.each do |author|
|
89
|
-
if author == authors_list.first #first
|
89
|
+
if author == authors_list.first # first
|
90
90
|
authors_list_final.push(author.strip)
|
91
|
-
elsif author == authors_list.last #last
|
91
|
+
elsif author == authors_list.last # last
|
92
92
|
authors_list_final.push(", & " + author.strip)
|
93
|
-
else #all others
|
93
|
+
else # all others
|
94
94
|
authors_list_final.push(", " + author.strip)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
text << authors_list_final.join
|
98
98
|
unless text.blank?
|
99
|
-
if text[-1,1] != "."
|
99
|
+
if text[-1, 1] != "."
|
100
100
|
text << ". "
|
101
101
|
else
|
102
102
|
text << " "
|
@@ -111,11 +111,7 @@ module Sufia
|
|
111
111
|
|
112
112
|
# Publisher info
|
113
113
|
text << setup_pub_info unless setup_pub_info.nil?
|
114
|
-
unless text.blank?
|
115
|
-
if text[-1,1] != "."
|
116
|
-
text += "."
|
117
|
-
end
|
118
|
-
end
|
114
|
+
text += "." if text[-1, 1] != "." unless text.blank?
|
119
115
|
text.html_safe
|
120
116
|
end
|
121
117
|
|
@@ -123,22 +119,22 @@ module Sufia
|
|
123
119
|
text = ''
|
124
120
|
authors_final = []
|
125
121
|
|
126
|
-
#setup formatted author list
|
127
|
-
authors =
|
122
|
+
# setup formatted author list
|
123
|
+
authors = author_list
|
128
124
|
|
129
125
|
if authors.length < 4
|
130
126
|
authors.each do |author|
|
131
|
-
if author == authors.first #first
|
127
|
+
if author == authors.first # first
|
132
128
|
authors_final.push(author)
|
133
|
-
elsif author == authors.last #last
|
129
|
+
elsif author == authors.last # last
|
134
130
|
authors_final.push(", and " + name_reverse(author) + ".")
|
135
|
-
else #all others
|
131
|
+
else # all others
|
136
132
|
authors_final.push(", " + name_reverse(author))
|
137
133
|
end
|
138
134
|
end
|
139
135
|
text << authors_final.join
|
140
136
|
unless text.blank?
|
141
|
-
if text[-1,1] != "."
|
137
|
+
if text[-1, 1] != "."
|
142
138
|
text << ". "
|
143
139
|
else
|
144
140
|
text << " "
|
@@ -156,15 +152,13 @@ module Sufia
|
|
156
152
|
|
157
153
|
# Get Pub Date
|
158
154
|
text << setup_pub_date unless setup_pub_date.nil?
|
159
|
-
if text[-1,1] != "."
|
160
|
-
text << "." unless text.blank?
|
161
|
-
end
|
155
|
+
text << "." unless text.blank? if text[-1, 1] != "."
|
162
156
|
text.html_safe
|
163
157
|
end
|
164
158
|
|
165
159
|
def export_as_chicago_citation
|
166
160
|
author_text = ""
|
167
|
-
authors =
|
161
|
+
authors = all_authors
|
168
162
|
unless authors.blank?
|
169
163
|
if authors.length > 10
|
170
164
|
authors.each_with_index do |author, index|
|
@@ -183,7 +177,7 @@ module Sufia
|
|
183
177
|
end
|
184
178
|
author_text << " et al."
|
185
179
|
elsif authors.length > 1
|
186
|
-
authors.each_with_index do |author,index|
|
180
|
+
authors.each_with_index do |author, index|
|
187
181
|
if index == 0
|
188
182
|
author_text << "#{author}"
|
189
183
|
if author.ends_with?(",")
|
@@ -202,24 +196,22 @@ module Sufia
|
|
202
196
|
end
|
203
197
|
end
|
204
198
|
title_info = ""
|
205
|
-
title_info << citation_title(clean_end_punctuation(CGI
|
199
|
+
title_info << citation_title(clean_end_punctuation(CGI.escapeHTML(title.first)).strip) unless title.blank?
|
206
200
|
|
207
201
|
pub_info = ""
|
208
|
-
place =
|
202
|
+
place = based_near.first
|
209
203
|
publisher = self.publisher.first
|
210
204
|
unless place.blank?
|
211
|
-
place = CGI
|
205
|
+
place = CGI.escapeHTML(place)
|
212
206
|
pub_info << place
|
213
207
|
pub_info << ": " unless publisher.blank?
|
214
208
|
end
|
215
209
|
unless publisher.blank?
|
216
|
-
publisher = CGI
|
210
|
+
publisher = CGI.escapeHTML(publisher)
|
217
211
|
pub_info << publisher
|
218
212
|
pub_info << ", " unless setup_pub_date.nil?
|
219
213
|
end
|
220
|
-
unless setup_pub_date.nil?
|
221
|
-
pub_info << setup_pub_date
|
222
|
-
end
|
214
|
+
pub_info << setup_pub_date unless setup_pub_date.nil?
|
223
215
|
|
224
216
|
citation = ""
|
225
217
|
citation << "#{author_text} " unless author_text.blank?
|
@@ -231,10 +223,10 @@ module Sufia
|
|
231
223
|
private
|
232
224
|
|
233
225
|
def setup_pub_date
|
234
|
-
first_date =
|
226
|
+
first_date = date_created.first
|
235
227
|
unless first_date.blank?
|
236
|
-
first_date = CGI
|
237
|
-
date_value = first_date.gsub(/[^0-9|n\.d\.]/, "")[0,4]
|
228
|
+
first_date = CGI.escapeHTML(first_date)
|
229
|
+
date_value = first_date.gsub(/[^0-9|n\.d\.]/, "")[0, 4]
|
238
230
|
return nil if date_value.nil?
|
239
231
|
end
|
240
232
|
clean_end_punctuation(date_value) if date_value
|
@@ -242,15 +234,15 @@ module Sufia
|
|
242
234
|
|
243
235
|
def setup_pub_info
|
244
236
|
text = ''
|
245
|
-
place =
|
237
|
+
place = based_near.first
|
246
238
|
publisher = self.publisher.first
|
247
239
|
unless place.blank?
|
248
|
-
place = CGI
|
240
|
+
place = CGI.escapeHTML(place)
|
249
241
|
text << place
|
250
242
|
text << ": " unless publisher.blank?
|
251
243
|
end
|
252
244
|
unless publisher.blank?
|
253
|
-
publisher = CGI
|
245
|
+
publisher = CGI.escapeHTML(publisher)
|
254
246
|
text << publisher
|
255
247
|
end
|
256
248
|
return nil if text.strip.blank?
|
@@ -258,7 +250,7 @@ module Sufia
|
|
258
250
|
end
|
259
251
|
|
260
252
|
def mla_citation_title(text)
|
261
|
-
no_upcase = ["a","an","and","but","by","for","it","of","the","to","with"]
|
253
|
+
no_upcase = ["a", "an", "and", "but", "by", "for", "it", "of", "the", "to", "with"]
|
262
254
|
new_text = []
|
263
255
|
word_parts = text.split(" ")
|
264
256
|
word_parts.each do |w|
|
@@ -272,12 +264,12 @@ module Sufia
|
|
272
264
|
end
|
273
265
|
|
274
266
|
def citation_title(title_text)
|
275
|
-
prepositions = ["a","about","across","an","and","before","but","by","for","it","of","the","to","with","without"]
|
267
|
+
prepositions = ["a", "about", "across", "an", "and", "before", "but", "by", "for", "it", "of", "the", "to", "with", "without"]
|
276
268
|
new_text = []
|
277
|
-
title_text.split(" ").each_with_index do |word,index|
|
278
|
-
if (index == 0
|
269
|
+
title_text.split(" ").each_with_index do |word, index|
|
270
|
+
if (index == 0 && word != word.upcase) || (word.length > 1 && word != word.upcase && !prepositions.include?(word))
|
279
271
|
# the split("-") will handle the capitalization of hyphenated words
|
280
|
-
new_text << word.split("-").map!
|
272
|
+
new_text << word.split("-").map!(&:capitalize).join("-")
|
281
273
|
else
|
282
274
|
new_text << word
|
283
275
|
end
|
@@ -289,7 +281,7 @@ module Sufia
|
|
289
281
|
text = ''
|
290
282
|
title = self.title.first
|
291
283
|
unless title.blank?
|
292
|
-
title = CGI
|
284
|
+
title = CGI.escapeHTML(title)
|
293
285
|
title_info = clean_end_punctuation(title.strip)
|
294
286
|
text << title_info
|
295
287
|
end
|
@@ -299,26 +291,26 @@ module Sufia
|
|
299
291
|
end
|
300
292
|
|
301
293
|
def clean_end_punctuation(text)
|
302
|
-
if [".",",",":",";","/"].include? text[-1,1]
|
303
|
-
return text[0,text.length-1]
|
294
|
+
if [".", ",", ":", ";", "/"].include? text[-1, 1]
|
295
|
+
return text[0, text.length - 1]
|
304
296
|
end
|
305
297
|
text
|
306
298
|
end
|
307
299
|
|
308
|
-
def
|
309
|
-
|
300
|
+
def author_list
|
301
|
+
creator.map { |author| clean_end_punctuation(CGI.escapeHTML(author)) }.uniq
|
310
302
|
end
|
311
303
|
|
312
|
-
def
|
313
|
-
authors =
|
314
|
-
|
304
|
+
def all_authors
|
305
|
+
authors = creator
|
306
|
+
authors.empty? ? nil : authors.map { |author| CGI.escapeHTML(author) }
|
315
307
|
end
|
316
308
|
|
317
309
|
def abbreviate_name(name)
|
318
310
|
abbreviated_name = ''
|
319
311
|
name = name.join('') if name.is_a? Array
|
320
312
|
# make sure we handle "Cher" correctly
|
321
|
-
return name if !name.include?(' ')
|
313
|
+
return name if !name.include?(' ') && !name.include?(',')
|
322
314
|
surnames_first = name.include?(',')
|
323
315
|
delimiter = surnames_first ? ', ' : ' '
|
324
316
|
name_segments = name.split(delimiter)
|
@@ -335,9 +327,8 @@ module Sufia
|
|
335
327
|
name = clean_end_punctuation(name)
|
336
328
|
return name unless name =~ /,/
|
337
329
|
temp_name = name.split(", ")
|
338
|
-
|
330
|
+
temp_name.last + " " + temp_name.first
|
339
331
|
end
|
340
|
-
|
341
332
|
end
|
342
333
|
end
|
343
334
|
end
|