hydra-head 4.0.3 → 4.1.0
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.
- data/.gitignore +1 -0
- data/HISTORY.textile +17 -2
- data/app/assets/stylesheets/hydra/html_refactor.css +3 -30
- data/app/assets/stylesheets/hydra/styles.css +6 -64
- data/app/controllers/downloads_controller.rb +1 -1
- data/app/controllers/hydra/assets_controller.rb +10 -1
- data/app/controllers/hydra/contributors_controller.rb +15 -1
- data/app/controllers/hydra/file_assets_controller.rb +1 -1
- data/app/controllers/hydra/permissions_controller.rb +14 -0
- data/app/helpers/hydra/article_metadata_helper_behavior.rb +14 -1
- data/app/helpers/hydra/downloads_helper_behavior.rb +6 -0
- data/app/helpers/hydra/facets_helper_behavior.rb +7 -0
- data/app/helpers/hydra/generic_content_objects_helper_behavior.rb +6 -0
- data/app/helpers/hydra/hydra_assets_helper_behavior.rb +10 -0
- data/app/helpers/hydra/hydra_fedora_metadata_helper_behavior.rb +31 -0
- data/app/helpers/hydra/hydra_helper_behavior.rb +18 -7
- data/app/helpers/hydra/hydra_uploader_helper_behavior.rb +5 -0
- data/app/helpers/hydra/inline_editable_metadata_helper_behavior.rb +6 -0
- data/app/helpers/hydra/javascript_includes_helper_behavior.rb +7 -0
- data/app/helpers/hydra/personalization_helper_behavior.rb +5 -0
- data/app/helpers/hydra/release_process_helper_behavior.rb +5 -0
- data/app/models/generic_content.rb +3 -0
- data/app/models/generic_image.rb +3 -0
- data/app/models/superuser.rb +4 -2
- data/app/models/user_attribute.rb +7 -2
- data/app/views/_add_assets_links.html.erb +4 -4
- data/app/views/catalog/_index_partials/_default.html.erb +2 -2
- data/app/views/catalog/show.html.erb +1 -1
- data/app/views/generic_contents/_index.html.erb +2 -2
- data/app/views/generic_images/_edit.html.erb +1 -1
- data/app/views/generic_images/_index.html.erb +2 -2
- data/app/views/hydra/file_assets/_file_assets_form.html.erb +1 -1
- data/app/views/hydra/file_assets/_index.html.erb +2 -2
- data/app/views/hydra/file_assets/_result.html.erb +1 -1
- data/app/views/layouts/hydra-head.html.erb +4 -1
- data/app/views/mods_assets/_index_list.html.erb +1 -1
- data/app/views/mods_assets/_index_table.html.erb +2 -2
- data/app/views/mods_assets/_show.html.erb +1 -1
- data/app/views/mods_assets/_show_file_assets.html.erb +1 -1
- data/config/jetty.yml +1 -1
- data/config/locales/hydra.en.yml +7 -0
- data/config/solr.yml +1 -1
- data/config/solr_mappings.yml +2 -2
- data/hydra-head.gemspec +5 -4
- data/lib/generators/hydra/head_generator.rb +6 -5
- data/lib/generators/hydra/templates/config/fedora.yml +1 -1
- data/lib/generators/hydra/templates/config/solr.yml +1 -1
- data/lib/hydra-head/version.rb +1 -1
- data/lib/hydra.rb +13 -11
- data/lib/hydra/assets.rb +5 -135
- data/lib/hydra/catalog.rb +6 -44
- data/lib/hydra/controller.rb +10 -27
- data/lib/hydra/controller/assets_controller_behavior.rb +142 -0
- data/lib/hydra/controller/catalog_controller_behavior.rb +56 -0
- data/lib/hydra/controller/controller_behavior.rb +59 -0
- data/lib/hydra/controller/file_assets_behavior.rb +142 -0
- data/lib/hydra/controller/repository_controller_behavior.rb +119 -0
- data/lib/hydra/controller/upload_behavior.rb +139 -0
- data/lib/hydra/file_assets.rb +3 -138
- data/lib/hydra/file_assets_helper.rb +6 -133
- data/lib/hydra/generic_content.rb +15 -0
- data/lib/hydra/generic_image.rb +10 -0
- data/lib/hydra/global_configurable.rb +46 -0
- data/lib/hydra/model_methods.rb +3 -3
- data/lib/hydra/model_mixins.rb +1 -1
- data/lib/hydra/model_mixins/solr_document_extension.rb +24 -0
- data/lib/hydra/repository_controller.rb +4 -95
- data/lib/hydra/ui/controller.rb +1 -2
- data/lib/hydra/user.rb +13 -1
- data/lib/railties/hydra-fixtures.rake +1 -1
- data/tasks/hydra-head.rake +2 -0
- data/{app/models → test_support/etc}/common_metadata_asset.rb +1 -2
- data/test_support/features/mods_asset_show.feature +1 -1
- data/test_support/features/support/env.rb +2 -0
- data/test_support/features/support/paths.rb +2 -0
- data/test_support/spec/controllers/catalog_controller_spec.rb +8 -0
- data/test_support/spec/controllers/catalog_controller_viewing_context_spec.rb +10 -1
- data/test_support/spec/controllers/catalog_valid_html_spec.rb +8 -0
- data/test_support/spec/controllers/contributors_controller_spec.rb +10 -0
- data/test_support/spec/controllers/file_assets_controller_spec.rb +15 -3
- data/test_support/spec/controllers/hydra-assets_controller_spec.rb +11 -1
- data/test_support/spec/controllers/hydra_controller_spec.rb +15 -4
- data/test_support/spec/controllers/permissions_controller_spec.rb +8 -0
- data/test_support/spec/helpers/access_controls_enforcement_spec.rb +1 -2
- data/test_support/spec/helpers/file_assets_helper_spec.rb +1 -1
- data/test_support/spec/helpers/generic_content_objects_helper_spec.rb +10 -1
- data/test_support/spec/helpers/hydra-repository_controller_spec.rb +1 -1
- data/test_support/spec/helpers/hydra_assets_helper_spec.rb +8 -0
- data/test_support/spec/helpers/hydra_fedora_metadata_helper_spec.rb +11 -0
- data/test_support/spec/helpers/hydra_helper_spec.rb +18 -0
- data/test_support/spec/helpers/hydra_model_methods_spec.rb +0 -12
- data/test_support/spec/helpers/hydra_uploader_helper_spec.rb +8 -0
- data/test_support/spec/helpers/javascript_includes_helper_spec.rb +9 -1
- data/test_support/spec/lib/catalog_spec.rb +10 -3
- data/test_support/spec/lib/global_configurable_spec.rb +98 -0
- data/test_support/spec/lib/model_methods_spec.rb +29 -0
- data/test_support/spec/models/generic_content_spec.rb +11 -0
- data/test_support/spec/models/generic_image_spec.rb +15 -0
- data/test_support/spec/models/user_spec.rb +25 -0
- metadata +39 -37
- data/app/models/ability.rb +0 -5
- data/app/models/hydra/ability.rb +0 -137
- data/app/models/hydra/datastream/common_mods_index_methods.rb +0 -47
- data/app/models/hydra/datastream/mods_article.rb +0 -530
- data/app/models/hydra/datastream/mods_dataset.rb +0 -173
- data/app/models/hydra/datastream/mods_generic_content.rb +0 -498
- data/app/models/hydra/datastream/mods_image.rb +0 -497
- data/app/models/hydra/datastream/rights_metadata.rb +0 -191
- data/app/models/hydra/role_mapper_behavior.rb +0 -33
- data/app/models/role_mapper.rb +0 -6
- data/lib/hydra/access_controls_enforcement.rb +0 -237
- data/lib/hydra/access_controls_evaluation.rb +0 -38
- data/lib/hydra/common_mods_index_methods.rb +0 -46
- data/lib/hydra/model_mixins/mods_object.rb +0 -17
- data/lib/hydra/model_mixins/rights_metadata.rb +0 -357
- data/lib/hydra/mods_article.rb +0 -535
- data/lib/hydra/mods_dataset.rb +0 -177
- data/lib/hydra/mods_generic_content.rb +0 -500
- data/lib/hydra/mods_image.rb +0 -500
- data/lib/uva/mods_index_methods.rb +0 -30
- data/test_support/spec/lib/common_mods_index_methods_spec.rb +0 -26
- data/test_support/spec/models/ability_spec.rb +0 -40
- data/test_support/spec/models/hydra_rights_metadata_spec.rb +0 -175
- data/test_support/spec/models/role_mapper_spec.rb +0 -22
- data/test_support/spec/unit/rights_metadata_spec.rb +0 -80
data/app/models/ability.rb
DELETED
data/app/models/hydra/ability.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
# this code will move to lib/hydra/access_controls/ability.rb (with the appropriate namespace changes) in Hydra 5.0
|
2
|
-
# Code for CanCan access to Hydra models
|
3
|
-
module Hydra::Ability
|
4
|
-
include Hydra::AccessControlsEnforcement
|
5
|
-
|
6
|
-
def initialize(user, session=nil)
|
7
|
-
user ||= User.new # guest user (not logged in)
|
8
|
-
hydra_default_permissions(user, session)
|
9
|
-
end
|
10
|
-
|
11
|
-
## You can override this method if you are using a different AuthZ (such as LDAP)
|
12
|
-
def user_groups(user, session)
|
13
|
-
return @user_groups if @user_groups
|
14
|
-
@user_groups = RoleMapper.roles(user_key(user)) + default_user_groups
|
15
|
-
@user_groups << 'registered' unless user.new_record?
|
16
|
-
@user_groups
|
17
|
-
end
|
18
|
-
|
19
|
-
def default_user_groups
|
20
|
-
# # everyone is automatically a member of the group 'public'
|
21
|
-
['public']
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def hydra_default_permissions(user, session)
|
26
|
-
logger.debug("Usergroups are " + user_groups(user, session).inspect)
|
27
|
-
if Deprecation.silence(Hydra::SuperuserAttributes) { user.is_being_superuser?(session) }
|
28
|
-
can :manage, :all
|
29
|
-
else
|
30
|
-
edit_permissions(user, session)
|
31
|
-
read_permissions(user, session)
|
32
|
-
custom_permissions(user, session)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def edit_permissions(user, session)
|
37
|
-
can :edit, String do |pid|
|
38
|
-
test_edit(pid, user, session)
|
39
|
-
end
|
40
|
-
|
41
|
-
can :edit, ActiveFedora::Base do |obj|
|
42
|
-
test_edit(obj.pid, user, session)
|
43
|
-
end
|
44
|
-
|
45
|
-
can :edit, SolrDocument do |obj|
|
46
|
-
@permissions_solr_document = obj
|
47
|
-
test_edit(obj.id, user, session)
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def read_permissions(user, session)
|
53
|
-
can :read, String do |pid|
|
54
|
-
test_read(pid, user, session)
|
55
|
-
end
|
56
|
-
|
57
|
-
can :read, ActiveFedora::Base do |obj|
|
58
|
-
test_read(obj.pid, user, session)
|
59
|
-
end
|
60
|
-
|
61
|
-
can :read, SolrDocument do |obj|
|
62
|
-
@permissions_solr_document = obj
|
63
|
-
test_read(obj.id, user, session)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
## Override custom permissions in your own app to add more permissions beyond what is defined by default.
|
69
|
-
def custom_permissions(user, session)
|
70
|
-
end
|
71
|
-
|
72
|
-
protected
|
73
|
-
|
74
|
-
def permissions_doc(pid)
|
75
|
-
return @permissions_solr_document if @permissions_solr_document
|
76
|
-
response, @permissions_solr_document = get_permissions_solr_response_for_doc_id(pid)
|
77
|
-
@permissions_solr_document
|
78
|
-
end
|
79
|
-
|
80
|
-
|
81
|
-
def test_edit(pid, user, session)
|
82
|
-
permissions_doc(pid)
|
83
|
-
logger.debug("CANCAN Checking edit permissions for user: #{user}")
|
84
|
-
group_intersection = user_groups(user, session) & edit_groups
|
85
|
-
result = !group_intersection.empty? || edit_persons.include?(user_key(user))
|
86
|
-
logger.debug("CANCAN decision: #{result}")
|
87
|
-
result
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_read(pid, user, session)
|
91
|
-
permissions_doc(pid)
|
92
|
-
logger.debug("CANCAN Checking edit permissions for user: #{user}")
|
93
|
-
group_intersection = user_groups(user, session) & read_groups
|
94
|
-
result = !group_intersection.empty? || read_persons.include?(user_key(user))
|
95
|
-
logger.debug("CANCAN decision: #{result}")
|
96
|
-
result
|
97
|
-
end
|
98
|
-
|
99
|
-
def edit_groups
|
100
|
-
edit_group_field = Hydra.config[:permissions][:edit][:group]
|
101
|
-
eg = ((@permissions_solr_document == nil || @permissions_solr_document.fetch(edit_group_field,nil) == nil) ? [] : @permissions_solr_document.fetch(edit_group_field,nil))
|
102
|
-
logger.debug("edit_groups: #{eg.inspect}")
|
103
|
-
return eg
|
104
|
-
end
|
105
|
-
|
106
|
-
# edit implies read, so read_groups is the union of edit and read groups
|
107
|
-
def read_groups
|
108
|
-
read_group_field = Hydra.config[:permissions][:read][:group]
|
109
|
-
rg = edit_groups | ((@permissions_solr_document == nil || @permissions_solr_document.fetch(read_group_field,nil) == nil) ? [] : @permissions_solr_document.fetch(read_group_field,nil))
|
110
|
-
logger.debug("read_groups: #{rg.inspect}")
|
111
|
-
return rg
|
112
|
-
end
|
113
|
-
|
114
|
-
def edit_persons
|
115
|
-
edit_person_field = Hydra.config[:permissions][:edit][:individual]
|
116
|
-
ep = ((@permissions_solr_document == nil || @permissions_solr_document.fetch(edit_person_field,nil) == nil) ? [] : @permissions_solr_document.fetch(edit_person_field,nil))
|
117
|
-
logger.debug("edit_persons: #{ep.inspect}")
|
118
|
-
return ep
|
119
|
-
end
|
120
|
-
|
121
|
-
# edit implies read, so read_persons is the union of edit and read persons
|
122
|
-
def read_persons
|
123
|
-
read_individual_field = Hydra.config[:permissions][:read][:individual]
|
124
|
-
rp = edit_persons | ((@permissions_solr_document == nil || @permissions_solr_document.fetch(read_individual_field,nil) == nil) ? [] : @permissions_solr_document.fetch(read_individual_field,nil))
|
125
|
-
logger.debug("read_persons: #{rp.inspect}")
|
126
|
-
return rp
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
# get the currently configured user identifier. Can be overridden to return whatever (ie. login, email, etc)
|
131
|
-
# defaults to using whatever you have set as the Devise authentication_key
|
132
|
-
def user_key(user)
|
133
|
-
user.send(Devise.authentication_keys.first)
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# Provides some helper methods for indexing compound or non-standard facets
|
2
|
-
#
|
3
|
-
# this code will move to lib/hydra/datastream/mods_name_behavior.rb (with the appropriate namespace changes) in Hydra 5.0
|
4
|
-
#
|
5
|
-
# == Methods
|
6
|
-
#
|
7
|
-
# extract_person_full_names
|
8
|
-
# This method returns a Hash of person_full_name_facet values which combine Lastname, Firstname
|
9
|
-
# extract_person_organizations
|
10
|
-
# This method returns a Hash of person_full_name_facet values which extract the persons affiliation and puts it in an mods_organization_facet
|
11
|
-
|
12
|
-
module Hydra
|
13
|
-
module Datastream
|
14
|
-
module CommonModsIndexMethods
|
15
|
-
# Extracts the first and last names of persons and creates Solr::Field objects with for person_full_name_facet
|
16
|
-
#
|
17
|
-
# == Returns:
|
18
|
-
# An array of Solr::Field objects
|
19
|
-
#
|
20
|
-
def extract_person_full_names
|
21
|
-
names = {}
|
22
|
-
self.find_by_terms(:person).each do |person|
|
23
|
-
name_parts = person.children.inject({}) do |hash,child|
|
24
|
-
hash[child.get_attribute(:type)] = child.text if ["family","given"].include? child.get_attribute(:type)
|
25
|
-
hash
|
26
|
-
end
|
27
|
-
::Solrizer::Extractor.insert_solr_field_value(names, "person_full_name_facet", [name_parts["family"], name_parts["given"]].join(", ") ) if name_parts.keys.sort == ["family","given"]
|
28
|
-
names
|
29
|
-
end
|
30
|
-
return names
|
31
|
-
end
|
32
|
-
|
33
|
-
# Extracts the affiliations of persons and creates Solr::Field objects for them
|
34
|
-
#
|
35
|
-
# == Returns:
|
36
|
-
# An array of Solr::Field objects
|
37
|
-
#
|
38
|
-
def extract_person_organizations
|
39
|
-
orgs = {}
|
40
|
-
self.find_by_terms(:person,:affiliation).each do |org|
|
41
|
-
::Solrizer::Extractor.insert_solr_field_value(orgs, "mods_organization_facet", org.text)
|
42
|
-
end
|
43
|
-
return orgs
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,530 +0,0 @@
|
|
1
|
-
# @deprecated Leftover from Hydrangea. Please use Hydra::Datastream::ModsGenericContent instead. This will be removed no later than release 6.x
|
2
|
-
# this should be moved to documentation as an EXAMPLE
|
3
|
-
module Hydra
|
4
|
-
module Datastream
|
5
|
-
class ModsArticle < ActiveFedora::NokogiriDatastream
|
6
|
-
include Hydra::Datastream::CommonModsIndexMethods
|
7
|
-
|
8
|
-
set_terminology do |t|
|
9
|
-
t.root(:path=>"mods", :xmlns=>"http://www.loc.gov/mods/v3", :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
|
10
|
-
|
11
|
-
|
12
|
-
t.title_info(:path=>"titleInfo") {
|
13
|
-
t.main_title(:index_as=>[:facetable],:path=>"title", :label=>"title")
|
14
|
-
t.language(:index_as=>[:facetable],:path=>{:attribute=>"lang"})
|
15
|
-
}
|
16
|
-
t.language{
|
17
|
-
t.lang_code(:index_as=>[:facetable], :path=>"languageTerm", :attributes=>{:type=>"code"})
|
18
|
-
}
|
19
|
-
t.abstract
|
20
|
-
t.subject {
|
21
|
-
t.topic(:index_as=>[:facetable])
|
22
|
-
}
|
23
|
-
t.topic_tag(:proxy=>[:subject, :topic])
|
24
|
-
# t.topic_tag(:index_as=>[:facetable],:path=>"subject", :default_content_path=>"topic")
|
25
|
-
# This is a mods:name. The underscore is purely to avoid namespace conflicts.
|
26
|
-
t.name_ {
|
27
|
-
# this is a namepart
|
28
|
-
t.namePart(:type=>:string, :label=>"generic name")
|
29
|
-
# affiliations are great
|
30
|
-
t.affiliation
|
31
|
-
t.institution(:path=>"affiliation", :index_as=>[:facetable], :label=>"organization")
|
32
|
-
t.displayForm
|
33
|
-
t.role(:ref=>[:role])
|
34
|
-
t.description(:index_as=>[:facetable])
|
35
|
-
t.date(:path=>"namePart", :attributes=>{:type=>"date"})
|
36
|
-
t.last_name(:path=>"namePart", :attributes=>{:type=>"family"})
|
37
|
-
t.first_name(:path=>"namePart", :attributes=>{:type=>"given"}, :label=>"first name")
|
38
|
-
t.terms_of_address(:path=>"namePart", :attributes=>{:type=>"termsOfAddress"})
|
39
|
-
t.computing_id
|
40
|
-
}
|
41
|
-
# lookup :person, :first_name
|
42
|
-
t.person(:ref=>:name, :attributes=>{:type=>"personal"}, :index_as=>[:facetable])
|
43
|
-
t.department(:proxy=>[:person,:description],:index_as=>[:facetable])
|
44
|
-
t.organization(:ref=>:name, :attributes=>{:type=>"corporate"}, :index_as=>[:facetable])
|
45
|
-
t.conference(:ref=>:name, :attributes=>{:type=>"conference"}, :index_as=>[:facetable])
|
46
|
-
t.role {
|
47
|
-
t.text(:path=>"roleTerm",:attributes=>{:type=>"text"})
|
48
|
-
t.code(:path=>"roleTerm",:attributes=>{:type=>"code"})
|
49
|
-
}
|
50
|
-
t.journal(:path=>'relatedItem', :attributes=>{:type=>"host"}) {
|
51
|
-
t.title_info(:index_as=>[:facetable],:ref=>[:title_info])
|
52
|
-
t.origin_info(:path=>"originInfo") {
|
53
|
-
t.publisher
|
54
|
-
t.date_issued(:path=>"dateIssued")
|
55
|
-
t.issuance(:index_as=>[:facetable])
|
56
|
-
}
|
57
|
-
t.issn(:path=>"identifier", :attributes=>{:type=>"issn"})
|
58
|
-
t.issue(:path=>"part") {
|
59
|
-
t.volume(:path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
|
60
|
-
t.level(:path=>"detail", :attributes=>{:type=>"number"}, :default_content_path=>"number")
|
61
|
-
t.extent
|
62
|
-
t.pages(:path=>"extent", :attributes=>{:unit=>"pages"}) {
|
63
|
-
t.start
|
64
|
-
t.end
|
65
|
-
}
|
66
|
-
t.start_page(:proxy=>[:pages, :start])
|
67
|
-
t.end_page(:proxy=>[:pages, :end])
|
68
|
-
t.publication_date(:path=>"date")
|
69
|
-
}
|
70
|
-
}
|
71
|
-
t.note
|
72
|
-
t.location(:path=>"location") {
|
73
|
-
t.url(:path=>"url")
|
74
|
-
}
|
75
|
-
t.publication_url(:proxy=>[:location,:url])
|
76
|
-
t.peer_reviewed(:proxy=>[:journal,:origin_info,:issuance], :index_as=>[:facetable])
|
77
|
-
t.title(:proxy=>[:mods,:title_info, :main_title])
|
78
|
-
end
|
79
|
-
|
80
|
-
# Generates an empty Mods Article (used when you call ModsArticle.new without passing in existing xml)
|
81
|
-
def self.xml_template
|
82
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
83
|
-
xml.mods(:version=>"3.3", "xmlns:xlink"=>"http://www.w3.org/1999/xlink",
|
84
|
-
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
85
|
-
"xmlns"=>"http://www.loc.gov/mods/v3",
|
86
|
-
"xsi:schemaLocation"=>"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd") {
|
87
|
-
xml.titleInfo(:lang=>"") {
|
88
|
-
xml.title
|
89
|
-
}
|
90
|
-
xml.name(:type=>"personal") {
|
91
|
-
xml.namePart(:type=>"given")
|
92
|
-
xml.namePart(:type=>"family")
|
93
|
-
xml.affiliation
|
94
|
-
xml.computing_id
|
95
|
-
xml.description
|
96
|
-
xml.role {
|
97
|
-
xml.roleTerm("Author", :authority=>"marcrelator", :type=>"text")
|
98
|
-
}
|
99
|
-
}
|
100
|
-
xml.typeOfResource
|
101
|
-
xml.genre(:authority=>"marcgt")
|
102
|
-
xml.language {
|
103
|
-
xml.languageTerm(:authority=>"iso639-2b", :type=>"code")
|
104
|
-
}
|
105
|
-
xml.abstract
|
106
|
-
xml.subject {
|
107
|
-
xml.topic
|
108
|
-
}
|
109
|
-
xml.relatedItem(:type=>"host") {
|
110
|
-
xml.titleInfo {
|
111
|
-
xml.title
|
112
|
-
}
|
113
|
-
xml.identifier(:type=>"issn")
|
114
|
-
xml.originInfo {
|
115
|
-
xml.publisher
|
116
|
-
xml.dateIssued
|
117
|
-
xml.issuance
|
118
|
-
}
|
119
|
-
xml.part {
|
120
|
-
xml.detail(:type=>"volume") {
|
121
|
-
xml.number
|
122
|
-
}
|
123
|
-
xml.detail(:type=>"number") {
|
124
|
-
xml.number
|
125
|
-
}
|
126
|
-
xml.extent(:unit=>"pages") {
|
127
|
-
xml.start
|
128
|
-
xml.end
|
129
|
-
}
|
130
|
-
xml.date
|
131
|
-
}
|
132
|
-
}
|
133
|
-
xml.location {
|
134
|
-
xml.url
|
135
|
-
}
|
136
|
-
}
|
137
|
-
end
|
138
|
-
return builder.doc
|
139
|
-
end
|
140
|
-
|
141
|
-
# Generates a new Person node
|
142
|
-
def self.person_template
|
143
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
144
|
-
xml.name(:type=>"personal") {
|
145
|
-
xml.namePart(:type=>"family")
|
146
|
-
xml.namePart(:type=>"given")
|
147
|
-
xml.affiliation
|
148
|
-
xml.computing_id
|
149
|
-
xml.description
|
150
|
-
xml.role {
|
151
|
-
xml.roleTerm("Author", :type=>"text")
|
152
|
-
}
|
153
|
-
}
|
154
|
-
end
|
155
|
-
return builder.doc.root
|
156
|
-
end
|
157
|
-
|
158
|
-
def self.full_name_template
|
159
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
160
|
-
xml.full_name(:type => "personal")
|
161
|
-
end
|
162
|
-
return builder.doc.root
|
163
|
-
end
|
164
|
-
|
165
|
-
# Generates a new Organization node
|
166
|
-
# Uses mods:name[@type="corporate"]
|
167
|
-
def self.organization_template
|
168
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
169
|
-
xml.name(:type=>"corporate") {
|
170
|
-
xml.namePart
|
171
|
-
xml.role {
|
172
|
-
xml.roleTerm(:authority=>"marcrelator", :type=>"text")
|
173
|
-
}
|
174
|
-
}
|
175
|
-
end
|
176
|
-
return builder.doc.root
|
177
|
-
end
|
178
|
-
|
179
|
-
# Generates a new Conference node
|
180
|
-
def self.conference_template
|
181
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
182
|
-
xml.name(:type=>"conference") {
|
183
|
-
xml.namePart
|
184
|
-
xml.role {
|
185
|
-
xml.roleTerm(:authority=>"marcrelator", :type=>"text")
|
186
|
-
}
|
187
|
-
}
|
188
|
-
end
|
189
|
-
return builder.doc.root
|
190
|
-
end
|
191
|
-
|
192
|
-
# Inserts a new contributor (mods:name) into the mods document
|
193
|
-
# creates contributors of type :person, :organization, or :conference
|
194
|
-
def insert_contributor(type, opts={})
|
195
|
-
case type.to_sym
|
196
|
-
when :person
|
197
|
-
node = Hydra::Datastream::ModsArticle.person_template
|
198
|
-
nodeset = self.find_by_terms(:person)
|
199
|
-
when :organization
|
200
|
-
node = Hydra::Datastream::ModsArticle.organization_template
|
201
|
-
nodeset = self.find_by_terms(:organization)
|
202
|
-
when :conference
|
203
|
-
node = Hydra::Datastream::ModsArticle.conference_template
|
204
|
-
nodeset = self.find_by_terms(:conference)
|
205
|
-
else
|
206
|
-
ActiveFedora.logger.warn("#{type} is not a valid argument for Hydra::ModsArticle.insert_contributor")
|
207
|
-
node = nil
|
208
|
-
index = nil
|
209
|
-
end
|
210
|
-
|
211
|
-
unless nodeset.nil?
|
212
|
-
if nodeset.empty?
|
213
|
-
self.ng_xml.root.add_child(node)
|
214
|
-
index = 0
|
215
|
-
else
|
216
|
-
nodeset.after(node)
|
217
|
-
index = nodeset.length
|
218
|
-
end
|
219
|
-
self.dirty = true
|
220
|
-
end
|
221
|
-
|
222
|
-
return node, index
|
223
|
-
end
|
224
|
-
|
225
|
-
# Remove the contributor entry identified by @contributor_type and @index
|
226
|
-
def remove_contributor(contributor_type, index)
|
227
|
-
contributor = self.find_by_terms( {contributor_type.to_sym => index.to_i} ).first
|
228
|
-
unless contributor.nil?
|
229
|
-
contributor.remove
|
230
|
-
self.dirty = true
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def self.common_relator_terms
|
235
|
-
{"aut" => "Author",
|
236
|
-
"clb" => "Collaborator",
|
237
|
-
"com" => "Compiler",
|
238
|
-
"ctb" => "Contributor",
|
239
|
-
"cre" => "Creator",
|
240
|
-
"edt" => "Editor",
|
241
|
-
"ill" => "Illustrator",
|
242
|
-
"oth" => "Other",
|
243
|
-
"trl" => "Translator",
|
244
|
-
}
|
245
|
-
end
|
246
|
-
|
247
|
-
def self.person_relator_terms
|
248
|
-
{"aut" => "Author",
|
249
|
-
"clb" => "Collaborator",
|
250
|
-
"com" => "Compiler",
|
251
|
-
"cre" => "Creator",
|
252
|
-
"ctb" => "Contributor",
|
253
|
-
"edt" => "Editor",
|
254
|
-
"ill" => "Illustrator",
|
255
|
-
"res" => "Researcher",
|
256
|
-
"rth" => "Research team head",
|
257
|
-
"rtm" => "Research team member",
|
258
|
-
"trl" => "Translator"
|
259
|
-
}
|
260
|
-
end
|
261
|
-
|
262
|
-
def self.conference_relator_terms
|
263
|
-
{
|
264
|
-
"hst" => "Host"
|
265
|
-
}
|
266
|
-
end
|
267
|
-
|
268
|
-
def self.organization_relator_terms
|
269
|
-
{
|
270
|
-
"fnd" => "Funder",
|
271
|
-
"hst" => "Host"
|
272
|
-
}
|
273
|
-
end
|
274
|
-
|
275
|
-
def self.dc_relator_terms
|
276
|
-
{"acp" => "Art copyist",
|
277
|
-
"act" => "Actor",
|
278
|
-
"adp" => "Adapter",
|
279
|
-
"aft" => "Author of afterword, colophon, etc.",
|
280
|
-
"anl" => "Analyst",
|
281
|
-
"anm" => "Animator",
|
282
|
-
"ann" => "Annotator",
|
283
|
-
"ant" => "Bibliographic antecedent",
|
284
|
-
"app" => "Applicant",
|
285
|
-
"aqt" => "Author in quotations or text abstracts",
|
286
|
-
"arc" => "Architect",
|
287
|
-
"ard" => "Artistic director ",
|
288
|
-
"arr" => "Arranger",
|
289
|
-
"art" => "Artist",
|
290
|
-
"asg" => "Assignee",
|
291
|
-
"asn" => "Associated name",
|
292
|
-
"att" => "Attributed name",
|
293
|
-
"auc" => "Auctioneer",
|
294
|
-
"aud" => "Author of dialog",
|
295
|
-
"aui" => "Author of introduction",
|
296
|
-
"aus" => "Author of screenplay",
|
297
|
-
"aut" => "Author",
|
298
|
-
"bdd" => "Binding designer",
|
299
|
-
"bjd" => "Bookjacket designer",
|
300
|
-
"bkd" => "Book designer",
|
301
|
-
"bkp" => "Book producer",
|
302
|
-
"bnd" => "Binder",
|
303
|
-
"bpd" => "Bookplate designer",
|
304
|
-
"bsl" => "Bookseller",
|
305
|
-
"ccp" => "Conceptor",
|
306
|
-
"chr" => "Choreographer",
|
307
|
-
"clb" => "Collaborator",
|
308
|
-
"cli" => "Client",
|
309
|
-
"cll" => "Calligrapher",
|
310
|
-
"clt" => "Collotyper",
|
311
|
-
"cmm" => "Commentator",
|
312
|
-
"cmp" => "Composer",
|
313
|
-
"cmt" => "Compositor",
|
314
|
-
"cng" => "Cinematographer",
|
315
|
-
"cnd" => "Conductor",
|
316
|
-
"cns" => "Censor",
|
317
|
-
"coe" => "Contestant -appellee",
|
318
|
-
"col" => "Collector",
|
319
|
-
"com" => "Compiler",
|
320
|
-
"cos" => "Contestant",
|
321
|
-
"cot" => "Contestant -appellant",
|
322
|
-
"cov" => "Cover designer",
|
323
|
-
"cpc" => "Copyright claimant",
|
324
|
-
"cpe" => "Complainant-appellee",
|
325
|
-
"cph" => "Copyright holder",
|
326
|
-
"cpl" => "Complainant",
|
327
|
-
"cpt" => "Complainant-appellant",
|
328
|
-
"cre" => "Creator",
|
329
|
-
"crp" => "Correspondent",
|
330
|
-
"crr" => "Corrector",
|
331
|
-
"csl" => "Consultant",
|
332
|
-
"csp" => "Consultant to a project",
|
333
|
-
"cst" => "Costume designer",
|
334
|
-
"ctb" => "Contributor",
|
335
|
-
"cte" => "Contestee-appellee",
|
336
|
-
"ctg" => "Cartographer",
|
337
|
-
"ctr" => "Contractor",
|
338
|
-
"cts" => "Contestee",
|
339
|
-
"ctt" => "Contestee-appellant",
|
340
|
-
"cur" => "Curator",
|
341
|
-
"cwt" => "Commentator for written text",
|
342
|
-
"dfd" => "Defendant",
|
343
|
-
"dfe" => "Defendant-appellee",
|
344
|
-
"dft" => "Defendant-appellant",
|
345
|
-
"dgg" => "Degree grantor",
|
346
|
-
"dis" => "Dissertant",
|
347
|
-
"dln" => "Delineator",
|
348
|
-
"dnc" => "Dancer",
|
349
|
-
"dnr" => "Donor",
|
350
|
-
"dpc" => "Depicted",
|
351
|
-
"dpt" => "Depositor",
|
352
|
-
"drm" => "Draftsman",
|
353
|
-
"drt" => "Director",
|
354
|
-
"dsr" => "Designer",
|
355
|
-
"dst" => "Distributor",
|
356
|
-
"dtc" => "Data contributor ",
|
357
|
-
"dte" => "Dedicatee",
|
358
|
-
"dtm" => "Data manager ",
|
359
|
-
"dto" => "Dedicator",
|
360
|
-
"dub" => "Dubious author",
|
361
|
-
"edt" => "Editor",
|
362
|
-
"egr" => "Engraver",
|
363
|
-
"elg" => "Electrician ",
|
364
|
-
"elt" => "Electrotyper",
|
365
|
-
"eng" => "Engineer",
|
366
|
-
"etr" => "Etcher",
|
367
|
-
"exp" => "Expert",
|
368
|
-
"fac" => "Facsimilist",
|
369
|
-
"fld" => "Field director ",
|
370
|
-
"flm" => "Film editor",
|
371
|
-
"fmo" => "Former owner",
|
372
|
-
"fpy" => "First party",
|
373
|
-
"fnd" => "Funder",
|
374
|
-
"frg" => "Forger",
|
375
|
-
"gis" => "Geographic information specialist ",
|
376
|
-
"grt" => "Graphic technician",
|
377
|
-
"hnr" => "Honoree",
|
378
|
-
"hst" => "Host",
|
379
|
-
"ill" => "Illustrator",
|
380
|
-
"ilu" => "Illuminator",
|
381
|
-
"ins" => "Inscriber",
|
382
|
-
"inv" => "Inventor",
|
383
|
-
"itr" => "Instrumentalist",
|
384
|
-
"ive" => "Interviewee",
|
385
|
-
"ivr" => "Interviewer",
|
386
|
-
"lbr" => "Laboratory ",
|
387
|
-
"lbt" => "Librettist",
|
388
|
-
"ldr" => "Laboratory director ",
|
389
|
-
"led" => "Lead",
|
390
|
-
"lee" => "Libelee-appellee",
|
391
|
-
"lel" => "Libelee",
|
392
|
-
"len" => "Lender",
|
393
|
-
"let" => "Libelee-appellant",
|
394
|
-
"lgd" => "Lighting designer",
|
395
|
-
"lie" => "Libelant-appellee",
|
396
|
-
"lil" => "Libelant",
|
397
|
-
"lit" => "Libelant-appellant",
|
398
|
-
"lsa" => "Landscape architect",
|
399
|
-
"lse" => "Licensee",
|
400
|
-
"lso" => "Licensor",
|
401
|
-
"ltg" => "Lithographer",
|
402
|
-
"lyr" => "Lyricist",
|
403
|
-
"mcp" => "Music copyist",
|
404
|
-
"mfr" => "Manufacturer",
|
405
|
-
"mdc" => "Metadata contact",
|
406
|
-
"mod" => "Moderator",
|
407
|
-
"mon" => "Monitor",
|
408
|
-
"mrk" => "Markup editor",
|
409
|
-
"msd" => "Musical director",
|
410
|
-
"mte" => "Metal-engraver",
|
411
|
-
"mus" => "Musician",
|
412
|
-
"nrt" => "Narrator",
|
413
|
-
"opn" => "Opponent",
|
414
|
-
"org" => "Originator",
|
415
|
-
"orm" => "Organizer of meeting",
|
416
|
-
"oth" => "Other",
|
417
|
-
"own" => "Owner",
|
418
|
-
"pat" => "Patron",
|
419
|
-
"pbd" => "Publishing director",
|
420
|
-
"pbl" => "Publisher",
|
421
|
-
"pdr" => "Project director",
|
422
|
-
"pfr" => "Proofreader",
|
423
|
-
"pht" => "Photographer",
|
424
|
-
"plt" => "Platemaker",
|
425
|
-
"pma" => "Permitting agency",
|
426
|
-
"pmn" => "Production manager",
|
427
|
-
"pop" => "Printer of plates",
|
428
|
-
"ppm" => "Papermaker",
|
429
|
-
"ppt" => "Puppeteer",
|
430
|
-
"prc" => "Process contact",
|
431
|
-
"prd" => "Production personnel",
|
432
|
-
"prf" => "Performer",
|
433
|
-
"prg" => "Programmer",
|
434
|
-
"prm" => "Printmaker",
|
435
|
-
"pro" => "Producer",
|
436
|
-
"prt" => "Printer",
|
437
|
-
"pta" => "Patent applicant",
|
438
|
-
"pte" => "Plaintiff -appellee",
|
439
|
-
"ptf" => "Plaintiff",
|
440
|
-
"pth" => "Patent holder",
|
441
|
-
"ptt" => "Plaintiff-appellant",
|
442
|
-
"rbr" => "Rubricator",
|
443
|
-
"rce" => "Recording engineer",
|
444
|
-
"rcp" => "Recipient",
|
445
|
-
"red" => "Redactor",
|
446
|
-
"ren" => "Renderer",
|
447
|
-
"res" => "Researcher",
|
448
|
-
"rev" => "Reviewer",
|
449
|
-
"rps" => "Repository",
|
450
|
-
"rpt" => "Reporter",
|
451
|
-
"rpy" => "Responsible party",
|
452
|
-
"rse" => "Respondent-appellee",
|
453
|
-
"rsg" => "Restager",
|
454
|
-
"rsp" => "Respondent",
|
455
|
-
"rst" => "Respondent-appellant",
|
456
|
-
"rth" => "Research team head",
|
457
|
-
"rtm" => "Research team member",
|
458
|
-
"sad" => "Scientific advisor",
|
459
|
-
"sce" => "Scenarist",
|
460
|
-
"scl" => "Sculptor",
|
461
|
-
"scr" => "Scribe",
|
462
|
-
"sds" => "Sound designer",
|
463
|
-
"sec" => "Secretary",
|
464
|
-
"sgn" => "Signer",
|
465
|
-
"sht" => "Supporting host",
|
466
|
-
"sng" => "Singer",
|
467
|
-
"spk" => "Speaker",
|
468
|
-
"spn" => "Sponsor",
|
469
|
-
"spy" => "Second party",
|
470
|
-
"srv" => "Surveyor",
|
471
|
-
"std" => "Set designer",
|
472
|
-
"stl" => "Storyteller",
|
473
|
-
"stm" => "Stage manager",
|
474
|
-
"stn" => "Standards body",
|
475
|
-
"str" => "Stereotyper",
|
476
|
-
"tcd" => "Technical director",
|
477
|
-
"tch" => "Teacher",
|
478
|
-
"ths" => "Thesis advisor",
|
479
|
-
"trc" => "Transcriber",
|
480
|
-
"trl" => "Translator",
|
481
|
-
"tyd" => "Type designer",
|
482
|
-
"tyg" => "Typographer",
|
483
|
-
"vdg" => "Videographer",
|
484
|
-
"voc" => "Vocalist",
|
485
|
-
"wam" => "Writer of accompanying material",
|
486
|
-
"wdc" => "Woodcutter",
|
487
|
-
"wde" => "Wood -engraver",
|
488
|
-
"wit" => "Witness"}
|
489
|
-
end
|
490
|
-
|
491
|
-
def self.valid_child_types
|
492
|
-
["data", "supporting file", "profile", "lorem ipsum", "dolor"]
|
493
|
-
end
|
494
|
-
|
495
|
-
def to_solr(solr_doc=Hash.new)
|
496
|
-
super(solr_doc)
|
497
|
-
|
498
|
-
extract_person_full_names.each_pair {|n,v| ::Solrizer::Extractor.insert_solr_field_value(solr_doc, n, v) }
|
499
|
-
extract_person_organizations.each_pair {|n,v| ::Solrizer::Extractor.insert_solr_field_value(solr_doc, n, v) }
|
500
|
-
extract_person_full_names_and_computing_ids.each_pair {|n,v| ::Solrizer::Extractor.insert_solr_field_value(solr_doc, n, v) }
|
501
|
-
|
502
|
-
::Solrizer::Extractor.insert_solr_field_value(solr_doc, "object_type_facet", "Article")
|
503
|
-
::Solrizer::Extractor.insert_solr_field_value(solr_doc, "mods_journal_title_info_facet", "Unknown") if solr_doc["mods_journal_title_info_facet"].nil? || solr_doc["mods_journal_title_info_facet"].blank?
|
504
|
-
|
505
|
-
solr_doc
|
506
|
-
end
|
507
|
-
|
508
|
-
# extracts the last_name##full_name##computing_id to be used by home view
|
509
|
-
def extract_person_full_names_and_computing_ids
|
510
|
-
names = {}
|
511
|
-
self.find_by_terms(:person).each do |person|
|
512
|
-
name_parts = person.children.inject({}) do |hash,child|
|
513
|
-
hash[child.get_attribute(:type)] = child.text if ["family","given"].include? child.get_attribute(:type)
|
514
|
-
hash["computing_id"] = child.text if child.name == 'computing_id'
|
515
|
-
hash
|
516
|
-
end
|
517
|
-
if name_parts.length == 3 and person.search(:roleTerm).children.text.include?("Author")
|
518
|
-
if name_parts["family"].blank? && name_parts["given"].blank? && name_parts["computing_id"].blank?
|
519
|
-
value = "Unknown Author"
|
520
|
-
else
|
521
|
-
value = "#{name_parts["family"]}, #{name_parts["given"]} (#{name_parts["computing_id"]})"
|
522
|
-
end
|
523
|
-
::Solrizer::Extractor.insert_solr_field_value(names, "person_full_name_cid_facet", value) if name_parts.length == 3
|
524
|
-
end
|
525
|
-
end
|
526
|
-
names
|
527
|
-
end
|
528
|
-
end
|
529
|
-
end
|
530
|
-
end
|