From 90a13157307e49334d6c064a1edfeb84fc8eb6b0 Mon Sep 17 00:00:00 2001
From: Eliot Jordan
Date: Wed, 4 Jan 2017 11:19:29 -0600
Subject: [PATCH] Integrate with GeoConcerns (#837)
* add geo_concerns to Gemfile
* install GeoConcerns
* add simple-tiles dependencies to circleci
* remove geo_concerns fileset presenter behavior
* generate thumbnail paths for geo works
* skip removal of pending uploads for objects that don't respond to pending_uploads
* add geo extensions to PairtreeDerivativePath
* update to geo_concerns 0.2.0
* trigger manifest event in file set actor only if parent is not a geo work
* reorganize welcome page to accommodate geo works
* add icons to works on welcome page
* change work-icons src to font-url
* add staging to geoconcerns messaging config file
* upgrade to geo_concerns v0.3.0
* use ark noid in gbl slug
* create separate geo derivatives path
* index thumbnail path in geo works using local thumbnail path service
* change bbox label color to black
* upgrade to geo_concerns v0.3.1 (#880)
* add shared geo-derivatives directory to capistrano (#881)
* override the geo_concerns metadata_xml method on file set (#884)
* add local presenters for geo works
* add local forms for geo works
* add metadata for geo works and put state behavior in separate module
* add state and rights_statement geo work views
* add flagging to geo works and put flagging behavior in separate module
* extract common presenter methods into module
* upgrade to geo_concerns v0.3.2 (#889)
* override geoserver delivery service base path method (#888)
* Fix Geoblacklight document generation (#891)
* set different provenance for geoblacklight documents
* upgrade to geo_concerns v0.3.3
* use curation concern base view partials for geo file manager
* add geo works to collections in the same way as other works (#904)
* limit number of subjects displayed on index page (#907)
* fire geo works events only when state is complete (#909)
---
Gemfile | 1 +
Gemfile.lock | 43 +++++++++++-
.../actors/image_work_actor.rb | 6 ++
.../actors/raster_work_actor.rb | 6 ++
.../actors/vector_work_actor.rb | 6 ++
app/actors/file_set_actor.rb | 2 +-
app/assets/fonts/work-icons/work-icons.eot | Bin 0 -> 3022 bytes
app/assets/fonts/work-icons/work-icons.svg | 16 +++++
app/assets/fonts/work-icons/work-icons.ttf | Bin 0 -> 2828 bytes
app/assets/fonts/work-icons/work-icons.woff | Bin 0 -> 1988 bytes
app/assets/javascripts/application.js | 4 +-
app/assets/javascripts/geo_concerns.js | 1 +
app/assets/stylesheets/application.css.scss | 2 +
.../stylesheets/components/bounding_box.scss | 5 ++
.../stylesheets/components/font-face.scss | 45 +++++++++++-
.../stylesheets/components/welcome_page.scss | 23 ++++++-
app/assets/stylesheets/geo_concerns.scss | 3 +
app/controllers/catalog_controller.rb | 6 +-
.../concerns/curation_concerns/flagging.rb | 24 +++++++
.../geo_messenger_behavior.rb | 25 +++++++
.../curation_concerns_controller.rb | 18 +----
.../curation_concerns/file_sets_controller.rb | 1 +
.../image_works_controller.rb | 12 ++++
.../raster_works_controller.rb | 13 ++++
.../vector_works_controller.rb | 13 ++++
.../curation_concerns/image_work_form.rb | 7 ++
.../curation_concerns/raster_work_form.rb | 8 +++
.../curation_concerns/vector_work_form.rb | 8 +++
app/helpers/geo_concerns_helper.rb | 6 ++
app/helpers/index_view_helper.rb | 7 ++
app/helpers/thumbnail_helper.rb | 29 ++++++++
app/indexers/file_set_indexer.rb | 3 +
app/indexers/geo_work_indexer.rb | 3 +
app/jobs/ingest_file_job.rb | 1 +
app/models/ability.rb | 1 +
app/models/concerns/common_metadata.rb | 31 ---------
app/models/concerns/geo_metadata.rb | 15 ++++
app/models/concerns/state_behavior.rb | 39 +++++++++++
app/models/file_set.rb | 22 ++++++
app/models/image_work.rb | 12 ++++
app/models/multi_volume_work.rb | 1 +
app/models/raster_work.rb | 13 ++++
app/models/scanned_resource.rb | 1 +
app/models/solr_document.rb | 3 +
app/models/vector_work.rb | 13 ++++
.../curation_concerns_show_presenter.rb | 43 +-----------
app/presenters/image_work_show_presenter.rb | 6 ++
.../multi_volume_work_show_presenter.rb | 2 +
app/presenters/plum_attributes.rb | 46 +++++++++++++
app/presenters/raster_work_show_presenter.rb | 6 ++
.../scanned_resource_show_presenter.rb | 2 +
app/presenters/vector_work_show_presenter.rb | 5 ++
app/schemas/geo_schema.rb | 13 ++++
app/services/geo_concerns/delivery_service.rb | 11 +++
.../document_builder/slug_builder.rb | 32 +++++++++
app/services/geoserver.rb | 14 ++++
app/services/thumbnail_path_service.rb | 7 ++
app/values/pairtree_derivative_path.rb | 48 +++++++++----
.../_file_manager_attributes.html.erb | 0
.../_file_manager_extra_tools.html.erb | 0
...e_manager_member_resource_options.html.erb | 10 +++
.../_file_manager_resource_form.html.erb | 6 ++
.../_file_manager_thumbnail.html.erb | 1 +
.../image_works/_show_actions.html.erb | 23 +++++++
.../image_works/show.html.erb | 22 ++++++
.../_file_manager_attributes.html.erb | 0
.../_file_manager_extra_tools.html.erb | 0
...e_manager_member_resource_options.html.erb | 10 +++
.../_file_manager_resource_form.html.erb | 6 ++
.../_file_manager_thumbnail.html.erb | 1 +
.../raster_works/_show_actions.html.erb | 9 +++
.../raster_works/show.html.erb | 22 ++++++
.../_file_manager_attributes.html.erb | 0
.../_file_manager_extra_tools.html.erb | 0
...e_manager_member_resource_options.html.erb | 10 +++
.../_file_manager_resource_form.html.erb | 6 ++
.../_file_manager_thumbnail.html.erb | 1 +
.../vector_works/_show_actions.html.erb | 9 +++
.../vector_works/show.html.erb | 22 ++++++
app/views/geo_concerns/_attributes.html.erb | 32 +++++++++
.../_form_additional_information.html.erb | 13 ++++
.../_form_supplementary_fields.html.erb | 28 ++++++++
app/views/welcome/_work_item.html.erb | 10 +++
app/views/welcome/index.html.erb | 63 ++++++++++-------
bin/ci_simple_tiles_install.sh | 5 ++
circle.yml | 3 +-
config/authorities/image_formats.yml | 7 ++
config/authorities/metadata_formats.yml | 7 ++
config/authorities/raster_formats.yml | 13 ++++
config/authorities/vector_formats.yml | 7 ++
config/config.yml | 2 +
config/deploy.rb | 2 +-
config/geo_concerns_messaging.yml | 18 +++++
config/geoblacklight.yml | 12 ++++
config/geoserver.yml | 27 ++++++++
config/initializers/curation_concerns.rb | 4 ++
.../geo_concerns_messaging_config.rb | 37 ++++++++++
config/initializers/geoblacklight_config.rb | 13 ++++
config/initializers/simpler_tiles.rb | 65 ++++++++++++++++++
config/routes.rb | 16 +++++
config/simpler_tiles.yml | 24 +++++++
db/schema.rb | 23 +++----
.../image_work_actor_spec.rb | 9 +++
.../raster_work_actor_spec.rb | 9 +++
.../vector_work_actor_spec.rb | 9 +++
spec/actors/file_set_actor_spec.rb | 33 +++++++++
.../image_works_controller_spec_spec.rb | 12 ++++
.../raster_works_controller_spec_spec.rb | 12 ++++
.../vector_works_controller_spec_spec.rb | 55 +++++++++++++++
spec/factories/vector_works.rb | 15 ++++
spec/features/root_spec.rb | 8 +--
spec/fixtures/files/mercer.json | 3 +
spec/helpers/index_view_helper_spec.rb | 16 +++++
spec/helpers/thumbnail_helper_spec.rb | 61 ++++++++++++++++
spec/models/file_set_spec.rb | 17 +++++
spec/models/image_work_spec.rb | 7 ++
spec/models/raster_work_spec.rb | 7 ++
spec/models/vector_work_spec.rb | 16 +++++
.../geo_concerns/delivery_service_spec.rb | 13 ++++
.../geo_concerns/slug_builder_spec.rb | 22 ++++++
spec/services/geoserver_spec.rb | 23 +++++++
spec/values/pairtree_derivative_path_spec.rb | 15 ++++
.../base/structure.html.erb_spec.rb | 1 +
123 files changed, 1528 insertions(+), 157 deletions(-)
create mode 100644 app/actors/curation_concerns/actors/image_work_actor.rb
create mode 100644 app/actors/curation_concerns/actors/raster_work_actor.rb
create mode 100644 app/actors/curation_concerns/actors/vector_work_actor.rb
create mode 100644 app/assets/fonts/work-icons/work-icons.eot
create mode 100644 app/assets/fonts/work-icons/work-icons.svg
create mode 100644 app/assets/fonts/work-icons/work-icons.ttf
create mode 100644 app/assets/fonts/work-icons/work-icons.woff
create mode 100644 app/assets/javascripts/geo_concerns.js
create mode 100644 app/assets/stylesheets/components/bounding_box.scss
create mode 100644 app/assets/stylesheets/geo_concerns.scss
create mode 100644 app/controllers/concerns/curation_concerns/flagging.rb
create mode 100644 app/controllers/concerns/curation_concerns/geo_messenger_behavior.rb
create mode 100644 app/controllers/curation_concerns/image_works_controller.rb
create mode 100644 app/controllers/curation_concerns/raster_works_controller.rb
create mode 100644 app/controllers/curation_concerns/vector_works_controller.rb
create mode 100644 app/forms/curation_concerns/image_work_form.rb
create mode 100644 app/forms/curation_concerns/raster_work_form.rb
create mode 100644 app/forms/curation_concerns/vector_work_form.rb
create mode 100644 app/helpers/geo_concerns_helper.rb
create mode 100644 app/helpers/index_view_helper.rb
create mode 100644 app/helpers/thumbnail_helper.rb
create mode 100644 app/indexers/file_set_indexer.rb
create mode 100644 app/indexers/geo_work_indexer.rb
create mode 100644 app/models/concerns/geo_metadata.rb
create mode 100644 app/models/concerns/state_behavior.rb
create mode 100644 app/models/image_work.rb
create mode 100644 app/models/raster_work.rb
create mode 100644 app/models/vector_work.rb
create mode 100644 app/presenters/image_work_show_presenter.rb
create mode 100644 app/presenters/plum_attributes.rb
create mode 100644 app/presenters/raster_work_show_presenter.rb
create mode 100644 app/presenters/vector_work_show_presenter.rb
create mode 100644 app/schemas/geo_schema.rb
create mode 100644 app/services/geo_concerns/delivery_service.rb
create mode 100644 app/services/geo_concerns/discovery/document_builder/slug_builder.rb
create mode 100644 app/services/geoserver.rb
create mode 100644 app/services/thumbnail_path_service.rb
create mode 100644 app/views/curation_concerns/image_works/_file_manager_attributes.html.erb
create mode 100644 app/views/curation_concerns/image_works/_file_manager_extra_tools.html.erb
create mode 100644 app/views/curation_concerns/image_works/_file_manager_member_resource_options.html.erb
create mode 100644 app/views/curation_concerns/image_works/_file_manager_resource_form.html.erb
create mode 100644 app/views/curation_concerns/image_works/_file_manager_thumbnail.html.erb
create mode 100644 app/views/curation_concerns/image_works/_show_actions.html.erb
create mode 100644 app/views/curation_concerns/image_works/show.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_file_manager_attributes.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_file_manager_extra_tools.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_file_manager_member_resource_options.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_file_manager_resource_form.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_file_manager_thumbnail.html.erb
create mode 100644 app/views/curation_concerns/raster_works/_show_actions.html.erb
create mode 100644 app/views/curation_concerns/raster_works/show.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_file_manager_attributes.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_file_manager_extra_tools.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_file_manager_member_resource_options.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_file_manager_resource_form.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_file_manager_thumbnail.html.erb
create mode 100644 app/views/curation_concerns/vector_works/_show_actions.html.erb
create mode 100644 app/views/curation_concerns/vector_works/show.html.erb
create mode 100644 app/views/geo_concerns/_attributes.html.erb
create mode 100644 app/views/geo_concerns/_form_additional_information.html.erb
create mode 100644 app/views/geo_concerns/_form_supplementary_fields.html.erb
create mode 100644 app/views/welcome/_work_item.html.erb
create mode 100755 bin/ci_simple_tiles_install.sh
create mode 100644 config/authorities/image_formats.yml
create mode 100644 config/authorities/metadata_formats.yml
create mode 100644 config/authorities/raster_formats.yml
create mode 100644 config/authorities/vector_formats.yml
create mode 100644 config/geo_concerns_messaging.yml
create mode 100644 config/geoblacklight.yml
create mode 100644 config/geoserver.yml
create mode 100644 config/initializers/geo_concerns_messaging_config.rb
create mode 100644 config/initializers/geoblacklight_config.rb
create mode 100644 config/initializers/simpler_tiles.rb
create mode 100644 config/simpler_tiles.yml
create mode 100644 spec/actors/curation_concerns/image_work_actor_spec.rb
create mode 100644 spec/actors/curation_concerns/raster_work_actor_spec.rb
create mode 100644 spec/actors/curation_concerns/vector_work_actor_spec.rb
create mode 100644 spec/actors/file_set_actor_spec.rb
create mode 100644 spec/controllers/curation_concerns/image_works_controller_spec_spec.rb
create mode 100644 spec/controllers/curation_concerns/raster_works_controller_spec_spec.rb
create mode 100644 spec/controllers/curation_concerns/vector_works_controller_spec_spec.rb
create mode 100644 spec/factories/vector_works.rb
create mode 100644 spec/fixtures/files/mercer.json
create mode 100644 spec/helpers/index_view_helper_spec.rb
create mode 100644 spec/helpers/thumbnail_helper_spec.rb
create mode 100644 spec/models/image_work_spec.rb
create mode 100644 spec/models/raster_work_spec.rb
create mode 100644 spec/models/vector_work_spec.rb
create mode 100644 spec/services/geo_concerns/delivery_service_spec.rb
create mode 100644 spec/services/geo_concerns/slug_builder_spec.rb
create mode 100644 spec/services/geoserver_spec.rb
diff --git a/Gemfile b/Gemfile
index 0a75e3b08..878ebef53 100644
--- a/Gemfile
+++ b/Gemfile
@@ -38,6 +38,7 @@ gem 'rsolr', '~> 1.1.0'
gem 'devise', '~> 3.0'
gem 'devise-guests', '~> 0.3'
gem 'iiif-presentation', github: 'iiif/osullivan', branch: 'development'
+gem 'geo_concerns', '~> 0.3.3'
# PDF generation
gem 'prawn'
diff --git a/Gemfile.lock b/Gemfile.lock
index d699db39f..a280bad95 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -242,6 +242,7 @@ GEM
execjs
coffee-script-source (1.10.0)
concurrent-ruby (1.0.2)
+ confstruct (0.2.7)
connection_pool (2.2.0)
coveralls (0.8.3)
json (~> 1.8)
@@ -253,6 +254,7 @@ GEM
safe_yaml (~> 1.0.0)
daemons (1.2.4)
dalli (2.7.6)
+ dbf (3.0.8)
debug_inspector (0.0.2)
deprecation (1.0.0)
activesupport
@@ -290,6 +292,18 @@ GEM
ffi (1.9.14)
font-awesome-rails (4.7.0.0)
railties (>= 3.2, < 5.1)
+ geo_concerns (0.3.3)
+ bunny
+ curation_concerns (>= 1.6)
+ geoblacklight_messaging
+ jquery-ui-rails (~> 5.0.5)
+ json-schema (>= 2.6.2)
+ leaflet-rails (~> 0.7)
+ rgeoserver (>= 0.10.0)
+ simpler-tiles
+ geoblacklight_messaging (0.2.0)
+ rails (>= 4.2.7.1)
+ sneakers
globalid (0.3.7)
activesupport (>= 4.1.0)
google-api-client (0.9.19)
@@ -386,6 +400,8 @@ GEM
json-ld (2.1.0)
multi_json (~> 1.11)
rdf (~> 2.1)
+ json-schema (2.7.0)
+ addressable (>= 2.4)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
@@ -404,6 +420,7 @@ GEM
rdf-turtle
rdf-vocab (>= 0.8)
slop
+ leaflet-rails (0.7.7)
link_header (0.0.8)
little-plugger (1.1.4)
logging (2.1.0)
@@ -551,6 +568,19 @@ GEM
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
retriable (2.1.0)
+ rgeo (0.5.3)
+ rgeo-shapefile (0.4.1)
+ dbf (~> 3.0)
+ rgeo (~> 0.3)
+ rgeoserver (0.10.0)
+ activemodel
+ activesupport
+ confstruct (~> 0.2.7)
+ nokogiri
+ rest-client
+ rgeo (~> 0.5.3)
+ rgeo-shapefile (~> 0.4.1)
+ rubyzip
rsolr (1.1.2)
builder (>= 2.1.2)
rspec-core (3.5.3)
@@ -598,11 +628,14 @@ GEM
sdoc (0.4.1)
json (~> 1.7, >= 1.7.7)
rdoc (~> 4.0)
+ serverengine (2.0.4)
+ sigdump (~> 0.2.2)
sidekiq (4.2.3)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0)
redis (~> 3.2, >= 3.2.1)
+ sigdump (0.2.4)
signet (0.7.3)
addressable (~> 2.3)
faraday (~> 0.9)
@@ -616,6 +649,7 @@ GEM
json (~> 1.8)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
+ simpler-tiles (0.3.1)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
@@ -626,6 +660,11 @@ GEM
httparty (>= 0.11.0)
oauth2 (>= 0.9.2)
slop (3.6.0)
+ sneakers (0.0.7)
+ bunny (>= 0.10.0)
+ serverengine
+ thor
+ thread
solr_wrapper (0.18.0)
faraday
ruby-progressbar
@@ -659,6 +698,7 @@ GEM
term-ansicolor (1.3.2)
tins (~> 1.0)
thor (0.19.1)
+ thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.12.0)
@@ -717,6 +757,7 @@ DEPENDENCIES
ezid-client
factory_girl_rails
fcrepo_wrapper (~> 0.6.0)
+ geo_concerns (~> 0.3.3)
hydra-derivatives (= 3.1.3)
hydra-pcdm!
hydra-role-management (~> 0.2.0)
@@ -770,4 +811,4 @@ DEPENDENCIES
webmock (~> 1.0)
BUNDLED WITH
- 1.12.5
+ 1.13.6
diff --git a/app/actors/curation_concerns/actors/image_work_actor.rb b/app/actors/curation_concerns/actors/image_work_actor.rb
new file mode 100644
index 000000000..a15f40e5f
--- /dev/null
+++ b/app/actors/curation_concerns/actors/image_work_actor.rb
@@ -0,0 +1,6 @@
+module CurationConcerns
+ module Actors
+ class ImageWorkActor < CurationConcerns::Actors::BaseActor
+ end
+ end
+end
diff --git a/app/actors/curation_concerns/actors/raster_work_actor.rb b/app/actors/curation_concerns/actors/raster_work_actor.rb
new file mode 100644
index 000000000..67c96f2d7
--- /dev/null
+++ b/app/actors/curation_concerns/actors/raster_work_actor.rb
@@ -0,0 +1,6 @@
+module CurationConcerns
+ module Actors
+ class RasterWorkActor < CurationConcerns::Actors::BaseActor
+ end
+ end
+end
diff --git a/app/actors/curation_concerns/actors/vector_work_actor.rb b/app/actors/curation_concerns/actors/vector_work_actor.rb
new file mode 100644
index 000000000..f2e57edfe
--- /dev/null
+++ b/app/actors/curation_concerns/actors/vector_work_actor.rb
@@ -0,0 +1,6 @@
+module CurationConcerns
+ module Actors
+ class VectorWorkActor < CurationConcerns::Actors::BaseActor
+ end
+ end
+end
diff --git a/app/actors/file_set_actor.rb b/app/actors/file_set_actor.rb
index 2035aa1be..257f9292c 100644
--- a/app/actors/file_set_actor.rb
+++ b/app/actors/file_set_actor.rb
@@ -1,7 +1,7 @@
class FileSetActor < ::CurationConcerns::Actors::FileSetActor
def attach_file_to_work(*args)
super.tap do |_result|
- messenger.record_updated(args.first)
+ messenger.record_updated(args.first) unless args.first.is_a? GeoConcerns::BasicGeoMetadata
end
end
diff --git a/app/assets/fonts/work-icons/work-icons.eot b/app/assets/fonts/work-icons/work-icons.eot
new file mode 100644
index 0000000000000000000000000000000000000000..0599fe99b053e07e38866d6daadddfe374e16a24
GIT binary patch
literal 3022
zcmc&$U1%KF6+UPFXRa)1v@^3>S=wFgL|R)LN&CO49L3u<-V_rP_eY||BGyJ;$+EP&
zVzqJ-^0I~cp|}q*MNT1pyiO*&jI4jGt%G)aE3EfV7HoPZ99aIsSP
z)`cDG-d_QXPY4}-<>hk~D1t)#pNWsZ_RZPsYo9LdlhU_|UtFnIxBC93uMvNj`uVl$
z_SVr6Spwq^G_S2~zP*b2e`y8rc>pWf9`6%{gzUI
z6!AYNeq^(`QkD8;gY<`qx9ZimwqO~4P4h1hA8%CawclJi_?VVjBJA&5&F%K7=*0W9
zewpTPczdJO!*`DEULJVy5SX8(ziiy5JpuGa!Oxx+B#}(-o}daB8!dNtl*UG
z0_$LBu1|6$V-iu<&5Q@fnT;I*VotZr%4LSXb7I}jGTWfWmOEvMy{?P>C=5r^_y{H6
zZE)}*J^&p;KsQf_dmckGIVmU2uv03M`&cs7lZt%nhKwKIx}nHQ_kO2?4+OQluZUN1
z>$2Eb>)yI7iIRc~O80{$Y+j8mEA4IgF5HA4
z!h7&Od;mX#U()&%97|Q)L~?Q-^E_0!LO%B-FzbW9peHBiY}e-9a?W73I8RX~u9OW7
zS#wAfNrs;&H^k-m>?8RQrH~lU3b*@NYq>{qH<_fJo>FCl?d}<}I(1r;n6bO>NZL0v
z$+_LNcd3m=Qjt*_3yc|4ja6|*sPmKj4zh|}He9}1no4a4Z}
zIwGFJ
zvb-UqoUN(q9>3)2WnsYZ0QV?^Loh};%Mr?>?!>TI$SZsYS;vwR3f(ybm5KyW8u$*v
zzTaVI02Tc0oEsk;Ea!(UYuM`ETbk9RR48;o(=NnMjwD7Ril`cghOFrS7I4oUGt1%O
z?pJbAyKmH(*oH~2ee3K(7Aw?Nal|LEz^nqPe3aW
z#j!6cuyz{l_4a1%%Jgcp(VnJ?>oet753B?=86R78$<=6cS+DMj!yM61ui|`}0@ZdI
z(&BYpny4Z`h1RSzTWhs=b|xL4i$CTJA%*Eob~>BRknq#jfX8&HV0&_%xL9j#uQwa<
z%nTKc&uWuDhR53HYXe^GQN@7*iYTE>=S?+Mnwy)ol{PJEtkr<
+
+
diff --git a/app/assets/fonts/work-icons/work-icons.ttf b/app/assets/fonts/work-icons/work-icons.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..b1e405250191fbbe404dbc49c4f872f488880efe
GIT binary patch
literal 2828
zcmc&$U1(cJ7Cz_x-#d=&Yu$TgIkqJ0)>dNGw*J+1>PG#Ex`Ykw{@Ap{G*%tiacoIO
zmeZELsL(u=^r4|BT?k7}p@rg?(w4R_3kyqOmxk^>Y~Gf|u+S3n(uZ}SEyz7{ubg$Z
zC6K2bG@5h1Idgtz<_;hL9Dx>y@N}v4yE9wXm;VGXz9Dq@$tO;gAP)-heerUbERF-;WgVqlcZ&k}LZondZO7jm9
zAFY+EmCw%Zeom$q2>bU&eY1HiJa(Pz7is=7@Ytvazu3QVuJ7SJU;+UE|5&?5G5vQG
zz{53vpb1*zAyd9Q{c}x+o8%!nd;!>p3}u%6b3^{yn~YOHaK`2Z-EX02m%DS=MgmH<8s^#I)yyBj|Edb
zs>oL_%lP@#%ZjXYZnj!@OHeyIig*Dx&WW{^&ee00C@DCnblzUT`dO-pcLwk_<;8;I
zZ~{)k<8TIk4QF8qR$vXb;3aqkuE3k{7F>t7;eGgs>{D_qRdHkS@mb9BRAqA6%+G;o
zAM^!1IXPpyHt&{m0@L|f$}(|SGq#}0m1Y^Qk9!xJ{z2PmKJ>?9H-
zY};+SeHf?O8N7OUlWHe|O1FpuVTi*N6yOw95CX268FPafHSVefuUK(46IWDMwSts;
zs$eEQoHK+AdO#O?{_}jPE@_gQeCP!`9JZY>
zougK()o!&uVQlPJtr|bultl?&b5C3{20CB2G^x4si?KkTap`6$HFHIh)RRlYsY=-K
zm(xASzcV~;9by#kV|+*2R%SGv%eukQ*f=@t(f$#4IAdmIF9z3(C#WQl_T)*-XYvs&
zP9)+G)!7{gg$B$}=o?YFt%#yn6lGaTOo_c>5%H$M
zcS~R>U@$t@{4T&Yn-7`(njd6Eme*vI(-l?S<`+DDSr{tN?O0Mwp*x45LY^Qh1CJo+`yF)pP{BXWxY7RpVs_B72CdGQ3)7mE2n5b(+L`Fl
zq1aGJ5mjT)kQMz~0k_=|vltwFHa;?IhD|e^DkcW!!jYG!AAEGk>>nEHH{X?YWn0k=
zd7DxTJ#el2F+u2qXqOh~JM>7G7O4(@=+Y9&-0IR4ADUfSfj*q2{fUxJNSO5cv_Sfk
zU0Q^B+Oa+^k<4Gav`jntyDqIj7)R(fszDQ0sjou?&ch@uL*2tBAq}uqYpyoeE9WPd
z>$T=20e8(FfTivdJ~rr*t59%h+D1tlXQSsoq$rMAK8r
z=uGr~oFODPnMzNllPMCuw~e0$GEZJMV3R`U;YP_K_ZQ|Xjm_11Et;Al=6-eZkKv()
zhiISVuN-=DpnxJuDARsZjivhfdS$6eMvc{Kd8IP>LcOtOR=3uhtCN@N>swVHVU6-;
zv(oTp`!|=$wHj5WQQ53-HI^#u5^1RWlfEUSmkd3+i0P%yUyS_if>e8r{w0s&nCIh-
N*?0cNnZs|v9|6fXqnZE!
literal 0
HcmV?d00001
diff --git a/app/assets/fonts/work-icons/work-icons.woff b/app/assets/fonts/work-icons/work-icons.woff
new file mode 100644
index 0000000000000000000000000000000000000000..d7b205648dc25c9591856765d415f14e15b2ddd5
GIT binary patch
literal 1988
zcmZXUeK^zWAIHCA#$p*N=Aeb9q|C!nI7RZXJPwmYY!OrDaUM=o=%|#4ShMC~%DR-2
zhazVfG7iQf5|c^tT*R@8+WG3&f4}>>Ue|rU-=EL@x$pbBuj>=L41iTY7{Jws!WQ*8yrx
z5Hw&4K;1kIjX`f3)OH|5yrzG5AcYhO05B}5ZNa*ZazdCN`7|jA^r)b>3&afmF9l8p
zP0(Y4S`9=OYA7X5rce_=uLji08$eBfJrq*HM!k)5VLy?@1K}jfX;2D4JprCEQRgda
zi;Rc?>&tHJMS`FKX#kSIjLkh6w#92pa>#H&!5vC9x|^c=X1)f=n5XfsKFzYTc^8m=
zDETrJVOpBAcVXX5Pq;73gB%|c+`CSDT1uRYt4&cx2C5|W;gg{0hVL#Jt~QhP8Fc!J
zE9cIuzyHQ7zk041^YQtVrI;y<+1&dzNuzh!*E4D-TVbVuEI})I4~wIdG}~j=8fX>~
zAq`?qFZn&IQcL~(I8Zwwc!o%JVYx#WKl}U3MOjhcQNlr_cr9j!>n8ZEkpqONelF>8
zUSjr0ujc#A=VcV9l2<2Z)*a$a41
zF=0@}Y7El;{ng0r;K-7=73WvInC2)>=UGnARDuZMS`PJWKl$!Qxg}n5;`>-*n85PG
zIc7g9>E}g+lX{2xU>mTSgs2|uzM;$a_
zu|!@G3L|U;Ewdx@Ab$1b=tVfA%$KNBg-NBnp`~yF`9pm!2!d_C#{j{_J9a?eY#YB0
z^KY=$nG96>V|(_6l;{Seu5s7kQy(<~OR0pQQ$F9iW`}F>nUa!-wZo-ROWYowZ0OQ5U-)WqYBzM*DyXk80HK72q{$|2aXgTDUa<_j-|{
zyrAT!Sd^ZYxL!HF$9wWY>#j>B1>G*W&(oF5Fi(w0-l8~9Cp0eZ)?7lW8`K|3YYe#q6
z9{D7aCk#uc!WgXTDZUSpKgP&S7`m?v-7gkGFFNLma-F(=giE;vIdVTSRMaUj6iLE
zhG+7P2_X>Rp}A))1AaMix_LA&qLo?{QFh#~p1oxPZg=#>_0HeTzjRzDRq`
zMC^Wf1NnggQ>>mTsDn
z`D&>jsN&p;MgCK{OS6mKr@_xRtx_+sSU^@W4uyueJW}@(bU7uzQTR@Va4(h`af7Gg
zdfJyqMmB3SxM&YNm{;5`7JEOa+Htokzvf%bvc=iJhb)VS$BN=!U7T59G=5e){R&YktmWr1&1Mtr-)D+GjuRySq*?@
z0Onwm+lU9BA~Lz$PHyvbE1k#XiZ+)v8RLv=uvo0olW1cupd+m;hl_C`MG|pAxWJ@E
z3FMNNN{%|#7b1s(2%O+If7KxpgOiCUm^};`3HhwnoU{#wK=WbuP$+tGd5uKUtgn1{
zMIwX$*P7eGOBM+>VU3NdpH#gZ-c|(xW}nC&{&iR2op9T&{-t%Z090MRnzhJr)zmDA
zkq$BFfv|wpLfODyd8YuWgIM?}6XRkj3?L%_%%#A4YyfQi$sPc{A@E>J-*{(U*5NbY
zXV?`fx8v32Myaoh&u3>NX0!z#89HB}QK>tIL($Xg%V_Q@qMd+
z03Bk_Z<#e3@|>l=n5q-IvzRwb{ydZsBCNNZV5TL~`cLoopxyRO*XzvUd7kkHgKuwy
z2$w^d)l^01v|6Z_tok!(+=}X6d~?}vBTIs?*2kZC=y7kcgOE;NO=(Ew45#sy%Dp63
zpBH@6oeFZ4?cA<;t+ThU-l(`X{rX2Q*5eqf+-9p&e#Lj(-q&3B{W)E8ZKj5?CK@A+
c%cqqpde)^}^j*^a_m|eN3`XxBKm1E;@&Et;
literal 0
HcmV?d00001
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 212ff1b45..b926ea5a8 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -24,8 +24,10 @@
//= require bootstrap-select
//= require openseadragon
-// = require curation_concerns/application
+//= require geo_concerns
+//= require curation_concerns/application
//= require_tree .
+//= require geo_concerns/es6-modules
//= require modernizr
//= require jquery.iiifOsdViewer
diff --git a/app/assets/javascripts/geo_concerns.js b/app/assets/javascripts/geo_concerns.js
new file mode 100644
index 000000000..d63a414a1
--- /dev/null
+++ b/app/assets/javascripts/geo_concerns.js
@@ -0,0 +1 @@
+//= require geo_concerns/application
diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss
index 3a5283340..81148ce43 100644
--- a/app/assets/stylesheets/application.css.scss
+++ b/app/assets/stylesheets/application.css.scss
@@ -16,6 +16,7 @@
*= require jquery-ui/datepicker
*= require jquery-ui/slider
*= require jqueryui-timepicker-addon
+ *= require geo_concerns/application
*= require_self
*/
@@ -36,6 +37,7 @@
@import 'base/typography';
+@import 'components/bounding_box';
@import 'components/breadcrumb';
@import 'components/datepicker';
@import 'components/fileupload';
diff --git a/app/assets/stylesheets/components/bounding_box.scss b/app/assets/stylesheets/components/bounding_box.scss
new file mode 100644
index 000000000..66b4e1256
--- /dev/null
+++ b/app/assets/stylesheets/components/bounding_box.scss
@@ -0,0 +1,5 @@
+.bbox-inputs {
+ span.input-group-addon {
+ color: $black;
+ }
+}
diff --git a/app/assets/stylesheets/components/font-face.scss b/app/assets/stylesheets/components/font-face.scss
index 38d708fb1..7640e7b13 100644
--- a/app/assets/stylesheets/components/font-face.scss
+++ b/app/assets/stylesheets/components/font-face.scss
@@ -18,4 +18,47 @@
font-url('Droid_Serif/droidserif-webfont.woff') format('woff'), /* Pretty Modern Browsers */
font-url('Droid_Serif/droidserif-webfont.ttf') format('truetype'), /* Safari, Android, iOS */
font-url('Droid_Serif/droidserif-webfont.svg#svgFontName') format('svg'); /* Legacy iOS */
-}
\ No newline at end of file
+}
+
+@font-face {
+ font-family: 'work-icons';
+ src: font-url('work-icons/work-icons.eot');
+ src: font-url('work-icons/work-icons.eot?#iefix') format('embedded-opentype'),
+ font-url('work-icons/work-icons.woff') format('woff'),
+ font-url('work-icons/work-icons.ttf') format('truetype'),
+ font-url('work-icons/work-icons.svg#work-icons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: 'work-icons' !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-collection:before {
+ content: "\61";
+}
+.icon-image-work:before {
+ content: "\62";
+}
+.icon-multi-volume-work:before {
+ content: "\63";
+}
+.icon-raster-work:before {
+ content: "\64";
+}
+.icon-scanned-resource:before {
+ content: "\65";
+}
+.icon-vector-work:before {
+ content: "\66";
+}
diff --git a/app/assets/stylesheets/components/welcome_page.scss b/app/assets/stylesheets/components/welcome_page.scss
index 1632543de..af8022d07 100644
--- a/app/assets/stylesheets/components/welcome_page.scss
+++ b/app/assets/stylesheets/components/welcome_page.scss
@@ -1,12 +1,31 @@
-.row > .classify-work {
+.classify-work {
+ padding-left: 0px;
& > .work-type {
min-height: 190px;
float: left;
display: block;
}
- & > .work-type-Collection {
+ & > .work-type {
.short-description {
height: 6.1em;
}
+ .work-icon {
+ font-size: 50px;
+ color: $blue;
+ padding: 15px 0 15px 0;
+ }
+ }
+ .title {
+ margin-top: 5px;
+ }
+}
+
+.panel-classify-work {
+ @include panel-variant(none, $gray-light, $light-gray, $panel-default-border);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ & > .panel-heading {
+ border-style: solid;
+ border-width: 1px;
}
}
diff --git a/app/assets/stylesheets/geo_concerns.scss b/app/assets/stylesheets/geo_concerns.scss
new file mode 100644
index 000000000..3f22fa4cb
--- /dev/null
+++ b/app/assets/stylesheets/geo_concerns.scss
@@ -0,0 +1,3 @@
+/*
+ *= require geo_concerns/application
+*/
diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb
index ef0142ede..1c3f759b7 100644
--- a/app/controllers/catalog_controller.rb
+++ b/app/controllers/catalog_controller.rb
@@ -22,8 +22,8 @@ def self.search_config
config.index.title_field = solr_name('title', :stored_searchable)
config.index.display_type_field = solr_name('has_model', :symbol)
- # config.index.thumbnail_field = 'thumbnail_path_ss'
- config.index.thumbnail_method = :iiif_thumbnail_path
+ config.index.thumbnail_field = 'thumbnail_path_ss'
+ config.index.thumbnail_method = :plum_thumbnail_path
# config.index.partials.delete(:thumbnail) # we render this inside _index_default.html.erb
config.index.partials += [:action_menu]
@@ -51,7 +51,7 @@ def self.search_config
# The ordering of the field names is the order of the display
config.add_index_field solr_name('description', :stored_searchable)
config.add_index_field solr_name('tag', :stored_searchable)
- config.add_index_field solr_name('subject', :stored_searchable)
+ config.add_index_field solr_name('subject', :stored_searchable), helper_method: :index_subject
config.add_index_field solr_name('creator', :stored_searchable)
config.add_index_field solr_name('contributor', :stored_searchable)
config.add_index_field solr_name('publisher', :stored_searchable)
diff --git a/app/controllers/concerns/curation_concerns/flagging.rb b/app/controllers/concerns/curation_concerns/flagging.rb
new file mode 100644
index 000000000..1c3fed32e
--- /dev/null
+++ b/app/controllers/concerns/curation_concerns/flagging.rb
@@ -0,0 +1,24 @@
+module CurationConcerns
+ module Flagging
+ extend ActiveSupport::Concern
+
+ included do
+ def flag
+ curation_concern.state = 'flagged'
+ note = params[curation_concern.class.name.underscore][:workflow_note]
+ curation_concern.workflow_note = curation_concern.workflow_note + [note] unless note.blank?
+ if curation_concern.save
+ respond_to do |format|
+ format.html { redirect_to [main_app, curation_concern], notice: "Resource updated" }
+ format.json { render json: { state: state } }
+ end
+ else
+ respond_to do |format|
+ format.html { redirect_to [main_app, curation_concern], alert: "Unable to update resource" }
+ format.json { render json: { error: "Unable to update resource" } }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/controllers/concerns/curation_concerns/geo_messenger_behavior.rb b/app/controllers/concerns/curation_concerns/geo_messenger_behavior.rb
new file mode 100644
index 000000000..79f0e7cb9
--- /dev/null
+++ b/app/controllers/concerns/curation_concerns/geo_messenger_behavior.rb
@@ -0,0 +1,25 @@
+module CurationConcerns
+ module GeoMessengerBehavior
+ extend ActiveSupport::Concern
+
+ def destroy
+ geo_concerns_messenger.record_deleted(geo_concern)
+ super
+ end
+
+ def after_update_response
+ super
+ return unless geo_concern.state == 'complete'
+ geo_concerns_messenger.record_updated(geo_concern)
+ end
+
+ def geo_concerns_messenger
+ @geo_concerns_messenger ||= GeoConcerns::Messaging.messenger
+ end
+
+ def geo_concern
+ doc = SolrDocument.new(curation_concern.to_solr)
+ show_presenter.new(doc, current_ability, request)
+ end
+ end
+end
diff --git a/app/controllers/curation_concerns/curation_concerns_controller.rb b/app/controllers/curation_concerns/curation_concerns_controller.rb
index 63df614f0..5a58dec29 100644
--- a/app/controllers/curation_concerns/curation_concerns_controller.rb
+++ b/app/controllers/curation_concerns/curation_concerns_controller.rb
@@ -4,6 +4,7 @@ class CurationConcerns::CurationConcernsController < ApplicationController
include CurationConcerns::MemberManagement
include CurationConcerns::UpdateOCR
include CurationConcerns::RemoteMetadata
+ include CurationConcerns::Flagging
def curation_concern_name
curation_concern.class.name.underscore
@@ -24,23 +25,6 @@ def file_manager
super
end
- def flag
- curation_concern.state = 'flagged'
- note = params[curation_concern_name][:workflow_note]
- curation_concern.workflow_note = curation_concern.workflow_note + [note] unless note.blank?
- if curation_concern.save
- respond_to do |format|
- format.html { redirect_to [main_app, curation_concern], notice: "Resource updated" }
- format.json { render json: { state: state } }
- end
- else
- respond_to do |format|
- format.html { redirect_to [main_app, curation_concern], alert: "Unable to update resource" }
- format.json { render json: { error: "Unable to update resource" } }
- end
- end
- end
-
def browse_everything_files
upload_set_id = ActiveFedora::Noid::Service.new.mint
CompositePendingUpload.create(selected_files_params, curation_concern.id, upload_set_id)
diff --git a/app/controllers/curation_concerns/file_sets_controller.rb b/app/controllers/curation_concerns/file_sets_controller.rb
index 9042041ff..db7f64381 100644
--- a/app/controllers/curation_concerns/file_sets_controller.rb
+++ b/app/controllers/curation_concerns/file_sets_controller.rb
@@ -1,6 +1,7 @@
module CurationConcerns
class FileSetsController < ApplicationController
include CurationConcerns::FileSetsControllerBehavior
+ include GeoConcerns::FileSetsControllerBehavior
def show_presenter
::FileSetPresenter
diff --git a/app/controllers/curation_concerns/image_works_controller.rb b/app/controllers/curation_concerns/image_works_controller.rb
new file mode 100644
index 000000000..cdeebf015
--- /dev/null
+++ b/app/controllers/curation_concerns/image_works_controller.rb
@@ -0,0 +1,12 @@
+class CurationConcerns::ImageWorksController < ApplicationController
+ include CurationConcerns::CurationConcernController
+ include GeoConcerns::ImageWorksControllerBehavior
+ include GeoConcerns::GeoblacklightControllerBehavior
+ include CurationConcerns::GeoMessengerBehavior
+ include CurationConcerns::Flagging
+ self.curation_concern_type = ImageWork
+
+ def show_presenter
+ ImageWorkShowPresenter
+ end
+end
diff --git a/app/controllers/curation_concerns/raster_works_controller.rb b/app/controllers/curation_concerns/raster_works_controller.rb
new file mode 100644
index 000000000..9caf71b47
--- /dev/null
+++ b/app/controllers/curation_concerns/raster_works_controller.rb
@@ -0,0 +1,13 @@
+class CurationConcerns::RasterWorksController < ApplicationController
+ include CurationConcerns::CurationConcernController
+ include CurationConcerns::ParentContainer
+ include GeoConcerns::RasterWorksControllerBehavior
+ include GeoConcerns::GeoblacklightControllerBehavior
+ include CurationConcerns::GeoMessengerBehavior
+ include CurationConcerns::Flagging
+ self.curation_concern_type = RasterWork
+
+ def show_presenter
+ RasterWorkShowPresenter
+ end
+end
diff --git a/app/controllers/curation_concerns/vector_works_controller.rb b/app/controllers/curation_concerns/vector_works_controller.rb
new file mode 100644
index 000000000..6c4d985ec
--- /dev/null
+++ b/app/controllers/curation_concerns/vector_works_controller.rb
@@ -0,0 +1,13 @@
+class CurationConcerns::VectorWorksController < ApplicationController
+ include CurationConcerns::CurationConcernController
+ include CurationConcerns::ParentContainer
+ include GeoConcerns::VectorWorksControllerBehavior
+ include GeoConcerns::GeoblacklightControllerBehavior
+ include CurationConcerns::GeoMessengerBehavior
+ include CurationConcerns::Flagging
+ self.curation_concern_type = VectorWork
+
+ def show_presenter
+ VectorWorkShowPresenter
+ end
+end
diff --git a/app/forms/curation_concerns/image_work_form.rb b/app/forms/curation_concerns/image_work_form.rb
new file mode 100644
index 000000000..98ff0575a
--- /dev/null
+++ b/app/forms/curation_concerns/image_work_form.rb
@@ -0,0 +1,7 @@
+module CurationConcerns
+ class ImageWorkForm < ::CurationConcerns::CurationConcernsForm
+ include ::GeoConcerns::BasicGeoMetadataForm
+ include ::GeoConcerns::ExternalMetadataFileForm
+ self.model_class = ::ImageWork
+ end
+end
diff --git a/app/forms/curation_concerns/raster_work_form.rb b/app/forms/curation_concerns/raster_work_form.rb
new file mode 100644
index 000000000..44ac83646
--- /dev/null
+++ b/app/forms/curation_concerns/raster_work_form.rb
@@ -0,0 +1,8 @@
+module CurationConcerns
+ class RasterWorkForm < ::CurationConcerns::CurationConcernsForm
+ include ::GeoConcerns::BasicGeoMetadataForm
+ include ::GeoConcerns::ExternalMetadataFileForm
+ include ::GeoConcerns::GeoreferencedForm
+ self.model_class = ::RasterWork
+ end
+end
diff --git a/app/forms/curation_concerns/vector_work_form.rb b/app/forms/curation_concerns/vector_work_form.rb
new file mode 100644
index 000000000..8eca3354a
--- /dev/null
+++ b/app/forms/curation_concerns/vector_work_form.rb
@@ -0,0 +1,8 @@
+module CurationConcerns
+ class VectorWorkForm < ::CurationConcerns::CurationConcernsForm
+ include ::GeoConcerns::BasicGeoMetadataForm
+ include ::GeoConcerns::ExternalMetadataFileForm
+ include ::GeoConcerns::GeoreferencedForm
+ self.model_class = ::VectorWork
+ end
+end
diff --git a/app/helpers/geo_concerns_helper.rb b/app/helpers/geo_concerns_helper.rb
new file mode 100644
index 000000000..6036ee06d
--- /dev/null
+++ b/app/helpers/geo_concerns_helper.rb
@@ -0,0 +1,6 @@
+module GeoConcernsHelper
+ def geo_concerns_thumbnail_path(document, image_options = {})
+ url = thumbnail_url(document)
+ image_tag url, image_options if url.present?
+ end
+end
diff --git a/app/helpers/index_view_helper.rb b/app/helpers/index_view_helper.rb
new file mode 100644
index 000000000..598fe7a1b
--- /dev/null
+++ b/app/helpers/index_view_helper.rb
@@ -0,0 +1,7 @@
+module IndexViewHelper
+ # Limit the number of subjects displayed on index page.
+ # Mainly because of geo works.
+ def index_subject(args)
+ args[:document].subject.take(7).join("
")
+ end
+end
diff --git a/app/helpers/thumbnail_helper.rb b/app/helpers/thumbnail_helper.rb
new file mode 100644
index 000000000..d0ec848d5
--- /dev/null
+++ b/app/helpers/thumbnail_helper.rb
@@ -0,0 +1,29 @@
+module ThumbnailHelper
+ # Generates a thumbnail path for the various work and fileset types.
+ # @param document [SolrDocument, ShowPresenter] an object's solr document or show presenter
+ # @param image_options [Hash]
+ # @return [String] thumbnail tag
+ def plum_thumbnail_path(document, image_options = {})
+ value = send(plum_thumbnail_method(document), document, image_options)
+ link_to_document document, value if value
+ end
+
+ # Gets the correct thumbnail path generation method
+ # for work or fileset type.
+ # @param document [SolrDocument, ShowPresenter] an object's solr document or show presenter
+ # @return [Symbol]
+ def plum_thumbnail_method(document)
+ document = document.solr_document if document.respond_to?(:solr_document)
+ class_name = document.to_model.class_name
+
+ if document['geo_mime_type_tesim']
+ # geo fileset
+ :geo_concerns_thumbnail_path
+ elsif ["ImageWork", "RasterWork", "VectorWork"].include?(class_name)
+ # geo work
+ :geo_concerns_thumbnail_path
+ else
+ :iiif_thumbnail_path
+ end
+ end
+end
diff --git a/app/indexers/file_set_indexer.rb b/app/indexers/file_set_indexer.rb
new file mode 100644
index 000000000..2f5bef6ae
--- /dev/null
+++ b/app/indexers/file_set_indexer.rb
@@ -0,0 +1,3 @@
+class FileSetIndexer < CurationConcerns::FileSetIndexer
+ self.thumbnail_path_service = ThumbnailPathService
+end
diff --git a/app/indexers/geo_work_indexer.rb b/app/indexers/geo_work_indexer.rb
new file mode 100644
index 000000000..77253c979
--- /dev/null
+++ b/app/indexers/geo_work_indexer.rb
@@ -0,0 +1,3 @@
+class GeoWorkIndexer < CurationConcerns::WorkIndexer
+ self.thumbnail_path_service = ThumbnailPathService
+end
diff --git a/app/jobs/ingest_file_job.rb b/app/jobs/ingest_file_job.rb
index 3e776f778..315374d05 100644
--- a/app/jobs/ingest_file_job.rb
+++ b/app/jobs/ingest_file_job.rb
@@ -20,6 +20,7 @@ def perform(file_set, filepath, _user, opts = {})
# Persist changes to the file_set
file_set.save!
file_set.in_works.each do |work|
+ next unless work.respond_to? :pending_uploads
work.pending_uploads.where(file_name: local_file.original_name).destroy_all
end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index 6b355ae5e..a6d95560f 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -1,6 +1,7 @@
class Ability
include Hydra::Ability
include CurationConcerns::Ability
+ include GeoConcerns::Ability
# Define any customized permissions here.
def custom_permissions
diff --git a/app/models/concerns/common_metadata.rb b/app/models/concerns/common_metadata.rb
index 8f80192d8..3b57c0a06 100644
--- a/app/models/concerns/common_metadata.rb
+++ b/app/models/concerns/common_metadata.rb
@@ -6,8 +6,6 @@ module CommonMetadata
extend ActiveSupport::Concern
included do
- before_update :check_state
-
# Plum
apply_schema PlumSchema, ActiveFedora::SchemaIndexingStrategy.new(
ActiveFedora::Indexers::GlobalIndexer.new([:symbol, :stored_searchable, :facetable])
@@ -20,7 +18,6 @@ module CommonMetadata
validate :source_metadata_identifier_or_title
validates_with RightsStatementValidator
- validates_with StateValidator
validates_with ViewingDirectionValidator
validates_with ViewingHintValidator
@@ -32,12 +29,6 @@ def apply_remote_metadata
update_ezid if state == 'complete' && identifier
end
- def check_state
- return unless state_changed?
- complete_record if state == 'complete'
- ReviewerMailer.notify(id, state).deliver_later
- end
-
private
def remote_data
@@ -58,27 +49,5 @@ def source_metadata_identifier_or_title
errors.add(:title, "You must provide a source metadata id or a title")
errors.add(:source_metadata_identifier, "You must provide a source metadata id or a title")
end
-
- def complete_record
- if identifier
- update_ezid
- else
- self.identifier = Ezid::Identifier.mint(ezid_metadata).id
- end
- end
-
- def ezid_metadata
- {
- dc_publisher: 'Princeton University Library',
- dc_title: title.join('; '),
- dc_type: 'Text',
- target: ManifestBuilder::ManifestHelper.new.polymorphic_url(self)
- }
- end
-
- def update_ezid
- return if Ezid::Client.config.user == "apitest"
- Ezid::Identifier.modify(identifier, ezid_metadata)
- end
end
end
diff --git a/app/models/concerns/geo_metadata.rb b/app/models/concerns/geo_metadata.rb
new file mode 100644
index 000000000..f2df53ee9
--- /dev/null
+++ b/app/models/concerns/geo_metadata.rb
@@ -0,0 +1,15 @@
+require 'vocab/f3_access'
+require 'vocab/opaque_mods'
+require 'vocab/pul_terms'
+
+module GeoMetadata
+ extend ActiveSupport::Concern
+
+ included do
+ apply_schema GeoSchema, ActiveFedora::SchemaIndexingStrategy.new(
+ ActiveFedora::Indexers::GlobalIndexer.new([:symbol, :stored_searchable, :facetable])
+ )
+
+ validates_with RightsStatementValidator
+ end
+end
diff --git a/app/models/concerns/state_behavior.rb b/app/models/concerns/state_behavior.rb
new file mode 100644
index 000000000..55893ffca
--- /dev/null
+++ b/app/models/concerns/state_behavior.rb
@@ -0,0 +1,39 @@
+module StateBehavior
+ extend ActiveSupport::Concern
+
+ included do
+ before_update :check_state
+
+ validates_with StateValidator
+
+ def check_state
+ return unless state_changed?
+ complete_record if state == 'complete'
+ ReviewerMailer.notify(id, state).deliver_later
+ end
+
+ private
+
+ def complete_record
+ if identifier
+ update_ezid
+ else
+ self.identifier = Ezid::Identifier.mint(ezid_metadata).id
+ end
+ end
+
+ def ezid_metadata
+ {
+ dc_publisher: 'Princeton University Library',
+ dc_title: title.join('; '),
+ dc_type: 'Text',
+ target: ManifestBuilder::ManifestHelper.new.polymorphic_url(self)
+ }
+ end
+
+ def update_ezid
+ return if Ezid::Client.config.user == "apitest"
+ Ezid::Identifier.modify(identifier, ezid_metadata)
+ end
+ end
+end
diff --git a/app/models/file_set.rb b/app/models/file_set.rb
index 977e18bce..555c68b8a 100644
--- a/app/models/file_set.rb
+++ b/app/models/file_set.rb
@@ -1,6 +1,8 @@
# Generated by curation_concerns:models:install
class FileSet < ActiveFedora::Base
include ::CurationConcerns::FileSetBehavior
+ include ::GeoConcerns::GeoFileSetBehavior
+
Hydra::Derivatives.output_file_service = PersistPairtreeDerivatives
characterization_terms << [:color_space, :profile_name, :valid]
@@ -17,6 +19,9 @@ class FileSet < ActiveFedora::Base
validates_with ViewingHintValidator
+ # Use local indexer
+ self.indexer = FileSetIndexer
+
def self.image_mime_types
[]
end
@@ -84,10 +89,27 @@ def ocr_text
ocr_document.try(:text).try(:strip)
end
+ # Override the geo_concerns path factory
+ def derivative_path_factory
+ PairtreeDerivativePath
+ end
+
+ # Remove files as well as shapefile directories
+ def cleanup_derivatives
+ derivative_path_factory.derivatives_for_reference(self).each do |path|
+ FileUtils.rm_rf(path)
+ end
+ end
+
# The destination_name parameter has to match up with the file parameter
# passed to the DownloadsController
def derivative_url(destination_name)
path = PairtreeDerivativePath.derivative_path_for_reference(self, destination_name)
URI("file://#{path}").to_s
end
+
+ # Override GeoConcerns method because files are no longer stored in Fedora
+ def metadata_xml
+ Nokogiri::XML(File.open(local_file))
+ end
end
diff --git a/app/models/image_work.rb b/app/models/image_work.rb
new file mode 100644
index 000000000..5ed664bff
--- /dev/null
+++ b/app/models/image_work.rb
@@ -0,0 +1,12 @@
+class ImageWork < ActiveFedora::Base
+ include ::CurationConcerns::WorkBehavior
+ include ::GeoConcerns::ImageWorkBehavior
+ include ::CurationConcerns::BasicMetadata
+ include ::GeoConcerns::BasicGeoMetadata
+ include ::GeoMetadata
+ include ::StateBehavior
+ self.valid_child_concerns = [RasterWork]
+
+ # Use local indexer
+ self.indexer = GeoWorkIndexer
+end
diff --git a/app/models/multi_volume_work.rb b/app/models/multi_volume_work.rb
index 40988d7e5..9aafebc05 100644
--- a/app/models/multi_volume_work.rb
+++ b/app/models/multi_volume_work.rb
@@ -3,6 +3,7 @@ class MultiVolumeWork < ActiveFedora::Base
include ::CurationConcerns::WorkBehavior
include ::CurationConcerns::BasicMetadata
include ::CommonMetadata
+ include ::StateBehavior
include ::StructuralMetadata
include ::HasPendingUploads
include ::CollectionIndexing
diff --git a/app/models/raster_work.rb b/app/models/raster_work.rb
new file mode 100644
index 000000000..464008ac7
--- /dev/null
+++ b/app/models/raster_work.rb
@@ -0,0 +1,13 @@
+class RasterWork < ActiveFedora::Base
+ include ::CurationConcerns::WorkBehavior
+ include ::GeoConcerns::RasterWorkBehavior
+ include ::CurationConcerns::BasicMetadata
+ include ::GeoConcerns::BasicGeoMetadata
+ include ::GeoConcerns::GeoreferencedBehavior
+ include ::GeoMetadata
+ include ::StateBehavior
+ self.valid_child_concerns = [VectorWork]
+
+ # Use local indexer
+ self.indexer = GeoWorkIndexer
+end
diff --git a/app/models/scanned_resource.rb b/app/models/scanned_resource.rb
index 0b361dfa4..227eb3600 100644
--- a/app/models/scanned_resource.rb
+++ b/app/models/scanned_resource.rb
@@ -4,6 +4,7 @@ class ScannedResource < ActiveFedora::Base
include ::CurationConcerns::WorkBehavior
include ::CurationConcerns::BasicMetadata
include ::CommonMetadata
+ include ::StateBehavior
include ::StructuralMetadata
include ::HasPendingUploads
include ::CollectionIndexing
diff --git a/app/models/solr_document.rb b/app/models/solr_document.rb
index 8c54a6618..a0de84265 100644
--- a/app/models/solr_document.rb
+++ b/app/models/solr_document.rb
@@ -1,6 +1,9 @@
# -*- encoding : utf-8 -*-
class SolrDocument
include Blacklight::Solr::Document
+ # Adds GeoConcerns behaviors to the SolrDocument.
+ include GeoConcerns::SolrDocumentBehavior
+
# Adds CurationConcerns behaviors to the SolrDocument.
include CurationConcerns::SolrDocumentBehavior
include SolrDates
diff --git a/app/models/vector_work.rb b/app/models/vector_work.rb
new file mode 100644
index 000000000..a57385410
--- /dev/null
+++ b/app/models/vector_work.rb
@@ -0,0 +1,13 @@
+class VectorWork < ActiveFedora::Base
+ include ::CurationConcerns::WorkBehavior
+ include ::GeoConcerns::VectorWorkBehavior
+ include ::CurationConcerns::BasicMetadata
+ include ::GeoConcerns::BasicGeoMetadata
+ include ::GeoConcerns::GeoreferencedBehavior
+ include ::GeoMetadata
+ include ::StateBehavior
+ self.valid_child_concerns = []
+
+ # Use local indexer
+ self.indexer = GeoWorkIndexer
+end
diff --git a/app/presenters/curation_concerns_show_presenter.rb b/app/presenters/curation_concerns_show_presenter.rb
index 7358ae1e2..ba8a3435d 100644
--- a/app/presenters/curation_concerns_show_presenter.rb
+++ b/app/presenters/curation_concerns_show_presenter.rb
@@ -1,42 +1,13 @@
class CurationConcernsShowPresenter < CurationConcerns::WorkShowPresenter
- delegate :viewing_hint, :viewing_direction, :state, :type, :identifier, :workflow_note, :logical_order, :logical_order_object, :ocr_language, :thumbnail_id, :source_metadata_identifier, :collection, to: :solr_document
- delegate :flaggable?, to: :state_badge_instance
+ delegate :viewing_hint, :viewing_direction, :logical_order, :logical_order_object, :ocr_language, to: :solr_document
delegate(*ScannedResource.properties.values.map(&:term), to: :solr_document, allow_nil: true)
delegate(*ScannedResource.properties.values.map { |x| "#{x.term}_literals" }, to: :solr_document, allow_nil: true)
- def state_badge
- state_badge_instance.render
- end
-
def logical_order_object
@logical_order_object ||=
logical_order_factory.new(logical_order, nil, logical_order_factory)
end
- def pending_uploads
- @pending_uploads ||= PendingUpload.where(curation_concern_id: id)
- end
-
- def rights_statement
- RightsStatementRenderer.new(solr_document.rights_statement, solr_document.rights_note).render
- end
-
- def holding_location
- HoldingLocationRenderer.new(solr_document.holding_location).render
- end
-
- def language
- Array.wrap(solr_document.language).map { |code| LanguageService.label(code) }
- end
-
- def date_created
- DateValue.new(solr_document.date_created).to_a
- end
-
- def page_title
- Array.wrap(title).first
- end
-
def start_canvas
Array.wrap(solr_document.start_canvas).first
end
@@ -64,16 +35,4 @@ def ordered_docs
def logical_order_factory
@logical_order_factory ||= WithProxyForObject::Factory.new(member_presenters)
end
-
- def state_badge_instance
- StateBadge.new(type, state)
- end
-
- def renderer_for(_field, options)
- if options[:render_as]
- find_renderer_class(options[:render_as])
- else
- ::AttributeRenderer
- end
- end
end
diff --git a/app/presenters/image_work_show_presenter.rb b/app/presenters/image_work_show_presenter.rb
new file mode 100644
index 000000000..c1a847627
--- /dev/null
+++ b/app/presenters/image_work_show_presenter.rb
@@ -0,0 +1,6 @@
+class ImageWorkShowPresenter < GeoConcerns::GeoConcernsShowPresenter
+ include PlumAttributes
+
+ self.work_presenter_class = ::RasterWorkShowPresenter
+ self.file_format_service = GeoConcerns::ImageFormatService
+end
diff --git a/app/presenters/multi_volume_work_show_presenter.rb b/app/presenters/multi_volume_work_show_presenter.rb
index c4dc27e00..dd19868c4 100644
--- a/app/presenters/multi_volume_work_show_presenter.rb
+++ b/app/presenters/multi_volume_work_show_presenter.rb
@@ -1,4 +1,6 @@
class MultiVolumeWorkShowPresenter < CurationConcernsShowPresenter
+ include PlumAttributes
+
def viewing_hint
'multi-part'
end
diff --git a/app/presenters/plum_attributes.rb b/app/presenters/plum_attributes.rb
new file mode 100644
index 000000000..042172f74
--- /dev/null
+++ b/app/presenters/plum_attributes.rb
@@ -0,0 +1,46 @@
+module PlumAttributes
+ delegate :state, :type, :identifier, :workflow_note, :thumbnail_id, :source_metadata_identifier, :collection, to: :solr_document
+ delegate :flaggable?, to: :state_badge_instance
+
+ def state_badge
+ state_badge_instance.render
+ end
+
+ def pending_uploads
+ @pending_uploads ||= PendingUpload.where(curation_concern_id: id)
+ end
+
+ def rights_statement
+ RightsStatementRenderer.new(solr_document.rights_statement, solr_document.rights_note).render
+ end
+
+ def holding_location
+ HoldingLocationRenderer.new(solr_document.holding_location).render
+ end
+
+ def language
+ Array.wrap(solr_document.language).map { |code| LanguageService.label(code) }
+ end
+
+ def date_created
+ DateValue.new(solr_document.date_created).to_a
+ end
+
+ def page_title
+ Array.wrap(title).first
+ end
+
+ private
+
+ def state_badge_instance
+ StateBadge.new(type, state)
+ end
+
+ def renderer_for(_field, options)
+ if options[:render_as]
+ find_renderer_class(options[:render_as])
+ else
+ ::AttributeRenderer
+ end
+ end
+end
diff --git a/app/presenters/raster_work_show_presenter.rb b/app/presenters/raster_work_show_presenter.rb
new file mode 100644
index 000000000..12a32bd0f
--- /dev/null
+++ b/app/presenters/raster_work_show_presenter.rb
@@ -0,0 +1,6 @@
+class RasterWorkShowPresenter < GeoConcerns::GeoConcernsShowPresenter
+ include PlumAttributes
+
+ self.work_presenter_class = ::VectorWorkShowPresenter
+ self.file_format_service = GeoConcerns::RasterFormatService
+end
diff --git a/app/presenters/scanned_resource_show_presenter.rb b/app/presenters/scanned_resource_show_presenter.rb
index 2340d8d60..edc989faa 100644
--- a/app/presenters/scanned_resource_show_presenter.rb
+++ b/app/presenters/scanned_resource_show_presenter.rb
@@ -1,4 +1,6 @@
class ScannedResourceShowPresenter < CurationConcernsShowPresenter
+ include PlumAttributes
+
delegate :has?, :first, to: :solr_document
self.file_presenter_class = ::FileSetPresenter
self.work_presenter_class = ::MultiVolumeWorkShowPresenter.work_presenter_class
diff --git a/app/presenters/vector_work_show_presenter.rb b/app/presenters/vector_work_show_presenter.rb
new file mode 100644
index 000000000..3d3ad8e6a
--- /dev/null
+++ b/app/presenters/vector_work_show_presenter.rb
@@ -0,0 +1,5 @@
+class VectorWorkShowPresenter < GeoConcerns::GeoConcernsShowPresenter
+ include PlumAttributes
+
+ self.file_format_service = GeoConcerns::VectorFormatService
+end
diff --git a/app/schemas/geo_schema.rb b/app/schemas/geo_schema.rb
new file mode 100644
index 000000000..1a8f0c4d3
--- /dev/null
+++ b/app/schemas/geo_schema.rb
@@ -0,0 +1,13 @@
+class GeoSchema < ActiveTriples::Schema
+ property :identifier, predicate: ::RDF::Vocab::DC.identifier, multiple: false
+ property :sort_title, predicate: ::OpaqueMods.titleForSort, multiple: false
+ property :replaces, predicate: ::RDF::Vocab::DC.replaces, multiple: false
+ property :rights_statement, predicate: ::RDF::Vocab::EDM.rights, multiple: false
+ property :rights_note, predicate: ::RDF::Vocab::DC11.rights, multiple: false
+ property :source_metadata_identifier, predicate: ::PULTerms.metadata_id, multiple: false
+ property :source_metadata, predicate: ::PULTerms.source_metadata, multiple: false
+ property :state, predicate: ::F3Access.objState, multiple: false
+ property :workflow_note, predicate: ::RDF::Vocab::MODS.note
+ property :holding_location, predicate: ::RDF::Vocab::Bibframe.heldBy, multiple: false
+ property :ocr_language, predicate: ::PULTerms.ocr_language
+end
diff --git a/app/services/geo_concerns/delivery_service.rb b/app/services/geo_concerns/delivery_service.rb
new file mode 100644
index 000000000..343ef2730
--- /dev/null
+++ b/app/services/geo_concerns/delivery_service.rb
@@ -0,0 +1,11 @@
+module GeoConcerns
+ class DeliveryService
+ attr_reader :geoserver
+
+ def initialize(file_set, file_path)
+ @geoserver = ::Geoserver.new(file_set, file_path)
+ end
+
+ delegate :publish, to: :geoserver
+ end
+end
diff --git a/app/services/geo_concerns/discovery/document_builder/slug_builder.rb b/app/services/geo_concerns/discovery/document_builder/slug_builder.rb
new file mode 100644
index 000000000..64446b1de
--- /dev/null
+++ b/app/services/geo_concerns/discovery/document_builder/slug_builder.rb
@@ -0,0 +1,32 @@
+module GeoConcerns
+ module Discovery
+ class DocumentBuilder
+ class SlugBuilder
+ attr_reader :geo_concern
+
+ def initialize(geo_concern)
+ @geo_concern = geo_concern
+ end
+
+ def build(document)
+ document.provenance = provenance
+ document.slug = slug
+ end
+
+ # Overrides the geo_concerns provenance to match
+ # match existing geoblacklight metadata.
+ def provenance
+ Plum.config[:geoblacklight_provenance]
+ end
+
+ # Returns the document slug for use in discovery systems.
+ # @return [String] document slug
+ def slug
+ identifier = geo_concern.identifier || geo_concern.id
+ id = identifier.gsub(%r(ark:/\d{5}/), '')
+ "#{provenance.parameterize}-#{id}"
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/geoserver.rb b/app/services/geoserver.rb
new file mode 100644
index 000000000..a0c5d936f
--- /dev/null
+++ b/app/services/geoserver.rb
@@ -0,0 +1,14 @@
+require 'active_support/core_ext/hash/indifferent_access'
+require 'rgeoserver'
+require 'yaml'
+require 'erb'
+
+class Geoserver < GeoConcerns::Delivery::Geoserver
+ attr_reader :config, :workspace_name, :file_set, :file_path
+
+ private
+
+ def base_path(path)
+ path.gsub(Plum.config[:geo_derivatives_path], '')
+ end
+end
diff --git a/app/services/thumbnail_path_service.rb b/app/services/thumbnail_path_service.rb
new file mode 100644
index 000000000..7d88b942c
--- /dev/null
+++ b/app/services/thumbnail_path_service.rb
@@ -0,0 +1,7 @@
+class ThumbnailPathService < CurationConcerns::ThumbnailPathService
+ class << self
+ def thumbnail_filepath(thumb)
+ PairtreeDerivativePath.derivative_path_for_reference(thumb, 'thumbnail')
+ end
+ end
+end
diff --git a/app/values/pairtree_derivative_path.rb b/app/values/pairtree_derivative_path.rb
index f9538496d..88211848e 100644
--- a/app/values/pairtree_derivative_path.rb
+++ b/app/values/pairtree_derivative_path.rb
@@ -1,4 +1,24 @@
class PairtreeDerivativePath < CurationConcerns::DerivativePath
+ def initialize(object, destination_name = nil)
+ @object = object
+ @id = object.is_a?(String) ? object : object.id
+ @destination_name = destination_name.gsub(/^original_file_/, '') if destination_name
+ end
+
+ def path_prefix
+ geo_path_prefix || derivatives_path_prefix
+ end
+
+ def geo_path_prefix
+ return unless @object.respond_to?(:geo_mime_type)
+ return if @object.geo_mime_type.nil? || @object.geo_mime_type.empty?
+ Pathname.new(Plum.config[:geo_derivatives_path]).join(pair_path)
+ end
+
+ def derivatives_path_prefix
+ Pathname.new(CurationConcerns.config.derivatives_path).join(pair_path)
+ end
+
def file_name
return unless destination_name
if extension == ".pdf"
@@ -9,19 +29,19 @@ def file_name
end
def extension
- case destination_name
- when 'thumbnail'
- ".#{MIME::Types.type_for('jpg').first.extensions.first}"
- when "intermediate_file"
- ".jp2"
- when "ocr"
- ".hocr"
- when "gray-pdf"
- ".pdf"
- when "color-pdf"
- ".pdf"
- else
- ".#{destination_name}"
- end
+ value = extensions[destination_name]
+ value ? value : ".#{destination_name}"
+ end
+
+ def extensions
+ {
+ "thumbnail" => ".#{MIME::Types.type_for('jpg').first.extensions.first}",
+ "intermediate_file" => ".jp2",
+ "ocr" => ".hocr",
+ "gray-pdf" => ".pdf",
+ "color-pdf" => ".pdf",
+ "display_raster" => ".tif",
+ "display_vector" => ".zip"
+ }
end
end
diff --git a/app/views/curation_concerns/image_works/_file_manager_attributes.html.erb b/app/views/curation_concerns/image_works/_file_manager_attributes.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/image_works/_file_manager_extra_tools.html.erb b/app/views/curation_concerns/image_works/_file_manager_extra_tools.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/image_works/_file_manager_member_resource_options.html.erb b/app/views/curation_concerns/image_works/_file_manager_member_resource_options.html.erb
new file mode 100644
index 000000000..86e46213d
--- /dev/null
+++ b/app/views/curation_concerns/image_works/_file_manager_member_resource_options.html.erb
@@ -0,0 +1,10 @@
+
+
+ <%= radio_button_tag "thumbnail_id", node.id, @presenter.thumbnail_id == node.id, id: "thumbnail_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "thumbnail_id_#{node.id}", "Thumbnail" %>
+
+
+ <%= radio_button_tag "representative_id", node.id, @presenter.representative_id == node.id, id: "representative_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "representative_id_#{node.id}", "Representative Media" %>
+
+
diff --git a/app/views/curation_concerns/image_works/_file_manager_resource_form.html.erb b/app/views/curation_concerns/image_works/_file_manager_resource_form.html.erb
new file mode 100644
index 000000000..7abf042a3
--- /dev/null
+++ b/app/views/curation_concerns/image_works/_file_manager_resource_form.html.erb
@@ -0,0 +1,6 @@
+
+ <%= simple_form_for [main_app, @presenter], remote: true, html: { id: 'resource-form', 'data-type': 'json' } do |f| %>
+ <%= f.input :thumbnail_id, as: :hidden, input_html: { data: {member_link: 'thumbnail_id'}} %>
+ <%= f.input :representative_id, as: :hidden, input_html: { data: {member_link: 'representative_id'}} %>
+ <% end %>
+
diff --git a/app/views/curation_concerns/image_works/_file_manager_thumbnail.html.erb b/app/views/curation_concerns/image_works/_file_manager_thumbnail.html.erb
new file mode 100644
index 000000000..6378f5677
--- /dev/null
+++ b/app/views/curation_concerns/image_works/_file_manager_thumbnail.html.erb
@@ -0,0 +1 @@
+<%= render_thumbnail_tag node, class: 'thumbnail-inner' %>
diff --git a/app/views/curation_concerns/image_works/_show_actions.html.erb b/app/views/curation_concerns/image_works/_show_actions.html.erb
new file mode 100644
index 000000000..be0ed580b
--- /dev/null
+++ b/app/views/curation_concerns/image_works/_show_actions.html.erb
@@ -0,0 +1,23 @@
+<% if collector || editor %>
+
+<% end %>
diff --git a/app/views/curation_concerns/image_works/show.html.erb b/app/views/curation_concerns/image_works/show.html.erb
new file mode 100644
index 000000000..4b528debd
--- /dev/null
+++ b/app/views/curation_concerns/image_works/show.html.erb
@@ -0,0 +1,22 @@
+<% provide :page_title, @presenter.page_title %>
+<% provide :page_header do %>
+ <%= @presenter %>
+ <% if @parent_presenter %>
+
+ - <%= link_to @parent_presenter, polymorphic_path([main_app, @parent_presenter]) %>
+ - <%= @presenter.human_readable_type %>
+
+ <% else %>
+ (<%= @presenter.human_readable_type %>)
+ <% end %>
+<% end %>
+
+<% collector = can?(:collect, @presenter.id) %>
+<% editor = can?(:edit, @presenter.id) %>
+
+<%= render 'geo_concerns/representative_media', presenter: @presenter %>
+<%= render 'geo_concerns/attributes', presenter: @presenter %>
+<%= render 'geo_concerns/related', presenter: @presenter %>
+<%= render "show_actions", collector: collector, editor: editor%>
+
+<%= render '/curation_concerns/base/flag', curation_concern: @presenter %>
\ No newline at end of file
diff --git a/app/views/curation_concerns/raster_works/_file_manager_attributes.html.erb b/app/views/curation_concerns/raster_works/_file_manager_attributes.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/raster_works/_file_manager_extra_tools.html.erb b/app/views/curation_concerns/raster_works/_file_manager_extra_tools.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/raster_works/_file_manager_member_resource_options.html.erb b/app/views/curation_concerns/raster_works/_file_manager_member_resource_options.html.erb
new file mode 100644
index 000000000..86e46213d
--- /dev/null
+++ b/app/views/curation_concerns/raster_works/_file_manager_member_resource_options.html.erb
@@ -0,0 +1,10 @@
+
+
+ <%= radio_button_tag "thumbnail_id", node.id, @presenter.thumbnail_id == node.id, id: "thumbnail_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "thumbnail_id_#{node.id}", "Thumbnail" %>
+
+
+ <%= radio_button_tag "representative_id", node.id, @presenter.representative_id == node.id, id: "representative_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "representative_id_#{node.id}", "Representative Media" %>
+
+
diff --git a/app/views/curation_concerns/raster_works/_file_manager_resource_form.html.erb b/app/views/curation_concerns/raster_works/_file_manager_resource_form.html.erb
new file mode 100644
index 000000000..7abf042a3
--- /dev/null
+++ b/app/views/curation_concerns/raster_works/_file_manager_resource_form.html.erb
@@ -0,0 +1,6 @@
+
+ <%= simple_form_for [main_app, @presenter], remote: true, html: { id: 'resource-form', 'data-type': 'json' } do |f| %>
+ <%= f.input :thumbnail_id, as: :hidden, input_html: { data: {member_link: 'thumbnail_id'}} %>
+ <%= f.input :representative_id, as: :hidden, input_html: { data: {member_link: 'representative_id'}} %>
+ <% end %>
+
diff --git a/app/views/curation_concerns/raster_works/_file_manager_thumbnail.html.erb b/app/views/curation_concerns/raster_works/_file_manager_thumbnail.html.erb
new file mode 100644
index 000000000..6378f5677
--- /dev/null
+++ b/app/views/curation_concerns/raster_works/_file_manager_thumbnail.html.erb
@@ -0,0 +1 @@
+<%= render_thumbnail_tag node, class: 'thumbnail-inner' %>
diff --git a/app/views/curation_concerns/raster_works/_show_actions.html.erb b/app/views/curation_concerns/raster_works/_show_actions.html.erb
new file mode 100644
index 000000000..25ec4f964
--- /dev/null
+++ b/app/views/curation_concerns/raster_works/_show_actions.html.erb
@@ -0,0 +1,9 @@
+<% if collector || editor %>
+
+ <% if editor %>
+ <%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]), class: 'btn btn-default' %>
+ <%= render 'raster_actions', document: @presenter %>
+ <%= link_to "Delete This #{@presenter.human_readable_type}", [main_app, @presenter], class: 'btn btn-danger pull-right', data: { confirm: "Delete this #{@presenter.human_readable_type}?" }, method: :delete %>
+ <% end %>
+
+<% end %>
diff --git a/app/views/curation_concerns/raster_works/show.html.erb b/app/views/curation_concerns/raster_works/show.html.erb
new file mode 100644
index 000000000..4b528debd
--- /dev/null
+++ b/app/views/curation_concerns/raster_works/show.html.erb
@@ -0,0 +1,22 @@
+<% provide :page_title, @presenter.page_title %>
+<% provide :page_header do %>
+ <%= @presenter %>
+ <% if @parent_presenter %>
+
+ - <%= link_to @parent_presenter, polymorphic_path([main_app, @parent_presenter]) %>
+ - <%= @presenter.human_readable_type %>
+
+ <% else %>
+ (<%= @presenter.human_readable_type %>)
+ <% end %>
+<% end %>
+
+<% collector = can?(:collect, @presenter.id) %>
+<% editor = can?(:edit, @presenter.id) %>
+
+<%= render 'geo_concerns/representative_media', presenter: @presenter %>
+<%= render 'geo_concerns/attributes', presenter: @presenter %>
+<%= render 'geo_concerns/related', presenter: @presenter %>
+<%= render "show_actions", collector: collector, editor: editor%>
+
+<%= render '/curation_concerns/base/flag', curation_concern: @presenter %>
\ No newline at end of file
diff --git a/app/views/curation_concerns/vector_works/_file_manager_attributes.html.erb b/app/views/curation_concerns/vector_works/_file_manager_attributes.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/vector_works/_file_manager_extra_tools.html.erb b/app/views/curation_concerns/vector_works/_file_manager_extra_tools.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/curation_concerns/vector_works/_file_manager_member_resource_options.html.erb b/app/views/curation_concerns/vector_works/_file_manager_member_resource_options.html.erb
new file mode 100644
index 000000000..86e46213d
--- /dev/null
+++ b/app/views/curation_concerns/vector_works/_file_manager_member_resource_options.html.erb
@@ -0,0 +1,10 @@
+
+
+ <%= radio_button_tag "thumbnail_id", node.id, @presenter.thumbnail_id == node.id, id: "thumbnail_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "thumbnail_id_#{node.id}", "Thumbnail" %>
+
+
+ <%= radio_button_tag "representative_id", node.id, @presenter.representative_id == node.id, id: "representative_id_#{node.id}", class: "radio_buttons" %>
+ <%= label_tag "representative_id_#{node.id}", "Representative Media" %>
+
+
diff --git a/app/views/curation_concerns/vector_works/_file_manager_resource_form.html.erb b/app/views/curation_concerns/vector_works/_file_manager_resource_form.html.erb
new file mode 100644
index 000000000..7abf042a3
--- /dev/null
+++ b/app/views/curation_concerns/vector_works/_file_manager_resource_form.html.erb
@@ -0,0 +1,6 @@
+
+ <%= simple_form_for [main_app, @presenter], remote: true, html: { id: 'resource-form', 'data-type': 'json' } do |f| %>
+ <%= f.input :thumbnail_id, as: :hidden, input_html: { data: {member_link: 'thumbnail_id'}} %>
+ <%= f.input :representative_id, as: :hidden, input_html: { data: {member_link: 'representative_id'}} %>
+ <% end %>
+
diff --git a/app/views/curation_concerns/vector_works/_file_manager_thumbnail.html.erb b/app/views/curation_concerns/vector_works/_file_manager_thumbnail.html.erb
new file mode 100644
index 000000000..6378f5677
--- /dev/null
+++ b/app/views/curation_concerns/vector_works/_file_manager_thumbnail.html.erb
@@ -0,0 +1 @@
+<%= render_thumbnail_tag node, class: 'thumbnail-inner' %>
diff --git a/app/views/curation_concerns/vector_works/_show_actions.html.erb b/app/views/curation_concerns/vector_works/_show_actions.html.erb
new file mode 100644
index 000000000..660210044
--- /dev/null
+++ b/app/views/curation_concerns/vector_works/_show_actions.html.erb
@@ -0,0 +1,9 @@
+<% if collector || editor %>
+
+ <% if editor %>
+ <%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]), class: 'btn btn-default' %>
+ <%= render 'vector_actions', document: @presenter %>
+ <%= link_to "Delete This #{@presenter.human_readable_type}", [main_app, @presenter], class: 'btn btn-danger pull-right', data: { confirm: "Delete this #{@presenter.human_readable_type}?" }, method: :delete %>
+ <% end %>
+
+<% end %>
diff --git a/app/views/curation_concerns/vector_works/show.html.erb b/app/views/curation_concerns/vector_works/show.html.erb
new file mode 100644
index 000000000..4b528debd
--- /dev/null
+++ b/app/views/curation_concerns/vector_works/show.html.erb
@@ -0,0 +1,22 @@
+<% provide :page_title, @presenter.page_title %>
+<% provide :page_header do %>
+ <%= @presenter %>
+ <% if @parent_presenter %>
+
+ - <%= link_to @parent_presenter, polymorphic_path([main_app, @parent_presenter]) %>
+ - <%= @presenter.human_readable_type %>
+
+ <% else %>
+ (<%= @presenter.human_readable_type %>)
+ <% end %>
+<% end %>
+
+<% collector = can?(:collect, @presenter.id) %>
+<% editor = can?(:edit, @presenter.id) %>
+
+<%= render 'geo_concerns/representative_media', presenter: @presenter %>
+<%= render 'geo_concerns/attributes', presenter: @presenter %>
+<%= render 'geo_concerns/related', presenter: @presenter %>
+<%= render "show_actions", collector: collector, editor: editor%>
+
+<%= render '/curation_concerns/base/flag', curation_concern: @presenter %>
\ No newline at end of file
diff --git a/app/views/geo_concerns/_attributes.html.erb b/app/views/geo_concerns/_attributes.html.erb
new file mode 100644
index 000000000..bacb31edb
--- /dev/null
+++ b/app/views/geo_concerns/_attributes.html.erb
@@ -0,0 +1,32 @@
+>
+ Attributes
+
+ Attribute Name | Values |
+
+
+ <%= render 'geo_concerns/attribute_rows', presenter: presenter %>
+ <%= presenter.attribute_to_html(:permission_badge, label: 'Access Rights') %>
+
+ <%= presenter.attribute_to_html(:rights, render_as: :rights) %>
+ <% if @presenter.respond_to? :state_badge %>
+
+ State |
+
+ <%= @presenter.state_badge %>
+ |
+
+ <% end %>
+ <%= presenter.attribute_to_html(:embargo_release_date, render_as: :date) %>
+ <%= presenter.attribute_to_html(:lease_expiration_date, render_as: :date) %>
+ <% if @presenter.respond_to? :rights_statement %>
+ <%= @presenter.rights_statement %>
+ <% end %>
+ <% if @presenter.respond_to? :holding_location %>
+ <%= @presenter.holding_location %>
+ <% end %>
+ <%= render 'curation_concerns/base/member_of_collections', presenter: @presenter %>
+ <% if can? :edit, @presenter.id %>
+ <%= @presenter.attribute_to_html(:workflow_note) %>
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/views/geo_concerns/_form_additional_information.html.erb b/app/views/geo_concerns/_form_additional_information.html.erb
new file mode 100644
index 000000000..5a3506f1b
--- /dev/null
+++ b/app/views/geo_concerns/_form_additional_information.html.erb
@@ -0,0 +1,13 @@
+
diff --git a/app/views/geo_concerns/_form_supplementary_fields.html.erb b/app/views/geo_concerns/_form_supplementary_fields.html.erb
new file mode 100644
index 000000000..a5d91e10d
--- /dev/null
+++ b/app/views/geo_concerns/_form_supplementary_fields.html.erb
@@ -0,0 +1,28 @@
+<%= render "geo_concerns/form_bounding_box", f: f %>
+<%= render "geo_concerns/form_files_and_links", f: f %>
+<%= render "form_member_of_collections", f: f %>
+<%= render "form_media", f: f %>
+
+
+
+ <%= render "form_permission", curation_concern: curation_concern, f: f %>
+
+
+
+
+
+ <%= render "form_access_policy", curation_concern: curation_concern, f: f %>
+
+
+
+
+
+ <%= render "form_state", curation_concern: curation_concern, f: f %>
+
+
+
+<%= render "form_in_works", f: f %>
+
+<% unless curation_concern.new_record? %>
+ <%= render "geo_concerns/form_populate_metadata", f: f %>
+<% end %>
diff --git a/app/views/welcome/_work_item.html.erb b/app/views/welcome/_work_item.html.erb
new file mode 100644
index 000000000..1bf1bc8e8
--- /dev/null
+++ b/app/views/welcome/_work_item.html.erb
@@ -0,0 +1,10 @@
+<% if can? :create, klass %>
+
+ <%= klass.human_readable_type %>
+ <%= content_tag(:div, nil, class: ['work-icon', "icon-#{klass.human_readable_type.downcase.gsub(' ','-')}"]) %>
+ <%= link_to 'Add New',
+ main_app.new_polymorphic_path([klass]),
+ class: "add-button btn btn-primary #{dom_class(klass, 'add_new')}"
+ %>
+
+<% end %>
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb
index f19a6e845..f24a9aa8e 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -8,29 +8,42 @@
-
+
+
+
Books and Manuscripts
+
+
+ <% [ScannedResource, MultiVolumeWork].each do |klass| %>
+ <%= render 'welcome/work_item', klass: klass %>
+ <% end %>
+
+
+
+
+
+
+
+
+
Maps and Geospatial Data
+
+
+ <% [ImageWork, RasterWork, VectorWork].each do |klass| %>
+ <%= render 'welcome/work_item', klass: klass %>
+ <% end %>
+
+
+
+
+
+
+
+
+
Collections
+
+
+ <%= render 'welcome/work_item', klass: Collection %>
+
+
+
+
diff --git a/bin/ci_simple_tiles_install.sh b/bin/ci_simple_tiles_install.sh
new file mode 100755
index 000000000..194a0b8ab
--- /dev/null
+++ b/bin/ci_simple_tiles_install.sh
@@ -0,0 +1,5 @@
+curl -L https://github.com/propublica/simple-tiles/archive/v0.6.0.tar.gz | tar -xz
+cd simple-tiles-0.6.0
+./configure && make
+make install
+cd ..
diff --git a/circle.yml b/circle.yml
index 129ed1f4a..68e48383a 100644
--- a/circle.yml
+++ b/circle.yml
@@ -11,7 +11,8 @@ dependencies:
- kakadu
pre:
- npm install -g eslint
- - sudo apt-get install libmagickwand-dev imagemagick redis-server tesseract-ocr tesseract-ocr-ita tesseract-ocr-eng sqlite3 libsqlite3-dev
+ - sudo apt-get install libmagickwand-dev imagemagick redis-server tesseract-ocr tesseract-ocr-ita tesseract-ocr-eng sqlite3 libsqlite3-dev libgdal-dev gdal-bin libcairo2-dev libpango1.0-dev
+ - sudo sh bin/ci_simple_tiles_install.sh
post:
- sudo sh bin/ci_kakadu_install.sh
- bundle exec rake rubocop
diff --git a/config/authorities/image_formats.yml b/config/authorities/image_formats.yml
new file mode 100644
index 000000000..e2421ac06
--- /dev/null
+++ b/config/authorities/image_formats.yml
@@ -0,0 +1,7 @@
+terms:
+ - id: image/jpeg
+ term: JPEG
+ code: JPEG
+ - id: image/tiff
+ term: TIFF
+ code: TIFF
diff --git a/config/authorities/metadata_formats.yml b/config/authorities/metadata_formats.yml
new file mode 100644
index 000000000..54e27cbb3
--- /dev/null
+++ b/config/authorities/metadata_formats.yml
@@ -0,0 +1,7 @@
+terms:
+ - id: application/xml; schema=fgdc
+ term: FGDC
+ - id: application/xml; schema=iso19139
+ term: ISO19139
+ - id: application/mods+xml
+ term: MODS
diff --git a/config/authorities/raster_formats.yml b/config/authorities/raster_formats.yml
new file mode 100644
index 000000000..7502d7d0c
--- /dev/null
+++ b/config/authorities/raster_formats.yml
@@ -0,0 +1,13 @@
+terms:
+ - id: image/tiff; gdal-format=GTiff
+ term: GeoTIFF
+ code: GTiff
+ - id: text/plain; gdal-format=AAIGrid
+ term: Arc/Info ASCII Grid
+ code: AAIGrid
+ - id: application/octet-stream; gdal-format=AIG
+ term: Arc/Info Binary Grid
+ code: AIG
+ - id: text/plain; gdal-format=USGSDEM
+ term: USGS ASCII DEM
+ code: USGSDEM
diff --git a/config/authorities/vector_formats.yml b/config/authorities/vector_formats.yml
new file mode 100644
index 000000000..bce846cfc
--- /dev/null
+++ b/config/authorities/vector_formats.yml
@@ -0,0 +1,7 @@
+terms:
+ - id: application/zip; ogr-format="ESRI Shapefile"
+ term: ESRI Shapefile
+ code: ESRI Shapefile
+ - id: application/vnd.geo+json
+ term: GeoJSON
+ code: GeoJSON
diff --git a/config/config.yml b/config/config.yml
index 3fd016fb2..af0f6aedc 100644
--- a/config/config.yml
+++ b/config/config.yml
@@ -37,6 +37,8 @@ defaults: &defaults
events:
server: 'amqp://localhost:5672'
exchange: 'plum_events'
+ geo_derivatives_path: <%= File.join(Rails.root, 'tmp', 'geo-derivatives') %>
+ geoblacklight_provenance: 'Princeton'
development:
<<: *defaults
diff --git a/config/deploy.rb b/config/deploy.rb
index 080b7d753..07fd85115 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -28,7 +28,7 @@
# set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml', 'config/blacklight.yml', 'config/fedora.yml', 'config/config.yml')
# Default value for linked_dirs is []
-set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/derivatives', 'tmp/uploads', 'vendor/bundle', "staged_files")
+set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/derivatives', 'tmp/geo-derivatives', 'tmp/uploads', 'vendor/bundle', "staged_files")
# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
diff --git a/config/geo_concerns_messaging.yml b/config/geo_concerns_messaging.yml
new file mode 100644
index 000000000..a827cafec
--- /dev/null
+++ b/config/geo_concerns_messaging.yml
@@ -0,0 +1,18 @@
+defaults: &defaults
+ events:
+ server: <%= ENV['PLUM_RABBIT_SERVER'] || 'amqp://localhost:5672' %>
+ exchange:
+ geoblacklight: 'gbl_events'
+ geoserver: 'geoserver_events'
+
+development:
+ <<: *defaults
+
+test:
+ <<: *defaults
+
+staging:
+ <<: *defaults
+
+production:
+ <<: *defaults
diff --git a/config/geoblacklight.yml b/config/geoblacklight.yml
new file mode 100644
index 000000000..143fca6a7
--- /dev/null
+++ b/config/geoblacklight.yml
@@ -0,0 +1,12 @@
+defaults: &defaults
+ adapter: solr
+ url: <%= ENV['GEOBLACKLIGHT_SOLR_URL'] || "http://127.0.0.1:8983/solr/blacklight-core" %>
+
+development:
+ <<: *defaults
+
+test:
+ <<: *defaults
+
+production:
+ <<: *defaults
diff --git a/config/geoserver.yml b/config/geoserver.yml
new file mode 100644
index 000000000..96cc2f664
--- /dev/null
+++ b/config/geoserver.yml
@@ -0,0 +1,27 @@
+geoserver:
+
+ # GeoServer config options for open and public data
+ open: &open
+ # Set to the REST API for the GeoServer
+ url: <%= ENV['PUBLIC_GEOSERVER_URL'] || "http://localhost:8181/geoserver/rest" %>
+ # Optional user and password, set to false to disable
+ user: <%= ENV['PUBLIC_GEOSERVER_USER'] || "admin" %>
+ password: <%= ENV['PUBLIC_GEOSERVER_PASSWORD'] || "geoserver" %>
+ # Set to your GWC server, or "builtin" for the one bundled with GeoServer
+ geowebcache_url: <%= ENV['PUBLIC_GEOSERVER_GWC_URL'] || "builtin" %>
+ # Name of the workspace to save your data in
+ workspace: <%= ENV['PUBLIC_GEOSERVER_WS'] || "public" %>
+ # Path on geoserver machine to mounted/mirrored derivates directory
+ derivatives_path: <%= ENV['PUBLIC_GEOSERVER_DERIVATIVES_PATH'] || "/opt/geoserver/data_dir/derivatives" %>
+ restclient:
+ # Set to false to disable or stdout, stderr, or filename
+ logfile: stderr
+ # Timeout (in seconds)
+ timeout: 300
+ # Open Timeout (in seconds)
+ open_timeout: 60
+
+ # GeoServer config options for restricted data or data that needs authentication
+ authenticated:
+ <<: *open
+ workspace: <%= ENV['AUTH_GEOSERVER_WS'] || "restricted" %>
diff --git a/config/initializers/curation_concerns.rb b/config/initializers/curation_concerns.rb
index 268a0b6b2..97e2aae76 100644
--- a/config/initializers/curation_concerns.rb
+++ b/config/initializers/curation_concerns.rb
@@ -3,6 +3,10 @@
config.register_curation_concern :multi_volume_work
# Injected via `rails g curation_concerns:work ScannedResource`
config.register_curation_concern :scanned_resource
+ # Injected via `rails g geo_concerns:install`
+ config.register_curation_concern :vector_work
+ config.register_curation_concern :raster_work
+ config.register_curation_concern :image_work
config.max_days_between_audits = 7
diff --git a/config/initializers/geo_concerns_messaging_config.rb b/config/initializers/geo_concerns_messaging_config.rb
new file mode 100644
index 000000000..cc36822ee
--- /dev/null
+++ b/config/initializers/geo_concerns_messaging_config.rb
@@ -0,0 +1,37 @@
+module GeoConcerns
+ module Messaging
+ def config
+ @config ||= config_yaml.with_indifferent_access
+ end
+
+ def messenger
+ GeoConcerns::EventsGenerator.new
+ end
+
+ def geoblacklight_client
+ rabbit_client
+ end
+
+ def geoserver_client
+ local_client
+ end
+
+ private
+
+ def config_yaml
+ config_file = "#{Rails.root}/config/geo_concerns_messaging.yml"
+ YAML.load(ERB.new(File.read(config_file)).result)[Rails.env]
+ end
+
+ def local_client
+ GeoConcerns::LocalMessagingClient.new
+ end
+
+ def rabbit_client
+ GeoConcerns::RabbitMessagingClient.new(Messaging.config['events']['server'])
+ end
+
+ module_function :config, :config_yaml, :messenger, :local_client,
+ :rabbit_client, :geoblacklight_client, :geoserver_client
+ end
+end
diff --git a/config/initializers/geoblacklight_config.rb b/config/initializers/geoblacklight_config.rb
new file mode 100644
index 000000000..07288b721
--- /dev/null
+++ b/config/initializers/geoblacklight_config.rb
@@ -0,0 +1,13 @@
+module Geoblacklight
+ def config
+ @config ||= config_yaml.with_indifferent_access
+ end
+
+ private
+
+ def config_yaml
+ YAML.load(ERB.new(File.read("#{Rails.root}/config/geoblacklight.yml")).result)[Rails.env]
+ end
+
+ module_function :config, :config_yaml
+end
diff --git a/config/initializers/simpler_tiles.rb b/config/initializers/simpler_tiles.rb
new file mode 100644
index 000000000..aa4c9996d
--- /dev/null
+++ b/config/initializers/simpler_tiles.rb
@@ -0,0 +1,65 @@
+module SimplerTiles
+ class << self
+ def config
+ @config ||= Configuration.new
+ end
+ end
+
+ class Configuration
+ attr_reader :settings
+ attr_writer :bg_color,
+ :fill,
+ :stroke,
+ :weight,
+ :line_cap,
+ :line_join,
+ :radius
+
+ def initialize
+ @settings ||= File.exist?(config_file) ? YAML.load_file(config_file) : {}
+ end
+
+ def config_file
+ File.join(Rails.root, 'config/simpler_tiles.yml')
+ end
+
+ def to_h
+ {
+ 'stroke' => stroke,
+ 'line-cap' => line_cap,
+ 'line-join' => line_join,
+ 'weight' => weight,
+ 'fill' => fill,
+ 'radius' => radius
+ }
+ end
+
+ def bg_color
+ @bg_color ||= settings.fetch('bg_color', '#ffffff00')
+ end
+
+ def fill
+ @fill ||= settings.fetch('fill', '#e4e3ea')
+ end
+
+ def stroke
+ @stroke ||= settings.fetch('stroke', '#483d8b')
+ end
+
+ def weight
+ @weight ||= settings.fetch('weight', '0.3')
+ end
+
+ def line_cap
+ @line_cap ||= settings.fetch('line_cap', 'square')
+ end
+
+ def line_join
+ @line_join ||= settings.fetch('line_join', 'miter')
+ end
+
+ def radius
+ @radius ||= settings.fetch('radius', '2')
+ end
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index 9afe9ec52..509e515bf 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -38,6 +38,7 @@
curation_concerns_basic_routes
curation_concerns_embargo_management
+ mount GeoConcerns::Engine => '/'
get "/iiif/collections", defaults: { format: :json }, controller: :collections, action: :index_manifest
namespace :curation_concerns, path: :concern do
@@ -70,6 +71,21 @@
post :flag
end
end
+ resources :image_works, only: [] do
+ member do
+ post :flag
+ end
+ end
+ resources :raster_works, only: [] do
+ member do
+ post :flag
+ end
+ end
+ resources :vector_works, only: [] do
+ member do
+ post :flag
+ end
+ end
resources :file_sets, only: [] do
member do
post :derivatives
diff --git a/config/simpler_tiles.yml b/config/simpler_tiles.yml
new file mode 100644
index 000000000..fa275f714
--- /dev/null
+++ b/config/simpler_tiles.yml
@@ -0,0 +1,24 @@
+# Background color
+# Use '#ffffff' for a solid white background.
+# Add two zeros to a six digit hex color code
+# for a png (does not work with jpeg) image
+# with a transparent background.
+bg_color: '#ffffff00'
+
+# The fill color for each shape
+fill: '#e4e3ea'
+
+# The stroke color for each line
+stroke: '#483d8b'
+
+# Width of line in pixels
+weight: '0.3'
+
+# How lines are ended, one of: "butt", "round", "square"
+line_cap: 'square'
+
+# How lines are joined together, one of: "miter", "round", "bevel"
+line_join: 'miter'
+
+# For point rendering only, the radius in pixels of the circle
+radius: '2'
diff --git a/db/schema.rb b/db/schema.rb
index fdb50c87b..8f1bab3bc 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -13,9 +13,6 @@
ActiveRecord::Schema.define(version: 20161101144655) do
- # These are extensions that must be enabled in order to support this database
- enable_extension "plpgsql"
-
create_table "bookmarks", force: :cascade do |t|
t.integer "user_id", null: false
t.string "user_type"
@@ -26,7 +23,7 @@
t.string "document_type"
end
- add_index "bookmarks", ["user_id"], name: "index_bookmarks_on_user_id", using: :btree
+ add_index "bookmarks", ["user_id"], name: "index_bookmarks_on_user_id"
create_table "checksum_audit_logs", force: :cascade do |t|
t.string "file_set_id"
@@ -39,7 +36,7 @@
t.datetime "updated_at"
end
- add_index "checksum_audit_logs", ["file_set_id", "file_id"], name: "by_file_set_id_and_file_id", using: :btree
+ add_index "checksum_audit_logs", ["file_set_id", "file_id"], name: "by_generic_file_id_and_file_id"
create_table "minter_states", force: :cascade do |t|
t.string "namespace", default: "default", null: false
@@ -51,7 +48,7 @@
t.datetime "updated_at", null: false
end
- add_index "minter_states", ["namespace"], name: "index_minter_states_on_namespace", unique: true, using: :btree
+ add_index "minter_states", ["namespace"], name: "index_minter_states_on_namespace", unique: true
create_table "pending_uploads", force: :cascade do |t|
t.string "curation_concern_id"
@@ -77,8 +74,8 @@
t.integer "user_id"
end
- add_index "roles_users", ["role_id", "user_id"], name: "index_roles_users_on_role_id_and_user_id", using: :btree
- add_index "roles_users", ["user_id", "role_id"], name: "index_roles_users_on_user_id_and_role_id", using: :btree
+ add_index "roles_users", ["role_id", "user_id"], name: "index_roles_users_on_role_id_and_user_id"
+ add_index "roles_users", ["user_id", "role_id"], name: "index_roles_users_on_user_id_and_role_id"
create_table "searches", force: :cascade do |t|
t.text "query_params"
@@ -88,7 +85,7 @@
t.datetime "updated_at"
end
- add_index "searches", ["user_id"], name: "index_searches_on_user_id", using: :btree
+ add_index "searches", ["user_id"], name: "index_searches_on_user_id"
create_table "single_use_links", force: :cascade do |t|
t.string "downloadKey"
@@ -118,10 +115,10 @@
t.string "username"
end
- add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
- add_index "users", ["provider"], name: "index_users_on_provider", using: :btree
- add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
- add_index "users", ["uid"], name: "index_users_on_uid", using: :btree
+ add_index "users", ["email"], name: "index_users_on_email", unique: true
+ add_index "users", ["provider"], name: "index_users_on_provider"
+ add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
+ add_index "users", ["uid"], name: "index_users_on_uid"
create_table "version_committers", force: :cascade do |t|
t.string "obj_id"
diff --git a/spec/actors/curation_concerns/image_work_actor_spec.rb b/spec/actors/curation_concerns/image_work_actor_spec.rb
new file mode 100644
index 000000000..4384f98e3
--- /dev/null
+++ b/spec/actors/curation_concerns/image_work_actor_spec.rb
@@ -0,0 +1,9 @@
+# Generated via
+# `rails generate geo_concerns:install`
+require 'rails_helper'
+
+describe CurationConcerns::Actors::ImageWorkActor do
+ it 'is a BaseActor' do
+ expect(described_class < ::CurationConcerns::Actors::BaseActor).to be true
+ end
+end
diff --git a/spec/actors/curation_concerns/raster_work_actor_spec.rb b/spec/actors/curation_concerns/raster_work_actor_spec.rb
new file mode 100644
index 000000000..8385f7e8b
--- /dev/null
+++ b/spec/actors/curation_concerns/raster_work_actor_spec.rb
@@ -0,0 +1,9 @@
+# Generated via
+# `rails generate geo_concerns:install`
+require 'rails_helper'
+
+describe CurationConcerns::Actors::RasterWorkActor do
+ it 'is a BaseActor' do
+ expect(described_class < ::CurationConcerns::Actors::BaseActor).to be true
+ end
+end
diff --git a/spec/actors/curation_concerns/vector_work_actor_spec.rb b/spec/actors/curation_concerns/vector_work_actor_spec.rb
new file mode 100644
index 000000000..30d370e26
--- /dev/null
+++ b/spec/actors/curation_concerns/vector_work_actor_spec.rb
@@ -0,0 +1,9 @@
+# Generated via
+# `rails generate geo_concerns:install`
+require 'rails_helper'
+
+describe CurationConcerns::Actors::VectorWorkActor do
+ it 'is a BaseActor' do
+ expect(described_class < ::CurationConcerns::Actors::BaseActor).to be true
+ end
+end
diff --git a/spec/actors/file_set_actor_spec.rb b/spec/actors/file_set_actor_spec.rb
new file mode 100644
index 000000000..843783e65
--- /dev/null
+++ b/spec/actors/file_set_actor_spec.rb
@@ -0,0 +1,33 @@
+require 'rails_helper'
+
+describe FileSetActor do
+ let(:user) { FactoryGirl.create(:user) }
+ let(:scanned_resource) { FactoryGirl.build(:scanned_resource, id: 'id') }
+ let(:vector_work) { FactoryGirl.build(:vector_work, id: 'id') }
+ let(:file_set) { FactoryGirl.build(:file_set) }
+ let(:messenger) { double }
+ let(:actor) do
+ described_class.new(file_set, user)
+ end
+ subject { actor }
+
+ before do
+ allow(ManifestEventGenerator).to receive(:new).and_return(messenger)
+ end
+
+ describe '#attach_file_to_work' do
+ context 'when the parent work is a ScannedResource' do
+ it 'fires a record_updated manifest event' do
+ expect(messenger).to receive(:record_updated)
+ subject.attach_file_to_work(scanned_resource, file_set, {})
+ end
+ end
+
+ context 'when the parent work is a VectorWork' do
+ it 'does not fire a record_updated manifest event' do
+ expect(messenger).to_not receive(:record_updated)
+ subject.attach_file_to_work(vector_work, file_set, {})
+ end
+ end
+ end
+end
diff --git a/spec/controllers/curation_concerns/image_works_controller_spec_spec.rb b/spec/controllers/curation_concerns/image_works_controller_spec_spec.rb
new file mode 100644
index 000000000..f8449c2b2
--- /dev/null
+++ b/spec/controllers/curation_concerns/image_works_controller_spec_spec.rb
@@ -0,0 +1,12 @@
+# Generated via
+# `rails generate geo_concerns:install`
+require 'rails_helper'
+
+describe CurationConcerns::ImageWorksController do
+ it { is_expected.to be_kind_of(GeoConcerns::ImageWorksControllerBehavior) }
+
+ describe '#show_presenter' do
+ subject { described_class.new.show_presenter }
+ it { is_expected.to eq(ImageWorkShowPresenter) }
+ end
+end
diff --git a/spec/controllers/curation_concerns/raster_works_controller_spec_spec.rb b/spec/controllers/curation_concerns/raster_works_controller_spec_spec.rb
new file mode 100644
index 000000000..0c5535f8e
--- /dev/null
+++ b/spec/controllers/curation_concerns/raster_works_controller_spec_spec.rb
@@ -0,0 +1,12 @@
+# Generated via
+# `rails generate geo_concerns:install`
+require 'rails_helper'
+
+describe CurationConcerns::RasterWorksController do
+ it { is_expected.to be_kind_of(GeoConcerns::RasterWorksControllerBehavior) }
+
+ describe '#show_presenter' do
+ subject { described_class.new.show_presenter }
+ it { is_expected.to eq(RasterWorkShowPresenter) }
+ end
+end
diff --git a/spec/controllers/curation_concerns/vector_works_controller_spec_spec.rb b/spec/controllers/curation_concerns/vector_works_controller_spec_spec.rb
new file mode 100644
index 000000000..ddede51ff
--- /dev/null
+++ b/spec/controllers/curation_concerns/vector_works_controller_spec_spec.rb
@@ -0,0 +1,55 @@
+require 'rails_helper'
+
+describe CurationConcerns::VectorWorksController do
+ let(:state) { 'complete' }
+ let(:user) { FactoryGirl.create(:user) }
+ let(:vector_work) { FactoryGirl.create(:vector_work, state: state, user: user) }
+ let(:manifest_generator) { instance_double(GeoConcerns::EventsGenerator) }
+
+ before do
+ allow(GeoConcerns::EventsGenerator).to receive(:new).and_return(manifest_generator)
+ end
+
+ describe '#show_presenter' do
+ subject { described_class.new.show_presenter }
+ it { is_expected.to eq(VectorWorkShowPresenter) }
+ end
+
+ describe '#delete' do
+ before do
+ sign_in user
+ end
+
+ it 'fires a delete event' do
+ expect(manifest_generator).to receive(:record_deleted)
+ delete :destroy, id: vector_work
+ end
+ end
+
+ describe '#update' do
+ let(:vector_work_attributes) do
+ FactoryGirl.attributes_for(:vector_work).merge(
+ title: ['New Title']
+ )
+ end
+
+ before do
+ sign_in user
+ end
+
+ context 'with a complete state' do
+ it 'fires an update event' do
+ expect(manifest_generator).to receive(:record_updated)
+ post :update, id: vector_work, vector_work: vector_work_attributes
+ end
+ end
+
+ context 'with a non-complete state' do
+ let(:state) { 'final_review' }
+ it 'does not fire an update event' do
+ expect(manifest_generator).to_not receive(:record_updated)
+ post :update, id: vector_work, vector_work: vector_work_attributes
+ end
+ end
+ end
+end
diff --git a/spec/factories/vector_works.rb b/spec/factories/vector_works.rb
new file mode 100644
index 000000000..c6e853241
--- /dev/null
+++ b/spec/factories/vector_works.rb
@@ -0,0 +1,15 @@
+FactoryGirl.define do
+ factory :vector_work do
+ title ["Test title"]
+ rights_statement "http://rightsstatements.org/vocab/NKC/1.0/"
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
+
+ transient do
+ user { FactoryGirl.create(:user) }
+ end
+
+ after(:build) do |work, evaluator|
+ work.apply_depositor_metadata(evaluator.user.user_key)
+ end
+ end
+end
diff --git a/spec/features/root_spec.rb b/spec/features/root_spec.rb
index a84393b57..99d649c49 100644
--- a/spec/features/root_spec.rb
+++ b/spec/features/root_spec.rb
@@ -11,8 +11,8 @@
scenario 'Logged in users see welcome text and links to create content' do
visit root_path
expect(page).to have_content('Digital PUL')
- expect(page).to have_selector('li.work-type/h3.title', text: 'Scanned Resource')
- expect(page).to have_selector('li.work-type/h3.title', text: 'Collection')
+ expect(page).to have_selector('li.work-type/h4.title', text: 'Scanned Resource')
+ expect(page).to have_selector('li.work-type/h4.title', text: 'Collection')
end
end
@@ -20,8 +20,8 @@
scenario 'Anonymous users see only welcome text' do
visit root_path
expect(page).to have_content('Digital PUL')
- expect(page).not_to have_selector('li.work-type/h3.title', text: 'Scanned Resource')
- expect(page).not_to have_selector('li.work-type/h3.title', text: 'Collection')
+ expect(page).not_to have_selector('li.work-type/h4.title', text: 'Scanned Resource')
+ expect(page).not_to have_selector('li.work-type/h4.title', text: 'Collection')
end
end
end
diff --git a/spec/fixtures/files/mercer.json b/spec/fixtures/files/mercer.json
new file mode 100644
index 000000000..433149c39
--- /dev/null
+++ b/spec/fixtures/files/mercer.json
@@ -0,0 +1,3 @@
+{"type":"FeatureCollection","properties":{"kind":"state","state":"NJ"},"features":[
+{"type":"Feature","properties":{"kind":"county","name":"Mercer","state":"NJ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-74.8007,40.4179],[-74.7459,40.4234],[-74.7240,40.3741],[-74.6199,40.3741],[-74.6199,40.3248],[-74.4830,40.2536],[-74.6145,40.1824],[-74.5871,40.1385],[-74.7021,40.1824],[-74.7240,40.1495],[-74.9431,40.3412],[-74.8554,40.3467],[-74.8719,40.3795],[-74.8007,40.3850]]]]}}
+]}
diff --git a/spec/helpers/index_view_helper_spec.rb b/spec/helpers/index_view_helper_spec.rb
new file mode 100644
index 000000000..95e5d5270
--- /dev/null
+++ b/spec/helpers/index_view_helper_spec.rb
@@ -0,0 +1,16 @@
+require 'rails_helper'
+
+describe IndexViewHelper do
+ subject { helper }
+ let(:document) { instance_double(SolrDocument, subject: subject_list) }
+ let(:args) { { document: document } }
+
+ describe '#index_subject' do
+ context 'with a long list of subject terms' do
+ let(:subject_list) { ['1', '2', '3', '4', '5', '6', '7', '8', '9'] }
+ it 'returns a list with a maximum of 7 items' do
+ expect(subject.index_subject(args)).to eq '1
2
3
4
5
6
7'
+ end
+ end
+ end
+end
diff --git a/spec/helpers/thumbnail_helper_spec.rb b/spec/helpers/thumbnail_helper_spec.rb
new file mode 100644
index 000000000..d7c4ea66f
--- /dev/null
+++ b/spec/helpers/thumbnail_helper_spec.rb
@@ -0,0 +1,61 @@
+require 'rails_helper'
+
+describe ThumbnailHelper do
+ subject { helper }
+
+ before do
+ allow(subject).to receive(:thumbnail_url).and_return('thumbnail.jpg')
+ end
+
+ context 'when document is a geo FileSet' do
+ let(:file_set) { FactoryGirl.create(:file_set, geo_mime_type: 'application/vnd.geo+json') }
+ let(:document) do
+ FileSetPresenter.new(
+ SolrDocument.new(
+ file_set.to_solr
+ ), nil
+ )
+ end
+
+ it 'returns a path to the thumbnail image' do
+ expect(subject).to receive(:link_to_document).with(document, /![](\"\/images\/thumbnail.jpg/))