geo_concerns 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/actors/geo_concerns/actors/file_actor.rb +25 -0
- data/app/actors/geo_concerns/actors/file_set_actor.rb +9 -0
- data/app/controllers/concerns/geo_concerns/file_sets_controller_behavior.rb +3 -2
- data/app/helpers/geo_concerns/bounding_box_helper.rb +26 -0
- data/app/helpers/geo_concerns/geo_works_helper.rb +22 -0
- data/app/models/concerns/geo_concerns/external_metadata_file_behavior.rb +1 -1
- data/app/models/concerns/geo_concerns/file_set/derivatives.rb +5 -5
- data/app/models/concerns/geo_concerns/file_set_metadata.rb +15 -0
- data/app/models/concerns/geo_concerns/geo_file_format_behavior.rb +4 -4
- data/app/models/concerns/geo_concerns/geo_file_set_behavior.rb +1 -0
- data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +10 -11
- data/app/presenters/geo_concerns/image_work_show_presenter.rb +2 -14
- data/app/presenters/geo_concerns/raster_work_show_presenter.rb +2 -14
- data/app/presenters/geo_concerns/vector_work_show_presenter.rb +1 -6
- data/app/renderers/geo_concerns/coverage_renderer.rb +36 -0
- data/app/schemas/geo_concerns/file_set_metadata_required.rb +5 -0
- data/app/views/curation_concerns/file_sets/_form.html.erb +1 -1
- data/app/views/curation_concerns/image_works/show.html.erb +2 -3
- data/app/views/curation_concerns/raster_works/show.html.erb +2 -3
- data/app/views/curation_concerns/vector_works/show.html.erb +2 -1
- data/app/views/geo_concerns/_related_external_metadata_files.html.erb +2 -2
- data/app/views/{curation_concerns/image_works/_related_image_files.html.erb → geo_concerns/_related_geo_files.html.erb} +5 -5
- data/app/views/{curation_concerns/image_works/_members.html.erb → geo_concerns/_related_geo_works.html.erb} +8 -6
- data/geo_concerns.gemspec +1 -1
- data/lib/generators/geo_concerns/install_generator.rb +2 -2
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/actors/image_work_actor.rb +6 -0
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/actors/raster_work_actor.rb +6 -0
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/actors/vector_work_actor.rb +6 -0
- data/lib/generators/geo_concerns/templates/jobs/characterize_job.rb +4 -3
- data/lib/geo_concerns/version.rb +1 -1
- data/spec/actors/geo_concerns/{file_actor_spec.rb → actors/file_actor_spec.rb} +3 -3
- data/spec/factories/external_metadata_files.rb +2 -2
- data/spec/factories/image_files.rb +5 -5
- data/spec/factories/image_works.rb +4 -3
- data/spec/factories/raster_files.rb +3 -3
- data/spec/factories/raster_works.rb +7 -5
- data/spec/factories/vector_files.rb +3 -3
- data/spec/factories/vector_works.rb +5 -4
- data/spec/features/create_raster_work_spec.rb +1 -1
- data/spec/helpers/bounding_box_helper_spec.rb +2 -2
- data/spec/helpers/geo_works_helper_spec.rb +30 -0
- data/spec/models/concerns/basic_geo_metadata_spec.rb +1 -1
- data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +7 -7
- data/spec/models/concerns/geo_concerns/file_set/geo_file_format_behavior_spec.rb +5 -5
- data/spec/models/external_metadata_file_spec.rb +8 -8
- data/spec/models/image_file_spec.rb +3 -3
- data/spec/models/image_work_spec.rb +5 -5
- data/spec/models/raster_file_spec.rb +3 -3
- data/spec/models/raster_work_spec.rb +9 -9
- data/spec/models/vector_file_spec.rb +3 -3
- data/spec/models/vector_work_spec.rb +7 -7
- data/spec/presenters/geo_concerns_show_presenter_spec.rb +5 -15
- data/spec/presenters/image_work_show_presenter_spec.rb +14 -15
- data/spec/presenters/raster_work_show_presenter_spec.rb +13 -13
- data/spec/presenters/vector_work_show_presenter_spec.rb +10 -10
- data/spec/renderers/{coverage_renderer_spec.rb → geo_concerns/coverage_renderer_spec.rb} +1 -1
- metadata +24 -22
- data/app/actors/geo_concerns/file_actor.rb +0 -20
- data/app/actors/geo_concerns/file_set_actor.rb +0 -7
- data/app/helpers/bounding_box_helper.rb +0 -24
- data/app/renderers/coverage_renderer.rb +0 -34
- data/app/views/curation_concerns/raster_works/_members.html.erb +0 -30
- data/app/views/curation_concerns/raster_works/_related_raster_files.html.erb +0 -24
- data/app/views/curation_concerns/vector_works/_related_vector_files.html.erb +0 -24
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/image_work_actor.rb +0 -4
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/raster_work_actor.rb +0 -4
- data/lib/generators/geo_concerns/templates/actors/curation_concerns/vector_work_actor.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5860cade4910404ebfc81e6d1dcb6524ab1b2a88
|
4
|
+
data.tar.gz: cb1f2d4920984de204a0d04b06593c9d804abe02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d04edc92c51d7de7f69fadec0b189e244a92586773715646efebb7076421301ff8c3ee97cd95fceeb1b9a903683968f51815e5120c4ce7d3b0d8058453cce79e
|
7
|
+
data.tar.gz: b17861f0bc73e579ab4cf38614988c6909c033bbc66a03215399e0f6b71a360068ec8a39a53a4fb854c831707af2f654c8d765e58ff3e0051cbf4c70621de53c
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
module Actors
|
3
|
+
class FileActor < CurationConcerns::Actors::FileActor
|
4
|
+
def ingest_file(file)
|
5
|
+
working_file = copy_file_to_working_directory(file, file_set.id)
|
6
|
+
IngestFileJob.perform_later(file_set,
|
7
|
+
working_file,
|
8
|
+
mime_type(file),
|
9
|
+
user,
|
10
|
+
relation)
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
# Determines the correct mime type for a file. If the mime type is stored on
|
15
|
+
# the file_set (set in the view), then use that value. If not, use the file
|
16
|
+
# content type, if it exists.
|
17
|
+
# @param [File, ActionDigest::HTTP::UploadedFile] file to get mime type from
|
18
|
+
# @return [String] Mime type for the file
|
19
|
+
def mime_type(file)
|
20
|
+
return file_set.geo_mime_type if file_set.geo_mime_type
|
21
|
+
file.respond_to?(:content_type) ? file.content_type : nil || file_set.geo_mime_type
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -3,17 +3,18 @@ module GeoConcerns
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
included do
|
5
5
|
self.show_presenter = ::FileSetPresenter
|
6
|
+
self.form_class = CurationConcerns::Forms::FileSetEditForm
|
6
7
|
end
|
7
8
|
|
8
9
|
# inject mime_type into permitted params
|
9
10
|
def file_set_params
|
10
11
|
super.tap do |permitted_params|
|
11
|
-
permitted_params[:
|
12
|
+
permitted_params[:geo_mime_type] = params[:file_set][:geo_mime_type]
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
def actor
|
16
|
-
@actor ||= GeoConcerns::FileSetActor.new(@file_set, current_user)
|
17
|
+
@actor ||= GeoConcerns::Actors::FileSetActor.new(@file_set, current_user)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
module BoundingBoxHelper
|
3
|
+
##
|
4
|
+
# Builds HTML string for bounding box selector tool.
|
5
|
+
# Calls boundingBoxSelector javascript function and
|
6
|
+
# passes the id of the location input element that it binds to.
|
7
|
+
# @param [Symbol] name of property that holds bounding box string
|
8
|
+
# @return[String]
|
9
|
+
def bbox(property)
|
10
|
+
%(
|
11
|
+
<div id='bbox'></div>
|
12
|
+
<script>
|
13
|
+
boundingBoxSelector({inputId: #{bbox_input_id(property)}});
|
14
|
+
</script>
|
15
|
+
).html_safe
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Returns id of location input that is bound to bbox selector.
|
20
|
+
# @param [Symbol] name of property that holds bounding box string
|
21
|
+
# @return[String] id of location input element
|
22
|
+
def bbox_input_id(property)
|
23
|
+
"#{curation_concern.class.name.underscore}_#{property}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
module GeoWorksHelper
|
3
|
+
# Returns human readable name of child geo work type.
|
4
|
+
# @param [GeoConcernsShowPresenter] geo work show presenter
|
5
|
+
# @return[String]
|
6
|
+
def child_geo_works_type(presenter)
|
7
|
+
case presenter.class.to_s
|
8
|
+
when 'GeoConcerns::ImageWorkShowPresenter'
|
9
|
+
'Raster'
|
10
|
+
when 'GeoConcerns::RasterWorkShowPresenter'
|
11
|
+
'Vector'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns human readable name of geo work type.
|
16
|
+
# @param [GeoConcernsShowPresenter] geo work show presenter
|
17
|
+
# @return[String]
|
18
|
+
def geo_work_type(presenter)
|
19
|
+
presenter.human_readable_type.sub('Work', '')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,7 +4,7 @@ module GeoConcerns
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
def create_derivatives(filename)
|
7
|
-
case
|
7
|
+
case geo_mime_type
|
8
8
|
when *ImageFormatService.select_options.map(&:last)
|
9
9
|
image_derivatives(filename)
|
10
10
|
when *RasterFormatService.select_options.map(&:last)
|
@@ -26,11 +26,11 @@ module GeoConcerns
|
|
26
26
|
|
27
27
|
def raster_derivatives(filename)
|
28
28
|
GeoConcerns::Runners::RasterDerivatives
|
29
|
-
.create(filename, outputs: [{ input_format:
|
29
|
+
.create(filename, outputs: [{ input_format: geo_mime_type,
|
30
30
|
label: :display_raster,
|
31
31
|
format: 'tif',
|
32
32
|
url: derivative_url('display_raster') },
|
33
|
-
{ input_format:
|
33
|
+
{ input_format: geo_mime_type,
|
34
34
|
label: :thumbnail,
|
35
35
|
format: 'jpg',
|
36
36
|
size: '200x150',
|
@@ -39,11 +39,11 @@ module GeoConcerns
|
|
39
39
|
|
40
40
|
def vector_derivatives(filename)
|
41
41
|
GeoConcerns::Runners::VectorDerivatives
|
42
|
-
.create(filename, outputs: [{ input_format:
|
42
|
+
.create(filename, outputs: [{ input_format: geo_mime_type,
|
43
43
|
label: :display_vector,
|
44
44
|
format: 'zip',
|
45
45
|
url: derivative_url('display_vector') },
|
46
|
-
{ input_format:
|
46
|
+
{ input_format: geo_mime_type,
|
47
47
|
label: :thumbnail,
|
48
48
|
format: 'jpg',
|
49
49
|
size: '200x150',
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
# Attributes and methods for basic geospatial metadata used by Works
|
3
|
+
module FileSetMetadata
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
apply_schema ::GeoConcerns::FileSetMetadataRequired,
|
8
|
+
ActiveFedora::SchemaIndexingStrategy.new(
|
9
|
+
ActiveFedora::Indexers::GlobalIndexer.new(
|
10
|
+
[:stored_searchable, :symbol]
|
11
|
+
)
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -3,19 +3,19 @@ module GeoConcerns
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
def image_file?
|
6
|
-
ImageFormatService.include?(
|
6
|
+
ImageFormatService.include?(geo_mime_type)
|
7
7
|
end
|
8
8
|
|
9
9
|
def raster_file?
|
10
|
-
RasterFormatService.include?(
|
10
|
+
RasterFormatService.include?(geo_mime_type)
|
11
11
|
end
|
12
12
|
|
13
13
|
def vector_file?
|
14
|
-
VectorFormatService.include?(
|
14
|
+
VectorFormatService.include?(geo_mime_type)
|
15
15
|
end
|
16
16
|
|
17
17
|
def external_metadata_file?
|
18
|
-
MetadataFormatService.include?(
|
18
|
+
MetadataFormatService.include?(geo_mime_type)
|
19
19
|
end
|
20
20
|
|
21
21
|
def geo_file_format?
|
@@ -2,26 +2,25 @@ module GeoConcerns
|
|
2
2
|
class GeoConcernsShowPresenter < CurationConcerns::WorkShowPresenter
|
3
3
|
delegate :has?, :first, to: :solr_document
|
4
4
|
delegate :spatial, :temporal, :issued, :coverage, :provenance, to: :solr_document
|
5
|
+
class_attribute :file_format_service
|
5
6
|
|
6
|
-
def
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
presenter,
|
12
|
-
current_ability)
|
7
|
+
def geo_file_set_presenters
|
8
|
+
# filter for geo file sets
|
9
|
+
file_set_presenters.select do |member|
|
10
|
+
file_format_service.include? member.solr_document[:geo_mime_type_tesim][0]
|
11
|
+
end
|
13
12
|
end
|
14
13
|
|
15
|
-
def
|
14
|
+
def external_metadata_file_set_presenters
|
16
15
|
# filter for external metadata files
|
17
|
-
|
18
|
-
MetadataFormatService.include? member.solr_document[:
|
16
|
+
file_set_presenters.select do |member|
|
17
|
+
MetadataFormatService.include? member.solr_document[:geo_mime_type_tesim][0]
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
21
|
def attribute_to_html(field, options = {})
|
23
22
|
if field == :coverage
|
24
|
-
::CoverageRenderer.new(field, send(field), options).render
|
23
|
+
GeoConcerns::CoverageRenderer.new(field, send(field), options).render
|
25
24
|
else
|
26
25
|
super field, options
|
27
26
|
end
|
@@ -1,18 +1,6 @@
|
|
1
1
|
module GeoConcerns
|
2
2
|
class ImageWorkShowPresenter < GeoConcernsShowPresenter
|
3
|
-
|
4
|
-
|
5
|
-
members(::GeoConcerns::RasterWorkShowPresenter).select do |member|
|
6
|
-
format = member.solr_document[:has_model_ssim]
|
7
|
-
format ? format.first == 'RasterWork' : false
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def image_file_presenters
|
12
|
-
# filter for image files
|
13
|
-
members(::FileSetPresenter).select do |member|
|
14
|
-
ImageFormatService.include? member.solr_document[:mime_type_ssi]
|
15
|
-
end
|
16
|
-
end
|
3
|
+
self.work_presenter_class = ::GeoConcerns::RasterWorkShowPresenter
|
4
|
+
self.file_format_service = ImageFormatService
|
17
5
|
end
|
18
6
|
end
|
@@ -1,18 +1,6 @@
|
|
1
1
|
module GeoConcerns
|
2
2
|
class RasterWorkShowPresenter < GeoConcernsShowPresenter
|
3
|
-
|
4
|
-
|
5
|
-
members(::GeoConcerns::VectorWorkShowPresenter).select do |member|
|
6
|
-
format = member.solr_document[:has_model_ssim]
|
7
|
-
format ? format.first == 'VectorWork' : false
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def raster_file_presenters
|
12
|
-
# filter for raster files
|
13
|
-
members(::FileSetPresenter).select do |member|
|
14
|
-
RasterFormatService.include? member.solr_document[:mime_type_ssi]
|
15
|
-
end
|
16
|
-
end
|
3
|
+
self.work_presenter_class = ::GeoConcerns::VectorWorkShowPresenter
|
4
|
+
self.file_format_service = RasterFormatService
|
17
5
|
end
|
18
6
|
end
|
@@ -1,10 +1,5 @@
|
|
1
1
|
module GeoConcerns
|
2
2
|
class VectorWorkShowPresenter < GeoConcernsShowPresenter
|
3
|
-
|
4
|
-
# filter for vector files
|
5
|
-
members(::FileSetPresenter).select do |member|
|
6
|
-
VectorFormatService.include? member.solr_document[:mime_type_ssi]
|
7
|
-
end
|
8
|
-
end
|
3
|
+
self.file_format_service = VectorFormatService
|
9
4
|
end
|
10
5
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GeoConcerns
|
2
|
+
class CoverageRenderer < CurationConcerns::Renderers::AttributeRenderer
|
3
|
+
def render
|
4
|
+
coverage = values.first if values
|
5
|
+
return '' unless coverage
|
6
|
+
markup(coverage).html_safe
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def markup(coverage)
|
12
|
+
markup = ''
|
13
|
+
markup << %(<tr><th>#{label}</th>\n<td id='accordion'><ul class='tabular'>)
|
14
|
+
markup << value(coverage)
|
15
|
+
markup << toggle_button
|
16
|
+
markup << map(coverage)
|
17
|
+
markup << %(</ul></td></tr>)
|
18
|
+
markup
|
19
|
+
end
|
20
|
+
|
21
|
+
def value(coverage)
|
22
|
+
attributes = microdata_object_attributes(field).merge(class: "attribute #{field}")
|
23
|
+
%(<li#{html_attributes(attributes)}>#{attribute_value_to_html(coverage.to_s)})
|
24
|
+
end
|
25
|
+
|
26
|
+
def toggle_button
|
27
|
+
%( <a data-toggle='collapse' data-parent='accordion' href='#bbox' class='btn btn-default'>
|
28
|
+
Toggle Map</a>)
|
29
|
+
end
|
30
|
+
|
31
|
+
def map(coverage)
|
32
|
+
%(<div id='bbox' class='collapse in'></div>
|
33
|
+
<script>boundingBoxSelector({coverage: '#{coverage}', readonly: true});</script>)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -24,7 +24,7 @@
|
|
24
24
|
VectorFormatService.select_options
|
25
25
|
end %>
|
26
26
|
<% if select_options %>
|
27
|
-
<%= f.input(:
|
27
|
+
<%= f.input(:geo_mime_type, as: :select, collection: select_options,
|
28
28
|
input_html: { class: 'form-control' }, label: 'Type') %>
|
29
29
|
<% end %>
|
30
30
|
<%= f.input :files, as: :multifile %>
|
@@ -9,9 +9,8 @@
|
|
9
9
|
<%= render 'representative_media', presenter: @presenter %>
|
10
10
|
<%= render 'geo_concerns/attributes', presenter: @presenter %>
|
11
11
|
|
12
|
-
<%= render '
|
12
|
+
<%= render 'geo_concerns/related_geo_files', presenter: @presenter %>
|
13
13
|
<%= render 'geo_concerns/related_external_metadata_files', presenter: @presenter %>
|
14
|
-
|
15
|
-
<%= render 'members', presenter: @presenter %>
|
14
|
+
<%= render 'geo_concerns/related_geo_works', presenter: @presenter %>
|
16
15
|
|
17
16
|
<%= render "show_actions", collector: collector, editor: editor%>
|
@@ -9,9 +9,8 @@
|
|
9
9
|
<%= render 'representative_media', presenter: @presenter %>
|
10
10
|
<%= render 'geo_concerns/attributes', presenter: @presenter %>
|
11
11
|
|
12
|
-
<%= render '
|
12
|
+
<%= render 'geo_concerns/related_geo_files', presenter: @presenter %>
|
13
13
|
<%= render 'geo_concerns/related_external_metadata_files', presenter: @presenter %>
|
14
|
-
|
15
|
-
<%= render 'members', presenter: @presenter %>
|
14
|
+
<%= render 'geo_concerns/related_geo_works', presenter: @presenter %>
|
16
15
|
|
17
16
|
<%= render "show_actions", collector: collector, editor: editor%>
|
@@ -9,7 +9,8 @@
|
|
9
9
|
<%= render 'representative_media', presenter: @presenter %>
|
10
10
|
<%= render 'geo_concerns/attributes', presenter: @presenter %>
|
11
11
|
|
12
|
-
<%= render '
|
12
|
+
<%= render 'geo_concerns/related_geo_files', presenter: @presenter %>
|
13
13
|
<%= render 'geo_concerns/related_external_metadata_files', presenter: @presenter %>
|
14
|
+
<%= render 'geo_concerns/related_geo_works', presenter: @presenter %>
|
14
15
|
|
15
16
|
<%= render "show_actions", collector: collector, editor: editor%>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if presenter.
|
1
|
+
<% if presenter.external_metadata_file_set_presenters.present? %>
|
2
2
|
<div class="panel panel-default related_files">
|
3
3
|
<div class="panel-heading">
|
4
4
|
<h2>Metadata Files</h2>
|
@@ -14,7 +14,7 @@
|
|
14
14
|
</tr>
|
15
15
|
</thead>
|
16
16
|
<tbody>
|
17
|
-
<%= render partial: 'member', collection: presenter.
|
17
|
+
<%= render partial: 'member', collection: presenter.external_metadata_file_set_presenters %>
|
18
18
|
</tbody>
|
19
19
|
</table>
|
20
20
|
</div>
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<% if presenter.
|
1
|
+
<% if presenter.geo_file_set_presenters.present? %>
|
2
2
|
<div class="panel panel-default related_files">
|
3
3
|
<div class="panel-heading">
|
4
|
-
<h2
|
4
|
+
<h2><%= geo_work_type(presenter) %> File</h2>
|
5
5
|
</div>
|
6
6
|
<table class="table table-striped">
|
7
7
|
<thead>
|
@@ -14,11 +14,11 @@
|
|
14
14
|
</tr>
|
15
15
|
</thead>
|
16
16
|
<tbody>
|
17
|
-
<%= render partial: 'member', collection: @presenter.
|
17
|
+
<%= render partial: 'member', collection: @presenter.geo_file_set_presenters %>
|
18
18
|
</tbody>
|
19
19
|
</table>
|
20
20
|
</div>
|
21
21
|
<% elsif can? :edit, presenter.id %>
|
22
|
-
<h2
|
23
|
-
<p class="center"><em>This <%= presenter.human_readable_type %> doesn't have an
|
22
|
+
<h2><%= geo_work_type(presenter) %> File</h2>
|
23
|
+
<p class="center"><em>This <%= presenter.human_readable_type %> doesn't have an <%= geo_work_type(presenter).downcase %> file associated with it.</em></p>
|
24
24
|
<% end %>
|