geoblacklight_admin 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +58 -59
- data/Rakefile +25 -10
- data/app/assets/javascripts/geoblacklight_admin.js +1 -1
- data/app/assets/stylesheets/geoblacklight_admin/modules/_forms.scss +108 -0
- data/app/controllers/admin/documents_controller.rb +22 -13
- data/app/controllers/admin/search_controller.rb +2 -1
- data/app/controllers/admin/users_controller.rb +1 -1
- data/app/indexers/document_indexer.rb +1 -1
- data/app/jobs/export_job.rb +7 -5
- data/app/jobs/export_json_bulk_job.rb +95 -0
- data/app/jobs/export_json_job.rb +14 -12
- data/app/models/blacklight_api.rb +6 -6
- data/app/models/blacklight_api_facets.rb +7 -2
- data/app/models/blacklight_api_ids.rb +3 -4
- data/app/models/bulk_action.rb +1 -1
- data/app/views/admin/document_accesses/destroy_all.html.erb +1 -1
- data/app/views/admin/document_downloads/destroy_all.html.erb +1 -1
- data/app/views/admin/documents/_form_nav.html.erb +3 -1
- data/app/views/admin/documents/_json_file.jbuilder +14 -0
- data/app/views/admin/documents/_result_selected_options.html.erb +3 -1
- data/app/views/admin/documents/fetch.json_file.jbuilder +9 -0
- data/app/views/admin/documents/index.json_file.jbuilder +9 -0
- data/app/views/admin/elements/index.html.erb +1 -1
- data/app/views/admin/form_elements/index.html.erb +1 -1
- data/app/views/admin/shared/_navbar.html.erb +3 -3
- data/app/views/admin/shared/_toast.html.erb +1 -1
- data/app/views/admin/users/index.html.erb +1 -1
- data/config/locales/documents.en.yml +3 -0
- data/db/migrate/20230316183001_add_geoblacklight_admin_gem.rb +1 -0
- data/db/seeds.rb +0 -1
- data/db/seeds_elements.csv +56 -55
- data/db/seeds_elements.numbers +0 -0
- data/db/seeds_form_elements.csv +65 -64
- data/db/seeds_form_elements.numbers +0 -0
- data/lib/generators/geoblacklight_admin/config_generator.rb +31 -76
- data/lib/generators/geoblacklight_admin/install_generator.rb +1 -9
- data/lib/generators/geoblacklight_admin/templates/config/geomg_aardvark_schema.json +12 -6
- data/lib/generators/geoblacklight_admin/templates/config/initializers/devise.rb +315 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/kithe.rb +2 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/mime_types.rb +15 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +2 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/simple_form.rb +178 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/simple_form_bootstrap.rb +365 -0
- data/lib/generators/geoblacklight_admin/templates/config/settings.yml +74 -22
- data/lib/generators/geoblacklight_admin/templates/javascript/controllers/results_controller.js +10 -0
- data/lib/generators/geoblacklight_admin/templates/package.json +2 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/schema.xml +3 -3
- data/lib/generators/geoblacklight_admin/views_generator.rb +2 -2
- data/lib/geoblacklight_admin/version.rb +1 -1
- data/lib/tasks/geoblacklight_admin.rake +6 -6
- metadata +24 -17
- data/lib/generators/geoblacklight_admin/example_docs_generator.rb +0 -18
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/confirmations/new.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/invitations/edit.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/invitations/new.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/mailer/invitation_instructions.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/mailer/invitation_instructions.text.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/passwords/edit.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/passwords/new.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/registrations/edit.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/registrations/new.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/sessions/new.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/shared/_links.html.erb +0 -0
- /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/unlocks/new.html.erb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f18e2477b4c86505e2db4f96deecdd1cb1c7a3da7e6a5ec914d62cb03d96462f
|
4
|
+
data.tar.gz: 65686ca5de9a294a3232e87c9639b0ee4dec85e2eb6f4d858f0dd47da81b3e97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a55943084756c68c07211e72de617cf1440f7128912bac6549ffcc95ac51733d2e3d21c165fb8f24acd6dda315c9a316056bda088e5eae65081552c9e6ce302
|
7
|
+
data.tar.gz: '090b8cdcac146e2fc720004f923dc73e4cedb3a00c75ea13d90f1ec0c3786b57be9ae65a9d29858e09dea66eb43bfcfbf68b3e0288c5414ff3b0b04bbe41cc92'
|
data/README.md
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# geoblacklight_admin
|
2
2
|
|
3
|
-
|
3
|
+

|
4
4
|
|
5
|
-
|
5
|
+
GeoBlacklight Admin is a [GeoBlacklight](https://github.com/geoblacklight/geoblacklight) plugin, built on [Kithe](https://github.com/sciencehistory/kithe), that provides a complex web-form for editing documents and an CSV-based import/export workflow for OpenGeoMetadata's [Aardvark schema](https://opengeometadata.org/ogm-aardvark/). GBL Admin is based on the Big Ten Academic Alliance's production workflow tool [GEOMG](https://github.com/geobtaa/geomg).
|
6
6
|
|
7
|
-
|
7
|
+
[](https://youtu.be/lWjcr-Ow228 "GeoBlacklight Admin")
|
8
8
|
|
9
9
|
## Requirements
|
10
10
|
|
11
|
+
* Rails v6.1 (not v7 yet)
|
11
12
|
* Blacklight v7 (not v8)
|
12
13
|
* GeoBlacklight v4 (not v3)
|
13
14
|
* Solr v8.4+
|
@@ -15,43 +16,26 @@ GeoBlacklight Admin is a [GeoBlacklight](https://github.com/geoblacklight/geobla
|
|
15
16
|
* Redis (for Sidekiq)
|
16
17
|
* OpenGeoMetadata's Aardvark Schema
|
17
18
|
|
18
|
-
##
|
19
|
+
## Installation
|
19
20
|
|
20
|
-
###
|
21
|
-
```bash
|
22
|
-
psql postgres
|
23
|
-
DROP DATABASE geoblacklight_development;
|
24
|
-
CREATE DATABASE geoblacklight_development;
|
25
|
-
```
|
26
|
-
|
27
|
-
### Terminal 2 - Bundle and run generator
|
28
|
-
```bash
|
29
|
-
bundle install
|
30
|
-
bundle exec rake engine_cart:generate
|
31
|
-
```
|
21
|
+
### PostgreSQL
|
32
22
|
|
33
|
-
|
23
|
+
You need a PostgreSQL database to use this project.
|
34
24
|
|
35
|
-
|
36
|
-
|
37
|
-
# Cannot generate app if uncommented...
|
38
|
-
# Uncomment after app is generated to fix view errors
|
39
|
-
# include ::Pagy::Frontend
|
40
|
-
```
|
25
|
+
* Homebrew: https://wiki.postgresql.org/wiki/Homebrew
|
26
|
+
* Docker: https://www.docker.com/blog/how-to-use-the-postgres-docker-official-image/
|
41
27
|
|
42
|
-
###
|
43
|
-
```bash
|
44
|
-
cd .internal_test_app
|
45
|
-
bundle exec rake db:seed
|
28
|
+
### Install Template
|
46
29
|
|
47
|
-
|
48
|
-
yarn add @babel/plugin-proposal-private-methods --dev
|
30
|
+
Use Ruby v3.2 and Rails v6.1.7.4 to bootstrap a new GeoBlacklight + GBL Admin application using the template script:
|
49
31
|
|
50
|
-
|
32
|
+
```bash
|
33
|
+
rails _6.1.7.4_ new gbl_admin -m https://raw.githubusercontent.com/geobtaa/geoblacklight_admin/develop/template.rb
|
34
|
+
cd gbl_admin
|
51
35
|
bundle exec rake gbl_admin:server
|
52
36
|
```
|
53
37
|
|
54
|
-
You
|
38
|
+
You have now generated the .internal_test_app and populated the Elements / FormElements tables for OMG Aardvark support.
|
55
39
|
|
56
40
|
### View App in Browser
|
57
41
|
|
@@ -59,12 +43,48 @@ You're now done generating the test app and populating the Elements / FormElemen
|
|
59
43
|
2. Click on the "Sign in" link
|
60
44
|
3. Enter email: admin@geoblacklight.org and password: 123456
|
61
45
|
4. Click on the "GBL Admin" link
|
62
|
-
5. Import some CSV
|
46
|
+
5. Import some CSV (test/fixtures/files/btaa_sample_records.csv)
|
63
47
|
|
64
48
|
-----
|
65
49
|
|
66
|
-
|
50
|
+
## Run Project for Local Development
|
51
|
+
Drop and recreate databases (or engine_cart:generate will fail)
|
67
52
|
|
53
|
+
### Drop/Create application PG database
|
54
|
+
```bash
|
55
|
+
psql postgres
|
56
|
+
DROP DATABASE geoblacklight_development;
|
57
|
+
CREATE DATABASE geoblacklight_development;
|
58
|
+
```
|
59
|
+
|
60
|
+
```bash
|
61
|
+
cd project root
|
62
|
+
bundle install
|
63
|
+
bundle exec rake engine_cart:regenerate
|
64
|
+
```
|
65
|
+
|
66
|
+
### Run Solr
|
67
|
+
```bash
|
68
|
+
bin/rails geoblacklight:solr
|
69
|
+
```
|
70
|
+
|
71
|
+
### Run App
|
72
|
+
```bash
|
73
|
+
cd .internal_test_app
|
74
|
+
bundle exec rails server
|
75
|
+
```
|
76
|
+
|
77
|
+
### Lint App
|
78
|
+
```bash
|
79
|
+
standardrb .
|
80
|
+
```
|
81
|
+
|
82
|
+
### Test App
|
83
|
+
```bash
|
84
|
+
RAILS_ENV=test bundle exec rails test
|
85
|
+
```
|
86
|
+
|
87
|
+
## TODOs
|
68
88
|
* ~~SolrWrapper - Add persist option~~
|
69
89
|
* ~~BlacklightApi returns not auth'd message (not requiring auth for now (not sensitive data))~~
|
70
90
|
* ~~Facet links need /admin nesting~~
|
@@ -78,31 +98,10 @@ You're now done generating the test app and populating the Elements / FormElemen
|
|
78
98
|
* ~~Routes - Get devise user~~
|
79
99
|
* ~~No route matches [GET] "/users/sign_out"~~
|
80
100
|
* ~~Bookmarks need to be Admin::Bookmarks~~
|
81
|
-
* GitHub Actions / CI integration
|
82
|
-
* Port the GEOMG test suite
|
101
|
+
* ~~GitHub Actions / CI integration~~
|
102
|
+
* ~~Port the GEOMG test suite~~
|
103
|
+
* ~~Project gem dependency injection redundancy...~~
|
104
|
+
* DRY up Engine routing
|
83
105
|
* Remove legacy GEOMG / B1G everywhere...
|
84
106
|
* Send GBLADMIN JavaScript pack to NPM like Blacklight
|
85
|
-
*
|
86
|
-
* Likely a lot more polish to be uncovered...
|
87
|
-
|
88
|
-
|
89
|
-
# To Run Project
|
90
|
-
drop and create databases (or engine_cart will fail)
|
91
|
-
cd project root
|
92
|
-
bundle exec rake engine_cart:regenerate
|
93
|
-
|
94
|
-
## Run Solr
|
95
|
-
bin/rails geoblacklight:solr
|
96
|
-
|
97
|
-
## Run App
|
98
|
-
cd .internal_test_app
|
99
|
-
bundle exec rails server
|
100
|
-
|
101
|
-
## Test App
|
102
|
-
bundle exec rails test
|
103
|
-
cd .internal_test_app
|
104
|
-
rake db:seed
|
105
|
-
rake geomg:solr:reindex
|
106
|
-
|
107
|
-
# @TODO: Add chosen.js css
|
108
|
-
# @TODO: Fix missing select form-control class
|
107
|
+
* Likely some more polish to be uncovered...
|
data/Rakefile
CHANGED
@@ -24,14 +24,6 @@ RuboCop::RakeTask.new(:rubocop)
|
|
24
24
|
require "solr_wrapper/rake_task"
|
25
25
|
require "engine_cart/rake_task"
|
26
26
|
require "geoblacklight_admin/version"
|
27
|
-
|
28
|
-
desc "Run test suite"
|
29
|
-
task "ci" do
|
30
|
-
ENV["RAILS_ENV"] = "test"
|
31
|
-
system("RAILS_ENV=test bundle exec rake test") || false
|
32
|
-
# system("RAILS_ENV=test bundle exec rake geomg:solr:reindex") || false
|
33
|
-
end
|
34
|
-
|
35
27
|
require "rake/testtask"
|
36
28
|
|
37
29
|
# Searches for files ending in _test.rb in the test directory
|
@@ -45,12 +37,35 @@ end
|
|
45
37
|
# Will use test as defaut task if rake is run by itself
|
46
38
|
task default: :test
|
47
39
|
|
40
|
+
desc "Run test suite"
|
41
|
+
task ci: ["geoblacklight:generate"] do
|
42
|
+
within_test_app do
|
43
|
+
system "RAILS_ENV=test bin/rails db:migrate"
|
44
|
+
system "RAILS_ENV=test rake db:seed"
|
45
|
+
system "RAILS_ENV=test rails webpacker:compile"
|
46
|
+
end
|
47
|
+
|
48
|
+
# Run RSpec tests with Coverage
|
49
|
+
Rake::Task["geoblacklight:coverage"].invoke
|
50
|
+
end
|
51
|
+
|
48
52
|
namespace :geoblacklight do
|
53
|
+
desc "Run tests with coverage"
|
54
|
+
task :coverage do
|
55
|
+
ENV["COVERAGE"] = "true"
|
56
|
+
# Rake::Task["spec"].invoke
|
57
|
+
Rake::Task["test"].invoke
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "Create the test rails app"
|
61
|
+
task generate: ["engine_cart:generate"] do
|
62
|
+
# Intentionally Empty Block
|
63
|
+
end
|
64
|
+
|
49
65
|
namespace :internal do
|
50
66
|
task seed: ["engine_cart:generate"] do
|
51
67
|
within_test_app do
|
52
|
-
|
53
|
-
# system "bundle exec rake gbl_admin:seed"
|
68
|
+
system "bundle exec rake db:seed"
|
54
69
|
system "bundle exec rake geoblacklight:downloads:mkdir"
|
55
70
|
end
|
56
71
|
end
|
@@ -26,3 +26,111 @@ label, legend {
|
|
26
26
|
html {
|
27
27
|
scroll-padding-top: 4rem; /* height of your sticky header */
|
28
28
|
}
|
29
|
+
|
30
|
+
// Simple Form / Bootstrap 5 / Select
|
31
|
+
//
|
32
|
+
// GBL is using BS4 now, but SimpleForm is already on BS5
|
33
|
+
// Adding support for BS5's .form-select class until we upgrade to BS5
|
34
|
+
$form-select-padding-y: $input-padding-y;
|
35
|
+
$form-select-padding-x: $input-padding-x;
|
36
|
+
$form-select-font-family: $input-font-family;
|
37
|
+
$form-select-font-size: $input-font-size;
|
38
|
+
$form-select-indicator-padding: $form-select-padding-x * 3; // Extra padding for background-image
|
39
|
+
$form-select-font-weight: $input-font-weight;
|
40
|
+
$form-select-line-height: $input-line-height;
|
41
|
+
$form-select-color: $input-color;
|
42
|
+
$form-select-bg: $input-bg;
|
43
|
+
$form-select-disabled-color: null;
|
44
|
+
$form-select-disabled-bg: $gray-200;
|
45
|
+
$form-select-disabled-border-color: $gray-800;
|
46
|
+
$form-select-bg-position: right $form-select-padding-x center;
|
47
|
+
$form-select-bg-size: 16px 12px; // In pixels because image dimensions
|
48
|
+
$form-select-indicator-color: $gray-800;
|
49
|
+
$form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>");
|
50
|
+
|
51
|
+
$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding;
|
52
|
+
$form-select-feedback-icon-position: center right $form-select-indicator-padding;
|
53
|
+
$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half;
|
54
|
+
|
55
|
+
$form-select-border-width: $input-border-width;
|
56
|
+
$form-select-border-color: $input-border-color;
|
57
|
+
$form-select-border-radius: $border-radius;
|
58
|
+
|
59
|
+
$form-select-focus-border-color: $input-focus-border-color;
|
60
|
+
$form-select-focus-width: $input-focus-width;
|
61
|
+
$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color;
|
62
|
+
|
63
|
+
$form-select-padding-y-sm: $input-padding-y-sm;
|
64
|
+
$form-select-padding-x-sm: $input-padding-x-sm;
|
65
|
+
$form-select-font-size-sm: $input-font-size-sm;
|
66
|
+
|
67
|
+
$form-select-padding-y-lg: $input-padding-y-lg;
|
68
|
+
$form-select-padding-x-lg: $input-padding-x-lg;
|
69
|
+
$form-select-font-size-lg: $input-font-size-lg;
|
70
|
+
|
71
|
+
$form-select-transition: $input-transition;
|
72
|
+
|
73
|
+
.form-select {
|
74
|
+
display: block;
|
75
|
+
width: 100%;
|
76
|
+
padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
|
77
|
+
// stylelint-disable-next-line property-no-vendor-prefix
|
78
|
+
-moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636
|
79
|
+
font-family: $form-select-font-family;
|
80
|
+
@include font-size($form-select-font-size);
|
81
|
+
font-weight: $form-select-font-weight;
|
82
|
+
line-height: $form-select-line-height;
|
83
|
+
color: $form-select-color;
|
84
|
+
background-color: $form-select-bg;
|
85
|
+
background-image: escape-svg($form-select-indicator);
|
86
|
+
background-repeat: no-repeat;
|
87
|
+
background-position: $form-select-bg-position;
|
88
|
+
background-size: $form-select-bg-size;
|
89
|
+
border: $form-select-border-width solid $form-select-border-color;
|
90
|
+
@include border-radius($form-select-border-radius, 0);
|
91
|
+
@include transition($form-select-transition);
|
92
|
+
appearance: none;
|
93
|
+
|
94
|
+
&:focus {
|
95
|
+
border-color: $form-select-focus-border-color;
|
96
|
+
outline: 0;
|
97
|
+
@if $enable-shadows {
|
98
|
+
@include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
|
99
|
+
} @else {
|
100
|
+
// Avoid using mixin so we can pass custom focus shadow properly
|
101
|
+
box-shadow: $form-select-focus-box-shadow;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
&[multiple],
|
106
|
+
&[size]:not([size="1"]) {
|
107
|
+
padding-right: $form-select-padding-x;
|
108
|
+
background-image: none;
|
109
|
+
}
|
110
|
+
|
111
|
+
&:disabled {
|
112
|
+
color: $form-select-disabled-color;
|
113
|
+
background-color: $form-select-disabled-bg;
|
114
|
+
border-color: $form-select-disabled-border-color;
|
115
|
+
}
|
116
|
+
|
117
|
+
// Remove outline from select box in FF
|
118
|
+
&:-moz-focusring {
|
119
|
+
color: transparent;
|
120
|
+
text-shadow: 0 0 0 $form-select-color;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
.form-select-sm {
|
125
|
+
padding-top: $form-select-padding-y-sm;
|
126
|
+
padding-bottom: $form-select-padding-y-sm;
|
127
|
+
padding-left: $form-select-padding-x-sm;
|
128
|
+
@include font-size($form-select-font-size-sm);
|
129
|
+
}
|
130
|
+
|
131
|
+
.form-select-lg {
|
132
|
+
padding-top: $form-select-padding-y-lg;
|
133
|
+
padding-bottom: $form-select-padding-y-lg;
|
134
|
+
padding-left: $form-select-padding-x-lg;
|
135
|
+
@include font-size($form-select-font-size-lg);
|
136
|
+
}
|
@@ -10,6 +10,8 @@ module Admin
|
|
10
10
|
# GET /documents
|
11
11
|
# GET /documents.json
|
12
12
|
def index
|
13
|
+
@request = "#{request.protocol}#{request.host}:#{request.port}"
|
14
|
+
|
13
15
|
query_params = {
|
14
16
|
q: params["q"],
|
15
17
|
f: params["f"],
|
@@ -18,7 +20,7 @@ module Admin
|
|
18
20
|
sort: params["sort"] || "score desc",
|
19
21
|
daterange: params["daterange"] || nil
|
20
22
|
}
|
21
|
-
@documents = BlacklightApi.new(**query_params)
|
23
|
+
@documents = BlacklightApi.new(@request, **query_params)
|
22
24
|
|
23
25
|
respond_to do |format|
|
24
26
|
format.html { render :index }
|
@@ -26,38 +28,44 @@ module Admin
|
|
26
28
|
|
27
29
|
# JSON - BTAA Aardvark
|
28
30
|
format.json_btaa_aardvark do
|
29
|
-
ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_btaa_aardvark"}),
|
31
|
+
ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_btaa_aardvark"}),
|
30
32
|
ExportJsonService)
|
31
33
|
head :no_content
|
32
34
|
end
|
33
35
|
|
34
36
|
# JSON - GBL Aardvark
|
35
37
|
format.json_aardvark do
|
36
|
-
ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_aardvark"}), ExportJsonService)
|
38
|
+
ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_aardvark"}), ExportJsonService)
|
37
39
|
head :no_content
|
38
40
|
end
|
39
41
|
|
40
42
|
# JSON - GBL v1
|
41
43
|
format.json_gbl_v1 do
|
42
|
-
ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_gbl_v1"}), ExportJsonService)
|
44
|
+
ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_gbl_v1"}), ExportJsonService)
|
45
|
+
head :no_content
|
46
|
+
end
|
47
|
+
|
48
|
+
# JSON - FILE
|
49
|
+
format.json_file do
|
50
|
+
ExportJsonBulkJob.perform_later(@request, current_user, query_params.merge!({format: "json_file"}), ExportJsonService)
|
43
51
|
head :no_content
|
44
52
|
end
|
45
53
|
|
46
54
|
# CSV - B1G
|
47
55
|
format.csv do
|
48
|
-
ExportJob.perform_later(current_user, query_params, ExportCsvService)
|
56
|
+
ExportJob.perform_later(@request, current_user, query_params, ExportCsvService)
|
49
57
|
head :no_content
|
50
58
|
end
|
51
59
|
|
52
60
|
# CSV Document Downloads - B1G
|
53
61
|
format.csv_document_downloads do
|
54
|
-
ExportJob.perform_later(current_user, query_params, ExportCsvDocumentDownloadsService)
|
62
|
+
ExportJob.perform_later(@request, current_user, query_params, ExportCsvDocumentDownloadsService)
|
55
63
|
head :no_content
|
56
64
|
end
|
57
65
|
|
58
66
|
# CSV Document Access Links - B1G
|
59
67
|
format.csv_document_access_links do
|
60
|
-
ExportJob.perform_later(current_user, query_params, ExportCsvDocumentAccessLinksService)
|
68
|
+
ExportJob.perform_later(@request, current_user, query_params, ExportCsvDocumentAccessLinksService)
|
61
69
|
head :no_content
|
62
70
|
end
|
63
71
|
end
|
@@ -65,6 +73,7 @@ module Admin
|
|
65
73
|
|
66
74
|
# Fetch documents from array of friendlier_ids
|
67
75
|
def fetch
|
76
|
+
@request = "#{request.protocol}#{request.host}:#{request.port}"
|
68
77
|
@documents = Document.where(friendlier_id: params["ids"])
|
69
78
|
|
70
79
|
respond_to do |format|
|
@@ -73,42 +82,42 @@ module Admin
|
|
73
82
|
|
74
83
|
# JSON - BTAA Aardvark
|
75
84
|
format.json_btaa_aardvark do
|
76
|
-
ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_btaa_aardvark"},
|
85
|
+
ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_btaa_aardvark"},
|
77
86
|
ExportJsonService)
|
78
87
|
head :no_content
|
79
88
|
end
|
80
89
|
|
81
90
|
# JSON - GBL Aardvark
|
82
91
|
format.json_aardvark do
|
83
|
-
ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_aardvark"},
|
92
|
+
ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_aardvark"},
|
84
93
|
ExportJsonService)
|
85
94
|
head :no_content
|
86
95
|
end
|
87
96
|
|
88
97
|
# JSON - GBL v1
|
89
98
|
format.json_gbl_v1 do
|
90
|
-
ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_gbl_v1"},
|
99
|
+
ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_gbl_v1"},
|
91
100
|
ExportJsonService)
|
92
101
|
head :no_content
|
93
102
|
end
|
94
103
|
|
95
104
|
# CSV - B1G
|
96
105
|
format.csv do
|
97
|
-
ExportJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "csv"},
|
106
|
+
ExportJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "csv"},
|
98
107
|
ExportCsvService)
|
99
108
|
head :no_content
|
100
109
|
end
|
101
110
|
|
102
111
|
# CSV Document Downloads - B1G
|
103
112
|
format.csv_document_downloads do
|
104
|
-
ExportJob.perform_later(current_user,
|
113
|
+
ExportJob.perform_later(@request, current_user,
|
105
114
|
{ids: @documents.pluck(:friendlier_id), format: "csv_document_downloads"}, ExportCsvDocumentDownloadsService)
|
106
115
|
head :no_content
|
107
116
|
end
|
108
117
|
|
109
118
|
# CSV Document Downloads - B1G
|
110
119
|
format.csv_document_access_links do
|
111
|
-
ExportJob.perform_later(current_user,
|
120
|
+
ExportJob.perform_later(@request, current_user,
|
112
121
|
{ids: @documents.pluck(:friendlier_id), format: "csv_document_access_links"}, ExportCsvDocumentAccessLinksService)
|
113
122
|
head :no_content
|
114
123
|
end
|
@@ -4,7 +4,8 @@
|
|
4
4
|
module Admin
|
5
5
|
class SearchController < Admin::AdminController
|
6
6
|
def index
|
7
|
-
@
|
7
|
+
@request = "#{request.protocol}#{request.host}:#{request.port}"
|
8
|
+
@facet_options = BlacklightApiFacets.new(@request).facets
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|
data/app/jobs/export_job.rb
CHANGED
@@ -6,8 +6,9 @@ require "csv"
|
|
6
6
|
class ExportJob < ApplicationJob
|
7
7
|
queue_as :default
|
8
8
|
|
9
|
-
def perform(current_user, query_params, export_service)
|
9
|
+
def perform(request, current_user, query_params, export_service)
|
10
10
|
logger.debug("\n\n Background Job: ♞")
|
11
|
+
logger.debug("Request: #{request.inspect}")
|
11
12
|
logger.debug("User: #{current_user.inspect}")
|
12
13
|
logger.debug("Query: #{query_params.inspect}")
|
13
14
|
logger.debug("Export Service: #{export_service.inspect}")
|
@@ -17,7 +18,7 @@ class ExportJob < ApplicationJob
|
|
17
18
|
ActionCable.server.broadcast("export_channel", {data: "Hello from Export Job!"})
|
18
19
|
|
19
20
|
# Query params into Doc ids
|
20
|
-
document_ids = query_params[:ids] || crawl_query(query_params)
|
21
|
+
document_ids = query_params[:ids] || crawl_query(request, query_params)
|
21
22
|
|
22
23
|
logger.debug("Document Ids: #{document_ids}")
|
23
24
|
|
@@ -56,15 +57,16 @@ class ExportJob < ApplicationJob
|
|
56
57
|
})
|
57
58
|
end
|
58
59
|
|
59
|
-
def crawl_query(query_params, doc_ids = [])
|
60
|
+
def crawl_query(request, query_params, doc_ids = [])
|
60
61
|
logger.debug("\n\n CRAWL Query: #{query_params}")
|
61
|
-
|
62
|
+
logger.debug("\n\n CRAWL Query Request: #{request}")
|
63
|
+
api_results = BlacklightApiIds.new(request, query_params)
|
62
64
|
logger.debug("API Results: #{api_results.results.inspect}")
|
63
65
|
|
64
66
|
doc_ids << api_results.results.pluck("id")
|
65
67
|
|
66
68
|
unless api_results.meta["pages"]["next_page"].nil?
|
67
|
-
crawl_query(query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
|
69
|
+
crawl_query(request, query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
|
68
70
|
doc_ids)
|
69
71
|
end
|
70
72
|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "csv"
|
4
|
+
|
5
|
+
# ExportJsonBulkJob
|
6
|
+
class ExportJsonBulkJob < ApplicationJob
|
7
|
+
queue_as :default
|
8
|
+
|
9
|
+
def perform(request, current_user, query_params, export_service)
|
10
|
+
logger.debug("\n\n Background Job: ♞")
|
11
|
+
logger.debug("Request: #{request.inspect}")
|
12
|
+
logger.debug("User: #{current_user.inspect}")
|
13
|
+
logger.debug("Query: #{query_params.inspect}")
|
14
|
+
logger.debug("Export Service: #{export_service.inspect}")
|
15
|
+
logger.debug("\n\n")
|
16
|
+
|
17
|
+
# Test broadcast
|
18
|
+
ActionCable.server.broadcast("export_channel", {data: "Hello from Export Job!"})
|
19
|
+
|
20
|
+
# Query params into Doc ids
|
21
|
+
document_ids = query_params[:ids] || crawl_query(request, query_params)
|
22
|
+
|
23
|
+
logger.debug("Document Ids: #{document_ids}")
|
24
|
+
|
25
|
+
# Send progress
|
26
|
+
documents = export_service.call(document_ids)
|
27
|
+
|
28
|
+
begin
|
29
|
+
# Array of JSON
|
30
|
+
@json_array = []
|
31
|
+
|
32
|
+
documents.each do |doc|
|
33
|
+
json_output = Admin::DocumentsController.render("_json_file.jbuilder",
|
34
|
+
locals: {document: doc})
|
35
|
+
|
36
|
+
json_obj = JSON.parse(json_output)
|
37
|
+
Rails.logger.debug json_obj
|
38
|
+
|
39
|
+
# Remove nil/null values from JSON
|
40
|
+
json_obj.compact!
|
41
|
+
|
42
|
+
@json_array << JSON.pretty_generate(json_obj)
|
43
|
+
|
44
|
+
rescue NoMethodError => e
|
45
|
+
Rails.logger.debug { "==== Error! - #{doc.friendlier_id} ====" }
|
46
|
+
Rails.logger.debug e.inspect
|
47
|
+
next
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Write into tempfile
|
52
|
+
@tempfile = Tempfile.new(["export-#{Time.zone.today}", ".json"]).tap do |file|
|
53
|
+
file.write("[#{@json_array.join(",")}]")
|
54
|
+
end
|
55
|
+
@tempfile.rewind
|
56
|
+
|
57
|
+
# Create notification
|
58
|
+
# Message: "Download Type|Row Count|Button Label"
|
59
|
+
notification = ExportNotification.with(message: "JSON FILE |#{ActionController::Base.helpers.number_with_delimiter(documents.size)} rows|JSON")
|
60
|
+
|
61
|
+
# Deliver notification
|
62
|
+
notification.deliver(current_user)
|
63
|
+
|
64
|
+
# Attach JSON file (can only attach after persisted)
|
65
|
+
notification.record.file.attach(io: @tempfile, filename: "geomg-export-#{Time.zone.today}.json",
|
66
|
+
content_type: "application/json")
|
67
|
+
|
68
|
+
# Update UI
|
69
|
+
ActionCable.server.broadcast("export_channel", {
|
70
|
+
data: "Notification ready!",
|
71
|
+
actions: [
|
72
|
+
{
|
73
|
+
method: "RefreshNotifications",
|
74
|
+
payload: current_user.notifications.unread.count
|
75
|
+
}
|
76
|
+
]
|
77
|
+
})
|
78
|
+
end
|
79
|
+
|
80
|
+
def crawl_query(request, query_params, doc_ids = [])
|
81
|
+
logger.debug("\n\n CRAWL Query: #{query_params}")
|
82
|
+
logger.debug("\n\n CRAWL Query Request: #{request}")
|
83
|
+
api_results = BlacklightApiIds.new(request, query_params)
|
84
|
+
logger.debug("API Results: #{api_results.results.inspect}")
|
85
|
+
|
86
|
+
doc_ids << api_results.results.pluck("id")
|
87
|
+
|
88
|
+
unless api_results.meta["pages"]["next_page"].nil?
|
89
|
+
crawl_query(request, query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
|
90
|
+
doc_ids)
|
91
|
+
end
|
92
|
+
|
93
|
+
doc_ids
|
94
|
+
end
|
95
|
+
end
|