geoblacklight_admin 0.1.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![CI](https://github.com/geobtaa/geoblacklight_admin/actions/workflows/ci.yml/badge.svg)
|
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
|
+
[![GeoBlackliht Admin](https://raw.githubusercontent.com/geobtaa/geoblacklight_admin/develop/docs/gbl_admin_screenshot.png)](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
|