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.
Files changed (125) hide show
  1. data/.gitignore +1 -0
  2. data/HISTORY.textile +17 -2
  3. data/app/assets/stylesheets/hydra/html_refactor.css +3 -30
  4. data/app/assets/stylesheets/hydra/styles.css +6 -64
  5. data/app/controllers/downloads_controller.rb +1 -1
  6. data/app/controllers/hydra/assets_controller.rb +10 -1
  7. data/app/controllers/hydra/contributors_controller.rb +15 -1
  8. data/app/controllers/hydra/file_assets_controller.rb +1 -1
  9. data/app/controllers/hydra/permissions_controller.rb +14 -0
  10. data/app/helpers/hydra/article_metadata_helper_behavior.rb +14 -1
  11. data/app/helpers/hydra/downloads_helper_behavior.rb +6 -0
  12. data/app/helpers/hydra/facets_helper_behavior.rb +7 -0
  13. data/app/helpers/hydra/generic_content_objects_helper_behavior.rb +6 -0
  14. data/app/helpers/hydra/hydra_assets_helper_behavior.rb +10 -0
  15. data/app/helpers/hydra/hydra_fedora_metadata_helper_behavior.rb +31 -0
  16. data/app/helpers/hydra/hydra_helper_behavior.rb +18 -7
  17. data/app/helpers/hydra/hydra_uploader_helper_behavior.rb +5 -0
  18. data/app/helpers/hydra/inline_editable_metadata_helper_behavior.rb +6 -0
  19. data/app/helpers/hydra/javascript_includes_helper_behavior.rb +7 -0
  20. data/app/helpers/hydra/personalization_helper_behavior.rb +5 -0
  21. data/app/helpers/hydra/release_process_helper_behavior.rb +5 -0
  22. data/app/models/generic_content.rb +3 -0
  23. data/app/models/generic_image.rb +3 -0
  24. data/app/models/superuser.rb +4 -2
  25. data/app/models/user_attribute.rb +7 -2
  26. data/app/views/_add_assets_links.html.erb +4 -4
  27. data/app/views/catalog/_index_partials/_default.html.erb +2 -2
  28. data/app/views/catalog/show.html.erb +1 -1
  29. data/app/views/generic_contents/_index.html.erb +2 -2
  30. data/app/views/generic_images/_edit.html.erb +1 -1
  31. data/app/views/generic_images/_index.html.erb +2 -2
  32. data/app/views/hydra/file_assets/_file_assets_form.html.erb +1 -1
  33. data/app/views/hydra/file_assets/_index.html.erb +2 -2
  34. data/app/views/hydra/file_assets/_result.html.erb +1 -1
  35. data/app/views/layouts/hydra-head.html.erb +4 -1
  36. data/app/views/mods_assets/_index_list.html.erb +1 -1
  37. data/app/views/mods_assets/_index_table.html.erb +2 -2
  38. data/app/views/mods_assets/_show.html.erb +1 -1
  39. data/app/views/mods_assets/_show_file_assets.html.erb +1 -1
  40. data/config/jetty.yml +1 -1
  41. data/config/locales/hydra.en.yml +7 -0
  42. data/config/solr.yml +1 -1
  43. data/config/solr_mappings.yml +2 -2
  44. data/hydra-head.gemspec +5 -4
  45. data/lib/generators/hydra/head_generator.rb +6 -5
  46. data/lib/generators/hydra/templates/config/fedora.yml +1 -1
  47. data/lib/generators/hydra/templates/config/solr.yml +1 -1
  48. data/lib/hydra-head/version.rb +1 -1
  49. data/lib/hydra.rb +13 -11
  50. data/lib/hydra/assets.rb +5 -135
  51. data/lib/hydra/catalog.rb +6 -44
  52. data/lib/hydra/controller.rb +10 -27
  53. data/lib/hydra/controller/assets_controller_behavior.rb +142 -0
  54. data/lib/hydra/controller/catalog_controller_behavior.rb +56 -0
  55. data/lib/hydra/controller/controller_behavior.rb +59 -0
  56. data/lib/hydra/controller/file_assets_behavior.rb +142 -0
  57. data/lib/hydra/controller/repository_controller_behavior.rb +119 -0
  58. data/lib/hydra/controller/upload_behavior.rb +139 -0
  59. data/lib/hydra/file_assets.rb +3 -138
  60. data/lib/hydra/file_assets_helper.rb +6 -133
  61. data/lib/hydra/generic_content.rb +15 -0
  62. data/lib/hydra/generic_image.rb +10 -0
  63. data/lib/hydra/global_configurable.rb +46 -0
  64. data/lib/hydra/model_methods.rb +3 -3
  65. data/lib/hydra/model_mixins.rb +1 -1
  66. data/lib/hydra/model_mixins/solr_document_extension.rb +24 -0
  67. data/lib/hydra/repository_controller.rb +4 -95
  68. data/lib/hydra/ui/controller.rb +1 -2
  69. data/lib/hydra/user.rb +13 -1
  70. data/lib/railties/hydra-fixtures.rake +1 -1
  71. data/tasks/hydra-head.rake +2 -0
  72. data/{app/models → test_support/etc}/common_metadata_asset.rb +1 -2
  73. data/test_support/features/mods_asset_show.feature +1 -1
  74. data/test_support/features/support/env.rb +2 -0
  75. data/test_support/features/support/paths.rb +2 -0
  76. data/test_support/spec/controllers/catalog_controller_spec.rb +8 -0
  77. data/test_support/spec/controllers/catalog_controller_viewing_context_spec.rb +10 -1
  78. data/test_support/spec/controllers/catalog_valid_html_spec.rb +8 -0
  79. data/test_support/spec/controllers/contributors_controller_spec.rb +10 -0
  80. data/test_support/spec/controllers/file_assets_controller_spec.rb +15 -3
  81. data/test_support/spec/controllers/hydra-assets_controller_spec.rb +11 -1
  82. data/test_support/spec/controllers/hydra_controller_spec.rb +15 -4
  83. data/test_support/spec/controllers/permissions_controller_spec.rb +8 -0
  84. data/test_support/spec/helpers/access_controls_enforcement_spec.rb +1 -2
  85. data/test_support/spec/helpers/file_assets_helper_spec.rb +1 -1
  86. data/test_support/spec/helpers/generic_content_objects_helper_spec.rb +10 -1
  87. data/test_support/spec/helpers/hydra-repository_controller_spec.rb +1 -1
  88. data/test_support/spec/helpers/hydra_assets_helper_spec.rb +8 -0
  89. data/test_support/spec/helpers/hydra_fedora_metadata_helper_spec.rb +11 -0
  90. data/test_support/spec/helpers/hydra_helper_spec.rb +18 -0
  91. data/test_support/spec/helpers/hydra_model_methods_spec.rb +0 -12
  92. data/test_support/spec/helpers/hydra_uploader_helper_spec.rb +8 -0
  93. data/test_support/spec/helpers/javascript_includes_helper_spec.rb +9 -1
  94. data/test_support/spec/lib/catalog_spec.rb +10 -3
  95. data/test_support/spec/lib/global_configurable_spec.rb +98 -0
  96. data/test_support/spec/lib/model_methods_spec.rb +29 -0
  97. data/test_support/spec/models/generic_content_spec.rb +11 -0
  98. data/test_support/spec/models/generic_image_spec.rb +15 -0
  99. data/test_support/spec/models/user_spec.rb +25 -0
  100. metadata +39 -37
  101. data/app/models/ability.rb +0 -5
  102. data/app/models/hydra/ability.rb +0 -137
  103. data/app/models/hydra/datastream/common_mods_index_methods.rb +0 -47
  104. data/app/models/hydra/datastream/mods_article.rb +0 -530
  105. data/app/models/hydra/datastream/mods_dataset.rb +0 -173
  106. data/app/models/hydra/datastream/mods_generic_content.rb +0 -498
  107. data/app/models/hydra/datastream/mods_image.rb +0 -497
  108. data/app/models/hydra/datastream/rights_metadata.rb +0 -191
  109. data/app/models/hydra/role_mapper_behavior.rb +0 -33
  110. data/app/models/role_mapper.rb +0 -6
  111. data/lib/hydra/access_controls_enforcement.rb +0 -237
  112. data/lib/hydra/access_controls_evaluation.rb +0 -38
  113. data/lib/hydra/common_mods_index_methods.rb +0 -46
  114. data/lib/hydra/model_mixins/mods_object.rb +0 -17
  115. data/lib/hydra/model_mixins/rights_metadata.rb +0 -357
  116. data/lib/hydra/mods_article.rb +0 -535
  117. data/lib/hydra/mods_dataset.rb +0 -177
  118. data/lib/hydra/mods_generic_content.rb +0 -500
  119. data/lib/hydra/mods_image.rb +0 -500
  120. data/lib/uva/mods_index_methods.rb +0 -30
  121. data/test_support/spec/lib/common_mods_index_methods_spec.rb +0 -26
  122. data/test_support/spec/models/ability_spec.rb +0 -40
  123. data/test_support/spec/models/hydra_rights_metadata_spec.rb +0 -175
  124. data/test_support/spec/models/role_mapper_spec.rb +0 -22
  125. data/test_support/spec/unit/rights_metadata_spec.rb +0 -80
@@ -1,5 +0,0 @@
1
- # Allows you to use CanCan to control access to Models
2
- class Ability
3
- include CanCan::Ability
4
- include Hydra::Ability
5
- end
@@ -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