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< + + +Generated by Fontastic.me + + + + + + + + + + + + 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 %> +
+ <% if editor %> + <%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]), class: 'btn btn-default' %> + <% if @presenter.valid_child_concerns.length > 0 %> +
+ + +
+ <% end %> + <%= render 'image_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/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 %> + + <% 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 %> + + <% 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 %> + + <% 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 @@ +> + + + + + + <%= 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 %> + + + + + <% 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 %> + +

Attributes

Attribute NameValues
State + <%= @presenter.state_badge %> +
\ 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 @@ +
+ Additional Information + <%= f.input :source_metadata_identifier, label: 'Source Metadata ID', input_html: { class: 'mutex detect_duplicates' } %> + <%= f.input :contributor, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :subject, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :publisher, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :source, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :language, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :spatial, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :temporal, as: :multi_value, input_html: { class: 'form-control' } %> + <%= f.input :issued, input_html: { class: 'form-control' } %> + <%= f.input :workflow_note, as: :multi_value %> +
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 @@

    -
      - <% if can? :create, Collection %> -
    • -

      Collection

      -

      - <%= Collection.human_readable_short_description %> -

      - <%= link_to 'Add New', main_app.new_collection_path, class: "add-button btn btn-primary collection_add_new" %> -
    • - <% end %> - <% @curation_concerns.each do |klass| %> - <% if can? :create, klass %> -
    • -

      <%= klass.human_readable_type %>

      -

      - <%= klass.human_readable_short_description %> -

      - <%= link_to 'Add New', - main_app.new_polymorphic_path([klass]), - class: "add-button btn btn-primary #{dom_class(klass, 'add_new')}" - %> -
    • - <% end %> - <% end %> -
    +
    +
    +
    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, /