dor-services 9.2.1 → 9.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/certs/dlss-dev-petucket-dor-dev.crt +29 -0
- data/config/certs/dlss-dev-petucket-dor-dev.csr +18 -0
- data/config/certs/dlss-dev-petucket-dor-dev.key +27 -0
- data/config/certs/dlss-dev-petucket-dor-prod.crt +29 -0
- data/config/certs/dlss-dev-petucket-dor-prod.key +27 -0
- data/config/dev_console_env.rb +89 -0
- data/lib/dor-services.rb +1 -2
- data/lib/dor/datastreams/content_metadata_ds.rb +5 -1
- data/lib/dor/datastreams/identity_metadata_ds.rb +20 -65
- data/lib/dor/datastreams/rights_metadata_ds.rb +10 -72
- data/lib/dor/datastreams/version_metadata_ds.rb +3 -3
- data/lib/dor/models/abstract.rb +3 -3
- data/lib/dor/models/admin_policy_object.rb +6 -1
- data/lib/dor/models/etd.rb +6 -4
- data/lib/dor/services/search_service.rb +3 -2
- data/lib/dor/version.rb +1 -1
- metadata +10 -5
- data/lib/dor/services/tag_service.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '00984fb52f721f76280cdedaa3c4a4d7bf99416530eccccef6d8682f6bb35b18'
|
4
|
+
data.tar.gz: 42b67e4ad809eefd062cc6ac8eaf4103f95fb5f89d4057efbc3107c51260c9ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d8fdc37e4576ac1ddf40aaa13cb718b5198e3f0803246ba42811a886bfafed1a6df14587adf1cacf145c72a677232cdc1fc431b15b026ca0f31b90afb446f19
|
7
|
+
data.tar.gz: ee3dc7f2d342b557b543261ccdf3086403b32724f18246a653538d8d37fffae6e5dc203ba46d8e21e49096323377009dc79c6012c3aa905930cea7ace85412a7
|
@@ -0,0 +1,29 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIE3zCCAscCCQCcUJVDTu7rPzANBgkqhkiG9w0BAQUFADCBvzELMAkGA1UEBhMC
|
3
|
+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFN0YW5mb3JkMRwwGgYD
|
4
|
+
VQQKExNTdGFuZm9yZCBVbml2ZXJzaXR5MRIwEAYDVQQLEwlMaWJyYXJpZXMxJTAj
|
5
|
+
BgNVBAMTHFNVTCBET1IgKGRldi90ZXN0KSBhY2Nlc3MgQ0ExLzAtBgkqhkiG9w0B
|
6
|
+
CQEWIHN1bC13ZWJtYXN0ZXJAbGlzdHMuc3RhbmZvcmQuZWR1MB4XDTEyMDkyNjAw
|
7
|
+
Mzg1OFoXDTIyMDkyNDAwMzg1OFowgaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpD
|
8
|
+
YWxpZm9ybmlhMREwDwYDVQQHEwhTdGFuZm9yZDEcMBoGA1UEChMTU3RhbmZvcmQg
|
9
|
+
VW5pdmVyc2l0eTEnMCUGA1UEAxMeZGxzcy1kZXYtcGV0dWNrZXQuc3RhbmZvcmQu
|
10
|
+
ZWR1MSQwIgYJKoZIhvcNAQkBFhVwZXR1Y2tldEBzdGFuZm9yZC5lZHUwggEiMA0G
|
11
|
+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3cqsXN6QQIMD/yqKNI+BFtPBrhV1F
|
12
|
+
hRqenXUrqDRhIE6o0WVolJC4pBVXMXZksk/cnsDkb/PrD2JZH4YTS6+B51qRvScg
|
13
|
+
cyqioPOJnPNRowogNUwkDiR4OGdKIbdRyYG+SgDuMWN/it7TqtG92KJm78imQS6S
|
14
|
+
wOtP8AnqOveMHEdmAzcANGTHCLF8SNxNqGgedXLWfpi4MSYI1io0PCA/gtrotrsL
|
15
|
+
xcwOfdkUrImaa0Og/Jyp/GAq6uveYangt3Ox3GLyyToSK4/FJXwxba9+OqR0U2MZ
|
16
|
+
qiFbXkTzGzLbx+xhfkG5Qe1eR3u1JigSjS4z3rUmvPz+MIQVQX9ZdAThAgMBAAEw
|
17
|
+
DQYJKoZIhvcNAQEFBQADggIBAH0u9ZVNGCXO6a77hTIO6vjJ0MoWzJNY4j+47Dl9
|
18
|
+
2hhDoVtw7VtV5/mKVKAiQB+Gbz/NIfkqfPgJEwyC5vr4330wIC2dMuGNFnSxGTKz
|
19
|
+
PlkZAWGUqpkfucPISwPXRgbQIMghRy+EZ05ayv1w+HlV9QGj+hbOt92jL/e1yCpH
|
20
|
+
Fd3I/7Ui26vrHqx+5Hg2d4gT2YGHTKBy8LakuoN59fw8sb+Gk0Xp/0pZMD+Sgl6T
|
21
|
+
db0HOH4lcC3qG0ZfrNJ2BwDUnzbt8cruc98iu5obnmSK39ezKsSWx6leHzWIQLLT
|
22
|
+
guNGOpbWJrNfF/VXpH9t0Q/xd0vZsOWSUkfHpd02PCBFRIWUv6UCldsDByP4IKHE
|
23
|
+
bwNa3STPwIWKq2SGE+qGkY5P6t7zqPZ+SFl4kOXUWNuspSY8v5dKFyfFexaX6p6S
|
24
|
+
bRRK5CoZq3jvxvHk88VQPTli0EP12r4SSG19UU43Twqqqd2CEW7woL3Z/OPws047
|
25
|
+
jV/e8cHA7goo5d9RKwyz/7zivUWqidnp7SeL5/YQRY2bwWOcS/y49Dmi0+FQOJCw
|
26
|
+
wjDDUv6Z+SR3NmbGtc0dIroTIWxvS7otIa+dXnH+ubrGAlbUvT1NAeO9mdX9m/qh
|
27
|
+
YHm8oRVyJD12Hylc5pmFEBbV02Lzc/D4mB3oNtSVvhNfoTZfyKqwA+kAPol6HDIb
|
28
|
+
vJi3
|
29
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,18 @@
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
2
|
+
MIIC6DCCAdACAQAwgaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
|
3
|
+
MREwDwYDVQQHEwhTdGFuZm9yZDEcMBoGA1UEChMTU3RhbmZvcmQgVW5pdmVyc2l0
|
4
|
+
eTEnMCUGA1UEAxMeZGxzcy1kZXYtcGV0dWNrZXQuc3RhbmZvcmQuZWR1MSQwIgYJ
|
5
|
+
KoZIhvcNAQkBFhVwZXR1Y2tldEBzdGFuZm9yZC5lZHUwggEiMA0GCSqGSIb3DQEB
|
6
|
+
AQUAA4IBDwAwggEKAoIBAQC3cqsXN6QQIMD/yqKNI+BFtPBrhV1FhRqenXUrqDRh
|
7
|
+
IE6o0WVolJC4pBVXMXZksk/cnsDkb/PrD2JZH4YTS6+B51qRvScgcyqioPOJnPNR
|
8
|
+
owogNUwkDiR4OGdKIbdRyYG+SgDuMWN/it7TqtG92KJm78imQS6SwOtP8AnqOveM
|
9
|
+
HEdmAzcANGTHCLF8SNxNqGgedXLWfpi4MSYI1io0PCA/gtrotrsLxcwOfdkUrIma
|
10
|
+
a0Og/Jyp/GAq6uveYangt3Ox3GLyyToSK4/FJXwxba9+OqR0U2MZqiFbXkTzGzLb
|
11
|
+
x+xhfkG5Qe1eR3u1JigSjS4z3rUmvPz+MIQVQX9ZdAThAgMBAAGgADANBgkqhkiG
|
12
|
+
9w0BAQUFAAOCAQEAdAVri6K2jyMcAJDWohxGVld7HU2ejhN1tx9+HSroK1+7f2LX
|
13
|
+
R4i06NLZI0qJA92cd5sC7T5KFG3v1Ad5gPcZfkhmH8uL0v/qNkx/vvZgF9vlUf+L
|
14
|
+
5JEyqzsMIxcRCC9gujsk9ha7oigFWbf1AxNt1KSDcIIID7nm+Tl7b/kSoOTK5z8j
|
15
|
+
/Pg8CL54paNtRQ8TDtlvdbziPn4J/Zopx0s5lpgV/pLaSkq+GPih+eV2ST1fpFzu
|
16
|
+
RQNQVZ3fa2W3Jz9m6vAtWZP1Ht7ZnLYTdSIJOo0Z2mBjcDE86JqF8bbWYt4THAgv
|
17
|
+
DIEKxWpGWz7rmTJJ5DStxFmUK6135FKatnAT4w==
|
18
|
+
-----END CERTIFICATE REQUEST-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEogIBAAKCAQEAt3KrFzekECDA/8qijSPgRbTwa4VdRYUanp11K6g0YSBOqNFl
|
3
|
+
aJSQuKQVVzF2ZLJP3J7A5G/z6w9iWR+GE0uvgedakb0nIHMqoqDziZzzUaMKIDVM
|
4
|
+
JA4keDhnSiG3UcmBvkoA7jFjf4re06rRvdiiZu/IpkEuksDrT/AJ6jr3jBxHZgM3
|
5
|
+
ADRkxwixfEjcTahoHnVy1n6YuDEmCNYqNDwgP4La6La7C8XMDn3ZFKyJmmtDoPyc
|
6
|
+
qfxgKurr3mGp4Ldzsdxi8sk6EiuPxSV8MW2vfjqkdFNjGaohW15E8xsy28fsYX5B
|
7
|
+
uUHtXkd7tSYoEo0uM961Jrz8/jCEFUF/WXQE4QIDAQABAoIBAGZR9Q/sHvxH6J5D
|
8
|
+
ncrvecYnl/nA1zdReHmEBbimByEtbfJHaTKduuLh0m1hz1F3C4hYm+pOb1RqrkZb
|
9
|
+
iOL2Uhw4uJGVWV+GHP+8mlnlSun78Efqsl9h7AGKJEJ6788Uf+NtT3uL3J1lDcgt
|
10
|
+
/PLRBDQ6BkaFEL8WD6n0jvMwlKZ2pLOsYaMx29vPVpcf/zL2B4CWr+jsm38OMRNk
|
11
|
+
WsQ0aA1XPZuJC/iS8Ky/ccvOLt3BlVVh62/L776XrKpXzAi9O/u3clak3Sel1rxt
|
12
|
+
NnTrN+hacsQp4gS1qPiKF656b6WG1tQ29r5rUMPqNltPjmVTe4m5S16NoRv/IEFQ
|
13
|
+
9thtEAECgYEA7WSSNiwbDgXRygEIRAP4M26Bvv8EQ29i7mnv5RnHObiD1y5eu/qQ
|
14
|
+
E5/VULqYcHR9C3qpDqdfFf9IVg0CjeuFatG85Jd15vDWtk5RErxLq005qzUsC0o8
|
15
|
+
AsCurdb0r6zOo5iWyjk8JwT/LAJ8Tg4JDGARcZnHk9LBbDI8i/FAvqECgYEAxdOo
|
16
|
+
9viFFblcwu9Oua/i67VNGocBgjTHNof15nhnu4Am3vR3g8wRBzjUcJLjxT+kxlMf
|
17
|
+
/YwfUSDIs9yviGv2kj8M3UPtCQ8vkzRwPnhbT9gvWxtnc0XxYNq7IVZ8x1cZeBsf
|
18
|
+
8vH6/tCnjgfsN6HP3DSqiJ5cqAjECsJq0fo03kECgYBAIs3FyQC+NyBIvSKojZH/
|
19
|
+
AzoWifty5KML2p8vfFlw5MLp3eNGUhme063kE6WfrDkkYs1N4jY0UTYP2Y/5G8p9
|
20
|
+
45BvCeSWsjawJlSNBUZET6bm9ISjwDiaXchTuyF8XOmvFUiX9gKkYBs4nqtKw0v6
|
21
|
+
hfHwiSV8cJJFUwU8ob9mQQKBgAh8MqQdNsAeyj7GOu81/xqzFRKNNeBa2Syamk5/
|
22
|
+
XZuqPICVpcauaxCPPHVzp3dfanbjO90JNJKrQFCOp6zHTLUrJScccb9Qum6q8iGL
|
23
|
+
0gbTs/xJaZ+FIXxRBXPBnOqD7uC68Rzfii+BzZ4G8vfT5fGBBMuFV14Rui7n9eL5
|
24
|
+
w2jBAoGAbh77B0kzLngbs+NmTfwjnYw5qYqwFPAYPYcu0w1wF8oTD38U8FqJ/6LG
|
25
|
+
oKaszyYODurPox81kJplNukEmSCDto1i6DJ71i8HcCfitEFXua28WD1+5Wn4o9CS
|
26
|
+
AOxLn8jHa7K6lmXZm2hgjWcSI9VGp5En79pGzrtO/d+OswVIJEc=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,29 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIE+jCCAuICCQDiT+2CJW52sTANBgkqhkiG9w0BAQUFADCBuTELMAkGA1UEBhMC
|
3
|
+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFN0YW5mb3JkMRwwGgYD
|
4
|
+
VQQKExNTdGFuZm9yZCBVbml2ZXJzaXR5MRIwEAYDVQQLEwlMaWJyYXJpZXMxHzAd
|
5
|
+
BgNVBAMTFlNVTCBET1IgcHJvZCBhY2Nlc3MgQ0ExLzAtBgkqhkiG9w0BCQEWIHN1
|
6
|
+
bC13ZWJtYXN0ZXJAbGlzdHMuc3RhbmZvcmQuZWR1MB4XDTEyMTAwODE3MDk1NVoX
|
7
|
+
DTIyMTAwNjE3MDk1NVowgcMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y
|
8
|
+
bmlhMREwDwYDVQQHEwhTdGFuZm9yZDEcMBoGA1UEChMTU3RhbmZvcmQgVW5pdmVy
|
9
|
+
c2l0eTESMBAGA1UECxMJTGlicmFyaWVzMScwJQYDVQQDEx5kbHNzLWRldi1wZXR1
|
10
|
+
Y2tldC5zdGFuZm9yZC5lZHUxMTAvBgkqhkiG9w0BCQEWImRsc3MtZGV2ZWxvcGVy
|
11
|
+
c0BsaXN0cy5zdGFuZm9yZC5lZHUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
12
|
+
AoIBAQDO3bOG2i4DZNnPTt2C6fFM3znmqHIW/n771ntWTzS8k01REksYPlxBNZ3t
|
13
|
+
M+aZFy/2lEv7PMMNg2VDDn1TRJd0hy87VW7QOTYTo1SCo2AYgn+qOnujSGqU+RRn
|
14
|
+
pM4xTGBnF5BGSXfAi++iMJyyQngF3nev5jAcy9SrwtpXrV4JyNl6LtmodtjBi/3k
|
15
|
+
LO6KY9Uc9T8zRcuiC/5zidM1+aymfoymG295aVDc+JsghjWm/UoE+Nvs20zfi+5a
|
16
|
+
JB3iL+3RyUr2Hh3N4zdxR6dar/Ivy5WfPTEmtkqiSnnhdDX6fE4f+4P3ewn7bbZN
|
17
|
+
LrH2T5Bm4W64bPsnUPP1evgidZ0LAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAJIZ
|
18
|
+
bdwEJQEOKAruCvCwxFNXQUUPzJiuYqlJ61+4Vhs7JugORo+DgNTYL/JkZ6dCR/uj
|
19
|
+
4W0TQyBtA1GtfUYvcXCrvQl51YTMAODkoWNlkP/xaHx02twIoZDsGSVAVZryP0ae
|
20
|
+
OzToLSvj+a1OvRS3YX/CO+Gq5t2//kCYrI1h6d/41PjWBRD2A2NWJrBiIj62W1qJ
|
21
|
+
muY1YvSiNZ27Pwjp0fA6QwpFY+AxUAei6jKQcUCp6q3wlFaVgMS4SKtIC/rNAAc3
|
22
|
+
2aN2dlk6u81wjKQqMKXzWhwxTqEPQAmxoP8oJVxRwh1gxoBEAbLxse76Cc9+eISn
|
23
|
+
CG0RF+bku3ceGrNYWQHGu8xOXAexM77WFSIVrtYJ2Tf/P+un8J+fvb3U8I5hOkGK
|
24
|
+
/yMIxRfpYyOx8Qg3IJ6ci6Frg2Jn1Csv7RR8vXgRqWDRrYpeRdm8VjO/MkozGp3X
|
25
|
+
r7y8hmoacnaOAcPV+KCMQ4zCobFEfxpIlajNgb4ZJhA4/ZcHlnXCr51n/A3FTLdG
|
26
|
+
MR4D2JWw9oKDrf9317IomWQd6B8/+MzBX+vFteq0xQPHVJcCh48NuRkJomfy+m2q
|
27
|
+
nMgxRTeRIN0VNFrhOxarv+Xiw9BoBAdKd1JbZX4uPVFs+DdkAcZC8aJRnmsowwfG
|
28
|
+
C5+Fxxdx+ucfga5QSZui4uyIXlx1nAy+eeTPwmDc
|
29
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpQIBAAKCAQEAzt2zhtouA2TZz07dgunxTN855qhyFv5++9Z7Vk80vJNNURJL
|
3
|
+
GD5cQTWd7TPmmRcv9pRL+zzDDYNlQw59U0SXdIcvO1Vu0Dk2E6NUgqNgGIJ/qjp7
|
4
|
+
o0hqlPkUZ6TOMUxgZxeQRkl3wIvvojCcskJ4Bd53r+YwHMvUq8LaV61eCcjZei7Z
|
5
|
+
qHbYwYv95CzuimPVHPU/M0XLogv+c4nTNfmspn6MphtveWlQ3PibIIY1pv1KBPjb
|
6
|
+
7NtM34vuWiQd4i/t0clK9h4dzeM3cUenWq/yL8uVnz0xJrZKokp54XQ1+nxOH/uD
|
7
|
+
93sJ+222TS6x9k+QZuFuuGz7J1Dz9Xr4InWdCwIDAQABAoIBAQCSt1jJrtptm8yD
|
8
|
+
JKskW2nBnJzDQ/rO5icH1EHboAeGK27trezGwAvMUAu3HVVShMiGuPz+rkSkw+lA
|
9
|
+
2vj14rMMeYh9K4WRdtIssW2Rze+s0nlbMWlZEFZPXC0lqRR4kHPbCjJQN3EQhe8q
|
10
|
+
eBHauBvKBdObVMYQ1lv6ihMzlgkZJCtRdwn6DqiN2kkFkHx4mhWoMadYA6xBwN4S
|
11
|
+
+YM5O1KwC9nUgRpLFSM8D8fBANzI6takkVDQ6QaJJ11dsur5RE9BsFzl+Op7Evzu
|
12
|
+
+zCisC17ZUn07YVvGeTUkIwTk0aeu3HCX83WM8jmg02ijtwqf6pdlLMJ8G8MQURe
|
13
|
+
siKh1ZP5AoGBAP5ZJrZ/UcGFR1XLeL6WmgljlF26LQzy/DHMBbWMYpTrwfaxk/sK
|
14
|
+
o8wTuVebJGhuffTgYU2VWJ5at7AMasOP6IAT2nP2KvcoCmvG8u3BCTkck57Vde5H
|
15
|
+
86bJ88z6TEzhrElDMjmKx7gEb2P6RIKnDcNdduaR6DE6qJOBJ5F5W3KlAoGBANA1
|
16
|
+
nKBEFEXJ4Cuw6OrJeyrgu/aCLFKus/orlfLPHFQAvFJzpqmCONz5H/Wcf+m6uMeR
|
17
|
+
MQ6V705h2y+FUmwufpFyqCVunC1zJu6mZG9TNEjXzyFBnb4jcEjsMm6DCrVA6zOx
|
18
|
+
3iWd+rLNxIpN3fhskzclNnhn+WhGo7xktuIrVDHvAoGBAPLWVVLKTllQkWIFaRu2
|
19
|
+
GA08yMuP1DFX0JcOrqi+BuUeDkslEh8N8oMGld9hnSojzBg/Hkd/fmN6Q4RO5qQe
|
20
|
+
QqH90oUCk9Tzordx9EAxHEgt03dDYFwG0Eb+68lZc/23PNGZ2Vr8+F/lxCAVMtH3
|
21
|
+
Avnyw3Gx/pj54zcpiYin8DqNAoGBAKSqcdfSX9Id6ZvES0E83Zs4p486vkEaCB8H
|
22
|
+
j4y7veS1vDrdWmbfJYelw1/lSMiaMv8qVgj6DYwJGmdH4rrKPrFbY55PD1dmpdjC
|
23
|
+
YdYlkMk3XIopsc6pimkx3GTIYJSe5iU5O762ZYo58IGNOcr6W6eWV7D8UiTlESOy
|
24
|
+
52yR5gGjAoGALfzgCSIAVlOli3a7m3aMWUtGhp+sVi7jGLE9NHTwFXnkYEoXmR+v
|
25
|
+
5CIvK8IzwtATEomoAa2GKGek8MSE+H1/o+SrGL9PIATnzuEZeJOIMnGa5mO26a9/
|
26
|
+
eV2Qud4v/7qD2P2VnCVYaAMYqS6l0SxB11/UhuQiWdpITxy44CK1Jk8=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
cert_dir = File.join(File.dirname(__FILE__), 'certs')
|
4
|
+
|
5
|
+
# rubocop:disable Metrics/BlockLength
|
6
|
+
Dor::Config.configure do
|
7
|
+
fedora do
|
8
|
+
url 'https://sul-dor-prod.stanford.edu/fedora'
|
9
|
+
end
|
10
|
+
|
11
|
+
ssl do
|
12
|
+
cert_file File.join(cert_dir, 'dlss-dev-petucket-dor-prod.crt')
|
13
|
+
key_file File.join(cert_dir, 'dlss-dev-petucket-dor-prod.key')
|
14
|
+
key_pass ''
|
15
|
+
end
|
16
|
+
|
17
|
+
sdr do
|
18
|
+
# url 'https://sdrAdmin:sdrPass@sdr-services-test.stanford.edu/sdr/'
|
19
|
+
local_workspace_root '/dor/workspace'
|
20
|
+
local_export_home '/dor/export'
|
21
|
+
datastreams do
|
22
|
+
administrativeMetadata 'optional'
|
23
|
+
contentMetadata 'optional'
|
24
|
+
descMetadata 'required'
|
25
|
+
defaultObjectRights 'optional'
|
26
|
+
events 'optional'
|
27
|
+
embargoMetadata 'optional'
|
28
|
+
identityMetadata 'required'
|
29
|
+
provenanceMetadata 'required'
|
30
|
+
relationshipMetadata 'required'
|
31
|
+
rightsMetadata 'optional'
|
32
|
+
roleMetadata 'optional'
|
33
|
+
sourceMetadata 'optional'
|
34
|
+
technicalMetadata 'optional'
|
35
|
+
versionMetadata 'required'
|
36
|
+
workflows 'optional'
|
37
|
+
geoMetadata 'optional'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
suri do
|
42
|
+
mint_ids true
|
43
|
+
id_namespace 'druid'
|
44
|
+
url 'http://sul-lyberservices-test.stanford.edu'
|
45
|
+
user 'labware'
|
46
|
+
pass 'lyberteam'
|
47
|
+
end
|
48
|
+
|
49
|
+
solr.url 'https://sul-solr-tester.stanford.edu/argo_prod'
|
50
|
+
workflow.url 'https://sul-lyberservices-prod.stanford.edu/workflow/'
|
51
|
+
dor_services.url 'https://dorAdmin:dorAdmin@sul-lyberservices-test.stanford.edu/dor'
|
52
|
+
|
53
|
+
purl do
|
54
|
+
base_url 'https://purl-test.stanford.edu/'
|
55
|
+
end
|
56
|
+
|
57
|
+
remediation do
|
58
|
+
check_for_versioning_required false # this MUST be true in production; can be false in development and test if you want to ignore workflow checks
|
59
|
+
check_for_in_accessioning false # this MUST be true in production; can be false in development and test if you want to ignore workflow checks
|
60
|
+
end
|
61
|
+
|
62
|
+
dor do
|
63
|
+
service_root 'https://dorAdmin:dorAdmin@sul-lyberservices-test.stanford.edu/dor/v1'
|
64
|
+
num_attempts 3 # the number of attempts to contact the dor web service before throwing an exception
|
65
|
+
sleep_time 2 # sleep time in seconds between attempts to contact the dor service
|
66
|
+
default_label 'Untitled' # the default label for an object that is registered when no label is provided in the manifest
|
67
|
+
end
|
68
|
+
|
69
|
+
content do
|
70
|
+
content_user 'lyberadmin'
|
71
|
+
content_base_dir '/dor/workspace/'
|
72
|
+
content_server 'lyberservices-test'
|
73
|
+
end
|
74
|
+
|
75
|
+
status do
|
76
|
+
indexer_url 'http://sulstats-raw.stanford.edu//render/?format=json&from=-1minute&until=now&target=stats.gauges.dor-prod.argo.reindexqueue.queue-size.count'
|
77
|
+
end
|
78
|
+
|
79
|
+
stacks do
|
80
|
+
document_cache_storage_root '/home/lyberadmin/document_cache'
|
81
|
+
document_cache_host 'purl-test.stanford.edu'
|
82
|
+
document_cache_user 'lyberadmin'
|
83
|
+
local_workspace_root '/dor/workspace'
|
84
|
+
storage_root '/stacks'
|
85
|
+
host 'stacks-test.stanford.edu'
|
86
|
+
user 'lyberadmin'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
# rubocop:enable Metrics/BlockLength
|
data/lib/dor-services.rb
CHANGED
@@ -29,7 +29,7 @@ module Dor
|
|
29
29
|
@logger ||= if defined?(::Rails) && ::Rails.respond_to?(:logger)
|
30
30
|
Rails.logger
|
31
31
|
else
|
32
|
-
Logger.new(
|
32
|
+
Logger.new($stdout)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -92,7 +92,6 @@ module Dor
|
|
92
92
|
autoload :OpenDataLicenseService
|
93
93
|
autoload :SearchService
|
94
94
|
autoload :SuriService
|
95
|
-
autoload :TagService
|
96
95
|
end
|
97
96
|
|
98
97
|
eager_load!
|
@@ -6,7 +6,7 @@ module Dor
|
|
6
6
|
class ContentMetadataDS < ActiveFedora::OmDatastream
|
7
7
|
set_terminology do |t|
|
8
8
|
t.root path: 'contentMetadata', index_as: [:not_searchable]
|
9
|
-
t.contentType path: '
|
9
|
+
t.contentType path: { attribute: 'type' }, index_as: [:not_searchable]
|
10
10
|
t.stacks path: '/contentMetadata/@stacks', index_as: [:not_searchable]
|
11
11
|
t.resource(index_as: [:not_searchable]) do
|
12
12
|
t.id_ path: { attribute: 'id' }
|
@@ -35,6 +35,10 @@ module Dor
|
|
35
35
|
t.shelved_file_id proxy: %i[resource shelved_file id], index_as: %i[displayable stored_searchable]
|
36
36
|
end
|
37
37
|
|
38
|
+
def self.xml_template
|
39
|
+
Nokogiri::XML.parse('<contentMetadata/>')
|
40
|
+
end
|
41
|
+
|
38
42
|
### READ ONLY METHODS
|
39
43
|
|
40
44
|
# Only use this when you want the behavior of raising an exception if anything besides exactly one matching node
|
@@ -8,6 +8,7 @@ module Dor
|
|
8
8
|
# ids for previous and current catkeys
|
9
9
|
CATKEY_TYPE_ID = 'catkey'
|
10
10
|
PREVIOUS_CATKEY_TYPE_ID = 'previous_catkey'
|
11
|
+
BARCODE_TYPE_ID = 'barcode'
|
11
12
|
|
12
13
|
set_terminology do |t|
|
13
14
|
t.root(path: 'identityMetadata')
|
@@ -69,16 +70,6 @@ module Dor
|
|
69
70
|
end
|
70
71
|
alias source_id= sourceId=
|
71
72
|
|
72
|
-
def tags
|
73
|
-
tag
|
74
|
-
end
|
75
|
-
|
76
|
-
# helper method to get just the content type tag
|
77
|
-
def content_type_tag
|
78
|
-
content_tag = tags.select { |tag| tag.include?('Process : Content Type') }
|
79
|
-
content_tag.size == 1 ? content_tag[0].split(':').last.strip : ''
|
80
|
-
end
|
81
|
-
|
82
73
|
def otherId(type = nil)
|
83
74
|
result = find_by_terms(:otherId).to_a
|
84
75
|
if type.nil?
|
@@ -154,6 +145,25 @@ module Dor
|
|
154
145
|
otherId(PREVIOUS_CATKEY_TYPE_ID)
|
155
146
|
end
|
156
147
|
|
148
|
+
def barcode
|
149
|
+
otherId(BARCODE_TYPE_ID).first
|
150
|
+
end
|
151
|
+
|
152
|
+
# Convenience method to set the barcode
|
153
|
+
# @param [String] val the new barcode
|
154
|
+
# @return [String] same value, as per Ruby assignment convention
|
155
|
+
def barcode=(val)
|
156
|
+
if val.blank? # if we are setting the barcode to blank, remove the node from XML
|
157
|
+
remove_other_Id(BARCODE_TYPE_ID)
|
158
|
+
elsif barcode.blank? # if there is no current barcode, then add it
|
159
|
+
add_other_Id(BARCODE_TYPE_ID, val)
|
160
|
+
else # if there is a current barcode, update the current barcode to the new value
|
161
|
+
update_other_Id(BARCODE_TYPE_ID, val)
|
162
|
+
end
|
163
|
+
|
164
|
+
val
|
165
|
+
end
|
166
|
+
|
157
167
|
# Helper method to get the release tags as a nodeset
|
158
168
|
# @return [Nokogiri::XML::NodeSet] all release tags and their attributes
|
159
169
|
def release_tags
|
@@ -170,61 +180,6 @@ module Dor
|
|
170
180
|
return_hash
|
171
181
|
end
|
172
182
|
|
173
|
-
def to_solr(solr_doc = {}, *args)
|
174
|
-
solr_doc = super(solr_doc, *args)
|
175
|
-
|
176
|
-
if digital_object.respond_to?(:profile)
|
177
|
-
digital_object.profile.each_pair do |property, value|
|
178
|
-
add_solr_value(solr_doc, property.underscore, value, (property =~ /Date/ ? :date : :symbol), [:stored_searchable])
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
if sourceId.present?
|
183
|
-
(name, id) = sourceId.split(/:/, 2)
|
184
|
-
add_solr_value(solr_doc, 'dor_id', id, :symbol, [:stored_searchable])
|
185
|
-
add_solr_value(solr_doc, 'identifier', sourceId, :symbol, [:stored_searchable])
|
186
|
-
add_solr_value(solr_doc, 'source_id', sourceId, :symbol, [])
|
187
|
-
end
|
188
|
-
otherId.compact.each do |qid|
|
189
|
-
# this section will solrize barcode and catkey, which live in otherId
|
190
|
-
(name, id) = qid.split(/:/, 2)
|
191
|
-
add_solr_value(solr_doc, 'dor_id', id, :symbol, [:stored_searchable])
|
192
|
-
add_solr_value(solr_doc, 'identifier', qid, :symbol, [:stored_searchable])
|
193
|
-
add_solr_value(solr_doc, "#{name}_id", id, :symbol, [])
|
194
|
-
end
|
195
|
-
|
196
|
-
# do some stuff to make tags in general and project tags specifically more easily searchable and facetable
|
197
|
-
find_by_terms(:tag).each do |tag|
|
198
|
-
(prefix, rest) = tag.text.split(/:/, 2)
|
199
|
-
prefix = prefix.downcase.strip.gsub(/\s/, '_')
|
200
|
-
unless rest.nil?
|
201
|
-
# this part will index a value in a field specific to the tag, e.g. registered_by_tag_*,
|
202
|
-
# book_tag_*, project_tag_*, remediated_by_tag_*, etc. project_tag_* and registered_by_tag_*
|
203
|
-
# definitley get used, but most don't. we can limit the prefixes that get solrized if things
|
204
|
-
# get out of hand.
|
205
|
-
add_solr_value(solr_doc, "#{prefix}_tag", rest.strip, :symbol, [])
|
206
|
-
end
|
207
|
-
|
208
|
-
# solrize each possible prefix for the tag, inclusive of the full tag.
|
209
|
-
# e.g., for a tag such as "A : B : C", this will solrize to an _ssim field
|
210
|
-
# that contains ["A", "A : B", "A : B : C"].
|
211
|
-
tag_parts = tag.text.split(/:/)
|
212
|
-
progressive_tag_prefix = ''
|
213
|
-
tag_parts.each_with_index do |part, index|
|
214
|
-
progressive_tag_prefix += ' : ' if index > 0
|
215
|
-
progressive_tag_prefix += part.strip
|
216
|
-
add_solr_value(solr_doc, 'exploded_tag', progressive_tag_prefix, :symbol, [])
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
solr_doc
|
221
|
-
end
|
222
|
-
|
223
|
-
# maintain AF < 8 indexing behavior
|
224
|
-
def prefix
|
225
|
-
''
|
226
|
-
end
|
227
|
-
|
228
183
|
private
|
229
184
|
|
230
185
|
# Convert one release element into a Hash
|
@@ -64,6 +64,7 @@ module Dor
|
|
64
64
|
'world-nd' => 'World (no-download)',
|
65
65
|
'stanford' => 'Stanford',
|
66
66
|
'stanford-nd' => 'Stanford (no-download)',
|
67
|
+
'cdl-stanford-nd' => 'Controlled Digital Lending (no-download)',
|
67
68
|
'loc:spec' => 'Location: Special Collections',
|
68
69
|
'loc:music' => 'Location: Music Library',
|
69
70
|
'loc:ars' => 'Location: Archive of Recorded Sound',
|
@@ -98,12 +99,14 @@ module Dor
|
|
98
99
|
# @param rights_xml [ng_xml] a nokogiri xml (ruby) object that represents the rights xml for a DOR object
|
99
100
|
# @param rights_type [string] a recognized rights type code ('world', 'dark', 'loc:spec', etc)
|
100
101
|
def self.upd_rights_xml_for_rights_type(rights_xml, rights_type)
|
102
|
+
# Note: The discover node is either 'none' for a dark object or 'world' for any other rights option
|
101
103
|
label = rights_type == 'dark' ? 'none' : 'world'
|
102
104
|
rights_xml.search('//rightsMetadata/access[@type=\'discover\']/machine').each do |node|
|
103
105
|
node.children.remove
|
104
106
|
node.add_child Nokogiri::XML::Node.new(label, rights_xml)
|
105
107
|
end
|
106
108
|
|
109
|
+
# The read node varies by rights option
|
107
110
|
rights_xml.search('//rightsMetadata/access[@type=\'read\']').each do |node|
|
108
111
|
node.children.remove
|
109
112
|
machine_node = Nokogiri::XML::Node.new('machine', rights_xml)
|
@@ -121,6 +124,13 @@ module Dor
|
|
121
124
|
loc_node = Nokogiri::XML::Node.new('location', rights_xml)
|
122
125
|
loc_node.content = rights_type.split(':').last
|
123
126
|
machine_node.add_child(loc_node)
|
127
|
+
elsif rights_type.start_with?('cdl')
|
128
|
+
cdl_node = Nokogiri::XML::Node.new('cdl', rights_xml)
|
129
|
+
group_node = Nokogiri::XML::Node.new('group', cdl_node)
|
130
|
+
group_node.content = 'stanford'
|
131
|
+
group_node.set_attribute('rule', 'no-download')
|
132
|
+
cdl_node.add_child(group_node)
|
133
|
+
machine_node.add_child(cdl_node)
|
124
134
|
else # we know it is none or dark by the argument filter (first line)
|
125
135
|
machine_node.add_child Nokogiri::XML::Node.new('none', rights_xml)
|
126
136
|
end
|
@@ -144,73 +154,6 @@ module Dor
|
|
144
154
|
@dra_object = nil # until TODO complete, we'll expect to have to reparse after modification
|
145
155
|
end
|
146
156
|
|
147
|
-
def to_solr(solr_doc = {}, *args)
|
148
|
-
solr_doc = super(solr_doc, *args)
|
149
|
-
dra = dra_object
|
150
|
-
solr_doc['rights_primary_ssi'] = dra.index_elements[:primary]
|
151
|
-
solr_doc['rights_errors_ssim'] = dra.index_elements[:errors] if dra.index_elements[:errors].size > 0
|
152
|
-
solr_doc['rights_characteristics_ssim'] = dra.index_elements[:terms] if dra.index_elements[:terms].size > 0
|
153
|
-
|
154
|
-
solr_doc['rights_descriptions_ssim'] = [
|
155
|
-
dra.index_elements[:primary],
|
156
|
-
|
157
|
-
(dra.index_elements[:obj_locations_qualified] || []).map do |rights_info|
|
158
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
159
|
-
"location: #{rights_info[:location]}#{rule_suffix}"
|
160
|
-
end,
|
161
|
-
(dra.index_elements[:file_locations_qualified] || []).map do |rights_info|
|
162
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
163
|
-
"location: #{rights_info[:location]} (file)#{rule_suffix}"
|
164
|
-
end,
|
165
|
-
|
166
|
-
(dra.index_elements[:obj_agents_qualified] || []).map do |rights_info|
|
167
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
168
|
-
"agent: #{rights_info[:agent]}#{rule_suffix}"
|
169
|
-
end,
|
170
|
-
(dra.index_elements[:file_agents_qualified] || []).map do |rights_info|
|
171
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
172
|
-
"agent: #{rights_info[:agent]} (file)#{rule_suffix}"
|
173
|
-
end,
|
174
|
-
|
175
|
-
(dra.index_elements[:obj_groups_qualified] || []).map do |rights_info|
|
176
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
177
|
-
"#{rights_info[:group]}#{rule_suffix}"
|
178
|
-
end,
|
179
|
-
(dra.index_elements[:file_groups_qualified] || []).map do |rights_info|
|
180
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
181
|
-
"#{rights_info[:group]} (file)#{rule_suffix}"
|
182
|
-
end,
|
183
|
-
|
184
|
-
(dra.index_elements[:obj_world_qualified] || []).map do |rights_info|
|
185
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
186
|
-
"world#{rule_suffix}"
|
187
|
-
end,
|
188
|
-
(dra.index_elements[:file_world_qualified] || []).map do |rights_info|
|
189
|
-
rule_suffix = rights_info[:rule] ? " (#{rights_info[:rule]})" : ''
|
190
|
-
"world (file)#{rule_suffix}"
|
191
|
-
end
|
192
|
-
].flatten.uniq
|
193
|
-
|
194
|
-
# these two values are returned by index_elements[:primary], but are just a less granular version of
|
195
|
-
# what the other more specific fields return, so discard them
|
196
|
-
solr_doc['rights_descriptions_ssim'] -= %w[access_restricted access_restricted_qualified world_qualified]
|
197
|
-
solr_doc['rights_descriptions_ssim'] += ['dark (file)'] if dra.index_elements[:terms].include? 'none_read_file'
|
198
|
-
|
199
|
-
solr_doc['obj_rights_locations_ssim'] = dra.index_elements[:obj_locations] unless dra.index_elements[:obj_locations].blank?
|
200
|
-
solr_doc['file_rights_locations_ssim'] = dra.index_elements[:file_locations] unless dra.index_elements[:file_locations].blank?
|
201
|
-
solr_doc['obj_rights_agents_ssim'] = dra.index_elements[:obj_agents] unless dra.index_elements[:obj_agents].blank?
|
202
|
-
solr_doc['file_rights_agents_ssim'] = dra.index_elements[:file_agents] unless dra.index_elements[:file_agents].blank?
|
203
|
-
|
204
|
-
# suppress empties
|
205
|
-
%w(use_statement_ssim copyright_ssim).each do |key|
|
206
|
-
solr_doc[key] = solr_doc[key].reject(&:blank?).flatten unless solr_doc[key].nil?
|
207
|
-
end
|
208
|
-
add_solr_value(solr_doc, 'use_license_machine', use_license.first, :string, [:stored_sortable])
|
209
|
-
add_solr_value(solr_doc, 'use_licenses_machine', use_license, :symbol, [:stored_searchable])
|
210
|
-
|
211
|
-
solr_doc
|
212
|
-
end
|
213
|
-
|
214
157
|
def use_license
|
215
158
|
use_license = []
|
216
159
|
use_license += Array(creative_commons)
|
@@ -219,11 +162,6 @@ module Dor
|
|
219
162
|
use_license.reject(&:blank?)
|
220
163
|
end
|
221
164
|
|
222
|
-
# maintain AF < 8 indexing behavior
|
223
|
-
def prefix
|
224
|
-
''
|
225
|
-
end
|
226
|
-
|
227
165
|
def rights
|
228
166
|
xml = ng_xml
|
229
167
|
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
|
@@ -112,7 +112,7 @@ module Dor
|
|
112
112
|
def current_version_id
|
113
113
|
current_version = current_version_node
|
114
114
|
if current_version.nil?
|
115
|
-
|
115
|
+
'1'
|
116
116
|
else
|
117
117
|
current_version[:versionId].to_s
|
118
118
|
end
|
@@ -157,9 +157,9 @@ module Dor
|
|
157
157
|
def current_version_closeable?
|
158
158
|
current = current_version_node
|
159
159
|
if current[:tag] && current.at_xpath('description')
|
160
|
-
|
160
|
+
true
|
161
161
|
else
|
162
|
-
|
162
|
+
false
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
data/lib/dor/models/abstract.rb
CHANGED
@@ -76,11 +76,11 @@ module Dor
|
|
76
76
|
|
77
77
|
delegate :full_title, :stanford_mods, to: :descMetadata
|
78
78
|
delegate :rights, to: :rightsMetadata
|
79
|
-
delegate :catkey, :catkey=, :source_id, :source_id=,
|
79
|
+
delegate :catkey, :catkey=, :source_id, :source_id=, :barcode, :barcode=,
|
80
80
|
:objectId, :objectId=, :objectCreator, :objectCreator=,
|
81
81
|
:objectLabel, :objectLabel=, :objectType, :objectType=,
|
82
|
-
:other_ids=, :otherId, :
|
83
|
-
|
82
|
+
:other_ids=, :otherId, :release_tags, :previous_catkeys,
|
83
|
+
to: :identityMetadata
|
84
84
|
|
85
85
|
def read_rights=(rights)
|
86
86
|
rightsMetadata.set_read_rights(rights)
|
@@ -1,13 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'deprecation'
|
4
|
+
|
3
5
|
module Dor
|
4
6
|
class AdminPolicyObject < Dor::Abstract
|
7
|
+
extend Deprecation
|
5
8
|
has_many :things, property: :is_governed_by, class_name: 'ActiveFedora::Base'
|
6
9
|
has_object_type 'adminPolicy'
|
7
10
|
has_metadata name: 'administrativeMetadata', type: Dor::AdministrativeMetadataDS, label: 'Administrative Metadata'
|
8
11
|
has_metadata name: 'roleMetadata', type: Dor::RoleMetadataDS, label: 'Role Metadata'
|
9
12
|
has_metadata name: 'defaultObjectRights', type: Dor::DefaultObjectRightsDS, label: 'Default Object Rights'
|
10
|
-
belongs_to :agreement_object, property: :referencesAgreement, class_name: 'Dor::
|
13
|
+
belongs_to :agreement_object, property: :referencesAgreement, class_name: 'Dor::Agreement'
|
11
14
|
|
12
15
|
delegate :add_roleplayer, :purge_roles, :roles, to: :roleMetadata
|
13
16
|
delegate :mods_title, :mods_title=, to: :descMetadata
|
@@ -29,11 +32,13 @@ module Dor
|
|
29
32
|
def agreement
|
30
33
|
agreement_object ? agreement_object.pid : ''
|
31
34
|
end
|
35
|
+
deprecation_deprecate agreement: 'use #agreement_object_id instead'
|
32
36
|
|
33
37
|
def agreement=(val)
|
34
38
|
raise ArgumentError, 'agreement must have a valid druid' if val.blank?
|
35
39
|
|
36
40
|
self.agreement_object = Dor.find val.to_s, cast: true
|
37
41
|
end
|
42
|
+
deprecation_deprecate :agreement= => 'use #agreement_object_id= instead'
|
38
43
|
end
|
39
44
|
end
|
data/lib/dor/models/etd.rb
CHANGED
@@ -22,10 +22,11 @@ module Dor
|
|
22
22
|
:regactiondttm, :documentaccess, :submit_date, :symphonyStatus,
|
23
23
|
datastream: 'properties', multiple: false
|
24
24
|
|
25
|
-
has_attributes :citation_verified, :abstract_provided, :
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
25
|
+
has_attributes :citation_verified, :abstract_provided, :format_reviewed,
|
26
|
+
:dissertation_uploaded, :supplemental_files_uploaded,
|
27
|
+
:permissions_provided, :permission_files_uploaded,
|
28
|
+
:rights_selected, :cc_license_selected,
|
29
|
+
:submitted_to_registrar,
|
29
30
|
datastream: 'workflow', multiple: false
|
30
31
|
|
31
32
|
has_metadata name: 'properties', type: ActiveFedora::SimpleDatastream, versionable: false do |m|
|
@@ -77,6 +78,7 @@ module Dor
|
|
77
78
|
has_metadata name: 'workflow', type: ActiveFedora::SimpleDatastream, versionable: false do |m|
|
78
79
|
m.field 'citation_verified', :string
|
79
80
|
m.field 'abstract_provided', :string
|
81
|
+
m.field 'format_reviewed', :string
|
80
82
|
m.field 'dissertation_uploaded', :string
|
81
83
|
m.field 'supplemental_files_uploaded', :string
|
82
84
|
m.field 'permissions_provided', :string
|
@@ -27,9 +27,10 @@ module Dor
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def query_by_id(id)
|
30
|
-
|
30
|
+
case id
|
31
|
+
when Hash # Single valued: { :google => 'STANFORD_0123456789' }
|
31
32
|
id = id.collect { |*v| v.join(':') }.first
|
32
|
-
|
33
|
+
when Array # Two values: [ 'google', 'STANFORD_0123456789' ]
|
33
34
|
id = id.join(':')
|
34
35
|
end
|
35
36
|
q = "{!term f=#{Solrizer.solr_name 'identifier', :symbol}}#{id}"
|
data/lib/dor/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-services
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.
|
4
|
+
version: 9.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Klein
|
@@ -20,7 +20,7 @@ authors:
|
|
20
20
|
autorequire:
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
|
-
date: 2020-
|
23
|
+
date: 2020-08-27 00:00:00.000000000 Z
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: active-fedora
|
@@ -338,14 +338,14 @@ dependencies:
|
|
338
338
|
requirements:
|
339
339
|
- - "~>"
|
340
340
|
- !ruby/object:Gem::Version
|
341
|
-
version: 0.74
|
341
|
+
version: '0.74'
|
342
342
|
type: :development
|
343
343
|
prerelease: false
|
344
344
|
version_requirements: !ruby/object:Gem::Requirement
|
345
345
|
requirements:
|
346
346
|
- - "~>"
|
347
347
|
- !ruby/object:Gem::Version
|
348
|
-
version: 0.74
|
348
|
+
version: '0.74'
|
349
349
|
- !ruby/object:Gem::Dependency
|
350
350
|
name: rubocop-rspec
|
351
351
|
requirement: !ruby/object:Gem::Requirement
|
@@ -410,7 +410,13 @@ extensions: []
|
|
410
410
|
extra_rdoc_files: []
|
411
411
|
files:
|
412
412
|
- config/certs/README
|
413
|
+
- config/certs/dlss-dev-petucket-dor-dev.crt
|
414
|
+
- config/certs/dlss-dev-petucket-dor-dev.csr
|
415
|
+
- config/certs/dlss-dev-petucket-dor-dev.key
|
416
|
+
- config/certs/dlss-dev-petucket-dor-prod.crt
|
417
|
+
- config/certs/dlss-dev-petucket-dor-prod.key
|
413
418
|
- config/config_defaults.yml
|
419
|
+
- config/dev_console_env.rb
|
414
420
|
- config/dev_console_env.rb.example
|
415
421
|
- config/predicate_mappings.yml
|
416
422
|
- lib/dor-services.rb
|
@@ -450,7 +456,6 @@ files:
|
|
450
456
|
- lib/dor/services/open_data_license_service.rb
|
451
457
|
- lib/dor/services/search_service.rb
|
452
458
|
- lib/dor/services/suri_service.rb
|
453
|
-
- lib/dor/services/tag_service.rb
|
454
459
|
- lib/dor/static_config.rb
|
455
460
|
- lib/dor/static_config/fedora_config.rb
|
456
461
|
- lib/dor/static_config/solr_config.rb
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Dor
|
4
|
-
# Manage tags on an object
|
5
|
-
class TagService
|
6
|
-
def self.add(item, tag)
|
7
|
-
new(item).add(tag)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.remove(item, tag)
|
11
|
-
new(item).remove(tag)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.update(item, old_tag, new_tag)
|
15
|
-
new(item).update(old_tag, new_tag)
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(item)
|
19
|
-
@item = item
|
20
|
-
end
|
21
|
-
|
22
|
-
# Add an administrative tag to an item, you will need to seperately save the item to write it to fedora
|
23
|
-
# @param tag [string] The tag you wish to add
|
24
|
-
def add(tag)
|
25
|
-
normalized_tag = validate_and_normalize_tag(tag, identity_metadata.tags)
|
26
|
-
identity_metadata.add_value(:tag, normalized_tag)
|
27
|
-
end
|
28
|
-
|
29
|
-
def remove(tag)
|
30
|
-
normtag = normalize_tag(tag)
|
31
|
-
tag_nodes
|
32
|
-
.select { |node| normalize_tag(node.content) == normtag }
|
33
|
-
.each { identity_metadata.ng_xml_will_change! }
|
34
|
-
.each(&:remove)
|
35
|
-
.any?
|
36
|
-
end
|
37
|
-
|
38
|
-
def update(old_tag, new_tag)
|
39
|
-
normtag = normalize_tag(old_tag)
|
40
|
-
tag_nodes
|
41
|
-
.select { |node| normalize_tag(node.content) == normtag }
|
42
|
-
.each { identity_metadata.ng_xml_will_change! }
|
43
|
-
.each { |node| node.content = normalize_tag(new_tag) }
|
44
|
-
.any?
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
attr_reader :item
|
50
|
-
def identity_metadata
|
51
|
-
item.identityMetadata
|
52
|
-
end
|
53
|
-
|
54
|
-
def tag_nodes
|
55
|
-
identity_metadata.ng_xml.search('//tag')
|
56
|
-
end
|
57
|
-
|
58
|
-
# turns a tag string into an array with one element per tag part.
|
59
|
-
# split on ":", disregard leading and trailing whitespace on tokens.
|
60
|
-
def split_tag_to_arr(tag_str)
|
61
|
-
tag_str.split(':').map(&:strip)
|
62
|
-
end
|
63
|
-
|
64
|
-
# turn a tag array back into a tag string with a standard format
|
65
|
-
def normalize_tag_arr(tag_arr)
|
66
|
-
tag_arr.join(' : ')
|
67
|
-
end
|
68
|
-
|
69
|
-
# take a tag string and return a normalized tag string
|
70
|
-
def normalize_tag(tag_str)
|
71
|
-
normalize_tag_arr(split_tag_to_arr(tag_str))
|
72
|
-
end
|
73
|
-
|
74
|
-
# take a proposed tag string and a list of the existing tags for the object being edited. if
|
75
|
-
# the proposed tag is valid, return it in normalized form. if not, raise an exception with an
|
76
|
-
# explanatory message.
|
77
|
-
def validate_and_normalize_tag(tag_str, existing_tag_list)
|
78
|
-
tag_arr = validate_tag_format(tag_str)
|
79
|
-
|
80
|
-
# note that the comparison for duplicate tags is case-insensitive, but we don't change case as part of the normalized version
|
81
|
-
# we return, because we want to preserve the user's intended case.
|
82
|
-
normalized_tag = normalize_tag_arr(tag_arr)
|
83
|
-
dupe_existing_tag = existing_tag_list.detect { |existing_tag| normalize_tag(existing_tag).casecmp(normalized_tag) == 0 }
|
84
|
-
raise "An existing tag (#{dupe_existing_tag}) is the same, consider using update_tag?" if dupe_existing_tag
|
85
|
-
|
86
|
-
normalized_tag
|
87
|
-
end
|
88
|
-
|
89
|
-
# Ensure that an administrative tag meets the proper mininum format
|
90
|
-
# @param tag_str [String] the tag
|
91
|
-
# @return [Array] the tag split into an array via ':'
|
92
|
-
def validate_tag_format(tag_str)
|
93
|
-
tag_arr = split_tag_to_arr(tag_str)
|
94
|
-
raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' must have at least 2 elements" if tag_arr.length < 2
|
95
|
-
raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' contains empty elements" if tag_arr.detect(&:empty?)
|
96
|
-
|
97
|
-
tag_arr
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|