From ec50ba210eb9e3c92950fc091d998ba5a3177c34 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Thu, 23 Jan 2025 15:37:23 -0500 Subject: [PATCH 01/16] fix(upload-form): Increased max content length setting to help fix large uploads failing --- invenio.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/invenio.cfg b/invenio.cfg index 1be1a872a..1a738d7d9 100644 --- a/invenio.cfg +++ b/invenio.cfg @@ -300,6 +300,8 @@ RATELIMIT_AUTHENTICATED_USER = "50000 per hour;1000 per minute" RATELIMIT_GUEST_USER = "10000 per hour;200 per minute" RATELIMIT_ENABLED = True if os.getenv("INVENIO_RATELIMIT_ENABLED") == "True" else False +MAX_CONTENT_LENGTH = (10**10) * 50 # 500 GB + # Deposit form file quota FILES_REST_DEFAULT_QUOTA_SIZE = (10**10) * 50 # 500 GB APP_RDM_DEPOSIT_FORM_QUOTA = { From 8f841927b7f805e8fb22e389d0dca931d31a3136 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Fri, 24 Jan 2025 09:41:55 -0500 Subject: [PATCH 02/16] fix(testing): Fixed run_test.sh to actually use python arguments passed through --- site/run_tests.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/run_tests.sh b/site/run_tests.sh index 97d755688..2ecfeb6a3 100644 --- a/site/run_tests.sh +++ b/site/run_tests.sh @@ -53,10 +53,10 @@ fi eval "$(PIPENV_DOTENV_LOCATION=/Users/ianscott/Development/knowledge-commons-works/site/tests/.env pipenv run docker-services-cli up --db ${DB:-postgresql} --cache ${CACHE:-redis} --search opensearch --mq ${MQ:-rabbitmq} --env)" # Note: expansion of pytest_args looks like below to not cause an unbound # variable error when 1) "nounset" and 2) the array is empty. -if [ -z "pytest_args[@]" ]; then - PIPENV_DOTENV_LOCATION=/Users/ianscott/Development/knowledge-commons-works/site/tests/.env pipenv run python -m pytest ${pytest_args[@]} -else +if [ ${#pytest_args[@]} -eq 0 ]; then PIPENV_DOTENV_LOCATION=/Users/ianscott/Development/knowledge-commons-works/site/tests/.env pipenv run python -m pytest -vv +else + PIPENV_DOTENV_LOCATION=/Users/ianscott/Development/knowledge-commons-works/site/tests/.env pipenv run python -m pytest ${pytest_args[@]} fi # python -m sphinx.cmd.build -qnN -b doctest docs docs/_build/doctest tests_exit_code=$? From be5f6b1680305f2e7d6af231347ab3df898f0888 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Fri, 24 Jan 2025 11:32:33 -0500 Subject: [PATCH 03/16] fix(build): Adding dev container build for dev branch --- .github/workflows/CI.yml | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index dc1bae75e..3a7c90ac7 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -6,6 +6,7 @@ on: # Trigger on push to main or tags matching v* push: branches: + - "dev" - "main" - "production" - "staging" @@ -54,6 +55,10 @@ jobs: if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: | echo "RELEASE_VERSION=latest" >> $GITHUB_ENV + - name: Label dev + if: github.event_name == 'push' && github.ref == 'refs/heads/dev' + run: | + echo "RELEASE_VERSION=dev" >> $GITHUB_ENV - name: Label production if: github.event_name == 'push' && github.ref == 'refs/heads/production' run: | @@ -109,16 +114,7 @@ jobs: # key: local-docker-directory - name: Build AMD Image for production or main - if: env.RELEASE_VERSION == 'production' || env.RELEASE_VERSION == 'latest' - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - run: | - docker build . --file Dockerfile --platform=linux/amd64 --tag $DOCKERHUB_REGISTRY/$DOCKERHUB_USERNAME/$IMAGE_NAME:$RELEASE_VERSION --tag $GITHUB_REGISTRY/$DOCKERHUB_USERNAME/$IMAGE_NAME:$RELEASE_VERSION --tag $ECR_REGISTRY/kcworks:$RELEASE_VERSION - docker image ls - - - name: Build AMD Image for staging - if: env.RELEASE_VERSION == 'staging' + if: env.RELEASE_VERSION == 'production' || env.RELEASE_VERSION == 'latest' || env.RELEASE_VERSION == 'dev' || env.RELEASE_VERSION == 'staging' env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} @@ -133,7 +129,7 @@ jobs: docker push $DOCKERHUB_REGISTRY/$DOCKERHUB_USERNAME/$IMAGE_NAME --all-tags - name: Push production or staging image to Amazon ECR - if: env.RELEASE_VERSION == 'production' || env.RELEASE_VERSION == 'staging' + if: env.RELEASE_VERSION == 'production' || env.RELEASE_VERSION == 'staging' || env.RELEASE_VERSION == 'dev' env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} RELEASE_VERSION: ${{ env.RELEASE_VERSION }} @@ -146,10 +142,6 @@ jobs: touch .env docker compose --file docker-compose.yml --file docker-compose.dev.yml up -d - # - name: Run unit tests - # run: | - # docker exec -it kcworks-ui bash -c "cd /opt/invenio/src/site && PIPENV_DOTENV_LOCATION=/Users/ianscott/Development/knowledge-commons-works/site/tests/.env pipenv run python -m pytest" - - name: Destroy containers if: always() run: | From 213e7f71dfcb000288ca693f5fe0508f680fd89e Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Fri, 24 Jan 2025 19:47:57 -0500 Subject: [PATCH 04/16] fix(docs): Documentation of new streamlined import api; added docs for group collections api and user data updates webhook --- docs/build/.buildinfo | 2 +- docs/build/.doctrees/README.doctree | Bin 3860 -> 3860 bytes docs/build/.doctrees/api.doctree | Bin 0 -> 268573 bytes docs/build/.doctrees/changelog.doctree | Bin 0 -> 28140 bytes docs/build/.doctrees/environment.pickle | Bin 608965 -> 1128802 bytes docs/build/.doctrees/index.doctree | Bin 5326 -> 4364 bytes docs/build/.doctrees/metadata.doctree | Bin 95397 -> 162332 bytes docs/build/README.html | 20 +- docs/build/_sources/README.md.txt | 2 +- docs/build/_sources/api.md.txt | 1228 +++++++++++ docs/build/_sources/changelog.md.txt | 85 + docs/build/_sources/index.rst.txt | 17 +- docs/build/_sources/metadata.md.txt | 355 +++- docs/build/_static/documentation_options.js | 2 +- docs/build/api.html | 2093 +++++++++++++++++++ docs/build/changelog.html | 495 +++++ docs/build/cli_commands.html | 18 +- docs/build/configuration.html | 18 +- docs/build/customizations.html | 16 +- docs/build/developing.html | 12 +- docs/build/genindex.html | 13 +- docs/build/in_depth.html | 12 +- docs/build/index.html | 55 +- docs/build/infrastructure.html | 12 +- docs/build/installation.html | 20 +- docs/build/metadata.html | 442 +++- docs/build/objects.inv | Bin 4939 -> 6567 bytes docs/build/reference.html | 12 +- docs/build/search.html | 13 +- docs/build/searchindex.js | 2 +- docs/source/api.md | 1228 +++++++++++ docs/source/conf.py | 1 + docs/source/index.rst | 1 + docs/source/metadata.md | 9 +- 34 files changed, 5957 insertions(+), 226 deletions(-) create mode 100644 docs/build/.doctrees/api.doctree create mode 100644 docs/build/.doctrees/changelog.doctree create mode 100644 docs/build/_sources/api.md.txt create mode 100644 docs/build/_sources/changelog.md.txt create mode 100644 docs/build/api.html create mode 100644 docs/build/changelog.html diff --git a/docs/build/.buildinfo b/docs/build/.buildinfo index f97579b82..d71fe766e 100644 --- a/docs/build/.buildinfo +++ b/docs/build/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c98d14472b07a7a52cb283ce05317c0a +config: c534e3803c9cb7a80e2fd2d8105eeda9 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/README.doctree b/docs/build/.doctrees/README.doctree index 4ceb6542bf0eac6e95e71ac70c160d5c1e8ace39..639fc2fbcae7dcb7966499ce9d120abea46cbc3e 100644 GIT binary patch delta 48 ycmbOtH$`qkH?y*-Zc=JVqQ#U9_Sh*IVm-oPsYS(^`FRQkdd7NCxy|dC)3^bQuMgb- delta 48 ycmbOtH$`qkH?y*_Zc=JVqS=%T_Sh*IVm-oPsYS(^`FRQkdd7NCxy|dC)3^bP_Yc(o diff --git a/docs/build/.doctrees/api.doctree b/docs/build/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5372a371309c42c5d0e35eccf60c92607e946fa2 GIT binary patch literal 268573 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 literal 0 HcmV?d00001 diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle index c5cb32e46151d1622924694e392885caf783141e..8f88abacdb906a59fc5e7352a5c9fbe0cc0fb34f 100644 GIT binary patch literal 1128802 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
-AA z=Mdh;d4o03x>J4#P?nXGeUl0d;v1qBib);U>rIWX@f%|n=dt6OeKK3!lgXzWwaidB zF6N`wtUU+TuDY2#(u0uDSUdP|`*!@GDGS{WJ|Li&>h5X=8GOXc7T4wdnQ|3 zNQ{~Ko2GWsRrc$qEUcS)A(Ox&fx;qd?{q}3+}Py3N2!rOVNm0V$m_<|JKxU z+W5aVWnta;3)uL>nF_8PPZu)-UNL0*lr`Hg6t)+VT_HJUdI#d$^fA|%vaoLYMWWv0 zUV&0QeL7PuVF@y1{QcI9zgSj$mhJkoW9IKMwVkf{H=44rZvOeg{EceOOV{)DNJ{j) zHQO(cwkN@^5F9i7psCfg;j^YJtQ&qN89wI?RlTq$)3j#tS!{ACGG^?vrk2vieyJ%7 z>&BkT#?IHWc_alag$@3GYX+Yu46en-jQ&1Ti)o|3$CQP2qt7Cv!*`4&GyjS;i_d0@ z`!ZwZ{*tM!w7LJrl!bM3FDG-4cwQX?XgauX9U4u4Va@g{*!EHZH>5xeh@Y8SQ3LTG zrYx)j!Oo;SNZevfUH&{`Yb~1AgY$bfX&fo3gMD2Db$)vybHKG^<4zSU%hq?ze`5XbVcVD`dyaf3K4t(*P+nB}2KzOUE1vLn7Hf3QQ1n!UmT|heL zRgi*&wjo1a(dVrJAv&ah3T{A!7#N>5wWJ2))21w}gE5a<#6Y=xGL5zn4MP2iH3a5! zQy{sN7lh=-%>F}Dn`yKEvndPfW?w>Pr|t)pe-M-3T)Li#1o_Q*zAcw@DI1@pqu#T0 zm!-!bm^gGY|6qqNSj)K)Tkhe9%0Ahz|?OIrjAxHNsT4|>WHb8HBg64 zSww*{2u;$_O=64LfQ8m#f=CYI5P@aS>~U`KhBDbvCln+Qax7kCt#&L=4QJgV%XdR@ z0P$w~LQ^PpZFoMjIFDQXo5VZG(2CCCta#NuL)CJlQcEMrH~DguWie#$w^_3{60wA$ zEqsk!p%JI~_BD!)Zf|KHfk#bQ=$7z^0CB2=1lA`&mBq~y2=9+xW%-xZAli@wQ9zRz zG@miGt8N@mn6j`AO-CX$BfKo&wQNK`vWC#6WQ3$bG(F;09RunIrdHNKJ!Q(mI#8D< z07V%~({xF1tQpOEfi0gMSGBb6>G%#%rA!Q<%b-!4F8p*;7S;h;Hy%KheE2|Mr!{Pl zRdyU~NRJpSTTE@L+f9cl3+u3KNr0tN^-kr>jaqRu%}esNVJ{5Pt=1sIg)OZi(mJ_X zrx;v)rnc5_9W-TO9j=W@a0Rw(>Z6tLDrwysR2_*>X?SFH`_E8!D67u;*hIqymuvXo*JdV@ne zTCo^#zcsbG2JY9UEUW{!bwc1WgP6$V<1?z1HPGCNK?^Ds1I&SDZO*LLn6j`An6yo7 zrB7ApbYyn5-x^MrPmEKm8CH*}ZFPIP(UgUCcs3-or+T@bDW>Vd!*JJ^w}wtC2_06& z6{^JA&Y-DfH8@#Q7S_SJa$IoeHrZl16FF1ev<48a@oPQv6#!{1rKT*R zAQ@~n>HR9PPh!AAYa#Zl3|MF_#EEhP7Fr9D6TpCl)*s{ zKuOb4juJEEmJgcrAUro<1I-k2liCo9N>$^zl}Fc(vwyzSt^VFC(ge zue;%di^T3Bu%*;{uVTLX8wt?gNRs|WBK0?tt-p~H`WtDZzmZz{8|kONk)rBbqd8}& zSRR1BY>V31Lu1Va!blXI5}?i$rx7WY9lcWX!Yu!pRV|n6>DuVXK)E>9TwbdTII)U+nj;rk$f?S)cs?3j5X(^Go^B=M^hRD%}dLi z_KKmOMpf#9MstQ(!N8>({DPOtulQ2%AGs`>m$~ez4ht&ENg`LcIsP})gF&J+nipp) z6=GTVDf-9e%BZO-6=kf#(|96msKPHn>MQ(;KASVxD2Jx|UM zhCXF)712d~g zC{0Zlf2ir=4>euEaKy2>hX@d&gL#(Y&ZY#_A|s z_(Ia9dFej%>05u=NTxmnv+^mX$ioI-O;e&ay^l8w&D^Dx(3Bg{`cf`t{-}Qh#Z+HN95P5xqGJM*)V)68S`|y_L99czZp9iM_n+wv%s+m#^ScA=xYWd9Q7*~?! zCE`Jt3p~7P1}$+ql8J)V17iaZj5RNV6$NW3GU}>tNdDRjQD~5b{rFqB86VBrhuGvu z2csEWA|jK<3b(RmElSPm_cGP&uyce?<_oDIQBlFoMMp;K!{w3_k=C4zC8^wqw}-RA zjPU?b_zKW$PDdBfsDpQNzI-HGu8damL&J6X*ca%r89j=MM^|Kv`80)B;YPCB9(=(K z%i@cuxrI;6pjYm>-9gO=((MRHtUPLRJ}Qf13P3KJY$$MO~4rz0d-F=rRC)$4qStg=e6 z63+#t2_pq>bVN{H@P0=m71H-_i0+}VW+rh(3dz7dka$k#9U`uB71hr#wnzA}{#Q!p z9OO&=P2o@1lkt04%ix1y#?nFeAK2q}l1^BH=)(#(&H~S6$7I(k!;1W}r01G&u{{-3 ze8=ZmlU&|RZ#zoEEX5%bmABUT8V9C8Wa zQPw0ZK&sOuhU<@V+Ek}kJk84WgltEzcSD%L9`qTMu-3uV%p>0Ea`mLsA#tGYgnmM} z0Eu@={3a=|KmxaM6Gz$olPudpJe-4S6{B9wujYOou4J+&$-JR-FuwRNvG~K$vVOfj z(z-0fZ;rgZjD&Cy>on53zI=^Dt?CsK6V85mE^gFkMA%Nss2qbqF-;@>YyBC?+CC|( z1`Ff8Rz?)i(KvpMy=*pk&+1X}LfjqRl3a{T;+)JnBJ@gE3jU6~MSk2-&CiMBzr+P3 z==y*l=5(;fxtYVtCdCPFv^t_%sZ5LZB1pr3rxSA^Y7R1>1%5$MIYm~jD36;ED;1{| zhZ{-R#RpnF07ly)I#7~YcuEf7#b8W>bxWpwq!xyq2_A-k&WHdG;vUSy>5zGdTk_ve z{MQ|)fbVghZE1))4#Nv?$~m2{4+CJ?px5Hw8!|-nfrCBNY24UCPlsj%&j zvp4)Z*vPO_#l}x5<HwJ>k-O&;V4bz;HG`N)<@i z_yR+)2$%O;+7k;P(k#~?-ZIj&;smuwovw4^2~+)gKBTnBoCg-WBk!VE_&L>7rm#+G zr7EYIVEkcHf6{s3ATDY;e^e4$NZW+RCZ&K%RVHMwUPY$!hbDp2By*iXkyVlRrT}`C zol6MlS_lE*v|T8;yhTBg^GTF?4V4Pyou~ zfd7ku&fG%je+08*i@>Z!av&%aZDc|r?p9SA8^Ppr#H3}K8?cdaWs&y^q+=00HZBH_ zc&-*OSkc0kGRKD~`XChzW*b4Fs2@qn=X9P5QSi_b6pUuhK;h_kPKEuH3!>!XR5FzQ z0mWqOPv}isrYjIU<}C$}wYKOlzVox%ju=)8n*3?35{oc6B(r`Qof6qlj1A>-3) zg^#-lCeBJQNjMM(R?&`}G?~n?Ey4U{#C+06y&&%D7SKe*B^*E!0vA*7eGbQ#ATl~1 z9nL!9V1;Z<;gNMV4d#jGTw1(=c%j%YxK*1HrjM)WakyDW zi_V5{#nnl9Nt1(#WVu=o&bu*@%u%*?kg-A`XHNda+a=LEZz2Xq#d76=$ufW<(d9d= zQJuum;o#Jj7H4>4NxbTNN!}_f+tG79fo%A4e}b36qAsex07?T%qlDyY*ryWgZXc&`xu38dr z_%`CU*yk2{0F2h;yi?e~tzel1i52~SVi}26j`4Q1KUjFO6D$_?>YwH0mm0@vU1|@O zZ)w@a5!=#WDa#*Cq5Ogq^4C7z?5AH*d}WK`Jm1GAwGh5-BMQ&+3)3Q86~CeA`asd4 zeBBwqmK(N_v1U}OV@=E(8kHO#xdI%P-i$|XQjhfek3@73u11u@&xpgk9(F_YZz#GV zpaZ4^BwTRtO*iXGl$_fqei970hOP<}L~@5ADp~c4UZzIXfUSOniq1bKe?02{7?DbE zP92utNVw=mve{gE<9_`U3LXeZWiOe;Vu{P~cewmz5t^UCnx0rxl%*&GjN@;z3ms={ zg`gXb(~18mD}RAxVpdRWQ$R5(fi{qa>sW;Iw`$;K)Bds${0@4@(oXXU))qJHMQg_EDaNiQ( zF3a`w_a~H#7==I@$kg&#hhtS}jT9Y54M`RdeSyB1VL#D9MmaYAqhP!@@Gdg=g=;Qb zGba>x(2hyyU~$yxpbN7gxb775aKycwFK{!x*6yPse&$?RK#^SmMKU?MNX;pEr?Ez! z^EwMP?2qx55#u{RYndGW0}q?ucF|@C-@JG7#UOA)KwzLcpt56;H-uP$xGxJJ7J3G( z5-LPRY?f#73jPk*U39s?UD!1#VwXWGU*7`un*!`xl%ryPsfg|YV^O5Xs8cEDOLf0- z6p8t=fMr6@fK{*`2$;b;g8{yj!N#O`3E8QTFF=+jcx0>a2W7t^T*&=E;B_X!>Okof z;wZ|R6%-5hr@6f77IU6gQFc2_g68&ye?q}vO;SBurUZS19T~D9AdoDBok7uYNHD(U zg6U?}i=o(oP_g5FG5LZt`g8|slHYq`y8wycDfbE1N>VZE%KzRt92`Ke`SgyRnHU$}<>#dHSNux3E=LKmlN1RJ9o)BN$@u zZse-~$hTs-Ttus3si(F>YKIi&NNZA|qkbVtJH~~m4k%Gxsn)=5ORbE-!1sc%1tX>8 zX)~O4!GT&KEWZuHHt(B!F^F5Q#7S=8@0Ct5E|q)*|CG!>L(G@^ZxVY5tTx41(TjSe z3@#M*weIe`rn76eWLYBPh-Lwc1|F6+kq?9Qju>kiMr6O?20~~sn3U+&Z}RjQfI*V6 z$ya;gQVRO($&IN=&2zdsyRPcozD0_CVh6;cwu$n+ zt;!2xtUMH$tKJrG(?CQRzsdYAu$+DiQ$i1oWU^(yzCFqh9m-@6_fx~!t~d?m&rnwz zQF;S*`!E_bO1TXVLM(7goUBQt{+9hM%RF`8qpH+X_q|D$gRs>~n2_QW%kV#OI)V1U zCF55S<3-XQq2Iv(_fX4bPMeVOx-!X&{CD*K{(F9y_^j+pehlnTKUA+FaPWNqs%oWE zBT}c$)EO=FvFek40zK1r;t*MJn_`qLmZ^H7?w#~+l_vn{st}haH}KSRp5$94zE}24 zSfq!FKuo6+gOQl47+zX;jA)9gVQF}W#Jqu^4s z)LKk0YUn-j*eU8ID0(JX35Q7NwdBf}@_|CPwNgk81>WL%N9hSV8JBH+v-P}Ak>!L zXe&Ql&(uyjcQ?F--(0_U6-3|ELkq+0u?rbnzd+-3Z7A;`lF84!jcXqX1I+Z{(NiBq zZZ8}AOIMSz(XOSLCRG$-*Tk*jAZQn{tF+rEnO{ywE>`aud?3UEMc9l1jn_*S-y@H0 z@$psT20$aSRm=h4a_`YARzb2j%24>!4Pd_1Ux_*p zDoMjQ7FkhU#ycsO2iwEa~(`;Wy6!k5zb1`y`R)z!WAAFx>&BqOao73T6yM zZ_Bka=Ka|l!FvN9mrXwLafm>j42bCN#OkNt2Sxl-8AT%XzjQBTr0{(IM9)LWtsx;h zJCpitZqsE96IIn&h^|`>U^N^C@)vRVO@BvP^n&4m)&s#gFoc?$Lu&2{o11!>V9(0( zKXDV}ufdZ+OGlmrX`7d!UsqonC;5Xx_qT=Zd>KQa;UR%OO3{9gN^v=?&q(e=G zN2xF-$o$aJ-a`&%Ie~}3Yo1&o+M`yA=onPt^LL@(rGaH2ernsyJ6anwQ+Q(2g1(Mk}nQ>g7b^dFkO3m_lH)6>}(z-eA32vG&en z=ss~M2De4~9U>X~4&tVcFmJQLMq zg<^!=Bnk&~hH<7DxzK}DC=&C$EM%r&v@;hu)Q2K1 zqMa9qim5nfF7r5*iN-mv4;5$~;moDy9Y*PKBb>v~L}HtnM}>H_j%^M@6AXT%i>XAt zSaAf!lcJi{-SC*0Bwp(z_`HGmOc2i;)`#}_gBKGCKEGG`M1M!0w=QH@{Qyn>MGP~W zqi;v6>)yd3i{yP~0-Bv;Qb~w2E6^8!AXI0R;jV zbO;rkeiToRSl0chXg=&cAPof_i*9|zgkbwJVtX#J$~!{Z`kjmv#JhqRh$Gh|2vLiv z^E|gGW$g(h#wW9FXVU;SUVO6FTJ-v{__$V)$;|q3)_U@#P(L>-6D1T2#w4?ldB>su z==R{hWlIOVsg%RarRNq2#RM zy`FO$M4el_@q}jdg@q%H`OQ8_;*!kRvK-7fVfB^;gE7V|ZQZjWEvb6P3qjO16IBsC zvc#f`S>$~r(kQxk*W^Wq;)+@9_etzI#}#j#yhw^DW=S_a2a+ZmQM_d$0ijr8=Kpr$ zKgn2Pb#gJOGZO3rQN%1_8jTE-k0Nd~XHuRXofw6)p~#ddFC8l!d?99yx8P%V3%*f4 z5}A|)-%ilC+x*{dr*D)9hVzHu=Q|XEGKGL}7ZE6d4W|JCA*%=@)A@-(MWDXUd;uW5OcCgiKM1c-1Uifl!mAX4j?9Dbup-b2co1Hv2y}WK zghv#Cj+=w{WLHM8|(8*d5KCB3I5*CDyDgqsH1>qBlKqps0_>>~h=~EE?LJ{aBDF~la z1UeQ9!WR^Q4ts*|H;O=qI6?T5BGB1P5Wb=abkGune^dlIFA2go6oJk@g77UxpyP`m zd`A)J1R@CER|Gmp2*N)r0v!Yd;fIPq=lMYRi6YS1JP`g(5$HS}2>+=Fblwewrxk(D zr-ATaia_VdK=^M(pi^HU{Es5g;Vck-uLyL23WSU9^BWMIb^>9#BG8#65H3>$Ixz&o zEJdIbJs`|g1UhX4!U9F0qc9*WRs=et0>UyypkpH-tW<=X944$$gtrTVqX=|V0!31a zKnEB=xKa`5gaHVf6oJkNfUs2&DB2%{ZHhn<`ylL41PZzbVHXiNSd~KPLAY8GC?+0+ zYZZaw+(EcO5h!dOguRMDQRpD_Dgp(UgK)DVP{=q4&r$>m1P9@eB2d6K2uBow0;xgh zR|E=#2H}JvQ0y`Y&rt*lGX~)g6oJBkK}ahCh30}Vpa>LA3xcNz6#ojsup&^*DhMYP zfkH|_C@BJkeu8kfB2d^S2z5oEz)BEKD*^>Zf^d%_P{1Py;pj#XUPw>yPCLaOg76|m zps+v?UZMyTx(C98ia_CZAiP`=C|C}JS1JNUwt?_!MWC275XKaNBE~>?y&_O_7zl4r zguE#7CPkq5EIjc?ia>!@AiP}>C|U}HcPavfIf3vVMWBcz5Z`6#fFjpDO|dp@8r)MW9d-5I(606x0F2rxk%hEkO9JB2d5s2%lF33Q_>! zi;6%Y2O#{dB2d5p2!F2#w9OB~R~3PF%b zTgo6jMFigCqb*_(exL}n{R_g66oK|~LHJii`0R~L_;*F1-BLX9Q$?VSOAvmp2(*(3 z!Y>tp_5nfowIa|q9tgix1ln-};ez|2DerpGmKg{aD*|nUfp7^C)bmRUi#T@h&I6ofkzftEo*xJwaeVH1R`BG3vY2!o11ON}7p6@k_bK`1H$ zt^R>fRs>qg1EH!2v^WPsLlJ0M4TLj_K#N}>JWmm5$qIyf6@eC-K)7EKXi*4+7b^m- z;DGReBG6h32rp9vS{?!66^cMh86dn$5ooyqgohP@76m|fog&b*9fU^|fo9eqJgNvZ z?*-v4ia;|`5Z)7WuuM@>znf_8lRSTkC*ay_vW*8k$&=_F(gvW6=f{QJukv^Z%(hwcTFW~GE3#c zGLkjs5w)3S_Q>dwhq&epI*CP>qEKGh<}B>CBSj*I`qKBs{t7DZw2EXRq-Aqi_y>|s zs_}12!oQ6mZU9@3RBBcD7pym9{VeeN^6>8n;t7b16c!rMAsE_r1@ooh!pJR4t4s+$ zDP?DkAnKD|8F4juE&hhZZ!AJniXsp@kpQrSnD9e6WOxM`+pYAdpC1-M1-w%|lBu3d zW8yqIb{4rr2S@yWFA(wfX*xTDh*(NMiX^{tvFk!R)yU6_AO=L3moEfv3+aUsMt2hV zROP81a9bLtq;Z%E7grD9ms!}qNOKM;BZhl3M1w}Irp&}yML;|Xizyz~G9Oz5!a^T7exqZumXRi+JO#Ce@<&XZfo$m^RO zE+fzLLF~Wyv|6z-lpbu9vJf_d4*cPQ5Y({3{lsk1Ad(i-ZfzRpH91Nc;pq=H=OZ{W zS4-nqP#Up}4P2>o@UM`BwK1UfC7{hqh{0SCu|*)xtwD0(EVCs$9kzec(A!3NUh;aniqW(CzbLDE_|@LNIaS=<0>plR}C>9-hZxG>qqsi z4;KL8gUxyJpJ`-DM${7YdNt|g*8t=S%bpx4pTQ4jho5`LSaZoRvZod)gKEg)4>o6U Qq)QzQmT^V;?t#w#2Qi#;!2kdN diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree index 927abe393f7f2c2727fa05cbe648b3c492874704..b55d87007d6a0177bfddb51abd7332068772c37a 100644 GIT binary patch delta 734 zcmX@7*`vhTz&e#ta3gCRGrxU!YEE)~ZmL2_zCuYx>f}6T2?K?a)Z~o3%;dxzg_Qi{ z(%jU%lEjkC{5-`e8SJrBG6Z|DXyQU>ntY7;JQrtjMq*xiYEFLoDK6vXOOsMF#6j^O89SxNt{jqjbW8GeL8-@|P0|pacyv(`&y>UrX<*`! z1?sYg>Vl=YUN#Bj(M+ajdw9GcPeWwWP8j YwHOqqCp(KXB!Tp?44vZ5HNruR0JX&Z8~^|S delta 1525 zcmbu9%WD%s9LF2eO}c#$TeaHS)~%pP)RkiKl0!wRRBef%Vo!Z+k}<#C?j!DlRKY%= zJ_>W&DdGcBK?U_9MFl;2@uW8qQ528<174lk?V3$WX~jc^%?r-qDb5OSWw2y#(T8 z1X}Uo_4odqyJfjwqaPdMgC~w=hmN0hU)GPfjofAT8aEqJ-B|4WIRx9UkQ8)`5qzlZ zyAf?eoC@5C)E{#rmYEyT606)033gI9-E?>V%5HiVx0~OwDQUS!_`WT$KRr)a1rB1& zc?$a6@z?;Df_Av>{*E3zwE%k|3Q0&odbrcc0gszxTH1#k9np{$TreK zGETUY@olqIElH+SG^G-RRJiAHtHaGDq!(npI5BOa3#%9KI40|=tfSRZD{d$vUDgX| znp`FRsoLSWZ$As^tdo-<6X0ZEQn=o$f}@sQAUIA(kyS;E80@0I-ZA399(YP=JaHrS zT~jzl7f{9oPGjEtt4Xp>;5ClZnSH5*2#&HGxQUKvx}?f^*(QsgT$W6o-0=3T5w8Zq^_=-T_yAvUnSIvV}7CvKc(#?%i%qy|3IiDXck5htwB-gq6_{B zWMDOnu?O0fX1|iKIk!07AULwmdpAp=+w1iaCl_jHZS;=Hd1Q%_ zUJz|5ry?uVumV+}s^F_`mhXvlE^GYACQi9XjV!-y`X0@sU>;_aAv#x%(ZRvIE@_Cp dMaye#^NXIi=s*YSbTe?kTL%ly@|(n&$RFmrBA);N diff --git a/docs/build/.doctrees/metadata.doctree b/docs/build/.doctrees/metadata.doctree index 03f0c6793f5f13fc8507816ee5f5f632a6cee108..0edefb9fb4e573c9704e9e32b6419d7db352229d 100644 GIT binary patch literal 162332 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 diff --git a/docs/build/README.html b/docs/build/README.html index d2194b852..7df9e083e 100644 --- a/docs/build/README.html +++ b/docs/build/README.html @@ -3,10 +3,10 @@ - + - About - Knowledge Commons Works 0.3.3 documentation + About - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@

@@ -190,7 +190,7 @@ diff --git a/docs/build/_sources/README.md.txt b/docs/build/_sources/README.md.txt index 54f1d04a1..c712c0776 100644 --- a/docs/build/_sources/README.md.txt +++ b/docs/build/_sources/README.md.txt @@ -2,7 +2,7 @@ Knowledge Commons Works is a collaborative tool for storing and sharing academic research. It is part of Knowledge Commons and is built on an instance of the InvenioRDM repository system. -Version 0.3.3-beta6 +Version 0.3.5-beta8 ## Copyright diff --git a/docs/build/_sources/api.md.txt b/docs/build/_sources/api.md.txt new file mode 100644 index 000000000..adac6b9b6 --- /dev/null +++ b/docs/build/_sources/api.md.txt @@ -0,0 +1,1228 @@ +# API + +KCWorks provides a robust REST API that allows clients to perform most operations on KCWorks records and collections. + +## The InvenioRDM REST API + +KCWorks is built on top of InvenioRDM, which provides a REST API for creating, managing, and querying records. This API is documented at https://inveniordm.docs.cern.ch/reference/rest_api_index/. + +> **Note:** "Collections" are referred to as "communities" in the InvenioRDM API and its documentation. To avoid confusion with the social groups that are part of the Knowledge Commons network, KCWorks uses the term "collections" in its documentation and user interface. But operations involving collections are handled via the "communities" endpoint in the InvenioRDM REST API. + +This REST API allows clients to retrieve and manage the following resources: + +| Resource | Supported Operations | Requires Authentication | Endpoint | InvenioRDM API documentation | +| -------- | ----------- | ------------- | -------- | ---------------------------- | +| draft works | read | yes | GET /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-record | +| | create | yes | POST /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-draft-record | +| | update | yes | PUT /api/records/{id} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record | +| | publish | yes | POST /api/records/{id}/draft/actions/publish | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#publish-a-draft-record | +| | delete | yes | DELETE /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-record | +| | list files | yes | GET /api/records/{id}/draft/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#list-a-drafts-files | +| | upload files[^draft-file-upload] | yes | POST /api/records/{id}/draft/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#start-draft-file-uploads | +| | view file metadata | yes | GET /api/records/{id}/draft/files/{filename} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-files-metadata | +| | download file | yes | GET /api/records/{id}/draft/files/{filename}/content | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#download-a-draft-file | +| | delete file | yes | DELETE /api/records/{id}/draft/files/{filename} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-draft-file | +| published works | read[^published-work-read] | no | GET /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-record | +| | read all versions | no | GET /api/records/{id}/versions | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-versions | +| | read latest version | no | GET /api/records/{id}/versions/latest | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-latest-version | +| | search | no | GET /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#search-records | +| | update[^published-work-update] | yes | POST /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record | +| | create new version | yes | POST /api/records/{id}/versions | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-new-version | +| | attach files from a previous version[^attach-files-from-previous-version] | yes | POST /api/records/{id}/draft/actions/files-import | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#link-files-from-previous-version | +| | list files | no | GET /api/records/{id}/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-files | +| collections | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_communities/ | +| collection memberships | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_members/ | +| reviews | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_reviews/ | +| requests | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_requests/ | +| users | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_users/ | +| groups[^groups] | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_groups/ | +| vocabularies | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_vocabularies/ | +| names | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_names/ | +| funders | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_funders/ | +| awards | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_awards/ | +| OAI-PMH sets | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_oaipmh_sets/ | +| statistics | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_statistics/ | + + +[^published-work-read]: Note that each version of a published work has its own `id`. The `read` operation retrieves the specific version whose `id` is provided. +[^published-work-update]: Published works cannot be updated directly. Rather, the update API call creates a new draft of the published work. The original version of the published work is not yet modified and remains discoverable via the search API. This draft may then be published, in which case it replaces the original published work. Note that this kind of update can only be made to the metadata of the published work, not to the files associated with it. In order to update the files associated with a published work, the client must create a new version of the work. +[^draft-file-upload]: The file upload process involves three separate API calls: + - `POST /api/records/{id}/draft/files` to start the upload process + - `POST /api/records/{id}/draft/files/{filename}/content` to upload the file's content + - `POST /api/records/{id}/draft/files/{filename}/commit` to finalize the upload and attach the file to the draft record +[^attach-files-from-previous-version]: The `files-import` operation attaches files from a previous version of a work to *the current draft* of that work. If the work already has multiple versions, clients must specify the `id` of the version whose files are to be attached. +[^groups]: Note that the `groups` managed by the `groups` API endpoint are not the same as KCWorks social groups or InvenioRDM collections. These are instead sets of users sharing a set of system permissions. (Under the hood these are wrappers around the invenio-accounts `Role` class.) This might include the "administration" group who are assigned certain admin permissions. It might also include a group who are all assigned "curator" permissions for a collection, etc. + +Note that for some operations where authentication is required, the client must also possess the appropriate permissions. (E.g., to edit a draft work, manage collection requests, etc.) + +Note that several operations are NOT possible via the REST API, including: + +- searching draft records + - Draft records are by definition not intended to be distributed, and so are not discoverable via the search API until they have been published. +- creating a published work directly + - Published works can only be created by first creating a draft work and then publishing it. +- deleting a published work + - Published works are generally considered to be permanent and so cannot be deleted. If desired, access to a published work, or a version of a published work, can be set to "restricted", in which case the work is no longer discoverable via the search API. +- modifying files for a published work + - Again, published works are generally considered to be permanent and so their files cannot be modified. The only way to update the files associated with a published work is to create a new version of the work. If desired, access to the original version of the published work can be set to "restricted", in which case only the new version and its files are discoverable. +- creating or modifying user accounts + - The REST API endpoint for users is currently read-only. It is not possible to create or modify user accounts, or change and user profile information, via the REST API. These operations are handled via the KCWorks admin interface or via CLI commands. +- creating or modifying groups (permissions) +- creating or modifying controlled vocabularies + +### Creating a new Work via the InvenioRDM REST API + +Creating a new Work via the REST API requires several steps. + +- Step 1: Create a draft record + +- Step 2: Initialize the file upload + +- Step 3: Upload the file content + - This step must be repeated for each file being added to the work. + +- Step 4: Commit the file upload + +- Step 5: Publish the draft record + +If you want the work to be included in a collection at publication time, you must submit a request for the work to be published in the collection. The first four steps are the same as above, but in place of Step 5 (publication), you must submit a request for the work to be published in the collection. + +- Step 5: Create a review request + +- Step 6: Submit review request + +If the collection in question requires review before publication, the request will not be published until the review is accepted. + +- Step 7: Accept and publish the record + +## Streamlined Import API + +In order to streamline the process of uploading works to KCWorks, particularly for works intended for publication in a collection, KCWorks provides a streamlined import API. This API allows clients to upload a work and its files in a single step, without the need to create a draft record, initialize file uploads, commit file uploads, or submit a review request. + +Why is this API needed? The InvenioRDM REST API can be fragile and difficult to use, particularly for clients who are not familiar with the system. The creation and acceptance of a review request is redundant where collection administrators are uploading works for a collection they administer. The file upload steps are also not truly stateless, introducing the possibility of a file upload being interrupted and left incomplete, even if the upload of the file's content was successful. + +### Who can use the import API? + +The import API is available to any registered active user who has obtained an OAuth token for API operations. + +If the import is to include placing the work directly in a collection, without passing through the review process, the user must have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection ("owner", "manager", "curator", "reader") depends on the collection's review policy. + +The exception to this rule is for collection owners, who may override the collection's review policy and import works directly into the collection without review. + +### The import request + +#### Request +``` +POST https://works.hcommons.org/api/import/ HTTP/1.1 +``` + +#### Required headers +``` +Content-Type: multipart/form-data +Accept: application/json +Authorization: Bearer \ +``` + +#### Request body + +This request must be made with a multipart/form-data request. The request body must include parts with following names: + +| Name | Required | Content Type | Description | +|-------|----------|--------------|-------------| +| `files` | yes | `application/octet-stream` | The (binary) file content to be uploaded. If multiple files are being uploaded, a body part with this same name ("files") must be provided for each file. If more than three or four files are being uploaded, it is recommended to provide a single zip archive containing all of the files. The files will be assigned to the appropriate work based on filename, so where multiple files are provided these **must be unique**. If a zip archive is provided, the files must be contained in a single compressed folder with no subfolders. | +| `metadata` | yes | `application/json` | An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. In addition, an array of owners for the work may optionally be provided by adding an `access.owned_by` property to each metadata object. | +| `collection` | no | `text/plain` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, the work will be placed in the collection's review queue. | +| `review_required` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the work should be reviewed before publication. This setting is only relevant if the work is intended for publication in a collection that requires review. It will override the collection's usual review policy, since the work is being uploaded by a collection administrator. (Default: "true") | +| `strict_validation` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the import request should be rejected if any validation errors are encountered. If this value is "false", the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is "true", the import request will be rejected if any validation errors are encountered. (Default: "true") | +| `all_or_none` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is "false", the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: "true") | + +The array of owners, if provided in a metadata object's `access.owned_by` property, must include at least the full name and email address of the users to be added as owners of the work. If the user already has a Knowledge Commons account, their username should also be provided. Additional identifiers (e.g., ORCID) may be provided as well to help avoid duplicate accounts, since a KCWorks account will be created for each user if they do not already have one. + +| key | required | type | description | +|-----|----------|------|-------------| +| `full_name` | yes | `string` | The full name of the user. | +| `email` | yes | `string` | The email address of the user. | +| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. | + +The resulting `owners` list should be shaped like this: + +```json +[ + { + "full_name": "John Doe", + "email": "john.doe@example.com", + "identifiers": [ + { + "identifier": "0000-0000-0000-0000", + "scheme": "orcid" + }, + { + "identifier": "jdoe", + "scheme": "kc_username" + } + ] + } +] +``` +Note that it is *not* assumed that the creators of a work should be the work's owners. The creators will only be added as owners if each of them is listed in the `access.owned_by` property of the work's metadata object. + +### A successful import response + +``` +HTTP/1.1 201 Created +Content-Type: application/json +``` + +This response will include a JSON object with the following fields: + +- `status`: The status of the import request, which will be "success" if the import request was successful. +- `data`: An array of JSON objects with the following fields: + +| key | type | description | +|-----|------|-------------| +| `record_id` | `string` | The ID of the new work. | +| `record_url` | `string` | The URL of the new work. | +| `files` | `array` | A list of the filenames for the files that were successfully uploaded. This is for convenience. Details about the files, including their size and checksum, are available in the `files` property of the `metadata` object. | +| `collection_id` | `string` | The ID of the collection to which the work was published, if any. This is provided for convenience. Details about the collection are available in the `parent.communities` property of the `metadata` object. | +| `errors` | `array` | A list of errors that occurred during the import process. These might include validation errors for certain fields in the provided metadata that did not prevent creation of the work. (Only provided if the request was made with `strict_validation` set to "false".) | +| `metadata` | `object` | The metadata for the created work, in JSON format, following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. | + +The response object will be shaped like this: + +```json +{ + "status": "success", + "data": [ + { + "item_index": 0, + "record_id": "1234567890", + "record_url": "https://works.hcommons.org/records/1234567890", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + }, + { + "item_index": 1, + "record_id": "1234567891", + "record_url": "https://works.hcommons.org/records/1234567891", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + } + ] +} +``` + +### An unsuccessful import response + +#### The token does not have the necessary permissions + +``` +HTTP/1.1 403 Forbidden +Content-Type: application/json +``` + +This response will include a JSON object: + +```json +{ + "status": "error", + "message": "The user does not have the necessary permissions." +} +``` + +#### The request metadata is malformed or invalid + +```http +HTTP/1.1 400 Bad Request +Content-Type: application/json +``` + +This response is returned when some of the provided metadata for all of the works to be imported is malformed or invalid. This indicates that *none of the works has been created* and a new request must be made with corrected metadata. This response will only be received if either +a. the `strict_validation` request parameter was set to "true" and all of the supplied metadata objects raise validation errors, or +b. the `strict_validation` parameter is set to "false", but the validation errors affected fields that are required for the works to be created. +c. the `all_or_none` request parameter is set to "true" and some of the supplied metadata objects raise validation errors. + +The response will include a JSON object with the following fields: + +```json +{ + "status": "error", + "message": "The request metadata is malformed or invalid.", + "errors": [ + { + "item_index": 0, + "errors": [ + { + "field": "title", + "message": "Required field missing." + } + ] + }, + { + "item_index": 1, + "errors": [ + { + "field": "metadata.creators.0.occupation", + "message": "Unknown field." + }, + { + "field": "metadata.publication_date", + "message": "Date is not in Extended Date Time Format (EDTF)." + } + ] + } + ] +} +``` + +If only some of the works to be imported are malformed or invalid, and the `all_or_none` request parameter is set to "false", the response will be `207 Multi-Status`. + +#### The request file upload failed + +```http +HTTP/1.1 400 Bad Request +Content-Type: application/json +``` + +If the file content is uploaded but for some reason is considered corrupted or invalid, a `400 Bad Request` response will be returned. This response will include a JSON object with the following fields: + +```json +{ + "status": "error", + "message": "The file content is corrupted or invalid.", + "errors": [ + { + "item_index": 0, + "errors": [ + { + "file": "file1.pdf", + "message": "The file size does not match the supplied metadata." + }, + { + "file": "file2.pdf", + "message": "The file checksum does not match the supplied metadata." + } + ] + }, + { + "item_index": 1, + "errors": [ + { + "file": "file3.pdf", + "message": "The file exceeds the maximum file size." + } + ] + } + ] +} +``` + +If an upload simply fails to complete and times out, the client will instead receive a `504 Gateway Timeout` response. + +#### Only some of the works to be imported failed + +```http +HTTP/1.1 207 Multi-Status +Content-Type: application/json +``` + +If the `all_or_none` request parameter is set to "false", it is possible that some of the works to be imported were successfully created and others were not. In this case, the response will be `207 Multi-Status` and will include a JSON object with the following fields: + +```json +{ + "status": "multi_status", + "data": { + "succeeded": [ + { + "item_index": 0, + "record_id": "1234567890", + "record_url": "https://works.hcommons.org/records/1234567890", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + }, + ], + "failed": [ + { + "item_index": 1, + "message": "The request metadata is malformed or invalid.", + "errors": [ + { + "field": "title", + "message": "Required field missing.", + } + ] + }, + { + "item_index": 2, + "message": "The file content is corrupted or invalid.", + "errors": [ + { + "file": "file3.pdf", + "message": "The file exceeds the maximum file size." + } + ] + } + ] + } +} +``` + +### What happens to an import request that fails? + +If all steps of an import request do not complete successfully, the work will not be created. The files that were successfully uploaded will be deleted, and any draft record created as part of the import request will be deleted. The client may attempt the import request again. + +### Making duplicate import requests + +Note that it is possible to make duplicate import requests *unless* the work to be imported includes a pre-existing DOI identifier or some other unique identifier that has already been registered in KCWorks. In this case, the import request will be rejected with a `409 Conflict` response code and a `Location` header pointing to the existing work. + +In the absence of such a unique identifier, however, KCWorks will not try to detect duplicate works based on the metadata, file name, or file content. If the same work is imported multiple times without a pre-existing unique identifier, it will be created multiple times in KCWorks and each version will be assigned a newly minted DOI. + + +## Group Collections API + +``` +https://works.hcommons.org/api/group_collections +``` + +The `group_collections` REST API endpoint allows a client to create, read, modify, or delete a collection in KCWorks owned and administered by a Knowledge Commons group. GET requests to retrieve information about group collections are open to all clients. POST, PUT, and DELETE requests are secured by an oauth token that must be obtained from the Knowledge Commons Works administrator. + +This endpoint is not configured to receive all of the metadata required to create or modify group collections. Rather, the `group_collections` endpoint receives minimal signals from a Commons Instance and then obtains the full required metadata via an API callback to the Commons instance. + +> [!NOTE] +> KCWorks uses the term "collection" in place of the default term "community" employed in other InvenioRDM installations. This is partly to accommodate exactly the integration with Knowledge Commons groups that is discussed here. + + +### Group collection owner + +InvenioRDM does not allow groups to be owners of a collection (community). When a collection is created for a group, though, we do not know which of the group's administrators to assign as the individual owner. It is also awkward to change ownership of a collection later on if the group's administrativer personnel change. So the collection is owned by an administrative user who is assigned the role `group-collections-owner`. The group's administrators are then assigned privileges as "managers" of the group collection. This allows them to manage the collection's settings and membership, but not to delete the collection or change its ownership. + +Before the invenio_group_collections_kcworks module can be used, the administrator must create a role called `group-collections-owner` and assign membership in that role to one administrative user account. If multiple user accounts belong to that role, the first user account in the list will be assigned as the owner of group collections. If no user accounts belong to the role, the group collection creation will fail with a NoOwnerAvailable error. + +### Endpoint configuration + +The configuration variable `GROUP_COLLECTIONS_METADATA_ENDPOINTS` must be provided in the `invenio.cfg` file in order to use this endpoint. This variable should hold a dictionary whose keys are Commons instance names. The value for each key is a dictionary containing the following keys: + +| key | value type | required | value | +| --- | ---------- | ----- | ----- | +| `url` | str | Y | The url on the Commons instance where a GET request can retrieve the metadata for a group. The url should include the placeholder `{id}` where the Commons instance id for the requested group should be placed. | +| `token_name` | str (upper case) | Y | The name of the environment variable that will hold the authentication token for requests to the Commons instance url for retrieving group metadata. | +| `placeholder_avatar` | str | N | The filename or last url component that identifies a placeholder avatar in the avatar image url supplied for the Commons group avatar. | + +A typical configuration might look like the following: + +```python +GROUP_COLLECTIONS_METADATA_ENDPOINTS = { + "knowledgeCommons": { + "url": "https://hcommons-dev.org/wp-json/commons/v1/groups/{id}", + "token_name": "COMMONS_API_TOKEN", + "placeholder_avatar": "mystery-group.png", + }, +} +``` + +### Retrieving Group Collection Metadata (GET) + +A GET request to this endpoint will retrieve metadata on Invenio collections +that are owned by a Commons group. A request to the bare endpoint without a +group ID or collection slug will return a list of all collections owned by +all Commons groups. (Commons Works collections not linked to a Commons group will not be included. If you wish to query all groups, please use the `communities` API endpoint.) + +#### Query parameters + +Four optional query parameters can be used to filter the results: + +| Parameter name | Description | +| ---------------|------------ | +| `commons_instance` | the name of the Commons instance to which the group belongs. If this parameter is provided, the response will only include collections owned by groups in that instance. | +| `commons_group_id` | the ID of the Commons group. If this parameter is provided, the response will only include collections owned by that group. | +| `collection` | the slug of the collection. If this parameter is provided, the response will include only metadata for that collection. | +| `page` | the page number of the results | +| `size` | the number of results to include on each page | +| `sort` | the kind of sorting applied to the returned results | + +#### Sorting + +The `sort` parameter can be set to one of the following sort types: + +| Field name | Description | +| -----------|-------------| +| newest | Descending order based on `created` date | +| oldest | Ascending order based on `created` date | +| updated-desc | Descending order based on `updated` date | +| updated-asc | Ascending order based on `updated` date | + +By default the results are sorted by `updated-desc` + +#### Pagination + +Long result sets will be paginated. The response will include urls for the `first`, `last`, `previous`, and `next` pages of results in the `link` property of the response body. A url for the current page of results will also be included in the list as a `self` link. By default the page size is 25, but this can be changed by providing a value for the `size` query parameter. + +#### Requesting all collections + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections HTTP/1.1 +``` + +##### Successful Response Status Code + +`200 OK` + +##### Successful response body + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 50, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 50, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 100, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 100, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections", + "first": "https://works.hcommons.org/api/group_collections?page=1", + "last": "https://works.hcommons.org/api/group_collections?page=10", + "prev": "https://works.hcommons.org/api/group_collections?page=1", + "next": "https://works.hcommons.org/api/group_collections?page=2", + } + "sortBy": "newest", + "order": "ascending", +} +``` + +##### Successful Response Headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | + +#### Requesting collections for a Commons instance + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&sort=updated-asc HTTP/1.1 +``` + +##### Successful response status code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 45, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 45, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 90, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 90, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons", + "first": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1", + "last": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=9", + "prev": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1", + "next": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=2", + } + "sortBy": "updated-asc", +} +``` + +##### Successful response headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Link | `; rel="first", ; rel="last", ; rel="prev", ; rel="next"` | + + +#### Requesting collections for a specific group + +Note that if you specify a `commons_group_id` value, you must *also* provide a `commons_instance` value. This is to avoid confusion if different Commons instances use the same internal id for groups. + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1 +``` + +##### Successful response status code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 2, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 2, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 4, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 2, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 4, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections", + "first": "https://works.hcommons.org/api/group_collections?page=1", + "last": "https://works.hcommons.org/api/group_collections?page=1", + "prev": "https://works.hcommons.org/api/group_collections?page=1", + "next": "https://works.hcommons.org/api/group_collections?page=1", + } + "sortBy": "newest", +} +``` + +##### Successful response headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | + +#### Requesting a specific collection + +While other kinds of requests require query parameters, a request for metadata on a specific Commons Works collection can be made by simply adding the community's slug to the end of the url path. Once again, this will only succeed for collections that are linked to a Commons instance group. Collections that exist independently on Knowledge Commons Works will not be found at the `group_collections` endpoint and should be requested at the `communities` endpoint instead. + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1 +``` + +##### Successful Response Status Code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for pandas research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } +} +``` + +### Creating a Collection for a Group (POST) + +A POST request to this endpoint creates a new collection in Invenio owned by the specified Commons group. If the collection is successfully created, the response status code will be 201 Created, and the response body will be a JSON object containing the URL slug for the newly created collection. + +The POST request will trigger a callback to the Commons instance to get the metadata for the specified group, using the configuration dictionary declared in the `GROUP_COLLECTIONS_METADATA_ENDPOINTS` config variable, under the key matching the Commons instance's SAML IDP provider name (declared in the `SSO_SAML_IDPS` config variable). This callback request will be sent to the "url" specified in the configuration dictionary (e.g., `GROUP_COLLECTIONS_METADATA_ENDPOINTS["knowledgeCommons"]["url"]`). This request will be authenticated using the environment variable whose name matches the `token_name` from the same configuration dictionary. The metadata from this callback request will then be used to populate the collection metadata in Invenio. + +If the metadata returned from the Commons instance includes a url for an avatar, that avatar will be downloaded and stored in the Invenio instance's file storage. Since we do not want to use a placeholder avatar for the group, the instance's configuration can include a `placeholder_avatar` key. If the file name or last segment of the supplied avatar url matches this `placeholder_avatar` value, it will be ignored. + +#### Permissions and access in newly created collections + +By default, the newly created collection will have the following access settings: + +- Visibility: "public" +- Member visibility: "public" +- Member policy: "closed" +- Record policy: "closed" +- Review policy: "closed" + +They will appear in search results and be visible to non-members of the collection. But users who are not group members will not be able to request membership, and all submissions to the group will be held for review by the collection curators. + +The collection's administrators can change these settings in the collection's settings page. + +#### Handling group name changes + +Note that when a collection is created for a group, the collection's slug will be generated from the group's name. If the group's name is changed in the Commons instance, the collection's slug will not be automatically updated. This is to avoid breaking links to the collection. If the group's name is changed, the collection's slug will remain the same, but the collection's metadata will be updated to reflect the new group name. + +#### Handling collection name collisions + +It is possible for two groups on Commons instances to share the same human readable name, even though their ids are different. Knowledge Commons Works *will* allow multiple collections to share identical human readable names, but group url *slugs* must be unique across all KC Works collections. So where group names collide, only the first of the identically-named collections will have its slug generated normally. Susequent collections with the same name will have a numerical disambiguator appended to the end of their slugs. So if we have three groups named "Panda Studies," the first collection created for one of the groups will have the slug `panda-studies`. The other collections created by these groups will be assigned the slugs `panda-studies-1` and `panda-studies-2`, in order of their creation in Knowledge Commons Works. + +#### Handling deleted group collections + +If a group collection is deleted, its slug will be reserved in the Invenio PID store and cannot be re-used for a new collection. If a new collection is created for the same group, the slug will have a numerical disambiguator appended to the end, exactly as in cases of group name collision. E.g., if the group `panda-studies` were deleted earlier, a request to create a new collection for the "Panda Studies" group would be assigned the URL slug `panda-studies-1`. This is to avoid breaking links to the deleted collection. + +In future it may be possible to restore deleted collections, but this is not currently implemented. + + +#### Request + +```http +POST https://works.hcommons.org/api/group_collections HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Request body + +The request body must be a JSON object with the following fields: + +| Field name | Required | Description | +| -----------|----------|-------------| +| `commons_instance` | Y | The name of the Commons instance to which the group belongs. This must be the same string used to identify the instance in the `GROUP_COLLECTIONS_METADATA_ENDPOINTS` config variable. | +| `commons_group_id` | Y | The ID of the Commons group that will own the collection. | +| `collection_visibility` | N | The visibility setting for the collection to be created. Must be either "public" or "restricted". [default: "restricted"]| + +The resulting request body will be shaped like this: + +```json +{ + "commons_instance": "knowledgeCommons", + "commons_group_id": "12345", + "collection_visibility": "public", +} +``` + + +#### Successful response status code + +`201 Created` + +#### Successful response body + +```json +{ + "commons_group_id": "12345", + "collection_slug": "new-collection-slug" +} +``` + +#### Unsuccessful response codes + +- 400 Bad Request: The request body is missing required fields or contains + invalid data. +- 404 Not Found: The specified group could not be found by the callback to the Commons instance. +- 403 Forbidden: The request is not authorized to modify the collection. +- 409 Conflict: A collection already exists in Knowledge Commons Works linked to the specified group. + +### Changing the Group Ownership of a Collection (PATCH) + +[!WARNING] +PATCH requests to change group ownership of the collection are not yet implemented. + +A PATCH request to this endpoint modifies an existing collection in Invenio by changing the Commons group to which it belongs. This is the *only* modification that can be made to a collection via this endpoint. Other modifications to Commons group metadata should be handled by signalling the Invenio webhook for commons group metadata updates. Modifications to internal metadata or settings for the Invenio collection should be made view the Invenio "communities" API or the collection settings UI. + +Note that the collection memberships in Invenio will be automatically transferred to the new Commons group. The corporate roles for the old Commons group will be removed from the collection and corporate roles for the new Commons group will be added to its membership with appropriate permissions. But any individual memberships that have been granted through the Invenio UI will be left unchanged. If the new collection administrators wish to change these individual memberships, they will need to do so through the Invenio UI. + +#### Request + +```http +PATCH https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Request body + +```json +{ + "commons_instance": "knowledgeCommons", + "old_commons_group_id": "12345", + "new_commons_group_id": "67890", + "new_commons_group_name": "My Group", + "collection_visibility": "public", +} +``` + +#### Successful response status code + +`200 OK` + +#### Successful response body + +```json +{ + "collection": "my-collection-slug" + "old_commons_group_id": "12345", + "new_commons_group_id": "67890", +} +``` + +#### Unsuccessful response codes + +- 400 Bad Request: The request body is missing required fields or contains + invalid data. +- 404 Not Found: The collection does not exist. +- 403 Forbidden: The request is not authorized to modify the collection. +- 304 Not Modified: The collection is already owned by the specified + Commons group. + +### Deleting a Group's Collection (DELETE) + +A DELETE request to this endpoint deletes a collection in Invenio owned by the specified Commons group. Note that the request must include all of: + +- the collection slug as the url path parameter +- the identifier of the Commons instance to which the group belongs, in the `commons_instance` query parameter +- the Commons identifier of the group which owns the collection, in the `commons_group_id` query parameter + +If any of these is missing the request will fail with a `400 Bad Request` error. This is to ensure that collections are not deleted accidentally or by agents without authorization. + +If the collection is successfully deleted, the response status code will be 204 No Content. + +[!NOTE] +Once a group collection has been deleted, its former URL slug is still registered in Invenio's PID store and reserved for the (now deleted) collection. Subsequent requests to create a collection for the same group cannot re-use the same URL slug. Instead the new slug will have a numerical disambiguator added to the end, exactly as in cases of group name collision. E.g., if the group `panda-studies` were deleted earlier, a request to create a new collection for the "Panda Studies" group would be assigned the URL slug `panda-studies-1`. + +[!NOTE] +Group collections are soft deleted and can in principle be restored within a short period after the delete signal has been sent. Eventually, though, the soft deleted collection records will be +automatically purged entirely from the database. There is also no API mechanism for restoring them. So delete operations should be regarded as permanent and irrevocable. + +#### Request + +```http +DELETE https://works.hcommons.org/api/group_collections/my-collection-slug?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Successful response status code + +`204 No Content` + +#### Unsuccessful response codes + +- 400 Bad Request: The request did not include the required parameters or the parameters are not well formed. +- 403 Forbidden: The requesting agent is not authorized to delete the collection. The collection may not belong to the Commons instance making the request, or it may not belong to the specified Commons group. +- 404 Not Found: The collection does not exist. +- 422 UnprocessableEntity: The deletion could not be performed because the + + +## User and Group Data Updates (Internal Only) + +``` +https://works.hcommons.org/api/webhooks/user_data_update +``` + +> [!WARNING] +> This API endpoint is intended for internal use only. It is not intended to be used by clients outside of the Knowledge Commons system. + +> [!NOTE] +> This API was implemented with a distributed network of independent Commons instances in mind. Currently, only the Knowledge Commons instance exists and is supported as a SAML IDP by KCWorks. + +The api endpoint `/api/webhooks/user_data_update` is provided for Knowledge Commons applications and instances to signal that user or group metadata has been changed. These endpoints do not receive the actual updated data. They only receive notices *that* the metadata for a user or group has changed. KCWorks will then query the Commons instance's endpoint to retrieve current metadata for the user or group. + +### User/Groups Metadata updates and SAML authentication + +It is assumed that Commons instances have registered a SAML authentication IDP with KCWorks. The Commons identifiers for users in metadata update signals must be the same identifiers provided by the instance's SAML IDP. This allows KCWorks to reliably identify the correct KCWorks user account, even if the same identifier happens to be used internally by multiple Commons instances. It also allows KCWorks to store Commons instance user ids in one central place within KCWorks, minimizing the chances of those links between a Commons instance user account and a KCWorks user account becoming corrupted. + +### GET requests + +A `GET` request to this endpoint can be used to check that the endpoint is available and receiving messages. The response should have a `200` status code and should carry the following JSON response body: + +```json +{ + "message": "Webhook receiver is active", + "status": 200, +} +``` + +### POST requests +#### Payload objects + +Update notices should be sent via a `POST` request with a JSON payload object shaped like this: + +```json +{ + "idp": "knowledgeCommons", + "updates": { + "users": [ + {"id": "myusername", "event": "updated"}, + {"id": "anotherusername", "event": "created"}, + ], + "groups": [{"id": "1234", "event": "updated"}], + }, +}, +``` + +Top level payload object properties: + +| Property | Type | Description | Required | +| --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `idp` | string | The name used by KCWorks to identify the identity provider the Commons instance has registered with KCWorks. This id should have been provided by the KCWorks administrators when the Commons instance's IDP connection was established. For Knowledge Commons the value is `knowledgeCommons` | Y | +| `updates` | object | This object identifies the metadata updates that have taken place on the Commons instance. It allows updates of different kinds and for multiple entities to be signalled in a single request. Its properties are described below. | Y | + +`updates` object properties: + +| Property | Type | Description | Required | +| -------- | ----- | ----------------------------------------------------------------------------------- | -------- | +| `users` | array | An array of objects each representing one metadata change event for a single user. | N | +| `groups` | array | An array of objects each representing one metadata change for a single group. | N | + +NOTE: A valid payload *must* provide either a `users` array or a `groups` array with at least one member. Requests providing neither `users` nor `groups`, or providing only empty arrays, will result in an error response. + +`users` and `groups` object properties + +| Property | Type | Description | Required | +| -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `id` | number | The local identifier of the user or group on the Commons instance. This must be the same identifier that can be used to retrieve the entity's metadata at the corresponding endpoint on the Commons instance. | Y | +| `event` | string | The nature of the metadata change for the entity. Must be one of `updated`, `created`, or `deleted`. The `updated` and `deleted` event types should be sent when an entity is first created or is deleted entirely from the Commons instance. These will trigger the creation or deletion of corresponding entities (a user or a group) on KC Works. All other metadata changes are `updated` events. | Y | + +NOTE: A valid payload's user and/or group objects must each include *both* an `id` *and* an `event` value. + +#### Event timing + +There may be some delay between KC Works' receiving an update signal and the updating of the corresponding entity's metadata in KC Works. The actual updates are handled by background workers and in some cases there may be a slight delay before a worker is free. Usually this will only be a fraction of a second, but if intensive background tasks (like indexing) are ongoing it could be several minutes. The update also depends on a successful callback request from KC Works to the Commons instance's endpoint for serving user or group metadata. If that request fails, it is possible for an update to fail even though the webhook signal was received successfully. + +#### Success responses + +If a signal is received successfully, the response will have a status of `202` and carry a JSON response object shaped like this: + +```json +{ + "message": "Webhook received", + "status": 202, + "updates": { + "users": [ + {"id": "myusername", "event": "updated"}, + {"id": "anotherusername", "event": "created"}, + ], + "groups": [{"id": "1234", "event": "updated"}], + } +} +``` + +The `updates` object should be identical to the `updates` object provided in the `POST` request. This confirms that the correct events have all been received and are being sent for processing. + +#### Error responses + +If multiple update signals are received in one `POST` request, it is possible that only some of the updates can be processed. The request might, for example, provide `updated` event signals for a number of entities, some of whose ids do not exist in KC Works. In this case the response code will be `207 Multi-Status` and the response payload will be a JSON object + + diff --git a/docs/build/_sources/changelog.md.txt b/docs/build/_sources/changelog.md.txt new file mode 100644 index 000000000..6f876f44d --- /dev/null +++ b/docs/build/_sources/changelog.md.txt @@ -0,0 +1,85 @@ + + + + +# Changes + +## 0.3.5-beta8 (2025-01-10) + +- Dashboard works search + - Fixed the bug that broke works searching from the dashboard. + +## 0.3.4-beta7 (2025-01-09) + +- Upload form collection selector + - Fixed bug in collection selection modal where search results were always sorted by "newest" instead of "bestmatch" and so were useless for large result sets (original fix only worked in detail page) +- Documentation + - Moved documentation from README.md and site/CHANGES.md into a static documentation site to be served by Github Pages. + - Added more documentation for cli commands, metadata/identifiers/vocabularies, installation, and version control. +- Build system + - Pinned the version of invenio-logging to less than 2.1.2 to avoid a webpack build conflict. + +## 0.3.3-beta6 (2024-12-18) + +- Names + - Added the infrastructure to customize the division of users' names into parts so that it can be divided as desired when, e.g., the user's name is being auto-filled in the name fields of the upload form. This involves + - a new "name_parts_local" field to the user profile schema. This field contains the user's name parts if they have been modified within the KCWorks system. This is sometimes necessary when the user data synced from the remote user data service does not divide the user's name correctly. + - a cli command to update the user's name parts. + - a new "names" js module that contains functions to get the user's full name, full name in inverted order, family name, and given name from the user's name parts. + - updates to the CreatibutorsField component to use the new "names" js module and the customized name parts if they are present in a user's profile. +- Detail page + - Added missing aria-label properties for accessibility +- Collections + - Fixed wording of empty results message for collection members search + - Previously, the empty results message used "community" instead of "collection". + - Tweaks to layout of collection detail page header +- Remote user data service + - Fixed bug where user profile data was not being updated because comparison with initial data was not being made correctly. This means that, among other things, ORCID ids will now be added correctly when the user chooses "add self" on the upload form. + +## 0.3.2-beta5 (2024-12-11) + +- Added Bluesky sharing option to detail page +- Fixed line wrapping of long values in record sidebar details +- Added OpenGraph image metadata property to record detail page + - This allows social media platforms to display the KCWorks logo instead of a random image they might find on the page. + +## 0.3.1-beta4 (2024-12-10) + +- Added sort options for publication date to record search + - This allows users to sort records by the date they were published. + - It also allows publication-date sorting in API requests to the search API. Among other things, this allows users' KC profiles to display records in publication date order. +- Community selection modal bug fixes + - This affects the modal that appears both during record submission on the upload form and during collection management on the detail page. + - Fixed the sort order of search results in the modal. These were being sorted by record creation date, leading to a confusing sort order. It now sorts by "best match". This allows, e.g., "Knowledge Commons" to find the main KC collection. + - Also fixed the handling of '/' in the search query string. This allows, e.g., "ARLIS/NA" to find the ARLIS/NA collection, where previously it would produce an error. + +## 0.3.0-beta3 (2024-11-30) + +- Record detail page + - Added ui for collection management + - A new menu appears in the detail page sidebar when a user has permission to edit a record. This + allows users to manage the record's collections right from the detail page. + - With this menu users can now + - submit a request to have an existing published record added to a collection. + - add a record to multiple collections + - remove a record from some or all of its collections + - view pending collection submissions for the record + - change which collection appears as the primary collection for the record (i.e., the collection whose logo appears in the record's detail page sidebar) + - Refactored record management menu + - Refactored all sidebar menus (including the record management menu) to allow accessible + keyboard navigation + - Fixed display of event metadata + - Added display for work doi as well as version doi + - Each record has at least two DOIs: a work DOI and a version DOI. The work DOI is the DOI for the record as a whole. It always points to the most recent version of the work, even if the user creates new versions in the future. The other identifier is the version DOI, which will always point to the specific version of the work that the user is currently viewing. Previously, only the version DOI was displayed, which could be confusing if the user created a new version of the work. + +- Upload form + - Added proper messages to collections widget for published records + - since collections for published records are now managed from the detail page, the collections widget now displays messages to users pointing them to the detail page to manage collections. + - Added clearer titles to form when editing an existing record + or creating a new version + - Previously, the form would display "Editing Published Record" both when editing the metadata of an existing published version *and* when creating a new version. The header now displays "Creating New Version" when creating a new version, and "Editing Published Record" when editing the metadata of an existing published version. + - Changed default publisher from "unknown" to "Knowledge Commons" + - Previously, the default publisher was "unknown". This was especially confusing for resource types where the publisher field is hidden on the upload form. Now, the default publisher is "Knowledge Commons". + +- Solved collection links bug with custom routes + - This is a back-end technical fix that should not be visible to users. diff --git a/docs/build/_sources/index.rst.txt b/docs/build/_sources/index.rst.txt index 0f57de54e..59ce7a8bd 100644 --- a/docs/build/_sources/index.rst.txt +++ b/docs/build/_sources/index.rst.txt @@ -3,28 +3,29 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to Knowledge Commons Works's documentation! -=================================================== +Welcome to the Knowledge Commons Works technical documentation! +=============================================================== .. toctree:: :maxdepth: 2 :caption: Contents: README - CHANGES + changelog installation metadata customizations configuration + api cli_commands infrastructure developing in_depth reference -Indices and tables -================== +.. Indices and tables +.. ================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` diff --git a/docs/build/_sources/metadata.md.txt b/docs/build/_sources/metadata.md.txt index b653bf5cf..088f2e8e6 100644 --- a/docs/build/_sources/metadata.md.txt +++ b/docs/build/_sources/metadata.md.txt @@ -1,13 +1,17 @@ -# Metadata Schema and Vocabularies +(metadata-schema-vocabularies-and-identifiers)= +# Metadata Schema, Vocabularies, and Identifiers The default metadata schema for InvenioRDM records is defined in the `invenio-rdm-records` package and documented [here](https://inveniordm.docs.cern.ch/reference/metadata/). It also includes a number of optional metadata fields which have been enabled in KCWorks, documented [here](https://inveniordm.docs.cern.ch/reference/metadata/optional_metadata/). -Beyond these InvenioRDM fields, KCWorks adds a number of custom metadata fields to the schema using InvenioRDM's custom field mechanism. These are all located in the top-level `custom_fields` field of the record metadata. They are prefixed with two different namespaces: +In this documentation we provide +1. A full example of a KCWorks record metadata object +2. A list of the controlled vocabularies and identifier schemes supported by KCWorks +3. Discussion of how some of the standard InvenioRDM metadata fields are used in KCWorks +4. A list of the custom metadata fields KCWorks adds to the base InvenioRDM schema -- `kcr`: custom fields that are used to store data from the KC system. These fields **may** be used for new data, but are not required. -- `hclegacy`: custom fields that are used to store data from the legacy CORE repository. These fields **must not** be used for new data. +## Example metadata record -## Example JSON record +### JSON object for record creation What follows is an example of a complete metadata record (JSON object) used to create a KCWorks record. The various fields and their possible values are described in the sections below. @@ -247,26 +251,278 @@ Note that no single actual record would include all of these fields. The example } ``` +### JSON object retrieved from the record API + +The JSON object retrieved from the record API shares the same basic structure as the JSON object used to create the record, except that it includes a number of additional fields. Some properties are also filled out with additional details (e.g., readable titles for licenses, etc.) + ## Controlled Vocabularies ### Subject headings #### FAST -The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the `subjects` field. +The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the `subjects` field. See the [metadata.subjects](#metadata-subjects) section for more information about how to include FAST subjects in a KCWorks record. #### Homosaurus -The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity. +The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity. See the [metadata.subjects](#metadata-subjects) section for information about how to include Homosaurus subjects in a KCWorks record. + +## Resource types + + As an open repository that serves a multidisciplinary audience, KCWorks uses a custom vocabulary of resource types designed (a) to support the wide variety of scholarly materials we accept and (b) to facilitate ease of use for depositors. The terms in this vocabulary are mapped to DataCite's [resourceTypeGeneral](https://schema.datacite.org/meta/kernel-4.4/doc/DataCite_Schema_v4.4.pdf) vocabulary and a number of other resource type vocabularies (COAR, CSL, EUREPO, Schema.org). This allows correct export of metadata to DataCite and in other metadata formats. + +InvenioRDM employs a hierarchical structure of resource types, each of which has a number of subtypes. In KCWorks the 8 top-level resource types are: + +- audiovisual +- dataset +- image +- instructionalResource +- presentation +- software +- textDocument +- other + +We selected these top-level types in part to allow division of the many subtypes into manageable groups. This allows us to provide a wide range of resource types while also allowing users to easily find the resource type that best fits their deposit. + +Beneath these top-level types are a number of subtypes, which are listed below. Where the DataCite schema allows free-text, arbitrary subtypes, we have followed InvenioRDM's approach of using a controlled vocabulary of subtypes. Where our list of top-level types is short, we have erred on the side of including more subtypes. Again, this allows us to support a wide range of materials without forcing them to choose a subtype that does not fit. It also allows us to tailor the user interface of the upload form to the specific subtype of the record being deposited, preventing the confusion and overwhelm of users being presented with many metadata fields which are not relevant to their material. + +The following is the complete list of KCWorks resource types with their subtypes. This list may be expanded in the future. + +- audiovisual + - documentary + - interviewRecording + - musicalRecording + - other + - performance + - podcastEpisode + - audioRecording + - videoRecording +- dataset +- image + - chart + - diagram + - figure + - map + - visualArt + - photograph + - other +- instructionalResource + - curriculum + - lessonPlan + - syllabus + - other +- presentation + - conferencePaper + - conferencePoster + - presentationText + - slides + - other +- software + - 3DModel + - application + - computationalModel + - computationalNotebook + - service + - other +- textDocument + - abstract + - bibliography + - blogPost + - book + - bookSection + - conferenceProceeding + - dataManagementPlan + - documentation + - editorial + - essay + - interviewTranscript + - journalArticle + - legalComment + - legalResponse + - magazineArticle + - monograph + - newspaperArticle + - onlinePublication + - poeticWork + - preprint + - report + - workingPaper + - review + - technicalStandard + - thesis + - whitePaper + - other +- other + - catalog + - collection + - event + - interactiveResource + - notes + - patent + - peerReview + - physicalObject + - workflow + +Note that (like with the base InvenioRDM resource types), neither the list of top-level resource types nor the list of subtypes exactly matches the vocabulary provided by DataCite under [resourceTypeGeneral](https://datacite-metadata-schema.readthedocs.io/en/4.6/appendices/appendix-1/resourceTypeGeneral/). Those types are all included in the KCWorks vocabulary--some as top-level types, some as subtypes. But because we do not follow DataCite in allowing arbitrary free-text subtypes, we have needed to greatly expand the list of subtypes to support the wide variety of materials we accept. As mentioned above, however, each subtype is mapped to a DataCite resourceTypeGeneral value for correct export to DataCite and other metadata formats. + +You can compare the KCWorks resource types with the list from the original Humanities Commons CORE repository [here](https://works.hcommons.org/records/f9xww-xwr22). The KCWorks resource type vocabulary is not structured in the same way as the CORE vocabulary (which was a flat list), but the KCWorks subtypes encompass all of the original CORE types. + + +## Creator/contributor roles + +Keeping with our support for a wide variety of objects and disciplines, our creator roles are more diverse than just "author," "editor," or "translator." For contribuors we were influenced by the [CRediT Taxonomy](https://credit.niso.org/), finding ways of recognizing labor even when the contribution is not immediately visible. Included in both creator and contributor roles a selection of types taken from the [Variations Metadata](https://dlib.indiana.edu/projects/variations3/metadata/guide/controlVocabs/contributorRoles.html) taxonomy, providing the ability to credit those who engage in creative and musical works. + +The complete list of creator/contributor roles is: + +- actor +- adaptor +- annotator +- analyst +- arranger +- artisan +- artist +- attributedName +- author +- authorOfIntroduction +- authorOfForeword +- authorOfAfterword +- committeeChair +- choreographer +- cinematographer +- collaborator +- collector +- committeeMember +- composer +- conductor +- consultant +- contactperson +- correspondent +- datacollector +- datacurator +- datamanager +- dedicatee +- designer +- director +- distributor +- donor +- drafter +- editor +- examiner +- formerOwner +- hostinginstitution +- illustrator +- interviewee +- interviewer +- inventor +- juror +- licensee +- lyricist +- manufacturer +- organizer +- owner +- performer +- photographer +- printer +- producer +- projectOrTeamLeader +- projectOrTeamManager +- projectOrTeamMember +- recording engineer +- referee +- registrationagency +- registrationauthority +- relatedperson +- reporter +- researcher +- researchgroup +- researchParticipant +- rightsholder +- screenplayAuthor +- speaker +- supervisor +- transcriber +- translator +- witness +- workpackageleader +- writerOfAccompanying + +Note that where InvenioRDM provides distinct custom vocabularies for creators and contributors, KCWorks employs a single creator/contributor vocabulary. This is in keeping with our handling of the `creators` and `contributors` fields, discussed below. + +## Identifier Schemes + +### Works + +#### DOI (primary identifier) + +KCWorks (and InvenioRDM) supports the DOI identifier scheme to identify works in the repository. Note that two DOIs are minted for each KCWorks record: one for the current version of the record, and one for the work as a whole (including all versions). The version-specific DOI is stored in the `pids` property of the metadata record (`pids.identifiers.doi`). The work DOI is stored in the `parent.pids.doi` property of the `parent` object. + +These DOIs are minted by DataCite (https://datacite.org/) and the attached metadata is maintained automatically by KCWorks. + +Additional DOIs minted elsewhere can be attached to a KCWorks record. If provided at record creation such external DOIs can be used as the record's primary identifier (in `pids.doi`). Otherwise, they can be added using the `identifiers` property of the metadata record using the scheme `alternate-doi`. In both cases, these externally minted DOIs are **not** maintained automatically by KCWorks. + +#### OAI (secondary identifier) + +KCWorks also supports the OAI identifier scheme. The OAI identifier for a KCWorks record is stored in the `pids` property of the metadata record (`pids.identifiers.oai`). + +#### Handle (secondary identifier) + +KCWorks also supports the Handle identifier scheme (https://handle.net/). The Handle identifier for a KCWorks record is stored in the `identifiers` property of the metadata record (`identifiers[0].identifier`) using the scheme `handle`. + +#### ISSN (secondary identifier) + +An ISSN is an eight digit code that identifies a print or electronic newspaper, journal, magazine, or other periodical. More information on the ISSN can be found on [ISSN.org](https://www.issn.org/understanding-the-issn/what-is-an-issn/). + +#### ISBN (secondary identifier) + +An ISBN (International Standard Book Number) is a ten (pre-2007) or 13 digit (2007 to present) identifier used to identify both print and electronic published books. More information on the ISBN can be found on [ISBN-international.org](https://www.isbn-international.org/content/what-isbn/10). + +### People + +#### ORCID (recommended) + +KCWorks (and InvenioRDM) supports the ORCID identifier scheme. The ORCID of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`). A KCWorks user's ORCID id is also drawn from their KC profile (if they have provided one) and stored in their system user profile (as `.user_profile.identifier_orcid`). + +For details on how to use ORCID identifiers in KCWorks, see the section on [Metadata.creators](#metadata-creators-metadata-contributors) below. + +#### KC Username (recommended) + +KCWorks also allows the use of Knowledge Commons usernames as identifiers. The KC username of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`) using the scheme `kc_username`. + +For details on how to use KC usernames in KCWorks, see the section on [Metadata.creators](#metadata-creators-metadata-contributors) below. + +#### GND + +KCWorks also supports the Integrated Authority File (GND) identifier scheme (https://www.dnb.de/EN/Professionell/Standardisierung/GND/gnd_node.html). The GND identifier of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`) using the scheme `gnd`. + +#### ISNI + +KCWorks also supports the ISNI identifier scheme (https://isni.org/). The ISNI of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`) using the scheme `isni`. ### Organizations -#### ROR +#### ROR (recommended) -The Research Organization Registry (https://ror.org/) is used for the `organizations` field. +Organization identifiers can appear in the `creators` and `contributors` arrays, either for organizational creators/contributors or in the `affiliations` array of a personal creator/contributor. These fields *may* identify an organization using its id in Research Organization Registry (https://ror.org/) using the scheme `ror`, although free text names are also supported. +#### Grid (deprecated) -## Notes about Implementation of Core InvenioRDM Fields +KCWorks also supports the Grid identifier scheme (https://www.grid.ac/) for organizations using the scheme `grid`. This scheme is deprecated in favour of ROR, however, and should not be used for new identifiers. + +#### GND + +KCWorks also supports the Integrated Authority File (GND) identifier scheme (https://www.dnb.de/EN/Professionell/Standardisierung/GND/gnd_node.html) for organizations using the scheme `gnd`. + +### Funders + +#### DOI + +Funders in the `metadata.funding` array can be identified using DOIs formed with a FundRef id and the scheme `doi`. + +#### OFR + +Funders in the `metadata.funding` array can also be identified using the Open Funder Registry (https://openfunder.org/) identifiers and the scheme `ofr`. + +## KCWorks Implementation of Core InvenioRDM Fields ### metadata.subjects @@ -332,9 +588,14 @@ Example: } ``` -### KCWorks Custom Fields (kcworks/site/metadata_fields) +## KCWorks Custom Fields (kcworks/site/metadata_fields) + +Beyond the standard InvenioRDM metadata fields, KCWorks adds a number of custom metadata fields to the schema using InvenioRDM's custom field mechanism. These are all located in the top-level `custom_fields` field of the record metadata. They are prefixed with two different namespaces: + +- `kcr`: custom fields that are used to store data from the KC system. These fields **may** be used for new data, but are not required. +- `hclegacy`: custom fields that are used to store data from the legacy CORE repository. These fields **must not** be used for new data. -#### kcr:ai_usage +### kcr:ai_usage Type: `Object[boolean, string]` @@ -350,7 +611,7 @@ Example: } ``` -#### kcr:media +### kcr:media Type: `Array[string]` @@ -363,7 +624,7 @@ Example: } ``` -#### kcr:commons_domain +### kcr:commons_domain Type: `string` @@ -376,7 +637,7 @@ Example: } ``` -#### kcr:chapter_label +### kcr:chapter_label Type: `string` @@ -389,7 +650,7 @@ Example: } ``` -#### kcr:content_warning +### kcr:content_warning Type: `string` @@ -402,7 +663,7 @@ Example: } ``` -#### kcr:course_title +### kcr:course_title Type: `string` @@ -415,7 +676,7 @@ Example: } ``` -#### kcr:degree +### kcr:degree Type: `string` @@ -428,7 +689,7 @@ Example: } ``` -#### kcr:discipline +### kcr:discipline Type: `string` @@ -445,7 +706,7 @@ Example: } ``` -#### kcr:edition +### kcr:edition Type: `string` @@ -458,7 +719,7 @@ Example: } ``` -#### kcr:meeting_organization +### kcr:meeting_organization Type: `string` @@ -471,7 +732,7 @@ Example: } ``` -#### kcr:project_title +### kcr:project_title Type: `string` @@ -484,7 +745,7 @@ Example: } ``` -#### kcr:publication_url +### kcr:publication_url Type: `string` (URL) @@ -499,7 +760,7 @@ Example: } ``` -#### kcr:sponsoring_institution +### kcr:sponsoring_institution Type: `string` @@ -514,7 +775,7 @@ Example: } ``` -#### kcr:submitter_email +### kcr:submitter_email Type: `string` (email address) @@ -527,7 +788,7 @@ Example: } ``` -#### kcr:submitter_username +### kcr:submitter_username Type: `string` @@ -540,7 +801,7 @@ Example: } ``` -#### kcr:institution_department +### kcr:institution_department Type: `string` @@ -553,7 +814,7 @@ Example: } ``` -#### kcr:book_series +### kcr:book_series Type: `Object[string, string]` @@ -570,7 +831,7 @@ Example: } ``` -#### kcr:user_defined_tags +### kcr:user_defined_tags Type: `Array[string]` @@ -586,14 +847,14 @@ Example: } ``` -#### kcr:commons_search_recid (system field) +### kcr:commons_search_recid (system field) This field is used to store the persistent identifier for the KCWorks record in the KC central search index. > [!Warning] > This field is automatically generated by the `invenio-remote-api-provisioner` service when a KCWorks record is published. It *must not* be set by the user. -#### kcr:commons_search_updated (system field) +### kcr:commons_search_updated (system field) Type: `string` (ISO 8601 datetime string) @@ -602,11 +863,11 @@ This field stores the date and time when the KCWorks record was last updated in > [!Warning] > This field is automatically generated by the `invenio-remote-api-provisioner` service when a KCWorks record is published. It *must not* be set by the user. -### HC Legacy Custom Fields +## HC Legacy Custom Fields The `hclegacy` namespace is used for custom fields that are used to store data from the legacy CORE database. These fields should not be used for new data. -#### custom_fields.hclegacy:groups_for_deposit +### custom_fields.hclegacy:groups_for_deposit Type: `Array[Object[string, string]]` @@ -624,7 +885,7 @@ Example: } ``` -#### custom_fields.hclegacy:collection +### custom_fields.hclegacy:collection Type: `string` @@ -637,7 +898,7 @@ Example: } ``` -#### custom_fields.hclegacy:committee_deposit +### custom_fields.hclegacy:committee_deposit Type: `integer` @@ -650,7 +911,7 @@ Example: } ``` -#### custom_fields.hclegacy:file_location +### custom_fields.hclegacy:file_location Type: `string` @@ -663,7 +924,7 @@ Example: } ``` -#### custom_fields.hclegacy:file_pid +### custom_fields.hclegacy:file_pid Type: `string` @@ -676,7 +937,7 @@ Example: } ``` -#### custom_fields.hclegacy:previously_published +### custom_fields.hclegacy:previously_published Type: `string` @@ -689,7 +950,7 @@ Example: } ``` -#### custom_fields.hclegacy:publication_type +### custom_fields.hclegacy:publication_type Type: `string` @@ -702,7 +963,7 @@ Example: } ``` -#### custom_fields.hclegacy:record_change_date +### custom_fields.hclegacy:record_change_date Type: `string` (ISO 8601 datetime string) @@ -715,7 +976,7 @@ Example: } ``` -#### custom_fields.hclegacy:record_creation_date +### custom_fields.hclegacy:record_creation_date Type: `string` (ISO 8601 datetime string) @@ -728,7 +989,7 @@ Example: } ``` -#### custom_fields.hclegacy:record_identifier +### custom_fields.hclegacy:record_identifier Type: `string` @@ -741,7 +1002,7 @@ Example: } ``` -#### custom_fields.hclegacy:submitter_org_memberships +### custom_fields.hclegacy:submitter_org_memberships Type: `array[string]` @@ -754,7 +1015,7 @@ Example: } ``` -#### custom_fields.hclegacy:submitter_affiliation +### custom_fields.hclegacy:submitter_affiliation Type: `string` @@ -767,7 +1028,7 @@ Example: } ``` -#### custom_fields.hclegacy:submitter_id +### custom_fields.hclegacy:submitter_id Type: `string` @@ -780,7 +1041,7 @@ Example: } ``` -#### custom_fields.hclegacy:total_views +### custom_fields.hclegacy:total_views Type: `integer` @@ -793,7 +1054,7 @@ Example: } ``` -#### custom_fields.hclegacy:total_downloads +### custom_fields.hclegacy:total_downloads Type: `integer` diff --git a/docs/build/_static/documentation_options.js b/docs/build/_static/documentation_options.js index 5abb8afc8..5ce2f0a14 100644 --- a/docs/build/_static/documentation_options.js +++ b/docs/build/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '0.3.3', + VERSION: '0.3.5', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/build/api.html b/docs/build/api.html new file mode 100644 index 000000000..7490bb91e --- /dev/null +++ b/docs/build/api.html @@ -0,0 +1,2093 @@ + + + + + + + + + API - Knowledge Commons Works 0.3.5 documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

API

+

KCWorks provides a robust REST API that allows clients to perform most operations on KCWorks records and collections.

+
+

The InvenioRDM REST API

+

KCWorks is built on top of InvenioRDM, which provides a REST API for creating, managing, and querying records. This API is documented at https://inveniordm.docs.cern.ch/reference/rest_api_index/.

+
+

Note: “Collections” are referred to as “communities” in the InvenioRDM API and its documentation. To avoid confusion with the social groups that are part of the Knowledge Commons network, KCWorks uses the term “collections” in its documentation and user interface. But operations involving collections are handled via the “communities” endpoint in the InvenioRDM REST API.

+
+

This REST API allows clients to retrieve and manage the following resources:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Resource

Supported Operations

Requires Authentication

Endpoint

InvenioRDM API documentation

draft works

read

yes

GET /api/records/{id}/draft

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-record

create

yes

POST /api/records/

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-draft-record

update

yes

PUT /api/records/{id}

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record

publish

yes

POST /api/records/{id}/draft/actions/publish

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#publish-a-draft-record

delete

yes

DELETE /api/records/{id}/draft

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-record

list files

yes

GET /api/records/{id}/draft/files

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#list-a-drafts-files

upload files[1]

yes

POST /api/records/{id}/draft/files

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#start-draft-file-uploads

view file metadata

yes

GET /api/records/{id}/draft/files/{filename}

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-files-metadata

download file

yes

GET /api/records/{id}/draft/files/{filename}/content

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#download-a-draft-file

delete file

yes

DELETE /api/records/{id}/draft/files/{filename}

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-draft-file

published works

read[2]

no

GET /api/records/

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-record

read all versions

no

GET /api/records/{id}/versions

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-versions

read latest version

no

GET /api/records/{id}/versions/latest

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-latest-version

search

no

GET /api/records/

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#search-records

update[3]

yes

POST /api/records/{id}/draft

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record

create new version

yes

POST /api/records/{id}/versions

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-new-version

attach files from a previous version[4]

yes

POST /api/records/{id}/draft/actions/files-import

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#link-files-from-previous-version

list files

no

GET /api/records/{id}/files

https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-files

collections

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_communities/

collection memberships

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_members/

reviews

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_reviews/

requests

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_requests/

users

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_users/

groups[5]

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_groups/

vocabularies

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_vocabularies/

names

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_names/

funders

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_funders/

awards

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_awards/

OAI-PMH sets

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_oaipmh_sets/

statistics

Documentation forthcoming

https://inveniordm.docs.cern.ch/reference/rest_api_statistics/

+
+

Note that for some operations where authentication is required, the client must also possess the appropriate permissions. (E.g., to edit a draft work, manage collection requests, etc.)

+

Note that several operations are NOT possible via the REST API, including:

+
    +
  • searching draft records

    +
      +
    • Draft records are by definition not intended to be distributed, and so are not discoverable via the search API until they have been published.

    • +
    +
  • +
  • creating a published work directly

    +
      +
    • Published works can only be created by first creating a draft work and then publishing it.

    • +
    +
  • +
  • deleting a published work

    +
      +
    • Published works are generally considered to be permanent and so cannot be deleted. If desired, access to a published work, or a version of a published work, can be set to “restricted”, in which case the work is no longer discoverable via the search API.

    • +
    +
  • +
  • modifying files for a published work

    +
      +
    • Again, published works are generally considered to be permanent and so their files cannot be modified. The only way to update the files associated with a published work is to create a new version of the work. If desired, access to the original version of the published work can be set to “restricted”, in which case only the new version and its files are discoverable.

    • +
    +
  • +
  • creating or modifying user accounts

    +
      +
    • The REST API endpoint for users is currently read-only. It is not possible to create or modify user accounts, or change and user profile information, via the REST API. These operations are handled via the KCWorks admin interface or via CLI commands.

    • +
    +
  • +
  • creating or modifying groups (permissions)

  • +
  • creating or modifying controlled vocabularies

  • +
+
+

Creating a new Work via the InvenioRDM REST API

+

Creating a new Work via the REST API requires several steps.

+
    +
  • Step 1: Create a draft record

  • +
  • Step 2: Initialize the file upload

  • +
  • Step 3: Upload the file content

    +
      +
    • This step must be repeated for each file being added to the work.

    • +
    +
  • +
  • Step 4: Commit the file upload

  • +
  • Step 5: Publish the draft record

  • +
+

If you want the work to be included in a collection at publication time, you must submit a request for the work to be published in the collection. The first four steps are the same as above, but in place of Step 5 (publication), you must submit a request for the work to be published in the collection.

+
    +
  • Step 5: Create a review request

  • +
  • Step 6: Submit review request

  • +
+

If the collection in question requires review before publication, the request will not be published until the review is accepted.

+
    +
  • Step 7: Accept and publish the record

  • +
+
+
+
+

Streamlined Import API

+

In order to streamline the process of uploading works to KCWorks, particularly for works intended for publication in a collection, KCWorks provides a streamlined import API. This API allows clients to upload a work and its files in a single step, without the need to create a draft record, initialize file uploads, commit file uploads, or submit a review request.

+

Why is this API needed? The InvenioRDM REST API can be fragile and difficult to use, particularly for clients who are not familiar with the system. The creation and acceptance of a review request is redundant where collection administrators are uploading works for a collection they administer. The file upload steps are also not truly stateless, introducing the possibility of a file upload being interrupted and left incomplete, even if the upload of the file’s content was successful.

+
+

Who can use the import API?

+

The import API is available to any registered active user who has obtained an OAuth token for API operations.

+

If the import is to include placing the work directly in a collection, without passing through the review process, the user must have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection (“owner”, “manager”, “curator”, “reader”) depends on the collection’s review policy.

+

The exception to this rule is for collection owners, who may override the collection’s review policy and import works directly into the collection without review.

+
+
+

The import request

+
+

Request

+
POST https://works.hcommons.org/api/import/ HTTP/1.1
+
+
+
+
+

Required headers

+
Content-Type: multipart/form-data
+Accept: application/json
+Authorization: Bearer \<your-api-key\>
+
+
+
+
+

Request body

+

This request must be made with a multipart/form-data request. The request body must include parts with following names:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

Required

Content Type

Description

files

yes

application/octet-stream

The (binary) file content to be uploaded. If multiple files are being uploaded, a body part with this same name (“files”) must be provided for each file. If more than three or four files are being uploaded, it is recommended to provide a single zip archive containing all of the files. The files will be assigned to the appropriate work based on filename, so where multiple files are provided these must be unique. If a zip archive is provided, the files must be contained in a single compressed folder with no subfolders.

metadata

yes

application/json

An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described here. In addition, an array of owners for the work may optionally be provided by adding an access.owned_by property to each metadata object.

collection

no

text/plain

The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, the work will be placed in the collection’s review queue.

review_required

no

text/plain

A string representation of a boolean (either “true” or “false”) indicating whether the work should be reviewed before publication. This setting is only relevant if the work is intended for publication in a collection that requires review. It will override the collection’s usual review policy, since the work is being uploaded by a collection administrator. (Default: “true”)

strict_validation

no

text/plain

A string representation of a boolean (either “true” or “false”) indicating whether the import request should be rejected if any validation errors are encountered. If this value is “false”, the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is “true”, the import request will be rejected if any validation errors are encountered. (Default: “true”)

all_or_none

no

text/plain

A string representation of a boolean (either “true” or “false”) indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is “false”, the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: “true”)

+
+

The array of owners, if provided in a metadata object’s access.owned_by property, must include at least the full name and email address of the users to be added as owners of the work. If the user already has a Knowledge Commons account, their username should also be provided. Additional identifiers (e.g., ORCID) may be provided as well to help avoid duplicate accounts, since a KCWorks account will be created for each user if they do not already have one.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

key

required

type

description

full_name

yes

string

The full name of the user.

email

yes

string

The email address of the user.

identifiers

no

array

An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted.

+
+

The resulting owners list should be shaped like this:

+
[
+    {
+        "full_name": "John Doe",
+        "email": "john.doe@example.com",
+        "identifiers": [
+            {
+                "identifier": "0000-0000-0000-0000",
+                "scheme": "orcid"
+            },
+            {
+                "identifier": "jdoe",
+                "scheme": "kc_username"
+            }
+        ]
+    }
+]
+
+
+

Note that it is not assumed that the creators of a work should be the work’s owners. The creators will only be added as owners if each of them is listed in the access.owned_by property of the work’s metadata object.

+
+
+
+

A successful import response

+
HTTP/1.1 201 Created
+Content-Type: application/json
+
+
+

This response will include a JSON object with the following fields:

+
    +
  • status: The status of the import request, which will be “success” if the import request was successful.

  • +
  • data: An array of JSON objects with the following fields:

  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

type

description

record_id

string

The ID of the new work.

record_url

string

The URL of the new work.

files

array

A list of the filenames for the files that were successfully uploaded. This is for convenience. Details about the files, including their size and checksum, are available in the files property of the metadata object.

collection_id

string

The ID of the collection to which the work was published, if any. This is provided for convenience. Details about the collection are available in the parent.communities property of the metadata object.

errors

array

A list of errors that occurred during the import process. These might include validation errors for certain fields in the provided metadata that did not prevent creation of the work. (Only provided if the request was made with strict_validation set to “false”.)

metadata

object

The metadata for the created work, in JSON format, following the KCWorks implementation of the InvenioRDM metadata schema described here.

+
+

The response object will be shaped like this:

+
{
+    "status": "success",
+    "data": [
+        {
+            "item_index": 0,
+            "record_id": "1234567890",
+            "record_url": "https://works.hcommons.org/records/1234567890",
+            "files": ["file1.pdf", "file2.pdf"],
+            "collection_id": "1234567890",
+            "errors": [],
+            "metadata": {
+                /* ... */
+            }
+        },
+        {
+            "item_index": 1,
+            "record_id": "1234567891",
+            "record_url": "https://works.hcommons.org/records/1234567891",
+            "files": ["file1.pdf", "file2.pdf"],
+            "collection_id": "1234567890",
+            "errors": [],
+            "metadata": {
+                /* ... */
+            }
+        }
+    ]
+}
+
+
+
+
+

An unsuccessful import response

+
+

The token does not have the necessary permissions

+
HTTP/1.1 403 Forbidden
+Content-Type: application/json
+
+
+

This response will include a JSON object:

+
{
+    "status": "error",
+    "message": "The user does not have the necessary permissions."
+}
+
+
+
+
+

The request metadata is malformed or invalid

+
HTTP/1.1 400 Bad Request
+Content-Type: application/json
+
+
+

This response is returned when some of the provided metadata for all of the works to be imported is malformed or invalid. This indicates that none of the works has been created and a new request must be made with corrected metadata. This response will only be received if either +a. the strict_validation request parameter was set to “true” and all of the supplied metadata objects raise validation errors, or +b. the strict_validation parameter is set to “false”, but the validation errors affected fields that are required for the works to be created. +c. the all_or_none request parameter is set to “true” and some of the supplied metadata objects raise validation errors.

+

The response will include a JSON object with the following fields:

+
{
+    "status": "error",
+    "message": "The request metadata is malformed or invalid.",
+    "errors": [
+        {
+            "item_index": 0,
+            "errors": [
+                {
+                    "field": "title",
+                    "message": "Required field missing."
+                }
+            ]
+        },
+        {
+            "item_index": 1,
+            "errors": [
+                {
+                    "field": "metadata.creators.0.occupation",
+                    "message": "Unknown field."
+                },
+                {
+                    "field": "metadata.publication_date",
+                    "message": "Date is not in Extended Date Time Format (EDTF)."
+                }
+            ]
+        }
+    ]
+}
+
+
+

If only some of the works to be imported are malformed or invalid, and the all_or_none request parameter is set to “false”, the response will be 207 Multi-Status.

+
+
+

The request file upload failed

+
HTTP/1.1 400 Bad Request
+Content-Type: application/json
+
+
+

If the file content is uploaded but for some reason is considered corrupted or invalid, a 400 Bad Request response will be returned. This response will include a JSON object with the following fields:

+
{
+    "status": "error",
+    "message": "The file content is corrupted or invalid.",
+    "errors": [
+        {
+            "item_index": 0,
+            "errors": [
+                {
+                    "file": "file1.pdf",
+                    "message": "The file size does not match the supplied metadata."
+                },
+                {
+                    "file": "file2.pdf",
+                    "message": "The file checksum does not match the supplied metadata."
+                }
+            ]
+        },
+        {
+            "item_index": 1,
+            "errors": [
+                {
+                    "file": "file3.pdf",
+                    "message": "The file exceeds the maximum file size."
+                }
+            ]
+        }
+    ]
+}
+
+
+

If an upload simply fails to complete and times out, the client will instead receive a 504 Gateway Timeout response.

+
+
+

Only some of the works to be imported failed

+
HTTP/1.1 207 Multi-Status
+Content-Type: application/json
+
+
+

If the all_or_none request parameter is set to “false”, it is possible that some of the works to be imported were successfully created and others were not. In this case, the response will be 207 Multi-Status and will include a JSON object with the following fields:

+
{
+    "status": "multi_status",
+    "data": {
+        "succeeded": [
+            {
+                "item_index": 0,
+                "record_id": "1234567890",
+                "record_url": "https://works.hcommons.org/records/1234567890",
+                "files": ["file1.pdf", "file2.pdf"],
+                "collection_id": "1234567890",
+                "errors": [],
+                "metadata": {
+                    /* ... */
+                }
+            },
+        ],
+        "failed": [
+            {
+                "item_index": 1,
+                "message": "The request metadata is malformed or invalid.",
+                "errors": [
+                    {
+                        "field": "title",
+                        "message": "Required field missing.",
+                    }
+                ]
+            },
+            {
+                "item_index": 2,
+                "message": "The file content is corrupted or invalid.",
+                "errors": [
+                    {
+                        "file": "file3.pdf",
+                        "message": "The file exceeds the maximum file size."
+                    }
+                ]
+            }
+        ]
+    }
+}
+
+
+
+
+
+

What happens to an import request that fails?

+

If all steps of an import request do not complete successfully, the work will not be created. The files that were successfully uploaded will be deleted, and any draft record created as part of the import request will be deleted. The client may attempt the import request again.

+
+
+

Making duplicate import requests

+

Note that it is possible to make duplicate import requests unless the work to be imported includes a pre-existing DOI identifier or some other unique identifier that has already been registered in KCWorks. In this case, the import request will be rejected with a 409 Conflict response code and a Location header pointing to the existing work.

+

In the absence of such a unique identifier, however, KCWorks will not try to detect duplicate works based on the metadata, file name, or file content. If the same work is imported multiple times without a pre-existing unique identifier, it will be created multiple times in KCWorks and each version will be assigned a newly minted DOI.

+
+
+
+

Group Collections API

+
https://works.hcommons.org/api/group_collections
+
+
+

The group_collections REST API endpoint allows a client to create, read, modify, or delete a collection in KCWorks owned and administered by a Knowledge Commons group. GET requests to retrieve information about group collections are open to all clients. POST, PUT, and DELETE requests are secured by an oauth token that must be obtained from the Knowledge Commons Works administrator.

+

This endpoint is not configured to receive all of the metadata required to create or modify group collections. Rather, the group_collections endpoint receives minimal signals from a Commons Instance and then obtains the full required metadata via an API callback to the Commons instance.

+
+

[!NOTE] +KCWorks uses the term “collection” in place of the default term “community” employed in other InvenioRDM installations. This is partly to accommodate exactly the integration with Knowledge Commons groups that is discussed here.

+
+
+

Group collection owner

+

InvenioRDM does not allow groups to be owners of a collection (community). When a collection is created for a group, though, we do not know which of the group’s administrators to assign as the individual owner. It is also awkward to change ownership of a collection later on if the group’s administrativer personnel change. So the collection is owned by an administrative user who is assigned the role group-collections-owner. The group’s administrators are then assigned privileges as “managers” of the group collection. This allows them to manage the collection’s settings and membership, but not to delete the collection or change its ownership.

+

Before the invenio_group_collections_kcworks module can be used, the administrator must create a role called group-collections-owner and assign membership in that role to one administrative user account. If multiple user accounts belong to that role, the first user account in the list will be assigned as the owner of group collections. If no user accounts belong to the role, the group collection creation will fail with a NoOwnerAvailable error.

+
+
+

Endpoint configuration

+

The configuration variable GROUP_COLLECTIONS_METADATA_ENDPOINTS must be provided in the invenio.cfg file in order to use this endpoint. This variable should hold a dictionary whose keys are Commons instance names. The value for each key is a dictionary containing the following keys:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

key

value type

required

value

url

str

Y

The url on the Commons instance where a GET request can retrieve the metadata for a group. The url should include the placeholder {id} where the Commons instance id for the requested group should be placed.

token_name

str (upper case)

Y

The name of the environment variable that will hold the authentication token for requests to the Commons instance url for retrieving group metadata.

placeholder_avatar

str

N

The filename or last url component that identifies a placeholder avatar in the avatar image url supplied for the Commons group avatar.

+
+

A typical configuration might look like the following:

+
GROUP_COLLECTIONS_METADATA_ENDPOINTS = {
+    "knowledgeCommons": {
+            "url": "https://hcommons-dev.org/wp-json/commons/v1/groups/{id}",
+            "token_name": "COMMONS_API_TOKEN",
+            "placeholder_avatar": "mystery-group.png",
+    },
+}
+
+
+
+
+

Retrieving Group Collection Metadata (GET)

+

A GET request to this endpoint will retrieve metadata on Invenio collections +that are owned by a Commons group. A request to the bare endpoint without a +group ID or collection slug will return a list of all collections owned by +all Commons groups. (Commons Works collections not linked to a Commons group will not be included. If you wish to query all groups, please use the communities API endpoint.)

+
+

Query parameters

+

Four optional query parameters can be used to filter the results:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter name

Description

commons_instance

the name of the Commons instance to which the group belongs. If this parameter is provided, the response will only include collections owned by groups in that instance.

commons_group_id

the ID of the Commons group. If this parameter is provided, the response will only include collections owned by that group.

collection

the slug of the collection. If this parameter is provided, the response will include only metadata for that collection.

page

the page number of the results

size

the number of results to include on each page

sort

the kind of sorting applied to the returned results

+
+
+
+

Sorting

+

The sort parameter can be set to one of the following sort types:

+
+ + + + + + + + + + + + + + + + + + + + +

Field name

Description

newest

Descending order based on created date

oldest

Ascending order based on created date

updated-desc

Descending order based on updated date

updated-asc

Ascending order based on updated date

+
+

By default the results are sorted by updated-desc

+
+
+

Pagination

+

Long result sets will be paginated. The response will include urls for the first, last, previous, and next pages of results in the link property of the response body. A url for the current page of results will also be included in the list as a self link. By default the page size is 25, but this can be changed by providing a value for the size query parameter.

+
+
+

Requesting all collections

+
+
Request
+
GET https://works.hcommons.org/api/group_collections HTTP/1.1
+
+
+
+
+
Successful Response Status Code
+

200 OK

+
+
+
Successful response body
+
{
+    "aggregations": {
+        "type": {
+            "buckets": [
+                {
+                    "doc_count": 50,
+                    "is_selected": false,
+                    "key": "event",
+                    "label": "Event",
+                },
+                {
+                    "doc_count": 50,
+                    "is_selected": false,
+                    "key": "organization",
+                    "label": "Organization",
+                },
+            ],
+            "label": "Type",
+        },
+        "visibility": {
+            "buckets": [
+                {
+                    "doc_count": 100,
+                    "is_selected": false,
+                    "key": "public",
+                    "label": "Public",
+                }
+            ],
+            "label": "Visibility",
+        },
+    },
+    "hits": {
+        "hits": [
+            {
+                "id": "5402d72b-b144-4891-aa8e-1038515d68f7",
+                "access": {
+                    "member_policy": "open",
+                    "record_policy": "open",
+                    "review_policy": "closed",
+                    "visibility": "public",
+                },
+                "children": {"allow": false},
+                "created": "2024-01-01T00:00:00Z",
+                "updated": "2024-01-01T00:00:00Z",
+                "links": {
+                    "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7",
+                    "self_html": "https://works.hcommons.org/communities/panda-group-collection",
+                    "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings",
+                    "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo",
+                    "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename",
+                    "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members",
+                    "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public",
+                    "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations",
+                    "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests",
+                    "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records",
+                    "featured": "https://works.hcommons.org/api/"
+                                "communities/"
+                                "5402d72b-b144-4891-aa8e-1038515d68f7/"
+                                "featured",
+                },
+                "revision_id": 1,
+                "slug": "panda-group-collection",
+                "metadata": {
+                    "title": "The Panda Group Collection",
+                    "curation_policy": "Curation policy",
+                    "page": "Information for the panda group collection",
+                    "description": "This is a collection about pandas.",
+                    "website": "https://works.hcommons.org/pandas",
+                    "organizations": [
+                        {
+                            "name": "Panda Research Institute",
+                        }
+                    ],
+                    "size": 100,
+                },
+                "deletion_status": {
+                    "is_deleted": false,
+                    "status": "P",
+                },
+                "custom_fields": {
+                    "kcr:commons_instance": "knowledgeCommons",
+                    "kcr:commons_group_description": "This is a group for panda research.",
+                    "kcr:commons_group_id": "12345",
+                    "kcr:commons_group_name": "Panda Research Group",
+                    "kcr:commons_group_visibility": "public",
+                },
+                "access": {
+                    "visibility": "public",
+                    "member_policy": "closed",
+                    "record_policy": "open",
+                    "review_policy": "open",
+                }
+            },
+            /* ... */
+        ],
+        "total": 100,
+    },
+    "links": {
+        "self": "https://works.hcommons.org/api/group_collections",
+        "first": "https://works.hcommons.org/api/group_collections?page=1",
+        "last": "https://works.hcommons.org/api/group_collections?page=10",
+        "prev": "https://works.hcommons.org/api/group_collections?page=1",
+        "next": "https://works.hcommons.org/api/group_collections?page=2",
+    }
+    "sortBy": "newest",
+    "order": "ascending",
+}
+
+
+
+
+
Successful Response Headers
+
+ + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

+
+
+
+
+

Requesting collections for a Commons instance

+
+
Request
+
GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&sort=updated-asc HTTP/1.1
+
+
+
+
+
Successful response status code
+

200 OK

+
+
+
Successful Response Body:
+
{
+    "aggregations": {
+        "type": {
+            "buckets": [
+                {
+                    "doc_count": 45,
+                    "is_selected": false,
+                    "key": "event",
+                    "label": "Event",
+                },
+                {
+                    "doc_count": 45,
+                    "is_selected": false,
+                    "key": "organization",
+                    "label": "Organization",
+                },
+            ],
+            "label": "Type",
+        },
+        "visibility": {
+            "buckets": [
+                {
+                    "doc_count": 90,
+                    "is_selected": false,
+                    "key": "public",
+                    "label": "Public",
+                }
+            ],
+            "label": "Visibility",
+        },
+    },
+    "hits": {
+        "hits": [
+            {
+                "id": "5402d72b-b144-4891-aa8e-1038515d68f7",
+                "access": {
+                    "member_policy": "open",
+                    "record_policy": "open",
+                    "review_policy": "closed",
+                    "visibility": "public",
+                },
+                "children": {"allow": false},
+                "created": "2024-01-01T00:00:00Z",
+                "updated": "2024-01-01T00:00:00Z",
+                "links": {
+                    "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7",
+                    "self_html": "https://works.hcommons.org/communities/panda-group-collection",
+                    "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings",
+                    "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo",
+                    "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename",
+                    "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members",
+                    "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public",
+                    "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations",
+                    "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests",
+                    "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records",
+                    "featured": "https://works.hcommons.org/api/"
+                                "communities/"
+                                "5402d72b-b144-4891-aa8e-1038515d68f7/"
+                                "featured",
+                },
+                "revision_id": 1,
+                "slug": "panda-group-collection",
+                "metadata": {
+                    "title": "The Panda Group Collection",
+                    "curation_policy": "Curation policy",
+                    "page": "Information for the panda group collection",
+                    "description": "This is a collection about pandas.",
+                    "website": "https://works.hcommons.org/pandas",
+                    "organizations": [
+                        {
+                            "name": "Panda Research Institute",
+                        }
+                    ],
+                    "size": 100,
+                },
+                "deletion_status": {
+                    "is_deleted": false,
+                    "status": "P",
+                },
+                "custom_fields": {
+                    "kcr:commons_instance": "knowledgeCommons",
+                    "kcr:commons_group_description": "This is a group for panda research.",
+                    "kcr:commons_group_id": "12345",
+                    "kcr:commons_group_name": "Panda Research Group",
+                    "kcr:commons_group_visibility": "public",
+                },
+                "access": {
+                    "visibility": "public",
+                    "member_policy": "closed",
+                    "record_policy": "open",
+                    "review_policy": "open",
+                }
+            },
+            /* ... */
+        ],
+        "total": 90,
+    },
+    "links": {
+        "self": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons",
+        "first": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1",
+        "last": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=9",
+        "prev": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1",
+        "next": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=2",
+    }
+    "sortBy": "updated-asc",
+}
+
+
+
+
+
Successful response headers
+
+ + + + + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

Link

<https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1>; rel="first", <https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=9>; rel="last", <https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1>; rel="prev", <https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=2>; rel="next"

+
+
+
+
+

Requesting collections for a specific group

+

Note that if you specify a commons_group_id value, you must also provide a commons_instance value. This is to avoid confusion if different Commons instances use the same internal id for groups.

+
+
Request
+
GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1
+
+
+
+
+
Successful response status code
+

200 OK

+
+
+
Successful Response Body:
+
{
+    "aggregations": {
+        "type": {
+            "buckets": [
+                {
+                    "doc_count": 2,
+                    "is_selected": false,
+                    "key": "event",
+                    "label": "Event",
+                },
+                {
+                    "doc_count": 2,
+                    "is_selected": false,
+                    "key": "organization",
+                    "label": "Organization",
+                },
+            ],
+            "label": "Type",
+        },
+        "visibility": {
+            "buckets": [
+                {
+                    "doc_count": 4,
+                    "is_selected": false,
+                    "key": "public",
+                    "label": "Public",
+                }
+            ],
+            "label": "Visibility",
+        },
+    },
+    "hits": {
+        "hits": [
+            {
+                "id": "5402d72b-b144-4891-aa8e-1038515d68f7",
+                "access": {
+                    "member_policy": "open",
+                    "record_policy": "open",
+                    "review_policy": "closed",
+                    "visibility": "public",
+                },
+                "children": {"allow": false},
+                "created": "2024-01-01T00:00:00Z",
+                "updated": "2024-01-01T00:00:00Z",
+                "links": {
+                    "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7",
+                    "self_html": "https://works.hcommons.org/communities/panda-group-collection",
+                    "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings",
+                    "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo",
+                    "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename",
+                    "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members",
+                    "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public",
+                    "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations",
+                    "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests",
+                    "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records",
+                    "featured": "https://works.hcommons.org/api/"
+                                "communities/"
+                                "5402d72b-b144-4891-aa8e-1038515d68f7/"
+                                "featured",
+                },
+                "revision_id": 1,
+                "slug": "panda-group-collection",
+                "metadata": {
+                    "title": "The Panda Group Collection",
+                    "curation_policy": "Curation policy",
+                    "page": "Information for the panda group collection",
+                    "description": "This is a collection about pandas.",
+                    "website": "https://works.hcommons.org/pandas",
+                    "organizations": [
+                        {
+                            "name": "Panda Research Institute",
+                        }
+                    ],
+                    "size": 2,
+                },
+                "deletion_status": {
+                    "is_deleted": false,
+                    "status": "P",
+                },
+                "custom_fields": {
+                    "kcr:commons_instance": "knowledgeCommons",
+                    "kcr:commons_group_description": "This is a group for panda research.",
+                    "kcr:commons_group_id": "12345",
+                    "kcr:commons_group_name": "Panda Research Group",
+                    "kcr:commons_group_visibility": "public",
+                },
+                "access": {
+                    "visibility": "public",
+                    "member_policy": "closed",
+                    "record_policy": "open",
+                    "review_policy": "open",
+                }
+            },
+            /* ... */
+        ],
+        "total": 4,
+    },
+    "links": {
+        "self": "https://works.hcommons.org/api/group_collections",
+        "first": "https://works.hcommons.org/api/group_collections?page=1",
+        "last": "https://works.hcommons.org/api/group_collections?page=1",
+        "prev": "https://works.hcommons.org/api/group_collections?page=1",
+        "next": "https://works.hcommons.org/api/group_collections?page=1",
+    }
+    "sortBy": "newest",
+}
+
+
+
+
+
Successful response headers
+
+ + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

+
+
+
+
+

Requesting a specific collection

+

While other kinds of requests require query parameters, a request for metadata on a specific Commons Works collection can be made by simply adding the community’s slug to the end of the url path. Once again, this will only succeed for collections that are linked to a Commons instance group. Collections that exist independently on Knowledge Commons Works will not be found at the group_collections endpoint and should be requested at the communities endpoint instead.

+
+
Request
+
GET https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1
+
+
+
+
+
Successful Response Status Code
+

200 OK

+
+
+
Successful Response Body:
+
{
+    "id": "5402d72b-b144-4891-aa8e-1038515d68f7",
+    "created": "2024-01-01T00:00:00Z",
+    "updated": "2024-01-01T00:00:00Z",
+    "links": {
+        "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7",
+        "self_html": "https://works.hcommons.org/communities/panda-group-collection",
+        "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings",
+        "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo",
+        "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename",
+        "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members",
+        "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public",
+        "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations",
+        "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests",
+        "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records",
+        "featured": "https://works.hcommons.org/api/"
+                    "communities/"
+                    "5402d72b-b144-4891-aa8e-1038515d68f7/"
+                    "featured",
+    },
+    "revision_id": 1,
+    "slug": "panda-group-collection",
+    "metadata": {
+        "title": "The Panda Group Collection",
+        "curation_policy": "Curation policy",
+        "page": "Information for the panda group collection",
+        "description": "This is a collection about pandas.",
+        "website": "https://works.hcommons.org/pandas",
+        "organizations": [
+            {
+                "name": "Panda Research Institute",
+            }
+        ],
+        "size": 100,
+    },
+    "deletion_status": {
+        "is_deleted": false,
+        "status": "P",
+    },
+    "custom_fields": {
+        "kcr:commons_instance": "knowledgeCommons",
+        "kcr:commons_group_description": "This is a group for pandas research.",
+        "kcr:commons_group_id": "12345",
+        "kcr:commons_group_name": "Panda Research Group",
+        "kcr:commons_group_visibility": "public",
+    },
+    "access": {
+        "visibility": "public",
+        "member_policy": "closed",
+        "record_policy": "open",
+        "review_policy": "open",
+    }
+}
+
+
+
+
+
+
+

Creating a Collection for a Group (POST)

+

A POST request to this endpoint creates a new collection in Invenio owned by the specified Commons group. If the collection is successfully created, the response status code will be 201 Created, and the response body will be a JSON object containing the URL slug for the newly created collection.

+

The POST request will trigger a callback to the Commons instance to get the metadata for the specified group, using the configuration dictionary declared in the GROUP_COLLECTIONS_METADATA_ENDPOINTS config variable, under the key matching the Commons instance’s SAML IDP provider name (declared in the SSO_SAML_IDPS config variable). This callback request will be sent to the “url” specified in the configuration dictionary (e.g., GROUP_COLLECTIONS_METADATA_ENDPOINTS["knowledgeCommons"]["url"]). This request will be authenticated using the environment variable whose name matches the token_name from the same configuration dictionary. The metadata from this callback request will then be used to populate the collection metadata in Invenio.

+

If the metadata returned from the Commons instance includes a url for an avatar, that avatar will be downloaded and stored in the Invenio instance’s file storage. Since we do not want to use a placeholder avatar for the group, the instance’s configuration can include a placeholder_avatar key. If the file name or last segment of the supplied avatar url matches this placeholder_avatar value, it will be ignored.

+
+

Permissions and access in newly created collections

+

By default, the newly created collection will have the following access settings:

+
    +
  • Visibility: “public”

  • +
  • Member visibility: “public”

  • +
  • Member policy: “closed”

  • +
  • Record policy: “closed”

  • +
  • Review policy: “closed”

  • +
+

They will appear in search results and be visible to non-members of the collection. But users who are not group members will not be able to request membership, and all submissions to the group will be held for review by the collection curators.

+

The collection’s administrators can change these settings in the collection’s settings page.

+
+
+

Handling group name changes

+

Note that when a collection is created for a group, the collection’s slug will be generated from the group’s name. If the group’s name is changed in the Commons instance, the collection’s slug will not be automatically updated. This is to avoid breaking links to the collection. If the group’s name is changed, the collection’s slug will remain the same, but the collection’s metadata will be updated to reflect the new group name.

+
+
+

Handling collection name collisions

+

It is possible for two groups on Commons instances to share the same human readable name, even though their ids are different. Knowledge Commons Works will allow multiple collections to share identical human readable names, but group url slugs must be unique across all KC Works collections. So where group names collide, only the first of the identically-named collections will have its slug generated normally. Susequent collections with the same name will have a numerical disambiguator appended to the end of their slugs. So if we have three groups named “Panda Studies,” the first collection created for one of the groups will have the slug panda-studies. The other collections created by these groups will be assigned the slugs panda-studies-1 and panda-studies-2, in order of their creation in Knowledge Commons Works.

+
+
+

Handling deleted group collections

+

If a group collection is deleted, its slug will be reserved in the Invenio PID store and cannot be re-used for a new collection. If a new collection is created for the same group, the slug will have a numerical disambiguator appended to the end, exactly as in cases of group name collision. E.g., if the group panda-studies were deleted earlier, a request to create a new collection for the “Panda Studies” group would be assigned the URL slug panda-studies-1. This is to avoid breaking links to the deleted collection.

+

In future it may be possible to restore deleted collections, but this is not currently implemented.

+ +
+
+

Request

+
POST https://works.hcommons.org/api/group_collections HTTP/1.1
+
+
+

Required request headers:

+
+ + + + + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

Authorization

Bearer <token>

+
+
+
+

Request body

+

The request body must be a JSON object with the following fields:

+
+ + + + + + + + + + + + + + + + + + + + + +

Field name

Required

Description

commons_instance

Y

The name of the Commons instance to which the group belongs. This must be the same string used to identify the instance in the GROUP_COLLECTIONS_METADATA_ENDPOINTS config variable.

commons_group_id

Y

The ID of the Commons group that will own the collection.

collection_visibility

N

The visibility setting for the collection to be created. Must be either “public” or “restricted”. [default: “restricted”]

+
+

The resulting request body will be shaped like this:

+
{
+    "commons_instance": "knowledgeCommons",
+    "commons_group_id": "12345",
+    "collection_visibility": "public",
+}
+
+
+
+
+

Successful response status code

+

201 Created

+
+
+

Successful response body

+
{
+    "commons_group_id": "12345",
+    "collection_slug": "new-collection-slug"
+}
+
+
+
+
+

Unsuccessful response codes

+
    +
  • 400 Bad Request: The request body is missing required fields or contains +invalid data.

  • +
  • 404 Not Found: The specified group could not be found by the callback to the Commons instance.

  • +
  • 403 Forbidden: The request is not authorized to modify the collection.

  • +
  • 409 Conflict: A collection already exists in Knowledge Commons Works linked to the specified group.

  • +
+
+
+
+

Changing the Group Ownership of a Collection (PATCH)

+

[!WARNING] +PATCH requests to change group ownership of the collection are not yet implemented.

+

A PATCH request to this endpoint modifies an existing collection in Invenio by changing the Commons group to which it belongs. This is the only modification that can be made to a collection via this endpoint. Other modifications to Commons group metadata should be handled by signalling the Invenio webhook for commons group metadata updates. Modifications to internal metadata or settings for the Invenio collection should be made view the Invenio “communities” API or the collection settings UI.

+

Note that the collection memberships in Invenio will be automatically transferred to the new Commons group. The corporate roles for the old Commons group will be removed from the collection and corporate roles for the new Commons group will be added to its membership with appropriate permissions. But any individual memberships that have been granted through the Invenio UI will be left unchanged. If the new collection administrators wish to change these individual memberships, they will need to do so through the Invenio UI.

+
+

Request

+
PATCH https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1
+
+
+

Required request headers:

+
+ + + + + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

Authorization

Bearer <token>

+
+
+
+

Request body

+
{
+    "commons_instance": "knowledgeCommons",
+    "old_commons_group_id": "12345",
+    "new_commons_group_id": "67890",
+    "new_commons_group_name": "My Group",
+    "collection_visibility": "public",
+}
+
+
+
+
+

Successful response status code

+

200 OK

+
+
+

Successful response body

+
{
+    "collection": "my-collection-slug"
+    "old_commons_group_id": "12345",
+    "new_commons_group_id": "67890",
+}
+
+
+
+
+

Unsuccessful response codes

+
    +
  • 400 Bad Request: The request body is missing required fields or contains +invalid data.

  • +
  • 404 Not Found: The collection does not exist.

  • +
  • 403 Forbidden: The request is not authorized to modify the collection.

  • +
  • 304 Not Modified: The collection is already owned by the specified +Commons group.

  • +
+
+
+
+

Deleting a Group’s Collection (DELETE)

+

A DELETE request to this endpoint deletes a collection in Invenio owned by the specified Commons group. Note that the request must include all of:

+
    +
  • the collection slug as the url path parameter

  • +
  • the identifier of the Commons instance to which the group belongs, in the commons_instance query parameter

  • +
  • the Commons identifier of the group which owns the collection, in the commons_group_id query parameter

  • +
+

If any of these is missing the request will fail with a 400 Bad Request error. This is to ensure that collections are not deleted accidentally or by agents without authorization.

+

If the collection is successfully deleted, the response status code will be 204 No Content.

+

[!NOTE] +Once a group collection has been deleted, its former URL slug is still registered in Invenio’s PID store and reserved for the (now deleted) collection. Subsequent requests to create a collection for the same group cannot re-use the same URL slug. Instead the new slug will have a numerical disambiguator added to the end, exactly as in cases of group name collision. E.g., if the group panda-studies were deleted earlier, a request to create a new collection for the “Panda Studies” group would be assigned the URL slug panda-studies-1.

+

[!NOTE] +Group collections are soft deleted and can in principle be restored within a short period after the delete signal has been sent. Eventually, though, the soft deleted collection records will be +automatically purged entirely from the database. There is also no API mechanism for restoring them. So delete operations should be regarded as permanent and irrevocable.

+
+

Request

+
DELETE https://works.hcommons.org/api/group_collections/my-collection-slug?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1
+
+
+

Required request headers:

+
+ + + + + + + + + + + + + + +

Header name

Header value

Content-Type

application/json

Authorization

Bearer <token>

+
+
+
+

Successful response status code

+

204 No Content

+
+
+

Unsuccessful response codes

+
    +
  • 400 Bad Request: The request did not include the required parameters or the parameters are not well formed.

  • +
  • 403 Forbidden: The requesting agent is not authorized to delete the collection. The collection may not belong to the Commons instance making the request, or it may not belong to the specified Commons group.

  • +
  • 404 Not Found: The collection does not exist.

  • +
  • 422 UnprocessableEntity: The deletion could not be performed because the

  • +
+
+
+
+
+

User and Group Data Updates (Internal Only)

+
https://works.hcommons.org/api/webhooks/user_data_update
+
+
+
+

[!WARNING] +This API endpoint is intended for internal use only. It is not intended to be used by clients outside of the Knowledge Commons system.

+
+
+

[!NOTE] +This API was implemented with a distributed network of independent Commons instances in mind. Currently, only the Knowledge Commons instance exists and is supported as a SAML IDP by KCWorks.

+
+

The api endpoint /api/webhooks/user_data_update is provided for Knowledge Commons applications and instances to signal that user or group metadata has been changed. These endpoints do not receive the actual updated data. They only receive notices that the metadata for a user or group has changed. KCWorks will then query the Commons instance’s endpoint to retrieve current metadata for the user or group.

+
+

User/Groups Metadata updates and SAML authentication

+

It is assumed that Commons instances have registered a SAML authentication IDP with KCWorks. The Commons identifiers for users in metadata update signals must be the same identifiers provided by the instance’s SAML IDP. This allows KCWorks to reliably identify the correct KCWorks user account, even if the same identifier happens to be used internally by multiple Commons instances. It also allows KCWorks to store Commons instance user ids in one central place within KCWorks, minimizing the chances of those links between a Commons instance user account and a KCWorks user account becoming corrupted.

+
+
+

GET requests

+

A GET request to this endpoint can be used to check that the endpoint is available and receiving messages. The response should have a 200 status code and should carry the following JSON response body:

+
{
+	"message": "Webhook receiver is active",
+	"status": 200,
+}
+
+
+
+
+

POST requests

+
+

Payload objects

+

Update notices should be sent via a POST request with a JSON payload object shaped like this:

+
{
+	"idp": "knowledgeCommons",
+	"updates": {
+		"users": [
+			{"id": "myusername", "event": "updated"},
+			{"id": "anotherusername", "event": "created"},
+		],
+		"groups": [{"id": "1234", "event": "updated"}],
+	},
+},
+
+
+

Top level payload object properties:

+
+ + + + + + + + + + + + + + + + + + + + +

Property

Type

Description

Required

idp

string

The name used by KCWorks to identify the identity provider the Commons instance has registered with KCWorks. This id should have been provided by the KCWorks administrators when the Commons instance’s IDP connection was established. For Knowledge Commons the value is knowledgeCommons

Y

updates

object

This object identifies the metadata updates that have taken place on the Commons instance. It allows updates of different kinds and for multiple entities to be signalled in a single request. Its properties are described below.

Y

+
+

updates object properties:

+
+ + + + + + + + + + + + + + + + + + + + +

Property

Type

Description

Required

users

array

An array of objects each representing one metadata change event for a single user.

N

groups

array

An array of objects each representing one metadata change for a single group.

N

+
+

NOTE: A valid payload must provide either a users array or a groups array with at least one member. Requests providing neither users nor groups, or providing only empty arrays, will result in an error response.

+

users and groups object properties

+
+ + + + + + + + + + + + + + + + + + + + +

Property

Type

Description

Required

id

number

The local identifier of the user or group on the Commons instance. This must be the same identifier that can be used to retrieve the entity’s metadata at the corresponding endpoint on the Commons instance.

Y

event

string

The nature of the metadata change for the entity. Must be one of updated, created, or deleted. The updated and deleted event types should be sent when an entity is first created or is deleted entirely from the Commons instance. These will trigger the creation or deletion of corresponding entities (a user or a group) on KC Works. All other metadata changes are updated events.

Y

+
+

NOTE: A valid payload’s user and/or group objects must each include both an id and an event value.

+
+
+

Event timing

+

There may be some delay between KC Works’ receiving an update signal and the updating of the corresponding entity’s metadata in KC Works. The actual updates are handled by background workers and in some cases there may be a slight delay before a worker is free. Usually this will only be a fraction of a second, but if intensive background tasks (like indexing) are ongoing it could be several minutes. The update also depends on a successful callback request from KC Works to the Commons instance’s endpoint for serving user or group metadata. If that request fails, it is possible for an update to fail even though the webhook signal was received successfully.

+
+
+

Success responses

+

If a signal is received successfully, the response will have a status of 202 and carry a JSON response object shaped like this:

+
{
+	"message": "Webhook received",
+	"status": 202,
+	"updates": {
+		"users": [
+			{"id": "myusername", "event": "updated"},
+			{"id": "anotherusername", "event": "created"},
+		],
+		"groups": [{"id": "1234", "event": "updated"}],
+	}
+}
+
+
+

The updates object should be identical to the updates object provided in the POST request. This confirms that the correct events have all been received and are being sent for processing.

+
+
+

Error responses

+

If multiple update signals are received in one POST request, it is possible that only some of the updates can be processed. The request might, for example, provide updated event signals for a number of entities, some of whose ids do not exist in KC Works. In this case the response code will be 207 Multi-Status and the response payload will be a JSON object

+
+ +
+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/build/changelog.html b/docs/build/changelog.html new file mode 100644 index 000000000..5be723127 --- /dev/null +++ b/docs/build/changelog.html @@ -0,0 +1,495 @@ + + + + + + + + + Changes - Knowledge Commons Works 0.3.5 documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+ + +
+

Changes

+
+

0.3.5-beta8 (2025-01-10)

+
    +
  • Dashboard works search

    +
      +
    • Fixed the bug that broke works searching from the dashboard.

    • +
    +
  • +
+
+
+

0.3.4-beta7 (2025-01-09)

+
    +
  • Upload form collection selector

    +
      +
    • Fixed bug in collection selection modal where search results were always sorted by “newest” instead of “bestmatch” and so were useless for large result sets (original fix only worked in detail page)

    • +
    +
  • +
  • Documentation

    +
      +
    • Moved documentation from README.md and site/CHANGES.md into a static documentation site to be served by Github Pages.

    • +
    • Added more documentation for cli commands, metadata/identifiers/vocabularies, installation, and version control.

    • +
    +
  • +
  • Build system

    +
      +
    • Pinned the version of invenio-logging to less than 2.1.2 to avoid a webpack build conflict.

    • +
    +
  • +
+
+
+

0.3.3-beta6 (2024-12-18)

+
    +
  • Names

    +
      +
    • Added the infrastructure to customize the division of users’ names into parts so that it can be divided as desired when, e.g., the user’s name is being auto-filled in the name fields of the upload form. This involves

      +
        +
      • a new “name_parts_local” field to the user profile schema. This field contains the user’s name parts if they have been modified within the KCWorks system. This is sometimes necessary when the user data synced from the remote user data service does not divide the user’s name correctly.

      • +
      • a cli command to update the user’s name parts.

      • +
      • a new “names” js module that contains functions to get the user’s full name, full name in inverted order, family name, and given name from the user’s name parts.

      • +
      • updates to the CreatibutorsField component to use the new “names” js module and the customized name parts if they are present in a user’s profile.

      • +
      +
    • +
    +
  • +
  • Detail page

    +
      +
    • Added missing aria-label properties for accessibility

    • +
    +
  • +
  • Collections

    +
      +
    • Fixed wording of empty results message for collection members search

      +
        +
      • Previously, the empty results message used “community” instead of “collection”.

      • +
      +
    • +
    • Tweaks to layout of collection detail page header

    • +
    +
  • +
  • Remote user data service

    +
      +
    • Fixed bug where user profile data was not being updated because comparison with initial data was not being made correctly. This means that, among other things, ORCID ids will now be added correctly when the user chooses “add self” on the upload form.

    • +
    +
  • +
+
+
+

0.3.2-beta5 (2024-12-11)

+
    +
  • Added Bluesky sharing option to detail page

  • +
  • Fixed line wrapping of long values in record sidebar details

  • +
  • Added OpenGraph image metadata property to record detail page

    +
      +
    • This allows social media platforms to display the KCWorks logo instead of a random image they might find on the page.

    • +
    +
  • +
+
+
+

0.3.1-beta4 (2024-12-10)

+
    +
  • Added sort options for publication date to record search

    +
      +
    • This allows users to sort records by the date they were published.

    • +
    • It also allows publication-date sorting in API requests to the search API. Among other things, this allows users’ KC profiles to display records in publication date order.

    • +
    +
  • +
  • Community selection modal bug fixes

    +
      +
    • This affects the modal that appears both during record submission on the upload form and during collection management on the detail page.

    • +
    • Fixed the sort order of search results in the modal. These were being sorted by record creation date, leading to a confusing sort order. It now sorts by “best match”. This allows, e.g., “Knowledge Commons” to find the main KC collection.

    • +
    • Also fixed the handling of ‘/’ in the search query string. This allows, e.g., “ARLIS/NA” to find the ARLIS/NA collection, where previously it would produce an error.

    • +
    +
  • +
+
+
+

0.3.0-beta3 (2024-11-30)

+
    +
  • Record detail page

    +
      +
    • Added ui for collection management

      +
        +
      • A new menu appears in the detail page sidebar when a user has permission to edit a record. This +allows users to manage the record’s collections right from the detail page.

      • +
      • With this menu users can now

        +
          +
        • submit a request to have an existing published record added to a collection.

        • +
        • add a record to multiple collections

        • +
        • remove a record from some or all of its collections

        • +
        • view pending collection submissions for the record

        • +
        +
      • +
      • change which collection appears as the primary collection for the record (i.e., the collection whose logo appears in the record’s detail page sidebar)

      • +
      +
    • +
    • Refactored record management menu

    • +
    • Refactored all sidebar menus (including the record management menu) to allow accessible +keyboard navigation

    • +
    • Fixed display of event metadata

    • +
    • Added display for work doi as well as version doi

      +
        +
      • Each record has at least two DOIs: a work DOI and a version DOI. The work DOI is the DOI for the record as a whole. It always points to the most recent version of the work, even if the user creates new versions in the future. The other identifier is the version DOI, which will always point to the specific version of the work that the user is currently viewing. Previously, only the version DOI was displayed, which could be confusing if the user created a new version of the work.

      • +
      +
    • +
    +
  • +
  • Upload form

    +
      +
    • Added proper messages to collections widget for published records

      +
        +
      • since collections for published records are now managed from the detail page, the collections widget now displays messages to users pointing them to the detail page to manage collections.

      • +
      +
    • +
    • Added clearer titles to form when editing an existing record +or creating a new version

      +
        +
      • Previously, the form would display “Editing Published Record” both when editing the metadata of an existing published version and when creating a new version. The header now displays “Creating New Version” when creating a new version, and “Editing Published Record” when editing the metadata of an existing published version.

      • +
      +
    • +
    • Changed default publisher from “unknown” to “Knowledge Commons”

      +
        +
      • Previously, the default publisher was “unknown”. This was especially confusing for resource types where the publisher field is hidden on the upload form. Now, the default publisher is “Knowledge Commons”.

      • +
      +
    • +
    +
  • +
  • Solved collection links bug with custom routes

    +
      +
    • This is a back-end technical fix that should not be visible to users.

    • +
    +
  • +
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/build/cli_commands.html b/docs/build/cli_commands.html index 385fb2586..6a493fbcc 100644 --- a/docs/build/cli_commands.html +++ b/docs/build/cli_commands.html @@ -3,10 +3,10 @@ - + - CLI Commands - Knowledge Commons Works 0.3.3 documentation + CLI Commands - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
-
+
diff --git a/docs/build/developing.html b/docs/build/developing.html index dd21230d6..ec48f0a88 100644 --- a/docs/build/developing.html +++ b/docs/build/developing.html @@ -6,7 +6,7 @@ - Developing KCWorks - Knowledge Commons Works 0.3.3 documentation + Developing KCWorks - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
diff --git a/docs/build/in_depth.html b/docs/build/in_depth.html index bb4f32b01..7d79621c1 100644 --- a/docs/build/in_depth.html +++ b/docs/build/in_depth.html @@ -6,7 +6,7 @@ - In-depth Installation Instructions (NEEDS UPDATING) - Knowledge Commons Works 0.3.3 documentation + In-depth Installation Instructions (NEEDS UPDATING) - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
@@ -190,7 +190,7 @@
-
-

Welcome to Knowledge Commons Works’s documentation!

+
+

Welcome to the Knowledge Commons Works technical documentation!

-
-
-

Indices and tables

-
@@ -374,7 +381,7 @@

Indices and tables +

diff --git a/docs/build/infrastructure.html b/docs/build/infrastructure.html index f7b3e3709..3be958442 100644 --- a/docs/build/infrastructure.html +++ b/docs/build/infrastructure.html @@ -6,7 +6,7 @@ - KCWorks Infrastructure - Knowledge Commons Works 0.3.3 documentation + KCWorks Infrastructure - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
diff --git a/docs/build/installation.html b/docs/build/installation.html index bbdd89a1a..dde9baa4a 100644 --- a/docs/build/installation.html +++ b/docs/build/installation.html @@ -3,10 +3,10 @@ - + - Installation - Knowledge Commons Works 0.3.3 documentation + Installation - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
diff --git a/docs/build/metadata.html b/docs/build/metadata.html index 0f9afadfc..11f93c44b 100644 --- a/docs/build/metadata.html +++ b/docs/build/metadata.html @@ -6,7 +6,7 @@ - Metadata Schema and Vocabularies - Knowledge Commons Works 0.3.3 documentation + Metadata Schema, Vocabularies, and Identifiers - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@
@@ -190,7 +190,7 @@
-
-

Metadata Schema and Vocabularies

+
+

Metadata Schema, Vocabularies, and Identifiers

The default metadata schema for InvenioRDM records is defined in the invenio-rdm-records package and documented here. It also includes a number of optional metadata fields which have been enabled in KCWorks, documented here.

-

Beyond these InvenioRDM fields, KCWorks adds a number of custom metadata fields to the schema using InvenioRDM’s custom field mechanism. These are all located in the top-level custom_fields field of the record metadata. They are prefixed with two different namespaces:

-
    -
  • kcr: custom fields that are used to store data from the KC system. These fields may be used for new data, but are not required.

  • -
  • hclegacy: custom fields that are used to store data from the legacy CORE repository. These fields must not be used for new data.

  • -
-
-

Example JSON record

+

In this documentation we provide

+
    +
  1. A full example of a KCWorks record metadata object

  2. +
  3. A list of the controlled vocabularies and identifier schemes supported by KCWorks

  4. +
  5. Discussion of how some of the standard InvenioRDM metadata fields are used in KCWorks

  6. +
  7. A list of the custom metadata fields KCWorks adds to the base InvenioRDM schema

  8. +
+
+

Example metadata record

+
+

JSON object for record creation

What follows is an example of a complete metadata record (JSON object) used to create a KCWorks record. The various fields and their possible values are described in the sections below.

Note that no single actual record would include all of these fields. The example is provided to illustrate the structure of the metadata record and the sort of values that are valid for each field.

{
@@ -497,29 +502,298 @@ 

Example JSON record +

JSON object retrieved from the record API

+

The JSON object retrieved from the record API shares the same basic structure as the JSON object used to create the record, except that it includes a number of additional fields. Some properties are also filled out with additional details (e.g., readable titles for licenses, etc.)

+

+

Controlled Vocabularies

Subject headings

FAST

-

The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the subjects field.

+

The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the subjects field. See the metadata.subjects section for more information about how to include FAST subjects in a KCWorks record.

Homosaurus

-

The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity.

+

The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity. See the metadata.subjects section for information about how to include Homosaurus subjects in a KCWorks record.

+
+
+
+
+

Resource types

+

As an open repository that serves a multidisciplinary audience, KCWorks uses a custom vocabulary of resource types designed (a) to support the wide variety of scholarly materials we accept and (b) to facilitate ease of use for depositors. The terms in this vocabulary are mapped to DataCite’s resourceTypeGeneral vocabulary and a number of other resource type vocabularies (COAR, CSL, EUREPO, Schema.org). This allows correct export of metadata to DataCite and in other metadata formats.

+

InvenioRDM employs a hierarchical structure of resource types, each of which has a number of subtypes. In KCWorks the 8 top-level resource types are:

+
    +
  • audiovisual

  • +
  • dataset

  • +
  • image

  • +
  • instructionalResource

  • +
  • presentation

  • +
  • software

  • +
  • textDocument

  • +
  • other

  • +
+

We selected these top-level types in part to allow division of the many subtypes into manageable groups. This allows us to provide a wide range of resource types while also allowing users to easily find the resource type that best fits their deposit.

+

Beneath these top-level types are a number of subtypes, which are listed below. Where the DataCite schema allows free-text, arbitrary subtypes, we have followed InvenioRDM’s approach of using a controlled vocabulary of subtypes. Where our list of top-level types is short, we have erred on the side of including more subtypes. Again, this allows us to support a wide range of materials without forcing them to choose a subtype that does not fit. It also allows us to tailor the user interface of the upload form to the specific subtype of the record being deposited, preventing the confusion and overwhelm of users being presented with many metadata fields which are not relevant to their material.

+

The following is the complete list of KCWorks resource types with their subtypes. This list may be expanded in the future.

+
    +
  • audiovisual

    +
      +
    • documentary

    • +
    • interviewRecording

    • +
    • musicalRecording

    • +
    • other

    • +
    • performance

    • +
    • podcastEpisode

    • +
    • audioRecording

    • +
    • videoRecording

    • +
    +
  • +
  • dataset

  • +
  • image

    +
      +
    • chart

    • +
    • diagram

    • +
    • figure

    • +
    • map

    • +
    • visualArt

    • +
    • photograph

    • +
    • other

    • +
    +
  • +
  • instructionalResource

    +
      +
    • curriculum

    • +
    • lessonPlan

    • +
    • syllabus

    • +
    • other

    • +
    +
  • +
  • presentation

    +
      +
    • conferencePaper

    • +
    • conferencePoster

    • +
    • presentationText

    • +
    • slides

    • +
    • other

    • +
    +
  • +
  • software

    +
      +
    • 3DModel

    • +
    • application

    • +
    • computationalModel

    • +
    • computationalNotebook

    • +
    • service

    • +
    • other

    • +
    +
  • +
  • textDocument

    +
      +
    • abstract

    • +
    • bibliography

    • +
    • blogPost

    • +
    • book

    • +
    • bookSection

    • +
    • conferenceProceeding

    • +
    • dataManagementPlan

    • +
    • documentation

    • +
    • editorial

    • +
    • essay

    • +
    • interviewTranscript

    • +
    • journalArticle

    • +
    • legalComment

    • +
    • legalResponse

    • +
    • magazineArticle

    • +
    • monograph

    • +
    • newspaperArticle

    • +
    • onlinePublication

    • +
    • poeticWork

    • +
    • preprint

    • +
    • report

    • +
    • workingPaper

    • +
    • review

    • +
    • technicalStandard

    • +
    • thesis

    • +
    • whitePaper

    • +
    • other

    • +
    +
  • +
  • other

    +
      +
    • catalog

    • +
    • collection

    • +
    • event

    • +
    • interactiveResource

    • +
    • notes

    • +
    • patent

    • +
    • peerReview

    • +
    • physicalObject

    • +
    • workflow

    • +
    +
  • +
+

Note that (like with the base InvenioRDM resource types), neither the list of top-level resource types nor the list of subtypes exactly matches the vocabulary provided by DataCite under resourceTypeGeneral. Those types are all included in the KCWorks vocabulary–some as top-level types, some as subtypes. But because we do not follow DataCite in allowing arbitrary free-text subtypes, we have needed to greatly expand the list of subtypes to support the wide variety of materials we accept. As mentioned above, however, each subtype is mapped to a DataCite resourceTypeGeneral value for correct export to DataCite and other metadata formats.

+

You can compare the KCWorks resource types with the list from the original Humanities Commons CORE repository here. The KCWorks resource type vocabulary is not structured in the same way as the CORE vocabulary (which was a flat list), but the KCWorks subtypes encompass all of the original CORE types.

+
+
+

Creator/contributor roles

+

Keeping with our support for a wide variety of objects and disciplines, our creator roles are more diverse than just “author,” “editor,” or “translator.” For contribuors we were influenced by the CRediT Taxonomy, finding ways of recognizing labor even when the contribution is not immediately visible. Included in both creator and contributor roles a selection of types taken from the Variations Metadata taxonomy, providing the ability to credit those who engage in creative and musical works.

+

The complete list of creator/contributor roles is:

+
    +
  • actor

  • +
  • adaptor

  • +
  • annotator

  • +
  • analyst

  • +
  • arranger

  • +
  • artisan

  • +
  • artist

  • +
  • attributedName

  • +
  • author

  • +
  • authorOfIntroduction

  • +
  • authorOfForeword

  • +
  • authorOfAfterword

  • +
  • committeeChair

  • +
  • choreographer

  • +
  • cinematographer

  • +
  • collaborator

  • +
  • collector

  • +
  • committeeMember

  • +
  • composer

  • +
  • conductor

  • +
  • consultant

  • +
  • contactperson

  • +
  • correspondent

  • +
  • datacollector

  • +
  • datacurator

  • +
  • datamanager

  • +
  • dedicatee

  • +
  • designer

  • +
  • director

  • +
  • distributor

  • +
  • donor

  • +
  • drafter

  • +
  • editor

  • +
  • examiner

  • +
  • formerOwner

  • +
  • hostinginstitution

  • +
  • illustrator

  • +
  • interviewee

  • +
  • interviewer

  • +
  • inventor

  • +
  • juror

  • +
  • licensee

  • +
  • lyricist

  • +
  • manufacturer

  • +
  • organizer

  • +
  • owner

  • +
  • performer

  • +
  • photographer

  • +
  • printer

  • +
  • producer

  • +
  • projectOrTeamLeader

  • +
  • projectOrTeamManager

  • +
  • projectOrTeamMember

  • +
  • recording engineer

  • +
  • referee

  • +
  • registrationagency

  • +
  • registrationauthority

  • +
  • relatedperson

  • +
  • reporter

  • +
  • researcher

  • +
  • researchgroup

  • +
  • researchParticipant

  • +
  • rightsholder

  • +
  • screenplayAuthor

  • +
  • speaker

  • +
  • supervisor

  • +
  • transcriber

  • +
  • translator

  • +
  • witness

  • +
  • workpackageleader

  • +
  • writerOfAccompanying

  • +
+

Note that where InvenioRDM provides distinct custom vocabularies for creators and contributors, KCWorks employs a single creator/contributor vocabulary. This is in keeping with our handling of the creators and contributors fields, discussed below.

+
+
+

Identifier Schemes

+
+

Works

+
+

DOI (primary identifier)

+

KCWorks (and InvenioRDM) supports the DOI identifier scheme to identify works in the repository. Note that two DOIs are minted for each KCWorks record: one for the current version of the record, and one for the work as a whole (including all versions). The version-specific DOI is stored in the pids property of the metadata record (pids.identifiers.doi). The work DOI is stored in the parent.pids.doi property of the parent object.

+

These DOIs are minted by DataCite (https://datacite.org/) and the attached metadata is maintained automatically by KCWorks.

+

Additional DOIs minted elsewhere can be attached to a KCWorks record. If provided at record creation such external DOIs can be used as the record’s primary identifier (in pids.doi). Otherwise, they can be added using the identifiers property of the metadata record using the scheme alternate-doi. In both cases, these externally minted DOIs are not maintained automatically by KCWorks.

+
+
+

OAI (secondary identifier)

+

KCWorks also supports the OAI identifier scheme. The OAI identifier for a KCWorks record is stored in the pids property of the metadata record (pids.identifiers.oai).

+
+
+

Handle (secondary identifier)

+

KCWorks also supports the Handle identifier scheme (https://handle.net/). The Handle identifier for a KCWorks record is stored in the identifiers property of the metadata record (identifiers[0].identifier) using the scheme handle.

+
+
+

ISSN (secondary identifier)

+

An ISSN is an eight digit code that identifies a print or electronic newspaper, journal, magazine, or other periodical. More information on the ISSN can be found on ISSN.org.

+
+
+

ISBN (secondary identifier)

+

An ISBN (International Standard Book Number) is a ten (pre-2007) or 13 digit (2007 to present) identifier used to identify both print and electronic published books. More information on the ISBN can be found on ISBN-international.org.

+
+
+
+

People

+ + +
+

GND

+

KCWorks also supports the Integrated Authority File (GND) identifier scheme (https://www.dnb.de/EN/Professionell/Standardisierung/GND/gnd_node.html). The GND identifier of the submitter of the KCWorks record is stored in the person_or_org.identifiers property of the creators array (creators[0].person_or_org.identifiers.identifier) using the scheme gnd.

+
+
+

ISNI

+

KCWorks also supports the ISNI identifier scheme (https://isni.org/). The ISNI of the submitter of the KCWorks record is stored in the person_or_org.identifiers property of the creators array (creators[0].person_or_org.identifiers.identifier) using the scheme isni.

Organizations

-
-

ROR

-

The Research Organization Registry (https://ror.org/) is used for the organizations field.

+ +
+

Grid (deprecated)

+

KCWorks also supports the Grid identifier scheme (https://www.grid.ac/) for organizations using the scheme grid. This scheme is deprecated in favour of ROR, however, and should not be used for new identifiers.

+
+

GND

+

KCWorks also supports the Integrated Authority File (GND) identifier scheme (https://www.dnb.de/EN/Professionell/Standardisierung/GND/gnd_node.html) for organizations using the scheme gnd.

-
-

Notes about Implementation of Core InvenioRDM Fields

+
+

Funders

+
+

DOI

+

Funders in the metadata.funding array can be identified using DOIs formed with a FundRef id and the scheme doi.

+
+
+

OFR

+

Funders in the metadata.funding array can also be identified using the Open Funder Registry (https://openfunder.org/) identifiers and the scheme ofr.

+
+
+
+
+

KCWorks Implementation of Core InvenioRDM Fields

metadata.subjects

Note that KCWorks employs the FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) for the subjects field, complemented by the Homosaurus vocabulary (https://homosaurus.org/).

@@ -581,10 +855,16 @@

metadata.creators/metadata.contributors -

KCWorks Custom Fields (kcworks/site/metadata_fields)

+

KCWorks Custom Fields (kcworks/site/metadata_fields)

+

Beyond the standard InvenioRDM metadata fields, KCWorks adds a number of custom metadata fields to the schema using InvenioRDM’s custom field mechanism. These are all located in the top-level custom_fields field of the record metadata. They are prefixed with two different namespaces:

+
    +
  • kcr: custom fields that are used to store data from the KC system. These fields may be used for new data, but are not required.

  • +
  • hclegacy: custom fields that are used to store data from the legacy CORE repository. These fields must not be used for new data.

  • +
-

kcr:ai_usage

+

kcr:ai_usage

Type: Object[boolean, string]

This field stores data about any use of generative AI in the production of the record.

Example:

@@ -598,7 +878,7 @@

kcr:ai_usage -

kcr:media

+

kcr:media

Type: Array[string]

This field stores a list of media or materials involved in the creation of the record. This field is used to store free-form user-defined descriptors of the media or materials and does not impose any controlled vocabulary.

Example:

@@ -609,7 +889,7 @@

kcr:media -

kcr:commons_domain

+

kcr:commons_domain

Type: string

This field stores the KC organizational (Commons) domain associated with the KCWorks record, if any. The record should also be placed in the KCWorks collection associated with this organization.

Example:

@@ -620,7 +900,7 @@

kcr:commons_domain -

kcr:chapter_label

+

kcr:chapter_label

Type: string

This field stores the label of the chapter associated with the KCWorks record, if any. This allows us to differentiate between a simple chapter label (e.g. “Chapter 1”) and a more substantive title for the same chapter (e.g., “The Role of AI in Modern Art”).

Example:

@@ -631,7 +911,7 @@

kcr:chapter_label -

kcr:content_warning

+

kcr:content_warning

Type: string

This field stores an optional content warning for the KCWorks record. This is used to flag the record for KCWorks users so that they can be aware of potentially problematic content in the record. This field is not to be used for content moderation by KCWorks moderators or admins. It is only to be used voluntarily and as desired by the record submitter.

Example:

@@ -642,7 +922,7 @@

kcr:content_warning -

kcr:course_title

+

kcr:course_title

Type: string

This field stores the title of the course associated with the KCWorks record. It is intended primarily for use with syllabi and instructional materials.

Example:

@@ -653,7 +933,7 @@

kcr:course_title -

kcr:degree

+

kcr:degree

Type: string

This field stores the educational degree (e.g., PhD, DPhil, MA, etc.) associated with the KCWorks record. It is intended primarily for use with theses and dissertations.

Example:

@@ -664,7 +944,7 @@

kcr:degree -

kcr:discipline

+

kcr:discipline

Type: string

This field stores the academic discipline associated with the KCWorks record. It is intended primarily for use with theses, dissertations, and other educational artifacts. It is not intended as a general-purpose field for describing the subject matter of the KCWorks record. For that, you should use the metadata.subjects and kcr:user_defined_tags fields.

This field is intended to complement the thesis:university and kcr:institution_department fields.

@@ -677,7 +957,7 @@

kcr:discipline -

kcr:edition

+

kcr:edition

Type: string

This field stores a descriptor for the edition of the KCWorks record, if any.

Example:

@@ -688,7 +968,7 @@

kcr:edition -

kcr:meeting_organization

+

kcr:meeting_organization

Type: string

This field stores the name of the organization associated with the meeting or conference associated with the KCWorks record. It is intended primarily for use with conference papers, presentations, proceedings, etc.

Example:

@@ -699,7 +979,7 @@

kcr:meeting_organization -

kcr:project_title

+

kcr:project_title

Type: string

This field stores the title of a project for which the KCWorks record was created. It can be used flexibly for, e.g., grant-funded projects, research projects, artistic projects, etc.

Example:

@@ -710,7 +990,7 @@

kcr:project_title -

kcr:publication_url

+

kcr:publication_url

Type: string (URL)

This field stores the URL of the publication associated with the KCWorks record. It is not the URL of the KCWorks record itself or of the work it contains. For example, if the KCWorks record contains a journal article, it would not hold the URL for the published journal article. It is intended to hold the URL of the publication as a whole that the KCWorks record is based on or is a part of. So it might hold the main URL for the journal in which the article was published, or the main URL for the book in which the chapter was published, etc.

This string must be a valid URL.

@@ -722,7 +1002,7 @@

kcr:publication_url -

kcr:sponsoring_institution

+

kcr:sponsoring_institution

Type: string

This field stores the name of the institution that sponsored the KCWorks record. One intended use is for unpublished materials such white papers that were sponsored or commissioned by an institution. The field may also be used for the institution hosting a conference or workshop associated with the KCWorks record (as distinct from the organization that sponsored the event).

Note that this field is not intended for the degree-granting institution associated with a thesis or dissertation. That institution’s title should be stored in the thesis:university field.

@@ -734,7 +1014,7 @@

kcr:sponsoring_institution -

kcr:submitter_email

+

kcr:submitter_email

Type: string (email address)

This field stores the email address of the submitter of the KCWorks record. It must be a valid email address.

Example:

@@ -745,7 +1025,7 @@

kcr:submitter_email -

kcr:submitter_username

+

kcr:submitter_username

Type: string

This field stores the KC username of the submitter of the KCWorks record. This should be used even if the submitter is also a contributor to the KCWorks record and has included the same username in the metadata.creators.person_or_org.identifiers array.

Example:

@@ -756,7 +1036,7 @@

kcr:submitter_username

-

kcr:institution_department

+

kcr:institution_department

Type: string

This field stores the institutional department in which a thesis, dissertation, or other educational artifact was produced. It is intended to complement the thesis:university field, which stores the degree-granting institution.

Example:

@@ -767,7 +1047,7 @@

kcr:institution_department -

kcr:book_series

+

kcr:book_series

Type: Object[string, string]

This field stores the title of a series that contains the KCWorks record, along with the optional volume number of the work within the series.

Example:

@@ -781,7 +1061,7 @@

kcr:book_series -

kcr:user_defined_tags

+

kcr:user_defined_tags

Type: Array[string]

This field stores a list of user-defined tags for the KCWorks record. Unlike the metadata.subjects field, these tags are not constrained by any controlled vocabulary. Items should be free-form strings that describe the KCWorks record in a way that is not covered by the metadata.subjects field.

@@ -796,7 +1076,7 @@

kcr:user_defined_tags

-

kcr:commons_search_recid (system field)

+

kcr:commons_search_recid (system field)

This field is used to store the persistent identifier for the KCWorks record in the KC central search index.

[!Warning] @@ -804,7 +1084,7 @@

kcr:commons_search_recid (system field) -

kcr:commons_search_updated (system field)

+

kcr:commons_search_updated (system field)

Type: string (ISO 8601 datetime string)

This field stores the date and time when the KCWorks record was last updated in the KC central search index.

@@ -814,10 +1094,10 @@

kcr:commons_search_updated (system field) -

HC Legacy Custom Fields

+

HC Legacy Custom Fields

The hclegacy namespace is used for custom fields that are used to store data from the legacy CORE database. These fields should not be used for new data.

-

custom_fields.hclegacy:groups_for_deposit

+

custom_fields.hclegacy:groups_for_deposit

Type: Array[Object[string, string]]

This field is used to store the groups to which a legacy CORE record belonged before import into KCWorks. It was used to create corresponding KCWorks collections during migration.

Example:

@@ -833,7 +1113,7 @@

custom_fields.hclegacy:groups_for_deposit -

custom_fields.hclegacy:collection

+

custom_fields.hclegacy:collection

Type: string

This field is used to store the org collection to which a legacy CORE record belonged before import into KCWorks. It was used to create corresponding KCWorks org collections during migration.

Example:

@@ -844,7 +1124,7 @@

custom_fields.hclegacy:collection -

custom_fields.hclegacy:committee_deposit

+

custom_fields.hclegacy:committee_deposit

Type: integer

This field is used to store the committee deposit number for a legacy CORE record. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -855,7 +1135,7 @@

custom_fields.hclegacy:committee_deposit -

custom_fields.hclegacy:file_location

+

custom_fields.hclegacy:file_location

Type: string

This field is used to store the relative path the the file for a legacy CORE record. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -866,7 +1146,7 @@

custom_fields.hclegacy:file_location -

custom_fields.hclegacy:file_pid

+

custom_fields.hclegacy:file_pid

Type: string

This field is used to store the persistent identifier for the file for a legacy CORE record. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -877,7 +1157,7 @@

custom_fields.hclegacy:file_pid -

custom_fields.hclegacy:previously_published

+

custom_fields.hclegacy:previously_published

Type: string

This field is used to store the previously published status for a legacy CORE record. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -888,7 +1168,7 @@

custom_fields.hclegacy:previously_published -

custom_fields.hclegacy:publication_type

+

custom_fields.hclegacy:publication_type

Type: string

This field is used to store the publication type for a legacy CORE record. It was used during migration to help determine the KCWorks resource type of the record. It is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -899,7 +1179,7 @@

custom_fields.hclegacy:publication_type -

custom_fields.hclegacy:record_change_date

+

custom_fields.hclegacy:record_change_date

Type: string (ISO 8601 datetime string)

This field is used to store the date of the last change to a legacy CORE record. It was not used during migration to KCWorks and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -910,7 +1190,7 @@

custom_fields.hclegacy:record_change_date -

custom_fields.hclegacy:record_creation_date

+

custom_fields.hclegacy:record_creation_date

Type: string (ISO 8601 datetime string)

This field is used to store the date of the creation of a legacy CORE record. It was not used during migration because InvenioRDM does not allow overriding of the record creation date. It is only preserved for historical purposes and should not be used for new data.

Example:

@@ -921,7 +1201,7 @@

custom_fields.hclegacy:record_creation_date -

custom_fields.hclegacy:record_identifier

+

custom_fields.hclegacy:record_identifier

Type: string

This field is used to store the internal system identifier for a legacy CORE record. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -932,7 +1212,7 @@

custom_fields.hclegacy:record_identifier -

custom_fields.hclegacy:submitter_org_memberships

+

custom_fields.hclegacy:submitter_org_memberships

Type: array[string]

This field is used to store the organizations to which a legacy CORE record’s submitter belonged before import into KCWorks. It was used to create corresponding KCWorks org collections during migration and assign the work to those org collections.

Example:

@@ -943,7 +1223,7 @@

custom_fields.hclegacy:submitter_org_memberships -

custom_fields.hclegacy:submitter_affiliation

+

custom_fields.hclegacy:submitter_affiliation

Type: string

This field is used to store the organizational affiliation of a legacy CORE record’s submitter at the time of import into KCWorks. It was not used during migration and is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -954,7 +1234,7 @@

custom_fields.hclegacy:submitter_affiliation -

custom_fields.hclegacy:submitter_id

+

custom_fields.hclegacy:submitter_id

Type: string

This field is used to store the internal KC system user id of a legacy CORE record’s submitter. It was used during migration to assign ownership of the newly created record, and is preserved for historical purposes. It should not be used for new data.

Example:

@@ -965,7 +1245,7 @@

custom_fields.hclegacy:submitter_id -

custom_fields.hclegacy:total_views

+

custom_fields.hclegacy:total_views

Type: integer

This field is used to store the total number of views for a legacy CORE record prior to import into KCWorks. It was used during migration to create KCWorks usage stats aggregations for the record. It is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -976,7 +1256,7 @@

custom_fields.hclegacy:total_views -

custom_fields.hclegacy:total_downloads

+

custom_fields.hclegacy:total_downloads

Type: integer

This field is used to store the total number of downloads for a legacy CORE record prior to import into KCWorks. It was used during migration to create KCWorks usage stats aggregations for the record. It is only preserved for historical purposes. It should not be used for new data.

Example:

@@ -987,7 +1267,6 @@

custom_fields.hclegacy:total_downloads diff --git a/docs/build/objects.inv b/docs/build/objects.inv index f342d2c02d684c7a2d91f3f92dd3cd7f64b85a6b..67264f91f1cb0f58951a433f1031bc8f851d3db8 100644 GIT binary patch delta 6489 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 diff --git a/docs/build/reference.html b/docs/build/reference.html index 11d535067..8a35ec6cd 100644 --- a/docs/build/reference.html +++ b/docs/build/reference.html @@ -6,7 +6,7 @@ - Reference - Knowledge Commons Works 0.3.3 documentation + Reference - Knowledge Commons Works 0.3.5 documentation @@ -166,7 +166,7 @@

diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js index a223e31e0..1e9606dd2 100644 --- a/docs/build/searchindex.js +++ b/docs/build/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"0.3.0-beta3 (2024-11-30)": [[0, "beta3-2024-11-30"]], "0.3.1-beta4 (2024-12-10)": [[0, "beta4-2024-12-10"]], "0.3.2-beta5 (2024-12-11)": [[0, "beta5-2024-12-11"]], "0.3.3-beta6 (2024-12-18)": [[0, "beta6-2024-12-18"]], "1. Clone the git repository": [[9, "clone-the-git-repository"]], "2. Create your configuration files": [[9, "create-your-configuration-files"]], "3. Start the docker-compose project": [[9, "start-the-docker-compose-project"]], "4. Initialize the database and other services, and build asset files": [[9, "initialize-the-database-and-other-services-and-build-asset-files"]], "5. Create your own admin user": [[9, "create-your-own-admin-user"]], "6. View the application": [[9, "view-the-application"]], "About": [[1, "about"]], "Add and Configure an Environment File": [[6, "add-and-configure-an-environment-file"]], "Adding new entry points": [[5, "adding-new-entry-points"]], "Adding new node.js packages to be included": [[5, "adding-new-node-js-packages-to-be-included"]], "Additional environment variables with sensitive information": [[6, "additional-environment-variables-with-sensitive-information"]], "Additional required environment variables with paths on your local file system": [[6, "additional-required-environment-variables-with-paths-on-your-local-file-system"]], "Build and Configure the Containerized Services": [[6, "build-and-configure-the-containerized-services"]], "Build and start the containers": [[6, "build-and-start-the-containers"]], "Bulk Record Import (invenio-record-importer-kcworks)": [[4, "bulk-record-import-invenio-record-importer-kcworks"]], "CLI Commands": [[2, "cli-commands"]], "Changes": [[0, "changes"]], "Changes to external python modules (including Invenio modules)": [[5, "changes-to-external-python-modules-including-invenio-modules"]], "Changes to html template files": [[5, "changes-to-html-template-files"]], "Changes to invenio.cfg": [[5, "changes-to-invenio-cfg"]], "Changes to python code in the site folder": [[5, "changes-to-python-code-in-the-site-folder"]], "Changes to static files": [[5, "changes-to-static-files"]], "Changes to theme (CSS) and javascript files": [[5, "changes-to-theme-css-and-javascript-files"]], "Clone the knowledge-commons-works Code": [[6, "clone-the-knowledge-commons-works-code"]], "Collections": [[4, "collections"]], "Collections for KC Groups (invenio-group-collections-kcworks)": [[4, "collections-for-kc-groups-invenio-group-collections-kcworks"]], "Commit strategy": [[5, "commit-strategy"]], "Configuration of InvenioRDM": [[3, "configuration-of-inveniordm"]], "Content moderation notifications": [[4, "content-moderation-notifications"]], "Contents:": [[7, null]], "Controlled Vocabularies": [[10, "controlled-vocabularies"]], "Controlling containerized nginx server": [[6, "controlling-containerized-nginx-server"]], "Controlling just the containerized services": [[6, "controlling-just-the-containerized-services"]], "Controlling the Application Services": [[6, "controlling-the-application-services"]], "Controlling the KCWorks (Flask) application": [[9, "controlling-the-kcworks-flask-application"]], "Copyright": [[1, "copyright"]], "Create an admin user": [[6, "create-an-admin-user"]], "Create and initialize the database, search indices, and task queue": [[6, "create-and-initialize-the-database-search-indices-and-task-queue"]], "Customizations to InvenioRDM": [[4, "customizations-to-inveniordm"]], "Deposit Form Customizations": [[4, "deposit-form-customizations"]], "Developing KCWorks": [[5, "developing-kcworks"]], "Digging deeper": [[5, "digging-deeper"]], "Docker log rotation": [[6, "docker-log-rotation"]], "Email templates": [[4, "email-templates"]], "Ensure some version of python is installed": [[6, "ensure-some-version-of-python-is-installed"]], "Example JSON record": [[10, "example-json-record"]], "FAST": [[10, "fast"]], "Fixing docker-compose \u201cnot found\u201d error": [[6, "fixing-docker-compose-not-found-error"]], "Forked Core Invenio Modules": [[4, "forked-core-invenio-modules"]], "Full local development setup": [[9, "full-local-development-setup"]], "Git Branching Strategy": [[5, "git-branching-strategy"]], "Git Submodules": [[5, "git-submodules"]], "HC Legacy Custom Fields": [[4, "hc-legacy-custom-fields"], [10, "hc-legacy-custom-fields"]], "Homosaurus": [[10, "homosaurus"]], "In-app notifications": [[4, "in-app-notifications"]], "In-depth Installation Instructions (NEEDS UPDATING)": [[6, "in-depth-installation-instructions-needs-updating"]], "Indices and tables": [[7, "indices-and-tables"]], "Install Docker 20.10.10+ and Docker-compose 1.17.0+": [[6, "install-docker-20-10-10-and-docker-compose-1-17-0"]], "Install Node.js and NVM": [[6, "install-node-js-and-nvm"]], "Install Python and Required Python Tools": [[6, "install-python-and-required-python-tools"]], "Install and enable Python 3.9.16": [[6, "install-and-enable-python-3-9-16"]], "Install pyenv and pipenv": [[6, "install-pyenv-and-pipenv"]], "Install the Invenio Python Modules": [[6, "install-the-invenio-python-modules"]], "Install the invenio-cli command line tool": [[6, "install-the-invenio-cli-command-line-tool"]], "Installation": [[9, "installation"]], "Integrations with KC": [[4, "integrations-with-kc"]], "InvenioRDM Documentation": [[11, "inveniordm-documentation"]], "Javascript tests": [[5, "javascript-tests"]], "KC Search Provisioning (invenio-remote-api-provisioner)": [[4, "kc-search-provisioning-invenio-remote-api-provisioner"]], "KCWorks Custom CLI Commands": [[2, "kcworks-custom-cli-commands"]], "KCWorks Custom Fields (kcworks/site/metadata_fields)": [[4, "kcworks-custom-fields-kcworks-site-metadata-fields"], [10, "kcworks-custom-fields-kcworks-site-metadata-fields"]], "KCWorks Infrastructure": [[8, "kcworks-infrastructure"]], "Linux": [[6, "linux"]], "MacOS": [[6, "macos"]], "Metadata Schema Customizations": [[4, "metadata-schema-customizations"]], "Metadata Schema and Vocabularies": [[10, "metadata-schema-and-vocabularies"]], "Modular Framework (invenio-modular-deposit-form)": [[4, "modular-framework-invenio-modular-deposit-form"]], "Modular Framework (invenio-modular-detail-page)": [[4, "modular-framework-invenio-modular-detail-page"]], "Naming Commits": [[5, "naming-commits"]], "Note about docker contexts": [[6, "note-about-docker-contexts"]], "Notes about Implementation of Core InvenioRDM Fields": [[4, "notes-about-implementation-of-core-inveniordm-fields"], [10, "notes-about-implementation-of-core-inveniordm-fields"]], "Notifications": [[4, "notifications"]], "Organizations": [[10, "organizations"]], "Overrides in the KCWorks Package (kcworks/site)": [[4, "overrides-in-the-kcworks-package-kcworks-site"], [4, "id1"]], "Page templates": [[4, "page-templates"]], "Python tests": [[5, "python-tests"]], "Quickstart": [[9, "quickstart"]], "ROR": [[10, "ror"]], "Rebuilding changed files on the fly (fast but limited)": [[5, "rebuilding-changed-files-on-the-fly-fast-but-limited"]], "Record Detail Page Customizations": [[4, "record-detail-page-customizations"]], "Reference": [[11, "reference"]], "Running CLI Commands in the KCWorks Container": [[2, "running-cli-commands-in-the-kcworks-container"]], "Running Invenio CLI Commands": [[2, "running-invenio-cli-commands"]], "Running automated tests (NEEDS UPDATING)": [[5, "running-automated-tests-needs-updating"]], "SAML Authentication": [[4, "saml-authentication"]], "Standardized environment variables": [[6, "standardized-environment-variables"]], "Start the uwsgi applications and celery worker": [[6, "start-the-uwsgi-applications-and-celery-worker"]], "Startup and shutdown scripts": [[6, "startup-and-shutdown-scripts"]], "Subject headings": [[10, "subject-headings"]], "Tagging Releases": [[5, "tagging-releases"]], "Template Customizations": [[4, "template-customizations"]], "The basic build process (slow)": [[5, "the-basic-build-process-slow"]], "Updating an Instance with Upstream Changes": [[5, "updating-an-instance-with-upstream-changes"]], "Updating the running KCWorks instance with development changes": [[5, "updating-the-running-kcworks-instance-with-development-changes"]], "Use the application!": [[6, "use-the-application"]], "User Data Sync (invenio-remote-user-data-kcworks)": [[4, "user-data-sync-invenio-remote-user-data-kcworks"]], "User-first-record notifications": [[4, "user-first-record-notifications"]], "Variables for local credentials": [[6, "variables-for-local-credentials"]], "Version Control": [[5, "version-control"]], "Version Numbering": [[5, "version-numbering"]], "View container logging output": [[6, "view-container-logging-output"]], "View logging output for uwsgi processes": [[6, "view-logging-output-for-uwsgi-processes"]], "Welcome to Knowledge Commons Works\u2019s documentation!": [[7, "welcome-to-knowledge-commons-works-s-documentation"]], "custom_fields.hclegacy:collection": [[4, "custom-fields-hclegacy-collection"], [10, "custom-fields-hclegacy-collection"]], "custom_fields.hclegacy:committee_deposit": [[4, "custom-fields-hclegacy-committee-deposit"], [10, "custom-fields-hclegacy-committee-deposit"]], "custom_fields.hclegacy:file_location": [[4, "custom-fields-hclegacy-file-location"], [10, "custom-fields-hclegacy-file-location"]], "custom_fields.hclegacy:file_pid": [[4, "custom-fields-hclegacy-file-pid"], [10, "custom-fields-hclegacy-file-pid"]], "custom_fields.hclegacy:groups_for_deposit": [[4, "custom-fields-hclegacy-groups-for-deposit"], [10, "custom-fields-hclegacy-groups-for-deposit"]], "custom_fields.hclegacy:previously_published": [[4, "custom-fields-hclegacy-previously-published"], [10, "custom-fields-hclegacy-previously-published"]], "custom_fields.hclegacy:publication_type": [[4, "custom-fields-hclegacy-publication-type"], [10, "custom-fields-hclegacy-publication-type"]], "custom_fields.hclegacy:record_change_date": [[4, "custom-fields-hclegacy-record-change-date"], [10, "custom-fields-hclegacy-record-change-date"]], "custom_fields.hclegacy:record_creation_date": [[4, "custom-fields-hclegacy-record-creation-date"], [10, "custom-fields-hclegacy-record-creation-date"]], "custom_fields.hclegacy:record_identifier": [[4, "custom-fields-hclegacy-record-identifier"], [10, "custom-fields-hclegacy-record-identifier"]], "custom_fields.hclegacy:submitter_affiliation": [[4, "custom-fields-hclegacy-submitter-affiliation"], [10, "custom-fields-hclegacy-submitter-affiliation"]], "custom_fields.hclegacy:submitter_id": [[4, "custom-fields-hclegacy-submitter-id"], [10, "custom-fields-hclegacy-submitter-id"]], "custom_fields.hclegacy:submitter_org_memberships": [[4, "custom-fields-hclegacy-submitter-org-memberships"], [10, "custom-fields-hclegacy-submitter-org-memberships"]], "custom_fields.hclegacy:total_downloads": [[4, "custom-fields-hclegacy-total-downloads"], [10, "custom-fields-hclegacy-total-downloads"]], "custom_fields.hclegacy:total_views": [[4, "custom-fields-hclegacy-total-views"], [10, "custom-fields-hclegacy-total-views"]], "invenio-communities": [[4, "invenio-communities"]], "invenio-rdm-records": [[4, "invenio-rdm-records"]], "invenio-records-resources": [[4, "invenio-records-resources"]], "invenio-vocabularies": [[4, "invenio-vocabularies"]], "kcr:ai_usage": [[4, "kcr-ai-usage"], [10, "kcr-ai-usage"]], "kcr:book_series": [[4, "kcr-book-series"], [10, "kcr-book-series"]], "kcr:chapter_label": [[4, "kcr-chapter-label"], [10, "kcr-chapter-label"]], "kcr:commons_domain": [[4, "kcr-commons-domain"], [10, "kcr-commons-domain"]], "kcr:commons_search_recid (system field)": [[4, "kcr-commons-search-recid-system-field"], [10, "kcr-commons-search-recid-system-field"]], "kcr:commons_search_updated (system field)": [[4, "kcr-commons-search-updated-system-field"], [10, "kcr-commons-search-updated-system-field"]], "kcr:content_warning": [[4, "kcr-content-warning"], [10, "kcr-content-warning"]], "kcr:course_title": [[4, "kcr-course-title"], [10, "kcr-course-title"]], "kcr:degree": [[4, "kcr-degree"], [10, "kcr-degree"]], "kcr:discipline": [[4, "kcr-discipline"], [10, "kcr-discipline"]], "kcr:edition": [[4, "kcr-edition"], [10, "kcr-edition"]], "kcr:institution_department": [[4, "kcr-institution-department"], [10, "kcr-institution-department"]], "kcr:media": [[4, "kcr-media"], [10, "kcr-media"]], "kcr:meeting_organization": [[4, "kcr-meeting-organization"], [10, "kcr-meeting-organization"]], "kcr:project_title": [[4, "kcr-project-title"], [10, "kcr-project-title"]], "kcr:publication_url": [[4, "kcr-publication-url"], [10, "kcr-publication-url"]], "kcr:sponsoring_institution": [[4, "kcr-sponsoring-institution"], [10, "kcr-sponsoring-institution"]], "kcr:submitter_email": [[4, "kcr-submitter-email"], [10, "kcr-submitter-email"]], "kcr:submitter_username": [[4, "kcr-submitter-username"], [10, "kcr-submitter-username"]], "kcr:user_defined_tags": [[4, "kcr-user-defined-tags"], [10, "kcr-user-defined-tags"]], "metadata.creators/metadata.contributors": [[4, "metadata-creators-metadata-contributors"], [10, "metadata-creators-metadata-contributors"]], "metadata.subjects": [[4, "metadata-subjects"], [10, "metadata-subjects"]]}, "docnames": ["CHANGES", "README", "cli_commands", "configuration", "customizations", "developing", "in_depth", "index", "infrastructure", "installation", "metadata", "reference"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["CHANGES.md", "README.md", "cli_commands.md", "configuration.md", "customizations.md", "developing.md", "in_depth.md", "index.rst", "infrastructure.md", "installation.md", "metadata.md", "reference.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [0, 2, 4, 5, 6, 10], "0": [1, 5, 7, 9, 10], "00": [4, 10], "0000": [4, 10], "0001": 10, "00k4n6c32": 10, "00z": [4, 10], "01": [4, 10], "01t00": [4, 10], "0378": 10, "04": 6, "06": 10, "09": 10, "1": [4, 5, 7, 10], "10": [7, 9, 10], "1001634": [4, 10], "1086436": 10, "11": [6, 7, 10], "111023": 10, "12": [6, 7, 9], "123": 10, "1234": 10, "123456": [4, 10], "12345abcd": 10, "1263": [4, 10], "17": [7, 9], "18": 7, "19": 6, "2": [5, 6, 7, 10], "20": [7, 9], "2018": 10, "2020": 10, "2022": 10, "2023": 1, "2024": [4, 7, 10], "2025": 10, "2029": 10, "22": 6, "2345": 10, "24": [1, 10], "251587": 10, "2nd": 10, "3": [1, 5, 7], "30": 7, "32": 10, "4": 10, "456": 10, "458": 10, "5601": [6, 9], "5955": 10, "6": 6, "60": 10, "6379": 6, "63932": 10, "6780": 10, "6789": 10, "8": 10, "8601": [4, 10], "8gb": 6, "9200": 6, "94682": 10, "958235": 10, "966892": 10, "A": [0, 4, 10], "At": 6, "But": 9, "By": 5, "For": [2, 4, 5, 6, 10], "If": [4, 5, 6, 9, 10], "In": [5, 7], "It": [0, 1, 2, 4, 5, 6, 9, 10], "NOT": 9, "No": 5, "On": [2, 6], "One": [4, 6, 10], "Or": [5, 6], "TO": 9, "That": [4, 10], "The": [0, 4, 6, 9, 10, 11], "Then": [2, 5, 6], "There": [5, 6], "These": [0, 2, 4, 5, 6, 9, 10], "To": [2, 5, 6, 9], "With": [0, 6], "__init__": 5, "__name__": 5, "abl": 6, "about": [5, 7], "abov": 5, "abus": [4, 10], "academ": [1, 4, 10], "access": [0, 6, 9, 10], "account": [4, 10], "acronym": 10, "activ": [5, 6, 9, 10], "actual": [6, 10], "ad": [0, 4], "add": [0, 4, 5, 7, 9, 10], "addit": [4, 5, 9, 10], "addition": 6, "additional_descript": 10, "additional_titl": 10, "address": [4, 6, 10], "admin": [4, 10], "administr": [6, 9], "advis": 6, "affect": 0, "affili": [4, 10], "after": [5, 6, 9], "ag": 10, "again": [5, 6], "against": 6, "aggreg": [2, 4, 10], "ai": [4, 10], "ai_descript": [4, 10], "ai_us": [4, 10], "alia": 6, "alias": 5, "all": [0, 2, 4, 5, 6, 9, 10], "allow": [0, 4, 6, 9, 10], "alon": 5, "along": [4, 5, 10], "alongsid": 6, "alreadi": [5, 6], "also": [0, 2, 4, 5, 6, 10], "altern": 6, "alwai": [0, 6], "ambigu": [4, 10], "american": [4, 10], "among": 0, "an": [0, 1, 4, 7, 9, 10, 11], "anaconda": 6, "ani": [2, 4, 5, 6, 10], "anoth": 6, "api": [0, 2, 5, 6, 9, 10], "api_token": 6, "app": [6, 9], "appear": [0, 9], "append": 6, "applic": [5, 7, 10], "approach": 6, "appropri": [6, 10], "ar": [0, 2, 4, 5, 6, 9, 10], "area": [4, 10], "aren": 6, "argument": 2, "aria": 0, "arli": 0, "arlisna": [4, 10], "arrai": [4, 10], "art": [4, 10], "articl": [4, 10], "artifact": [4, 10], "artist": [4, 10], "ask": 6, "asset": 5, "assign": [4, 6, 10], "assignfast": [4, 10], "associ": [4, 10], "assum": 6, "audio": [4, 10], "augment": 10, "austen": [4, 10], "author": 10, "auto": 0, "autom": 7, "automat": [4, 5, 6, 10], "avail": [2, 5, 6, 10], "avoid": 5, "aw": 6, "awar": [4, 6, 10], "award": 10, "b": 5, "back": [0, 2, 5], "backend": 4, "background": 6, "bar": [6, 10], "base": [4, 10], "bash": [2, 5, 6, 9], "bashrc": 6, "beat": 6, "becaus": [0, 4, 5, 6, 10], "been": [0, 4, 5, 6, 10], "befor": [2, 4, 5, 6, 10], "begin": [5, 6], "being": [0, 6], "belong": [4, 10], "below": [6, 9, 10], "best": [0, 6], "beta": 5, "beta3": 7, "beta4": 7, "beta5": 7, "beta6": [1, 5, 7], "between": [4, 5, 10], "beyond": [4, 10], "big": 6, "bin": 6, "bind": [6, 9], "block": 6, "blueski": 0, "book": [4, 10], "boolean": [4, 10], "boot": 6, "both": [0, 4], "break": 6, "browser": [5, 9], "bug": [0, 5], "bugfix": 5, "build": [4, 7], "builder": 4, "built": [1, 6, 11], "bulk": [2, 7], "bundl": 5, "c": [5, 6], "cach": 6, "call": [4, 6, 10], "can": [0, 2, 4, 5, 6, 9, 10, 11], "cannot": 5, "case": [4, 5], "caution": [2, 5, 9], "cc": 10, "cd": [5, 6, 9], "central": [4, 5, 10], "cern": 11, "ch": 11, "chang": [4, 6, 7, 9, 10], "change_m": 6, "chapter": [4, 10], "chatgpt": 10, "check": [4, 6], "chmod": 6, "choos": 0, "chose": 6, "chrome": 5, "chronolog": [4, 10], "class": 4, "clean": 5, "clearer": 0, "cli": [0, 7, 9], "click": 6, "client": 5, "clone": [5, 7], "cm": 10, "co": 6, "code": [7, 9, 10], "codebas": 9, "coderepositori": 10, "cog": 6, "collabor": [1, 10], "collect": [0, 2, 5, 7, 9], "com": [4, 6, 9, 10], "command": [0, 5, 7, 9], "commerci": 10, "commiss": [4, 10], "committe": [4, 10], "common": [0, 1, 4, 5, 9, 10, 11], "commons_api_token": 6, "commons_search_api_token": 6, "commun": [0, 9], "comparison": 0, "compil": 6, "complement": [4, 10], "complet": [4, 5, 9, 10], "compon": [0, 4, 5], "compos": [5, 7], "comput": 6, "condit": 10, "conf": 5, "confer": [4, 10], "config": [4, 6], "configur": [5, 7], "confus": 0, "consid": 5, "constrain": [4, 10], "contain": [0, 4, 5, 7, 9, 10], "container": 7, "content": [9, 10], "continu": 5, "control": [4, 7], "conveni": 6, "convert": [4, 10], "coordin": 10, "copi": [5, 6, 9], "copyright": 7, "core": [2, 7, 9], "corpor": [4, 10], "correct": [2, 6, 9], "correctli": 0, "correspond": [2, 4, 10], "could": 0, "count": 2, "cours": [4, 6, 10], "cover": [4, 10], "cpython": 6, "creat": [0, 2, 4, 5, 10], "creatibutorsfield": 0, "creation": [0, 4, 10], "creativecommon": 10, "credit": 10, "ctrl": [5, 6], "curl": 6, "current": [0, 5, 6], "custom": [0, 5, 6, 7, 11], "custom_pdf_viewer_j": 5, "d": [5, 6, 9], "daemon": 6, "dashboard": [6, 9], "data": [0, 2, 5, 6, 9, 10], "databas": [2, 4, 10], "dataset": 10, "date": [0, 4, 6, 10], "datetim": [4, 10], "db": 6, "de": 10, "debug": [5, 9], "declar": 5, "deeper": 7, "default": [0, 4, 5, 6, 10], "defin": [4, 5, 6, 10], "delet": [2, 5], "demo": 6, "depart": [4, 10], "depend": [5, 6, 9], "deploi": [2, 5], "deploy": 5, "deposit": [7, 9, 10], "depth": 7, "describ": [4, 5, 9, 10], "descript": 10, "descriptor": [4, 10], "desir": [0, 4, 10], "desktop": 6, "despair": 9, "destroi": [2, 6, 9], "detail": [0, 7, 9, 10], "determin": [4, 10], "dev": [6, 9], "develop": [2, 6, 7, 11], "developmentstatu": 10, "dict": 5, "dictionari": 5, "differ": [4, 9, 10], "differenti": [4, 10], "dig": 7, "digit": 10, "direction": 4, "directli": [5, 6], "directori": 6, "discoveri": [4, 10], "displai": [0, 2], "dissert": [4, 10], "distinct": [4, 5, 10], "distress": [4, 10], "distribut": 10, "divid": [0, 2, 4, 10], "divis": 0, "do": [5, 6, 9], "doc": [5, 6, 11], "docker": [2, 5, 7], "dockerfil": 6, "document": [2, 4, 5, 6, 10], "doe": [0, 4, 5, 6, 10], "doi": [0, 10], "domain": [4, 10], "don": 9, "done": [5, 6], "down": [6, 9], "download": [4, 6, 10], "dphil": [4, 10], "draft": 4, "driver": 6, "dummi": 6, "dure": [0, 2, 4, 5, 6, 9, 10], "dynam": [2, 5], "e": [0, 2, 4, 5, 9, 10], "e2": 5, "each": [0, 4, 5, 6, 9, 10], "easi": 6, "edit": 0, "educ": [4, 10], "effect": [4, 5, 10], "effici": [4, 10], "either": [2, 6, 9], "els": 6, "email": [2, 6, 9, 10], "emailbackend": 4, "embargo": 10, "emit": 4, "emploi": [4, 5, 10], "empti": 0, "emul": 5, "en": 10, "enabl": [4, 10], "encourag": [4, 10], "end": [0, 5], "eng": 10, "engin": 6, "english": 10, "enough": 6, "ensur": [5, 9], "enter": [5, 6, 9], "entri": [4, 10], "env": [6, 9], "environ": [5, 7, 9], "error": [0, 5], "especi": [0, 5, 6], "etc": [2, 4, 5, 9, 10], "europ": [4, 10], "even": [0, 4, 10], "event": [0, 2, 4, 6, 10], "everi": 5, "exampl": [2, 4, 5, 6, 7], "except": 5, "exec": [2, 5, 6, 9], "exist": [0, 2, 5, 6], "explain": [6, 9], "export": 2, "extens": [4, 5, 6], "extra": 6, "extrem": 2, "f": 6, "facet": [4, 10], "fall": 10, "famili": 0, "family_nam": 10, "fast": 4, "featur": [5, 10], "feedback": 9, "field": [0, 7], "file": [1, 2, 4, 7, 10], "fill": 0, "final": 6, "find": [0, 2, 5, 6, 9], "first": [2, 5, 6, 9], "firstrecordcreatednotificationbuild": 4, "firstrecordcreatednotificationservic": 4, "firstrecordpublishednotificationbuild": 4, "fix": [0, 5], "fixtur": [5, 6, 9], "flag": [4, 6, 10], "flask": [2, 4, 5, 7], "flexibli": [4, 10], "flow": 5, "folder": [6, 9], "follow": [2, 4, 5, 6, 9, 10], "foo": 10, "forc": [5, 6], "fork": [6, 7], "form": [0, 7, 9, 10], "format": 10, "formgenr": [4, 10], "found": [2, 4, 10, 11], "four": 5, "free": [4, 6, 10], "freecodecamp": 6, "from": [0, 2, 4, 5, 6, 9, 10], "frontend": 6, "full": [0, 6, 7], "function": 0, "fund": [4, 10], "funder": 10, "further": [2, 6, 9], "futur": 0, "g": [0, 2, 4, 5, 9, 10], "gender": 10, "gener": [2, 4, 5, 6, 10], "geograph": [4, 10], "geometri": 10, "geonam": 10, "geopattern": 5, "get": [0, 6], "gh_page": 5, "git": 6, "github": [5, 6, 9, 10], "gitlab": 5, "given": 0, "given_nam": 10, "gninx": 6, "good": 6, "grant": [4, 10], "grep": 2, "group": [2, 5, 6, 9, 10], "group_identifi": [4, 10], "group_nam": [4, 10], "guarante": 6, "guid": 6, "h1": 10, "ha": [0, 4, 5, 6, 10], "handl": 0, "have": [0, 4, 5, 6, 9, 10], "hcommon": [4, 10], "head": 4, "header": 0, "help": [2, 4, 5, 6, 10], "here": [4, 6, 9, 10], "hidden": 0, "histor": [4, 10], "histori": [4, 5, 10], "historian": [4, 10], "hold": [4, 6, 10], "homoit0000669": [4, 10], "homosauru": 4, "host": [4, 10], "hour": 9, "how": 2, "how2shout": 6, "html": [4, 6, 10], "http": [4, 5, 6, 9, 10, 11], "human": [4, 10], "hyphen": [4, 6, 10], "i": [0, 1, 2, 4, 5, 9, 10, 11], "icon": 6, "id": [0, 4, 10], "idea": 6, "ident": 10, "identifi": [0, 4, 10], "illustr": 10, "imag": [0, 5, 6], "immedi": 5, "implement": 7, "import": [2, 5, 6, 7, 9, 10], "import_data": 6, "impos": [4, 10], "imprint": 10, "includ": [0, 1, 2, 4, 6, 9, 10, 11], "increment": 5, "index": [2, 4, 6, 7, 10], "indic": [2, 9], "individu": 6, "info": [4, 6, 10], "inform": [5, 11], "informationen": 10, "infrastructur": [0, 7], "ini": 6, "init": [5, 9], "initi": [0, 5], "insert": [6, 9], "insid": [2, 5, 6, 9], "instal": [5, 7], "instanc": [1, 2, 6, 7, 9, 11], "instance_path": [6, 9], "instead": [0, 5, 6], "institut": [4, 10], "instruct": [4, 5, 7, 9, 10], "instructionalresourc": 10, "integ": [4, 10], "integr": [5, 7], "intend": [4, 10], "inter": [5, 9], "interact": 5, "interfac": 6, "intern": [4, 10], "interpret": 6, "intersex": [4, 10], "introduc": 5, "introduct": [4, 10], "invenio": [7, 9, 10], "invenio_": 6, "invenio_app": 6, "invenio_csrf_secret_salt": 6, "invenio_custom_pdf_view": 5, "invenio_datacite_password": 6, "invenio_instance_path": 6, "invenio_notif": 4, "invenio_record_importer_data_dir": 6, "invenio_record_importer_local_data_dir": 6, "invenio_search_domain": 6, "invenio_secret_kei": 6, "invenio_security_login_salt": 6, "invenio_site_api_url": 6, "invenio_site_ui_url": 6, "invenio_sqlalchemy_database_uri": 6, "inveniordm": [1, 2, 5, 6, 7], "invert": 0, "invok": 2, "involv": [0, 4, 5, 9, 10], "isbn": 10, "iscitedbi": 10, "iso": [4, 10], "issn": 10, "issu": 10, "item": [4, 10], "its": [0, 5, 6, 9], "itself": [4, 10], "j": [0, 7], "jammi": 6, "jane": [4, 10], "janedo": 10, "javascript": 10, "jdoe": [4, 10], "jest": 5, "jinja": 4, "john": [4, 10], "journal": [4, 10], "json": [2, 5, 6, 7], "kc": [0, 2, 6, 7, 10], "kc_usernam": [4, 10], "kcr": 6, "kcr_api": 6, "kcr_ui": 6, "kcwork": [0, 6, 7], "keep": [5, 6], "keyboard": 0, "kingston": [4, 10], "knowldg": 9, "knowledg": [0, 1, 5, 9, 11], "label": [0, 4, 10], "lago": 10, "lambda": 6, "lang": 10, "languag": 10, "last": [2, 4, 5, 10], "latest": 5, "latin": [4, 10], "launch": 10, "layout": 0, "lcsh": [4, 10], "lcsh2fast": [4, 10], "lead": 0, "least": [0, 6], "leav": 5, "leftov": 5, "legaci": 2, "legalcod": 10, "less": [4, 5, 10], "level": [4, 10], "lib": 6, "licens": [1, 10], "like": [5, 6], "likewis": 5, "line": [0, 2, 9], "link": [0, 2, 4, 10], "linux": 5, "list": [2, 4, 5, 10], "literatur": [4, 10], "live": [6, 9], "load": 2, "local": [2, 5, 7], "localhost": [6, 9], "locat": [4, 5, 10], "lock": 6, "log": 4, "loglevel": 6, "logo": 0, "long": [0, 5, 6], "lost": 2, "lowercas": [4, 10], "lt": 6, "m": 5, "ma": [4, 10], "mac": 6, "machin": 6, "made": [0, 5, 10], "mai": [4, 5, 6, 9, 10], "mail": 4, "main": [0, 2, 4, 5, 9, 10], "make": [5, 6, 9], "manag": [0, 5, 6], "manual": 6, "markdown": 4, "match": [0, 6], "materi": [4, 10], "matter": [4, 10], "md": 5, "mean": [0, 4, 5, 6, 10], "meantim": 5, "mechan": [4, 10], "media": 0, "meet": [4, 10], "member": 0, "memori": 6, "menu": 0, "merg": 5, "mesh": [1, 9], "messag": 0, "met": 10, "metadata": [0, 2, 7], "method": 10, "michigan": 10, "middl": 2, "might": [0, 4, 6, 10], "migrant": [4, 10], "migrat": [4, 10], "minor": 5, "minut": 6, "miss": 0, "mit": 1, "mla": [4, 10], "modal": 0, "moder": 10, "moderatorrolerecipi": 4, "modern": [4, 10], "modifi": [0, 5], "modul": [0, 7, 9], "modular": 9, "monotask": 5, "more": [4, 5, 10], "most": [0, 5, 6], "mount": [6, 9], "mq": 6, "msu": 10, "much": [4, 10], "multipl": 0, "must": [4, 5, 6, 10], "my": 10, "myapitoken": 6, "mycours": 10, "myevent": 10, "myinveniodatacitepassword": 6, "mytoken": 6, "na": 0, "name": [0, 2, 4, 6, 9, 10], "name_parts_loc": 0, "namespac": [4, 10], "navig": [0, 5, 6, 9], "nc": 10, "necessari": [0, 6, 9], "need": [2, 7, 9], "new": [0, 4, 6, 10], "newer": 6, "newli": [4, 10], "newlin": 6, "next": [5, 6], "nginx": 9, "node": 7, "node_modul": 5, "normal": [5, 6, 9], "note": [2, 5, 7, 9], "notif": 7, "notificationop": 4, "notifications_moderator_rol": 4, "now": [0, 6, 9], "npm": 5, "number": [2, 4, 7, 10], "nvm": 7, "o": 6, "object": [4, 5, 10], "obtain": 6, "occupi": 5, "oclc": [4, 10], "octob": 10, "often": [5, 6], "old": 6, "onc": [5, 6], "one": [4, 6, 9, 10], "onli": [0, 2, 4, 5, 10], "onto": 9, "open": 6, "opengraph": 0, "opensearch": [2, 6, 9], "oper": [4, 6, 9], "opt": [5, 6, 9], "option": [0, 2, 4, 5, 9, 10], "orcid": [0, 4, 10], "order": [0, 5], "org": [4, 5, 6, 10], "organ": 4, "organiz": [4, 10], "origin": 5, "other": [0, 4, 5, 6, 10], "otherwis": 6, "out": 6, "output": 5, "over": 5, "overrid": [5, 10], "overridden": 5, "own": [5, 6], "ownership": [4, 10], "p": [2, 9, 10], "packag": [2, 6, 9, 10], "page": [0, 5, 7, 9, 10], "panel": 6, "paper": [4, 10], "parent": [6, 9], "part": [0, 1, 2, 4, 10], "particular": [6, 9], "particularli": 5, "password": [2, 6, 9], "patch": 5, "path": [4, 10], "patienc": 9, "pdf": [4, 10], "pdfj": 5, "pedagogi": 10, "pend": 0, "perform": 6, "permiss": 0, "persist": [4, 5, 6, 10], "person": [4, 10], "person_or_org": [4, 10], "pgadmin": [6, 9], "pgadmin_default_email": 6, "pgadmin_default_password": 6, "phd": [4, 10], "pick": 5, "pid": [5, 6, 9], "pidfil": 6, "pip": [5, 6], "pipenv": [5, 9], "pipfil": 5, "place": [4, 10], "plaintext": 4, "platform": 0, "poetri": [4, 10], "point": [0, 10], "possibl": [5, 10], "postgres_db": 6, "postgres_password": 6, "postgres_us": 6, "postgresql": 6, "potenti": [4, 10], "practic": 5, "prefix": [4, 10], "present": [0, 4, 10], "preserv": [4, 10], "press": 6, "previous": [0, 4, 10], "primari": [0, 4, 10], "primarili": [2, 4, 10], "print": [6, 10], "prior": [4, 6, 10], "privat": [6, 9], "problem": 5, "problemat": [4, 10], "proce": 6, "proceed": [4, 10], "process": [2, 10], "produc": [0, 2, 4, 10], "product": [2, 4, 5, 10], "profil": [0, 4], "program": 10, "programminglanguag": 10, "project": [4, 5, 6, 10], "proper": [0, 4, 10], "properti": 0, "provid": [2, 4, 5, 6, 9, 10], "provision": [9, 10], "prune": 5, "psychologi": 10, "psycopg2": 6, "public": [0, 4, 10], "publication_d": 10, "publish": [0, 4, 10], "pull": [5, 6], "purpos": [4, 10], "push": 5, "put": 6, "py": [2, 5], "pypi": 6, "pyproject": 5, "pytest": 5, "python": [7, 9, 10], "python3": 6, "python_local_git_packages_path": 6, "python_local_site_packages_path": 6, "queri": 0, "quick": 9, "quickli": 6, "quickstart": 7, "rabbitmq": 6, "race": 10, "random": [0, 6], "rather": 6, "rdm": [6, 9, 10], "rdmrecord": 4, "re": [5, 6, 10], "reach": 5, "react": 5, "read": 2, "readabl": [4, 5, 10], "reader": [4, 10], "readi": 5, "readm": 5, "real": 6, "reason": [6, 10], "rebuild": 6, "rebuilt": 5, "receiv": [4, 6], "recent": [0, 5], "recipi": 4, "recommend": 6, "record": [0, 2, 5, 7, 9], "recreat": [5, 6], "recurs": [5, 9], "redi": 6, "redis_domain": 6, "redund": [5, 9], "refactor": 0, "refer": [5, 6, 7, 9, 10], "reflect": [5, 9], "refresh": 5, "refuge": [4, 10], "regardless": 6, "registri": 10, "rel": [4, 10], "relat": [5, 10], "related_identifi": 10, "relation_typ": 10, "releas": [1, 6], "reliabl": 6, "reload": [5, 6, 9], "remot": [0, 2, 5, 6, 9, 10], "remov": 0, "replac": 6, "repo": 5, "repositori": [1, 5, 6, 10], "repres": 5, "request": [0, 5, 6], "requir": [4, 5, 7, 9, 10], "research": [1, 4, 9, 10], "resid": [4, 10], "resourc": [0, 6, 9, 10], "resource_typ": 10, "respect": 5, "respond": 5, "respons": 6, "rest": [6, 9], "restart": [5, 6, 9], "restrict": 10, "result": 0, "right": [0, 6, 10], "role": [4, 6, 10], "root": [5, 6], "rout": 0, "run": [4, 6, 7, 9], "runner": 5, "same": [4, 6, 10], "sandbox": 10, "save": 4, "schema": [0, 7], "scheme": [4, 10], "scienc": [4, 10], "script": [5, 9], "search": [0, 2, 7, 9, 10], "second": [4, 10], "secret": 6, "section": 10, "secur": 6, "see": [1, 5, 6, 9], "seen": 6, "select": 0, "selenium": 5, "self": 0, "semant": [4, 5], "semver": 5, "send": 4, "sent": 4, "separ": [5, 6, 9], "seri": [4, 10], "serial": 2, "series_titl": [4, 10], "series_volum": [4, 10], "serv": [6, 9], "server": [5, 9], "serverless": 6, "servic": [0, 2, 4, 7, 10], "services_setup": 9, "session": 6, "set": [4, 5, 6, 9, 10], "setup": [5, 6, 7], "sever": 6, "sexual": 10, "sh": [5, 6, 9], "share": [0, 1, 6], "shell": 6, "should": [0, 4, 5, 6, 9, 10], "sidebar": 0, "signal": 4, "similarli": [4, 9, 10], "simpl": [4, 10], "simpli": [5, 6], "sinc": [0, 2, 5, 6], "singl": [2, 5, 10], "site": [2, 6, 9], "size": [6, 10], "sl": 6, "slackbot": 6, "slider": 6, "so": [0, 2, 4, 5, 6, 9, 10], "social": 0, "softwar": [4, 10], "solut": 6, "solv": 0, "some": [0, 4, 5, 9, 10], "someth": 6, "sometim": [0, 5], "sort": [0, 10], "sourc": [5, 6, 9], "specif": [0, 4, 6], "specifi": 6, "sponsor": [4, 10], "squash": 5, "src": 5, "stage": [2, 5, 6], "stamp": 6, "stand": 5, "standalon": 6, "standard": [4, 10], "start": 5, "stat": [2, 4, 10], "state": 10, "statement": 9, "static": 9, "statu": [4, 10], "stdout": 6, "step": [5, 6, 9], "stop": [5, 6, 9], "store": [1, 2, 4, 5, 6, 10], "string": [0, 4, 10], "strongli": [4, 10], "structur": [6, 10], "style": 5, "sub": [2, 4, 6, 10], "submiss": 0, "submit": 0, "submitt": [4, 10], "submodul": 9, "substant": [4, 10], "subtitl": 10, "sudo": 6, "suffix": 5, "suggest": [4, 10], "suit": 5, "suitabl": 2, "superus": 6, "supplement": [4, 10], "suppli": 6, "support": [5, 6], "sur": 6, "sure": [5, 6], "syllabi": [4, 10], "syllabu": 10, "sync": 0, "syntax": 6, "synthet": 2, "system": [0, 1, 2, 5, 9], "systemd": 6, "t": [6, 9], "tab": 6, "tabl": 6, "tag": [4, 10], "tail": 6, "take": [5, 6, 9], "task": 5, "teach": 10, "technic": [0, 10], "technisch": 10, "tell": 6, "templat": 7, "temporari": 5, "termin": [5, 6], "test": [6, 7, 9, 10], "than": 6, "thei": [0, 4, 5, 10], "them": [0, 5, 6], "theses": [4, 10], "thesi": [4, 10], "thi": [0, 2, 4, 5, 6, 9, 10], "thing": 0, "those": [4, 5, 6, 9, 10], "though": 5, "three": 6, "through": 5, "time": [4, 5, 6, 9, 10], "titl": [0, 4, 10], "tmp": [5, 6, 9], "token": 6, "token_hex": 6, "toml": 5, "tool": [1, 4, 7, 10], "top": [4, 6, 10], "topic": [4, 10], "toronto": [4, 10], "total": [4, 10], "total_volum": 10, "track": 4, "true": [4, 9, 10], "try": 5, "tweak": 0, "two": [0, 4, 5, 6, 10], "txt": 1, "type": [0, 4, 10], "u": [4, 6, 10], "ubuntu": 6, "ui": [0, 2, 4, 5, 6, 9], "ukranian": [4, 10], "ultim": 5, "under": [1, 5, 6, 9], "underli": 2, "uni": 4, "unit": [4, 5], "univers": [4, 10], "unknown": 0, "unless": [5, 6, 9], "unlik": [4, 10], "unpublish": [4, 10], "unread": 4, "until": [5, 10], "up": [2, 5, 6, 9], "updat": [0, 2, 4, 7, 9, 10], "upload": [0, 5], "upstream": 7, "url": [4, 10], "us": [0, 2, 4, 5, 7, 9, 10], "usag": [2, 4, 10], "user": [0, 2, 5, 10], "usermod": 6, "usernam": [4, 10], "usr": 6, "usual": 5, "uwsgi": [5, 9], "uwsgi_api": 9, "uwsgi_rest": 6, "uwsgi_ui": [5, 6, 9], "v": [5, 6], "v1": 10, "v16": 6, "v2": 6, "v3": [4, 10], "valid": [4, 10], "valu": [0, 4, 6, 10], "var": [6, 9], "variabl": [4, 5], "variat": [4, 10], "varieti": 9, "variou": [6, 9, 10], "veri": 5, "version": [0, 1, 4, 7, 9, 10], "via": [4, 5, 6], "view": [0, 4, 5, 10], "virtual": 6, "virtualenv": 6, "visibl": [0, 5], "vocabulari": [7, 9], "volum": [4, 5, 6, 10], "voluntarili": [4, 10], "wa": [0, 4, 10], "wai": [4, 6, 10], "walk": 5, "want": [4, 5, 6, 9, 10], "warn": [2, 4, 5, 10], "watch": [5, 6], "watercolor": [4, 10], "we": 5, "web": [5, 6, 9], "webdriv": 5, "webhook": 4, "webpack": 5, "webpackthemebundl": 5, "well": [0, 4, 5, 6], "were": [0, 4, 6, 10], "what": [5, 10], "when": [0, 4, 5, 6, 9, 10], "whenev": [2, 5], "where": [0, 5, 6, 9], "wherev": 5, "whether": 4, "which": [0, 4, 5, 6, 9, 10], "whichev": 6, "while": [5, 9], "white": [4, 10], "whole": [0, 4, 10], "whose": 0, "widget": 0, "wikidata": 10, "window": [5, 6], "wip": 5, "within": [0, 4, 10], "without": [5, 6], "word": 0, "work": [0, 1, 4, 5, 9, 10, 11], "worker": [2, 5], "workshop": [4, 10], "worldcat": [4, 10], "would": [0, 2, 4, 5, 6, 10], "wrap": [0, 2], "written": 6, "wsl2": 5, "www": [4, 6, 10], "x": [6, 10], "x86_64": 6, "ye": 5, "yet": 6, "yml": [5, 6, 9], "you": [2, 4, 5, 6, 9, 10], "your": 5, "zenodo": 10, "zshrc": 6}, "titles": ["Changes", "About", "CLI Commands", "Configuration of InvenioRDM", "Customizations to InvenioRDM", "Developing KCWorks", "In-depth Installation Instructions (NEEDS UPDATING)", "Welcome to Knowledge Commons Works\u2019s documentation!", "KCWorks Infrastructure", "Installation", "Metadata Schema and Vocabularies", "Reference"], "titleterms": {"": 7, "0": [0, 6], "1": [0, 6, 9], "10": [0, 6], "11": 0, "12": 0, "16": 6, "17": 6, "18": 0, "2": [0, 9], "20": 6, "2024": 0, "3": [0, 6, 9], "30": 0, "4": 9, "5": 9, "6": 9, "9": 6, "In": [4, 6], "The": 5, "about": [1, 4, 6, 10], "ad": 5, "add": 6, "addit": 6, "admin": [6, 9], "ai_usag": [4, 10], "an": [5, 6], "api": 4, "app": 4, "applic": [6, 9], "asset": 9, "authent": 4, "autom": 5, "basic": 5, "beta3": 0, "beta4": 0, "beta5": 0, "beta6": 0, "book_seri": [4, 10], "branch": 5, "build": [5, 6, 9], "bulk": 4, "celeri": 6, "cfg": 5, "chang": [0, 5], "chapter_label": [4, 10], "cli": [2, 6], "clone": [6, 9], "code": [5, 6], "collect": [4, 10], "command": [2, 6], "commit": 5, "committee_deposit": [4, 10], "common": [6, 7], "commons_domain": [4, 10], "commons_search_recid": [4, 10], "commons_search_upd": [4, 10], "commun": 4, "compos": [6, 9], "configur": [3, 6, 9], "contain": [2, 6], "container": 6, "content": [4, 7], "content_warn": [4, 10], "context": 6, "contributor": [4, 10], "control": [5, 6, 9, 10], "copyright": 1, "core": [4, 10], "course_titl": [4, 10], "creat": [6, 9], "creator": [4, 10], "credenti": 6, "css": 5, "custom": [2, 4, 10], "custom_field": [4, 10], "data": 4, "databas": [6, 9], "deeper": 5, "degre": [4, 10], "deposit": 4, "depth": 6, "detail": 4, "develop": [5, 9], "dig": 5, "disciplin": [4, 10], "docker": [6, 9], "document": [7, 11], "edit": [4, 10], "email": 4, "enabl": 6, "ensur": 6, "entri": 5, "environ": 6, "error": 6, "exampl": 10, "extern": 5, "fast": [5, 10], "field": [4, 10], "file": [5, 6, 9], "file_loc": [4, 10], "file_pid": [4, 10], "first": 4, "fix": 6, "flask": 9, "fly": 5, "folder": 5, "fork": 4, "form": 4, "found": 6, "framework": 4, "full": 9, "git": [5, 9], "group": 4, "groups_for_deposit": [4, 10], "hc": [4, 10], "hclegaci": [4, 10], "head": 10, "homosauru": 10, "html": 5, "i": 6, "implement": [4, 10], "import": 4, "includ": 5, "indic": [6, 7], "inform": 6, "infrastructur": 8, "initi": [6, 9], "instal": [6, 9], "instanc": 5, "institution_depart": [4, 10], "instruct": 6, "integr": 4, "invenio": [2, 4, 5, 6], "inveniordm": [3, 4, 10, 11], "j": [5, 6], "javascript": 5, "json": 10, "just": 6, "kc": 4, "kcr": [4, 10], "kcwork": [2, 4, 5, 8, 9, 10], "knowledg": [6, 7], "legaci": [4, 10], "limit": 5, "line": 6, "linux": 6, "local": [6, 9], "log": 6, "maco": 6, "media": [4, 10], "meeting_organ": [4, 10], "metadata": [4, 10], "metadata_field": [4, 10], "moder": 4, "modul": [4, 5, 6], "modular": 4, "name": 5, "need": [5, 6], "new": 5, "nginx": 6, "node": [5, 6], "note": [4, 6, 10], "notif": 4, "number": 5, "nvm": 6, "organ": 10, "other": 9, "output": 6, "overrid": 4, "own": 9, "packag": [4, 5], "page": 4, "path": 6, "pipenv": 6, "point": 5, "previously_publish": [4, 10], "process": [5, 6], "project": 9, "project_titl": [4, 10], "provis": 4, "provision": 4, "publication_typ": [4, 10], "publication_url": [4, 10], "pyenv": 6, "python": [5, 6], "queue": 6, "quickstart": 9, "rdm": 4, "rebuild": 5, "record": [4, 10], "record_change_d": [4, 10], "record_creation_d": [4, 10], "record_identifi": [4, 10], "refer": 11, "releas": 5, "remot": 4, "repositori": 9, "requir": 6, "resourc": 4, "ror": 10, "rotat": 6, "run": [2, 5], "saml": 4, "schema": [4, 10], "script": 6, "search": [4, 6], "sensit": 6, "server": 6, "servic": [6, 9], "setup": 9, "shutdown": 6, "site": [4, 5, 10], "slow": 5, "some": 6, "sponsoring_institut": [4, 10], "standard": 6, "start": [6, 9], "startup": 6, "static": 5, "strategi": 5, "subject": [4, 10], "submitter_affili": [4, 10], "submitter_email": [4, 10], "submitter_id": [4, 10], "submitter_org_membership": [4, 10], "submitter_usernam": [4, 10], "submodul": 5, "sync": 4, "system": [4, 6, 10], "tabl": 7, "tag": 5, "task": 6, "templat": [4, 5], "test": 5, "theme": 5, "tool": 6, "total_download": [4, 10], "total_view": [4, 10], "updat": [5, 6], "upstream": 5, "us": 6, "user": [4, 6, 9], "user_defined_tag": [4, 10], "uwsgi": 6, "variabl": 6, "version": [5, 6], "view": [6, 9], "vocabulari": [4, 10], "welcom": 7, "work": [6, 7], "worker": 6, "your": [6, 9]}}) \ No newline at end of file +Search.setIndex({"alltitles": {"0.3.0-beta3 (2024-11-30)": [[2, "beta3-2024-11-30"]], "0.3.1-beta4 (2024-12-10)": [[2, "beta4-2024-12-10"]], "0.3.2-beta5 (2024-12-11)": [[2, "beta5-2024-12-11"]], "0.3.3-beta6 (2024-12-18)": [[2, "beta6-2024-12-18"]], "0.3.4-beta7 (2025-01-09)": [[2, "beta7-2025-01-09"]], "0.3.5-beta8 (2025-01-10)": [[2, "beta8-2025-01-10"]], "1. Clone the git repository": [[10, "clone-the-git-repository"]], "2. Create your configuration files": [[10, "create-your-configuration-files"]], "3. Start the docker-compose project": [[10, "start-the-docker-compose-project"]], "4. Initialize the database and other services, and build asset files": [[10, "initialize-the-database-and-other-services-and-build-asset-files"]], "5. Create your own admin user": [[10, "create-your-own-admin-user"]], "6. View the application": [[10, "view-the-application"]], "A successful import response": [[1, "a-successful-import-response"]], "API": [[1, "api"]], "About": [[0, "about"]], "Add and Configure an Environment File": [[7, "add-and-configure-an-environment-file"]], "Adding new entry points": [[6, "adding-new-entry-points"]], "Adding new node.js packages to be included": [[6, "adding-new-node-js-packages-to-be-included"]], "Additional environment variables with sensitive information": [[7, "additional-environment-variables-with-sensitive-information"]], "Additional required environment variables with paths on your local file system": [[7, "additional-required-environment-variables-with-paths-on-your-local-file-system"]], "An unsuccessful import response": [[1, "an-unsuccessful-import-response"]], "Build and Configure the Containerized Services": [[7, "build-and-configure-the-containerized-services"]], "Build and start the containers": [[7, "build-and-start-the-containers"]], "Bulk Record Import (invenio-record-importer-kcworks)": [[5, "bulk-record-import-invenio-record-importer-kcworks"]], "CLI Commands": [[3, "cli-commands"]], "Changes": [[2, "changes"]], "Changes to external python modules (including Invenio modules)": [[6, "changes-to-external-python-modules-including-invenio-modules"]], "Changes to html template files": [[6, "changes-to-html-template-files"]], "Changes to invenio.cfg": [[6, "changes-to-invenio-cfg"]], "Changes to python code in the site folder": [[6, "changes-to-python-code-in-the-site-folder"]], "Changes to static files": [[6, "changes-to-static-files"]], "Changes to theme (CSS) and javascript files": [[6, "changes-to-theme-css-and-javascript-files"]], "Changing the Group Ownership of a Collection (PATCH)": [[1, "changing-the-group-ownership-of-a-collection-patch"]], "Clone the knowledge-commons-works Code": [[7, "clone-the-knowledge-commons-works-code"]], "Collections": [[5, "collections"]], "Collections for KC Groups (invenio-group-collections-kcworks)": [[5, "collections-for-kc-groups-invenio-group-collections-kcworks"]], "Commit strategy": [[6, "commit-strategy"]], "Configuration of InvenioRDM": [[4, "configuration-of-inveniordm"]], "Content moderation notifications": [[5, "content-moderation-notifications"]], "Contents:": [[8, null]], "Controlled Vocabularies": [[11, "controlled-vocabularies"]], "Controlling containerized nginx server": [[7, "controlling-containerized-nginx-server"]], "Controlling just the containerized services": [[7, "controlling-just-the-containerized-services"]], "Controlling the Application Services": [[7, "controlling-the-application-services"]], "Controlling the KCWorks (Flask) application": [[10, "controlling-the-kcworks-flask-application"]], "Copyright": [[0, "copyright"]], "Create an admin user": [[7, "create-an-admin-user"]], "Create and initialize the database, search indices, and task queue": [[7, "create-and-initialize-the-database-search-indices-and-task-queue"]], "Creating a Collection for a Group (POST)": [[1, "creating-a-collection-for-a-group-post"]], "Creating a new Work via the InvenioRDM REST API": [[1, "creating-a-new-work-via-the-inveniordm-rest-api"]], "Creator/contributor roles": [[11, "creator-contributor-roles"]], "Customizations to InvenioRDM": [[5, "customizations-to-inveniordm"]], "DOI": [[11, "doi"]], "DOI (primary identifier)": [[11, "doi-primary-identifier"]], "Deleting a Group\u2019s Collection (DELETE)": [[1, "deleting-a-group-s-collection-delete"]], "Deposit Form Customizations": [[5, "deposit-form-customizations"]], "Developing KCWorks": [[6, "developing-kcworks"]], "Digging deeper": [[6, "digging-deeper"]], "Docker log rotation": [[7, "docker-log-rotation"]], "Email templates": [[5, "email-templates"]], "Endpoint configuration": [[1, "endpoint-configuration"]], "Ensure some version of python is installed": [[7, "ensure-some-version-of-python-is-installed"]], "Error responses": [[1, "error-responses"]], "Event timing": [[1, "event-timing"]], "Example metadata record": [[11, "example-metadata-record"]], "FAST": [[11, "fast"]], "Fixing docker-compose \u201cnot found\u201d error": [[7, "fixing-docker-compose-not-found-error"]], "Forked Core Invenio Modules": [[5, "forked-core-invenio-modules"]], "Full local development setup": [[10, "full-local-development-setup"]], "Funders": [[11, "funders"]], "GET requests": [[1, "get-requests"]], "GND": [[11, "gnd"], [11, "id2"]], "Git Branching Strategy": [[6, "git-branching-strategy"]], "Git Submodules": [[6, "git-submodules"]], "Grid (deprecated)": [[11, "grid-deprecated"]], "Group Collections API": [[1, "group-collections-api"]], "Group collection owner": [[1, "group-collection-owner"]], "HC Legacy Custom Fields": [[5, "hc-legacy-custom-fields"], [11, "hc-legacy-custom-fields"]], "Handle (secondary identifier)": [[11, "handle-secondary-identifier"]], "Handling collection name collisions": [[1, "handling-collection-name-collisions"]], "Handling deleted group collections": [[1, "handling-deleted-group-collections"]], "Handling group name changes": [[1, "handling-group-name-changes"]], "Homosaurus": [[11, "homosaurus"]], "ISBN (secondary identifier)": [[11, "isbn-secondary-identifier"]], "ISNI": [[11, "isni"]], "ISSN (secondary identifier)": [[11, "issn-secondary-identifier"]], "Identifier Schemes": [[11, "identifier-schemes"]], "In-app notifications": [[5, "in-app-notifications"]], "In-depth Installation Instructions (NEEDS UPDATING)": [[7, "in-depth-installation-instructions-needs-updating"]], "Install Docker 20.10.10+ and Docker-compose 1.17.0+": [[7, "install-docker-20-10-10-and-docker-compose-1-17-0"]], "Install Node.js and NVM": [[7, "install-node-js-and-nvm"]], "Install Python and Required Python Tools": [[7, "install-python-and-required-python-tools"]], "Install and enable Python 3.9.16": [[7, "install-and-enable-python-3-9-16"]], "Install pyenv and pipenv": [[7, "install-pyenv-and-pipenv"]], "Install the Invenio Python Modules": [[7, "install-the-invenio-python-modules"]], "Install the invenio-cli command line tool": [[7, "install-the-invenio-cli-command-line-tool"]], "Installation": [[10, "installation"]], "Integrations with KC": [[5, "integrations-with-kc"]], "InvenioRDM Documentation": [[12, "inveniordm-documentation"]], "JSON object for record creation": [[11, "json-object-for-record-creation"]], "JSON object retrieved from the record API": [[11, "json-object-retrieved-from-the-record-api"]], "Javascript tests": [[6, "javascript-tests"]], "KC Search Provisioning (invenio-remote-api-provisioner)": [[5, "kc-search-provisioning-invenio-remote-api-provisioner"]], "KC Username (recommended)": [[11, "kc-username-recommended"]], "KCWorks Custom CLI Commands": [[3, "kcworks-custom-cli-commands"]], "KCWorks Custom Fields (kcworks/site/metadata_fields)": [[5, "kcworks-custom-fields-kcworks-site-metadata-fields"], [11, "kcworks-custom-fields-kcworks-site-metadata-fields"]], "KCWorks Implementation of Core InvenioRDM Fields": [[11, "kcworks-implementation-of-core-inveniordm-fields"]], "KCWorks Infrastructure": [[9, "kcworks-infrastructure"]], "Linux": [[7, "linux"]], "MacOS": [[7, "macos"]], "Making duplicate import requests": [[1, "making-duplicate-import-requests"]], "Metadata Schema Customizations": [[5, "metadata-schema-customizations"]], "Metadata Schema, Vocabularies, and Identifiers": [[11, "metadata-schema-vocabularies-and-identifiers"]], "Modular Framework (invenio-modular-deposit-form)": [[5, "modular-framework-invenio-modular-deposit-form"]], "Modular Framework (invenio-modular-detail-page)": [[5, "modular-framework-invenio-modular-detail-page"]], "Naming Commits": [[6, "naming-commits"]], "Note about docker contexts": [[7, "note-about-docker-contexts"]], "Notes about Implementation of Core InvenioRDM Fields": [[5, "notes-about-implementation-of-core-inveniordm-fields"]], "Notifications": [[5, "notifications"]], "OAI (secondary identifier)": [[11, "oai-secondary-identifier"]], "OFR": [[11, "ofr"]], "ORCID (recommended)": [[11, "orcid-recommended"]], "Only some of the works to be imported failed": [[1, "only-some-of-the-works-to-be-imported-failed"]], "Organizations": [[11, "organizations"]], "Overrides in the KCWorks Package (kcworks/site)": [[5, "overrides-in-the-kcworks-package-kcworks-site"], [5, "id1"]], "POST requests": [[1, "post-requests"]], "Page templates": [[5, "page-templates"]], "Pagination": [[1, "pagination"]], "Payload objects": [[1, "payload-objects"]], "People": [[11, "people"]], "Permissions and access in newly created collections": [[1, "permissions-and-access-in-newly-created-collections"]], "Python tests": [[6, "python-tests"]], "Query parameters": [[1, "query-parameters"]], "Quickstart": [[10, "quickstart"]], "ROR (recommended)": [[11, "ror-recommended"]], "Rebuilding changed files on the fly (fast but limited)": [[6, "rebuilding-changed-files-on-the-fly-fast-but-limited"]], "Record Detail Page Customizations": [[5, "record-detail-page-customizations"]], "Reference": [[12, "reference"]], "Request": [[1, "request"], [1, "id6"], [1, "id7"], [1, "id11"], [1, "id15"], [1, "id18"], [1, "id22"], [1, "id27"]], "Request body": [[1, "request-body"], [1, "id19"], [1, "id23"]], "Requesting a specific collection": [[1, "requesting-a-specific-collection"]], "Requesting all collections": [[1, "requesting-all-collections"]], "Requesting collections for a Commons instance": [[1, "requesting-collections-for-a-commons-instance"]], "Requesting collections for a specific group": [[1, "requesting-collections-for-a-specific-group"]], "Required headers": [[1, "required-headers"]], "Resource types": [[11, "resource-types"]], "Retrieving Group Collection Metadata (GET)": [[1, "retrieving-group-collection-metadata-get"]], "Running CLI Commands in the KCWorks Container": [[3, "running-cli-commands-in-the-kcworks-container"]], "Running Invenio CLI Commands": [[3, "running-invenio-cli-commands"]], "Running automated tests (NEEDS UPDATING)": [[6, "running-automated-tests-needs-updating"]], "SAML Authentication": [[5, "saml-authentication"]], "Sorting": [[1, "sorting"]], "Standardized environment variables": [[7, "standardized-environment-variables"]], "Start the uwsgi applications and celery worker": [[7, "start-the-uwsgi-applications-and-celery-worker"]], "Startup and shutdown scripts": [[7, "startup-and-shutdown-scripts"]], "Streamlined Import API": [[1, "streamlined-import-api"]], "Subject headings": [[11, "subject-headings"]], "Success responses": [[1, "success-responses"]], "Successful Response Body:": [[1, "id9"], [1, "id13"], [1, "id17"]], "Successful Response Headers": [[1, "successful-response-headers"]], "Successful Response Status Code": [[1, "successful-response-status-code"], [1, "id16"]], "Successful response body": [[1, "successful-response-body"], [1, "id21"], [1, "id25"]], "Successful response headers": [[1, "id10"], [1, "id14"]], "Successful response status code": [[1, "id8"], [1, "id12"], [1, "id20"], [1, "id24"], [1, "id28"]], "Tagging Releases": [[6, "tagging-releases"]], "Template Customizations": [[5, "template-customizations"]], "The InvenioRDM REST API": [[1, "the-inveniordm-rest-api"]], "The basic build process (slow)": [[6, "the-basic-build-process-slow"]], "The import request": [[1, "the-import-request"]], "The request file upload failed": [[1, "the-request-file-upload-failed"]], "The request metadata is malformed or invalid": [[1, "the-request-metadata-is-malformed-or-invalid"]], "The token does not have the necessary permissions": [[1, "the-token-does-not-have-the-necessary-permissions"]], "Unsuccessful response codes": [[1, "unsuccessful-response-codes"], [1, "id26"], [1, "id29"]], "Updating an Instance with Upstream Changes": [[6, "updating-an-instance-with-upstream-changes"]], "Updating the running KCWorks instance with development changes": [[6, "updating-the-running-kcworks-instance-with-development-changes"]], "Use the application!": [[7, "use-the-application"]], "User Data Sync (invenio-remote-user-data-kcworks)": [[5, "user-data-sync-invenio-remote-user-data-kcworks"]], "User and Group Data Updates (Internal Only)": [[1, "user-and-group-data-updates-internal-only"]], "User-first-record notifications": [[5, "user-first-record-notifications"]], "User/Groups Metadata updates and SAML authentication": [[1, "user-groups-metadata-updates-and-saml-authentication"]], "Variables for local credentials": [[7, "variables-for-local-credentials"]], "Version Control": [[6, "version-control"]], "Version Numbering": [[6, "version-numbering"]], "View container logging output": [[7, "view-container-logging-output"]], "View logging output for uwsgi processes": [[7, "view-logging-output-for-uwsgi-processes"]], "Welcome to the Knowledge Commons Works technical documentation!": [[8, "welcome-to-the-knowledge-commons-works-technical-documentation"]], "What happens to an import request that fails?": [[1, "what-happens-to-an-import-request-that-fails"]], "Who can use the import API?": [[1, "who-can-use-the-import-api"]], "Works": [[11, "works"]], "custom_fields.hclegacy:collection": [[5, "custom-fields-hclegacy-collection"], [11, "custom-fields-hclegacy-collection"]], "custom_fields.hclegacy:committee_deposit": [[5, "custom-fields-hclegacy-committee-deposit"], [11, "custom-fields-hclegacy-committee-deposit"]], "custom_fields.hclegacy:file_location": [[5, "custom-fields-hclegacy-file-location"], [11, "custom-fields-hclegacy-file-location"]], "custom_fields.hclegacy:file_pid": [[5, "custom-fields-hclegacy-file-pid"], [11, "custom-fields-hclegacy-file-pid"]], "custom_fields.hclegacy:groups_for_deposit": [[5, "custom-fields-hclegacy-groups-for-deposit"], [11, "custom-fields-hclegacy-groups-for-deposit"]], "custom_fields.hclegacy:previously_published": [[5, "custom-fields-hclegacy-previously-published"], [11, "custom-fields-hclegacy-previously-published"]], "custom_fields.hclegacy:publication_type": [[5, "custom-fields-hclegacy-publication-type"], [11, "custom-fields-hclegacy-publication-type"]], "custom_fields.hclegacy:record_change_date": [[5, "custom-fields-hclegacy-record-change-date"], [11, "custom-fields-hclegacy-record-change-date"]], "custom_fields.hclegacy:record_creation_date": [[5, "custom-fields-hclegacy-record-creation-date"], [11, "custom-fields-hclegacy-record-creation-date"]], "custom_fields.hclegacy:record_identifier": [[5, "custom-fields-hclegacy-record-identifier"], [11, "custom-fields-hclegacy-record-identifier"]], "custom_fields.hclegacy:submitter_affiliation": [[5, "custom-fields-hclegacy-submitter-affiliation"], [11, "custom-fields-hclegacy-submitter-affiliation"]], "custom_fields.hclegacy:submitter_id": [[5, "custom-fields-hclegacy-submitter-id"], [11, "custom-fields-hclegacy-submitter-id"]], "custom_fields.hclegacy:submitter_org_memberships": [[5, "custom-fields-hclegacy-submitter-org-memberships"], [11, "custom-fields-hclegacy-submitter-org-memberships"]], "custom_fields.hclegacy:total_downloads": [[5, "custom-fields-hclegacy-total-downloads"], [11, "custom-fields-hclegacy-total-downloads"]], "custom_fields.hclegacy:total_views": [[5, "custom-fields-hclegacy-total-views"], [11, "custom-fields-hclegacy-total-views"]], "invenio-communities": [[5, "invenio-communities"]], "invenio-rdm-records": [[5, "invenio-rdm-records"]], "invenio-records-resources": [[5, "invenio-records-resources"]], "invenio-vocabularies": [[5, "invenio-vocabularies"]], "kcr:ai_usage": [[5, "kcr-ai-usage"], [11, "kcr-ai-usage"]], "kcr:book_series": [[5, "kcr-book-series"], [11, "kcr-book-series"]], "kcr:chapter_label": [[5, "kcr-chapter-label"], [11, "kcr-chapter-label"]], "kcr:commons_domain": [[5, "kcr-commons-domain"], [11, "kcr-commons-domain"]], "kcr:commons_search_recid (system field)": [[5, "kcr-commons-search-recid-system-field"], [11, "kcr-commons-search-recid-system-field"]], "kcr:commons_search_updated (system field)": [[5, "kcr-commons-search-updated-system-field"], [11, "kcr-commons-search-updated-system-field"]], "kcr:content_warning": [[5, "kcr-content-warning"], [11, "kcr-content-warning"]], "kcr:course_title": [[5, "kcr-course-title"], [11, "kcr-course-title"]], "kcr:degree": [[5, "kcr-degree"], [11, "kcr-degree"]], "kcr:discipline": [[5, "kcr-discipline"], [11, "kcr-discipline"]], "kcr:edition": [[5, "kcr-edition"], [11, "kcr-edition"]], "kcr:institution_department": [[5, "kcr-institution-department"], [11, "kcr-institution-department"]], "kcr:media": [[5, "kcr-media"], [11, "kcr-media"]], "kcr:meeting_organization": [[5, "kcr-meeting-organization"], [11, "kcr-meeting-organization"]], "kcr:project_title": [[5, "kcr-project-title"], [11, "kcr-project-title"]], "kcr:publication_url": [[5, "kcr-publication-url"], [11, "kcr-publication-url"]], "kcr:sponsoring_institution": [[5, "kcr-sponsoring-institution"], [11, "kcr-sponsoring-institution"]], "kcr:submitter_email": [[5, "kcr-submitter-email"], [11, "kcr-submitter-email"]], "kcr:submitter_username": [[5, "kcr-submitter-username"], [11, "kcr-submitter-username"]], "kcr:user_defined_tags": [[5, "kcr-user-defined-tags"], [11, "kcr-user-defined-tags"]], "metadata.creators/metadata.contributors": [[5, "metadata-creators-metadata-contributors"], [11, "metadata-creators-metadata-contributors"]], "metadata.subjects": [[5, "metadata-subjects"], [11, "metadata-subjects"]]}, "docnames": ["README", "api", "changelog", "cli_commands", "configuration", "customizations", "developing", "in_depth", "index", "infrastructure", "installation", "metadata", "reference"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["README.md", "api.md", "changelog.md", "cli_commands.md", "configuration.md", "customizations.md", "developing.md", "in_depth.md", "index.rst", "infrastructure.md", "installation.md", "metadata.md", "reference.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 3, 5, 6, 7, 11], "0": [0, 1, 6, 8, 10, 11], "00": [1, 5, 11], "0000": [1, 5, 11], "0001": 11, "00k4n6c32": 11, "00z": [1, 5, 11], "01": [1, 5, 8, 11], "01t00": [1, 5, 11], "0378": 11, "04": 7, "06": 11, "09": [8, 11], "1": [1, 5, 6, 8, 11], "10": [1, 8, 10, 11], "100": 1, "1001634": [5, 11], "1038515d68f7": 1, "1086436": 11, "11": [7, 8, 11], "111023": 11, "12": [7, 8, 10], "123": 11, "1234": [1, 11], "12345": 1, "123456": [5, 11], "1234567890": 1, "1234567891": 1, "12345abcd": 11, "1263": [5, 11], "13": 11, "17": [8, 10], "18": 8, "19": 7, "2": [1, 6, 7, 8, 11], "20": [8, 10], "200": 1, "2007": 11, "201": 1, "2018": 11, "202": 1, "2020": 11, "2022": 11, "2023": 0, "2024": [1, 5, 8, 11], "2025": [8, 11], "2029": 11, "204": 1, "207": 1, "22": 7, "2345": 11, "24": [0, 11], "25": 1, "251587": 11, "2nd": 11, "3": [0, 1, 6, 8], "30": 8, "304": 1, "32": 11, "3dmodel": 11, "4": [1, 8, 11], "400": 1, "403": 1, "404": 1, "409": 1, "422": 1, "45": 1, "456": 11, "458": 11, "4891": 1, "5": [0, 1, 8], "50": 1, "504": 1, "5402d72b": 1, "5601": [7, 10], "5955": 11, "6": [1, 7], "60": 11, "6379": 7, "63932": 11, "6780": 11, "6789": 11, "67890": 1, "7": 1, "8": 11, "8601": [5, 11], "8gb": 7, "9": 1, "90": 1, "9200": 7, "94682": 11, "958235": 11, "966892": 11, "A": [2, 5, 11], "As": 11, "At": 7, "But": [1, 10, 11], "By": [1, 6], "For": [1, 3, 5, 6, 7, 11], "If": [1, 5, 6, 7, 10, 11], "In": [1, 6, 8, 11], "It": [0, 1, 2, 3, 5, 6, 7, 10, 11], "Its": 1, "NOT": [1, 10], "No": [1, 6], "Not": 1, "On": [3, 7], "One": [5, 7, 11], "Or": [6, 7], "TO": 10, "That": [5, 11], "The": [2, 5, 7, 8, 10, 11, 12], "Then": [3, 6, 7], "There": [1, 6, 7], "These": [1, 2, 3, 5, 6, 7, 10, 11], "To": [1, 3, 6, 7, 10], "With": [2, 7], "__init__": 6, "__name__": 6, "aa8": 1, "abil": 11, "abl": [1, 7], "about": [1, 6, 8, 11], "abov": [1, 6, 11], "absenc": 1, "abstract": 11, "abus": [5, 11], "ac": 11, "academ": [0, 5, 11], "accept": [1, 11], "access": [2, 7, 10, 11], "accident": 1, "accommod": 1, "account": [1, 5, 11], "acronym": 11, "across": 1, "action": 1, "activ": [1, 6, 7, 10, 11], "actor": 11, "actual": [1, 7, 11], "ad": [1, 2, 5, 11], "adaptor": 11, "add": [2, 5, 6, 8, 10, 11], "addit": [1, 5, 6, 10, 11], "addition": 7, "additional_descript": 11, "additional_titl": 11, "address": [1, 5, 7, 11], "admin": [1, 5, 11], "administ": 1, "administr": [1, 7, 10], "administrativ": 1, "advis": 7, "affect": [1, 2], "affili": [5, 11], "after": [1, 6, 7, 10], "ag": 11, "again": [1, 6, 7, 11], "against": 7, "agent": 1, "aggreg": [1, 3, 5, 11], "ai": [5, 11], "ai_descript": [5, 11], "ai_us": [5, 11], "alia": 7, "alias": 6, "all": [2, 3, 5, 6, 7, 10, 11], "all_or_non": 1, "allow": [1, 2, 5, 7, 10, 11], "alon": 6, "along": [5, 6, 11], "alongsid": 7, "alreadi": [1, 6, 7], "also": [1, 2, 3, 5, 6, 7, 11], "altern": [7, 11], "although": 11, "alwai": [2, 7], "ambigu": [5, 11], "american": [5, 11], "among": 2, "an": [0, 2, 5, 8, 10, 11, 12], "anaconda": 7, "analyst": 11, "ani": [1, 3, 5, 6, 7, 11], "annot": 11, "anoth": 7, "anotherusernam": 1, "api": [2, 3, 6, 7, 8, 10], "api_token": 7, "app": [7, 10], "appear": [1, 2, 10, 11], "append": [1, 7], "appli": 1, "applic": [1, 6, 8, 11], "approach": [7, 11], "appropri": [1, 7, 11], "ar": [1, 2, 3, 5, 6, 7, 10, 11], "arbitrari": 11, "archiv": 1, "area": [5, 11], "aren": 7, "argument": 3, "aria": 2, "arli": 2, "arlisna": [5, 11], "around": 1, "arrai": [1, 5, 11], "arrang": 11, "art": [5, 11], "articl": [5, 11], "artifact": [5, 11], "artisan": 11, "artist": [5, 11], "asc": 1, "ascend": 1, "ask": 7, "asset": 6, "assign": [1, 5, 7, 11], "assignfast": [5, 11], "associ": [1, 5, 11], "assum": [1, 7], "attach": [1, 11], "attempt": 1, "attributednam": 11, "audienc": 11, "audio": [5, 11], "audiorecord": 11, "audiovisu": 11, "augment": 11, "austen": [5, 11], "authent": [], "author": [1, 11], "authorofafterword": 11, "authorofforeword": 11, "authorofintroduct": 11, "auto": 2, "autom": 8, "automat": [1, 5, 6, 7, 11], "avail": [1, 3, 6, 7, 11], "avatar": 1, "avoid": [1, 2, 6], "aw": 7, "awar": [5, 7, 11], "award": [1, 11], "awkward": 1, "b": [1, 6, 11], "b144": 1, "back": [2, 3, 6], "backend": 5, "background": [1, 7], "bad": 1, "bar": [7, 11], "bare": 1, "base": [1, 5, 11], "bash": [3, 6, 7, 10], "bashrc": 7, "basic": 11, "bearer": 1, "beat": 7, "becaus": [1, 2, 5, 6, 7, 11], "becom": 1, "been": [1, 2, 5, 6, 7, 11], "befor": [1, 3, 5, 6, 7, 11], "begin": [6, 7], "being": [1, 2, 7, 11], "belong": [1, 5, 11], "below": [1, 7, 10, 11], "beneath": 11, "best": [2, 7, 11], "bestmatch": 2, "beta": 6, "beta3": 8, "beta4": 8, "beta5": 8, "beta6": [6, 8], "beta7": 8, "beta8": [0, 8], "between": [1, 5, 6, 11], "beyond": [5, 11], "bibliographi": 11, "big": 7, "bin": 7, "binari": 1, "bind": [7, 10], "blob": [], "block": 7, "blogpost": 11, "blueski": 2, "book": [5, 11], "booksect": 11, "boolean": [1, 5, 11], "boot": 7, "both": [1, 2, 5, 11], "break": [1, 7], "broke": 2, "browser": [6, 10], "bucket": 1, "bug": [2, 6], "bugfix": 6, "build": [2, 5, 8], "builder": 5, "built": [0, 1, 7, 12], "bulk": [3, 8], "bundl": 6, "c": [1, 6, 7], "cach": 7, "call": [1, 5, 7, 11], "callback": 1, "can": [2, 3, 5, 6, 7, 10, 11, 12], "cannot": [1, 6], "carri": 1, "case": [1, 5, 6, 11], "catalog": 11, "caution": [3, 6, 10], "cc": 11, "cd": [6, 7, 10], "central": [1, 5, 6, 11], "cern": [1, 12], "certain": 1, "cfg": 1, "ch": [1, 12], "chanc": 1, "chang": [5, 7, 8, 10, 11], "change_m": 7, "chapter": [5, 11], "chart": 11, "chatgpt": 11, "check": [1, 5, 7], "checksum": 1, "children": 1, "chmod": 7, "choos": [2, 11], "choreograph": 11, "chose": 7, "chrome": 6, "chronolog": [5, 11], "cinematograph": 11, "class": [1, 5], "clean": 6, "clearer": 2, "cli": [1, 2, 8, 10], "click": 7, "client": [1, 6], "clone": [6, 8], "close": 1, "cm": 11, "co": 7, "coar": 11, "code": [8, 10, 11], "codebas": 10, "coderepositori": 11, "cog": 7, "collabor": [0, 11], "collect": [2, 3, 6, 8, 10], "collection_id": 1, "collection_slug": 1, "collection_vis": 1, "collector": 11, "collid": 1, "com": [1, 5, 7, 10, 11], "command": [1, 2, 6, 8, 10], "commerci": 11, "commiss": [5, 11], "commit": 1, "committe": [5, 11], "committeechair": 11, "committeememb": 11, "common": [0, 2, 5, 6, 10, 11, 12], "commons_api_token": [1, 7], "commons_group_descript": 1, "commons_group_id": 1, "commons_group_nam": 1, "commons_group_vis": 1, "commons_inst": 1, "commons_search_api_token": 7, "commun": [1, 2, 10], "compar": 11, "comparison": 2, "compil": 7, "complement": [5, 11], "complet": [1, 5, 6, 10, 11], "compon": [1, 2, 5, 6], "compos": [6, 8, 11], "compress": 1, "comput": 7, "computationalmodel": 11, "computationalnotebook": 11, "condit": 11, "conductor": 11, "conf": 6, "confer": [5, 11], "conferencepap": 11, "conferencepost": 11, "conferenceproceed": 11, "config": [1, 5, 7], "configur": [6, 8], "confirm": 1, "conflict": [1, 2], "conform": 1, "confus": [1, 2, 11], "connect": 1, "consid": [1, 6], "constrain": [5, 11], "consult": 11, "contactperson": 11, "contain": [1, 2, 5, 6, 8, 10, 11], "container": 8, "content": [1, 10, 11], "continu": 6, "contribuor": 11, "contribut": 11, "contributor": 8, "control": [1, 2, 5, 8], "conveni": [1, 7], "convert": [5, 11], "coordin": 11, "copi": [6, 7, 10], "copyright": 8, "core": [3, 8, 10], "corpor": [1, 5, 11], "correct": [1, 3, 7, 10, 11], "correctli": 2, "correspond": [1, 3, 5, 11], "corrupt": 1, "could": [1, 2], "count": 3, "cours": [5, 7, 11], "cover": [5, 11], "cpython": 7, "creat": [2, 3, 5, 6, 11], "creatibutorsfield": 2, "creation": [1, 2, 5], "creativ": 11, "creativecommon": 11, "creator": [1, 8], "credit": 11, "csl": 11, "ctrl": [6, 7], "curat": 1, "curation_polici": 1, "curl": 7, "current": [1, 2, 6, 7, 11], "curriculum": 11, "custom": [2, 6, 7, 8, 12], "custom_field": 1, "custom_pdf_viewer_j": 6, "d": [6, 7, 10], "daemon": 7, "dashboard": [2, 7, 10], "data": [2, 3, 6, 7, 8, 10, 11], "databas": [1, 3, 5, 11], "datacit": 11, "datacollector": 11, "datacur": 11, "datamanag": 11, "datamanagementplan": 11, "dataset": 11, "date": [1, 2, 5, 7, 11], "datetim": [5, 11], "db": 7, "de": 11, "debug": [6, 10], "declar": [1, 6], "dedicate": 11, "deeper": 8, "default": [1, 2, 5, 6, 7, 11], "defin": [5, 6, 7, 11], "definit": 1, "delai": 1, "delet": [3, 6], "deletion_statu": 1, "demo": 7, "depart": [5, 11], "depend": [1, 6, 7, 10], "deploi": [3, 6], "deploy": 6, "deposit": [8, 10, 11], "depositor": 11, "depth": 8, "desc": 1, "descend": 1, "describ": [1, 5, 6, 10, 11], "descript": [1, 11], "descriptor": [5, 11], "design": 11, "desir": [1, 2, 5, 11], "desktop": 7, "despair": 10, "destroi": [3, 7, 10], "detail": [1, 2, 8, 10, 11], "detect": 1, "determin": [5, 11], "dev": [1, 7, 10], "develop": [3, 7, 8, 12], "developmentstatu": 11, "diagram": 11, "dict": 6, "dictionari": [1, 6], "did": 1, "differ": [1, 5, 10, 11], "differenti": [5, 11], "difficult": 1, "dig": 8, "digit": 11, "direction": 5, "directli": [1, 6, 7], "director": 11, "directori": 7, "disambigu": 1, "discover": 1, "discoveri": [5, 11], "discuss": [1, 11], "displai": [2, 3], "dissert": [5, 11], "distinct": [5, 6, 11], "distress": [5, 11], "distribut": [1, 11], "distributor": 11, "divers": 11, "divid": [2, 3, 5, 11], "divis": [2, 11], "dnb": 11, "do": [1, 6, 7, 10, 11], "doc": [1, 6, 7, 12], "doc_count": 1, "docker": [3, 6, 8], "dockerfil": 7, "document": [1, 2, 3, 5, 6, 7, 11], "documentari": 11, "doe": [2, 5, 6, 7, 11], "doi": [1, 2], "domain": [5, 11], "don": 10, "done": [6, 7], "donor": 11, "down": [7, 10], "download": [1, 5, 7, 11], "dphil": [5, 11], "draft": [1, 5], "drafter": 11, "drawn": 11, "driver": 7, "dummi": 7, "duplic": [], "dure": [1, 2, 3, 5, 6, 7, 10, 11], "dynam": [3, 6], "e": [1, 2, 3, 5, 6, 10, 11], "e2": 6, "each": [1, 2, 5, 6, 7, 10, 11], "earlier": 1, "eas": 11, "easi": 7, "easili": 11, "edit": [1, 2], "editor": 11, "editori": 11, "edtf": 1, "educ": [5, 11], "effect": [5, 6, 11], "effici": [5, 11], "eight": 11, "either": [1, 3, 7, 10, 11], "electron": 11, "els": 7, "elsewher": 11, "email": [1, 3, 7, 10, 11], "emailbackend": 5, "embargo": 11, "emit": 5, "emploi": [1, 5, 6, 11], "empti": [1, 2], "emul": 6, "en": 11, "enabl": [5, 11], "encompass": 11, "encount": 1, "encourag": [5, 11], "end": [1, 2, 6], "endpoint": [], "eng": 11, "engag": 11, "engin": [7, 11], "english": 11, "enough": 7, "ensur": [1, 6, 10], "enter": [6, 7, 10], "entir": 1, "entiti": 1, "entri": [5, 11], "env": [7, 10], "environ": [1, 6, 8, 10], "er": 11, "error": [2, 6], "especi": [2, 6, 7], "essai": 11, "establish": 1, "etc": [1, 3, 5, 6, 10, 11], "eurepo": 11, "europ": [5, 11], "even": [1, 2, 5, 11], "event": [2, 3, 5, 7, 11], "eventu": 1, "everi": 6, "exactli": [1, 11], "examin": 11, "exampl": [1, 3, 5, 6, 7, 8], "exce": 1, "except": [1, 6, 11], "exec": [3, 6, 7, 10], "exist": [1, 2, 3, 6, 7], "expand": 11, "explain": [7, 10], "export": [3, 11], "extend": 1, "extens": [5, 6, 7], "extern": 11, "extra": 7, "extrem": 3, "f": 7, "facet": [5, 11], "facilit": 11, "fall": 11, "fals": 1, "famili": 2, "familiar": 1, "family_nam": 11, "fast": 5, "favour": 11, "featur": [1, 6, 11], "feedback": 10, "field": [1, 2, 8], "figur": 11, "file": [0, 3, 5, 8, 11], "file1": 1, "file2": 1, "file3": 1, "filenam": 1, "fill": [2, 11], "filter": 1, "final": [1, 7], "find": [2, 3, 6, 7, 10, 11], "first": [1, 3, 6, 7, 10], "firstrecordcreatednotificationbuild": 5, "firstrecordcreatednotificationservic": 5, "firstrecordpublishednotificationbuild": 5, "fit": 11, "fix": [2, 6], "fixtur": [6, 7, 10], "flag": [5, 7, 11], "flask": [3, 5, 6, 8], "flat": 11, "flexibli": [5, 11], "flow": 6, "folder": [1, 7, 10], "follow": [1, 3, 5, 6, 7, 10, 11], "foo": 11, "forbidden": 1, "forc": [6, 7, 11], "fork": [7, 8], "form": [1, 2, 8, 10, 11], "format": [1, 11], "former": 1, "formerown": 11, "formgenr": [5, 11], "forthcom": 1, "found": [1, 3, 5, 11, 12], "four": [1, 6], "fraction": 1, "fragil": 1, "free": [1, 5, 7, 11], "freecodecamp": 7, "from": [1, 2, 3, 5, 6, 7, 10], "frontend": 7, "full": [1, 2, 7, 8, 11], "full_nam": 1, "function": 2, "fund": [5, 11], "funder": 1, "fundref": 11, "further": [3, 7, 10], "futur": [1, 2, 11], "g": [1, 2, 3, 5, 6, 10, 11], "gatewai": 1, "gender": 11, "gener": [1, 3, 5, 6, 7, 11], "geograph": [5, 11], "geometri": 11, "geonam": 11, "geopattern": 6, "get": [2, 7], "gh_page": 6, "git": 7, "github": [2, 6, 7, 10, 11], "gitlab": 6, "given": 2, "given_nam": 11, "gnd_node": 11, "gninx": 7, "good": 7, "grant": [1, 5, 11], "greatli": 11, "grep": 3, "group": [3, 6, 7, 8, 10, 11], "group_collect": 1, "group_collections_metadata_endpoint": 1, "group_identifi": [5, 11], "group_nam": [5, 11], "guarante": 7, "guid": 7, "h1": 11, "ha": [1, 2, 5, 6, 7, 11], "handl": 2, "have": [2, 5, 6, 7, 10, 11], "hc": 8, "hcommon": [1, 5, 11], "head": 5, "header": 2, "held": 1, "help": [1, 3, 5, 6, 7, 11], "here": [1, 5, 7, 10, 11], "hidden": 2, "hierarch": 11, "histor": [5, 11], "histori": [5, 6, 11], "historian": [5, 11], "hit": 1, "hold": [1, 5, 7, 11], "homoit0000669": [5, 11], "homosauru": 5, "hood": 1, "host": [5, 11], "hostinginstitut": 11, "hour": 10, "how": [3, 11], "how2shout": 7, "howev": [1, 11], "html": [5, 7, 11], "http": [1, 5, 6, 7, 10, 11, 12], "human": [1, 5, 11], "hyphen": [5, 7, 11], "i": [0, 2, 3, 5, 6, 10, 11, 12], "icon": 7, "id": [1, 2, 5, 11], "idea": 7, "ident": [1, 11], "identifi": [1, 2, 5, 8], "identifier_orcid": 11, "idp": 1, "ignor": 1, "illustr": 11, "imag": [1, 2, 6, 7, 11], "immedi": [1, 6, 11], "implement": [1, 8], "import": [3, 6, 7, 8, 10, 11], "import_data": 7, "impos": [5, 11], "imprint": 11, "includ": [0, 1, 2, 3, 5, 7, 10, 11, 12], "incomplet": 1, "increment": 6, "independ": 1, "index": [1, 3, 5, 7, 11], "indic": [1, 3, 10], "individu": [1, 7], "influenc": 11, "info": [5, 7, 11], "inform": [1, 6, 11, 12], "informationen": 11, "infrastructur": [2, 8], "ini": 7, "init": [6, 10], "initi": [1, 2, 6], "insert": [7, 10], "insid": [3, 6, 7, 10], "instal": [1, 2, 6, 8], "instanc": [0, 3, 7, 8, 10, 12], "instance_path": [7, 10], "instead": [1, 2, 6, 7], "institut": [1, 5, 11], "instruct": [5, 6, 8, 10, 11], "instructionalresourc": 11, "integ": [5, 11], "integr": [1, 6, 8, 11], "intend": [1, 5, 11], "intens": 1, "inter": [6, 10], "interact": 6, "interactiveresourc": 11, "interfac": [1, 7, 11], "intern": [5, 8, 11], "interpret": 7, "interrupt": 1, "intersex": [5, 11], "interview": 11, "interviewe": 11, "interviewrecord": 11, "interviewtranscript": 11, "introduc": [1, 6], "introduct": [5, 11], "invenio": [1, 2, 8, 10, 11], "invenio_": 7, "invenio_app": 7, "invenio_csrf_secret_salt": 7, "invenio_custom_pdf_view": 6, "invenio_datacite_password": 7, "invenio_group_collections_kcwork": 1, "invenio_instance_path": 7, "invenio_notif": 5, "invenio_record_importer_data_dir": 7, "invenio_record_importer_local_data_dir": 7, "invenio_search_domain": 7, "invenio_secret_kei": 7, "invenio_security_login_salt": 7, "invenio_site_api_url": 7, "invenio_site_ui_url": 7, "invenio_sqlalchemy_database_uri": 7, "inveniordm": [0, 3, 6, 7, 8], "inventor": 11, "invert": 2, "invit": 1, "invok": 3, "involv": [1, 2, 5, 6, 10, 11], "irrevoc": 1, "is_delet": 1, "is_select": 1, "isbn": [], "iscitedbi": 11, "iso": [5, 11], "issn": [], "issu": 11, "item": [5, 11], "item_index": 1, "its": [1, 2, 6, 7, 10, 11], "itself": [5, 11], "j": [2, 8], "jammi": 7, "jane": [5, 11], "janedo": 11, "javascript": 11, "jdoe": [1, 5, 11], "jest": 6, "jinja": 5, "john": [1, 5, 11], "journal": [5, 11], "journalarticl": 11, "json": [1, 3, 6, 7], "juror": 11, "just": 11, "kc": [1, 2, 3, 7, 8], "kc_usernam": [1, 5, 11], "kcr": [1, 7], "kcr_api": 7, "kcr_ui": 7, "kcwork": [1, 2, 7, 8], "keep": [6, 7, 11], "kei": 1, "keyboard": 2, "kind": 1, "kingston": [5, 11], "know": 1, "knowldg": 10, "knowledg": [0, 1, 2, 6, 10, 11, 12], "knowledgecommon": 1, "label": [1, 2, 5, 11], "labor": 11, "lago": 11, "lambda": 7, "lang": 11, "languag": 11, "larg": 2, "last": [1, 3, 5, 6, 11], "later": 1, "latest": [1, 6], "latin": [5, 11], "launch": 11, "layout": 2, "lcsh": [5, 11], "lcsh2fast": [5, 11], "lead": 2, "least": [1, 2, 7], "leav": 6, "left": 1, "leftov": 6, "legaci": [3, 8], "legalcod": 11, "legalcom": 11, "legalrespons": 11, "less": [2, 5, 6, 11], "lessonplan": 11, "level": [1, 5, 11], "lib": 7, "licens": [0, 11], "license": 11, "like": [1, 6, 7, 11], "likewis": 6, "line": [2, 3, 10], "link": [1, 2, 3, 5, 11], "linux": 6, "list": [1, 3, 5, 6, 11], "literatur": [5, 11], "live": [7, 10], "load": 3, "local": [1, 3, 6, 8], "localhost": [7, 10], "locat": [1, 5, 6, 11], "lock": 7, "log": [2, 5], "loglevel": 7, "logo": [1, 2], "long": [1, 2, 6, 7], "longer": 1, "look": 1, "lost": 3, "lowercas": [5, 11], "lt": 7, "lyricist": 11, "m": 6, "ma": [5, 11], "mac": 7, "machin": 7, "made": [1, 2, 6, 11], "magazin": 11, "magazinearticl": 11, "mai": [1, 5, 6, 7, 10, 11], "mail": 5, "main": [2, 3, 5, 6, 10, 11], "maintain": 11, "make": [6, 7, 10], "manag": [1, 2, 6, 7, 11], "mani": 11, "manual": 7, "manufactur": 11, "map": 11, "markdown": 5, "match": [1, 2, 7, 11], "materi": [5, 11], "matter": [5, 11], "maximum": 1, "md": [2, 6], "mean": [2, 5, 6, 7, 11], "meantim": 6, "mechan": [1, 5, 11], "media": 2, "meet": [5, 11], "member": [1, 2], "member_polici": 1, "membership": 1, "memori": 7, "mention": 11, "menu": 2, "merg": 6, "mesh": [0, 10], "messag": [1, 2], "met": 11, "metadata": [2, 3, 8], "metadata_field": 8, "method": 11, "michigan": 11, "middl": 3, "might": [1, 2, 5, 7, 11], "migrant": [5, 11], "migrat": [5, 11], "mind": 1, "minim": 1, "minor": 6, "mint": [1, 11], "minut": [1, 7], "miss": [1, 2], "mit": 0, "mla": [5, 11], "modal": 2, "moder": 11, "moderatorrolerecipi": 5, "modern": [5, 11], "modif": 1, "modifi": [1, 2, 6], "modul": [1, 2, 8, 10], "modular": 10, "monograph": 11, "monotask": 6, "more": [1, 2, 5, 6, 11], "most": [1, 2, 6, 7], "mount": [7, 10], "move": 2, "mq": 7, "msu": 11, "much": [5, 11], "multi": 1, "multi_statu": 1, "multidisciplinari": 11, "multipart": 1, "multipl": [1, 2], "music": 11, "musicalrecord": 11, "must": [1, 5, 6, 7, 11], "my": [1, 11], "myapitoken": 7, "mycours": 11, "myevent": 11, "myinveniodatacitepassword": 7, "mysteri": 1, "mytoken": 7, "myusernam": 1, "n": 1, "na": 2, "name": [2, 3, 5, 7, 10, 11], "name_parts_loc": 2, "namespac": [5, 11], "natur": 1, "navig": [2, 6, 7, 10], "nc": 11, "necessari": [2, 7, 10], "need": [1, 3, 8, 10, 11], "neither": [1, 11], "net": 11, "network": 1, "new": [2, 5, 7, 11], "new_commons_group_id": 1, "new_commons_group_nam": 1, "newer": 7, "newest": [1, 2], "newli": [5, 11], "newlin": 7, "newspap": 11, "newspaperarticl": 11, "next": [1, 6, 7], "nginx": 10, "node": 8, "node_modul": 6, "non": 1, "none": 1, "noowneravail": 1, "nor": [1, 11], "normal": [1, 6, 7, 10], "note": [1, 3, 6, 10, 11], "notic": 1, "notif": 8, "notificationop": 5, "notifications_moderator_rol": 5, "now": [1, 2, 7, 10], "npm": 6, "number": [1, 3, 5, 8, 11], "numer": 1, "nvm": 8, "o": 7, "oai": 1, "oauth": 1, "object": [5, 6], "obtain": [1, 7], "occup": 1, "occupi": 6, "occur": 1, "oclc": [5, 11], "octet": 1, "octob": 11, "often": [6, 7], "ok": 1, "old": [1, 7], "old_commons_group_id": 1, "oldest": 1, "onc": [1, 6, 7], "one": [1, 5, 7, 10, 11], "ongo": 1, "onli": [2, 3, 5, 6, 8, 11], "onlinepubl": 11, "onto": 10, "open": [1, 7, 11], "openfund": 11, "opengraph": 2, "opensearch": [3, 7, 10], "oper": [1, 5, 7, 10], "opt": [6, 7, 10], "option": [1, 2, 3, 5, 6, 10, 11], "orcid": [1, 2, 5], "order": [1, 2, 6], "org": [1, 5, 6, 7, 11], "organ": [1, 5], "organiz": [5, 11], "origin": [1, 2, 6, 11], "other": [1, 2, 5, 6, 7, 11], "otherwis": [7, 11], "our": 11, "out": [1, 7, 11], "output": 6, "outsid": 1, "over": 6, "overrid": [1, 6, 11], "overridden": 6, "overwhelm": 11, "own": [1, 6, 7], "owned_bi": 1, "owner": 11, "ownership": [5, 11], "p": [1, 3, 10, 11], "packag": [3, 7, 10, 11], "page": [1, 2, 6, 8, 10, 11], "panda": 1, "panel": 7, "paper": [5, 11], "paramet": [], "parent": [1, 7, 10, 11], "part": [0, 1, 2, 3, 5, 11], "particular": [7, 10], "particularli": [1, 6], "partli": 1, "pass": 1, "password": [3, 7, 10], "patch": 6, "patent": 11, "path": [1, 5, 11], "patienc": 10, "pdf": [1, 5, 11], "pdfj": 6, "pedagogi": 11, "peerreview": 11, "pend": 2, "perform": [1, 7, 11], "period": [1, 11], "perman": 1, "permiss": 2, "persist": [5, 6, 7, 11], "person": [5, 11], "person_or_org": [5, 11], "personnel": 1, "pgadmin": [7, 10], "pgadmin_default_email": 7, "pgadmin_default_password": 7, "phd": [5, 11], "photograph": 11, "physicalobject": 11, "pick": 6, "pid": [1, 6, 7, 10, 11], "pidfil": 7, "pin": 2, "pip": [6, 7], "pipenv": [6, 10], "pipfil": 6, "place": [1, 5, 11], "placehold": 1, "placeholder_avatar": 1, "plain": 1, "plaintext": 5, "platform": 2, "pleas": 1, "pmh": 1, "png": 1, "podcastepisod": 11, "poeticwork": 11, "poetri": [5, 11], "point": [1, 2, 11], "polici": 1, "popul": 1, "possess": 1, "possibl": [1, 6, 11], "post": [], "postgres_db": 7, "postgres_password": 7, "postgres_us": 7, "postgresql": 7, "potenti": [5, 11], "practic": 6, "pre": [1, 11], "prefix": [5, 11], "preprint": 11, "present": [2, 5, 11], "presentationtext": 11, "preserv": [5, 11], "press": 7, "prev": 1, "prevent": [1, 11], "previou": 1, "previous": [2, 5, 11], "primari": [2, 5], "primarili": [3, 5, 11], "principl": 1, "print": [7, 11], "printer": 11, "prior": [5, 7, 11], "privat": [7, 10], "privileg": 1, "problem": 6, "problemat": [5, 11], "proce": 7, "proceed": [5, 11], "process": [1, 3, 11], "produc": [2, 3, 5, 11], "product": [3, 5, 6, 11], "professionel": 11, "profil": [1, 2, 5, 11], "program": 11, "programminglanguag": 11, "project": [5, 6, 7, 11], "projectorteamlead": 11, "projectorteammanag": 11, "projectorteammemb": 11, "proper": [2, 5, 11], "properti": [1, 2, 11], "provid": [1, 3, 5, 6, 7, 10, 11], "provision": [10, 11], "prune": 6, "psychologi": 11, "psycopg2": 7, "public": [1, 2, 5, 11], "public_memb": 1, "publication_d": [1, 11], "publish": [1, 2, 5, 11], "pull": [6, 7], "purg": 1, "purpos": [5, 11], "push": 6, "put": [1, 7], "py": [3, 6], "pypi": 7, "pyproject": 6, "pytest": 6, "python": [8, 10, 11], "python3": 7, "python_local_git_packages_path": 7, "python_local_site_packages_path": 7, "queri": 2, "question": 1, "queue": 1, "quick": 10, "quickli": 7, "quickstart": 8, "rabbitmq": 7, "race": 11, "rais": 1, "random": [2, 7], "rang": 11, "rather": [1, 7], "rdm": [7, 10, 11], "rdmrecord": 5, "re": [1, 6, 7, 11], "reach": 6, "react": 6, "read": [1, 3], "readabl": [1, 5, 6, 11], "reader": [1, 5, 11], "readi": 6, "readm": [2, 6], "real": 7, "reason": [1, 7, 11], "rebuild": 7, "rebuilt": 6, "receiv": [1, 5, 7], "recent": [2, 6], "recipi": 5, "recogn": 11, "recommend": [1, 7], "record": [1, 2, 3, 6, 8, 10], "record_id": 1, "record_polici": 1, "record_url": 1, "recreat": [6, 7], "recurs": [6, 10], "redi": 7, "redis_domain": 7, "redund": [1, 6, 10], "refactor": 2, "refer": [1, 6, 7, 8, 10, 11], "refere": 11, "reflect": [1, 6, 10], "refresh": 6, "refuge": [5, 11], "regard": 1, "regardless": 7, "regist": 1, "registrationag": 11, "registrationauthor": 11, "registri": 11, "reject": 1, "rel": [1, 5, 11], "relat": [6, 11], "related_identifi": 11, "relatedperson": 11, "relation_typ": 11, "releas": [0, 7], "relev": [1, 11], "reliabl": [1, 7], "reload": [6, 7, 10], "remain": 1, "remot": [2, 3, 6, 7, 10, 11], "remov": [1, 2], "renam": 1, "repeat": 1, "replac": [1, 7], "repo": 6, "report": 11, "repositori": [0, 6, 7, 11], "repres": [1, 6], "represent": 1, "request": [2, 6, 7], "requir": [5, 6, 8, 10, 11], "research": [0, 1, 5, 10, 11], "researchgroup": 11, "researchparticip": 11, "reserv": 1, "resid": [5, 11], "resourc": [1, 2, 7, 8, 10], "resource_typ": 11, "resourcetypegener": 11, "respect": 6, "respond": 6, "respons": 7, "rest": [7, 8, 10], "rest_api_award": 1, "rest_api_commun": 1, "rest_api_drafts_record": 1, "rest_api_fund": 1, "rest_api_group": 1, "rest_api_index": 1, "rest_api_memb": 1, "rest_api_nam": 1, "rest_api_oaipmh_set": 1, "rest_api_request": 1, "rest_api_review": 1, "rest_api_statist": 1, "rest_api_us": 1, "rest_api_vocabulari": 1, "restart": [6, 7, 10], "restor": 1, "restrict": [1, 11], "result": [1, 2], "retriev": [], "return": 1, "review": [1, 11], "review_polici": 1, "review_requir": 1, "revision_id": 1, "right": [2, 7, 11], "rightshold": 11, "robust": 1, "role": [1, 5, 7, 8], "root": [6, 7], "rout": 2, "rule": 1, "run": [5, 7, 8, 10], "runner": 6, "same": [1, 5, 7, 11], "sandbox": 11, "save": 5, "schema": [1, 2, 8], "scheme": [1, 5, 8], "scholarli": 11, "scienc": [5, 11], "screenplayauthor": 11, "script": [6, 10], "search": [1, 2, 3, 10, 11], "second": [1, 5, 11], "secret": 7, "section": 11, "secur": [1, 7], "see": [0, 6, 7, 10, 11], "seen": 7, "segment": 1, "select": [2, 11], "selector": 2, "selenium": 6, "self": [1, 2], "self_html": 1, "semant": [5, 6], "semver": 6, "send": 5, "sent": [1, 5], "separ": [1, 6, 7, 10], "seri": [5, 11], "serial": 3, "series_titl": [5, 11], "series_volum": [5, 11], "serv": [1, 2, 7, 10, 11], "server": [6, 10], "serverless": 7, "servic": [2, 3, 5, 8, 11], "services_setup": 10, "session": 7, "set": [1, 2, 5, 6, 7, 10, 11], "settings_html": 1, "setup": [6, 7, 8], "sever": [1, 7], "sexual": 11, "sh": [6, 7, 10], "shape": 1, "share": [0, 1, 2, 7, 11], "shell": 7, "short": [1, 11], "should": [1, 2, 5, 6, 7, 10, 11], "side": 11, "sidebar": 2, "signal": [1, 5], "similarli": [5, 10, 11], "simpl": [5, 11], "simpli": [1, 6, 7], "sinc": [1, 2, 3, 6, 7], "singl": [1, 3, 6, 11], "site": [2, 3, 7, 8, 10], "size": [1, 7, 11], "sl": 7, "slackbot": 7, "slide": 11, "slider": 7, "slight": 1, "slug": 1, "so": [1, 2, 3, 5, 6, 7, 10, 11], "social": [1, 2], "soft": 1, "softwar": [5, 11], "solut": 7, "solv": 2, "some": [2, 5, 6, 10, 11], "someth": 7, "sometim": [2, 6], "sort": [2, 11], "sortbi": 1, "sourc": [6, 7, 10], "speaker": 11, "specif": [2, 5, 7, 11], "specifi": [1, 7], "sponsor": [5, 11], "squash": 6, "src": 6, "sso_saml_idp": 1, "stage": [3, 6, 7], "stamp": 7, "stand": 6, "standalon": 7, "standard": [5, 11], "standardisierung": 11, "start": [1, 6], "stat": [3, 5, 11], "state": 11, "stateless": 1, "statement": 10, "static": [2, 10], "statist": 1, "statu": [5, 11], "stdout": 7, "step": [1, 6, 7, 10], "still": 1, "stop": [6, 7, 10], "storag": 1, "store": [0, 1, 3, 5, 6, 7, 11], "str": 1, "stream": 1, "streamlin": 8, "strict_valid": 1, "strictli": [], "string": [1, 2, 5, 11], "strongli": [5, 11], "structur": [7, 11], "studi": 1, "style": 6, "sub": [3, 5, 7, 11], "subfold": 1, "submiss": [1, 2], "submit": [1, 2], "submitt": [5, 11], "submodul": 10, "subsequ": 1, "substant": [5, 11], "subtitl": 11, "subtyp": 11, "succe": 1, "succeed": 1, "successfulli": 1, "sudo": 7, "suffici": 1, "suffix": 6, "suggest": [5, 11], "suit": 6, "suitabl": 3, "superus": 7, "supervisor": 11, "supplement": [5, 11], "suppli": [1, 7], "support": [1, 6, 7, 11], "sur": 7, "sure": [6, 7], "susequ": 1, "syllabi": [5, 11], "syllabu": 11, "sync": 2, "syntax": 7, "synthet": 3, "system": [0, 1, 2, 3, 6, 10], "systemd": 7, "t": [7, 10], "tab": 7, "tabl": 7, "tag": [5, 11], "tail": 7, "tailor": 11, "take": [6, 7, 10], "taken": [1, 11], "task": [1, 6], "taxonomi": 11, "teach": 11, "technic": [2, 11], "technicalstandard": 11, "technisch": 11, "tell": 7, "templat": 8, "temporari": 6, "ten": 11, "term": [1, 11], "termin": [6, 7], "test": [7, 8, 10, 11], "text": [1, 11], "textdocu": 11, "than": [1, 2, 7, 11], "thei": [1, 2, 5, 6, 11], "them": [1, 2, 6, 7, 11], "theses": [5, 11], "thesi": [5, 11], "thi": [1, 2, 3, 5, 6, 7, 10, 11], "thing": 2, "those": [1, 5, 6, 7, 10, 11], "though": [1, 6], "three": [1, 7], "through": [1, 6], "time": [5, 6, 7, 10, 11], "timeout": 1, "titl": [1, 2, 5, 11], "tmp": [6, 7, 10], "token": 7, "token_hex": 7, "token_nam": 1, "toml": 6, "tool": [0, 5, 8, 11], "top": [1, 5, 7, 11], "topic": [5, 11], "toronto": [5, 11], "total": [1, 5, 11], "total_volum": 11, "track": 5, "transcrib": 11, "transfer": 1, "translat": 11, "trigger": 1, "true": [1, 5, 10, 11], "truli": 1, "try": [1, 6], "tweak": 2, "two": [1, 2, 5, 6, 7, 11], "txt": 0, "type": [1, 2, 5, 8], "typic": 1, "u": [5, 7, 11], "ubuntu": 7, "ui": [1, 2, 3, 5, 6, 7, 10], "ukranian": [5, 11], "ultim": 6, "unchang": 1, "under": [0, 1, 6, 7, 10, 11], "underli": 3, "uni": 5, "uniqu": 1, "unit": [5, 6], "univers": [5, 11], "unknown": [1, 2], "unless": [1, 6, 7, 10], "unlik": [5, 11], "unprocessableent": 1, "unpublish": [5, 11], "unread": 5, "until": [1, 6, 11], "up": [3, 6, 7, 10], "updat": [2, 3, 5, 8, 10, 11], "upload": [2, 6, 11], "upper": 1, "upstream": 8, "url": [1, 5, 11], "us": [2, 3, 5, 6, 8, 10, 11], "usag": [3, 5, 11], "useless": 2, "user": [2, 3, 6, 8, 11], "user_data_upd": 1, "user_object": 11, "user_profil": 11, "usermod": 7, "usernam": [1, 5], "usr": 7, "usual": [1, 6], "uuid": 1, "uwsgi": [6, 10], "uwsgi_api": 10, "uwsgi_rest": 7, "uwsgi_ui": [6, 7, 10], "v": [6, 7], "v1": [1, 11], "v16": 7, "v2": 7, "v3": [5, 11], "valid": [1, 5, 11], "valu": [1, 2, 5, 7, 11], "var": [7, 10], "variabl": [1, 5, 6], "variat": [5, 11], "varieti": [10, 11], "variou": [7, 10, 11], "veri": 6, "version": [0, 1, 2, 5, 8, 10, 11], "via": [5, 6, 7], "videorecord": 11, "view": [1, 2, 5, 6, 11], "virtual": 7, "virtualenv": 7, "visibl": [1, 2, 6, 11], "visualart": 11, "vocabulari": [1, 2, 8, 10], "volum": [5, 6, 7, 11], "voluntarili": [5, 11], "wa": [1, 2, 5, 11], "wai": [1, 5, 7, 11], "walk": 6, "want": [1, 5, 6, 7, 10, 11], "warn": [1, 3, 5, 6, 11], "watch": [6, 7], "watercolor": [5, 11], "we": [1, 6, 11], "web": [6, 7, 10], "webdriv": 6, "webhook": [1, 5], "webpack": [2, 6], "webpackthemebundl": 6, "websit": 1, "well": [1, 2, 5, 6, 7], "were": [1, 2, 5, 7, 11], "what": [6, 11], "when": [1, 2, 5, 6, 7, 10, 11], "whenev": [3, 6], "where": [1, 2, 6, 7, 10, 11], "wherev": 6, "whether": [1, 5], "which": [1, 2, 5, 6, 7, 10, 11], "whichev": 7, "while": [1, 6, 10, 11], "white": [5, 11], "whitepap": 11, "who": 11, "whole": [2, 5, 11], "whose": [1, 2], "why": 1, "wide": 11, "widget": 2, "wikidata": 11, "window": [6, 7], "wip": 6, "wish": 1, "wit": 11, "within": [1, 2, 5, 11], "without": [1, 6, 7, 11], "word": 2, "wordpress": [], "work": [0, 2, 5, 6, 10, 12], "worker": [1, 3, 6], "workflow": 11, "workingpap": 11, "workpackagelead": 11, "workshop": [5, 11], "worldcat": [5, 11], "would": [1, 2, 3, 5, 6, 7, 11], "wp": 1, "wrap": [2, 3], "wrapper": 1, "writerofaccompani": 11, "written": 7, "wsl2": 6, "www": [5, 7, 11], "x": [7, 11], "x86_64": 7, "y": 1, "ye": [1, 6], "yet": [1, 7], "yml": [6, 7, 10], "you": [1, 3, 5, 6, 7, 10, 11], "your": [1, 6], "zenodo": 11, "zip": 1, "zshrc": 7}, "titles": ["About", "API", "Changes", "CLI Commands", "Configuration of InvenioRDM", "Customizations to InvenioRDM", "Developing KCWorks", "In-depth Installation Instructions (NEEDS UPDATING)", "Welcome to the Knowledge Commons Works technical documentation!", "KCWorks Infrastructure", "Installation", "Metadata Schema, Vocabularies, and Identifiers", "Reference"], "titleterms": {"": 1, "0": [2, 7], "01": 2, "09": 2, "1": [2, 7, 10], "10": [2, 7], "11": 2, "12": 2, "16": 7, "17": 7, "18": 2, "2": [2, 10], "20": 7, "2024": 2, "2025": 2, "3": [2, 7, 10], "30": 2, "4": [2, 10], "5": [2, 10], "6": 10, "9": 7, "A": 1, "In": [5, 7], "The": [1, 6], "about": [0, 5, 7], "access": 1, "ad": 6, "add": 7, "addit": 7, "admin": [7, 10], "ai_usag": [5, 11], "all": 1, "an": [1, 6, 7], "api": [1, 5, 11], "app": 5, "applic": [7, 10], "asset": 10, "authent": [1, 5], "autom": 6, "basic": 6, "beta3": 2, "beta4": 2, "beta5": 2, "beta6": 2, "beta7": 2, "beta8": 2, "bodi": 1, "book_seri": [5, 11], "branch": 6, "build": [6, 7, 10], "bulk": 5, "can": 1, "celeri": 7, "cfg": 6, "chang": [1, 2, 6], "chapter_label": [5, 11], "cli": [3, 7], "clone": [7, 10], "code": [1, 6, 7], "collect": [1, 5, 11], "collis": 1, "command": [3, 7], "commit": 6, "committee_deposit": [5, 11], "common": [1, 7, 8], "commons_domain": [5, 11], "commons_search_recid": [5, 11], "commons_search_upd": [5, 11], "commun": 5, "compos": [7, 10], "configur": [1, 4, 7, 10], "contain": [3, 7], "container": 7, "content": [5, 8], "content_warn": [5, 11], "context": 7, "contributor": [5, 11], "control": [6, 7, 10, 11], "copyright": 0, "core": [5, 11], "course_titl": [5, 11], "creat": [1, 7, 10], "creation": 11, "creator": [5, 11], "credenti": 7, "css": 6, "custom": [3, 5, 11], "custom_field": [5, 11], "data": [1, 5], "databas": [7, 10], "deeper": 6, "degre": [5, 11], "delet": 1, "deposit": 5, "deprec": 11, "depth": 7, "detail": 5, "develop": [6, 10], "dig": 6, "disciplin": [5, 11], "docker": [7, 10], "document": [8, 12], "doe": 1, "doi": 11, "draft": [], "duplic": 1, "edit": [5, 11], "email": 5, "enabl": 7, "endpoint": 1, "ensur": 7, "entri": 6, "environ": 7, "error": [1, 7], "event": 1, "exampl": 11, "extern": 6, "fail": 1, "fast": [6, 11], "field": [5, 11], "file": [1, 6, 7, 10], "file_loc": [5, 11], "file_pid": [5, 11], "first": 5, "fix": 7, "flask": 10, "fly": 6, "folder": 6, "fork": 5, "form": 5, "found": 7, "framework": 5, "from": 11, "full": 10, "funder": 11, "get": 1, "git": [6, 10], "gnd": 11, "grid": 11, "group": [1, 5], "groups_for_deposit": [5, 11], "handl": [1, 11], "happen": 1, "have": 1, "hc": [5, 11], "hclegaci": [5, 11], "head": 11, "header": 1, "homosauru": 11, "html": 6, "i": [1, 7], "identifi": 11, "implement": [5, 11], "import": [1, 5], "includ": 6, "indic": 7, "inform": 7, "infrastructur": 9, "initi": [7, 10], "instal": [7, 10], "instanc": [1, 6], "institution_depart": [5, 11], "instruct": 7, "integr": 5, "intern": 1, "invalid": 1, "invenio": [3, 5, 6, 7], "inveniordm": [1, 4, 5, 11, 12], "isbn": 11, "isni": 11, "issn": 11, "j": [6, 7], "javascript": 6, "json": 11, "just": 7, "kc": [5, 11], "kcr": [5, 11], "kcwork": [3, 5, 6, 9, 10, 11], "knowledg": [7, 8], "legaci": [5, 11], "limit": 6, "line": 7, "linux": 7, "local": [7, 10], "log": 7, "maco": 7, "make": 1, "malform": 1, "media": [5, 11], "meeting_organ": [5, 11], "metadata": [1, 5, 11], "metadata_field": [5, 11], "moder": 5, "modul": [5, 6, 7], "modular": 5, "name": [1, 6], "necessari": 1, "need": [6, 7], "new": [1, 6], "newli": 1, "nginx": 7, "node": [6, 7], "note": [5, 7], "notif": 5, "number": 6, "nvm": 7, "oai": 11, "object": [1, 11], "ofr": 11, "onli": 1, "orcid": 11, "organ": 11, "other": 10, "output": 7, "overrid": 5, "own": 10, "owner": 1, "ownership": 1, "packag": [5, 6], "page": 5, "pagin": 1, "paramet": 1, "patch": 1, "path": 7, "payload": 1, "peopl": 11, "permiss": 1, "pipenv": 7, "point": 6, "post": 1, "previously_publish": [5, 11], "primari": 11, "process": [6, 7], "project": 10, "project_titl": [5, 11], "provis": 5, "provision": 5, "publication_typ": [5, 11], "publication_url": [5, 11], "pyenv": 7, "python": [6, 7], "queri": 1, "queue": 7, "quickstart": 10, "rdm": 5, "rebuild": 6, "recommend": 11, "record": [5, 11], "record_change_d": [5, 11], "record_creation_d": [5, 11], "record_identifi": [5, 11], "refer": 12, "releas": 6, "remot": 5, "repositori": 10, "request": 1, "requir": [1, 7], "resourc": [5, 11], "respons": 1, "rest": 1, "retriev": [1, 11], "role": 11, "ror": 11, "rotat": 7, "run": [3, 6], "saml": [1, 5], "schema": [5, 11], "scheme": 11, "script": 7, "search": [5, 7], "secondari": 11, "sensit": 7, "server": 7, "servic": [7, 10], "setup": 10, "shutdown": 7, "site": [5, 6, 11], "slow": 6, "some": [1, 7], "sort": 1, "specif": 1, "sponsoring_institut": [5, 11], "standard": 7, "start": [7, 10], "startup": 7, "static": 6, "statu": 1, "step": [], "strategi": 6, "streamlin": 1, "subject": [5, 11], "submitter_affili": [5, 11], "submitter_email": [5, 11], "submitter_id": [5, 11], "submitter_org_membership": [5, 11], "submitter_usernam": [5, 11], "submodul": 6, "success": 1, "sync": 5, "system": [5, 7, 11], "tabl": [], "tag": 6, "task": 7, "technic": 8, "templat": [5, 6], "test": 6, "theme": 6, "time": 1, "token": 1, "tool": 7, "total_download": [5, 11], "total_view": [5, 11], "type": 11, "unsuccess": 1, "updat": [1, 6, 7], "upload": 1, "upstream": 6, "us": [1, 7], "user": [1, 5, 7, 10], "user_defined_tag": [5, 11], "usernam": 11, "uwsgi": 7, "variabl": 7, "version": [6, 7], "via": 1, "view": [7, 10], "vocabulari": [5, 11], "webhook": [], "welcom": 8, "what": 1, "who": 1, "work": [1, 7, 8, 11], "worker": 7, "your": [7, 10]}}) \ No newline at end of file diff --git a/docs/source/api.md b/docs/source/api.md index e69de29bb..adac6b9b6 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -0,0 +1,1228 @@ +# API + +KCWorks provides a robust REST API that allows clients to perform most operations on KCWorks records and collections. + +## The InvenioRDM REST API + +KCWorks is built on top of InvenioRDM, which provides a REST API for creating, managing, and querying records. This API is documented at https://inveniordm.docs.cern.ch/reference/rest_api_index/. + +> **Note:** "Collections" are referred to as "communities" in the InvenioRDM API and its documentation. To avoid confusion with the social groups that are part of the Knowledge Commons network, KCWorks uses the term "collections" in its documentation and user interface. But operations involving collections are handled via the "communities" endpoint in the InvenioRDM REST API. + +This REST API allows clients to retrieve and manage the following resources: + +| Resource | Supported Operations | Requires Authentication | Endpoint | InvenioRDM API documentation | +| -------- | ----------- | ------------- | -------- | ---------------------------- | +| draft works | read | yes | GET /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-record | +| | create | yes | POST /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-draft-record | +| | update | yes | PUT /api/records/{id} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record | +| | publish | yes | POST /api/records/{id}/draft/actions/publish | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#publish-a-draft-record | +| | delete | yes | DELETE /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-record | +| | list files | yes | GET /api/records/{id}/draft/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#list-a-drafts-files | +| | upload files[^draft-file-upload] | yes | POST /api/records/{id}/draft/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#start-draft-file-uploads | +| | view file metadata | yes | GET /api/records/{id}/draft/files/{filename} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-draft-files-metadata | +| | download file | yes | GET /api/records/{id}/draft/files/{filename}/content | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#download-a-draft-file | +| | delete file | yes | DELETE /api/records/{id}/draft/files/{filename} | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#delete-a-draft-file | +| published works | read[^published-work-read] | no | GET /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-a-record | +| | read all versions | no | GET /api/records/{id}/versions | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-versions | +| | read latest version | no | GET /api/records/{id}/versions/latest | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-latest-version | +| | search | no | GET /api/records/ | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#search-records | +| | update[^published-work-update] | yes | POST /api/records/{id}/draft | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#update-a-draft-record | +| | create new version | yes | POST /api/records/{id}/versions | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#create-a-new-version | +| | attach files from a previous version[^attach-files-from-previous-version] | yes | POST /api/records/{id}/draft/actions/files-import | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#link-files-from-previous-version | +| | list files | no | GET /api/records/{id}/files | https://inveniordm.docs.cern.ch/reference/rest_api_drafts_records/#get-all-files | +| collections | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_communities/ | +| collection memberships | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_members/ | +| reviews | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_reviews/ | +| requests | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_requests/ | +| users | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_users/ | +| groups[^groups] | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_groups/ | +| vocabularies | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_vocabularies/ | +| names | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_names/ | +| funders | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_funders/ | +| awards | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_awards/ | +| OAI-PMH sets | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_oaipmh_sets/ | +| statistics | *Documentation forthcoming* | | | https://inveniordm.docs.cern.ch/reference/rest_api_statistics/ | + + +[^published-work-read]: Note that each version of a published work has its own `id`. The `read` operation retrieves the specific version whose `id` is provided. +[^published-work-update]: Published works cannot be updated directly. Rather, the update API call creates a new draft of the published work. The original version of the published work is not yet modified and remains discoverable via the search API. This draft may then be published, in which case it replaces the original published work. Note that this kind of update can only be made to the metadata of the published work, not to the files associated with it. In order to update the files associated with a published work, the client must create a new version of the work. +[^draft-file-upload]: The file upload process involves three separate API calls: + - `POST /api/records/{id}/draft/files` to start the upload process + - `POST /api/records/{id}/draft/files/{filename}/content` to upload the file's content + - `POST /api/records/{id}/draft/files/{filename}/commit` to finalize the upload and attach the file to the draft record +[^attach-files-from-previous-version]: The `files-import` operation attaches files from a previous version of a work to *the current draft* of that work. If the work already has multiple versions, clients must specify the `id` of the version whose files are to be attached. +[^groups]: Note that the `groups` managed by the `groups` API endpoint are not the same as KCWorks social groups or InvenioRDM collections. These are instead sets of users sharing a set of system permissions. (Under the hood these are wrappers around the invenio-accounts `Role` class.) This might include the "administration" group who are assigned certain admin permissions. It might also include a group who are all assigned "curator" permissions for a collection, etc. + +Note that for some operations where authentication is required, the client must also possess the appropriate permissions. (E.g., to edit a draft work, manage collection requests, etc.) + +Note that several operations are NOT possible via the REST API, including: + +- searching draft records + - Draft records are by definition not intended to be distributed, and so are not discoverable via the search API until they have been published. +- creating a published work directly + - Published works can only be created by first creating a draft work and then publishing it. +- deleting a published work + - Published works are generally considered to be permanent and so cannot be deleted. If desired, access to a published work, or a version of a published work, can be set to "restricted", in which case the work is no longer discoverable via the search API. +- modifying files for a published work + - Again, published works are generally considered to be permanent and so their files cannot be modified. The only way to update the files associated with a published work is to create a new version of the work. If desired, access to the original version of the published work can be set to "restricted", in which case only the new version and its files are discoverable. +- creating or modifying user accounts + - The REST API endpoint for users is currently read-only. It is not possible to create or modify user accounts, or change and user profile information, via the REST API. These operations are handled via the KCWorks admin interface or via CLI commands. +- creating or modifying groups (permissions) +- creating or modifying controlled vocabularies + +### Creating a new Work via the InvenioRDM REST API + +Creating a new Work via the REST API requires several steps. + +- Step 1: Create a draft record + +- Step 2: Initialize the file upload + +- Step 3: Upload the file content + - This step must be repeated for each file being added to the work. + +- Step 4: Commit the file upload + +- Step 5: Publish the draft record + +If you want the work to be included in a collection at publication time, you must submit a request for the work to be published in the collection. The first four steps are the same as above, but in place of Step 5 (publication), you must submit a request for the work to be published in the collection. + +- Step 5: Create a review request + +- Step 6: Submit review request + +If the collection in question requires review before publication, the request will not be published until the review is accepted. + +- Step 7: Accept and publish the record + +## Streamlined Import API + +In order to streamline the process of uploading works to KCWorks, particularly for works intended for publication in a collection, KCWorks provides a streamlined import API. This API allows clients to upload a work and its files in a single step, without the need to create a draft record, initialize file uploads, commit file uploads, or submit a review request. + +Why is this API needed? The InvenioRDM REST API can be fragile and difficult to use, particularly for clients who are not familiar with the system. The creation and acceptance of a review request is redundant where collection administrators are uploading works for a collection they administer. The file upload steps are also not truly stateless, introducing the possibility of a file upload being interrupted and left incomplete, even if the upload of the file's content was successful. + +### Who can use the import API? + +The import API is available to any registered active user who has obtained an OAuth token for API operations. + +If the import is to include placing the work directly in a collection, without passing through the review process, the user must have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection ("owner", "manager", "curator", "reader") depends on the collection's review policy. + +The exception to this rule is for collection owners, who may override the collection's review policy and import works directly into the collection without review. + +### The import request + +#### Request +``` +POST https://works.hcommons.org/api/import/ HTTP/1.1 +``` + +#### Required headers +``` +Content-Type: multipart/form-data +Accept: application/json +Authorization: Bearer \ +``` + +#### Request body + +This request must be made with a multipart/form-data request. The request body must include parts with following names: + +| Name | Required | Content Type | Description | +|-------|----------|--------------|-------------| +| `files` | yes | `application/octet-stream` | The (binary) file content to be uploaded. If multiple files are being uploaded, a body part with this same name ("files") must be provided for each file. If more than three or four files are being uploaded, it is recommended to provide a single zip archive containing all of the files. The files will be assigned to the appropriate work based on filename, so where multiple files are provided these **must be unique**. If a zip archive is provided, the files must be contained in a single compressed folder with no subfolders. | +| `metadata` | yes | `application/json` | An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. In addition, an array of owners for the work may optionally be provided by adding an `access.owned_by` property to each metadata object. | +| `collection` | no | `text/plain` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, the work will be placed in the collection's review queue. | +| `review_required` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the work should be reviewed before publication. This setting is only relevant if the work is intended for publication in a collection that requires review. It will override the collection's usual review policy, since the work is being uploaded by a collection administrator. (Default: "true") | +| `strict_validation` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the import request should be rejected if any validation errors are encountered. If this value is "false", the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is "true", the import request will be rejected if any validation errors are encountered. (Default: "true") | +| `all_or_none` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is "false", the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: "true") | + +The array of owners, if provided in a metadata object's `access.owned_by` property, must include at least the full name and email address of the users to be added as owners of the work. If the user already has a Knowledge Commons account, their username should also be provided. Additional identifiers (e.g., ORCID) may be provided as well to help avoid duplicate accounts, since a KCWorks account will be created for each user if they do not already have one. + +| key | required | type | description | +|-----|----------|------|-------------| +| `full_name` | yes | `string` | The full name of the user. | +| `email` | yes | `string` | The email address of the user. | +| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. | + +The resulting `owners` list should be shaped like this: + +```json +[ + { + "full_name": "John Doe", + "email": "john.doe@example.com", + "identifiers": [ + { + "identifier": "0000-0000-0000-0000", + "scheme": "orcid" + }, + { + "identifier": "jdoe", + "scheme": "kc_username" + } + ] + } +] +``` +Note that it is *not* assumed that the creators of a work should be the work's owners. The creators will only be added as owners if each of them is listed in the `access.owned_by` property of the work's metadata object. + +### A successful import response + +``` +HTTP/1.1 201 Created +Content-Type: application/json +``` + +This response will include a JSON object with the following fields: + +- `status`: The status of the import request, which will be "success" if the import request was successful. +- `data`: An array of JSON objects with the following fields: + +| key | type | description | +|-----|------|-------------| +| `record_id` | `string` | The ID of the new work. | +| `record_url` | `string` | The URL of the new work. | +| `files` | `array` | A list of the filenames for the files that were successfully uploaded. This is for convenience. Details about the files, including their size and checksum, are available in the `files` property of the `metadata` object. | +| `collection_id` | `string` | The ID of the collection to which the work was published, if any. This is provided for convenience. Details about the collection are available in the `parent.communities` property of the `metadata` object. | +| `errors` | `array` | A list of errors that occurred during the import process. These might include validation errors for certain fields in the provided metadata that did not prevent creation of the work. (Only provided if the request was made with `strict_validation` set to "false".) | +| `metadata` | `object` | The metadata for the created work, in JSON format, following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. | + +The response object will be shaped like this: + +```json +{ + "status": "success", + "data": [ + { + "item_index": 0, + "record_id": "1234567890", + "record_url": "https://works.hcommons.org/records/1234567890", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + }, + { + "item_index": 1, + "record_id": "1234567891", + "record_url": "https://works.hcommons.org/records/1234567891", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + } + ] +} +``` + +### An unsuccessful import response + +#### The token does not have the necessary permissions + +``` +HTTP/1.1 403 Forbidden +Content-Type: application/json +``` + +This response will include a JSON object: + +```json +{ + "status": "error", + "message": "The user does not have the necessary permissions." +} +``` + +#### The request metadata is malformed or invalid + +```http +HTTP/1.1 400 Bad Request +Content-Type: application/json +``` + +This response is returned when some of the provided metadata for all of the works to be imported is malformed or invalid. This indicates that *none of the works has been created* and a new request must be made with corrected metadata. This response will only be received if either +a. the `strict_validation` request parameter was set to "true" and all of the supplied metadata objects raise validation errors, or +b. the `strict_validation` parameter is set to "false", but the validation errors affected fields that are required for the works to be created. +c. the `all_or_none` request parameter is set to "true" and some of the supplied metadata objects raise validation errors. + +The response will include a JSON object with the following fields: + +```json +{ + "status": "error", + "message": "The request metadata is malformed or invalid.", + "errors": [ + { + "item_index": 0, + "errors": [ + { + "field": "title", + "message": "Required field missing." + } + ] + }, + { + "item_index": 1, + "errors": [ + { + "field": "metadata.creators.0.occupation", + "message": "Unknown field." + }, + { + "field": "metadata.publication_date", + "message": "Date is not in Extended Date Time Format (EDTF)." + } + ] + } + ] +} +``` + +If only some of the works to be imported are malformed or invalid, and the `all_or_none` request parameter is set to "false", the response will be `207 Multi-Status`. + +#### The request file upload failed + +```http +HTTP/1.1 400 Bad Request +Content-Type: application/json +``` + +If the file content is uploaded but for some reason is considered corrupted or invalid, a `400 Bad Request` response will be returned. This response will include a JSON object with the following fields: + +```json +{ + "status": "error", + "message": "The file content is corrupted or invalid.", + "errors": [ + { + "item_index": 0, + "errors": [ + { + "file": "file1.pdf", + "message": "The file size does not match the supplied metadata." + }, + { + "file": "file2.pdf", + "message": "The file checksum does not match the supplied metadata." + } + ] + }, + { + "item_index": 1, + "errors": [ + { + "file": "file3.pdf", + "message": "The file exceeds the maximum file size." + } + ] + } + ] +} +``` + +If an upload simply fails to complete and times out, the client will instead receive a `504 Gateway Timeout` response. + +#### Only some of the works to be imported failed + +```http +HTTP/1.1 207 Multi-Status +Content-Type: application/json +``` + +If the `all_or_none` request parameter is set to "false", it is possible that some of the works to be imported were successfully created and others were not. In this case, the response will be `207 Multi-Status` and will include a JSON object with the following fields: + +```json +{ + "status": "multi_status", + "data": { + "succeeded": [ + { + "item_index": 0, + "record_id": "1234567890", + "record_url": "https://works.hcommons.org/records/1234567890", + "files": ["file1.pdf", "file2.pdf"], + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + }, + ], + "failed": [ + { + "item_index": 1, + "message": "The request metadata is malformed or invalid.", + "errors": [ + { + "field": "title", + "message": "Required field missing.", + } + ] + }, + { + "item_index": 2, + "message": "The file content is corrupted or invalid.", + "errors": [ + { + "file": "file3.pdf", + "message": "The file exceeds the maximum file size." + } + ] + } + ] + } +} +``` + +### What happens to an import request that fails? + +If all steps of an import request do not complete successfully, the work will not be created. The files that were successfully uploaded will be deleted, and any draft record created as part of the import request will be deleted. The client may attempt the import request again. + +### Making duplicate import requests + +Note that it is possible to make duplicate import requests *unless* the work to be imported includes a pre-existing DOI identifier or some other unique identifier that has already been registered in KCWorks. In this case, the import request will be rejected with a `409 Conflict` response code and a `Location` header pointing to the existing work. + +In the absence of such a unique identifier, however, KCWorks will not try to detect duplicate works based on the metadata, file name, or file content. If the same work is imported multiple times without a pre-existing unique identifier, it will be created multiple times in KCWorks and each version will be assigned a newly minted DOI. + + +## Group Collections API + +``` +https://works.hcommons.org/api/group_collections +``` + +The `group_collections` REST API endpoint allows a client to create, read, modify, or delete a collection in KCWorks owned and administered by a Knowledge Commons group. GET requests to retrieve information about group collections are open to all clients. POST, PUT, and DELETE requests are secured by an oauth token that must be obtained from the Knowledge Commons Works administrator. + +This endpoint is not configured to receive all of the metadata required to create or modify group collections. Rather, the `group_collections` endpoint receives minimal signals from a Commons Instance and then obtains the full required metadata via an API callback to the Commons instance. + +> [!NOTE] +> KCWorks uses the term "collection" in place of the default term "community" employed in other InvenioRDM installations. This is partly to accommodate exactly the integration with Knowledge Commons groups that is discussed here. + + +### Group collection owner + +InvenioRDM does not allow groups to be owners of a collection (community). When a collection is created for a group, though, we do not know which of the group's administrators to assign as the individual owner. It is also awkward to change ownership of a collection later on if the group's administrativer personnel change. So the collection is owned by an administrative user who is assigned the role `group-collections-owner`. The group's administrators are then assigned privileges as "managers" of the group collection. This allows them to manage the collection's settings and membership, but not to delete the collection or change its ownership. + +Before the invenio_group_collections_kcworks module can be used, the administrator must create a role called `group-collections-owner` and assign membership in that role to one administrative user account. If multiple user accounts belong to that role, the first user account in the list will be assigned as the owner of group collections. If no user accounts belong to the role, the group collection creation will fail with a NoOwnerAvailable error. + +### Endpoint configuration + +The configuration variable `GROUP_COLLECTIONS_METADATA_ENDPOINTS` must be provided in the `invenio.cfg` file in order to use this endpoint. This variable should hold a dictionary whose keys are Commons instance names. The value for each key is a dictionary containing the following keys: + +| key | value type | required | value | +| --- | ---------- | ----- | ----- | +| `url` | str | Y | The url on the Commons instance where a GET request can retrieve the metadata for a group. The url should include the placeholder `{id}` where the Commons instance id for the requested group should be placed. | +| `token_name` | str (upper case) | Y | The name of the environment variable that will hold the authentication token for requests to the Commons instance url for retrieving group metadata. | +| `placeholder_avatar` | str | N | The filename or last url component that identifies a placeholder avatar in the avatar image url supplied for the Commons group avatar. | + +A typical configuration might look like the following: + +```python +GROUP_COLLECTIONS_METADATA_ENDPOINTS = { + "knowledgeCommons": { + "url": "https://hcommons-dev.org/wp-json/commons/v1/groups/{id}", + "token_name": "COMMONS_API_TOKEN", + "placeholder_avatar": "mystery-group.png", + }, +} +``` + +### Retrieving Group Collection Metadata (GET) + +A GET request to this endpoint will retrieve metadata on Invenio collections +that are owned by a Commons group. A request to the bare endpoint without a +group ID or collection slug will return a list of all collections owned by +all Commons groups. (Commons Works collections not linked to a Commons group will not be included. If you wish to query all groups, please use the `communities` API endpoint.) + +#### Query parameters + +Four optional query parameters can be used to filter the results: + +| Parameter name | Description | +| ---------------|------------ | +| `commons_instance` | the name of the Commons instance to which the group belongs. If this parameter is provided, the response will only include collections owned by groups in that instance. | +| `commons_group_id` | the ID of the Commons group. If this parameter is provided, the response will only include collections owned by that group. | +| `collection` | the slug of the collection. If this parameter is provided, the response will include only metadata for that collection. | +| `page` | the page number of the results | +| `size` | the number of results to include on each page | +| `sort` | the kind of sorting applied to the returned results | + +#### Sorting + +The `sort` parameter can be set to one of the following sort types: + +| Field name | Description | +| -----------|-------------| +| newest | Descending order based on `created` date | +| oldest | Ascending order based on `created` date | +| updated-desc | Descending order based on `updated` date | +| updated-asc | Ascending order based on `updated` date | + +By default the results are sorted by `updated-desc` + +#### Pagination + +Long result sets will be paginated. The response will include urls for the `first`, `last`, `previous`, and `next` pages of results in the `link` property of the response body. A url for the current page of results will also be included in the list as a `self` link. By default the page size is 25, but this can be changed by providing a value for the `size` query parameter. + +#### Requesting all collections + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections HTTP/1.1 +``` + +##### Successful Response Status Code + +`200 OK` + +##### Successful response body + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 50, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 50, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 100, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 100, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections", + "first": "https://works.hcommons.org/api/group_collections?page=1", + "last": "https://works.hcommons.org/api/group_collections?page=10", + "prev": "https://works.hcommons.org/api/group_collections?page=1", + "next": "https://works.hcommons.org/api/group_collections?page=2", + } + "sortBy": "newest", + "order": "ascending", +} +``` + +##### Successful Response Headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | + +#### Requesting collections for a Commons instance + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&sort=updated-asc HTTP/1.1 +``` + +##### Successful response status code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 45, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 45, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 90, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 90, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons", + "first": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1", + "last": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=9", + "prev": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=1", + "next": "https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&page=2", + } + "sortBy": "updated-asc", +} +``` + +##### Successful response headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Link | `; rel="first", ; rel="last", ; rel="prev", ; rel="next"` | + + +#### Requesting collections for a specific group + +Note that if you specify a `commons_group_id` value, you must *also* provide a `commons_instance` value. This is to avoid confusion if different Commons instances use the same internal id for groups. + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1 +``` + +##### Successful response status code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "aggregations": { + "type": { + "buckets": [ + { + "doc_count": 2, + "is_selected": false, + "key": "event", + "label": "Event", + }, + { + "doc_count": 2, + "is_selected": false, + "key": "organization", + "label": "Organization", + }, + ], + "label": "Type", + }, + "visibility": { + "buckets": [ + { + "doc_count": 4, + "is_selected": false, + "key": "public", + "label": "Public", + } + ], + "label": "Visibility", + }, + }, + "hits": { + "hits": [ + { + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "access": { + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + }, + "children": {"allow": false}, + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 2, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for panda research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } + }, + /* ... */ + ], + "total": 4, + }, + "links": { + "self": "https://works.hcommons.org/api/group_collections", + "first": "https://works.hcommons.org/api/group_collections?page=1", + "last": "https://works.hcommons.org/api/group_collections?page=1", + "prev": "https://works.hcommons.org/api/group_collections?page=1", + "next": "https://works.hcommons.org/api/group_collections?page=1", + } + "sortBy": "newest", +} +``` + +##### Successful response headers + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | + +#### Requesting a specific collection + +While other kinds of requests require query parameters, a request for metadata on a specific Commons Works collection can be made by simply adding the community's slug to the end of the url path. Once again, this will only succeed for collections that are linked to a Commons instance group. Collections that exist independently on Knowledge Commons Works will not be found at the `group_collections` endpoint and should be requested at the `communities` endpoint instead. + +##### Request + +```http +GET https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1 +``` + +##### Successful Response Status Code + +`200 OK` + +##### Successful Response Body: + +```json +{ + "id": "5402d72b-b144-4891-aa8e-1038515d68f7", + "created": "2024-01-01T00:00:00Z", + "updated": "2024-01-01T00:00:00Z", + "links": { + "self": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7", + "self_html": "https://works.hcommons.org/communities/panda-group-collection", + "settings_html": "https://works.hcommons.org/communities/panda-group-collection/settings", + "logo": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/logo", + "rename": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/rename", + "members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members", + "public_members": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/members/public", + "invitations": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/invitations", + "requests": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/requests", + "records": "https://works.hcommons.org/api/communities/5402d72b-b144-4891-aa8e-1038515d68f7/records", + "featured": "https://works.hcommons.org/api/" + "communities/" + "5402d72b-b144-4891-aa8e-1038515d68f7/" + "featured", + }, + "revision_id": 1, + "slug": "panda-group-collection", + "metadata": { + "title": "The Panda Group Collection", + "curation_policy": "Curation policy", + "page": "Information for the panda group collection", + "description": "This is a collection about pandas.", + "website": "https://works.hcommons.org/pandas", + "organizations": [ + { + "name": "Panda Research Institute", + } + ], + "size": 100, + }, + "deletion_status": { + "is_deleted": false, + "status": "P", + }, + "custom_fields": { + "kcr:commons_instance": "knowledgeCommons", + "kcr:commons_group_description": "This is a group for pandas research.", + "kcr:commons_group_id": "12345", + "kcr:commons_group_name": "Panda Research Group", + "kcr:commons_group_visibility": "public", + }, + "access": { + "visibility": "public", + "member_policy": "closed", + "record_policy": "open", + "review_policy": "open", + } +} +``` + +### Creating a Collection for a Group (POST) + +A POST request to this endpoint creates a new collection in Invenio owned by the specified Commons group. If the collection is successfully created, the response status code will be 201 Created, and the response body will be a JSON object containing the URL slug for the newly created collection. + +The POST request will trigger a callback to the Commons instance to get the metadata for the specified group, using the configuration dictionary declared in the `GROUP_COLLECTIONS_METADATA_ENDPOINTS` config variable, under the key matching the Commons instance's SAML IDP provider name (declared in the `SSO_SAML_IDPS` config variable). This callback request will be sent to the "url" specified in the configuration dictionary (e.g., `GROUP_COLLECTIONS_METADATA_ENDPOINTS["knowledgeCommons"]["url"]`). This request will be authenticated using the environment variable whose name matches the `token_name` from the same configuration dictionary. The metadata from this callback request will then be used to populate the collection metadata in Invenio. + +If the metadata returned from the Commons instance includes a url for an avatar, that avatar will be downloaded and stored in the Invenio instance's file storage. Since we do not want to use a placeholder avatar for the group, the instance's configuration can include a `placeholder_avatar` key. If the file name or last segment of the supplied avatar url matches this `placeholder_avatar` value, it will be ignored. + +#### Permissions and access in newly created collections + +By default, the newly created collection will have the following access settings: + +- Visibility: "public" +- Member visibility: "public" +- Member policy: "closed" +- Record policy: "closed" +- Review policy: "closed" + +They will appear in search results and be visible to non-members of the collection. But users who are not group members will not be able to request membership, and all submissions to the group will be held for review by the collection curators. + +The collection's administrators can change these settings in the collection's settings page. + +#### Handling group name changes + +Note that when a collection is created for a group, the collection's slug will be generated from the group's name. If the group's name is changed in the Commons instance, the collection's slug will not be automatically updated. This is to avoid breaking links to the collection. If the group's name is changed, the collection's slug will remain the same, but the collection's metadata will be updated to reflect the new group name. + +#### Handling collection name collisions + +It is possible for two groups on Commons instances to share the same human readable name, even though their ids are different. Knowledge Commons Works *will* allow multiple collections to share identical human readable names, but group url *slugs* must be unique across all KC Works collections. So where group names collide, only the first of the identically-named collections will have its slug generated normally. Susequent collections with the same name will have a numerical disambiguator appended to the end of their slugs. So if we have three groups named "Panda Studies," the first collection created for one of the groups will have the slug `panda-studies`. The other collections created by these groups will be assigned the slugs `panda-studies-1` and `panda-studies-2`, in order of their creation in Knowledge Commons Works. + +#### Handling deleted group collections + +If a group collection is deleted, its slug will be reserved in the Invenio PID store and cannot be re-used for a new collection. If a new collection is created for the same group, the slug will have a numerical disambiguator appended to the end, exactly as in cases of group name collision. E.g., if the group `panda-studies` were deleted earlier, a request to create a new collection for the "Panda Studies" group would be assigned the URL slug `panda-studies-1`. This is to avoid breaking links to the deleted collection. + +In future it may be possible to restore deleted collections, but this is not currently implemented. + + +#### Request + +```http +POST https://works.hcommons.org/api/group_collections HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Request body + +The request body must be a JSON object with the following fields: + +| Field name | Required | Description | +| -----------|----------|-------------| +| `commons_instance` | Y | The name of the Commons instance to which the group belongs. This must be the same string used to identify the instance in the `GROUP_COLLECTIONS_METADATA_ENDPOINTS` config variable. | +| `commons_group_id` | Y | The ID of the Commons group that will own the collection. | +| `collection_visibility` | N | The visibility setting for the collection to be created. Must be either "public" or "restricted". [default: "restricted"]| + +The resulting request body will be shaped like this: + +```json +{ + "commons_instance": "knowledgeCommons", + "commons_group_id": "12345", + "collection_visibility": "public", +} +``` + + +#### Successful response status code + +`201 Created` + +#### Successful response body + +```json +{ + "commons_group_id": "12345", + "collection_slug": "new-collection-slug" +} +``` + +#### Unsuccessful response codes + +- 400 Bad Request: The request body is missing required fields or contains + invalid data. +- 404 Not Found: The specified group could not be found by the callback to the Commons instance. +- 403 Forbidden: The request is not authorized to modify the collection. +- 409 Conflict: A collection already exists in Knowledge Commons Works linked to the specified group. + +### Changing the Group Ownership of a Collection (PATCH) + +[!WARNING] +PATCH requests to change group ownership of the collection are not yet implemented. + +A PATCH request to this endpoint modifies an existing collection in Invenio by changing the Commons group to which it belongs. This is the *only* modification that can be made to a collection via this endpoint. Other modifications to Commons group metadata should be handled by signalling the Invenio webhook for commons group metadata updates. Modifications to internal metadata or settings for the Invenio collection should be made view the Invenio "communities" API or the collection settings UI. + +Note that the collection memberships in Invenio will be automatically transferred to the new Commons group. The corporate roles for the old Commons group will be removed from the collection and corporate roles for the new Commons group will be added to its membership with appropriate permissions. But any individual memberships that have been granted through the Invenio UI will be left unchanged. If the new collection administrators wish to change these individual memberships, they will need to do so through the Invenio UI. + +#### Request + +```http +PATCH https://works.hcommons.org/api/group_collections/my-collection-slug HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Request body + +```json +{ + "commons_instance": "knowledgeCommons", + "old_commons_group_id": "12345", + "new_commons_group_id": "67890", + "new_commons_group_name": "My Group", + "collection_visibility": "public", +} +``` + +#### Successful response status code + +`200 OK` + +#### Successful response body + +```json +{ + "collection": "my-collection-slug" + "old_commons_group_id": "12345", + "new_commons_group_id": "67890", +} +``` + +#### Unsuccessful response codes + +- 400 Bad Request: The request body is missing required fields or contains + invalid data. +- 404 Not Found: The collection does not exist. +- 403 Forbidden: The request is not authorized to modify the collection. +- 304 Not Modified: The collection is already owned by the specified + Commons group. + +### Deleting a Group's Collection (DELETE) + +A DELETE request to this endpoint deletes a collection in Invenio owned by the specified Commons group. Note that the request must include all of: + +- the collection slug as the url path parameter +- the identifier of the Commons instance to which the group belongs, in the `commons_instance` query parameter +- the Commons identifier of the group which owns the collection, in the `commons_group_id` query parameter + +If any of these is missing the request will fail with a `400 Bad Request` error. This is to ensure that collections are not deleted accidentally or by agents without authorization. + +If the collection is successfully deleted, the response status code will be 204 No Content. + +[!NOTE] +Once a group collection has been deleted, its former URL slug is still registered in Invenio's PID store and reserved for the (now deleted) collection. Subsequent requests to create a collection for the same group cannot re-use the same URL slug. Instead the new slug will have a numerical disambiguator added to the end, exactly as in cases of group name collision. E.g., if the group `panda-studies` were deleted earlier, a request to create a new collection for the "Panda Studies" group would be assigned the URL slug `panda-studies-1`. + +[!NOTE] +Group collections are soft deleted and can in principle be restored within a short period after the delete signal has been sent. Eventually, though, the soft deleted collection records will be +automatically purged entirely from the database. There is also no API mechanism for restoring them. So delete operations should be regarded as permanent and irrevocable. + +#### Request + +```http +DELETE https://works.hcommons.org/api/group_collections/my-collection-slug?commons_instance=knowledgeCommons&commons_group_id=12345 HTTP/1.1 +``` + +Required request headers: + +| Header name | Header value | +| ------------|-------------- | +| Content-Type | `application/json` | +| Authorization | `Bearer ` | + +#### Successful response status code + +`204 No Content` + +#### Unsuccessful response codes + +- 400 Bad Request: The request did not include the required parameters or the parameters are not well formed. +- 403 Forbidden: The requesting agent is not authorized to delete the collection. The collection may not belong to the Commons instance making the request, or it may not belong to the specified Commons group. +- 404 Not Found: The collection does not exist. +- 422 UnprocessableEntity: The deletion could not be performed because the + + +## User and Group Data Updates (Internal Only) + +``` +https://works.hcommons.org/api/webhooks/user_data_update +``` + +> [!WARNING] +> This API endpoint is intended for internal use only. It is not intended to be used by clients outside of the Knowledge Commons system. + +> [!NOTE] +> This API was implemented with a distributed network of independent Commons instances in mind. Currently, only the Knowledge Commons instance exists and is supported as a SAML IDP by KCWorks. + +The api endpoint `/api/webhooks/user_data_update` is provided for Knowledge Commons applications and instances to signal that user or group metadata has been changed. These endpoints do not receive the actual updated data. They only receive notices *that* the metadata for a user or group has changed. KCWorks will then query the Commons instance's endpoint to retrieve current metadata for the user or group. + +### User/Groups Metadata updates and SAML authentication + +It is assumed that Commons instances have registered a SAML authentication IDP with KCWorks. The Commons identifiers for users in metadata update signals must be the same identifiers provided by the instance's SAML IDP. This allows KCWorks to reliably identify the correct KCWorks user account, even if the same identifier happens to be used internally by multiple Commons instances. It also allows KCWorks to store Commons instance user ids in one central place within KCWorks, minimizing the chances of those links between a Commons instance user account and a KCWorks user account becoming corrupted. + +### GET requests + +A `GET` request to this endpoint can be used to check that the endpoint is available and receiving messages. The response should have a `200` status code and should carry the following JSON response body: + +```json +{ + "message": "Webhook receiver is active", + "status": 200, +} +``` + +### POST requests +#### Payload objects + +Update notices should be sent via a `POST` request with a JSON payload object shaped like this: + +```json +{ + "idp": "knowledgeCommons", + "updates": { + "users": [ + {"id": "myusername", "event": "updated"}, + {"id": "anotherusername", "event": "created"}, + ], + "groups": [{"id": "1234", "event": "updated"}], + }, +}, +``` + +Top level payload object properties: + +| Property | Type | Description | Required | +| --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `idp` | string | The name used by KCWorks to identify the identity provider the Commons instance has registered with KCWorks. This id should have been provided by the KCWorks administrators when the Commons instance's IDP connection was established. For Knowledge Commons the value is `knowledgeCommons` | Y | +| `updates` | object | This object identifies the metadata updates that have taken place on the Commons instance. It allows updates of different kinds and for multiple entities to be signalled in a single request. Its properties are described below. | Y | + +`updates` object properties: + +| Property | Type | Description | Required | +| -------- | ----- | ----------------------------------------------------------------------------------- | -------- | +| `users` | array | An array of objects each representing one metadata change event for a single user. | N | +| `groups` | array | An array of objects each representing one metadata change for a single group. | N | + +NOTE: A valid payload *must* provide either a `users` array or a `groups` array with at least one member. Requests providing neither `users` nor `groups`, or providing only empty arrays, will result in an error response. + +`users` and `groups` object properties + +| Property | Type | Description | Required | +| -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `id` | number | The local identifier of the user or group on the Commons instance. This must be the same identifier that can be used to retrieve the entity's metadata at the corresponding endpoint on the Commons instance. | Y | +| `event` | string | The nature of the metadata change for the entity. Must be one of `updated`, `created`, or `deleted`. The `updated` and `deleted` event types should be sent when an entity is first created or is deleted entirely from the Commons instance. These will trigger the creation or deletion of corresponding entities (a user or a group) on KC Works. All other metadata changes are `updated` events. | Y | + +NOTE: A valid payload's user and/or group objects must each include *both* an `id` *and* an `event` value. + +#### Event timing + +There may be some delay between KC Works' receiving an update signal and the updating of the corresponding entity's metadata in KC Works. The actual updates are handled by background workers and in some cases there may be a slight delay before a worker is free. Usually this will only be a fraction of a second, but if intensive background tasks (like indexing) are ongoing it could be several minutes. The update also depends on a successful callback request from KC Works to the Commons instance's endpoint for serving user or group metadata. If that request fails, it is possible for an update to fail even though the webhook signal was received successfully. + +#### Success responses + +If a signal is received successfully, the response will have a status of `202` and carry a JSON response object shaped like this: + +```json +{ + "message": "Webhook received", + "status": 202, + "updates": { + "users": [ + {"id": "myusername", "event": "updated"}, + {"id": "anotherusername", "event": "created"}, + ], + "groups": [{"id": "1234", "event": "updated"}], + } +} +``` + +The `updates` object should be identical to the `updates` object provided in the `POST` request. This confirms that the correct events have all been received and are being sent for processing. + +#### Error responses + +If multiple update signals are received in one `POST` request, it is possible that only some of the updates can be processed. The request might, for example, provide `updated` event signals for a number of entities, some of whose ids do not exist in KC Works. In this case the response code will be `207 Multi-Status` and the response payload will be a JSON object + + diff --git a/docs/source/conf.py b/docs/source/conf.py index bed1354ca..e03b8c1c1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -20,6 +20,7 @@ exclude_patterns = [] autosectionlabel_prefix_document = True +autosectionlabel_maxdepth = 4 # -- Options for HTML output ------------------------------------------------- diff --git a/docs/source/index.rst b/docs/source/index.rst index 5df881c7c..59ce7a8bd 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -16,6 +16,7 @@ Welcome to the Knowledge Commons Works technical documentation! metadata customizations configuration + api cli_commands infrastructure developing diff --git a/docs/source/metadata.md b/docs/source/metadata.md index a8d671d88..088f2e8e6 100644 --- a/docs/source/metadata.md +++ b/docs/source/metadata.md @@ -1,3 +1,4 @@ +(metadata-schema-vocabularies-and-identifiers)= # Metadata Schema, Vocabularies, and Identifiers The default metadata schema for InvenioRDM records is defined in the `invenio-rdm-records` package and documented [here](https://inveniordm.docs.cern.ch/reference/metadata/). It also includes a number of optional metadata fields which have been enabled in KCWorks, documented [here](https://inveniordm.docs.cern.ch/reference/metadata/optional_metadata/). @@ -260,11 +261,11 @@ The JSON object retrieved from the record API shares the same basic structure as #### FAST -The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the `subjects` field. See the [metadata.subjects](#metadata.subjects) section for more information about how to include FAST subjects in a KCWorks record. +The FAST controlled vocabulary (https://www.oclc.org/research/areas/data-science/fast.html) is used for the `subjects` field. See the [metadata.subjects](#metadata-subjects) section for more information about how to include FAST subjects in a KCWorks record. #### Homosaurus -The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity. See the [metadata.subjects](#metadata.subjects) section for information about how to include Homosaurus subjects in a KCWorks record. +The FAST vocabulary is augmented in KCWorks by the Homosaurus vocabulary (https://homosaurus.org/) for subjects related to sexuality and gender identity. See the [metadata.subjects](#metadata-subjects) section for information about how to include Homosaurus subjects in a KCWorks record. ## Resource types @@ -481,13 +482,13 @@ An ISBN (International Standard Book Number) is a ten (pre-2007) or 13 digit (20 KCWorks (and InvenioRDM) supports the ORCID identifier scheme. The ORCID of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`). A KCWorks user's ORCID id is also drawn from their KC profile (if they have provided one) and stored in their system user profile (as `.user_profile.identifier_orcid`). -For details on how to use ORCID identifiers in KCWorks, see the section on [Metadata.creators](#metadata.creators) below. +For details on how to use ORCID identifiers in KCWorks, see the section on [Metadata.creators](#metadata-creators-metadata-contributors) below. #### KC Username (recommended) KCWorks also allows the use of Knowledge Commons usernames as identifiers. The KC username of the submitter of the KCWorks record is stored in the `person_or_org.identifiers` property of the `creators` array (`creators[0].person_or_org.identifiers.identifier`) using the scheme `kc_username`. -For details on how to use KC usernames in KCWorks, see the section on [Metadata.creators](#metadata.creators) below. +For details on how to use KC usernames in KCWorks, see the section on [Metadata.creators](#metadata-creators-metadata-contributors) below. #### GND From 368b59e0da466c449d26be02ea5e9a180034f2b9 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Fri, 24 Jan 2025 19:48:30 -0500 Subject: [PATCH 05/16] fix(testing): Several new and updated integration tests --- site/pyproject.toml | 1 - site/tests/api/conftest.py | 2 +- site/tests/api/test_api_notifications.py | 93 +- site/tests/api/test_api_record_ops.py | 849 ++++++++++++++---- site/tests/api/test_collections.py | 84 ++ site/tests/api/test_search_provisioning.py | 10 +- site/tests/api/test_stats.py | 8 +- site/tests/conftest.py | 1 - site/tests/fixtures/communities.py | 114 ++- site/tests/fixtures/files.py | 11 + site/tests/fixtures/records.py | 282 +++++- site/tests/fixtures/users.py | 39 +- site/tests/helpers/sample_files/sample.pdf | Bin 0 -> 13264 bytes site/tests/helpers/sample_records/__init__.py | 2 +- site/tests/helpers/sample_records/basic.py | 218 ----- ...py => sample_metadata_presentation_pdf.py} | 31 +- 16 files changed, 1186 insertions(+), 559 deletions(-) create mode 100644 site/tests/api/test_collections.py create mode 100644 site/tests/fixtures/files.py create mode 100644 site/tests/helpers/sample_files/sample.pdf delete mode 100644 site/tests/helpers/sample_records/basic.py rename site/tests/helpers/sample_records/{sample583.py => sample_metadata_presentation_pdf.py} (97%) diff --git a/site/pyproject.toml b/site/pyproject.toml index 6b4de55d1..0b8ba3e2a 100644 --- a/site/pyproject.toml +++ b/site/pyproject.toml @@ -67,7 +67,6 @@ plugins = [ "tests.fixtures.vocabularies.resource_types", "tests.fixtures.vocabularies.roles", "tests.fixtures.vocabularies.subjects", - "tests.helpers.sample_records.basic", ] [tool.setuptools.package-data] diff --git a/site/tests/api/conftest.py b/site/tests/api/conftest.py index 3455b3dbc..bbc40691a 100644 --- a/site/tests/api/conftest.py +++ b/site/tests/api/conftest.py @@ -18,7 +18,7 @@ def headers(): """Default headers for making requests.""" return { "content-type": "application/json", - "accept": "application/vnd.inveniordm.v1+json", + # "accept": "application/vnd.inveniordm.v1+json", } diff --git a/site/tests/api/test_api_notifications.py b/site/tests/api/test_api_notifications.py index d872b8798..56d352d25 100644 --- a/site/tests/api/test_api_notifications.py +++ b/site/tests/api/test_api_notifications.py @@ -29,11 +29,10 @@ def test_notify_for_request_acceptance( running_app, - appctx, db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -58,7 +57,9 @@ def test_notify_for_request_acceptance( """ app = running_app.app admin_id = admin.user.id - community = minimal_community_factory(owner=admin_id) + community_rec = minimal_community_factory(owner=admin_id) + community_meta = community_rec.to_dict() + app.logger.debug(f"community_meta: {pformat(community_meta)}") assert len(mailbox) == 0 # Create a user with a community submission @@ -81,7 +82,7 @@ def test_notify_for_request_acceptance( logged_in_client = client response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 @@ -103,12 +104,12 @@ def test_notify_for_request_acceptance( # create a review request (can't use REST API for this) review_body = { - "receiver": {"community": f"{community['id']}"}, + "receiver": {"community": f"{community_meta['id']}"}, "type": "community-submission", } response = logged_in_client.put( - f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/" "review", + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/review", data=json.dumps(review_body), headers={**headers, "Authorization": f"Bearer {token}"}, ) @@ -129,7 +130,7 @@ def test_notify_for_request_acceptance( # not asserting it assert request_data["status"] == "created" # assert request_data["updated"] == request_created_date # not exact - assert request_data["receiver"] == {"community": f"{community['id']}"} + assert request_data["receiver"] == {"community": f"{community_meta['id']}"} assert request_data["revision_id"] == 2 request_id = request_data.get("id") @@ -183,7 +184,7 @@ def test_notify_for_request_acceptance( load_community_needs(reviewer_identity) # since we didn't log in review_accepted = current_requests_service.execute_action( reviewer_identity, - submitted_request.id, + request_id, "accept", data=accept_body, ) @@ -243,7 +244,7 @@ def test_notify_for_request_decline( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -269,7 +270,8 @@ def test_notify_for_request_decline( app = running_app.app admin_id = admin.user.id - community = minimal_community_factory(owner=admin_id) + community_rec = minimal_community_factory(owner=admin_id) + community_meta = community_rec.to_dict() assert len(mailbox) == 0 # Create a user with a community submission @@ -292,7 +294,7 @@ def test_notify_for_request_decline( logged_in_client = client response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 @@ -313,7 +315,7 @@ def test_notify_for_request_decline( # create a review request (can't use REST API for this) review_body = { - "receiver": {"community": f"{community['id']}"}, + "receiver": {"community": f"{community_meta['id']}"}, "type": "community-submission", } @@ -339,7 +341,7 @@ def test_notify_for_request_decline( # not asserting it assert request_data["status"] == "created" # assert request_data["updated"] == request_created_date # not exact - assert request_data["receiver"] == {"community": f"{community['id']}"} + assert request_data["receiver"] == {"community": f"{community_meta['id']}"} assert request_data["revision_id"] == 2 request_id = request_data.get("id") @@ -453,7 +455,7 @@ def test_notify_for_request_cancellation( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -468,7 +470,8 @@ def test_notify_for_request_cancellation( """ app = running_app.app admin_id = admin.user.id - community = minimal_community_factory(owner=admin_id) + community_rec = minimal_community_factory(owner=admin_id) + community_meta = community_rec.to_dict() assert len(mailbox) == 0 # Create a user with a community submission @@ -491,7 +494,7 @@ def test_notify_for_request_cancellation( logged_in_client = client response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 @@ -512,7 +515,7 @@ def test_notify_for_request_cancellation( # create a review request (can't use REST API for this) review_body = { - "receiver": {"community": f"{community['id']}"}, + "receiver": {"community": f"{community_meta['id']}"}, "type": "community-submission", } @@ -538,7 +541,7 @@ def test_notify_for_request_cancellation( # not asserting it assert request_data["status"] == "created" # assert request_data["updated"] == request_created_date # not exact - assert request_data["receiver"] == {"community": f"{community['id']}"} + assert request_data["receiver"] == {"community": f"{community_meta['id']}"} assert request_data["revision_id"] == 2 request_id = request_data.get("id") @@ -631,7 +634,7 @@ def test_notify_for_new_request_comment( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -646,7 +649,8 @@ def test_notify_for_new_request_comment( """ app = running_app.app admin_id = admin.user.id - community = minimal_community_factory(owner=admin_id) + community_rec = minimal_community_factory(owner=admin_id) + community_meta = community_rec.to_dict() assert len(mailbox) == 0 # Create a user with a community submission @@ -666,7 +670,7 @@ def test_notify_for_new_request_comment( with app.test_client() as client: response = client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 @@ -687,7 +691,7 @@ def test_notify_for_new_request_comment( # create a review request (can't use REST API for this) review_body = { - "receiver": {"community": f"{community['id']}"}, + "receiver": {"community": f"{community_meta['id']}"}, "type": "community-submission", } @@ -713,7 +717,7 @@ def test_notify_for_new_request_comment( # not asserting it assert request_data["status"] == "created" # assert request_data["updated"] == request_created_date # not exact - assert request_data["receiver"] == {"community": f"{community['id']}"} + assert request_data["receiver"] == {"community": f"{community_meta['id']}"} assert request_data["revision_id"] == 2 request_id = request_data.get("id") @@ -830,7 +834,7 @@ def test_read_unread_notifications_by_service( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -908,7 +912,7 @@ def test_clear_unread_notifications_by_service( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -1123,7 +1127,7 @@ def test_clear_unread_notifications_by_view( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -1231,7 +1235,7 @@ def test_clear_one_unread_notification_by_view( db, user_factory, minimal_community_factory, - minimal_record, + minimal_record_metadata, client, client_with_login, headers, @@ -1394,7 +1398,7 @@ def test_unread_endpoint_bad_methods( def test_notification_on_first_upload( running_app, user_factory, - minimal_record, + minimal_record_metadata, db, search_clear, client, @@ -1453,14 +1457,14 @@ def test_notification_on_first_upload( login_user_via_session(client, email=user.email) # Create the first draft - response = client.post( + draft1_response = client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) - assert response.status_code == 201 - first_draft_id = response.json.get("id") - record_title = response.json.get("metadata").get("title") + assert draft1_response.status_code == 201 + first_draft_id = draft1_response.json.get("id") + record_title = draft1_response.json.get("metadata").get("title") # Check that an email was sent to the admin assert len(mailbox) == 1 @@ -1480,9 +1484,9 @@ def test_notification_on_first_upload( f"'{app.config.get('SITE_UI_URL')}/records/{first_draft_id}'>" f"View draft)" in email.html ) - assert f"Draft title: {minimal_record['metadata']['title']}" in email.body - assert f"Draft title: {minimal_record['metadata']['title']}" in email.html - # assert f"Full metadata: {minimal_record}" in email.body + assert f"Draft title: {minimal_record_metadata['metadata']['title']}" in email.body + assert f"Draft title: {minimal_record_metadata['metadata']['title']}" in email.html + # assert f"Full metadata: {minimal_record_metadata}" in email.body assert f"User ID: {user_id}" in email.body assert f"User ID: {user_id}" in email.html assert f"User email: {user_email}" in email.body @@ -1492,24 +1496,24 @@ def test_notification_on_first_upload( assert "A new user has created their first draft." in email.body assert "A new user has created their first draft." in email.html - # Create a second draft - response = client.post( + # Create a second draft work (different work) + draft2_response = client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) - assert response.status_code == 201 + assert draft2_response.status_code == 201 # Check that no new notification was created for the admin assert len(mailbox) == 1 # Publish the first draft - response = client.post( + draft1_publish_response = client.post( f"{app.config['SITE_API_URL']}/records/{first_draft_id}/draft/" "actions/publish", headers={**headers, "Authorization": f"Bearer {token}"}, ) - assert response.status_code == 202 + assert draft1_publish_response.status_code == 202 # Check that a new notification was created for the admin assert len(mailbox) == 2 @@ -1520,10 +1524,11 @@ def test_notification_on_first_upload( f"a work: '{record_title}'" in email.subject ) assert email.sender == app.config["MAIL_DEFAULT_SENDER"] + app.logger.debug(f"email.body: {pformat(email.body)}") assert f"Work ID: {first_draft_id}" in email.body assert f"Work ID: {first_draft_id}" in email.html - assert f"Work title: {minimal_record['metadata']['title']}" in email.body - assert f"Work title: {minimal_record['metadata']['title']}" in email.html + assert f"Work title: {minimal_record_metadata['metadata']['title']}" in email.body + assert f"Work title: {minimal_record_metadata['metadata']['title']}" in email.html assert f"User ID: {user_id}" in email.body assert f"User ID: {user_id}" in email.html assert f"User email: {user_email}" in email.body diff --git a/site/tests/api/test_api_record_ops.py b/site/tests/api/test_api_record_ops.py index 27d966168..3fccb8117 100644 --- a/site/tests/api/test_api_record_ops.py +++ b/site/tests/api/test_api_record_ops.py @@ -1,45 +1,25 @@ -import json import pytest -import re -from invenio_access.permissions import system_identity +import arrow +from datetime import timedelta +import hashlib +from invenio_access.permissions import authenticated_user, system_identity +from invenio_access.utils import get_identity +from invenio_files_rest.helpers import compute_checksum from invenio_rdm_records.proxies import current_rdm_records_service as records_service +import json +from pathlib import Path +from pprint import pformat +import re from ..fixtures.users import user_data_set -import arrow -links_template = { - "self": "{0}/records/{1}/draft", - "self_html": "{2}/uploads/{1}", - "self_iiif_manifest": "{0}/iiif/draft:{1}/manifest", - "self_iiif_sequence": "{0}/iiif/draft:{1}/sequence/default", - "files": "{0}/records/{1}/draft/files", - "media_files": "{0}/records/{1}/draft/media-files", - "archive": "{0}/records/{1}/draft/files-archive", - "archive_media": "{0}/records/{1}/draft/media-files-archive", - "record": "{0}/records/{1}", - "record_html": "{2}/records/{1}", - "publish": "{0}/records/{1}/draft/actions/publish", - "review": "{0}/records/{1}/draft/review", - "versions": "{0}/records/{1}/versions", - "access_links": "{0}/records/{1}/access/links", - "access_grants": "{0}/records/{1}/access/grants", - "access_users": "{0}/records/{1}/access/users", - "access_groups": "{0}/records/{1}/access/groups", - "access_request": "{0}/records/{1}/access/request", - "access": "{0}/records/{1}/access", - "reserve_doi": "{0}/records/{1}/draft/pids/doi", - "communities": "{0}/records/{1}/communities", - "communities-suggestions": "{0}/records/{1}/communities-suggestions", - "requests": "{0}/records/{1}/requests", -} - - -def test_draft_creation( +def test_draft_creation_api( running_app, db, + build_draft_record_links, user_factory, client_with_login, - minimal_record, + minimal_record_metadata, headers, search_clear, celery_worker, @@ -49,25 +29,23 @@ def test_draft_creation( u = user_factory( email=user_data_set["user1"]["email"], - password="test", token=True, - admin=True, ) user = u.user - # identity = u.identity - # print(identity) token = u.allowed_token - minimal_record.update({"files": {"enabled": False}}) + + minimal_record_metadata.update({"files": {"enabled": False}}) with app.test_client() as client: - logged_in_client, _ = client_with_login(client, user) + logged_in_client = client_with_login(client, user) response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 actual_draft = response.json + app.logger.debug(f"actual_draft: {pformat(actual_draft)}") actual_draft_id = actual_draft["id"] # ensure the id is in the correct format @@ -86,12 +64,9 @@ def test_draft_creation( == actual_draft["updated"] ) - test_api_url = app.config["SITE_API_URL"] - test_ui_url = app.config["SITE_UI_URL"] - assert actual_draft["links"] == { - k: v.format(test_api_url, actual_draft_id, test_ui_url) - for k, v in links_template.items() - } + assert actual_draft["links"] == build_draft_record_links( + actual_draft_id, app.config["SITE_API_URL"], app.config["SITE_UI_URL"] + ) # assert actual_draft['revision_id'] == 5 # TODO: Why is this 5? @@ -167,82 +142,116 @@ def test_draft_creation( } assert actual_draft["status"] == "draft" publication_date = arrow.get(actual_draft["metadata"]["publication_date"]) - assert actual_draft["ui"][ - "publication_date_l10n_medium" - ] == publication_date.format("MMM D, YYYY") - assert actual_draft["ui"][ - "publication_date_l10n_long" - ] == publication_date.format("MMMM D, YYYY") - created_date = arrow.get(actual_draft["created"]) - assert actual_draft["ui"]["created_date_l10n_long"] == created_date.format( - "MMMM D, YYYY" - ) - updated_date = arrow.get(actual_draft["updated"]) - assert actual_draft["ui"]["updated_date_l10n_long"] == updated_date.format( - "MMMM D, YYYY" - ) - assert actual_draft["ui"]["resource_type"] == { - "id": "image-photograph", - "title_l10n": "Photo", - } - assert actual_draft["ui"]["custom_fields"] == {} - assert actual_draft["ui"]["access_status"] == { - "id": "metadata-only", - "title_l10n": "Metadata-only", - "description_l10n": "No files are available for this record.", - "icon": "tag", - "embargo_date_l10n": None, - "message_class": "", - } - assert actual_draft["ui"]["creators"] == { - "affiliations": [], - "creators": [ - { - "person_or_org": { - "type": "personal", - "name": "Brown, Troy", - "given_name": "Troy", - "family_name": "Brown", - } - }, - { - "person_or_org": { - "type": "organizational", - "name": "Troy Inc.", - } - }, - ], - } - assert actual_draft["ui"]["version"] == "v1" - assert actual_draft["ui"]["is_draft"] - - # publish the record - # publish_response = logged_in_client.post( - # f"{app.config['SITE_API_URL']}/records/{actual_draft_id}/draft" - # "/actions/publish", - # headers={**headers, "Authorization": f"Bearer {token}"}, + + # TODO: UI field only present in object sent to jinja template + # we need to test that the jinja template is working correctly + # + # assert actual_draft["ui"][ + # "publication_date_l10n_medium" + # ] == publication_date.format("MMM D, YYYY") + # assert actual_draft["ui"][ + # "publication_date_l10n_long" + # ] == publication_date.format("MMMM D, YYYY") + # created_date = arrow.get(actual_draft["created"]) + # assert actual_draft["ui"]["created_date_l10n_long"] == created_date.format( + # "MMMM D, YYYY" # ) - # assert publish_response.status_code == 202 + # updated_date = arrow.get(actual_draft["updated"]) + # assert actual_draft["ui"]["updated_date_l10n_long"] == updated_date.format( + # "MMMM D, YYYY" + # ) + # assert actual_draft["ui"]["resource_type"] == { + # "id": "image-photograph", + # "title_l10n": "Photo", + # } + # assert actual_draft["ui"]["custom_fields"] == {} + # assert actual_draft["ui"]["access_status"] == { + # "id": "metadata-only", + # "title_l10n": "Metadata-only", + # "description_l10n": "No files are available for this record.", + # "icon": "tag", + # "embargo_date_l10n": None, + # "message_class": "", + # } + # assert actual_draft["ui"]["creators"] == { + # "affiliations": [], + # "creators": [ + # { + # "person_or_org": { + # "type": "personal", + # "name": "Brown, Troy", + # "given_name": "Troy", + # "family_name": "Brown", + # } + # }, + # { + # "person_or_org": { + # "type": "organizational", + # "name": "Troy Inc.", + # } + # }, + # ], + # } + # assert actual_draft["ui"]["version"] == "v1" + # assert actual_draft["ui"]["is_draft"] + + +def test_draft_creation_service( + running_app, + db, + client_with_login, + minimal_record_metadata, + headers, + user_factory, + search_clear, + celery_worker, + minimal_draft_record_factory, +): + app = running_app.app + result = minimal_draft_record_factory(metadata=minimal_record_metadata) + actual_draft = result.to_dict() + app.logger.debug(f"actual_draft: {pformat(actual_draft)}") + assert actual_draft["is_draft"] + assert not actual_draft["is_published"] + assert not actual_draft["versions"]["is_latest"] # TODO: Why is this False? + assert actual_draft["versions"]["is_latest_draft"] is True + assert actual_draft["versions"]["index"] == 1 + assert actual_draft["status"] == "draft" + assert actual_draft["files"]["enabled"] == False + assert actual_draft["files"]["entries"] == {} + assert ( + actual_draft["metadata"]["creators"] + == minimal_record_metadata["metadata"]["creators"] + ) + assert ( + actual_draft["metadata"]["publisher"] + == minimal_record_metadata["metadata"]["publisher"] + ) + assert ( + actual_draft["metadata"]["publication_date"] + == minimal_record_metadata["metadata"]["publication_date"] + ) + assert ( + actual_draft["metadata"]["resource_type"]["id"] + == minimal_record_metadata["metadata"]["resource_type"]["id"] + ) + assert ( + actual_draft["metadata"]["title"] + == minimal_record_metadata["metadata"]["title"] + ) - # actual_published = publish_response.json - # assert actual_published["id"] == actual_draft_id - # assert actual_published["is_published"] - # assert not actual_published["is_draft"] - # assert actual_published["revision_id"] == 3 - # assert actual_published["versions"]["is_latest"] - # assert actual_published["versions"]["is_latest_draft"] - # assert actual_published["versions"]["index"] == 1 - # assert actual_published["status"] == "published" - # assert actual_published["ui"]["version"] == "v1" - # assert not actual_published["ui"]["is_draft"] + read_result = records_service.read_draft(system_identity, actual_draft["id"]) + actual_read = read_result.to_dict() + assert actual_read["id"] == actual_draft["id"] + assert actual_read["metadata"]["title"] == actual_draft["metadata"]["title"] # @pytest.mark.skip(reason="Not implemented") -def test_record_publication_metadata_only_api( +def test_record_publication_api( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, @@ -262,11 +271,11 @@ def test_record_publication_metadata_only_api( # print(identity) with app.test_client() as client: - logged_in_client, _ = client_with_login(client, user) - minimal_record.update({"files": {"enabled": False}}) + logged_in_client = client_with_login(client, user) + minimal_record_metadata.update({"files": {"enabled": False}}) response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records", - data=json.dumps(minimal_record), + data=json.dumps(minimal_record_metadata), headers={**headers, "Authorization": f"Bearer {token}"}, ) assert response.status_code == 201 @@ -274,10 +283,6 @@ def test_record_publication_metadata_only_api( actual_draft = response.json actual_draft_id = actual_draft["id"] - # mock_search_api_request( - # "POST", actual_draft_id, minimal_record, app.config["SITE_API_URL"] - # ) - publish_response = logged_in_client.post( f"{app.config['SITE_API_URL']}/records/{actual_draft_id}/draft" "/actions/publish", @@ -293,32 +298,29 @@ def test_record_publication_metadata_only_api( assert actual_published["versions"]["is_latest_draft"] is True assert actual_published["versions"]["index"] == 1 assert actual_published["status"] == "published" - assert actual_published["ui"]["version"] == "v1" - assert not actual_published["ui"]["is_draft"] -def test_record_publication_metadata_only_service( +def test_record_publication_service( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, celery_worker, mock_send_remote_api_update_fixture, + minimal_draft_record_factory, ): """Test that a system user can create a draft record internally.""" - app = running_app.app - minimal_record.update({"files": {"enabled": False}}) - response = records_service.create(system_identity, minimal_record) - actual_draft = response.to_dict() + minimal_record_metadata.update({"files": {"enabled": False}}) + result = minimal_draft_record_factory(metadata=minimal_record_metadata) + actual_draft = result.to_dict() actual_draft_id = actual_draft["id"] - publish_response = records_service.publish(system_identity, actual_draft_id) - - actual_published = publish_response.to_dict() + publish_result = records_service.publish(system_identity, actual_draft_id) + actual_published = publish_result.to_dict() assert actual_published["id"] == actual_draft_id assert actual_published["is_published"] assert not actual_published["is_draft"] @@ -339,56 +341,99 @@ def test_record_publication_metadata_only_service( assert actual_read["status"] == "published" -@pytest.mark.skip(reason="Not implemented") -def test_record_draft_update_metadata_only_api( +def test_record_draft_update_api( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, + mock_send_remote_api_update_fixture, ): - pass + app = running_app.app + + u = user_factory( + email=user_data_set["user1"]["email"], + token=True, + ) + user = u.user + token = u.allowed_token + + minimal_record_metadata.update({"files": {"enabled": False}}) + with app.test_client() as client: + logged_in_client = client_with_login(client, user) + creation_response = logged_in_client.post( + f"{app.config['SITE_API_URL']}/records", + data=json.dumps(minimal_record_metadata), + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert creation_response.status_code == 201 + actual_draft = creation_response.json + actual_draft_id = actual_draft["id"] -def test_record_draft_update_metadata_only_service( + minimal_record_metadata["metadata"]["title"] = "A Romans Story 2" + update_response = logged_in_client.put( + f"{app.config['SITE_API_URL']}/records/{actual_draft_id}/draft", + data=json.dumps(minimal_record_metadata), + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert update_response.status_code == 200 + + actual_draft_updated = update_response.json + assert actual_draft_updated["id"] == actual_draft_id + assert actual_draft_updated["metadata"]["title"] == "A Romans Story 2" + assert actual_draft_updated["is_draft"] + assert not actual_draft_updated["is_published"] + assert actual_draft_updated["versions"]["is_latest"] is False + assert actual_draft_updated["versions"]["is_latest_draft"] is True + assert actual_draft_updated["versions"]["index"] == 1 + assert actual_draft_updated["revision_id"] == 7 # TODO: Why is this 7? + assert actual_draft_updated["status"] == "draft" + + # Check that the change is available via the service + read_result = records_service.read_draft(system_identity, actual_draft_id) + actual_read = read_result.to_dict() + assert actual_read["id"] == actual_draft_id + assert actual_read["metadata"]["title"] == "A Romans Story 2" + assert actual_read["is_draft"] + assert not actual_read["is_published"] + assert actual_read["versions"]["is_latest"] is False + assert actual_read["versions"]["is_latest_draft"] is True + assert actual_read["versions"]["index"] == 1 + assert actual_read["revision_id"] == 7 # TODO: Why is this 7? + assert actual_read["status"] == "draft" + + +def test_record_draft_update_service( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, + minimal_draft_record_factory, headers, user_factory, search_clear, celery_worker, mock_send_remote_api_update_fixture, ): - app = running_app.app - - minimal_record.update({"files": {"enabled": False}}) - response = records_service.create(system_identity, minimal_record) - actual_draft = response.to_dict() - actual_draft_id = actual_draft["id"] - - minimal_edited = minimal_record.copy() - minimal_edited["metadata"]["title"] = "A Romans Story 2" - edited_draft = records_service.update_draft( - system_identity, actual_draft_id, minimal_edited + minimal_record_metadata.update({"files": {"enabled": False}}) + draft_result = minimal_draft_record_factory(metadata=minimal_record_metadata) + minimal_record_metadata["metadata"]["title"] = "A Romans Story 2" + edited_draft_result = records_service.update_draft( + system_identity, draft_result.id, minimal_record_metadata ) - actual_edited = edited_draft.to_dict() - actual_edited["metadata"]["title"] = "A Romans Story 2" - - publish_response = records_service.publish(system_identity, actual_edited["id"]) - - actual_published = publish_response.to_dict() - assert actual_published["id"] == actual_draft_id - assert actual_published["metadata"]["title"] == "A Romans Story 2" - assert actual_published["is_published"] - assert not actual_published["is_draft"] - assert actual_published["versions"]["is_latest"] - assert actual_published["versions"]["is_latest_draft"] is True - assert actual_published["versions"]["index"] == 1 - assert actual_published["status"] == "published" + actual_edited = edited_draft_result.to_dict() + assert actual_edited["id"] == draft_result.id + assert actual_edited["metadata"]["title"] == "A Romans Story 2" + assert not actual_edited["is_published"] + assert actual_edited["is_draft"] + assert not actual_edited["versions"]["is_latest"] # TODO: Why is this False? + assert actual_edited["versions"]["is_latest_draft"] is True + assert actual_edited["versions"]["index"] == 1 + assert actual_edited["status"] == "draft" + assert actual_edited["revision_id"] == 7 # TODO: Why is this 7? @pytest.mark.skip(reason="Not implemented") @@ -396,10 +441,11 @@ def test_record_published_update( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, + mock_send_remote_api_update_fixture, ): pass @@ -409,36 +455,481 @@ def test_record_versioning( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, + mock_send_remote_api_update_fixture, ): pass -@pytest.mark.skip(reason="Not implemented") -def test_record_file_upload( +def test_record_file_upload_api_not_enabled( running_app, db, client_with_login, - minimal_record, + minimal_record_metadata, headers, user_factory, search_clear, + minimal_draft_record_factory, + mock_send_remote_api_update_fixture, ): - pass + """Test that a user cannot upload files to a record that has files disabled.""" + app = running_app.app + u = user_factory( + email=user_data_set["user1"]["email"], + password="test", + token=True, + admin=True, + ) + user = u.user + token = u.allowed_token + identity = get_identity(user) + identity.provides.add(authenticated_user) + file_list = [{"key": "sample.pdf"}] -@pytest.mark.skip(reason="Not implemented") -def test_db(running_app, client): + with app.test_client() as client: + minimal_record_metadata["files"] = {"enabled": False} + draft_result = minimal_draft_record_factory( + identity=identity, metadata=minimal_record_metadata + ) + draft_id = draft_result.id + + # logged_in_client = client_with_login(client, user) + + headers.update({"content-type": "application/json"}) + response = client.post( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files", + data=json.dumps(file_list), + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert response.status_code == 403 + + +def test_record_file_upload_api( + running_app, + db, + client_with_login, + minimal_record_metadata, + headers, + user_factory, + search_clear, + minimal_draft_record_factory, + mock_send_remote_api_update_fixture, +): + """ + Test the record file upload API. + + Create a draft record, upload a file to it via the API, and confirm that + the file is uploaded. Check the `files` property of the draft's retrieved + metadata object. Then delete the file via the API and confirm that + it is deleted. Check the `files` property of the draft's retrieved + metadata object again to ensure that the file is no longer present. + """ + app = running_app.app + u = user_factory( + email=user_data_set["user1"]["email"], + password="test", + token=True, + admin=True, + ) + user = u.user + token = u.allowed_token + identity = get_identity(user) + identity.provides.add(authenticated_user) + + file_path = ( + Path(__file__).parent.parent.parent / "tests/helpers/sample_files/sample.pdf" + ) + file_list = [{"key": "sample.pdf"}] + + with app.test_client() as client: + minimal_record_metadata["files"] = {"enabled": True} + draft_result = minimal_draft_record_factory( + identity=identity, metadata=minimal_record_metadata + ) + draft_id = draft_result.id + + # logged_in_client = client_with_login(client, user) + + # Initialize the file upload + + headers.update({"content-type": "application/json"}) + response = client.post( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files", + data=json.dumps(file_list), + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + csrf_cookie = response.headers.get("Set-Cookie") + print("headers") + print(headers) + print("response headers") + print(response.headers) + assert response.status_code == 201 + assert response.json["enabled"] + assert response.json["default_preview"] is None + assert response.json["order"] == [] + assert len(response.json["entries"]) == 1 + non_date_entries_vals = { + k: v + for k, v in response.json["entries"][0].items() + if k not in ["updated", "created"] + } + assert non_date_entries_vals == { + "access": {"hidden": False}, + "key": "sample.pdf", + "metadata": None, + "status": "pending", + "links": { + "content": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/" + "files/sample.pdf/content" + ), + "self": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/" + "files/sample.pdf" + ), + "commit": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/" + "files/sample.pdf/commit" + ), + "iiif_api": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf" + "/full/full/0/default.png" + ), + "iiif_base": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf" + ), + "iiif_canvas": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}/canvas/" + "sample.pdf" + ), + "iiif_info": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf/" + "info.json" + ), + }, + } + assert arrow.utcnow() - arrow.get( + response.json["entries"][0]["created"] + ) < timedelta(seconds=1) + assert arrow.utcnow() - arrow.get( + response.json["entries"][0]["updated"] + ) < timedelta(seconds=1) + assert response.json["links"] == { + "self": (f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files"), + "archive": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files-archive" + ), + } + + # upload the file content + with open( + file_path, + "rb", + ) as binary_file_data: + binary_file_data.seek(0) + + headers.update({"content-type": "application/octet-stream"}) + response = client.put( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/content", + data=binary_file_data, + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert response.status_code == 200 + assert response.json["key"] == "sample.pdf" + assert arrow.utcnow() - arrow.get(response.json["updated"]) < timedelta( + seconds=1 + ) + assert arrow.utcnow() - arrow.get(response.json["created"]) < timedelta( + seconds=1 + ) + assert response.json["metadata"] is None + assert response.json["status"] == "pending" + assert response.json["links"] == { + "content": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/content" + ), + "self": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf" + ), + "commit": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/commit" + ), + "iiif_api": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf/" + "full/full/0/default.png" + ), + "iiif_base": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf" + ), + "iiif_canvas": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}/canvas/" + "sample.pdf" + ), + "iiif_info": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf/" + "info.json" + ), + } + + # calculate the md5 checksum + binary_file_data.seek(0) + md5_checksum = compute_checksum(binary_file_data, "md5", hashlib.md5()) + + # finalize the file upload + headers.update({"content-type": "application/json"}) + commit_response = client.post( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/commit", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert commit_response.status_code == 200 + + assert commit_response.json["key"] == "sample.pdf" + assert arrow.utcnow() - arrow.get(commit_response.json["updated"]) < timedelta( + seconds=1 + ) + assert arrow.utcnow() - arrow.get(commit_response.json["created"]) < timedelta( + seconds=1 + ) + assert re.match(r"^md5:[a-f0-9]{32}$", commit_response.json["checksum"]) + assert commit_response.json["mimetype"] == "application/pdf" + assert commit_response.json["size"] == 13264 + assert commit_response.json["status"] == "completed" + assert commit_response.json["metadata"] is None + assert re.match( + r"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", + commit_response.json["file_id"], + ) + assert re.match( + r"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", + commit_response.json["version_id"], + ) + assert re.match( + r"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", + commit_response.json["bucket_id"], + ) + assert commit_response.json["storage_class"] == "L" + assert commit_response.json["links"] == { + "content": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/content" + ), + "self": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/sample.pdf" + ), + "commit": ( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/" + "sample.pdf/commit" + ), + "iiif_api": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf/" + "full/full/0/default.png" + ), + "iiif_base": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf" + ), + "iiif_canvas": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}/canvas/sample.pdf" + ), + "iiif_info": ( + f"{app.config['SITE_API_URL']}/iiif/draft:{draft_id}:sample.pdf/" + "info.json" + ), + } + + # confirm the file is in the draft + draft_after_upload = records_service.read_draft( + identity=system_identity, id_=draft_id + ) + assert draft_after_upload["files"]["order"] == [] + assert draft_after_upload["files"]["enabled"] + assert draft_after_upload["files"]["count"] == 1 + assert draft_after_upload["files"]["total_bytes"] == 13264 + entries = draft_after_upload["files"]["entries"] + assert len(entries.keys()) == 1 + assert entries["sample.pdf"]["key"] == "sample.pdf" + # assert entries["sample.pdf"]["checksum"] == md5_checksum + # FIXME: these checksums are not matching + assert entries["sample.pdf"]["mimetype"] == "application/pdf" + assert entries["sample.pdf"]["size"] == 13264 + assert entries["sample.pdf"]["storage_class"] == "L" + + # delete the uploaded file from the draft + delete_response = client.delete( + f"{app.config['SITE_API_URL']}/records/{draft_id}/draft/files/sample.pdf", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert delete_response.status_code == 204 + + # confirm the file is deleted from the draft + draft_after_delete = records_service.read_draft( + identity=system_identity, id_=draft_id + ) + assert len(draft_after_delete["files"]["entries"].keys()) == 0 + assert draft_after_delete["files"]["enabled"] + assert draft_after_delete["files"]["count"] == 0 + assert draft_after_delete["files"]["total_bytes"] == 0 + + +def test_record_view_api( + running_app, + db, + minimal_record_metadata, + minimal_published_record_factory, + search_clear, + celery_worker, + build_published_record_links, + mock_send_remote_api_update_fixture, +): + """ + Test the record view API. + + Create a published record and test that its metadata is returned from the + records API endpoint. + """ + app = running_app.app + record = minimal_published_record_factory() - res = client.get("/api/records/") - assert res.json == { - "message": "The requested URL was not found on the server. If you " - "entered the URL manually please check your spelling and " - "try again.", - "status": 404, - } + with app.test_client() as client: + record_response = client.get(f"/api/records/{record.id}") + record = record_response.json + assert arrow.utcnow() - arrow.get(record["created"]) < timedelta(seconds=2) + assert arrow.utcnow() - arrow.get(record["updated"]) < timedelta(seconds=2) + assert record["access"] == { + "embargo": {"active": False, "reason": None}, + "files": "public", + "record": "public", + "status": "metadata-only", + } + assert record["files"] == { + "count": 0, + "enabled": False, + "entries": {}, + "order": [], + "total_bytes": 0, + } + assert record["deletion_status"] == { + "is_deleted": False, + "status": "P", + } + assert record["custom_fields"] == {} + assert record["media_files"] == { + "count": 0, + "enabled": False, + "entries": {}, + "order": [], + "total_bytes": 0, + } + assert ( + record["metadata"]["creators"] + == minimal_record_metadata["metadata"]["creators"] + ) + assert ( + record["metadata"]["publication_date"] + == minimal_record_metadata["metadata"]["publication_date"] + ) + assert ( + record["metadata"]["publisher"] + == minimal_record_metadata["metadata"]["publisher"] + ) + # Add title to resource type (updated by system after draft creation) + minimal_record_metadata["metadata"]["resource_type"]["title"] = {"en": "Photo"} + assert ( + record["metadata"]["resource_type"] + == minimal_record_metadata["metadata"]["resource_type"] + ) + assert not record["is_draft"] + assert record["is_published"] + assert record["links"] == build_published_record_links( + record["id"], + app.config["SITE_API_URL"], + app.config["SITE_UI_URL"], + record["parent"]["id"], + ) + assert record["parent"]["access"] == { + "owned_by": None, + "settings": { + "accept_conditions_text": None, + "allow_guest_requests": False, + "allow_user_requests": False, + "secret_link_expiration": 0, + }, + } + assert record["parent"]["communities"] == {} + assert record["parent"]["id"] == record["parent"]["id"] + assert record["parent"]["pids"] == { + "doi": { + "client": "datacite", + "identifier": record["parent"]["pids"]["doi"]["identifier"], + "provider": "datacite", + }, + } + assert record["pids"] == { + "doi": { + "client": "datacite", + "identifier": f"10.17613/{record['id']}", + "provider": "datacite", + }, + "oai": { + "identifier": f"oai:{app.config['SITE_UI_URL']}:{record['id']}", + "provider": "oai", + }, + } + assert record["revision_id"] == 3 + assert record["stats"] == { + "all_versions": { + "data_volume": 0.0, + "downloads": 0, + "unique_downloads": 0, + "unique_views": 0, + "views": 0, + }, + "this_version": { + "data_volume": 0.0, + "downloads": 0, + "unique_downloads": 0, + "unique_views": 0, + "views": 0, + }, + } + assert record["status"] == "published" + assert record["versions"] == {"index": 1, "is_latest": True} + assert record["custom_fields"] == {} - assert True + +def test_records_api_endpoint_not_found(running_app): + """ + Test that the records API endpoint returns a 404 error when the requested + record is not found. + """ + app = running_app.app + with app.test_client() as client: + response = client.get("/api/records/1234567890") + assert response.json == { + "message": "The persistent identifier does not exist.", + "status": 404, + } + + +def test_records_api_bare_endpoint(running_app): + """ + Test that the records API endpoint returns a 404 error when the requested + record is not found. + """ + app = running_app.app + with app.test_client() as client: + response = client.get("/api/records/") + assert response.json == { + "message": "The requested URL was not found on the server. If you " + "entered the URL manually please check your spelling and " + "try again.", + "status": 404, + } diff --git a/site/tests/api/test_collections.py b/site/tests/api/test_collections.py new file mode 100644 index 000000000..68b011ffc --- /dev/null +++ b/site/tests/api/test_collections.py @@ -0,0 +1,84 @@ +import pytest +import json +from invenio_access.permissions import system_identity, authenticated_user +from invenio_access.utils import get_identity + + +def test_collection_submission_by_owner( + running_app, + db, + user_factory, + client_with_login, + minimal_community_factory, + minimal_draft_record_factory, + headers, + mock_send_remote_api_update_fixture, +): + """ + Test the collection submission API. + + Create a collection that requires review, submit a record to it, and confirm that the record is submitted and the review is pending. Accept the review and confirm that the record is published. + """ + app = running_app.app + + collection_admin = user_factory() + token = collection_admin.token + admin_user = collection_admin.user + admin_id = admin_user.id + + # review policy is closed, so *all* submissions require review + # record policy is open, so submissions can be received + collection_rec = minimal_community_factory( + owner=admin_id, + access={ + "record_policy": "closed", + "review_policy": "open", + }, + ) + + draft = minimal_draft_record_factory() + + with app.test_client() as client: + + create_review_response = client.post( + f"{app.config['SITE_API_URL']}/api/records/{draft['id']}/draft/review", + headers={**headers, "Authorization": f"Bearer {token}"}, + data=json.dumps( + { + "receiver": { + "community": collection_rec["id"], + }, + "type": "community-submission", + } + ), + ) + + assert create_review_response.status_code == 200 + assert create_review_response.json == {} + + read_draft_response = client.get( + f"{app.config['SITE_API_URL']}/api/records/{draft['id']}", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + + assert read_draft_response.status_code == 200 + assert read_draft_response.json["id"] == draft["id"] + assert read_draft_response.json["access"]["review"] == { + "receiver": { + "community": collection_rec["id"], + }, + "type": "community-submission", + } + + response = client.post( + f"{app.config['SITE_API_URL']}/api/records/{draft['id']}/draft/submit-review", + headers={**headers, "Authorization": f"Bearer {token}"}, + data=json.dumps( + { + "content": "Thank you in advance for the review", + "format": "html", + } + ), + ) + + assert response.status_code == 202 diff --git a/site/tests/api/test_search_provisioning.py b/site/tests/api/test_search_provisioning.py index 9160e6907..67dd18127 100644 --- a/site/tests/api/test_search_provisioning.py +++ b/site/tests/api/test_search_provisioning.py @@ -21,7 +21,7 @@ def test_trigger_search_provisioning( db, requests_mock, monkeypatch, - minimal_record, + minimal_record_metadata, user_factory, create_records_custom_fields, celery_worker, @@ -54,13 +54,13 @@ def test_trigger_search_provisioning( service = current_rdm_records.records_service # Draft creation, no remote API operations should be prompted - draft = service.create(system_identity, minimal_record) + draft = service.create(system_identity, minimal_record_metadata) actual_draft = draft.data assert actual_draft["metadata"]["title"] == "A Romans story" assert mock_adapter.call_count == 0 # Draft edit, no remote API operations should be prompted - minimal_edited = minimal_record.copy() + minimal_edited = minimal_record_metadata.copy() minimal_edited["metadata"]["title"] = "A Romans Story 2" edited_draft = service.update_draft(system_identity, draft.id, minimal_edited) actual_edited = edited_draft.data.copy() @@ -657,7 +657,7 @@ def test_trigger_community_provisioning( def test_search_id_recording_callback( running_app, - minimal_record, + minimal_record_metadata, location, search, search_clear, @@ -679,7 +679,7 @@ def test_search_id_recording_callback( # Set up minimal record to update after search provisioning service = current_rdm_records.records_service - draft = service.create(system_identity, minimal_record) + draft = service.create(system_identity, minimal_record_metadata) read_record = service.read_draft(system_identity, draft.id) assert read_record.data["metadata"]["title"] == "A Romans story" assert read_record.data["custom_fields"].get("kcr:commons_search_recid") is None diff --git a/site/tests/api/test_stats.py b/site/tests/api/test_stats.py index 7752d9960..20f4c97d3 100644 --- a/site/tests/api/test_stats.py +++ b/site/tests/api/test_stats.py @@ -11,8 +11,8 @@ @pytest.mark.skip("Not implemented") -def test_stat_creation(running_app, db, search_clear, minimal_record): - draft = current_rdm_records_service.create(system_identity, minimal_record) +def test_stat_creation(running_app, db, search_clear, minimal_record_metadata): + draft = current_rdm_records_service.create(system_identity, minimal_record_metadata) published = current_rdm_records_service.publish(system_identity, draft["id"]) record_id = published["id"] metadata_record = published["metadata"] @@ -24,13 +24,13 @@ def test_stats_backend_processing( running_app, db, search_clear, - minimal_record, + minimal_record_metadata, user_factory, create_stats_indices, celery_worker, mock_send_remote_api_update_fixture, ): - draft = current_rdm_records_service.create(system_identity, minimal_record) + draft = current_rdm_records_service.create(system_identity, minimal_record_metadata) published = current_rdm_records_service.publish(system_identity, draft["id"]) record_id = published.id metadata_record = published.to_dict() diff --git a/site/tests/conftest.py b/site/tests/conftest.py index b850dde2d..91f2b0b42 100644 --- a/site/tests/conftest.py +++ b/site/tests/conftest.py @@ -47,7 +47,6 @@ "tests.fixtures.vocabularies.resource_types", "tests.fixtures.vocabularies.roles", "tests.fixtures.vocabularies.subjects", - "tests.helpers.sample_records.basic", ) diff --git a/site/tests/fixtures/communities.py b/site/tests/fixtures/communities.py index e73869ec8..7d162b8c6 100644 --- a/site/tests/fixtures/communities.py +++ b/site/tests/fixtures/communities.py @@ -1,12 +1,12 @@ import pytest -from invenio_access.permissions import system_identity +from invenio_access.permissions import system_identity, authenticated_user from invenio_access.utils import get_identity from invenio_accounts.proxies import current_accounts from invenio_communities.communities.records.api import Community from invenio_communities.proxies import current_communities import marshmallow as ma import traceback -from typing import Callable +from typing import Callable, Optional def group_communities_data_set(): @@ -111,55 +111,83 @@ def minimal_community_factory(app, user_factory, create_communities_custom_field for testing. That function returns the created community record. """ - def create_minimal_community(owner=None): + def create_minimal_community( + owner: Optional[int] = None, + slug: Optional[str] = None, + metadata: dict = {}, + access: dict = {}, + custom_fields: dict = {}, + members: dict = {"reader": [], "curator": [], "manager": [], "owner": []}, + ): + """ + Create a minimal community for testing. + + Allows overriding of default metadata, access, and custom fields values. + Also allows specifying the members of the community with their roles. + + If no owner is specified, a new user is created and used as the owner. + """ if owner is None: owner = user_factory().user.id + slug = slug or "my-community" + + access_data = { + "visibility": "public", + "members_visibility": "public", + "member_policy": "open", + "record_policy": "open", + "review_policy": "open", + } + access_data.update(access) + metadata_data = { + "title": "My Community", + "description": "A description", + "type": { + "id": "event", + }, + "curation_policy": "Curation policy", + "page": "Information for my community", + "website": "https://my-community.com", + "organizations": [ + { + "name": "Organization 1", + } + ], + } + metadata_data.update(metadata) + + custom_fields_data = {} + custom_fields_data.update(custom_fields) community_data = { - "access": { - "visibility": "public", - "member_policy": "open", - "record_policy": "open", - }, - "slug": "my-community", - "metadata": { - "title": "My Community", - "description": "A description", - "type": { - "id": "event", - }, - "curation_policy": "Curation policy", - "page": "Information for my community", - "website": "https://my-community.com", - "organizations": [ - { - "name": "Organization 1", - } - ], - }, - "custom_fields": { - "kcr:commons_instance": "knowledgeCommons", - "kcr:commons_group_id": "mygroup", - "kcr:commons_group_name": "My Group", - "kcr:commons_group_description": "My group description", - "kcr:commons_group_visibility": "public", - }, + "slug": slug, + "access": access_data, + "metadata": metadata_data, + "custom_fields": custom_fields_data, } - rec = current_communities.service.create( - identity=system_identity, data=community_data - ) - current_communities.service.members.add( - system_identity, - rec["id"], - data={ - "members": [{"type": "user", "id": str(owner)}], - "role": "owner", - }, + owner_identity = get_identity(current_accounts.datastore.get_user_by_id(owner)) + owner_identity.provides.add(authenticated_user) + community_rec = current_communities.service.create( + identity=owner_identity, data=community_data ) - assert rec["metadata"]["title"] == community_data["metadata"]["title"] + community_id = community_rec.id + + for m in members.keys(): + for user_id in members[m]: + current_communities.service.members.add( + system_identity, + community_rec["id"], + data={ + "members": [{"type": "user", "id": str(user_id)}], + "role": m, + }, + ) Community.index.refresh() - return rec.to_dict() + + return current_communities.service.read( + identity=system_identity, id_=community_id + ) return create_minimal_community diff --git a/site/tests/fixtures/files.py b/site/tests/fixtures/files.py new file mode 100644 index 000000000..74a1d9bc7 --- /dev/null +++ b/site/tests/fixtures/files.py @@ -0,0 +1,11 @@ +import pytest + + +@pytest.fixture(scope="function") +def build_file_links(): + def _factory(record_id, base_url, upload_url): + return { + "self": f"{base_url}/records/{record_id}/draft/files", + } + + return _factory diff --git a/site/tests/fixtures/records.py b/site/tests/fixtures/records.py index d3d3a02dc..7bc8bec80 100644 --- a/site/tests/fixtures/records.py +++ b/site/tests/fixtures/records.py @@ -1,8 +1,37 @@ import pytest +from flask_principal import Identity +from invenio_access.permissions import system_identity +from invenio_rdm_records.proxies import current_rdm_records_service as records_service +from typing import Optional + + +@pytest.fixture(scope="function") +def minimal_draft_record_factory(running_app, db, minimal_record_metadata): + def _factory( + metadata: Optional[dict] = None, identity: Optional[Identity] = None, **kwargs + ): + input_metadata = metadata or minimal_record_metadata + identity = identity or system_identity + return records_service.create(identity, input_metadata) + + return _factory + + +@pytest.fixture(scope="function") +def minimal_published_record_factory(running_app, db, minimal_record_metadata): + def _factory( + metadata: Optional[dict] = None, identity: Optional[Identity] = None, **kwargs + ): + input_metadata = metadata or minimal_record_metadata + identity = identity or system_identity + draft = records_service.create(identity, input_metadata) + return records_service.publish(identity, draft.id) + + return _factory @pytest.fixture() -def minimal_record(): +def minimal_record_metadata(): """Minimal record data as dict coming from the external world.""" return { "pids": {}, @@ -19,6 +48,7 @@ def minimal_record(): "person_or_org": { "family_name": "Brown", "given_name": "Troy", + "name": "Brown, Troy", "type": "personal", } }, @@ -33,6 +63,254 @@ def minimal_record(): # because DATACITE_ENABLED is True, this field is required "publisher": "Acme Inc", "resource_type": {"id": "image-photograph"}, - "title": "A Romans Story", + "title": "A Romans story", + }, + } + + +@pytest.fixture(scope="function") +def full_record_metadata(users): + """Full record data as dict coming from the external world.""" + return { + "pids": { + "doi": { + "identifier": "10.5281/inveniordm.1234", + "provider": "datacite", + "client": "inveniordm", + }, + "oai": { + "identifier": "oai:vvv.com:abcde-fghij", + "provider": "oai", + }, + }, + "uuid": "445aaacd-9de1-41ab-af52-25ab6cb93df7", + "version_id": "1", + "created": "2023-01-01", + "updated": "2023-01-02", + "metadata": { + "resource_type": {"id": "image-photograph"}, + "creators": [ + { + "person_or_org": { + "name": "Nielsen, Lars Holm", + "type": "personal", + "given_name": "Lars Holm", + "family_name": "Nielsen", + "identifiers": [ + { + "scheme": "orcid", + "identifier": "0000-0001-8135-3489", + } + ], + }, + "affiliations": [{"id": "cern"}, {"name": "free-text"}], + } + ], + "title": "InvenioRDM", + "additional_titles": [ + { + "title": "a research data management platform", + "type": {"id": "subtitle"}, + "lang": {"id": "eng"}, + } + ], + "publisher": "InvenioRDM", + "publication_date": "2018/2020-09", + "subjects": [ + {"id": "http://id.nlm.nih.gov/mesh/A-D000007"}, + {"subject": "custom"}, + ], + "contributors": [ + { + "person_or_org": { + "name": "Nielsen, Lars Holm", + "type": "personal", + "given_name": "Lars Holm", + "family_name": "Nielsen", + "identifiers": [ + { + "scheme": "orcid", + "identifier": "0000-0001-8135-3489", + } + ], + }, + "role": {"id": "other"}, + "affiliations": [{"id": "cern"}], + } + ], + "dates": [ + { + "date": "1939/1945", + "type": {"id": "other"}, + "description": "A date", + } + ], + "languages": [{"id": "dan"}, {"id": "eng"}], + "identifiers": [{"identifier": "1924MNRAS..84..308E", "scheme": "bibcode"}], + "related_identifiers": [ + { + "identifier": "10.1234/foo.bar", + "scheme": "doi", + "relation_type": {"id": "iscitedby"}, + "resource_type": {"id": "dataset"}, + } + ], + "sizes": ["11 pages"], + "formats": ["application/pdf"], + "version": "v1.0", + "rights": [ + { + "title": {"en": "A custom license"}, + "description": {"en": "A description"}, + "link": "https://customlicense.org/licenses/by/4.0/", + }, + {"id": "cc-by-4.0"}, + ], + "description": "

A description

with HTML tags

", + "additional_descriptions": [ + { + "description": "Bla bla bla", + "type": {"id": "methods"}, + "lang": {"id": "eng"}, + } + ], + "locations": { + "features": [ + { + "geometry": { + "type": "Point", + "coordinates": [-32.94682, -60.63932], + }, + "place": "test location place", + "description": "test location description", + "identifiers": [ + {"identifier": "12345abcde", "scheme": "wikidata"}, + {"identifier": "12345abcde", "scheme": "geonames"}, + ], + } + ] + }, + "funding": [ + { + "funder": { + "id": "00k4n6c32", + }, + "award": {"id": "00k4n6c32::755021"}, + } + ], + "references": [ + { + "reference": "Nielsen et al,..", + "identifier": "0000 0001 1456 7559", + "scheme": "isni", + } + ], + }, + "provenance": { + "created_by": {"user": users[0].id}, + "on_behalf_of": {"user": users[1].id}, }, + "access": { + "record": "public", + "files": "restricted", + "embargo": { + "active": True, + "until": "2131-01-01", + "reason": "Only for medical doctors.", + }, + }, + "files": { + "enabled": True, + "total_size": 1114324524355, + "count": 1, + "bucket": "81983514-22e5-473a-b521-24254bd5e049", + "default_preview": "big-dataset.zip", + "order": ["big-dataset.zip"], + "entries": [ + { + "checksum": "md5:234245234213421342", + "mimetype": "application/zip", + "size": 1114324524355, + "key": "big-dataset.zip", + "file_id": "445aaacd-9de1-41ab-af52-25ab6cb93df7", + "uuid": "445aaacd-9de1-41ab-af52-25ab6cb93df7", + "version_id": "1", + "created": "2023-01-01", + "updated": "2023-01-02", + "object_version_id": "1", + "metadata": {}, + "id": "445aaacd-9de1-41ab-af52-25ab6cb93df7", + } + ], + "meta": {"big-dataset.zip": {"description": "File containing the data."}}, + }, + "notes": ["Under investigation for copyright infringement."], } + + +@pytest.fixture(scope="function") +def build_draft_record_links(): + def _factory(record_id, base_url, ui_base_url): + return { + "self": f"{base_url}/records/{record_id}/draft", + "self_html": f"{ui_base_url}/uploads/{record_id}", + "self_iiif_manifest": f"{base_url}/iiif/draft:{record_id}/manifest", + "self_iiif_sequence": f"{base_url}/iiif/draft:{record_id}/sequence/default", + "files": f"{base_url}/records/{record_id}/draft/files", + "media_files": f"{base_url}/records/{record_id}/draft/media-files", + "archive": f"{base_url}/records/{record_id}/draft/files-archive", + "archive_media": ( + f"{base_url}/records/{record_id}/draft/media-files-archive" + ), + "record": f"{base_url}/records/{record_id}", + "record_html": f"{ui_base_url}/records/{record_id}", + "publish": f"{base_url}/records/{record_id}/draft/actions/publish", + "review": f"{base_url}/records/{record_id}/draft/review", + "versions": f"{base_url}/records/{record_id}/versions", + "access_links": f"{base_url}/records/{record_id}/access/links", + "access_grants": f"{base_url}/records/{record_id}/access/grants", + "access_users": f"{base_url}/records/{record_id}/access/users", + "access_groups": f"{base_url}/records/{record_id}/access/groups", + "access_request": f"{base_url}/records/{record_id}/access/request", + "access": f"{base_url}/records/{record_id}/access", + "reserve_doi": f"{base_url}/records/{record_id}/draft/pids/doi", + "communities": f"{base_url}/records/{record_id}/communities", + "communities-suggestions": ( + f"{base_url}/records/{record_id}/communities-suggestions" + ), + "requests": f"{base_url}/records/{record_id}/requests", + } + + return _factory + + +@pytest.fixture(scope="function") +def build_published_record_links(build_draft_record_links): + def _factory(record_id, base_url, ui_base_url, parent_id): + links = build_draft_record_links(record_id, base_url, ui_base_url) + links["archive"] = f"{base_url}/records/{record_id}/files-archive" + links["archive_media"] = f"{base_url}/records/{record_id}/media-files-archive" + links["doi"] = f"https://handle.stage.datacite.org/10.17613/{record_id}" + links["draft"] = f"{base_url}/records/{record_id}/draft" + links["files"] = f"{base_url}/records/{record_id}/files" + links["latest"] = f"{base_url}/records/{record_id}/versions/latest" + links["latest_html"] = f"{ui_base_url}/records/{record_id}/latest" + links["media_files"] = f"{base_url}/records/{record_id}/media-files" + del links["publish"] + del links["record"] + del links["record_html"] + links["parent"] = f"{base_url}/records/{parent_id}" + links["parent_doi"] = f"{ui_base_url}/doi/10.17613/{parent_id}" + links["parent_html"] = f"{ui_base_url}/records/{parent_id}" + del links["review"] + links["self"] = f"{base_url}/records/{record_id}" + links["self_html"] = f"{ui_base_url}/records/{record_id}" + links["self_doi"] = f"{ui_base_url}/doi/10.17613/{record_id}" + links["self_iiif_manifest"] = f"{base_url}/iiif/record:{record_id}/manifest" + links["self_iiif_sequence"] = ( + f"{base_url}/iiif/record:{record_id}/sequence/default" + ) + + return links + + return _factory diff --git a/site/tests/fixtures/users.py b/site/tests/fixtures/users.py index 462ce4af8..102070892 100644 --- a/site/tests/fixtures/users.py +++ b/site/tests/fixtures/users.py @@ -334,46 +334,9 @@ def client_with_login(requests_mock, app): def log_in_user( client, user: User, - new_remote_data: dict = {}, ): - saml_id = user.external_identifiers[0].id - token = os.getenv("COMMONS_API_TOKEN") - - # Mock remote data that's already in the user fixture. - mock_remote_data = { - "username": saml_id, - "email": user.email, - "name": user.user_profile.get("full_name", ""), - "first_name": user.user_profile.get("first_name", ""), - "last_name": user.user_profile.get("last_name", ""), - "institutional_affiliation": user.user_profile.get( - "affiliations", "" - ), # noqa: E501 - "orcid": user.user_profile.get("orcid", ""), - "preferred_language": user.user_profile.get( - "preferred_language", "" - ), # noqa: E501 - "time_zone": user.user_profile.get("time_zone", ""), - "groups": user.user_profile.get("groups", ""), - } - - # Mock adding any missing data from remote API call. - mock_remote_data.update(new_remote_data) - - # Mock the remote api call. - protocol = os.environ.get( - "INVENIO_COMMONS_API_REQUEST_PROTOCOL", "http" - ) # noqa: E501 - base_url = f"{protocol}://hcommons-dev.org/wp-json/commons/v1/users" - remote_url = f"{base_url}/{saml_id}" - mock_adapter = requests_mock.get( - remote_url, - json=mock_remote_data, - headers={"Authorization": f"Bearer {token}"}, - ) - login_user(user) login_user_via_session(client, email=user.email) - return client, mock_adapter + return client return log_in_user diff --git a/site/tests/helpers/sample_files/sample.pdf b/site/tests/helpers/sample_files/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..774c2ea70c55104973794121eae56bcad918da97 GIT binary patch literal 13264 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 literal 0 HcmV?d00001 diff --git a/site/tests/helpers/sample_records/__init__.py b/site/tests/helpers/sample_records/__init__.py index e9a6c7614..0a9d00db2 100644 --- a/site/tests/helpers/sample_records/__init__.py +++ b/site/tests/helpers/sample_records/__init__.py @@ -1,4 +1,4 @@ -from .sample583 import rec583 +from .sample_metadata_presentation_pdf import sample_metadata_presentation_pdf from .sample11451 import rec11451 from .sample16079 import rec16079 from .sample22625 import rec22625 diff --git a/site/tests/helpers/sample_records/basic.py b/site/tests/helpers/sample_records/basic.py deleted file mode 100644 index 512a1d7c3..000000000 --- a/site/tests/helpers/sample_records/basic.py +++ /dev/null @@ -1,218 +0,0 @@ -import pytest - - -@pytest.fixture(scope="function") -def minimal_record(): - """Minimal record data as dict coming from the external world.""" - return { - "pids": {}, - "access": { - "record": "public", - "files": "public", - }, - "files": { - "enabled": False, # Most tests don't care about files - }, - "metadata": { - "creators": [ - { - "person_or_org": { - "family_name": "Brown", - "given_name": "Troy", - "type": "personal", - } - }, - { - "person_or_org": { - "name": "Troy Inc.", - "type": "organizational", - }, - }, - ], - "publication_date": "2020-06-01", - # because DATACITE_ENABLED is True, this field is required - "publisher": "Acme Inc", - "resource_type": {"id": "image-photograph"}, - "title": "A Romans story", - }, - } - - -@pytest.fixture(scope="function") -def full_record(users): - """Full record data as dict coming from the external world.""" - return { - "pids": { - "doi": { - "identifier": "10.5281/inveniordm.1234", - "provider": "datacite", - "client": "inveniordm", - }, - "oai": { - "identifier": "oai:vvv.com:abcde-fghij", - "provider": "oai", - }, - }, - "uuid": "445aaacd-9de1-41ab-af52-25ab6cb93df7", - "version_id": "1", - "created": "2023-01-01", - "updated": "2023-01-02", - "metadata": { - "resource_type": {"id": "image-photograph"}, - "creators": [ - { - "person_or_org": { - "name": "Nielsen, Lars Holm", - "type": "personal", - "given_name": "Lars Holm", - "family_name": "Nielsen", - "identifiers": [ - { - "scheme": "orcid", - "identifier": "0000-0001-8135-3489", - } - ], - }, - "affiliations": [{"id": "cern"}, {"name": "free-text"}], - } - ], - "title": "InvenioRDM", - "additional_titles": [ - { - "title": "a research data management platform", - "type": {"id": "subtitle"}, - "lang": {"id": "eng"}, - } - ], - "publisher": "InvenioRDM", - "publication_date": "2018/2020-09", - "subjects": [ - {"id": "http://id.nlm.nih.gov/mesh/A-D000007"}, - {"subject": "custom"}, - ], - "contributors": [ - { - "person_or_org": { - "name": "Nielsen, Lars Holm", - "type": "personal", - "given_name": "Lars Holm", - "family_name": "Nielsen", - "identifiers": [ - { - "scheme": "orcid", - "identifier": "0000-0001-8135-3489", - } - ], - }, - "role": {"id": "other"}, - "affiliations": [{"id": "cern"}], - } - ], - "dates": [ - { - "date": "1939/1945", - "type": {"id": "other"}, - "description": "A date", - } - ], - "languages": [{"id": "dan"}, {"id": "eng"}], - "identifiers": [{"identifier": "1924MNRAS..84..308E", "scheme": "bibcode"}], - "related_identifiers": [ - { - "identifier": "10.1234/foo.bar", - "scheme": "doi", - "relation_type": {"id": "iscitedby"}, - "resource_type": {"id": "dataset"}, - } - ], - "sizes": ["11 pages"], - "formats": ["application/pdf"], - "version": "v1.0", - "rights": [ - { - "title": {"en": "A custom license"}, - "description": {"en": "A description"}, - "link": "https://customlicense.org/licenses/by/4.0/", - }, - {"id": "cc-by-4.0"}, - ], - "description": "

A description

with HTML tags

", - "additional_descriptions": [ - { - "description": "Bla bla bla", - "type": {"id": "methods"}, - "lang": {"id": "eng"}, - } - ], - "locations": { - "features": [ - { - "geometry": { - "type": "Point", - "coordinates": [-32.94682, -60.63932], - }, - "place": "test location place", - "description": "test location description", - "identifiers": [ - {"identifier": "12345abcde", "scheme": "wikidata"}, - {"identifier": "12345abcde", "scheme": "geonames"}, - ], - } - ] - }, - "funding": [ - { - "funder": { - "id": "00k4n6c32", - }, - "award": {"id": "00k4n6c32::755021"}, - } - ], - "references": [ - { - "reference": "Nielsen et al,..", - "identifier": "0000 0001 1456 7559", - "scheme": "isni", - } - ], - }, - "provenance": { - "created_by": {"user": users[0].id}, - "on_behalf_of": {"user": users[1].id}, - }, - "access": { - "record": "public", - "files": "restricted", - "embargo": { - "active": True, - "until": "2131-01-01", - "reason": "Only for medical doctors.", - }, - }, - "files": { - "enabled": True, - "total_size": 1114324524355, - "count": 1, - "bucket": "81983514-22e5-473a-b521-24254bd5e049", - "default_preview": "big-dataset.zip", - "order": ["big-dataset.zip"], - "entries": [ - { - "checksum": "md5:234245234213421342", - "mimetype": "application/zip", - "size": 1114324524355, - "key": "big-dataset.zip", - "file_id": "445aaacd-9de1-41ab-af52-25ab6cb93df7", - "uuid": "445aaacd-9de1-41ab-af52-25ab6cb93df7", - "version_id": "1", - "created": "2023-01-01", - "updated": "2023-01-02", - "object_version_id": "1", - "metadata": {}, - "id": "445aaacd-9de1-41ab-af52-25ab6cb93df7", - } - ], - "meta": {"big-dataset.zip": {"description": "File containing the data."}}, - }, - "notes": ["Under investigation for copyright infringement."], - } diff --git a/site/tests/helpers/sample_records/sample583.py b/site/tests/helpers/sample_records/sample_metadata_presentation_pdf.py similarity index 97% rename from site/tests/helpers/sample_records/sample583.py rename to site/tests/helpers/sample_records/sample_metadata_presentation_pdf.py index 4c9f1da81..d103b891a 100644 --- a/site/tests/helpers/sample_records/sample583.py +++ b/site/tests/helpers/sample_records/sample_metadata_presentation_pdf.py @@ -1,4 +1,4 @@ -rec583 = { +sample_metadata_presentation_pdf = { "input": { "created": "2016-02-29T13:11:39Z", "custom_fields": { @@ -13,9 +13,7 @@ "hclegacy:groups_for_deposit": [ { "group_identifier": "69", - "group_name": ( - "HEP Part-Time and Contingent Faculty Issues" - ), + "group_name": ("HEP Part-Time and Contingent Faculty Issues"), }, { "group_identifier": "47", @@ -69,8 +67,7 @@ "dates": "10 January 2016", "place": "Marriott Hotel, Austin, Texas", "title": ( - "131st Annual Convention of the Modern Languages " - "Association" + "131st Annual Convention of the Modern Languages " "Association" ), }, }, @@ -192,9 +189,7 @@ "id": "arr", "icon": "copyright", "props": { - "url": ( - "https://en.wikipedia.org/wiki/All_rights_reserved" - ) + "url": ("https://en.wikipedia.org/wiki/All_rights_reserved") }, "title": {"en": "All Rights Reserved"}, } @@ -247,9 +242,7 @@ "hclegacy:groups_for_deposit": [ { "group_identifier": "69", - "group_name": ( - "HEP Part-Time and Contingent Faculty " "Issues" - ), + "group_name": ("HEP Part-Time and Contingent Faculty " "Issues"), }, { "group_identifier": "47", @@ -303,8 +296,7 @@ "dates": "10 January 2016", "place": "Marriott Hotel, Austin, Texas", "title": ( - "131st Annual Convention of the Modern Languages " - "Association" + "131st Annual Convention of the Modern Languages " "Association" ), }, }, @@ -463,9 +455,7 @@ "hclegacy:groups_for_deposit": [ { "group_identifier": "69", - "group_name": ( - "HEP Part-Time and Contingent Faculty Issues" - ), + "group_name": ("HEP Part-Time and Contingent Faculty Issues"), }, { "group_identifier": "47", @@ -519,8 +509,7 @@ "dates": "10 January 2016", "place": "Marriott Hotel, Austin, Texas", "title": ( - "131st Annual Convention of the Modern Languages " - "Association" + "131st Annual Convention of the Modern Languages " "Association" ), }, }, @@ -646,9 +635,7 @@ "id": "arr", "props": { "scheme": "spdx", - "url": ( - "https://arr.org/licenses/" "all-rights-reserved" - ), + "url": ("https://arr.org/licenses/" "all-rights-reserved"), }, "title": {"en": "All Rights Reserved"}, } From 98283a3364da69b81f02252ccc9088742cc99622 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Mon, 27 Jan 2025 19:28:07 -0500 Subject: [PATCH 06/16] fix(docs): Documentation on service architecture --- docs/build/.doctrees/architecture.doctree | Bin 0 -> 123738 bytes docs/build/.doctrees/environment.pickle | Bin 1128802 -> 1304415 bytes docs/build/.doctrees/index.doctree | Bin 4364 -> 4384 bytes docs/build/_sources/architecture.md.txt | 342 ++++++++++ docs/build/_sources/index.rst.txt | 1 + docs/build/architecture.html | 769 ++++++++++++++++++++++ docs/build/genindex.html | 1 + docs/build/index.html | 6 + docs/build/objects.inv | Bin 6567 -> 6881 bytes docs/build/search.html | 1 + docs/build/searchindex.js | 2 +- docs/source/architecture.md | 348 ++++++++++ docs/source/index.rst | 1 + 13 files changed, 1470 insertions(+), 1 deletion(-) create mode 100644 docs/build/.doctrees/architecture.doctree create mode 100644 docs/build/_sources/architecture.md.txt create mode 100644 docs/build/architecture.html create mode 100644 docs/source/architecture.md diff --git a/docs/build/.doctrees/architecture.doctree b/docs/build/.doctrees/architecture.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9fb9ead6ff6dfbf9519bb447861e667412f7641e GIT binary patch literal 123738 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 literal 0 HcmV?d00001 diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle index 8f88abacdb906a59fc5e7352a5c9fbe0cc0fb34f..1e7308bfab2d033a28c8d9bf2c849f28b8b0e090 100644 GIT binary patch literal 1304415 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

`opFU+xipf_F2lB zUaQ65`>@~kzIAaLA@&|Co$)Xnqq|ajR-MqE;NOJB?NQwH{wJ}#EvtS@{pff$xqrrA z)qlaq?&`m)&u`0v|GC@!nbbQ=%T6MYpaRz?u zuC7p@E7j*Jd2xDmwftC7JyZW!qh765pJ(Co@#@+5teztu=gP-<^07`n&XT^VWUZp;t zr9PjHPmSSo)ZbUj-|OXL13n(FUV~4J`C9zgb>7w0QT*IpE#R{{A`OknZ{zZ@QN7tD zzdl>uY{qZ*te)BPM0JZiyG}l?$H(K<8|2q9DRU!!d!l-i`n(yRXlSeYU;X~$I9u2aA#f}H+FiX3p9mjzJAQxwy5~w*jFKF7iQixup?dGcn^0`o z?(!Qp-N-7TdJ^WW?EyGzw59lUcR!ls-h=4)s|O@>a1dlsZ}S5qB^Ut)~U`a>%VliDpI0T?Wo48^ZLgEet?7@(LWy5KYmdEc&YyJ za{c3#_<=R@D*3Uj`fB{BK7o%%K_B~0R9}Z*QP1o3j~~X5-PJehKTfDW9$$_xD6acv z{Qc+&5ajAvw_Owq)QRdG-i8*6AB1^*b$$!I>5iH&6Z|?aEXI z(QEv*_8QbLJi3dY=;jaUA8|?6sxL!>L$>1a`d8qa`uqj5rhCu$eXzr~#w*2otJG+> z$M0~DVG}ba7sHY=mx~>^HLj)0xEbi!Z25#szV;!hStafHFtq_-tew@t zNp&VH*3qeAr`C21wg}lRLTH!H+hY<~{%sxut~SwjcS{Pg_p(A(+o(Wu(m}AAK1qvZ zaiRaW{Gi{F0{ZBBPB$5+Sq_d&-k}9+Z}xf#Wsm&_+g~P&e(b*s-j1!SaC49KsSTww zulx%ovO6<|{>6z)oOfqfEQf}ef=dKLTuEFaGQ{C;x7tFnyLlV#(c{d|JzkXH_aaw{ zMoM@hFpw{e$!G?@G!+nX&sr4ZRuOVnQX8qxg#yPOuKJl))q}gczi^vVL+ryKFM_tt zKxYW6v)ZA<*UGfAf)D|%&YZdmsJu8lw-=`1MW~-9?zuGbyhwgEP25e?M#hQbs?$&0 zeRot^rA|xk8_ML(ARwO#NP*wQ5RYTOdbx<;m^*b?2T>-Cf&@oprJ_lA3EVkUDrM~C zEm9jaf%^#Dye9BWn!r8OM#c%`s?$&49&6=waEdw`nIq#%26uA=1<^4>Q~;pRyy~q3 zue;o9r%9_2pm|N&8k)2zY9r&Man<&u4Wj|1^Mhn|9g(4fZ=WyO;mJsUG3zZN&wgSl zn#IQn;cT-QY>3aIS$rk6F_fj?iWltPv)j?)UhRwZNOhc8ust4f-_kVnw^FzA8u~dj z^tVtOQCmRw!w<|LcB=M!z$F80tg%fFt3Y!1MCAgqCfivbf@Xu};ouEk09{*k6920p z(2(K%5|3!ctu!6nZfRApHOH-pS_d*+qypTuO3lio77a?AcvtnYmq*BCe}ApFuTSA| z5K+9FCM+9K1nTp7!x6>r>_$8RObsXlIi6Z@qruc5kaY((7H#NLG74yPjj$oO?+|{2_WW!l<~+!^-yR9 ze^<(CeY(ZcjP8L&Am1lrB4YW~MIjc+f*x2CBOK&kV6hHarw{(|GnOrTM1=txfi4LB z;fN-Hk*$t?ED^{?3hA@^Qh#|$X*o^Y-H3Kc|q}5aX;9`TzllO{q2x5|9%7|>$Ic;Dm=RzZmEh} zR=82O)%!`qP+e(P+BH|cyKBLDfiCPEP|t!ERl!QD)lmgEhw4{vjx}m9i%K0g*{>x2 zhw9m;&07lBU4Mi99+lSRiyODxcvIo}o3Foq#0Tlop#2fVM?vbg_Ezs_?@`>|XdI0n zg5R6#u8;Jz(wfvgDQvu#XaxF{N9*pV7YJ zSVUv8r_^qU(RcI4%@IufmUdN2GnHw`F_~r8xvyS1hNFi{d%^CTKaqEev#-?Y?9yE^ zeCX~D+$U5F6S`q7euZ~Q1R1-=VyW4vFU-pP?Amd_e%oo*E*#(?|)Z1f?=5#zR zM@!AE#mbRR3nUQ*MZIy$cmeL|22-yH3@^3(oD?H(p==5!JS+i(*rf{~Ep=#jq+OhjF58i9Dh)}fV`??tQGrB;wm0K5 zK)b|tTsFhJYoD>82Zz-%_4+Yl^f(&ehzZ7YL~ioYE7f*Ic-n}}kZ6TqU&Y!!FMLy> zwIHoRbo<;OJY==`Xf&gvWOP+4SSYPV9ZNx0L!=W@ME;GK3B04>jyf*@0a!TbVkqd1 zWklCotRHVZLlSC_kexgx`)R8;&B^Mze%j z2smfBnE8DqXjSHGBmNce|E9v`E!SONxZ%c|ZVo2Ne8>C@n7Mf(KQ--ypM)mYJRX7L zUX*D3x0-lxqiCiPVua>(Tz$nU-0ZI?W}*n^5r58;6^Tc=tHE#%2bhica&Mcn-y>VK zMJYOFb?tS_(2AxPpj_AzCGL){tC(m^wIQTU|T=8chGP~_8%zVA_{_Y*O>Y(D5ERU1HV^4H*LJ>hU>Q2I|AuO zxTE_-;a=)nHS~1JoJ=gR1eVE)O>HijXmxe*woZPvqxee_qW~YZb|3Umh5S zq*4-tCB-a(MPv15gUX^eW|0SsZS(a7$jXhIVrDzSk$Viu+T}q#mpiR4T%X|Yq)cW; z^volm%xtj?<^34qjEW;vXs0Jg29pq8MiSAq7{h5tLJlYM>KKr5S6^l)+^emO++aPvJ-5b}Gp2b1fq z%EK|{fRRm`up1Rq7DGLufKYazWE^!+Kvp0Gkv0Qpi@JIwc_iUwDd#P7*yLjW4pKtIKI~vn78PiVHw^Gn z+-m}*vENoYq!>6{DCyXu&2^d*94u_NQNzQ>ql~>84{R1k!^=bMnXo4bnM}sLVYJ2- zeB*#`yyi|9Yhu3*W=*P#Ul|PS$SpIQp1;jI&r$ZMTgLGODKnox53{dx_kmsaIC#OVLt(1d%#?rwG-k9h6vz>!g`~+q3E1T7rCtI^vJY}*>0=zh4>Ou(#+e)-UjScy#OpVaDAmx$NE&g zC~Vn0cJp;N+_ZVrDcrDe?1n8jZ`ph}cJgCZpK94RRHMeW3LT_)iGCbKTz$u)XZ~jR zWy1G+$tY>S{Cfn`3LB)lFd!5svg!KbWC`?#Sq>!8eC23Gq{K+VAf>)R>%x4AIixib zP>1P`{EULj<%0L2zKl#EA}}_<7{ei&oG3-8qH0$feJAaEguZd((d+6rl(xj}Y(fpo zH{{<)aUPye5rWn)Riy^zc-l4vRIklbkD*X}G7zv%|mr^f7^O~xMZ;9gxtohHFLa&zoX0<9Hc;gojwioIM+FVG~A zwhP^Gyhg(!O^+9Ye3at|oI2r^0ILU1o$#JI;T3;@QzyJWV?K4lyY@03jy&~rYG0(_7vG{EDJ-SD?bxXk-cu*M9?^Id(d*>&)CsSL zm2DD^nimE^^VA8iFrrf@ytc>BsS{otD#1`JHW%1sPMz@THZc+Z8pG5bQX9r&Vqh16HjF&7H(azeO!Ia@DiPc<}E3gK5Cs69%JME;p^6a{ z#Fq%b97VW_k~=4klJJ(S;JQ1AIF$s4K z2@)w+8kK)y=(}aa4XxB#j+d_l9u{SBq;{11TT6Ln8sACut6dt~K=XVGs-930X@8x_ zE~h{kyOv4d^B}l^P1_M(v?0uk`~_W*1+5~-d#nk01R`8XebsO!|Em#RpugHXT01XD zn?FT5eTnDtUNF}$Jq{Y_qA3_eeA44V!QLI>_&Qla32pa6@ngY-WAM_l>0XjliYVsn zyYh=X=rhAzr!&Q@p+<&^C3N0?eQV8`0o#CAS`d&~#TAaerqMl<8qT&Jg3+D9qr03M z8ESNA$lW)dHvNc3F-{HSHHwuyicxALMq-`rNi6BIO8FznAV7hBxIx@YGrpAb^Ydek zQmv%CC?U0!yWu$GSFtrN9_KeZ>hcG>x<0 z)sb%wnI$@AiX2{lm3dY$&o&@#g1QNJ};(OoMMOpYTY2d+Gwc--sT<$m9Imck^a;Ja^eRv1xZVi#-y z&fA+MLeRkd5GlWk?Gy(Ipr`X?R@!1U0V$I!+*+#3_X?83r7=A(MJuxH! z_afOq{;lD){3>cBMsi#cmK-5*As4wi(_W-|Fk8cFkzY^*Krq@^88hR9p`^?P#pVsC z!#+~oGZg0Da*rbh8$ubW`(X&+Q-)8szOm6>7|SG8`U;fL82qjcAXeVxix*2zD-gHi)~deTBViiuB9=LI_i-8atmo|Wq7gZwo>=nBeo1upH$$%U!DQGuOlN;hjl{^X zEvGMAwhi(MF}vpwB%tXBWYi`!gp4|-tY@>x4O78&XC3HFvIQ19WwqBC_2nD3Ibvwj zfgghjS&-|{*eoHeO$i$vfl2P%R;DF+%=+R6CChZ&b|oL@A;S>F6XsHgHhdKq4I3); zCn6Rg1Q)J3BbkeYAXSz=xf{KHQdKflEFpN0it~pJnYx87m$7Bz<%J?c^bZ}16!px? z-Ci^ZX&n+q63lEC*Ratwh}b)@r`wJL`m0;cAv1yl7{FaBT3#(kV52TW7RO`{D7WmD z{r=!jvT{_F$7H5Kz+cF!uCoP@qrNxii@>!{q{ZE z_KiB*_uo6}?6_~=j=g(Ey<|qx5oF9cAfrTFL%FsNqciq=ZCFYrQoaCeb_?MVE1d%P z=(hb5dY{>{wu=X^h9-21icH!ltc_SI`qE=>Z8@x8e1q0!Sii8d)Lallf4uLFEkP{j z+exh@C>OCTN9VA)+n7YMQhp?t%C7U6g)u~COZ|(%3efuRlYPO^MDUnG({9Vcp>zxj zxPH99`{q!{eiwng8wR^90#x+pfFDMOY}h9I1w(d7l^^JF#+`!8be+{UB*DYi5kfWlvQ_npw4Q$ z$J=*!>F_MdqE`gi`)MqB0roTo?7h@TM!>AP(*w3bZ4wzN?-@b#+tmBKAiA6(`UEwS z5hAN@8=_&f_3BqvK}-B9K0K-ZHThe7;cNvZqUl*Fd%NFxz=a{ShE2R!DO3#hK%>_7 z73|z4guLwN)wbU$SD@y}`7rc#QNoeR00H*X)E6^#81RY1G zOb1+8-QY*)#bK2tgetXvhP12vID!_oP2=2q6yvtnpO@e=vi?G*QG`(xcSV@$N>Vds z0{*5*#x>JGWJr9`YXvW`&=94<3nW=-2g!mxZ1s{CFGtUJMV7EI3%3bds~Umuk`7D< zMU~k>H6)K(b8ZQ7$^D?RfTwObxVcrKOx#Otrj!4&2LXo-2ZflFct zVOv8$uPKj<=n6a)5V$JeOvTdzQ)M{qw-A88yf5g^&>Bp z>{&e6E2xo-n;om}r(1OoZYMooX$Z$E?)*M=SqF=qQHv`;;N47Z=LO!g8N3^)k&NJ3 zb*BgKyjdtdIC@EdF8Z2)+e>503%KVnaJ#6HjKEoSrw49OE5tPQJ}-!_W{AqvNJfaP zy3<3n7T25934Xm~Spn${QPlsUk>mx}dWP!}Y9u3ER^930I%lqd+(51Nj=4$;!S0!d z*)IvSH`93X0&N3>_C{(XBWPCL89-BKiV5879P1^4_C6XwT3!T9gCI9G{ z6lnh`P4ri(mAoc;lqdSj)JVpOw(1@jrs!s4&=ckFQTOx0sK6L~hZ@OegR!E7OVE~I zf%lAvVBHHAV+S?H13ZTs$w&lN-D|D7hgmC?q6GD4DZC09aMe?SX+5=)7afcC`%wvJ!ql zL;Vc(BCny|z(f5sHIk9wt-Alvs(Wy?ZVj>_A;QyMWRkNOXy^rj_4m|PUSQqGV11Pu z$q1HJcY3f^o8*HGRq&XAT6WK3Y!+@}puU$UP*&aPff`iOT(T$--OLbONR4EqC97^5 zqG4n}4@qM!Z<|XF(@I3rSR6Qmq+vf_5-|LVmc>?@j=cECR-W@4sgZo-%DLhd18*o8 z@AnpA$!8`Ic}s)dP5sGh(9h*T-$RXLBy_9pyREthmoVprU~9m&%)%}Dnt*eu-MoOi zg@K!-Mlu3t)tv#ju!sEtc-S$)ofmmcz`caVloxQ%W8fC3k&M7ub*BezWvd2rzI7Me zJS33bME%bTq~|k8Z=gmpf@Ia59;87<^n0oIc|mk5L-cNHBqKyt-8MwS2+tlO+TxG4 zz!|2Mh={g?Sq2du+%6&U96YAw@JBQadCm20JlCJ1M)DEOtG3*+3n#?ZB})G(4f2cB zeqMvz#)JGkHIk8_t-3#F)jhZ*(vPEwQu79W2@`CGjhU;Ick&JLzb*G2x zd~uEJ=o@auS`2~36(I1=y>~ITfZG|ov#61b;8}I22k#;RZ+D~ZPBt1xS%pa`Ll8cP zMwb`;-N6uEMU7;H(5gE%W(ZIHIfl7tM2r0T^O>6HX9`uY3uD98u3L4!2hDLm5NhN~6h( z-u5tL8>o?tkXd!7hwMzO&~`&2Uou>w=LFSu8bw}E?PaKLqee19W!0S?sugf2C|c^5 z_lzKVhv;zdzN1xYR^}`fEVcx}_hK4ZUhwT>`0CV1 zM)<6{)5CX86@ee>#TwirE2Wy{X=}eE&>pAp;MDyHfkgzU{>AfsqAcp%09O>*QmEFBD3BRWFMr_P`>Yxd=O0e7I6~V^?P6Ey4CjG@`sDnQOREG#+R)t;4JE z3j%8cjUz8Qdx*h$4mFYyEUWJHV6BEv(p(ezEvp#8V*=_n8be+{9b%xKM~!3z%Bnj( zP)M~U(f=7H^N>J#fcl>oNH1cL4p1W*L9*&j57JrlSadLr#durtD*~)eW62A!!wlF_ zY9u3IR^90V0|80Ymk3pmW1<@o!^m%F|BSco+ zHblcXQ}l4zuujiy2ZUi-iMVW7&J7t{HU^#LGxjXTHlxI|d>S>9kCVnKY^sVlO=n5s zKc&@vDYc&$DVKSW7f~Y_N!hCVe5>xkt&nRGkgzGBN^ed>P`>e3PfbKugQ4N2%P`>Q$~gq|wappk zA%XN->VIA!RT!klsgaBzS#_reY0aGLHuuGBJ;N^utas5k@&c>MV7-GH$q1HJcY3hS znVVTq0Y>*sRv`+RUD+=Qv=7sG@&fHBgZ4pcBqL~6-RVJFEta4uq|aoyg2x2ZAJZ7} z0;nH__#T@DOOLY^;bB^dY!)mf+uke;Q+JOMT*Y(HHzUT^kVQbQ zp6FZ)>uZ&xt{=zTnUoy0K{^U67vhFdr|u%;IT9}5BPP*=6&}6rrD!lw)J=?ZL_~*z zf^;iLbby?*I_7#P;jNd@1qnA6{B*ZYN9B_5o$^+E;3U^=!DL)0c&R{}Zn2Cm!_BKT zR%wj8_3`V*ZWx!Gy7e+{leEmQ#|xXr%^*Tab;nh{T1i!*Q)#H2A+?&9DPZofKoogDe@&2H z#Lqcm(p$8GJRfzqQ=*edxG@bN1b7{io@UW>LyDP<9x}^z>SL3fB9!oW%t4}E@uGn9 z9NH;PB0I*YGt-!dy5971a(dNEg#93waWNQG4C+X@T(EDFWtqqelQfKHbnhd>*wos#~d+W>}89SId zUWPmY2S12QMUs*_%@Y68V{bA``P3R0-ga`=IH@^2yP=gajIi|td644NBB8z__6Vry z!A8d^A%(qM`4n*>tkj4H!|Ob0VzP*6fjZS}AY~Cs!?||40;fLb?hdjDRoaqOUA)!c zeC2H4vu_84^IW4PPPhxsAxTLUq<$CGur)S=wxzVn{N7Y)4_f0>Hy@v$FC3q5Zr-ef zT0*bFd8WX!u`3SpF8hg0T1AMqc_cXz@rE9&UIntxS+BD&&*OE`nW`bRlV}3aA|@f| z!hra)2Z3Y+uNJ-l@#^J;^MO$HE9vPcPg$=MeAG`a+{}(I*_&XZjj-c0WSUrC*N=#Z zuSlwIc!oP>817&c5#^q9%sqLi9{22iR9NRzm5>N}9$#Mk!vfLfA2x65o?{q9K@t0j zBBxvr-fISe_ixn6ZceBl9{>6R{?N%B&*4e@@QyIOViM<3a>GkcJbGe%wS`}2uJrsE1aoY>Rmm11a0XBtPaOFy?R6!7lx(l6K zzFN{CX<#IQyiTQue3!^JsWx79r`ka_$&q3QiSe4FBhHAvPJ!Rh+z2kW)?470jpo>h zb0?k{xEsh;iJif`Bp|HRr=T7q@|M~s2|GQseIKeh;2bC(hyUd4LLd;(BV5-Qt0QTI zk_O(fYCD!INC z8DP#8k$5R|9L|2+^TD9GntaK)#R` zV2Gq26g{RhXOFMfP#4J;u z!PpWsi?#e_al*{vVljx6)bP+E@)g38i7~Y9Y>k8Ui&$+U*bP|}-%q-BH;Zm4YJJUx z)zR1j6?2SJBp_S1GSQ@|fN*$a9yAr%70&a@kKm9)lD`!&lQyj2klr&I;9D1EfD1gp zw@@P)t@~EpZ?fth+<#&fl!3VjNd8lT=>ybCXgv%gAtH3}FvIkIY9u2}R^91gI{k zFuXO-3#R|YFr7(_WQ578J3UM*6-?IQzj;U?T}A!R3#1=pkQ{0xBS====|MWD*w$tj zx4aw1SLWsRO9E{xjVCYA9%ImMq((A=X4Rb@w3T|7%V3#@1kwws|9OG*QU+-^HIfk| ztM2q5U8q6YGqn?jy+*kcEe%NRhH8p#NtRd;#-&ocnRO5(!GV_l(% zz9!&)kj9i3a4%=zUP6sz1kS2EJ#gy`aNDL32|tQl%zJ|FEi|gUpnC;F_afY9u3UR^91gTP=oY9MxH} zGI&ft-AH4|3#ivJP}fl-8G*9uP7f58VqJCtF-y@rC#ZJQDDr};%TV1zjbwz%syjVY zxT#lfb!xadZ&@$GF9um7=z_A7b79qzX@5!xq1ldby zGT#en*hKiAIwbWUpt)-aw6Hgv_ct17ym< zSl_I*IoR3!jv#w4jV3S1-oTK(n;OXonN@ds$kr-YIx)H`y&8niFZL$g;6HqJnFUA(=1Ov648p#NhRd*JkDsWni zXsD~p<}m^F3>rgT6!m5X>S@$SMxd;^(*v~@9;(J$mo+YWLvUS3BgqS{w=i6rsF93t zS#_s}YegB}vldhLo)JX%Q1A1C=tmf$yQz_k5LtDnhiFx~SrltMQ6Zj4^*U-KBT!b|>492{s|d4hbI*JPD|$n4y_-go7hFHiaQ!qjk`XSe?(}e- z510HlJoYPf{AhQgnLXkP5O^P_apeWx+Zeo$QX?6`v+7O{-r7p7h8rqzyTR}qg6q#| zBzeL06Aag9sF93tS#@WDs}5->F-7eS&RRdS1>O)`U#F4e1=rgduD_>7GQwrmoeNwR z*AKzfWVn_eSd5L%I~cBI)JR6Sth&>~wYpNrRjlYn$A3(8^)wnoUUc=74AdpmNJgNn zy3+%-qS|RjGTViCUO>Hz zf!aZhWCY5pI}1IjV?FQ9&kfqD@&k`XAY?({&N1zTrl3P(Df zrme&CD+25ojU_L@ewqPmQ6m`vv+7O{*qM#yGy*z2Y@-!=PEfs$Mv)g(Kf_SHh8oET zl~s3os8%$hn;q{NLG;tq`@A6fS%&DH)JR5%th&=fbS6$x^~R7HRp>cE^-&r{UQoT8 zq52Rtk`XGa?(|TdH8;~p@L}Uu1lVV2EO`O;a}3z0sgaC;S#_reY?Vq}V)H5gDZ%vj zG=jWfdJn_&Rca(7Ojh0LVL~n!@tC)93LXU=e79308R4_)P7mMtI*6D=K|z!gnC$J<8&`n9 zdl8K*FYtbW!F!Mz$q1fRcY5$vHQgzM?XmXV{!@afMI*=yre9>3=BSa3Fj;k{hY2J! zEvMBgY!94k>Ln|4a$Erd?=>{8yukYagZFA`BqMlM-RZ%*h`>{^r4Xiw_XP=M2*P*L z=<JffHV11Rwkr!CM!eD)w z8p#NjRd;%@un;v^)6GU_j(M2%jv)IUjV3S1ew88n4mFYyGOOLP+bgjY5R))+ zBO$f~!FS>Pi?KWXAj7wg8p#NsRd;&$&O*T5nRaWYQHyL#`4s_nEsZ5Fdiym7Y&|uS z5iqOn^njh$LKH8zK36L)Y*WexuhQsi0`7JiQ(nM*h=IG68p#NpRd;&eR<-6_M7Xr1 zfd7#1=dFxtXXO#BUo15 z>A_m7f_0VG{x6?TC0_)cq ztRJUFGJ<8*ogS=Jh>DEp##WGL|0%)rt2BbVVEP!t^h?x8MwqO+)5Ek*g8R-DOGjb1 zsKpq!W8M>Ve@LUs3%ZXpbiYrHWQ5MDJ3Vw4&Nq>_r@3cpTS;zc7wZeKGV;QVFG2u* znZ}kEfWN^2{tY#f5kRYM8^B=#wf4vnwZJ2YgetWHqIbU=WXeJOZ^Rl8rG(Ovuo0tM zE|pa3rM6RoqbPD#_=z7RQ3XzAKR zD_)R10|-4X|J9wNcEt7>1Qb+dMQi?{-W`_>#uBgkv< zTRg%Wsga@bc&vCpG6eCW_MXu=?x7|^^phfDaxjkH;c?tejSMx8OYhjT(^(HMmDwV) zAR(`VH*FhuXvxKBv@fEL`6 zF*_>PA<~O9%)x18| z4)Xh{mntDhr`ZJFjwCfP$vadl2uV>MRs1+yTy$ee6op(Wu&}w#dgu?pPEY7%xs^jWYJxvMG{(x z5e?-GnH*m2`Vp<{W>S4A_*kHs{64R2?zGWNMj}KLAJI3)5e^j7sD!0rHlm17uxjhvnTg`Iim9(Eoo0^W_~kAS_v}B`~maPelv6MwGgY@%1CGi zwFCJv)eL!>i(6~C+GHWgHzz|=0JW%S@bwe}hl-ZtXzjz(IQD=pn)8(w5+vid1(hRIx>=Skbi@jx zbhU{PSMRUj1mE*?z=>i_bsDL#rCmwN=IC5(Nbn7#2buMk!*bzCoL&WK4#smNnZRiEX=b*g z)JW8f(|xb8;S_7F2HS09#KEk1b{m~T*?J|%D7My;rx~PC6f=lfgPs7dp1htj=Xf4r z8d^LN={wl2e@9Y%nWXNYFd=ZKjno}_*U#1T8hdn0k6AQRs5cDpMQD*cuyoj*4vM3` zB#zx?Y(wq$ta-8*tX+5aQova7`A{#m`81SFVp;tdr^QAxFwSS(E$5vur22ghF%`=I z-lr_h#=|*MM!-J*lvm9>H4?)E(8@rD z=1}oN8xMy}&J!D=TIGc9=Y-9GU-je|J1^45X~udnC{p^pRPvfH(HkPVHzd`biB?op0Vde_pSbU_ULrX`S-n(i3`^Nle$41qGw4Wjlal|Gy*a8 z7tAsKj2ej%Q{UKDchulu*oDE-l^X=8P7;L)#%{(7%vXVQ?X4S_C@6U{QOv@)v7CtHHzU77YQunIJSVc3i4`v z9-YT;g<@U*9oZ@T%u{0Y%%;9VQyS*prE}OkvD%=K#UcRh#HT_ZD-k zkYU&60*2px`WS_Qy1ZO((9cP@3O8hY1f?n!a9oZw79*| zIO^=~NJ6R&Vy7rNZ5NX=*K`Y;H*UOfgYdFVTRaB2ULJ|N3SPHxR*7%;4m?nnaUK$O zWl_f$nt6&-Oo)5VbtY?-mK?K9qWM-Y-iWTp@W$JB7v%WEA5R>ooCFWF%P1!`blfn? z$@=)FjS(jKr{9O5F-yIINGHTAsy0i#Sg0ooBs18gLbN8XPHJ;_c6%eU+ks~~%4z?a zmlWfY#A&%y2tAt{4#jD$uGp*Fu3I=Q2JV{@dYM1KX(v;2T8r!0oHo+072=-Nide4w z$8TJ|Y}w%x)f4K6=c)Py{GsjqmZxC`kI9vL-Nszair!%!5@qhsgEGC51l;-yOj>)X z5s=nA#=POBCmubqzS_dCGuL`*_4?{d_)YhMJ^Qxryu(>9XI-yp=Wi5&=L1Qda z^C6lYX7xqJ_(dLLks67SNbecgy-p7~BwqBno@aAccr>Pz{@m(Js*JkOx%C5Mi}8*I zV|)-*CbJ`rCjOfaS$tybMd2F>&1P`{o{7f6UaUpX?~xNNrlwG>;IJ&z*lpFa$F%7OMJDp z&}zH0B9O5IF?GQ8Vd55fbfhs^#XjcwW9kp@eWyz&G*Byq0))MiljPH{);h0wuT+ zLfiS^F%7x9bVFVZKWDY_(oX-zVOK0u#qeJz6#X==_j|lufG%9z_JS`$XZLxQ!|Zu+3G=p_>#=< zdv(*#6BVNl!j@|x4T+hC3yLiO9X#;b4D?^8_)t&>o^Vj zEGhMBys!Q-S{UvQY*i|7Rv{IM_23Wzs#eB;a>{AEe8V;O9V^%mlWwsvZvT;y0j>bnzN6a`P=h$yD zI{uRgGv<%yCXv^oYyFobwVc42dvW7H>;HQuY#!dAT0eg)wB{n91nT`DTK|Tn8*+ly zKln(8SKA4Z;lEB?@VQHeT>o?b!9iRbViv4j(;FK4uB98geI%ARP+Lw9r94|pwx2BO zz9v~a4atGidmO7b1eO`Xo?mL(>swcz|-##RP_R<`J z^M(Jzxc)db5~C7VZIu|Y`sNzVwpNPecz7Byym2P0BSRt#wR5MkK4XM*(CaCZ3#yS3W5IcKi45SpV?pB_hLkve>B#%9{HHP77>&qFG= zG37t`ZTm3_Hij2btiMQ#_4gz4ECk+1)YwZS?O}8$g{((8T5P|P)N+C}=(X4aHT|2s z*m!t@s_Fc#UZ4!8rvL8J4LLzgAAF?4>)AvV!+)KKK-CYHm70t>sotk$EJ_?rPW$mH*wzY@`bQ*ZV;0OF? z?A*V5Cr_Y$L^F8yp~bMQ{S$MxHPlFq8nLdo8i9d?<+!aYR9f|l4!NL>YBKPrw6K=} zMWp?!dr13}2@rFD%V}zRiJu;_mbh<^azwdTCAFMMCjT>2E)Q=|natnn19R0cwGeb z7pLGBSkbhCHk5Z1P9$+tNx35iRfKC$`W8+;brfain%UyQHD(|SauX`t3(u-ifpMs! zVmI#dQu{cB!#jvrgP;cnM-o@wEv1}nVaSfrmtuL!J9FCADnreq3(0(9?c@_p(q2Qy(@)Dwc^ zi#ft^2<_|Z0s}3T*^|oW1_jZM+`b(A(E?GP5QzVrBZx!to3SBTH}#uYScw1HI@wUV zr8W7s9JlN4o(nvCo+zzD0ZU!!cami35?OSmyPA-->&q@K*OlZT#&W<~7ky6{U;LuQ zFb{o~WzhxHNK{wq{%Nx5L-jw9+9vw7uRF-y*=b-fRxFKgP(iE1Dv7vf*{)1d8le(Z ziV4rsgxekgf})X46_4S9w%C}Ui;jxts*6z7I@&cd$8~CD2SLpw@FWf$bs%kA?lv3) zr&cXn4LN!ehsewSS%iLQ8Aa5XGXxsuCi)SP%xF@5nbeo>G0AYJjruZq5~hvD%H0TI zXS0c+SdcYVdwJM(ch8l1DFhT6@djNd1(*x;V?ovu&A@^NIn3UZfo9&kZyB~y_-Eh$ z3-)IJ&BSvrwHCu~KAyZ7m+nY=Fy<9=O#Gpz>S&lx9i~|et+fcB8sy~4O{y&umpbkA znTx6)f{U{DisvpHE@j)uxKwCh_Cgny^uHP!VlnA*t+lwA zQ}_p0k@n6eIc&GwjlAw{HM6Ws8LVcj?$lvWSkC!RiT%GmMY&iBQYGe<)QAIyUaC@u_;UkR5W9f^5Qo5 z8lQ=ltwL7A?llW_3uy{xV7QVh_qkJIY?8~Ru#6e)a6(1HHpqDKF3+{Pz})8-Xapgc zBHZUZyX&SM9sDf%nx^A}N$sSVj$kvkil>7IWBAg&-UdGxh|{9C98<%9sV9Wd?=2lh zHt%L6Lu6s|yPctRCp2;YkmJM!yyi?M z?!Ti(VtCD4t%W{eFW4}zQO0BJ<01@4*vXzbgtgJNIZ?AUvJus%lrZtE*M1#Mi4w*f zsWH`zocQW9O<;f`I!I$jV7XhpFkX%c zw8&qc5cyxQbV%BKD{){pZyAbjS(9q7M7!>;0xiO~1h;tOtG%GjNYTbaWjxhH%JlAsmHjV6e#4DsU$_(LSCQQi>1gzI>M2}a zx6E`~rBoXu=yJ2e8fGPv%%&X)@C7nj&3)(Lvddm7&Z)O3h- zq)_C7@tw=#J3x)Z$htoZGW?m@HpzBHfZe%m{{cj(MAp+r4cAtK= zypG92)E9{2{%xVbIOiL(}az%$lLeM`+ z9935_4aM${$t(CpCDpYg?*d7WOchIRyEP&QTeuu9hYPd9OkKEF$U12wdW9??c_BJr z4cA(n;_PH)x+9lkyd0e#X*e@TACHo_EUs3np%_yv&|J+Mqq@!_88=EvYE2z0L$ABG z>mcQ8t-KxKXgkfCzfP_8RAwk7*+d5=oa0Pq7O`Kk;LF8HM2@Nzks@24brhWmE!!r% z#$;F{($^8xEdc0MUUX&_=4PNQ8?{#rM?s|=HDo|ixLHDCs;y3C%*Dx|qz!FMnbqMf z_7CSZQD1uOZF;J{^w>|Fl*wW~@yew29N`l&f`(ixV&2mldtFjXnK;J<%sF^ChI7n$ z`uj<)NkkEX`(xG`cw8lWavV=gpxveuACeLSHjM*ZZ2xGpMGed=< z7j8^=W2a5-o};)=q1~910NEovqvw0Dnb&}iDduB2&Tf#{@IqcIAE8Euy8`URFnO(? z!pf@q*Q~m$0|U2C12^q9aAR|Brc$!7yU1V{l!(ChXViL#YErP80KSVDzCWQxGQwxo zogTjPG<-;Ujq9&)w6M^-(4glRh=BJGG_JhByO_cIJ8C2&cvjt+!4vcSv|Dc`g69{A zfOq;287a=H zJ3VNgn3#3lHdIy%HeXD5uOq;1q%q~SR4-%T3e-qO;H@%S z5pA!Ch#}K;>DZ_<4~=#PZ>Fc+7A~N~_jVH22bC$O2;)an`sw?Ta-Vd~@(fO;V$&#! z6%{U^NFSl&ZQr|n|J`CF63cM_2aHJ6vZ{XTxHg^oBd(QNGn@5*&Hlx+e(cE^c;5ZI zo`^TJLLvzq&X5T+ebc*T{fIV^Kay16Fxvs03&$~cfp{JQ+K6UhcqXq*9-OgId`sUL z{~twCG)D|eXwHY>E*?(_6lV+jzC1-DYwq_JiwResa4eu~Nv+CkrB-YrV|}cRlTQqk zr4#Hxjv6N5+dY7FQ(|?h;@%3DD`sky`{qvNVA;W841oXMl?wU529?q^RUs> z3yx#)KkojxE;fE_OC+a^dr~lCCh>u!MIA9*o^Csf%L5|54<*$#41@59FF4e2c;R!0 z&BDKS2rA%CbA6!|69HhAM?K6a{ig)QrJwx}nS_D1}>;f9+d&1wZe+Lc=t&6ax{(zWT` zNspBFI~lCvP#0Ba53hN24H3a9oC5;O8)v<$^u>pZu&7#-!$|S&>RPcr-6>AHC%R`; zk^ksKb;Sy-%$4}?B>XD;YOYtPo$FPn>(=bmWpkUZe?(d^iz{;9z%McuD$?5%%kss^ z;A`Y3HSn`njQie4$~&hr*}+1!Jdg(d7V*1{Ir6)}FX=kwcLiz$>)J9RbUzUI?1)4T zg)A253hbtJat8@e5dr|&a2MoKCFQ1aCK59-8E*(wDXk<_s#8}5>VbFZb0QR`I^vpp zPmcX(HRAaMT`%>rN1!ay#Cnt?%D6MBs?>DT9Y+wDDVl*aE{(R9gHf+BhLb zZwRAvboE`xFTW4zD`0B#uGGv;Sz`|(%|Phf2-$; z1V?U@Daz#b5#Jw~^#04(-*cN4s*}puSE+aA)+MH_xum&|Z2WqxIHI#2<%sHzC$*eu zW!}UqlZR(k<|W?Bw6RYM%?dSVq?C2NXEfy3EZvapg~q_-wa_f|BMa?`b+kk9ePJS^ z^izkf6k&9D%>hf0!hKQJ6_O>-7MlxBtx`V<;n|*d#ShQV9qA>s)aETu4v#rIrp1iHA5Bu-`@wQ(ZWfDCzDv%%Dm!TGzY1Ux!wc%)(22l-I0}G>yE)jo|tLynDF=n zbv3klQ}E8f!2LYNBhqJke?JoJ?@3$5CM?)OV_R>8BJciX?;aGBzvSPD7K5^n3#qEs zK3NqE>XpLPa>EUF%2FV-p_e~3Z?&o{^Zky_D4l{VNKKl;Xz+2mXx23Fosl7*!^myaZk_fw2p<=G7s5?=G z##8|Z*e-I`!_BJFXqIOSI_6=-kYH+XxCYtQN)6CVzTa~u!TON++0a^j0(p5nm`CB=1%EQkb~MWHW+WBMtz;BST1AB6S@sj(s){55S2+ZFvX{fUZ|;{eq`+SzNe5z zbETPLz0#UhClQFMsW(+M+>B76yUa!jzRiUiJo;+Rg#NxaQ{Ejbp)_gLQ|wHiRHcZ? z2@*ssu&K&%qrtW3ktn<}HH8y>D0?bw<{a*@w0!fq=X>zKmliFRWjG^VtQjtwNU;1z z_H$FYoXP4{pG3oqjQaldV5VI z*qeNN)Pdnv)m%q7xTgE!PNhj9Xe03&(LJWGgJ}?Aw8bHrIeIgQHC&N`tj37bCG4uZdrJ$QNDosZW|2OWYLO0vAFo($J~YP2ie0VjLV(@E&VNkU zwP;wOdNZxvfv~$ccI}Q0IPOfV)au_u1VYADYSnG8(qa1D!;{$J1rhl@c<_a@AoR8t zE66D=2f}3L;a5aAKSq#cqnlu3aX+uQAE8E~8;kB02NvdVhk0U;^8GzD372HISReH~ ziVshi;dpBGN?n{O?B}SF&`2Vx=_Luxm{zn=G_e%n_kpBVQ>?pyXB}kxcxcfC8bfJ} zR^5H)=6)5`S8unJj)xomqU04P8=|Mx7eoUTof+5ATwLR;9CMv*$UUV`sNim1?vzZ7 zlwgnL3k?nSVl_f@_1ihlRbbY9i07&=o`KDk)@bmU`uv$i>GO;F^w~1Sc7Ir#H(@gk zSPYwC72|Qm#j4%xxPi0N2ws%kR;gK;6Cw~>s-ma4B5b-iD``1y85R^1l8|XgUdfGu zR%5C?kG;m2Htj{so=?X9=~>h!#=pTNF20HJuxDblDbSWwT@eR`Vx^!Zg>6SkX%!|GX9+!iIH3vd6H|J1YJ9%Z@>&Dug)wE zY)YZZ8J)BF9U-(XsfA3kX@(KvVPup|R^5Hk|9n(76>(^b?F!_Pq9yT$n#Iv8Tq1GH z35MiG?HIU?C!N&MD%cX6d}ITJgJ3Q4@C#cwBwbEHZdJ?kCPIi$RqCkGFgduKnc8AH zAV(YUTH zgx)j9%iUsP&Cb0~(3c4ATbywIo5wrIOPB-)rK%DxhJTankbI5y+Gl8ZefwuekNWgTIW^)7(1_#*3J zPh{CM84+0`0pMw&L`1<85w`4#lM?-en8o5V2(fiah|Lt|po1Jyp%9r>$GoQ%^RXPM zFA!mmG4*|f8p%h5{Q=dPj|ltIq&hQ+u$M6y-0_Se%&NN|&<9UHO=642Nijt`W_tzC z4LKpv96cH)AAIKe1_vl?-C@ z0=@Ucz218J2<+c=?95qk#+D$_`Ak4weSA4S-n&Dtg6>xSQxM-moLU&@Lh6d|OMRV1jcPc;B7L@Xtm9!F zOEX_1%>C1Fby-jt8tibweDG5eBNR)x4_rs+JuuMXBsiaDu-=XSGS0aW9#AJ^hW~8? zdkjf9AeoY*D%;X^L(`Ey3GZM^7TjlgV-)d)UJ}*S@bon+c)I61_J%>$9N6AjvC2F|9d;t8DcmY^uM1?sxt*Q z4V<;!#$a&AGwOd<-F<=n(U2q#S^u>)0$fCF`VwP6j-9Pr$@0o*Peu*X`Vtbkxb-sl zk-io!YLX~m!jIH_=GH#;H(jWQ+B7}=fa{U{DRiWKjlbsfslDO)7&?x zk$i;Ae^Z_L2$@x-{46ekka-V-!5z;iWURXT0{xzNA>+c)SM9^W_%-=Bo~e89%pIf7 z9eZagNP)F$+o(9bhP z^_}(M#L$LC>GS*h^w}0ePY;P9O_CyjK#tM#| zqGH#!7zuOiegec|w;2S;IZA+3kmGU=0dy=OV!tFx-S=Bl!rD392(6 zK{At6XQtiC2N?|Rct$~D)!h&1gVV9rYT1YsOR!_i!afWmhet-a%ZpK|JP;N-qH_bS zH*qH+5M{+?yMnBTZQpz>wrGD#Bqbtk?kmUJB+%JZ+%)*pm?^MezZpqq%;2xm^Yq`eh|nz(MEJd%&Ji_##6}4d<=y=TgP9Lv^pd9iI^~{bW|1do|xh*l3L2d2R_7nfQRGRfV(Rc zX{8`Yp0Iec}-mNUI;M_G1*kw9dXVC@0bI>lf32$oTIy8;6|Bjej#ZR zqw6KoStglv(f33yA53Z~(|Y*`uNNLpul2$uL$neZ_|s&)#LosJ(5oOp@q0@LMZ(HS zL?hG6u_mYQ%6Tpmu}E~B0>E;K^A~;UJLsjHOf}J5{Y{Q@73}hUoyoQ@GQ;iizOg8M z{&=50+q=9Q!n-_QUzDBRy|72XpKcb{zr-QoUfeW=t3U_YG9#A8w3X;N)Tdkj2{;yi zXZRc5&d{Dqdj)l6t5paT=t$T#dn?v&hiL7iGVBl$EV{W>-R_m3_3h=$mK{E!Pv_|k zt&dB}`PtQiz2WaLtzAfs^F^oC>Odlse7f6%AT zHXC0bV&mSd3J>4!LNu419TE!w0R$q9d+@J?S@mHIdGT5GA9}3Xp05b27PeO~4AHjY z5l`&Lq%DS)fk|H~OxjE5dn9~8ix*RJF_pqe<-QW zOziv57!2-sM)qyh-52Q3M%lL*TqIPcVbx)hiZ$+ewC5!>QNcD#dHOAYub4_zIFi<= zg!yb?^Q(@r)Sr!#i)D!$(fZViN&owGkhE~$l_RYN0`0R*t9|KdIDz(oMd|Zj_UW@N z&~}9cS{xr0>E`cEwt1(aUNnjz)mWuiZ$+hE&UJ@HQgO1!in%JHj(q&YZQ;< z^b6+UQs|L*Z?GJE%8r7T-f}lT14AI_zRc9tmm-D}bn6zS&tK`&XIs$S8WMEG`$WRs zBid6NfgkoZ+%|IR?88X}a(0v!MxD(YH(wVOZJBEe3$rT#(BccTuX@7Fp52HrQ&$c> zh!R}?VkAUA@ny014B|`qy3chcYp|E91EEf{#%n#c1g)d3Inrbx!oJQlc_TFvBf>7^ zfHThe`}W=I=Vj;>NAzy0IUhl`H>u7{g6ta%33nWj$TgnsN^j&eMO-vAMw?)VI={5~ z({G9nUVVDfJ%7xV*(HXEF?N&4lF(f7y9P%(*QleeZAx~Ro*#y~g;P;S zLFyvTm?NGTuFj0COo=g~S8k7}TRTOk3Xk48oF7GIA}%++foqnHPOa?d?#wjst5hL< z5_vAatMRpFAcw85o1uh{b*Tog*I|IJQSK=7DCWxO^<_+3S-?^8WKlE&iF?RXyij6p$&ymne4&U>{ad<2kEa7qD z4+9f}yIa<+2$X`9(eMo+s&h{qBR~J-Qd@$pa&VeLT}=bDLfxiHZmKfoS$voP?bFAp z@ufnZkV%`{wSHW*@!bYRCzwS2OlrB7ZR~6k_0gWx`Oy}2)+bTdg(p$c0;g%zWW7FJ zTQ@Q?Gcz;nnk2)B@)`*N-N>2?E?j%j#nBm+S<o-z< zzby)hnQ(QH;q#}0W=J7MLgTz3h}Mx2k0sIU!p!=o#h#h3o{B#>LL~9V{5T#Bil*j79NoC=Mg*blU?7(tePs;XGPdtG=AynWI zm&~{P;itrvB*iX8vl=R*rq~B-CL+*QcyD4O&ES z(`-7tYlTJ-X8EC4aYCkAJ#hDpz_{b^DL*CeZbeDNf^$WE!_S>$zoQRY!zWm#w?|Hk zPE8Vo2&BY>kqdN*xi3WStfZ1M0nNfilgAf7yb02L?;>1ebG-TdG9_8srUdzH2u*b} zsUxSJR-u+-pfl6^a)V3^rVEQC6C-ujP46p1rgyw$Mi%%@{^kjC81AT4;rXjXjqR+& z!shj6u&4Lt_2NZJ*mOSWa?>P>G#4-kCp-H)MnIkLiX~CnAUV!>D;DP8i`BJF0x>$Fl4z-%K?6#?RPqnDHxBlQuq4$Gau;2v& z-C-jL`3SC-e&)Gs!TtLU%0-~qpC;v^CHFf6qqp{?&PTPVvkpe#jVQiED9uGERIE&v zhjE0^)gdQP6ok4Z5(b~Y06TgQK1aLYqxYpgN|kTNXGo3(KY}{3`o0z1XsS2^+?+rm z(|#Rs6erSoBjQ#1b&?(u*RBxG`^7tGfFWq3C{_T=JqS-rtl3C6mUcuGVl(QhX|XCD^=P? zFig=uNU2c3kJyDw=jQpi<<2}m_vGP*oSptWNsuFh<9t8OLu)Qd_0rLsLg)M@sdkx$ z*{O1vNfvmv+%iuPM1|zDAzh+_Lq{f@R-u+-voj;&*oj_vqMk097^$;vM1&Lc`vcy` zBeo-8LqzR{4&Do!3TL9xy*Cw3cTEMo^|~}P31M@7vvJO;3&Z+KP!bZiG8i-%&0sL_ zEIBld4kciaqdM(DF=nnXD1U+BaJH1c%S0h&42Ne6nxVlS(T(lTPPZq~%%suImCTS8 z&uBPkv|BRzd+|^i5-HBc=VkQ(e!Brzo<~_`LE><&fx$x{>CvA$-SndwECL z*F5CbB9x;x#T~BO2M_jjqb1~zCy8K0tYaL`9XX`SNhM_x_CYD^vN;}nU!)w;o%X6w zT#|BV{OjtyBe2)1-*P;42KFyE$nwC;u}ZQ$QfD3P*M{8Jp@AR55(517i12(C);%lL z{ZZWSjzri5m;)<%Zvvd}ngBXabQw{u>JT%KA<@%;5vM^Kwze__G+@kN3LHtk0}6`W z1#_j~)Fl2#?uxPVUW0NNfc_dOhwm1J#DKo%qTV)2JC@wT(1)=6NO3Oh9g6-jQAS7! zM6~4z@uf(vB|RjV_o<{ZGwIC>CG%v%G8zdQ?Uo($>Ug{i?J`p$heRy6qn;L}%#08BlIajRuJgIiQ}NbzK9h6d%o%m%867CuHNB24y2q@E1wh zXxV?Afzl6pQs+xs)L93mmxe$oq}6~#>V}1X14$lLm%X(2MlXds#^yy?wKi!8HT?%w3U8A^lOMFlhb)UDbQgyvzknUCtt) zNg$J>&dRwEq)(V5DAWobH3-Q7j|qt)g@v5(j2O{JO`7x11WMsL^i4{hg~~BPeYP=SR~n zD0XSXVB|Eq7NybkcWdd+_M6J3!X66wiciez&UJAc5tU4cj>Ds9Fo0}(=?1Z#+nK`Q zdXv174AETUIF})Z7_uqXuySKB-Au!(F0z_5>9;X;$Dwx|ET-bo#wth!s-iMetM9|L z>zsd1)R@S~IXPiomn41>6EG%mu22Ut_l2NelT=bBLBCcCx@?X&VScwaVLlK<*!b%`14Rs*Yerw7> zk{Z&STE26shY*_T5_1!v4_nB3Q<$K0Z7IJ5mI-6in`60h58t++B<4L}G8tLvIed% z@LmkUMQc-o@Mz%nh!epuZ6!@A{`!kxUhlmD*SX#Ror}5+!=S@!=iXE(M>Cj+_dEf2 zT6qSv8FL2DzX*8u2tREt+;JfX&#CZR|2IV{O z9&DHL{R2@*jQ5}vnu5WMgNP#@3nu_$ZAZ=jDBucnS!h2ih_*_Y#FDg=Er(dMF;bUU zFLo`d0@8!+^QV7`ZSz~S;Qg-!TTJPe9W8j@uJzq~$8BfcVpqwQCF>jA!jpeauY$Nb zKJDHvAr0GvQ>G;Jp_zA~jPSfdC0BK(V7uq+=|T?H@ZJJ%o2>3ecU1Qlkok0G5>b41 zOga~TizbJNui_YSSQD!(+Wh6zy;JN-75d%jn!YQ7T1x}r&_aTrEZ+KU@p!Hyj;y0r{HJ7 zk@F35BuHn|7DtYYm1|Ku$;yzf&{3|VnYvcHrGf<+?J|wFjsbeTo9B?P-bFpQ>k0Ls zK!AEV1$sGFKM}NU8}?e^w}x36@OxzpemAD`tRmA8yo2|IZ0r!-7LtuF#&Uq+&y{2O zIiipl3}315=h}SZHtW)hSFf?C<@EvjS2vfv#1uWoL%1qHstXdXi62y#>#^y^j#Zdy)Rnu{vLw@5={1PmjV*u{lRLGy)KE{@djCo$Fmq@$)xAc zAbVR9H!>-wT~hXBLp|k`(IAsVLmDfRRWPu;gfBDrS&YUH8stb|khR5;HVm@FR%g=F zTJ2sdSdh^m(`f5@NUwL3EGyk0b2WOpN!EcK)5<8*j1b)@i`4moJ!70YCpU)Zn#z>2 z8EZN3R~!`SAoYIThDl<(HzOA1TK8#7(NNRgnlRlE66mD;oo4}s?lq9rof9lY{S!3WY= zL>(I>K~e;*4coSFA}iFUG_jnc$ve~7k3*of3OE;-7!_7_X84Waxz{gTfMrPhb9I($ zwZ<%eJu2E6VrIlu8L!e>BQnZ`9@44qgm2WLAZl^|JCJHe_LRXJPGPJ`yf!Z8z&9c3V z@>x)@^)pE=TU+T{5R)BxE?9R8p5E;5{8u5`^!Qy|Ty&ka-z%$RQZ3xxj_&RK!tIp1 zaI4Fvj^9le5j|_(>uzKkBqXKSQQ8f~NU8^TcL1iXEO-qGGgt;^CRhf6+LM^o#`8j> z>@zqz1503^9GwkONQ@=WMXr^X3z}(=-@e!P)k!onf%qMg8M5LTL0qHVlF@(H3dE75 zBm}AR4d$}+mVkc1w?+)bKQSnM0l2?VN?%I}=?vW8*ONN`UW+>G;J!u&_dq)m0B`V3 zM1|RrxTY@N4@2O`!GzvJ;EP-c)O#=jfi46@ATVG`#E;bmYP5npP332Ryun1sLq6?# z-ErdQ!tK8%M%_0JN^k&xFOw4dPoj_*06fy23R8ISgj3z^fqL4y=MMzYGz47clJ%&n z>5%`c;Kz@XsAj^zdnG?))iYwCM!O}iKivugIdMA)8bbQnRP?s?lD98zR_o7L$u-Ec zR(&SQE1~dER?3Ki;)9l}doc+nf(VyF>>AFTE8#q>D#~+eOwZl*l7@)!W(15zGa%1mc~SnWxj-`JwgIv{#Up*@G-I-xab zmN-HJK2ooY(4FDw{CG4|RJTOJ5P3J)(R+ye0~aFozKlSmix3frBqrp1P|;nb?cqu* zXw*O<12mqI2948&yhO#8Pm3}4CWG=D0ODJu{Jv2XVg?Z3DQKDj#J^0UnF$d8STaLa zJR=}#v|BRzORWGgeScBE1LKpgd1A1B%AkA(0Qoj4pDksmGl2X`PwM>k7IoGE(#w7< z0TQ~CuyJy1UDElQ9lRHY!H3c4-oxNKTo}}QECPcrB*eoY0f>%(Eit4O_-O!;0sPKS z06(~y_7*CQT510-f0LX9!j9e)!_O%#an&2#Ol*mW=*vOHlM>4NlBakXAZs!ykhPoj2-;d!n>i40)y zeNrM@N=;`lxV9&Cet(NP>oBQG z$&W~hzEu=r1|;_gnr3E>wIrIEK=N-SGi1dxf}}>fC8Hm036g<~StMhv9jNhZi3pXQ zbV}1$ovb_6sR9zj%AJ+9N~4Mm5nKfFlF>~Seaq{LyPhNjYyR zi=9F5>w8k?ziUxv9eOW`KyNT!c9Ad>>^>W^UB*&5GWr()(NQ05*Hpql{5CM8_dxs! z7l`%Vi~z9t)~M>;_7zDVny+iEywxrst7FPrB9#b?~1C#XNxL&q**Z7P0oI>) z!CLQIUGpUFKvC?UN;}D~LlOa2~u+cCD7WICH|Ie<`p!ct?`I$dl4X@Q**cZQR%Aw;$ zYm{Af1MvM+oB5>d@{94*f2v zgiL7qW62@ejErci(Qe88U$ydRLjZAR$Q|tI!SPpVDW23xS4wb^<;ifmr&bvvc=l`a z$yz+6=VN$L-})pr)>_)zT7Ia<406Fcm*@cDgOK-Q%jUdq0b2i5%6m(h>`9$} z-lEPrTCdm9I#GoKwQn1+tB8~=+XFa%XR2h!9JphEUKqtkz@*-z_@ge0>pdJnaTmBE z%i2EEau~13!5ZM6?lA8h`dXp7hFcj>eW)d>+vC_RQed4b!KkxW#n^qe!Eq3v`G3oC z@Jvxi44QW_4c;keronjof!Vv0Xl4TL$0ajl#WMo8M!O}Wf7uCSA#5fja!HPDf!}tW zQIvD|!$X~xt?`MQH2>N>6EyhlS2l>DUpFZ20c`(PN_$I*>JX7bA7nVf&h7*bWUCnrPot##VToFIMN%Rd-aX6(lZ=&bUnw3vIwE}Dnnlb?PSuFuu-$>ln8)A&U%b>gm@VrdQ`=5zI%)s+U z1WhyW{K+Jmnc(?Q$qZTXjPR_{ZprB1v_dA|ON|odP`){Fd9|6`sL5~KT@7eWbq&7j-|Kz*2$`@6%l1)%z?0ye{CR0B_7z<+f0& z70hZ7lL2N25@5DosoSMpdkfBt=HG7T1u?!3ubA^+1t5Ezl+{B;Au%A^O-jd81kp5< z^^-S>EP(#6f*%7(R5Ri136dYO>KSoXquq+vJ5OjMxQpe>%jAf;EK6GAS}>9{77!E! z&vDwEHxYN;BMY`{P^aBBYW4)3X=vALmOU|1#kmOT!~zODn!o*7Pw^=^o2D2s7aJTg z0YaZ7M@%cJ?l9^*s33Nir$+q7LWAk=2xcAt6s*BBfZ$+@# zg{cTOGXru8*L44NJJ8k&nKfL>fXwHnB6A*-h*HJY4-aeiB{9CH49aSN&}T|nEs8=6 zA@rSss40YgNfOme2z{31hpc)=gw|-c;`Po`xAhyql zhy%M_$ZLh%8eZwh9jWh$lVdrRl}4Uf8mS;2^v+&WknSE#iU;q=(-uozD-q{|_=Y*|=br2Z_%pRL6ud|k@d zWpv|^;&S@4qx3-D>n^2u$p z#S7`TwRE`%m-~tr)5l?Y<`R6GEndpk%Wy?O>-fv%xE4>RN3P)S&%pJ*;+6dQO|WdX z!n(W)-?kR7#uel18vH?5HjhO7S$?e2DA#lJ37)NMamVfF8VEKQU$}PlMKb(D{S;Q5 z|IvoxjFuHY+HXb$+~v{6X!Gcxg2*J(s5>!LJY>x!vV!zOxO%^7r+P6ZwNb%FaUzkG z{};u^HsHT;qfy+$FBYfN9~#-{7#i(%tyob+l?LEJ{|&rT{2E=BJrkG3bos`$^c!7% zN0-Ox^3QbR>vZ`?x_pr?FQLobbom@zK0}vh+``gUBNL6_^Fi_5d= zvT`Rb=hCH4mlx3G%XIkyT@Is1meXYuU9O?a@7;#WopkvPef>3E-gql6ug9giXri2- z+gjX9_iJ>SeI70^r^``vIf5>m>2fVyE~VOBM3?W;*GK5Gn!e`f@}IkK`5|3a(d9h4 ze3vc{)8*TA*zmv5&9@| zOqZkcxIB$6Rk~E@@)f##i7sm$T-MO#U+D7Bbb0*|15X?EO$FfL~qY>cY{ml8oXSo|^ zxeI5x`)0Z8X1UvDxyxp`yJoqoW*fzt+fA%l*otD!!k<{PyzE+ZDQlJo=o4#}Z_y{# zEGwRgPpnx^rBAF`hUgP(mY35f)-3-*pOj`HMZ=oq5>hm*S)N6oShGBrKCxyQ@-@p0 zePYe>RremGUO~%F1O0eP!kHV*13&<$n6a%H>$n zCNHAPb#!4h)1*(VW*($ZtY-e5KCznFKw5{@%ntg*Y9>dzhSkiE=@YA&H;}GjHS=rw z#A@cbq-$8se3U-1nmN^1Gq0jgtY&^hpIFUoBdx<~<~Y(YtY#YYiPg+M(I-|jmyoVu zHS=xy#A?PSUBhbT)AWhe%w-e!#A@c<^oiBX5u|Ha&HR8qv6^`f=^9ouZ1c04;gd~S z&F}$ltY-Lt8&)%%$Dh^A8%fu&n&JG7tY$cY6ssA|PQhx%^3@FQreQV15xJ~pI3$YI z46iw|nqdzoshJ|poEpUj3vqEq{n?K{z|T9?pS#qb7pXrlR)1ci{=5u-U^%^<{-7K1 zr#OoX>}|3Iw;WP?+1&QI;;Zlz=)Fe$+4Kxy6~TC{<5}GQL;MMuOTi7!9JKveNDGD_ z>hd0|ZdWIqIs&Pkx{Xcqb~}@Z0SjpW$k9-B#+|BD9&_@;!mv3TimtN>t83%4D}jU0 z&IF0ZXeWNW=8}@L*D1|yS=e06S-pzS2Y2KQqq!K3cJPQ>o{cA{l-~zCw-)bLOr7H| z_kn{&p8vca-|w1((RZld-nrs*5`$+FZVVP*DDN~6-R`kZnu(#`h4*(OSfVClSK?F1 zhuR63+=lz!-z^I#k8fT#aucFwY9j@^TpO#@>mwV9la=Wyr(7S|Q?AUEocx57qXXV> zUO1WLduk*3%2;hgP2Wa*#tcv4&g^xJ35NukUS8!KZCszyw>ck*L`Z8wXG zm|`1+cWx)j+}ImM88JTd&+I@p$t@lytqqEk)-A+I8cm~(LaA=y@OHb5L*23Bi9tm{ zM*$~>Eg}(ow*+T~@YYzV!6`A6@50@6#KB4VpgZv#7Eh;`okP|biW{YbnvHVaLbUE= zy*^!AH!@OCsW+KZHFquYp*$GGID%91(xpa~u_Kg~8z&a%`_HTrFz%mUe2_ zsozM|FU@cCY7`smH~J%Ln&vn1JVh_Uz2Xb$GDDX-Kk7}#>Em9ur=JaXAZ{Olxwt@2pYZ0XWufja~1(oabIMzIB-9%R)medRN5;7KZGiV`} z8^vAuGf_-u^M}>L7Y<*T8^x6NVr!5yYp%HIo& zja@9tKx5BeD&*FmzYi8yC*INK{LLj>dH4z>aeosHJXI8)twRrmKC>sP_VlFNsmnz> zPZC9?w6lX|eq((;k5h9f929e#s$IhoBV+YO6`A}imNyqtx&HHoy@i^aoRId5)XuY5 ztKmgFORBhL)hOu!rb30fH#?%Ys07T;@=mQ##mAXRr#xgi!xO_pTrd&C22di#vpJ_w zp0Mmjy@EyZ5+=_mfS=NE?0t|6xzKl#CWwboN`5_Ff0` zcc*MkRq_SA3dtx(>3u+x=n;0D%h2)wV9V^7>STD*5Ps`he_Ct}QqrR(9ccxqZ{NU+kAq`PPOABXf>ZNMtlNaHk0#B^Y#udc=$42aH_azPZhAqk`#i9cACK6@v_2JUm1k~H?E)Gsp{)0mKtf3j_b^# zV7%7p0#*~9Z%V)p7Xmgd%E%~Sl63b1cE1|LoFt2cW&@{g9fb*1tzAn76Ak$3N*PN5 zJmis;iXNlv!wj}UC|NJyu5bMzE|yF)2?RDwM4q97B;?R$RED6sxU6Z8H+EmacqzjD%wp<4q_b19-EOHO^R`2A(xWVv~m`fV4X zQ7jPYhF~Wpx)bt1-AWsCRR%s4|CC-18d7{aeUC9@^(j@R`penc@ml>8F?uip(uZxt zCl;&XnjrO^EJ?MHwk(e_~rBO}$7>%%%#+o=3C3YQfHxY-I2w zMS^AaI>L6OCwE=a5bXP+XqqYZ9VyuNkSHVL$d{x)n}Kx7V3CFB z-JfZ&NXg1FSTIjL9nsrA6YMh8+eeAs{;?<{Ww0dAk)xVnNb_`V&PN8TFVXeOw08DSAv6qKi%@Jtn1c zfmZ+ag>TJ{8OKIA3#NW0dw-?D>so;{(YdRhNq~b`ZA|v$Fz(`gF=n43YHmt!junEl zPLz>Ra3pD+@tyQ(ir~oJ)m3^Yg+#1fi53|E@TBbtzC|e@$&U#+*e&|VlpGu<#oSaliP_^igCz*H!IPjkd;6!vENz1HTIb{Q%CGVpF0Gl!l#W+qQ4myb&q3Y9LRp92~@i z*fE<|Uwm4cCwXkLf&|hvYXFY{yG!E(7OKZyq0qXA?B?G-nHd4_^H@Q!7{?4D%yl7X zriA%;AURz+HG>R#Wp0*CirXqq8o(U%*T67loGI*TgNo$37;6{~bblvI&2% z^nRic{K~+MfMZZ4zpk)af+&#>qYknL<+cb@Zm-)kj4; zvhgZdG(B1H>O-Q8jEX{%{ws}i`)21A3N9$H-!L&QAq!SdZy*Bj$xp&nWCsqwh z`J;B#?E!6#JsT;}9bXphG1VQXi0=4;C?jKcNYZV0M|6V!3?=;Ark(OLDG&siz$lBC zx532oitVRy;C4#laL7nY^vJ&pZkg(lQ$>$_Pn40OOxhRk2FHZ(xtFwbKSmbal#?&m z)^y3PQ`iX4xblS>zJsY)_V5<|OO*-aVGE}AwpGQV1D5kukKob$))a@qjTf+z>e?dY zvehR3Pf#61_dPCHYpVNB6W#ZiC?n&5lB9o`fpm%?Aq&yPPd6l_(GX`CgqDt_Wa|o{ z6VfU5mmr{Hv0jKWgf0pUp*8V_P^@JUYX}wpg!+Y-Ris&v)dpI_HqhFT4YWGW28w-5 z$bGJ6&J!8fK&K12UnR;&QCrD2P!tC)RX9+qP=GUAK57|cx-nWRjPV8}nwnxA*T;c4 z=Wh381RK|jCYn+omSE$RqKvNC7%?TU39End2(Y$irYi8n-Z7>1y%-n-bCLIe*<72X zt(hW@&;&uj*_%YGO>y>2!P)JijEss|lHR6~ZXcQ7wHZ71N{APA!8s(@eBdn58jF80 zLScQbzhN_sofp6st#bzwOe<-pTf^4+7=H`=F4zx92VU3M7lde4q&s(){RQZIl7NCj zl~ALLqiQr6c+Y&-903a%>Mq2sB>KygxD5z#D~K{Oikl>@i<=H{X%L-)qf(}IMbt?l z5ihUQahGeXNgOUwKsalIx8OvcK;?g+FftglS3MtE zhe6mROnll@?Y$G4e`%VckLo4*`E8;PO!f2GqMzR?%E+h%B_D5Mr1||Aq}3*%k!|! z5HVXRk2g5DMHzEcB%d2WO91o}+aLp@05=Oe%f}`M++cGBUfxEDfyf@W0kZvg?#XpU z#5H!G^Uwe1053a^A>!WMuK6;0=5hEG_J6z*ZnU5!)F9>$hLG`Nom0 z>!l2OzlMZx$X$*@sOa88rBOp{GWG_|R2qm$g)x?IU<(A&C^*$>rK$<+ds6EB$lY%o zA+xB%dP9i3I_k3H{oZxmg`j;|2!SaS# zXGtSNx3fASol<{k%<1!fy%6PZSsVCUR>%8WV!arx{4LT2k=5U_n*A*odj6I*xeH_c zEwPUYxj&@d3xCU?ko(_ha&Kh2=P}zItitD$*OuZQ5KTY9VAF#oq*bEn$BHt#GM=L| zivi_oY7{umHn1OHjd-T6bb_?=f?&-mQEgM&@O;6V^F$e4u_j_JzH2>ik$|z^u)Jx6 zi#Q>p-(MA@eXZ_B2y8CIRtTr+O)p@jVATO057%N;sJbHTpCC&{ah#!8S(eyP5p+n+ zQrqtReLSH`_}DpE%@#|Z%g|~3D%NQYwi8a-= zcbY4~MW0}l4hd1bTyP^JFiX;xYNQjVKG9)*+AS2;#BMPbXyp#299Ec!$N`@IsNm=A zqC%mb57Mf&-g^?^=dj@Ct)dJwL;E^)-Zu|Ob}Z8H;~l|djqbyK7qX6hH?TL+v(;{S zHLvrcaQ(5Tq}?oO!R;3aPMG5Mh~Rcvl#x+-CFwmH=|t&`XyUWMcwc$4rbM`VVH#T~ zLs~!zaeJ=__TDGzXNtY61$$p6%E-uGNxFOXUP#;1u^ZllC$(>#wz^|qDS6S!M^b>N zB9Yr&Q4q|3i(rf?=C2XVf3qkfBl9Kc?wNl99n%D3p{()``Wpx=R#EJpRBL}ULsw>j zl=N;02-g3#V2df%Um#fj0Z~Rq)=Sbl>pOw+l-ZutT{;MLQb=UBD)FstP>-m^2gW$_ z5PU3!vB}Wj^sQA`p(HgpS8$3FRRqJAZT&!?tii&tKH%~)0 zsAmXkOZ9Jjf-A|!Vr(_VAo!*bP*a28LNN&bNtBUs5J=Lx5OpG-DT6?opZX-LlR_ec zK+fOJ)>zZNZEz+s0o!BP>JHzg63fuc713VhhE$hrJTC;}aZxi=e$L#G9tnH~%=wjMtMPQsvfT~5C1=GRXa8u$hPS0`?=7fP zNxd#|r?0p4sAxG4J+_hHt%{$vws`#5xMm4SN+i(5I0`187YRu^O0+4XBuUcUOVSx? z?a2$Xq;0FnN`mz+H*dPv`-<-^pB7BLKs4CY@VrDYbwrerk*Sh&+f0ql=+`L6oyS$$ z^GnIaky5Ha>DFc(j9L6ef*4-n#?O+^UA!+izgcj_6z4A$oWE9-kuvvh8!vV~g3MW) zY}iXKSdgm@X?U<`ixt@VOvT!`ZF6lM=0eO&eBnp{+vg*GA@?0tgo)X7ACX3+0_h`l zLP#AFX;^2KlEX{Bc4@}m5655yDf2i6i5{J*pj_02287pF7$J0vO27gzW$;m1%ha|u zb4tbj{0$;cd^AGVajxp&D4UFVB@>C-2n<$5&y6 z5If|89$R!ZsLAYwtC-YRFhdJ)?_{rDjLOtCsREH_`beT|3w~8_{0)r%dO9s*@ z2E8mqSFc?dB0>HhskwDv>x6Vl{pGAdUl8l0kjR8YuC*PdndFH869wkOZVI;NO2`#= zgtRtAcbk&d%Z0SgiZW8bw3A5n^~wrS>3U$%aRL$sx4@A=o1Sq7N}b_RcdBb)iw5Wk z#=ccF+7x525R83Ll##;NL?Mc}cK!w-V~C9j^N?(d2=kCK35nbgN~UIBp_HQ`mxoGc z5~k($2fgTGub(`I`%bM6v7tf>A;4_pF;x~ph%S5Ld6hU^QHj0H1G*(bl>SO|vnf$} zh7hH{6lG*Y6iNCoGLTNu$g&W9C}h&ea+Lj{R{zAo6xGN#DR6sdcoXD-O>P(8K%1y&cMr}ips1e# z6&xE zv1!p;-FK9hh)gy()KQsKiDc?eME7OHN=f>^GLTNeN?C}m3cFxUF#D2PHUm~(rH(V9 zSjcf3VHUp4Syf>H1C8}qPG%rEs zG?n%YArK*zmPzQY5kj|4l#x-TNz#{OAf2MpWFh*X$)wWcc+^!|C!|yAFXtG#i=>l6 zA`T_#eaYZZ8orUvw4p5SUd*9I=MU4#r^t6lah)nzyH!QvNPQn@r!NZ&sU(EPl+14w zGG7p77*VvFSZ_jc*%qC*mP2rrRd>cF%gCKjqJ27q8t69knN5K9)wFHNU1;7|<8 z6`*N2Lo@|@?-orr#okSVy?2Q+GO83w`i=~wQ--80L>G@tLsCkfJ|sIKol<}4NY?kO z=!K|#LKnLGglO+g{63-B-8ZfF3CXQ9`aYpZRhFq(ty-i8p&Kz7@j{7U77N+aj}+7k zOpCG)4j-p;?V88ck$jE4r+FXLQ%__3bAA&D9 zHF1&pvlxH27MJjKDPNb-jYEpd>Ccklq3X{HzI7O156AVs;t{wu4{g-PbC>37g^9W1 zk@Uk-+ITsJ^A?V#Z%g?0T=7_ZDSn#9+i~HaPoOVHk&XjvYLit5d8}}HWbq{W{Sc=- zS3CuuwiZw2>uI>+G`y$dPw_M~t9Uy9dS-(N%b&!PJl;M11n zliOyC7t)i9Df!%7@gjV_uXr&%HB3)kf={!>OZj>kt|)LFf4Lmj;_39r75x1fxZYR1 zl0Ux*uA!}fl&kPDaQR!>&hXm(Htgq*>(p;|7sq8qyvv@7;gipL&bjf9F<$Q*J zQ94{@-2O89By<*N>4$)_|aUbRUY5NRez+Ns>dFM8>a)l4QhTp(~iRZ5*~~_3in~$NIDAl1GrawA6?!; zNvGaSm-A>R;MsI}oGy>ip`&w|IBQ5I&UrLPi};;^`M*wH!GE z4sd?|L-8rrYH6Y-7-_Foe_pHp#GP&a2Ha8(vxPX@_S&px+ky>zt}UN}dbp@3w19rd zXTwYO2Rxx;D#>1~Rz@2L$l1Q>#vPn^NF@P@Uc<;naVURGz9JR z;&ej7=}RSfempntkXrl2;+1moa{2~Z%5nwJb+b?wEtKaOLzqq?cx$p=pRTPN8KHCJ zz};$oY8VgHhR2+0d3bDc1SeG^9~xGo@d+mqVtDOBwo7NbKni>X|A37fb^?YZN-_Q>sGC@1~&MP0UYH<5dqw96cJDH*YMwY$BE!LB|5N# zgYW`LV?{@5iuQPU0>TOnvI7EpD+N+v>~@5tvd4j3jBZBN3Ai1mp%p0_kP4@h;=EwI zh%XoGrwFp7xJGXfV6sgwW8#es)8QjjR8=E&Vuh+A4$F82!T*SNyoOH92-Gm-87>nV z1R>4KmE+VWV9Z`5fu%wvYv3s0pobV9d1KF)e6>b4dA<;vtw~~2yj7k(jT5G+_oNPU ze-jjMN}?FJ9ot6RJ5h(=9JD|=%UVNY(el*J7eUA@_(nt0MNaw{`NBgX38RPlTE@7# zo-2*dw?uV&EN4*`wIypp6l6DrbW$*{Zd()roThX40#Vo^#4YSDYM(T;Se%r##Kr5_ zZRZU%FMVUk>Z&@J8zUZ?RX`|P!Z`F_WkzA1S`MjcBg-sl(JM8QPPXp*=5mliSXq5? zZp(45=f$V4Ou&0JMydAkYWV`_oLAy@Y;!VIqWA!n$|mSj<%1KUd0U_Hp9OLWFxk#0 zi6cLii+@D0@4H%U%&_lajcOmV z@5Jp$UtGWx%39xmfS2oT4sXf9#HR!kf1@?m3=@B?QSCz}F5l!D=aOr|&w@?I?32pQ z44aPBsP-Y7PSfUfVm>EXm;R_==Sr>NX4rYIMs?oU*}1{oWY|$!^^=AN3zo1L_1ZF1 zT$miK;I`F+3)p_f{&f&JWf$GZBqw7;^UCfSk!8&RCo(4DAkNq`V%P*$Z zGSejPp;XfCqtsGfF+y}m9bO%*&hj1v??)ki-_=SqBYqESR1J!sDHgSZRKL-hVTL)s z)~NO&bB?)T8y3X{R7qKidqBw5G5dQmDbuL-A?tP;z$G<$Q=zGM#fWZPsWIHl2sl@x zI&a;05TMhwz2ohMRMH)wlRA=JYLun!k3#%z(@HcWemga)2F1@5i`qe_s@4oM%&BNp z`;a-u-*A%#PBf2_;*{`=kgi#+sb(1Xa*b*qGSCEgsNvdkjEXNtbmLn!hMVce2Q{km z){O@NMt!Vzy!~h@>Gm;dnY*b{Y8C%iA%Op=m1#x*zo=0)D1fGz)DBAhP-})6=6qkH z+K0>;iq4?|ci#x|*dp@3HWDjloxLh#alswEn0Nh8|FiqK2IgIEXQYB!56cl9d16mG z@;Hs^yp5ZK0M*v^j<;)4Nw<$`OY=BUwyygH-5-VcZPrROqqeWrs2UVMQ!Hu+({^jk zFvFbNHL88coYOaMx^B~sP0}+Mpqez6T0Jb}ZANRn8J5;Hs(r}P?FMj54Pd}l+#*&l z3J_iQYK_Tey6%-4)p_f>g8-@C)jQt)St{xFk!l6Oie!ZotY z^+{#w;VsQYh5Q;MkxAMA-&|}r>XkWU@wn$g$_EkQ#awe4LYK?-6egw@BVfhdQxw-Q zwb|@=v13Z|r@0)#_nbrvB{oL87!5(B&svQO2FI`|Ico>}^I9`}0n$4&trsIVl2In|59h*m0-E1T(DNr%~-g*4}0S{%dt?A9uqqL#k0T_0%h7Wxu@%FQfd(f|-H|_x;mVd9+#Ee*eQln~6 zEKRYl9c=rS)(kVu`G!Wd51BL6a$-AjCrKTdRa$IJXRiub{F%lWGwlAcMzs&weY*j? z3vV}I<0I#tJ0LYekINDrdgu##G5KApQJuFAJqR%G+}`o_tW?tNW8M*YWQ{LXY@AU9 z4J3tIyC;P4a;szG5i#jtjeZoAeDGtAkhQSC$KtnCEpMv%O!j&1i+=(-~z zWV4_#$_)F*HL88ceiOl>o<8uLz3l6iUDUf`L^s~8G2Bcy-lb8Uw{AQL@b1Ch@%9f> zNw<%8hp7el7_<|2gdo0OE8C19zE`7aP!LTqs~xQStkw)O%=xrNwGWvyk{)2ARxA@I zb{)ShB=XxDd(1HXUo@(H$aE8{jD84Cu(~1ftyhJJF8r0oY%^W>s77_(y0E{|t$Cz( z@KQc5c}nE2=&2L$>czbKIE|{oo;o^}bo*F&3MEjv?fE|IC?WqI1g_b6eMvMXugb7i z317a8SHp!A%7fE9A-xE9)$;UnVzd3~XbRy{9BU-c~BfEsygp2x;Ccdodd++M+g zXYoe*&Pfta77LuR)x{l5IOEdh`C3!^P*M&lSELH1AH*QKNo#~J4tjrew6M8dquPh8 zIXW^WmYj;YFBn(SnrMb`1&wMSGH#nOH*Q?0t#Rt2(_W&n*G#9~tx=t~PU~-QHR1E@lLCrAD<6nb#V_ zHfW77!3^tWpQ+0#~YO+ImREFrl z7ig?D(}87;>b!N}L4azn?j3JmnM%5SR9jke?CRL0lxFWoA%1VuN;D&WZ`G(86hBie zYK>hV)f!=jH6PNb_91IxyniAQY|MQjQ(xAaXohiL(5UtyP)u!DuW)JuG4{OaZ!<-LlRQr%QXCxq5{0dXcr-j6QQER>#raq)m?L(&CVqg;LA0UAd zAMYCNSt+6uzpt^|OecOvqdIS$co3l3qPu%GAzhG4x_va;Y}f1d*rZAhXN^}YQ!iCeeQa8JA~!L^CYcJzJNz&w&!$IBX^p+R+eTZ zm8MUbXqvmWgK6$SYi6a*dCw4YUda?_ zA2Mf6f~CN_CH!RQYEyh+iq4;w6X7o27eI8g#v(I}zfq&whm0RHU`> z=E;k0`>w`dGu`&EMs?o0t-n#KdDvK`RC3fIJ940jJEDgczgW(F&GgVhjjF*O`fY0G zw~uwFuG&}`YfK?+icO~yS>v$3C&wyNh4REIpLy3Umpd#^PJG9Ig^wLhc}{Tu42@4& zxPKe!s&-PIDW;~UiZU9bnWkMQ31VJ3ynk~+SELs%My>gXX+s@rWE0b62S+ov^nEj% zS9O7Z7{ybKa-m*uY9n%7W~L@a?{1BKSw?S=fcbWf>b&XBK1a6`0(3)G(Wz0VTAM6P zYtd#&4~c%eTjQ{qe!EMfYOvq#NF{xMVcwgx#$@4sfO!KR7BQB*L6p%IFa-m0P7w3T zF@kx9I@Sp0eemFD=4bl8na#_)z&uwYYIv84lF*s|M`K%-Q5y`cZ)#NMO=tEw)-9uz zJ!eJ(H~&}BGmmRLG}AMWX;cmN%r8?(A7E&9;yvc(&jFg9<)I9t*|DOGjA(Y0Am){0 z1kDU}tPwO@b8s|sL*F;ED>QS}p8+)UDG8mqQ)8PMoq3Z+b>4JlpQ9O0Cwf5xd(|~K z3w{=TvrprqnZ9XgR1Nk`HI?)MhG(zS8k2?l0iK=h;SA&1YeX3t@vJF`dF2?vGeaF~ z1kc`ca5VGp`o5XXE4rASc?wViv}~k=*8Hl*xGdu~n4f)FqdIR|v(FK2Nuvh$qx3Di zzlmOXRO6qSUiqm;)nKpuD3$a9hGj>-q!)9ub3BY;EIUk;krB(53u0b5MzG9K#~Q)1 zl?O*NFYo(iHZSV}%UJbkK$d}y(3dx8EHk4ouh*!~o4)LG6gzUFT4_wTu;ZcE|+aH6U0BI zwa%dI6;nwcU|9Votuek_=~B?fE`ea)Df{;gqKu4KJtv5Ha%2Rn4Rx#$tp4D^(ag{E zeKVWuy1;6s!8NeXLP((X|IwJ1Wz4>FkrxN{O^xcjY0N%H>%;d}#_Z8X$*v-h-ya(VqQ5$P|Z-s8bP%+ z2S+nE^nEj%S9gJGVMVB6TXu3nd+yX2XhwV9q*0wW?b+uDw}j5^)}YP(P4vn>jell( zrJ+$Z*elgk(gzr(y-sUP7VZZ#wLuSS)C!>}BO|6Y1u?H2Bba8WV~t?idk&6f{$1ZU zvn#JEt3D0Py78*IbcDYAs>ZS`BQ}_)eOaSAZ~C&&QEb_GqnwYd4*I`}o_SQ`p_!if zsYcac&-^Hr^Z|xsN4~5Vv$K^R!l?B@QAS22TP}!stH|K7+{#jPd(RU)qTcVHtQ{$$Y zKKh|X)nFfeKb7@%Y~H)&MoO?UP=zOATHCaYS#Fs9Ac!Z$?! zOlq7o(?5Z6tX{yCKu z@ZK3Y1CTuFgnDx^5{T92wk&BBA6T?tL33%HqhsB2?nx~tAqc(sG?1Jr!^{YT(#-yHu-K)0JAysnz(VJw08mOjipyRo(*OsY0!Ww3xMFYjD%>#4rd{EGJ*U zix%gvw`MBUJww)%UA8Ac*-t#mMbcjXA1est0Z}#PI)xHc&GUe+JP@I}?d# z2O?2(aQcv43QL3ydDyyb2X}D+VrT6w*xb+CH{H0yT7SdlA*)axD>d@Sce+k?l1ajX zZHw-eW7!Pb)}^!U{H0q6}`mL2#pHjoD?ZQZDVMQLoNn%aeK-FH~V_gt!=(4y+Hz zT=6(dY%bKbf!)i3L`RGYCYkDpt3*fa5@lo@q>}XWGLTLgq_PlQkTMNYDWe$%>B)Jg ziteF2uMTgDGD?RHBc~Wa8Up znhv0GXkfz7%k_-I!gYDUPEwEM_m|idCwVC!A_4Ye8y_oeLK(Sa1Nb zf5+T)pASBL|RIe9O{eUPVqkfa5UzdS&ihh%Y=%X@|ev<<}gMK@E zs**2^?W`2Q`;SMM!HgRU`{iMXy@#(CuRKM7@T4jvfComBU^~s19w4l-O zo-&VcH*_#HDNRrDC8=GyU#S)*3S~_6-NS~x_cY_QeQnDPBFf>)5FixlHJ2BJBjL%K zrfcg@^#JiNwFg=$_^x_E4Bsz_p=E0LZVRpolTt}o||Br`2=d){=V(YllforMW@J5Zg9aMdXR{@E z%;xOaqz${1O=G?Z*ElJ8*sAcpPqBM_DB@9NjDQIn^2?L*1gU%ppx`-Rw`{lt9s~eX z9%oIl%d9$XkCAfcM>bry8P@s~jPra=>e_>u4?>KW-G{M%-y&QN#kz?pG2SG^c(EuW zqqdWz7iJ)xqU2;D`Y_C-wc?G3F_y-?n1j%)zDx!x|a*$GN~WZ7Ka>y!(X?HjN6(NazfJAPYq z?ehiOvvutoNPF`_z-H04w}~=fJ?KkuSEMn(w-MZR?;1Q#YGt%mccyhX%|=SFrX;GJ zjWrw(!mQbn&YGk}z2ue62sfX8Blu#iS!Xd$=H@p3$Ff!Xt61-K1Xo%U7`#lGo$r8 zCNaSw<))%~;A5{k(?AH|JH-h(HvH-=d!r67k>uUgdGcA%LZ&vuFhEbR_5Tx1HpSNM zf~|ii%E&0JlJwtZAe~|j$U=0n=)~lRtbI#~YkROo^w{Y<*46?TFcn4A7s*Sa4r}$W z5Q*;zo|+Pg9YQ1?5oKf)2}!zpmRiixi`H50(iHPlEr_eA8mYfpKQ7q%xM;E|w%#n* z`j{vqBU>eDovob=f|QXaVZD`cxpNqPMJ#&muQaR~8y+T4OS(TpW>f#N_Nnv%PR^ z?G%GJG6)PzBb2QL)#gtl)Uj)x#0x2DwtQMBwpBgh$*qDX=ZP{hDmF>_Y>jmLQwcTS zx_F&+qtYK~EN$_uVCZ^LBU4E6Ji*W_MHv|xDoN`MHG~wh*CK;NcSF1wFd@}6XsOi`O)77~k*~Khm z@fHJEN8?p{f+8_U%n=tkPU8>!L_A&%v){;w^oGgIWU%#U+@30w3O0r-h3U~asO`tt zm{JpM1uC%Ns03wg*<}jPptxpfgH!zxQH^x3jWN<%)I8eeSr|o| z>-$wRLIW3J+4LCctZKDEmL)g5QRZvE+TNO8Gk%*lKg`}MD zaGby)-QZ~P@kU7-`agWC;}u3cSvvlayZ<1$>xJU^a8DG^c)H?g-@rNb7H9|xoP{3Y zK@))QRnp2yeNr^}vj&?Sm^zc9$)6TwL`|LM)DE&8eM^GpkbCVyi8o$CZ`x%FnVW!~ z;@u(kSiOMlmK^m)N^=s!xiVTuh&5{lYukEkGKaq119d<`OeRSX@Fs`*e3vbl|8>C_ zQ$Sbji1|CWD2FmBVYdqa8DP5WNoF^#r={6?^Y#_u2>}d&-8PLlbM*=iZ=6v0<-(F{ zwkp>G_aOV9dH-y!L0HNA|3hI`R2Of48!nnE93a`SwP_#Z0w6O(2?!8B#6x7iT61Lb zsIGj+8XTz1VD}L=_zb8d0sIkRnuLb*D=cnU-vcYL$7mWcoe(pf22jOoSq0AP{ZhJi z-hL1>7a`@$UfwQ*FD{F{uP&RtuZq?9mcne-VxMi{m%KqCcmYcY#p5RoFA!nO_Ca9+hkOOsVy&e#HS$E$+t(AeN2!=uBW zQ7Pt0A#MI?FDe}EtBh3^9sTp3baXkjqa(hNQ_yEQ;BgLmOgVHI!eae6r&9mMU^iSg zSHbC%?z53_8u1*oZ$TVGJ?%=3JMoo{-11LgFH8%@A1ca#z0iIGmu*Kj z8Mwk^tNdR@Q=Tr0$%ei`Q>vmVr-(Aplt&kfFv{jdH*7<$6EBGrkL2M=@?B6~n@V+J z1OhUmdThjc){Y%FjI0@6vqCnnOB#w9DuvPcsAp|7A%#$E!l35z680Z7kXdK0_|SzA ziX}^MS&EAr@UaXZJzj9AU`-XJvm`RCmU)tC$DX6x4BZdsE(-ZLWgkd!D!%!!1q-$; z>`1DPBB`Q1#?~Yo1llH-=xrfqn}iIQlCv3)x15~m8c{}!oQ-Z!bKl&K{nO4mSVg6J zfjki-fTO8g-mcp#)Ox}?c#)^QW%!X|tx{e=<}|kT-NAcG)>+p$*fLVJo_7Ue5UQl? za(kTp&%06+%K0cTEWtOjBEd(I1e3hvJbBSXx#>UQOH?Ziko_%Xx+7se z+*Og5%3v1G4I*y|A)XQfW=e>EPY7{Qlz~R+E1EOxVRqGnA5Ay~8(sOy>^QlGea?`e z{8Zk{)Oba~pXXpSAWIqf+s3i`pfW=<7(S{>%RTjk)k1X0oq}1}IwWwC-kshdFUIOj z+$MnH%M)%47GIfgr}&CR3l>oBxF-H0InArppSav~&E>F{IfdQamXlp{d4Sf5SoJkE zM#$`YPnG`!^Zye`<$o&S#$fw7au;t!V41Xq)K6lhd_ohD%*m}->^`PZm15V4CFM%= zLRf}MqCc8Sx_$O6CrwWfJ8C}I4vCYI{c)lR!mBXbj=!$fJ1cRxh+ed;$`}H%c`4_?WZCY7b_#QCl zI*qEqF=~oAr|b^Tcq>TxRnMtln`B`=Dd`m{-^q^&))zGc(iBD8B3m}CC{-QKt-)I-l8Z+; z6Rjg4z3tSLpTpKI0d;djsO~6Cqw-^uv_wkH#j+^PWD%3)rDEa|g0Kym^x`IJOUrf> zw2101AcXU6^U~ia(%s6~fwlvBG%*j`+Vn*0j zxXNgu_nKNHRQ&MXbX$a4gu})t1_Tk1R5{GuDPWH0@kq{xa4+>su(NuQ6QS;W9hTzq@%ZmX#YZEMiv$)iS|!L z85u?UM}k;CiuTSI!rEDnc&%!cVob)ZXWzJOtK}&iM9&qGDxS_mp=1oWt+E|^b|K;$ zWDLHy69rLM^a4X~uxJ8n&)+tHrR$OdYn9G@gWc%HpS_p^6t6b0T{ zb;j@7&8Nm(;XSp^`;b$Q=fWAHatMdcA#?`EGK?3TYVFG1z*n?6k27IVIGyhhFhIrK zu*pUBW%HKfZ`iTL38};OJ2J%+9WtcL)^3Wqu3>#1(PQ~tqx*N0$%>FQ#4f{fW*&O= zbXn_1+$iI-`Q8JpFQip=Of$iqSN!Ew!o}3wunwKLE?X!1y5l#Jc=0rlF$s&T z>gh>UO@PV4;?k>emeHbGJwMl6hAXyajn6r;ArP)>?{K`}hBlzE&QwWrDahw5V{^re zvHsOOl)p`3$~IRV1Tl(r7_XCCy19tz(L4-SXCJN47wU8O@$DJATAsVFcrsP{B2Vl( z8YgpZLrw(=p}bzEnkBp2GhT1$(cqH(C(90*sYTttc%(KceX(IvJ91Yb&XpZXNt!q$ zA&zW`$Hjp*REMalBokst7Zz|}e;lbXVBYMHE^0lWcKhMGgHX+6b7w{Hkd(Uc4bh7w zjo)TWoR@o}m#z0nQATHa$<+vffH;DfSB??ueKeJH`_}s*<%;A!{UEqLtCf_6>j7(C zu2D5Oc1*G6@ZEK1Uws4_R|+Xs`-s2{8mv$MlpU+5bH-V z-f6jh$;}(BK?l)DwEGtZYNJ}RYNf^mu+TaUA^$31IP8?8m2GU9gm25UIR>z0-x(llV_+QH z_#G^27s`1~&j$)v@&!UGON4EOz{pVg3&uh;p%kq-(}KBE=k(zC$j8c5krQAqr6+Lr z?lVE$Y&S^>t)kPhufn>30fKx7w6LALqpneF;GiN^VPqhn{hL_OMnJgQedpCfr62IZ z0O-(2kq?0n$?$S0;4JEm&bW>373(a;LU~NU&X;xC5m+*&uE2^hbp|aUQ+MzJ@{_AW z*ktK(mjujQDW`_(v>}`YIs+wsiAL3+J(RA*``jKnb~kCFvHC7dKMGhCg?B#LB04(q zth9+@?hC8v`C2Dr>DmBJ?(@_g~>r)Bjnbkd?zu^8rLLK9u!p)2nweS=ZK=sYoc-J9wnR?sQooG?17 zSGt@OGsBJGmnf5==X$C-9W$$i{q>7ZyF4%%+O@xW+Vvp=FwD6Fu=@kXh8tp51cEX& zd+!69a>}Aj19*C$Ms?ocsn6}bBX%R8VppZQt6V8N$(G(>p{JycC+-OA?&})Mvvgzt zi?beFv32(qQAS2s{E{H%m1D%Z`+O>Clh)m%T1i>B9t@wKYE%slA5*O9m34RItIatP zlf?KiQAS2FUM`6BqZsdetW&6O-@2n1GuSz8BfV>Fk%fi~P)Kb@Ruxv{JS%O`bEr{v zsE9>49btRBTnbLt#6_nTD#e$XP_zTu@gpk3wx4 z1%m};Wz~&gYlt%2yo3t2Rf1QHqX|`7V)D|>z@iQ1-o&b*#{$k}>c8Te!o&_*3RHDr zKOb=qH5UA9>2*64yMa1#e+Gs_yH?);AQB0-W5ncoGKxjep_(N)q$x5pP_|N|I&V;@_Qr(ecwS6i!pg7@vTMY%_*05;I>@o~4D)a%BcO7^jbKP?^do2{pMZ7;FkvPR+`-aNQo92O8yhjUKkvyFuAle+flwWA$lx zVtB~fwtWLdw@^HG=q;+~jDrS3_fI+{Y;)XODImo*R%U2j3e9oPp!XJWP*d+9b9Kk} zD|nzo_`>npoQhPfKkc{j74~2RjmB0=OkDi16E}!^T~~d}%N%m?;klZ!@Kun}AXhu7 zlr9#N0~7O=Vo1oAxIwNvUxIPq$GJWwzE7C=iixxADg%MUtRba1L^NbSCXjleHZCMo z_dbEtQ{~I4ug3pgCXiZ$%!Sg?#J`Af@;*&GeC6DQ+6-JB@6o8rMt4Dap&#D!=c%OI z_W~{VJou7B!OwzCpV3M+!=}I2sP-Y77W4ibxetkd672a`ts!RE^DT{PAF}5#wV^LA zT~zpvVAe0RW|?8u&orv@#;i^zH}0G!*yHlQOxHR{7u5oIdYUfku-!CO*+r9t>G;%In@F3oY&W~G zl84t4zAs0Y`<)Z`C?n(GniIsla*QCu@28SBiwqyu%F4p` zV7PoxqiS%tm|~7eWcZ5K+$>B?65cP0GBOJ9LxNae3h(KJ42k}64INrNEL6=;w8m%Y ztw7}eOQSk(BH!l-am4P>@k45bI019Si4c3h5F*e-zItto4ZJ4(_T5X+%@k8q;(dIhI1g?r6%=$6hq>Vl4y3ZKoh9a*9qpydV6`H&TP#aQBz69)M~D*X=F85JIrq9 zZCK~OZH0w@ck-1!4fsCX0qlrZlS5RyE+Oo_d z8k1hgp0Qno9OMSqit-D-oj={R;&yq!+EdKdI@mO`)$mdo@ctTlpzGrin~PNj)RqS% zzFrj;8D{!1Xy4jeL9i1C!>W|y&s6*j$kP~evgWuCuyTbxqOAk<- z7edXHI#hAJ{yS>xd>H|{h``e0#1JUuWeNqIDN0LEvA!sr!-1WY=ru14%`ICCeDjSU zSK}Y0H&yEVPbcZ;;&sbqBFaTzkyQBni_oE8NTSw-w!aPKtC+$6CA7V)v8U}{(`Dyz zELjh_uU#&i%)$6=gWM0WwjJ)T@?+D&!pXdih^G)3*_oz5S5{fq2D*XRJe`vsS;5M_99jsuoE;l&-F&Vvap|K9DKd+RL=ob|J2>gsdsMNRqx-Bi+7GUcQ@; z)mR7TTd>h0G|t^KeNzYeV8lnTn21UtQ$Go&JEGPhrgy=aK*T;EM9datcp`RDckLCm zmy|=b&m=Ok_RrU9-vwg=k&&czk?Ew?#qTYH9DW}cH*o3)^qtkHl*`4!|24Q5TBiIkP@}KAk^1s%)$M;NjF&J1iv(xnh8dZai_4lQcZhy6}z0l~- zYo(cC&*wC%eaN0}LZiQ{HOmaM9@ePN8?!pm*^$ub_n5AA5E|V~C0*=sXfz%1Sk3P$ zq@)SPNg?ht(ntyYF0lUS`^`;O154#Y9@el%Izp6@aZz}MAm)|hVOkfOGYE}dmP)#P z^=2~0>jJG#S;loz{|t*VGWO5;f>>Yn&xte%LmGWI?AJfEN{*Psr^NW#rZqQ9{{$F* zokrE5-c1+sOnP^5YOPJg{T{yCRc|=;AUPmrMeva9((nz@i#4t0S$Z)TWgqsWpS55` zl#y|il>{-b93xt=kV^WA(SmbYoqEwfuN7rv?4MT&Vtv^^Cy^GsY5R38)L`;sVg&uA z*5E8X6zIXf(5M>JgXv=4=X!A2ZaytKSp_cP`%?S4zlm=9n#SNP-4-amk9Y#lito#! zjEn>83xb$ejuFN8|EH2}U-20W*!-ndpqZg4px7f!8k2LdRNjR)tOj_pB+2F@Wx4m5i&Ubja}ZU!}kOsJtAS&I%%j!rmB z^e+#%rpoYwV_%mrHH|ps+tqfbCQ$a`IvEL%KK=8BB@3|+e z#mjxE6cv)}F|fA45Ob8)OoMhpIx6(Jop5C6n95YQ(GkI!YIsiC4ca}?owsR>Hv>^0 z^`L`0_ZCq`Mu^%Whg<73@(Leh{85#ShA&B*5|9oD$kAjgy z`RBAV7AbsTx-p6%$Vn#;8-P>$2iAj^_pTi?B2-SioiL4`%XJElo@$hFvbj?Woj>l{ zJ1vcd2l}&d5-tBg6B1vlBbLE2QKm@c7WaVAaDSXsRwkQ4YB<@Rc5MdvRtQQXTnLPV zc5H?ZJYg+Puo)5?+6DRszJ&+0W*W2^(vhHxS_f%=dhcUhzFXy3PIfLVRS(F4Z=9Oc_JotJl>GsV7WA24R<`U*t20Q1sqR|;U z=Qn~_KX%T}Wt>{x%Wv)`E9V^$@t zRa)P{ZM3PwC*g(~x^deaV>o4_J{%nzb4(kZ-be+WIR|F=$572t7bZ7S9O&X`ofcW2f`kO)gIiie=II&d_^U5&-;#*Qlw-4gW zcdN|?DMprh!0*F*7A;uNT@%o??b#9)evY(Ekm^-V^ z_+7hkoU&tG;niiG_aUbq&+V;@*`tk;UB!GqhvkG^u)Vo<jvk4=o z*g?*b4|-z8mPBM@hQ1LnM=H?Y2k7tl!|@^5(4LrSMCpVM-xVg2F=IQ8?S8(-TCi0?@Fbo7*PA=D5Hh91y5zM7@!?aB9Dg5XE9KyJ5#%G z#JsZ)Ppy`zF9!VZVh3$x&e*PHXg2iYS2RhR`UL>aKT zXJAvTeDT~}bA!biK8E)Ezfj(3t|4owUfJW6ar&8i0Q{tlbI)jwTXx8AZCBwocB)f_ zS`AKRZ3liA?+f;vE~*}y2y|gJ1?>5@V9%+d46sMDnwl5;$u!okzR-X&CDuT@*T^(M~4m~(V^n9W0PL|8#JQI03fwS2BkVg!r`r~c{2%0mNsRV z$eRe?AHs?YWj^rP_gJw5ud`Rh0LmL2K!Ga#i5Nh(C?iIdUK&!RtF3G7ytQ3rhU!e2 zc26cO^wn%aPt(@9V$1Y>KT|>}rLCCz2v~r$LOvO2{bSO9S2bTTv6uC(Rw2eBb zit7tUdO?J++b{)Y0*P+m)L9f7tQTWTGA6H-2hgjmTcBslseC{cH?1I^bqaf_w#X-l zY)npdg+0uTj$3&41`soxE8#=dsJjs$Le;Xz#}!*tf+@vyiteK};UM`uFZPor3wNf=`r#F0 zZiUe4yDHUP)LXm#UWlzyz>Tmdb<7TZS>e_FCAZR-e2>scA;Te(4052gyi0A|&I>{Z zzaptFU6`{$D#>379W2}HdDtoPbRGt3yR2t0Teza5$CtTEpxu}BW$&0U3Ndkuxi32J zPYrfnuzjSR&YOxE)tnhkDY@Vbdn1ajUH-P!hjNWYxzU%onzY@5On2nRpRkU+!-`YO zq2QU`p+&pQ?!H%DIBK^by;lzl!I)ID;*J=S-+01$vKTWY1MJsEWJa(RO_u6C1ZVmz zs-uK{QVX@RRh!qS8H~APnkEPeHvPn)WCZSl#|6?x*rYj*cK#r4xh>6O;MuaCnVe{^ zdme{ih00%DN?TIWm+N9)r==?TC&{SaC~beiDeX|XLK7BPawcO?0v)yyg!p0T9BH}kGc=jPOK7?5z zk(>bAN3ukW`_!}^)`rP^wF&;jpGiv(tV845w_fQSpvphFBPx5eZB^Kp;i#ojdd7nh zhi(Dae4%>!Ia^0O5vs>|QLQJ~hEGi;@&fXW5G> z75Ly|0kBO=2Qb_5P=Ylh?b=>DTW_>A_s%E?O_xl_X~~}}H*+3o=IV`{J|M7~J6sl;`#Q>m_ zPirDP4bSmv6AtZU38yoJ_AH$tn6oiRC1-rcR&kI-GReO$g{aYoD4~ZAI?yh!y!kzc z&|XC#+_<(E3~pwU8J7kA`8ZQRW}Rt4MDpUmQ$b2Ej_M_q?7BpflAMZ`UB?H#aAKlz z3_ft$%(x#j$^mPl0lKga1pnTzfxsr9Fsc|^LgN5T0@(4;C|yrnv2mo0F8%ZGm5*w+ zzzMNDZwYKiQ6_|VM&NWRY=7FvcESu%`3DC-jU1v*)n$C4`W&W!hHo2f#vttg-5r9H zm^jSrFITS8Vo1C?Q43VMvrsA(>1>$x2zQoe+B1rw)5?V{ifGz5TfQH3(H#=Q$dDKo z)!w(fh(XCGrBN-U)8FD%mOQX2uKsosT23BLu(Q=VTy~li)Hu(2JGem|su=}2!p6up z0@xE#JF<<4NMaNP_*p>LbL(xP79_rR{X0l`+qrdza}&&ybNP9PERp!mC~&qx;I;vc zLMmDhMX5jmMeE#<(Mx43^bMhh{6bW3sT8i8q{1bqq!q3Wp2B5C-^tgr(v7S!*}9Rf zcXgf&^zk;qq*3G)`sLjHqP^{<_c0??6N~jExxeh;-e>RkQtWg`Ih96FTU*$^x4%yX zCjCx^m}GXrdnG1)MsyOg3%=TO@Uu-q{dxGMXvfb-{}AIH{62V}%SQvyvG&2oPR9|6 zyJ1XVM^#mQXX`jYqXe<+qt_G5f>~@`|1sv)br20I0rN{Z9vXA@*3d5Pyz|Xcgpn|4 zx#gx(l~i!nB#6h zu-c01C}6W4Rbj#+JVCUS2G9}=H^H>Xwn?~W{NHW z!~9YF&`EyX?98peVScJ@@}a@Q^hS69F+I6k0N&>s;p+z}xX7U1_cB@W#?+l{sL|?` zo9f;K@>8~Wdf0g9M}ejdak{Un~#3BBzfZ`857v9;*->8AuN-7y9Wel9-?4py3K zw#(P41^?KNLRDoI)n^OuX3C@Q^}kebjJM;Zu0n^~uL+16>Iqp78x+LvwgaJ#4Vf0R zsv*-NbaEu24Ve}LMPG(YOGIEYk6kpT<==Qd?oFvSo-qx0w?u3_ZJn|+O71^7+AQYk zlN?6L?mq~!%uSTsIQ&vE%Cy2?i|DgZ=ONE96PB~ai=#YXnG|e8OJM95=W98C_x3Av(dH*0y#$URgURCJ~0;Sy+YHifjR(SZBvn&xmaD zEL7)}1%i-GS&+$t6$kn{0?yHTlpC-Zv~?&GAe;u+I)P7%C9+f_7e9wX)#jaIBR|=~ zYC!#hlL4j1#oLs&Ki_ESP)cjWR$H97R~x!#V93t5kRoYTRsXR*%}*g8n`hVNaF}C5 zFzEnQk0@L)37p;|&@CNKdmjAVQR%DHxS=Ab)~tQx!ol90F{yDJ!i<@7KlBy(q(_GwkT) za_MdtorJKX7lIuftmBx9S*~qRtK&@j1o%S~0G!S38Vm=`&3vrIEXj_oRw=tt`-@U- z=Sp{$n=OLr4TttRCMzeoFDaufnO-5M$~dv`Kj+a=oOQkmZd9CC@z#yf6q;jCD7f&u z*+s+5wHCwCysA;Es8C~0;LUDRS3A4wwMi_u@5l{jc|~=OhgbF^whrWDA|f?GlA9Di^M(f zN{Nzk;M(f@`JW67in~U3oZrSBTMg#Pm6DIddfl7hdKstcSnKt8h$Yvf&_^9fr@vlP zm7Kb{EvEhROE>LHVp6>ruf%vCsoH{63dYdPD@I6L%hZ$8A0ow*4zj??CYn^3ku*6d zmeb(P0ggNBOxNd78lf?&`KnPiTS#sNW>+Kc-f!mv!&Z*4O+4kK4rD=9EE_GcAs((2PK%u=h*eV+NlTuDOaQ`6GkUGUT5TDj z!J2O=4_IKzl(NhFG>?PDDM~iN`8?p^F#~pwKOw+8=B`xMA%Fvml^Vc;j(#;mx;J$6 zDk+|9Iw0ZXg1b=trf&ug}zCe2jKKwLe% z{A@X(di&qg%B^~@>v;A}h_IWDbN-DrB>LQ{xT*9We^aC0o`ud;t%8?Osyt`c;k{A{ zM7$$V;}0@K4WmroCsE_8q7%&1I!Nqn>yoq=VBIoBlRa*Z&6+YFYm)C36qJA5H!;4% zejV{L;T^c&HLe9>%Wp)n};n)%qN55?t3fa-d_g z!zlEOJS-D4^ zU>xUDc6fAS&P{uc>U}nwq!1l};sHqMSguj>G1mCq^2PjxuWyVR@qu+1vq&hCT}RCU zwTliPI&yT>IeaTFG@cvw?B8>AkLicLYnD&~3FD>Vq4-d~O(7PXT9UUsGj7_b`UI6W z!h4gA`V7nP;8bp-Owrz?8~Ikf;YlcW`>~oG)P6B=;X9reN(rL(ZL8Jc~ z)l-7qh0#`DD``|t$K72VI{{=IVqLq`Y$+FOG^3MuaFQ%uS46ki}qFV4=}7&AE|@EE;O zpDgEzwGg{4fICg(3nz$C(HEKtmfd!3c5xS{F!P4Fr~s2(>WrWFs~A2U%A8A`7u8cL zF7-OerQ~$94de|5HcCPB21Y1SY2MRdD0gIq)Bc(g@g%;gLceII|f{a#MO$hyV9g!HT?2MiWCAeRt6E+b(eF z<>d-qf%lPsNrm^XmrP+yELMMIj@$|}?+2xDUfu&%+X0%2zePLmCf=f%C3Z-|Zb;oP z>Lmfi!(xIy?va4CnoZh+5{d^zCt$7i#^ip4m-;B!3$ElXh!W$x1;Du|PgI@I`Xsxv ziAb8tiO*j;=G;bNSnfsOD9(Eqm8mqZ+9Wlg-kzEsgaO)BH0m zEuM#?>`-(FtJp`ee6n0@Ls#HI!iL7N<4_vFbLLKQ6<{VKvgby#kq^KjknbF%X;&RwYapLc} z={oU8&!|RoY1CodQ~FWPwARe=pvToga>%fdf{J%uXaWnMt#q>uz@=K60^bLyMrQIg z4Ga@Vtve?p558lUiZl*Ldfu;dfm7tK6 zNqp;WPibc6TT&F=wJ1Xe_twK=7g z1Ot7u4W3%SwhvMaj28wp;zxpPaj=4vo?_D2 z$KT@gotZ^lQOUjjM-(3!DEGQIs@GK9>&=pT$*F1k-?e1_W0NrJ2|m$1#9akMu!85J^=`v5~dFE#AE7I(s_UK~{ZENIxztjNEi+D*u z{{0z}kl8`KRg%zqL?^ZvYhFwQ@9p7{ChQo*U9z1$vT!|luC$DA)OA+h@T=_Oun4B6{jsj$PX^^iK z!~!G$L<3ZIZI*O(2Cw@jwpqxjJ6*>m5330uD^fi!>^<=9iPAjuSBO&E_{q)*Y{TJN z7i}0+p|rD40KVZ}i@!BYo{nV5myJZLDRfO8c;%hkbC-*b@@^m$T#_|EB7pCstpIC& zS{yJ-9EIRb_6rEg z)%BsY&C>fi|FKXgz_eaI7hyEMH{!vj%4;H?RPJB3Vg=O&?BFN-mWBJW^xWvI$DV(# zTx?B0u{-2Io|IbA{*i`vq#1q@<*jWX!AXyII z5rpDA6miIvfY-8r6Bqw}lGUn2x&%$HM7X@d=L@?w9UnLwPz4I|wlzOnk}&c=5TLr! z>N!m;j{(&VtJP%)s`dJSR|3l17GOGPO(+{M?Xy~4hG1I57$srk-V*>SSyRadKoeH0 ziw2+s5_R{TnwrngdeqPHn(iU^_T$Cy(z_XO-ZkS$k}>X~g6(;~3QxU3){rkE$9iQp1f{&^Nc)BA1 z|0`BsX#j87{0FU8GbGQffV1-X5;XW*0Os@76tV%#XRTJ3Az*%=cG4hO9bgdH#iJ%D zHurhIM<*M?J&#V>t$WTx6V+Y< zO*E31%0X*`!p)hjnV6C6EQ9?mtL=Yo!D-QGF_jMSs;;B1WFXErjqOnY6{Ha}=jxXcSf<$*Vp|CL6CM8e2 zR4zvFu~?F=)+jvIlYmtiu;r{)GbF5xz*hMJQBe!Z8jMY<^rR*JZ?fi)4PF)|?c4DCy z1Hzm%0`($?gpk2siE^z(cp_Y_)$$yoAgnvAh0X?jUSPGlXy~)dCD!A{ecI#k{K7s`r9_l^-x5&EWl#b|zG5wA zHYoB%tJOtAkpYUN1WkYYUTqibZiwxt>CS4LbT%K@x7t1B{Jz)6|LJ@V6O6^XH1ClVkP9)Rwu~9HnpE;@;nKa+`{VZ*C#0kySo=#O&Uw(cOm* z93U?ugfJdIdT8ICgZAq|m5Dx^nWx-P^EqaPW3#m>_cJ7jzFP*~4L+Sz#oyVM@2tXTt^U5krL!|U*?U%flYS(Dz2HgjBjKR8pMFo0 zdQWdZ%Lgunx8LSlRPF%UDBfgcw{Q-WT6x3*=ABK*IAB>r`uR|Bl@Tmf_K7V&BDu=N zqLUD>z&C)a>=I^ocH;JV>ZzPMo*`cEpUIT(24rE;yhI=ySTW+<3SLl=w>wuf?d;Oq zcjYi%awh0~4+XqjK^v4hwD$&%!}0oXn$`A{H>!4n0=d|m9RA|)g!hlei)`9J4}_Kl zpTSM~hRVUohXC0_z?uJl0#SX2=h_qgg6`_^s|3oPi&cVNHy-$IHbStVzEb!J53sVqLdb zE07Iq`m|(Cmx)eNvZhUWERALz8_Y`*ZTt_!D$ZK)PP2+ellhEf z7gfGo2L{&x}q^YRn~kZOb)ZvQY>G z`&kR7X%Nh?iTkZqGh`Fpkzkp#iM8Xia2APX5Uc62L=$yOtl5Vx=%!gS!xVm7GKCL` zPEs<3UlNUF$`sz)wdwdw;mO1l2>ed1O{wIxGU1vU<)ZX@SuEFAtr4bKE<<8pwpz`Q z#JYoY*^^ka{E}`YMvvucuI5`}&HmYfZkjbSB=%WJVm}a_q$IJw7mZ~~Vt?DU>G&i@ zRXu&w3Oi>#&QX16N6p{{s#hW{>%ba8m?hv>z`V! z$|XoZRL0}rkGeJ;U$GH>1tM5iJQ2Y9C#&ylfb|bntBVG#1f0Qm9Q=OPqc$D~JqT!^ z9tUe{r8$(@k^)!X6v%MF+Xt~lJkM%1Lu5F&Yt!*5XA}AAz(<>Q0xGSmS2A|oEu1m# zP{AAxL|2Yq82z2x$ZfR->XBJMy03Hl(>*DtKJTtrudAY3O~8(feda4t#>=5=8NWt> zLkvg0nSs3K)B2n>$wfn-RJ`P@uA|N(>&RM4{SzQ-_oi5v32Q7K@+CkMBM^^Ut!B6` zFYMZMe6oJVu0&LQLF8wWsOPO=dT>oe)Gv=}HNk2bqW(Qe)N<(Eh+4jx6;YqGCb?+H zv&@NlV|$jwOc6nf&4LsG@{u6$4_MIj5HSJD7y^Hv)oO-o^zN=r$0zV^a@&PuI=TJZ z)<8YT21(rQPcGUzeOIj4m!eutuwI75zbZ*w4!s+R%Qv$k@!zs0xoGIK%t`z-P2zc* z!o?GTFh87ii)gfRsEL#x#cSLg>_n~qQ5T_kun`i?8XPkTqih9?zypBvR`g4HtQ z{WVG6a_HU2TfUhUd9Sx7xoF5UK=Mw|v^i_&zQymS>FBeDk0r8D^l{ekC5dDK)+CH# z@{!=Tw?ws{ih}<@0#{C=J<$(}1Y#fm@DI1g zZ{iP?^29nuNpU2!;c$McTni~cy~e&Fk|hyrp`cs2AtQke`5( zH0eGI?M8z#KC#P}uSp&yS8nxX0Z>6EZgo2pv&-XDtW=#GM}mUdi805bV{VdsiYUfq z`%YDmlwHu>B7my+C^HCEaEZ_1kus4AFX#b|vmcWk73)Q}xIAQEhRYy1&C3K5_=IPG z)2!j;lj^^FPvGvWqgqVGTmD4it{k@34o(?$lFn{5;iR0Lx+UiJ&@!HzR8RuTw_X#Q zoTRxeCi;P;o9J4_3=%ISF%db()qG3L?^8=RzYCZdg)z9qQzrgoO_^_rDSvJ0raZH# zOgk|ciP>9VfSD!+XjDX52pLN$-Egdg~)_UPBB{*6&mG_{`%p{4V+lvCy=RF)@jYyyw7_Ii} zQZqPLbOOy_4jO%UrJI+^C!KZfjOFyayJ9ZS5Z(B&Ce>X2OwQ$Lq7%%;N-NlT7E+oy zIsqUTq8`&}067IKofvs@q90gv)>rej zsWwH%bXL=pVx+SB3pbUW4W|HgttuCl-E8l82k>afA9l)z&@t$uBoIE7ZB`ci#ro_qpq7%&B+BJ68 zk8j_))j71!vx5Xw(Y5LYNoM+{m{DGImTpGI()cYoqdP<=$^F9@z)lWWZQIZaVCKb5 z46b~?WAXrHWh!0J2XQQ+?)P}*A0^eFuVA4+>eq0P8l;ON)H zlHVg%Bi)i4A@MhI$?q1O1R3kG);TLy+_k~MzmfdZRHHP-)|=+YHEw!VenQ0)#T~vo z(Jq{Tp#%?Z=LYDe{->JMf9ani#d-k@x?OAGqn%qv1E0~0Bjx6CXrrY9Y>s$s62^;C z#G9yli8n?{Ct>-p^0sOL2vDecnc|8^~?I_qK+OJZ1c79OBn7wCvm9z%hp`( zkW(A+U~!Zd)I9WkHgdAuEKiiHFwgZ+N6LiXBRh9&-Cn$M`$TSH+m0Q%9amkw zEtk(_GlGpl7iQ+zw&(;AbCKFf_YatCW#2Tdn z+~s1we6n1c^SxZCqWXC;s%?Q$BatiTLqcy3h3Rs&2)icDas;_0>vQ;xIYQ{$jS{(B z5Ky;o-M%BYbsPR4-MaM}{{MoI@r}6W8U1`h1_#L>^>7)Iw2`LfdMK;DO2o2;Bk9s(blM$O)pzuTj%DYx~tZw>H~n^7H-!N zu~;);7~*FJ(W~2XM8Aqe37N7+mo2*Kh@KS{9@lRTZU9>%>79|Qj1o)G0bvXn2o(Iy zM?gZ?Xd1*Kcx^}aO%Ggl0~8AWB2;FRr#;*~u()rb&de!9`WkNBBOjMwAvyDc%= z@g@-jZqS?J# z511!P`34gG?XAHI*lJ^x;c%tzrRJzxyd(UB5jyn5Ktna(FdQvn<3rr=xZ2_3)9{(l zCW+texkvIE8aW&?tFSQ?+Ravd=J+IqYY~(qMsT9gxP}PdpVks@2kUu6fX4s5N-h_P zYy6lISRpSq-@IUv$QEo{>Dt@2U%q2!2pDJ?M}i+kpvg^Cc_Dr)DfHi7I)2Qid3u5U zKzFS@-Hsq)uOW%YLcT4Vow2boXY&?M;P|KtWm{T#QgS^~a=#u4>f<9Zb#R4sh6nnk z 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 + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

KCWorks Architecture

+
+

InvenioRDM’s Layered Architecture

+

InvenioRDM employs a layered architecture with:

+
    +
  1. Data layer

    +
      +
    • Low-level data storage and retrieval.

      +
        +
      • Primarily SQLAlchemy model classes.

      • +
      +
    • +
    • High-level data API classes that provide a Pythonic interface to the data layer.

      +
        +
      • Validate data before storing it.

      • +
      +
    • +
    +
  2. +
  3. Service layer

    +
      +
    • Retrieves and modifies data from the data layer, either for a view or for another service.

      +
        +
      • Providing abstract CRUD methods for operating on the data layer’s API classes.

      • +
      • Providing abstracted “result items” and “result lists”

      • +
      +
    • +
    • Enforces permission and access control policies.

    • +
    +
  4. +
  5. View layer

    +
      +
    • Consists of

      +
        +
      • Flask views (registered as Blueprints)

      • +
      • rendering either

        +
          +
        • Jinja2 templates to produce HTML

        • +
        • JSON to produce API responses

        • +
        +
      • +
      • in some cases, React components embedded in the Jinja2 templates

        +
          +
        • These are rendered on the client side

        • +
        • Data is passed from the Jinja2 templates to the React components via HTML data attributes

        • +
        +
      • +
      +
    • +
    +
  6. +
+
+
+

InvenioRDM Services

+

An InvenioRDM service is a class that provides methods for interacting with the data layer. The business logic of the service is usually delegated to one or more component classes, which are called during the service’s methods.

+
+

Service Classes

+
+

BaseService

+

The base Service class is defined in invenio_records_resources.services.base.Service. It defines methods for:

+
    +
  • Getting the service ID

    +
      +
    • id(self): Return the id of the service from config.

    • +
    +
  • +
  • Permissions checking

    +
      +
    • permission_policy(self, action_name, **kwargs): Factory for a permission policy instance.

    • +
    • check_permission(self, identity, action_name, **kwargs): Check a permission against the identity.

    • +
    • require_permission(self, identity, action_name, **kwargs): Require a specific permission from the permission policy.

    • +
    +
  • +
  • Handling service components

    +
      +
    • components(self): Return initialized instances of the service’s component classes.

    • +
    • run_components(self, action, *args, **kwargs): Run components for a given action.

    • +
    +
  • +
  • Producing result items and lists

    +
      +
    • result_item(self, *args, **kwargs): Create a new instance of the resource unit, i.e. whatever the service provides.

    • +
    • result_list(self, *args, **kwargs): Create a new list of resource units. In some cases this is a simple iterable of resource units, but in other cases it is a more complex object that includes additional data.

    • +
    +
  • +
+
+
+

RecordService

+

Services dealing with InvenioRDM records of some kind (e.g. records, drafts, communities, etc.) inherit from the RecordService class defined in invenio_records_resources.services.records.service. This class adds:

+
    +
  • properties and methods related to the service’s related data-layer API class

    +
      +
    • A schema property that returns a ServiceSchemaWrapper instance.

    • +
    • A record_cls property that returns the record class for the service.

    • +
    • A links_item_tpl property that returns a LinksTemplate instance for constructing links to a resource unit.

    • +
    • An expandable_fields property that returns a list of expandable fields for the service’s data-layer API class.

    • +
    +
  • +
  • Methods for creating searches

    +
      +
    • create_search(self, identity, record_cls, search_opts, permission_action="read", preference=None, extra_filter=None, versioning=True): Instantiate a search class.

    • +
    • search_records(self, identity, params, **kwargs): A low-level method to create an OpenSearch DSL instance for searching records.

    • +
    • search(self, identity, params=None, search_preference=None, expand=False, **kwargs): A high-level method to search for records matching the querystring.

    • +
    • scan(self, identity, params=None, search_preference=None, expand=False, **kwargs): A high-level method to perform a rolling “scroll” search for records matching the querystring. (This is used for searching through large numbers of records, since OpenSearch will not return more than 10,000 records at a time.)

    • +
    +
  • +
  • Methods for indexing records

    +
      +
    • reindex(self, identity, params=None, search_preference=None, search_query=None, extra_filter=None, **kwargs): A high-level method to reindex records matching the query parameters.

    • +
    • rebuild_index(self, identity, uow=None): A high-level method to reindex all records managed by this service.

    • +
    +
  • +
  • CRUD methods

    +
      +
    • create(self, identity, data, uow=None, expand=False): Create a record.

    • +
    • exists(self, identity, id_): Check if the record exists and user has permission. (Does not use the search index.)

    • +
    • read(self, identity, id_, expand=False, action="read"): Retrieve a record. (Does not use the search index.)

    • +
    • read_many(self, identity, ids, expand=False, action="read"): Retrieve multiple records using the search index.

    • +
    • read_all(self, identity, params=None, search_preference=None, expand=False, **kwargs): Retrieve all records matching the query parameters using the search index.

    • +
    • update(self, identity, id_, data, uow=None, expand=False): Update a record.

    • +
    • delete(self, identity, id_, uow=None): Delete a record.

    • +
    +
  • +
  • Helper methods for record management

    +
      +
    • check_revision_id(self, record, expected_revision_id): Validate the given revision_id with current record’s one.

    • +
    • on_relation_update(self, identity, record_type, records_info, notif_time, limit=100): Handles the update of a related field record when the related field is updated.

    • +
    +
  • +
+
+
+

Augmented RecordService

+

The invenio_drafts_resources package then overrides this with a RecordService class that adds (a) a distinction between published and draft records, (b) record versioning and a parent-child record relationship, and (c) file attachments to service records. This adds the following properties and methods to the RecordService class:

+
    +
  • Properties and methods for draft records

    +
      +
    • draft_cls(self): Return the record class for the service.

    • +
    • draft_files(self): Return the draft files service for the service.

    • +
    • draft_indexer(self): A factory for creating an indexer instance.

    • +
    • search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs): Search for draft records matching the querystring.

    • +
    • read_draft(self, identity, id_, expand=False): Retrieve a draft record.

    • +
    • update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False): Replace a draft.

    • +
    • edit(self, identity, id_, uow=None, expand=False): Creates a new revision of a draft or a draft for an existing published record.

    • +
    • publish(self, identity, id_, uow=None, expand=False): Publishes a draft record.

    • +
    • delete_draft(self, identity, id_, revision_id=None, uow=None): Deletes a draft record. (Defaults to a soft delete, so the record is not actually deleted from the database or search index until a later cleanup operation.)

    • +
    • validate_draft(self, identity, id_, ignore_field_permissions=False): Validate a draft.

    • +
    • cleanup_drafts(self, timedelta, uow=None, search_gc_deletes=60): Hard delete of soft deleted drafts.

    • +
    +
  • +
  • Properties and methods for files

    +
      +
    • files(self): Return the files service for the service.

    • +
    • import_files(self, identity, id_, uow=None): Import files from previous record version.

    • +
    +
  • +
  • Properties and methods for versions and parent records

    +
      +
    • schema_parent(self): Return the parent schema for the service.

    • +
    • search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs): Search for record’s versions.

    • +
    • read_latest(self, identity, id_, expand=False): Retrieve the latest version of a record.

    • +
    • new_version(self, identity, id_, uow=None, expand=False): Creates a new version of a record. +This overridden RecordService class also modifies the CRUD methods to enforce a workflow in which records are only modified via their draft records. This involves overriding:

    • +
    +
  • +
  • update(self, identity, id_, data, uow=None, expand=False): Now raises a NotImplementedError error.

  • +
  • create(self, identity, data, uow=None, expand=False): Now creates a draft record.

  • +
  • rebuild_index(self, identity): Now reindexes all draft records (instances of draft API class) as well as all published records (instances of record API class) and skips soft-deleted records.

  • +
+
+
+

RDMRecordService

+

The invenio_rdm_records package provides an RDMRecordService class that inherits from the RecordService class and adds:

+
    +
  • Additional properties for accessing subservices

    +
      +
    • access: Return the access service for the service.

    • +
    • pids: Return the PIDs service for the service.

    • +
    • review: Return the review service for the service.

    • +
    +
  • +
  • Methods for embargo handling

    +
      +
    • lift_embargo(self, identity, _id, uow=None): Lifts an embargo from the record and draft (if exists).

    • +
    • scan_expired_embargos(self, identity): Scan for records with an expired embargo.

    • +
    +
  • +
  • Properties and methods for file quota handling

    +
      +
    • schema_quota: Return the schema for quota information.

    • +
    • set_quota(self, identity, id_, data, files_attr="files", uow=None): Set the quota values for a record.

    • +
    • set_user_quota(self, identity, id_, data, uow=None): Set the user files quota.

    • +
    +
  • +
  • Properties and methods for deletion of published records

    +
      +
    • schema_tombstone: Return the schema for tombstone information.

    • +
    • delete_record(self, identity, id_, data, expand=False, uow=None, revision_id=None): Re-introduces soft-deletion of published records (which were previously removed by the RecordService class).

    • +
    • update_tombstone(self, identity, id_, data, expand=False, uow=None): Update the tombstone information for the (soft) deleted record.

    • +
    • cleanup_record(self, identity, id_, uow=None): Clean up a (soft) deleted record.

    • +
    • restore_record(self, identity, id_, expand=False, uow=None): Restore a record that has been (soft) deleted.

    • +
    • mark_record_for_purge(self, identity, id_, expand=False, uow=None): Mark a (soft) deleted record for purge.

    • +
    • unmark_record_for_purge(self, identity, id_, expand=False, uow=None): Remove the mark for deletion from a record, returning it to deleted state.

    • +
    • purge_record(self, identity, id_, uow=None): Purge a record that has been marked.

    • +
    +
  • +
  • Overridden methods to add deletion-related functionality

    +
      +
    • read(self, identity, id_, expand=False, action="read", include_deleted=False): Adds an include_deleted argument to the read method, and a check for the read_deleted permission if it is set to True.

    • +
    • read_draft(self, identity, id_, expand=False): Prevents reading a draft if there is a published deleted record. (410 response.)

    • +
    • search(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs): Adds a “read_deleted” permission action to the search method.

    • +
    • search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs): Adds a filter to exclude soft-deleted records from the search results.

    • +
    • search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs): Adds a “read_deleted” permission action to the search method.

    • +
    +
  • +
  • Additional overridden methods for other functionality

    +
      +
    • publish(self, identity, id_, uow=None, expand=False): Adds a check prior to the original publish method to allow enforcement of a config setting that requires a community to be present on a record before it can be published.

    • +
    • update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False): Adds a check prior to the original update_draft method to allow enforcement of a config setting that prevents a record from being restricted after the grace period.

    • +
    +
  • +
  • Additional new methods for other functionality

    +
      +
    • expandable_fields: Expands the communities field to return community details.

    • +
    • oai_result_item(self, identity, oai_record_source): Get a result item from a record source in the OAI server.

    • +
    • scan_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read_deleted", **kwargs): Search for record’s versions using a “scroll” search.

    • +
    +
  • +
+
+
+
+

Service Configuration

+

A service configuration is an object that provides the service with its configuration. It is passed to the service’s constructor when it is instantiated during the Flask app initialization.

+

The service configuration is defined in the service’s config attribute.

+

All service configurations inherit from the ServiceConfig class, which is defined in invenio_records_resources.services.base.config. They include at least:

+
    +
  • service_id: The ID of the service.

  • +
  • permission_policy_cls: The permission policy class to use for the service.

  • +
  • result_item_cls: The result item class to use for the service.

  • +
  • result_list_cls: The result list class to use for the service.

  • +
+

This is expanded in a RecordServiceConfig class by the invenio_records_resources package to add:

+
    +
  • record_cls: The record class to use for the service.

  • +
  • indexer_cls: The indexer class to use for the service.

  • +
  • indexer_queue_name: The name of the task queue to be used by the service’s indexer.

  • +
  • index_dumper: The dumper to be used for serializing records to be indexed by OpenSearch.

  • +
  • relations: The inverse relation mapping for the service, defining which fields relate to which record type.

  • +
  • search: The search configuration for the service. (This is a SearchOptions instance.)

  • +
  • schema: The schema to be used when validating the service’s records.

  • +
  • links_item: The template for creating url links for the service’s result items.

  • +
  • links_search: The template for creating url links for the service’s search endpoints.

  • +
  • components: A list of components that will be used by the service.

  • +
+

It is further expanded in an overridden RecordServiceConfig class by the invenio_drafts_resources package to add:

+
    +
  • draft_cls: The draft record class to use for the service.

  • +
  • draft_indexer_cls: The indexer class to use for the service’s draft records.

  • +
  • draft_indexer_queue_name: The name of the task queue to be used by the service’s draft records indexer.

  • +
  • schema_parent: The schema used to valid parent records for the service.

  • +
  • search_drafts: A search class for searching for draft records.

  • +
  • search_versions: A search class for searching for record versions.

  • +
  • default_files_enabled: Whether files are enabled by default for the service.

  • +
  • default_media_files_enabled: Whether media files are enabled by default for the service.

  • +
  • lock_edit_published_files: Whether to lock editing of published files for the service.

  • +
  • links_search_drafts: The template for creating url links for the service’s search drafts endpoint.

  • +
  • links_search_versions: The template for creating url links for the service’s search versions endpoint.

  • +
+

The RDMRecordServiceConfig class adds the following additional configuration attributes:

+
    +
  • max_files_count: The maximum number of files that can be attached to a record.

  • +
  • file_links_list: The list of file links for the service.

  • +
  • schema_access_settings: The schema for access settings.

  • +
  • schema_secret_link: The schema for secret links.

  • +
  • schema_grant: The schema for grants.

  • +
  • schema_grants: The schema for grants.

  • +
  • schema_request_access: The schema for request access.

  • +
  • schema_tombstone: The schema for tombstone.

  • +
  • schema_quota: The schema for quota.

  • +
+

Additional common configration attributes are added by inheriting from additional mixin classes.

+
+

Attaching configuration to the service

+

The service config class is passed to the service’s constructor when it is instantiated during the Flask app initialization:

+
service = MyService(config=MyServiceConfig)
+
+
+
+
+

File service configuration

+

The FileConfigMixin class (defined in invenio_records_resources.services.records.components.files) adds config class attributes for: ????

+
    +
  • _files_attr_key: The attribute key for the files field.

  • +
  • _files_data_key: The attribute key for the files data.

  • +
  • _files_bucket_attr_key: The attribute key for the files bucket.

  • +
  • _files_bucket_id_attr_key: The attribute key for the files bucket ID.

  • +
+
+
+

Search configuration

+
+
SearchOptionsMixin
+

This mixin class (defined in invenio_records_resources.services.base.config) adds config class attributes for:

+
    +
  • facets: The search facet definitions for searches on the service’s resource.

  • +
  • sort_options: The sort options for searches on the service’s resource.

  • +
  • sort_default: The default sort option for searches on the service’s resource.

  • +
  • sort_default_no_query: The default sort option for searches on the service’s resource when no query is present.

  • +
  • available_sort_options: The available sort options for searches on the service’s resource.

  • +
  • query_parser_cls: The query parser class to use in constructing searches on the service’s resource.

  • +
+
+
+
SearchConfig
+

The SearchConfig class (defined in invenio_records_resources.services.base.config) defines the search configuration that will be used to interface with OpenSearch.

+
+
+
FromConfigSearchOptions
+

The FromConfigSearchOptions class (defined in invenio_records_resources.services.base.config) is used to load search configuration from app config variables. In the service’s config class, it is used like this:

+
+
+
+

Loading configuration from app config variables

+

The FromConfig class (defined in invenio_records_resources.services.base.config) is used to load configuration from app config variables. In the service’s config class, it is used like this:

+
class MyServiceConfig(ServiceConfig):
+    foo = FromConfig("FOO", default=1)
+
+
+

In the app config, the config variable is defined like this:

+
FOO = 2
+
+
+

When the service is instantiated, the FromConfig class will load the config variable from the app config and assign it to the foo attribute.

+
+
+
+

Service Components

+

A service component is a class that provides methods that shadow the service’s methods. When a service method is called, it passes the call through each of the service’s components (using the Service.run_components() method), allowing each component to perform additional processing before the result is returned. If the service component includes a method with the same name as the service method that is being called, its matching method will be called. During this call, the component method is passed the service method’s arguments and keyword arguments, and the service method’s modified versions of these arguments are passed on to the next component. Once all the service’s components have been called, the result is returned to the service method, which returns the final result or performs the final action.

+
+

BaseServiceComponent

+

The BaseServiceComponent class (defined in invenio_records_resources.services.base.components) is the base class for all service components. It provides a uow property that returns the Unit of Work manager.

+

This class is overridden by the ServiceComponent class (defined in invenio_records_resources.services.base.components.base), which adds the following methods:

+
    +
  • create(self, identity, **kwargs): Perform additional processing while creating an item of the service’s resource.

  • +
  • read(self, identity, **kwargs): Perform additional processing while retrieving an item of the service’s resource.

  • +
  • update(self, identity, **kwargs): Perform additional processing while updating an item of the service’s resource.

  • +
  • delete(self, identity, **kwargs): Perform additional processing while deleting an item of the service’s resource.

  • +
  • search(self, identity, search, params, **kwargs): Perform additional processing while searching for items of the service’s resource.

  • +
+

The invenio_drafts_resources package overrides the ServiceComponent class to add methods matching the overridden RecordService methods for draft records and versioning.

+
    +
  • read_draft(self, identity, draft=None): Retrieve a draft record.

  • +
  • update_draft(self, identity, data=None, record=None, errors=None): Update a draft record.

  • +
  • delete_draft(self, identity, draft=None, record=None, force=False): Delete a draft record.

  • +
  • edit(self, identity, draft=None, record=None): Edit a record.

  • +
  • new_version(self, identity, draft=None, record=None): Create a new version of a record.

  • +
  • publish(self, identity, draft=None, record=None): Publish a draft record.

  • +
  • import_files(self, identity, draft=None, record=None): Import files from previous record version.

  • +
  • post_publish(self, identity, record=None, is_published=False): Post publish handler.

  • +
+
+
+

RecordService Components

+

The invenio_records_resources package provides the following components for the RecordService class:

+
    +
  • DataServiceComponent (create, update): Adds data to the record.

  • +
  • BaseRecordFilesComponent (create, update):

    +
      +
    • Handles enabling/disabling files for a record.

    • +
    • Handles setting the default preview file for a record.

    • +
    +
  • +
  • MetadataComponent (create, update): Adds metadata to the new/updated record from the input data.

  • +
  • RelationsComponent (read): Dereferences a record’s related fields in order to provide the data from the related records in a read result.

  • +
  • ChangeNotificationsComponent (update): Emits a change notification for the updated record.

  • +
+

The invenio_drafts_resources package provides additional components for the RecordService class:

+
    +
  • an overridden BaseRecordFilesComponent class that adds methods for ???

  • +
  • DraftFilesComponent: Handles files for draft records.

  • +
  • DraftMediaFilesComponent: Handles media files for draft records.

  • +
  • DraftMetadataComponent: Handles metadata for draft records.

  • +
  • PIDComponent (create, delete_draft): Handles registration of PIDs for draft records.

  • +
  • an overridden RelationsComponent class that adds a read_drafts method

  • +
+

The invenio_rdm_records package provides additional components for the RDMRecordService class:

+
    +
  • AccessComponent(create, update_draft, publish, edit, new_version): Handles access settings for records.

  • +
  • an overridden MetadataComponent class (create, update_draft, publish, edit, new_version): Adds metadata to the new/updated record from the input data. (Removes the update method from the earlier MetadataComponent class.)

  • +
  • CustomFieldsComponent(create, update_draft, publish, edit, new_version): Adds custom fields to the metadata of a record.

  • +
  • PIDsComponent(create, update_draft, delete_draft, publish, edit, new_version, delete_record, restore_record): Handles PIDs for records.

  • +
  • ParentPIDsComponent(create, publish, delete_record, restore_record): Handles parent PIDs for records.

  • +
  • RecordDeletionComponent(delete_record, update_tombstone, restore_record, mark_record, unmark_record, purge_record): Handles deletion of records.

  • +
  • RecordFilesProcessorComponent(publish, lift_embargo): Handles file processing for records.

  • +
  • ReviewComponent(create, delete_draft, publish): Handles reviews for records.

  • +
  • SignalComponent(publish): Triggers signals on publish.

  • +
  • ContentModerationComponent(publish): Creates a moderation request if the user is not verified.

  • +
+
+
+

RDMRecordService Components

+

The invenio_rdm_records package draws its list of components from the RDM_RECORDS_SERVICE_COMPONENTS config variable. The default list is defined in the DefaultRecordsComponents class (defined in invenio_rdm_records.services.config) and currently includes:.

+
[
+    MetadataComponent,
+    CustomFieldsComponent,
+    AccessComponent,
+    DraftFilesComponent,
+    DraftMediaFilesComponent,
+    RecordFilesProcessorComponent,
+    RecordDeletionComponent,
+    # for the internal `pid` field
+    PIDComponent,
+    # for the `pids` field (external PIDs)
+    PIDsComponent,
+    ParentPIDsComponent,
+    RelationsComponent,
+    ReviewComponent,
+    ContentModerationComponent,
+]
+
+
+

Note that the order of the components in the list is important, since the components are called in the order they are listed and some components depend on the results of previous components.

+
+
+
+
+ +
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/build/genindex.html b/docs/build/genindex.html index 60b21859f..b784280be 100644 --- a/docs/build/genindex.html +++ b/docs/build/genindex.html @@ -208,6 +208,7 @@
  • CLI Commands
  • KCWorks Infrastructure
  • Developing KCWorks
  • +
  • KCWorks Architecture
  • In-depth Installation Instructions (NEEDS UPDATING)
  • Reference
  • diff --git a/docs/build/index.html b/docs/build/index.html index 24729e6ba..8f794a4e5 100644 --- a/docs/build/index.html +++ b/docs/build/index.html @@ -210,6 +210,7 @@
  • CLI Commands
  • KCWorks Infrastructure
  • Developing KCWorks
  • +
  • KCWorks Architecture
  • In-depth Installation Instructions (NEEDS UPDATING)
  • Reference
  • @@ -323,6 +324,11 @@

    Welcome to the Knowledge Commons Works technical documentation!Running automated tests (NEEDS UPDATING) +
  • KCWorks Architecture +
  • In-depth Installation Instructions (NEEDS UPDATING)
    • Install Python and Required Python Tools
    • Install Docker 20.10.10+ and Docker-compose 1.17.0+
    • diff --git a/docs/build/objects.inv b/docs/build/objects.inv index 67264f91f1cb0f58951a433f1031bc8f851d3db8..8792a4eb74b0175edeeb9b349eefb6826963f587 100644 GIT binary patch delta 6806 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 Commands
    • KCWorks Infrastructure
    • Developing KCWorks
    • +
    • KCWorks Architecture
    • In-depth Installation Instructions (NEEDS UPDATING)
    • Reference
    diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js index 1e9606dd2..866369f0f 100644 --- a/docs/build/searchindex.js +++ b/docs/build/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"0.3.0-beta3 (2024-11-30)": [[2, "beta3-2024-11-30"]], "0.3.1-beta4 (2024-12-10)": [[2, "beta4-2024-12-10"]], "0.3.2-beta5 (2024-12-11)": [[2, "beta5-2024-12-11"]], "0.3.3-beta6 (2024-12-18)": [[2, "beta6-2024-12-18"]], "0.3.4-beta7 (2025-01-09)": [[2, "beta7-2025-01-09"]], "0.3.5-beta8 (2025-01-10)": [[2, "beta8-2025-01-10"]], "1. Clone the git repository": [[10, "clone-the-git-repository"]], "2. Create your configuration files": [[10, "create-your-configuration-files"]], "3. Start the docker-compose project": [[10, "start-the-docker-compose-project"]], "4. Initialize the database and other services, and build asset files": [[10, "initialize-the-database-and-other-services-and-build-asset-files"]], "5. Create your own admin user": [[10, "create-your-own-admin-user"]], "6. View the application": [[10, "view-the-application"]], "A successful import response": [[1, "a-successful-import-response"]], "API": [[1, "api"]], "About": [[0, "about"]], "Add and Configure an Environment File": [[7, "add-and-configure-an-environment-file"]], "Adding new entry points": [[6, "adding-new-entry-points"]], "Adding new node.js packages to be included": [[6, "adding-new-node-js-packages-to-be-included"]], "Additional environment variables with sensitive information": [[7, "additional-environment-variables-with-sensitive-information"]], "Additional required environment variables with paths on your local file system": [[7, "additional-required-environment-variables-with-paths-on-your-local-file-system"]], "An unsuccessful import response": [[1, "an-unsuccessful-import-response"]], "Build and Configure the Containerized Services": [[7, "build-and-configure-the-containerized-services"]], "Build and start the containers": [[7, "build-and-start-the-containers"]], "Bulk Record Import (invenio-record-importer-kcworks)": [[5, "bulk-record-import-invenio-record-importer-kcworks"]], "CLI Commands": [[3, "cli-commands"]], "Changes": [[2, "changes"]], "Changes to external python modules (including Invenio modules)": [[6, "changes-to-external-python-modules-including-invenio-modules"]], "Changes to html template files": [[6, "changes-to-html-template-files"]], "Changes to invenio.cfg": [[6, "changes-to-invenio-cfg"]], "Changes to python code in the site folder": [[6, "changes-to-python-code-in-the-site-folder"]], "Changes to static files": [[6, "changes-to-static-files"]], "Changes to theme (CSS) and javascript files": [[6, "changes-to-theme-css-and-javascript-files"]], "Changing the Group Ownership of a Collection (PATCH)": [[1, "changing-the-group-ownership-of-a-collection-patch"]], "Clone the knowledge-commons-works Code": [[7, "clone-the-knowledge-commons-works-code"]], "Collections": [[5, "collections"]], "Collections for KC Groups (invenio-group-collections-kcworks)": [[5, "collections-for-kc-groups-invenio-group-collections-kcworks"]], "Commit strategy": [[6, "commit-strategy"]], "Configuration of InvenioRDM": [[4, "configuration-of-inveniordm"]], "Content moderation notifications": [[5, "content-moderation-notifications"]], "Contents:": [[8, null]], "Controlled Vocabularies": [[11, "controlled-vocabularies"]], "Controlling containerized nginx server": [[7, "controlling-containerized-nginx-server"]], "Controlling just the containerized services": [[7, "controlling-just-the-containerized-services"]], "Controlling the Application Services": [[7, "controlling-the-application-services"]], "Controlling the KCWorks (Flask) application": [[10, "controlling-the-kcworks-flask-application"]], "Copyright": [[0, "copyright"]], "Create an admin user": [[7, "create-an-admin-user"]], "Create and initialize the database, search indices, and task queue": [[7, "create-and-initialize-the-database-search-indices-and-task-queue"]], "Creating a Collection for a Group (POST)": [[1, "creating-a-collection-for-a-group-post"]], "Creating a new Work via the InvenioRDM REST API": [[1, "creating-a-new-work-via-the-inveniordm-rest-api"]], "Creator/contributor roles": [[11, "creator-contributor-roles"]], "Customizations to InvenioRDM": [[5, "customizations-to-inveniordm"]], "DOI": [[11, "doi"]], "DOI (primary identifier)": [[11, "doi-primary-identifier"]], "Deleting a Group\u2019s Collection (DELETE)": [[1, "deleting-a-group-s-collection-delete"]], "Deposit Form Customizations": [[5, "deposit-form-customizations"]], "Developing KCWorks": [[6, "developing-kcworks"]], "Digging deeper": [[6, "digging-deeper"]], "Docker log rotation": [[7, "docker-log-rotation"]], "Email templates": [[5, "email-templates"]], "Endpoint configuration": [[1, "endpoint-configuration"]], "Ensure some version of python is installed": [[7, "ensure-some-version-of-python-is-installed"]], "Error responses": [[1, "error-responses"]], "Event timing": [[1, "event-timing"]], "Example metadata record": [[11, "example-metadata-record"]], "FAST": [[11, "fast"]], "Fixing docker-compose \u201cnot found\u201d error": [[7, "fixing-docker-compose-not-found-error"]], "Forked Core Invenio Modules": [[5, "forked-core-invenio-modules"]], "Full local development setup": [[10, "full-local-development-setup"]], "Funders": [[11, "funders"]], "GET requests": [[1, "get-requests"]], "GND": [[11, "gnd"], [11, "id2"]], "Git Branching Strategy": [[6, "git-branching-strategy"]], "Git Submodules": [[6, "git-submodules"]], "Grid (deprecated)": [[11, "grid-deprecated"]], "Group Collections API": [[1, "group-collections-api"]], "Group collection owner": [[1, "group-collection-owner"]], "HC Legacy Custom Fields": [[5, "hc-legacy-custom-fields"], [11, "hc-legacy-custom-fields"]], "Handle (secondary identifier)": [[11, "handle-secondary-identifier"]], "Handling collection name collisions": [[1, "handling-collection-name-collisions"]], "Handling deleted group collections": [[1, "handling-deleted-group-collections"]], "Handling group name changes": [[1, "handling-group-name-changes"]], "Homosaurus": [[11, "homosaurus"]], "ISBN (secondary identifier)": [[11, "isbn-secondary-identifier"]], "ISNI": [[11, "isni"]], "ISSN (secondary identifier)": [[11, "issn-secondary-identifier"]], "Identifier Schemes": [[11, "identifier-schemes"]], "In-app notifications": [[5, "in-app-notifications"]], "In-depth Installation Instructions (NEEDS UPDATING)": [[7, "in-depth-installation-instructions-needs-updating"]], "Install Docker 20.10.10+ and Docker-compose 1.17.0+": [[7, "install-docker-20-10-10-and-docker-compose-1-17-0"]], "Install Node.js and NVM": [[7, "install-node-js-and-nvm"]], "Install Python and Required Python Tools": [[7, "install-python-and-required-python-tools"]], "Install and enable Python 3.9.16": [[7, "install-and-enable-python-3-9-16"]], "Install pyenv and pipenv": [[7, "install-pyenv-and-pipenv"]], "Install the Invenio Python Modules": [[7, "install-the-invenio-python-modules"]], "Install the invenio-cli command line tool": [[7, "install-the-invenio-cli-command-line-tool"]], "Installation": [[10, "installation"]], "Integrations with KC": [[5, "integrations-with-kc"]], "InvenioRDM Documentation": [[12, "inveniordm-documentation"]], "JSON object for record creation": [[11, "json-object-for-record-creation"]], "JSON object retrieved from the record API": [[11, "json-object-retrieved-from-the-record-api"]], "Javascript tests": [[6, "javascript-tests"]], "KC Search Provisioning (invenio-remote-api-provisioner)": [[5, "kc-search-provisioning-invenio-remote-api-provisioner"]], "KC Username (recommended)": [[11, "kc-username-recommended"]], "KCWorks Custom CLI Commands": [[3, "kcworks-custom-cli-commands"]], "KCWorks Custom Fields (kcworks/site/metadata_fields)": [[5, "kcworks-custom-fields-kcworks-site-metadata-fields"], [11, "kcworks-custom-fields-kcworks-site-metadata-fields"]], "KCWorks Implementation of Core InvenioRDM Fields": [[11, "kcworks-implementation-of-core-inveniordm-fields"]], "KCWorks Infrastructure": [[9, "kcworks-infrastructure"]], "Linux": [[7, "linux"]], "MacOS": [[7, "macos"]], "Making duplicate import requests": [[1, "making-duplicate-import-requests"]], "Metadata Schema Customizations": [[5, "metadata-schema-customizations"]], "Metadata Schema, Vocabularies, and Identifiers": [[11, "metadata-schema-vocabularies-and-identifiers"]], "Modular Framework (invenio-modular-deposit-form)": [[5, "modular-framework-invenio-modular-deposit-form"]], "Modular Framework (invenio-modular-detail-page)": [[5, "modular-framework-invenio-modular-detail-page"]], "Naming Commits": [[6, "naming-commits"]], "Note about docker contexts": [[7, "note-about-docker-contexts"]], "Notes about Implementation of Core InvenioRDM Fields": [[5, "notes-about-implementation-of-core-inveniordm-fields"]], "Notifications": [[5, "notifications"]], "OAI (secondary identifier)": [[11, "oai-secondary-identifier"]], "OFR": [[11, "ofr"]], "ORCID (recommended)": [[11, "orcid-recommended"]], "Only some of the works to be imported failed": [[1, "only-some-of-the-works-to-be-imported-failed"]], "Organizations": [[11, "organizations"]], "Overrides in the KCWorks Package (kcworks/site)": [[5, "overrides-in-the-kcworks-package-kcworks-site"], [5, "id1"]], "POST requests": [[1, "post-requests"]], "Page templates": [[5, "page-templates"]], "Pagination": [[1, "pagination"]], "Payload objects": [[1, "payload-objects"]], "People": [[11, "people"]], "Permissions and access in newly created collections": [[1, "permissions-and-access-in-newly-created-collections"]], "Python tests": [[6, "python-tests"]], "Query parameters": [[1, "query-parameters"]], "Quickstart": [[10, "quickstart"]], "ROR (recommended)": [[11, "ror-recommended"]], "Rebuilding changed files on the fly (fast but limited)": [[6, "rebuilding-changed-files-on-the-fly-fast-but-limited"]], "Record Detail Page Customizations": [[5, "record-detail-page-customizations"]], "Reference": [[12, "reference"]], "Request": [[1, "request"], [1, "id6"], [1, "id7"], [1, "id11"], [1, "id15"], [1, "id18"], [1, "id22"], [1, "id27"]], "Request body": [[1, "request-body"], [1, "id19"], [1, "id23"]], "Requesting a specific collection": [[1, "requesting-a-specific-collection"]], "Requesting all collections": [[1, "requesting-all-collections"]], "Requesting collections for a Commons instance": [[1, "requesting-collections-for-a-commons-instance"]], "Requesting collections for a specific group": [[1, "requesting-collections-for-a-specific-group"]], "Required headers": [[1, "required-headers"]], "Resource types": [[11, "resource-types"]], "Retrieving Group Collection Metadata (GET)": [[1, "retrieving-group-collection-metadata-get"]], "Running CLI Commands in the KCWorks Container": [[3, "running-cli-commands-in-the-kcworks-container"]], "Running Invenio CLI Commands": [[3, "running-invenio-cli-commands"]], "Running automated tests (NEEDS UPDATING)": [[6, "running-automated-tests-needs-updating"]], "SAML Authentication": [[5, "saml-authentication"]], "Sorting": [[1, "sorting"]], "Standardized environment variables": [[7, "standardized-environment-variables"]], "Start the uwsgi applications and celery worker": [[7, "start-the-uwsgi-applications-and-celery-worker"]], "Startup and shutdown scripts": [[7, "startup-and-shutdown-scripts"]], "Streamlined Import API": [[1, "streamlined-import-api"]], "Subject headings": [[11, "subject-headings"]], "Success responses": [[1, "success-responses"]], "Successful Response Body:": [[1, "id9"], [1, "id13"], [1, "id17"]], "Successful Response Headers": [[1, "successful-response-headers"]], "Successful Response Status Code": [[1, "successful-response-status-code"], [1, "id16"]], "Successful response body": [[1, "successful-response-body"], [1, "id21"], [1, "id25"]], "Successful response headers": [[1, "id10"], [1, "id14"]], "Successful response status code": [[1, "id8"], [1, "id12"], [1, "id20"], [1, "id24"], [1, "id28"]], "Tagging Releases": [[6, "tagging-releases"]], "Template Customizations": [[5, "template-customizations"]], "The InvenioRDM REST API": [[1, "the-inveniordm-rest-api"]], "The basic build process (slow)": [[6, "the-basic-build-process-slow"]], "The import request": [[1, "the-import-request"]], "The request file upload failed": [[1, "the-request-file-upload-failed"]], "The request metadata is malformed or invalid": [[1, "the-request-metadata-is-malformed-or-invalid"]], "The token does not have the necessary permissions": [[1, "the-token-does-not-have-the-necessary-permissions"]], "Unsuccessful response codes": [[1, "unsuccessful-response-codes"], [1, "id26"], [1, "id29"]], "Updating an Instance with Upstream Changes": [[6, "updating-an-instance-with-upstream-changes"]], "Updating the running KCWorks instance with development changes": [[6, "updating-the-running-kcworks-instance-with-development-changes"]], "Use the application!": [[7, "use-the-application"]], "User Data Sync (invenio-remote-user-data-kcworks)": [[5, "user-data-sync-invenio-remote-user-data-kcworks"]], "User and Group Data Updates (Internal Only)": [[1, "user-and-group-data-updates-internal-only"]], "User-first-record notifications": [[5, "user-first-record-notifications"]], "User/Groups Metadata updates and SAML authentication": [[1, "user-groups-metadata-updates-and-saml-authentication"]], "Variables for local credentials": [[7, "variables-for-local-credentials"]], "Version Control": [[6, "version-control"]], "Version Numbering": [[6, "version-numbering"]], "View container logging output": [[7, "view-container-logging-output"]], "View logging output for uwsgi processes": [[7, "view-logging-output-for-uwsgi-processes"]], "Welcome to the Knowledge Commons Works technical documentation!": [[8, "welcome-to-the-knowledge-commons-works-technical-documentation"]], "What happens to an import request that fails?": [[1, "what-happens-to-an-import-request-that-fails"]], "Who can use the import API?": [[1, "who-can-use-the-import-api"]], "Works": [[11, "works"]], "custom_fields.hclegacy:collection": [[5, "custom-fields-hclegacy-collection"], [11, "custom-fields-hclegacy-collection"]], "custom_fields.hclegacy:committee_deposit": [[5, "custom-fields-hclegacy-committee-deposit"], [11, "custom-fields-hclegacy-committee-deposit"]], "custom_fields.hclegacy:file_location": [[5, "custom-fields-hclegacy-file-location"], [11, "custom-fields-hclegacy-file-location"]], "custom_fields.hclegacy:file_pid": [[5, "custom-fields-hclegacy-file-pid"], [11, "custom-fields-hclegacy-file-pid"]], "custom_fields.hclegacy:groups_for_deposit": [[5, "custom-fields-hclegacy-groups-for-deposit"], [11, "custom-fields-hclegacy-groups-for-deposit"]], "custom_fields.hclegacy:previously_published": [[5, "custom-fields-hclegacy-previously-published"], [11, "custom-fields-hclegacy-previously-published"]], "custom_fields.hclegacy:publication_type": [[5, "custom-fields-hclegacy-publication-type"], [11, "custom-fields-hclegacy-publication-type"]], "custom_fields.hclegacy:record_change_date": [[5, "custom-fields-hclegacy-record-change-date"], [11, "custom-fields-hclegacy-record-change-date"]], "custom_fields.hclegacy:record_creation_date": [[5, "custom-fields-hclegacy-record-creation-date"], [11, "custom-fields-hclegacy-record-creation-date"]], "custom_fields.hclegacy:record_identifier": [[5, "custom-fields-hclegacy-record-identifier"], [11, "custom-fields-hclegacy-record-identifier"]], "custom_fields.hclegacy:submitter_affiliation": [[5, "custom-fields-hclegacy-submitter-affiliation"], [11, "custom-fields-hclegacy-submitter-affiliation"]], "custom_fields.hclegacy:submitter_id": [[5, "custom-fields-hclegacy-submitter-id"], [11, "custom-fields-hclegacy-submitter-id"]], "custom_fields.hclegacy:submitter_org_memberships": [[5, "custom-fields-hclegacy-submitter-org-memberships"], [11, "custom-fields-hclegacy-submitter-org-memberships"]], "custom_fields.hclegacy:total_downloads": [[5, "custom-fields-hclegacy-total-downloads"], [11, "custom-fields-hclegacy-total-downloads"]], "custom_fields.hclegacy:total_views": [[5, "custom-fields-hclegacy-total-views"], [11, "custom-fields-hclegacy-total-views"]], "invenio-communities": [[5, "invenio-communities"]], "invenio-rdm-records": [[5, "invenio-rdm-records"]], "invenio-records-resources": [[5, "invenio-records-resources"]], "invenio-vocabularies": [[5, "invenio-vocabularies"]], "kcr:ai_usage": [[5, "kcr-ai-usage"], [11, "kcr-ai-usage"]], "kcr:book_series": [[5, "kcr-book-series"], [11, "kcr-book-series"]], "kcr:chapter_label": [[5, "kcr-chapter-label"], [11, "kcr-chapter-label"]], "kcr:commons_domain": [[5, "kcr-commons-domain"], [11, "kcr-commons-domain"]], "kcr:commons_search_recid (system field)": [[5, "kcr-commons-search-recid-system-field"], [11, "kcr-commons-search-recid-system-field"]], "kcr:commons_search_updated (system field)": [[5, "kcr-commons-search-updated-system-field"], [11, "kcr-commons-search-updated-system-field"]], "kcr:content_warning": [[5, "kcr-content-warning"], [11, "kcr-content-warning"]], "kcr:course_title": [[5, "kcr-course-title"], [11, "kcr-course-title"]], "kcr:degree": [[5, "kcr-degree"], [11, "kcr-degree"]], "kcr:discipline": [[5, "kcr-discipline"], [11, "kcr-discipline"]], "kcr:edition": [[5, "kcr-edition"], [11, "kcr-edition"]], "kcr:institution_department": [[5, "kcr-institution-department"], [11, "kcr-institution-department"]], "kcr:media": [[5, "kcr-media"], [11, "kcr-media"]], "kcr:meeting_organization": [[5, "kcr-meeting-organization"], [11, "kcr-meeting-organization"]], "kcr:project_title": [[5, "kcr-project-title"], [11, "kcr-project-title"]], "kcr:publication_url": [[5, "kcr-publication-url"], [11, "kcr-publication-url"]], "kcr:sponsoring_institution": [[5, "kcr-sponsoring-institution"], [11, "kcr-sponsoring-institution"]], "kcr:submitter_email": [[5, "kcr-submitter-email"], [11, "kcr-submitter-email"]], "kcr:submitter_username": [[5, "kcr-submitter-username"], [11, "kcr-submitter-username"]], "kcr:user_defined_tags": [[5, "kcr-user-defined-tags"], [11, "kcr-user-defined-tags"]], "metadata.creators/metadata.contributors": [[5, "metadata-creators-metadata-contributors"], [11, "metadata-creators-metadata-contributors"]], "metadata.subjects": [[5, "metadata-subjects"], [11, "metadata-subjects"]]}, "docnames": ["README", "api", "changelog", "cli_commands", "configuration", "customizations", "developing", "in_depth", "index", "infrastructure", "installation", "metadata", "reference"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["README.md", "api.md", "changelog.md", "cli_commands.md", "configuration.md", "customizations.md", "developing.md", "in_depth.md", "index.rst", "infrastructure.md", "installation.md", "metadata.md", "reference.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 3, 5, 6, 7, 11], "0": [0, 1, 6, 8, 10, 11], "00": [1, 5, 11], "0000": [1, 5, 11], "0001": 11, "00k4n6c32": 11, "00z": [1, 5, 11], "01": [1, 5, 8, 11], "01t00": [1, 5, 11], "0378": 11, "04": 7, "06": 11, "09": [8, 11], "1": [1, 5, 6, 8, 11], "10": [1, 8, 10, 11], "100": 1, "1001634": [5, 11], "1038515d68f7": 1, "1086436": 11, "11": [7, 8, 11], "111023": 11, "12": [7, 8, 10], "123": 11, "1234": [1, 11], "12345": 1, "123456": [5, 11], "1234567890": 1, "1234567891": 1, "12345abcd": 11, "1263": [5, 11], "13": 11, "17": [8, 10], "18": 8, "19": 7, "2": [1, 6, 7, 8, 11], "20": [8, 10], "200": 1, "2007": 11, "201": 1, "2018": 11, "202": 1, "2020": 11, "2022": 11, "2023": 0, "2024": [1, 5, 8, 11], "2025": [8, 11], "2029": 11, "204": 1, "207": 1, "22": 7, "2345": 11, "24": [0, 11], "25": 1, "251587": 11, "2nd": 11, "3": [0, 1, 6, 8], "30": 8, "304": 1, "32": 11, "3dmodel": 11, "4": [1, 8, 11], "400": 1, "403": 1, "404": 1, "409": 1, "422": 1, "45": 1, "456": 11, "458": 11, "4891": 1, "5": [0, 1, 8], "50": 1, "504": 1, "5402d72b": 1, "5601": [7, 10], "5955": 11, "6": [1, 7], "60": 11, "6379": 7, "63932": 11, "6780": 11, "6789": 11, "67890": 1, "7": 1, "8": 11, "8601": [5, 11], "8gb": 7, "9": 1, "90": 1, "9200": 7, "94682": 11, "958235": 11, "966892": 11, "A": [2, 5, 11], "As": 11, "At": 7, "But": [1, 10, 11], "By": [1, 6], "For": [1, 3, 5, 6, 7, 11], "If": [1, 5, 6, 7, 10, 11], "In": [1, 6, 8, 11], "It": [0, 1, 2, 3, 5, 6, 7, 10, 11], "Its": 1, "NOT": [1, 10], "No": [1, 6], "Not": 1, "On": [3, 7], "One": [5, 7, 11], "Or": [6, 7], "TO": 10, "That": [5, 11], "The": [2, 5, 7, 8, 10, 11, 12], "Then": [3, 6, 7], "There": [1, 6, 7], "These": [1, 2, 3, 5, 6, 7, 10, 11], "To": [1, 3, 6, 7, 10], "With": [2, 7], "__init__": 6, "__name__": 6, "aa8": 1, "abil": 11, "abl": [1, 7], "about": [1, 6, 8, 11], "abov": [1, 6, 11], "absenc": 1, "abstract": 11, "abus": [5, 11], "ac": 11, "academ": [0, 5, 11], "accept": [1, 11], "access": [2, 7, 10, 11], "accident": 1, "accommod": 1, "account": [1, 5, 11], "acronym": 11, "across": 1, "action": 1, "activ": [1, 6, 7, 10, 11], "actor": 11, "actual": [1, 7, 11], "ad": [1, 2, 5, 11], "adaptor": 11, "add": [2, 5, 6, 8, 10, 11], "addit": [1, 5, 6, 10, 11], "addition": 7, "additional_descript": 11, "additional_titl": 11, "address": [1, 5, 7, 11], "admin": [1, 5, 11], "administ": 1, "administr": [1, 7, 10], "administrativ": 1, "advis": 7, "affect": [1, 2], "affili": [5, 11], "after": [1, 6, 7, 10], "ag": 11, "again": [1, 6, 7, 11], "against": 7, "agent": 1, "aggreg": [1, 3, 5, 11], "ai": [5, 11], "ai_descript": [5, 11], "ai_us": [5, 11], "alia": 7, "alias": 6, "all": [2, 3, 5, 6, 7, 10, 11], "all_or_non": 1, "allow": [1, 2, 5, 7, 10, 11], "alon": 6, "along": [5, 6, 11], "alongsid": 7, "alreadi": [1, 6, 7], "also": [1, 2, 3, 5, 6, 7, 11], "altern": [7, 11], "although": 11, "alwai": [2, 7], "ambigu": [5, 11], "american": [5, 11], "among": 2, "an": [0, 2, 5, 8, 10, 11, 12], "anaconda": 7, "analyst": 11, "ani": [1, 3, 5, 6, 7, 11], "annot": 11, "anoth": 7, "anotherusernam": 1, "api": [2, 3, 6, 7, 8, 10], "api_token": 7, "app": [7, 10], "appear": [1, 2, 10, 11], "append": [1, 7], "appli": 1, "applic": [1, 6, 8, 11], "approach": [7, 11], "appropri": [1, 7, 11], "ar": [1, 2, 3, 5, 6, 7, 10, 11], "arbitrari": 11, "archiv": 1, "area": [5, 11], "aren": 7, "argument": 3, "aria": 2, "arli": 2, "arlisna": [5, 11], "around": 1, "arrai": [1, 5, 11], "arrang": 11, "art": [5, 11], "articl": [5, 11], "artifact": [5, 11], "artisan": 11, "artist": [5, 11], "asc": 1, "ascend": 1, "ask": 7, "asset": 6, "assign": [1, 5, 7, 11], "assignfast": [5, 11], "associ": [1, 5, 11], "assum": [1, 7], "attach": [1, 11], "attempt": 1, "attributednam": 11, "audienc": 11, "audio": [5, 11], "audiorecord": 11, "audiovisu": 11, "augment": 11, "austen": [5, 11], "authent": [], "author": [1, 11], "authorofafterword": 11, "authorofforeword": 11, "authorofintroduct": 11, "auto": 2, "autom": 8, "automat": [1, 5, 6, 7, 11], "avail": [1, 3, 6, 7, 11], "avatar": 1, "avoid": [1, 2, 6], "aw": 7, "awar": [5, 7, 11], "award": [1, 11], "awkward": 1, "b": [1, 6, 11], "b144": 1, "back": [2, 3, 6], "backend": 5, "background": [1, 7], "bad": 1, "bar": [7, 11], "bare": 1, "base": [1, 5, 11], "bash": [3, 6, 7, 10], "bashrc": 7, "basic": 11, "bearer": 1, "beat": 7, "becaus": [1, 2, 5, 6, 7, 11], "becom": 1, "been": [1, 2, 5, 6, 7, 11], "befor": [1, 3, 5, 6, 7, 11], "begin": [6, 7], "being": [1, 2, 7, 11], "belong": [1, 5, 11], "below": [1, 7, 10, 11], "beneath": 11, "best": [2, 7, 11], "bestmatch": 2, "beta": 6, "beta3": 8, "beta4": 8, "beta5": 8, "beta6": [6, 8], "beta7": 8, "beta8": [0, 8], "between": [1, 5, 6, 11], "beyond": [5, 11], "bibliographi": 11, "big": 7, "bin": 7, "binari": 1, "bind": [7, 10], "blob": [], "block": 7, "blogpost": 11, "blueski": 2, "book": [5, 11], "booksect": 11, "boolean": [1, 5, 11], "boot": 7, "both": [1, 2, 5, 11], "break": [1, 7], "broke": 2, "browser": [6, 10], "bucket": 1, "bug": [2, 6], "bugfix": 6, "build": [2, 5, 8], "builder": 5, "built": [0, 1, 7, 12], "bulk": [3, 8], "bundl": 6, "c": [1, 6, 7], "cach": 7, "call": [1, 5, 7, 11], "callback": 1, "can": [2, 3, 5, 6, 7, 10, 11, 12], "cannot": [1, 6], "carri": 1, "case": [1, 5, 6, 11], "catalog": 11, "caution": [3, 6, 10], "cc": 11, "cd": [6, 7, 10], "central": [1, 5, 6, 11], "cern": [1, 12], "certain": 1, "cfg": 1, "ch": [1, 12], "chanc": 1, "chang": [5, 7, 8, 10, 11], "change_m": 7, "chapter": [5, 11], "chart": 11, "chatgpt": 11, "check": [1, 5, 7], "checksum": 1, "children": 1, "chmod": 7, "choos": [2, 11], "choreograph": 11, "chose": 7, "chrome": 6, "chronolog": [5, 11], "cinematograph": 11, "class": [1, 5], "clean": 6, "clearer": 2, "cli": [1, 2, 8, 10], "click": 7, "client": [1, 6], "clone": [6, 8], "close": 1, "cm": 11, "co": 7, "coar": 11, "code": [8, 10, 11], "codebas": 10, "coderepositori": 11, "cog": 7, "collabor": [0, 11], "collect": [2, 3, 6, 8, 10], "collection_id": 1, "collection_slug": 1, "collection_vis": 1, "collector": 11, "collid": 1, "com": [1, 5, 7, 10, 11], "command": [1, 2, 6, 8, 10], "commerci": 11, "commiss": [5, 11], "commit": 1, "committe": [5, 11], "committeechair": 11, "committeememb": 11, "common": [0, 2, 5, 6, 10, 11, 12], "commons_api_token": [1, 7], "commons_group_descript": 1, "commons_group_id": 1, "commons_group_nam": 1, "commons_group_vis": 1, "commons_inst": 1, "commons_search_api_token": 7, "commun": [1, 2, 10], "compar": 11, "comparison": 2, "compil": 7, "complement": [5, 11], "complet": [1, 5, 6, 10, 11], "compon": [1, 2, 5, 6], "compos": [6, 8, 11], "compress": 1, "comput": 7, "computationalmodel": 11, "computationalnotebook": 11, "condit": 11, "conductor": 11, "conf": 6, "confer": [5, 11], "conferencepap": 11, "conferencepost": 11, "conferenceproceed": 11, "config": [1, 5, 7], "configur": [6, 8], "confirm": 1, "conflict": [1, 2], "conform": 1, "confus": [1, 2, 11], "connect": 1, "consid": [1, 6], "constrain": [5, 11], "consult": 11, "contactperson": 11, "contain": [1, 2, 5, 6, 8, 10, 11], "container": 8, "content": [1, 10, 11], "continu": 6, "contribuor": 11, "contribut": 11, "contributor": 8, "control": [1, 2, 5, 8], "conveni": [1, 7], "convert": [5, 11], "coordin": 11, "copi": [6, 7, 10], "copyright": 8, "core": [3, 8, 10], "corpor": [1, 5, 11], "correct": [1, 3, 7, 10, 11], "correctli": 2, "correspond": [1, 3, 5, 11], "corrupt": 1, "could": [1, 2], "count": 3, "cours": [5, 7, 11], "cover": [5, 11], "cpython": 7, "creat": [2, 3, 5, 6, 11], "creatibutorsfield": 2, "creation": [1, 2, 5], "creativ": 11, "creativecommon": 11, "creator": [1, 8], "credit": 11, "csl": 11, "ctrl": [6, 7], "curat": 1, "curation_polici": 1, "curl": 7, "current": [1, 2, 6, 7, 11], "curriculum": 11, "custom": [2, 6, 7, 8, 12], "custom_field": 1, "custom_pdf_viewer_j": 6, "d": [6, 7, 10], "daemon": 7, "dashboard": [2, 7, 10], "data": [2, 3, 6, 7, 8, 10, 11], "databas": [1, 3, 5, 11], "datacit": 11, "datacollector": 11, "datacur": 11, "datamanag": 11, "datamanagementplan": 11, "dataset": 11, "date": [1, 2, 5, 7, 11], "datetim": [5, 11], "db": 7, "de": 11, "debug": [6, 10], "declar": [1, 6], "dedicate": 11, "deeper": 8, "default": [1, 2, 5, 6, 7, 11], "defin": [5, 6, 7, 11], "definit": 1, "delai": 1, "delet": [3, 6], "deletion_statu": 1, "demo": 7, "depart": [5, 11], "depend": [1, 6, 7, 10], "deploi": [3, 6], "deploy": 6, "deposit": [8, 10, 11], "depositor": 11, "depth": 8, "desc": 1, "descend": 1, "describ": [1, 5, 6, 10, 11], "descript": [1, 11], "descriptor": [5, 11], "design": 11, "desir": [1, 2, 5, 11], "desktop": 7, "despair": 10, "destroi": [3, 7, 10], "detail": [1, 2, 8, 10, 11], "detect": 1, "determin": [5, 11], "dev": [1, 7, 10], "develop": [3, 7, 8, 12], "developmentstatu": 11, "diagram": 11, "dict": 6, "dictionari": [1, 6], "did": 1, "differ": [1, 5, 10, 11], "differenti": [5, 11], "difficult": 1, "dig": 8, "digit": 11, "direction": 5, "directli": [1, 6, 7], "director": 11, "directori": 7, "disambigu": 1, "discover": 1, "discoveri": [5, 11], "discuss": [1, 11], "displai": [2, 3], "dissert": [5, 11], "distinct": [5, 6, 11], "distress": [5, 11], "distribut": [1, 11], "distributor": 11, "divers": 11, "divid": [2, 3, 5, 11], "divis": [2, 11], "dnb": 11, "do": [1, 6, 7, 10, 11], "doc": [1, 6, 7, 12], "doc_count": 1, "docker": [3, 6, 8], "dockerfil": 7, "document": [1, 2, 3, 5, 6, 7, 11], "documentari": 11, "doe": [2, 5, 6, 7, 11], "doi": [1, 2], "domain": [5, 11], "don": 10, "done": [6, 7], "donor": 11, "down": [7, 10], "download": [1, 5, 7, 11], "dphil": [5, 11], "draft": [1, 5], "drafter": 11, "drawn": 11, "driver": 7, "dummi": 7, "duplic": [], "dure": [1, 2, 3, 5, 6, 7, 10, 11], "dynam": [3, 6], "e": [1, 2, 3, 5, 6, 10, 11], "e2": 6, "each": [1, 2, 5, 6, 7, 10, 11], "earlier": 1, "eas": 11, "easi": 7, "easili": 11, "edit": [1, 2], "editor": 11, "editori": 11, "edtf": 1, "educ": [5, 11], "effect": [5, 6, 11], "effici": [5, 11], "eight": 11, "either": [1, 3, 7, 10, 11], "electron": 11, "els": 7, "elsewher": 11, "email": [1, 3, 7, 10, 11], "emailbackend": 5, "embargo": 11, "emit": 5, "emploi": [1, 5, 6, 11], "empti": [1, 2], "emul": 6, "en": 11, "enabl": [5, 11], "encompass": 11, "encount": 1, "encourag": [5, 11], "end": [1, 2, 6], "endpoint": [], "eng": 11, "engag": 11, "engin": [7, 11], "english": 11, "enough": 7, "ensur": [1, 6, 10], "enter": [6, 7, 10], "entir": 1, "entiti": 1, "entri": [5, 11], "env": [7, 10], "environ": [1, 6, 8, 10], "er": 11, "error": [2, 6], "especi": [2, 6, 7], "essai": 11, "establish": 1, "etc": [1, 3, 5, 6, 10, 11], "eurepo": 11, "europ": [5, 11], "even": [1, 2, 5, 11], "event": [2, 3, 5, 7, 11], "eventu": 1, "everi": 6, "exactli": [1, 11], "examin": 11, "exampl": [1, 3, 5, 6, 7, 8], "exce": 1, "except": [1, 6, 11], "exec": [3, 6, 7, 10], "exist": [1, 2, 3, 6, 7], "expand": 11, "explain": [7, 10], "export": [3, 11], "extend": 1, "extens": [5, 6, 7], "extern": 11, "extra": 7, "extrem": 3, "f": 7, "facet": [5, 11], "facilit": 11, "fall": 11, "fals": 1, "famili": 2, "familiar": 1, "family_nam": 11, "fast": 5, "favour": 11, "featur": [1, 6, 11], "feedback": 10, "field": [1, 2, 8], "figur": 11, "file": [0, 3, 5, 8, 11], "file1": 1, "file2": 1, "file3": 1, "filenam": 1, "fill": [2, 11], "filter": 1, "final": [1, 7], "find": [2, 3, 6, 7, 10, 11], "first": [1, 3, 6, 7, 10], "firstrecordcreatednotificationbuild": 5, "firstrecordcreatednotificationservic": 5, "firstrecordpublishednotificationbuild": 5, "fit": 11, "fix": [2, 6], "fixtur": [6, 7, 10], "flag": [5, 7, 11], "flask": [3, 5, 6, 8], "flat": 11, "flexibli": [5, 11], "flow": 6, "folder": [1, 7, 10], "follow": [1, 3, 5, 6, 7, 10, 11], "foo": 11, "forbidden": 1, "forc": [6, 7, 11], "fork": [7, 8], "form": [1, 2, 8, 10, 11], "format": [1, 11], "former": 1, "formerown": 11, "formgenr": [5, 11], "forthcom": 1, "found": [1, 3, 5, 11, 12], "four": [1, 6], "fraction": 1, "fragil": 1, "free": [1, 5, 7, 11], "freecodecamp": 7, "from": [1, 2, 3, 5, 6, 7, 10], "frontend": 7, "full": [1, 2, 7, 8, 11], "full_nam": 1, "function": 2, "fund": [5, 11], "funder": 1, "fundref": 11, "further": [3, 7, 10], "futur": [1, 2, 11], "g": [1, 2, 3, 5, 6, 10, 11], "gatewai": 1, "gender": 11, "gener": [1, 3, 5, 6, 7, 11], "geograph": [5, 11], "geometri": 11, "geonam": 11, "geopattern": 6, "get": [2, 7], "gh_page": 6, "git": 7, "github": [2, 6, 7, 10, 11], "gitlab": 6, "given": 2, "given_nam": 11, "gnd_node": 11, "gninx": 7, "good": 7, "grant": [1, 5, 11], "greatli": 11, "grep": 3, "group": [3, 6, 7, 8, 10, 11], "group_collect": 1, "group_collections_metadata_endpoint": 1, "group_identifi": [5, 11], "group_nam": [5, 11], "guarante": 7, "guid": 7, "h1": 11, "ha": [1, 2, 5, 6, 7, 11], "handl": 2, "have": [2, 5, 6, 7, 10, 11], "hc": 8, "hcommon": [1, 5, 11], "head": 5, "header": 2, "held": 1, "help": [1, 3, 5, 6, 7, 11], "here": [1, 5, 7, 10, 11], "hidden": 2, "hierarch": 11, "histor": [5, 11], "histori": [5, 6, 11], "historian": [5, 11], "hit": 1, "hold": [1, 5, 7, 11], "homoit0000669": [5, 11], "homosauru": 5, "hood": 1, "host": [5, 11], "hostinginstitut": 11, "hour": 10, "how": [3, 11], "how2shout": 7, "howev": [1, 11], "html": [5, 7, 11], "http": [1, 5, 6, 7, 10, 11, 12], "human": [1, 5, 11], "hyphen": [5, 7, 11], "i": [0, 2, 3, 5, 6, 10, 11, 12], "icon": 7, "id": [1, 2, 5, 11], "idea": 7, "ident": [1, 11], "identifi": [1, 2, 5, 8], "identifier_orcid": 11, "idp": 1, "ignor": 1, "illustr": 11, "imag": [1, 2, 6, 7, 11], "immedi": [1, 6, 11], "implement": [1, 8], "import": [3, 6, 7, 8, 10, 11], "import_data": 7, "impos": [5, 11], "imprint": 11, "includ": [0, 1, 2, 3, 5, 7, 10, 11, 12], "incomplet": 1, "increment": 6, "independ": 1, "index": [1, 3, 5, 7, 11], "indic": [1, 3, 10], "individu": [1, 7], "influenc": 11, "info": [5, 7, 11], "inform": [1, 6, 11, 12], "informationen": 11, "infrastructur": [2, 8], "ini": 7, "init": [6, 10], "initi": [1, 2, 6], "insert": [7, 10], "insid": [3, 6, 7, 10], "instal": [1, 2, 6, 8], "instanc": [0, 3, 7, 8, 10, 12], "instance_path": [7, 10], "instead": [1, 2, 6, 7], "institut": [1, 5, 11], "instruct": [5, 6, 8, 10, 11], "instructionalresourc": 11, "integ": [5, 11], "integr": [1, 6, 8, 11], "intend": [1, 5, 11], "intens": 1, "inter": [6, 10], "interact": 6, "interactiveresourc": 11, "interfac": [1, 7, 11], "intern": [5, 8, 11], "interpret": 7, "interrupt": 1, "intersex": [5, 11], "interview": 11, "interviewe": 11, "interviewrecord": 11, "interviewtranscript": 11, "introduc": [1, 6], "introduct": [5, 11], "invenio": [1, 2, 8, 10, 11], "invenio_": 7, "invenio_app": 7, "invenio_csrf_secret_salt": 7, "invenio_custom_pdf_view": 6, "invenio_datacite_password": 7, "invenio_group_collections_kcwork": 1, "invenio_instance_path": 7, "invenio_notif": 5, "invenio_record_importer_data_dir": 7, "invenio_record_importer_local_data_dir": 7, "invenio_search_domain": 7, "invenio_secret_kei": 7, "invenio_security_login_salt": 7, "invenio_site_api_url": 7, "invenio_site_ui_url": 7, "invenio_sqlalchemy_database_uri": 7, "inveniordm": [0, 3, 6, 7, 8], "inventor": 11, "invert": 2, "invit": 1, "invok": 3, "involv": [1, 2, 5, 6, 10, 11], "irrevoc": 1, "is_delet": 1, "is_select": 1, "isbn": [], "iscitedbi": 11, "iso": [5, 11], "issn": [], "issu": 11, "item": [5, 11], "item_index": 1, "its": [1, 2, 6, 7, 10, 11], "itself": [5, 11], "j": [2, 8], "jammi": 7, "jane": [5, 11], "janedo": 11, "javascript": 11, "jdoe": [1, 5, 11], "jest": 6, "jinja": 5, "john": [1, 5, 11], "journal": [5, 11], "journalarticl": 11, "json": [1, 3, 6, 7], "juror": 11, "just": 11, "kc": [1, 2, 3, 7, 8], "kc_usernam": [1, 5, 11], "kcr": [1, 7], "kcr_api": 7, "kcr_ui": 7, "kcwork": [1, 2, 7, 8], "keep": [6, 7, 11], "kei": 1, "keyboard": 2, "kind": 1, "kingston": [5, 11], "know": 1, "knowldg": 10, "knowledg": [0, 1, 2, 6, 10, 11, 12], "knowledgecommon": 1, "label": [1, 2, 5, 11], "labor": 11, "lago": 11, "lambda": 7, "lang": 11, "languag": 11, "larg": 2, "last": [1, 3, 5, 6, 11], "later": 1, "latest": [1, 6], "latin": [5, 11], "launch": 11, "layout": 2, "lcsh": [5, 11], "lcsh2fast": [5, 11], "lead": 2, "least": [1, 2, 7], "leav": 6, "left": 1, "leftov": 6, "legaci": [3, 8], "legalcod": 11, "legalcom": 11, "legalrespons": 11, "less": [2, 5, 6, 11], "lessonplan": 11, "level": [1, 5, 11], "lib": 7, "licens": [0, 11], "license": 11, "like": [1, 6, 7, 11], "likewis": 6, "line": [2, 3, 10], "link": [1, 2, 3, 5, 11], "linux": 6, "list": [1, 3, 5, 6, 11], "literatur": [5, 11], "live": [7, 10], "load": 3, "local": [1, 3, 6, 8], "localhost": [7, 10], "locat": [1, 5, 6, 11], "lock": 7, "log": [2, 5], "loglevel": 7, "logo": [1, 2], "long": [1, 2, 6, 7], "longer": 1, "look": 1, "lost": 3, "lowercas": [5, 11], "lt": 7, "lyricist": 11, "m": 6, "ma": [5, 11], "mac": 7, "machin": 7, "made": [1, 2, 6, 11], "magazin": 11, "magazinearticl": 11, "mai": [1, 5, 6, 7, 10, 11], "mail": 5, "main": [2, 3, 5, 6, 10, 11], "maintain": 11, "make": [6, 7, 10], "manag": [1, 2, 6, 7, 11], "mani": 11, "manual": 7, "manufactur": 11, "map": 11, "markdown": 5, "match": [1, 2, 7, 11], "materi": [5, 11], "matter": [5, 11], "maximum": 1, "md": [2, 6], "mean": [2, 5, 6, 7, 11], "meantim": 6, "mechan": [1, 5, 11], "media": 2, "meet": [5, 11], "member": [1, 2], "member_polici": 1, "membership": 1, "memori": 7, "mention": 11, "menu": 2, "merg": 6, "mesh": [0, 10], "messag": [1, 2], "met": 11, "metadata": [2, 3, 8], "metadata_field": 8, "method": 11, "michigan": 11, "middl": 3, "might": [1, 2, 5, 7, 11], "migrant": [5, 11], "migrat": [5, 11], "mind": 1, "minim": 1, "minor": 6, "mint": [1, 11], "minut": [1, 7], "miss": [1, 2], "mit": 0, "mla": [5, 11], "modal": 2, "moder": 11, "moderatorrolerecipi": 5, "modern": [5, 11], "modif": 1, "modifi": [1, 2, 6], "modul": [1, 2, 8, 10], "modular": 10, "monograph": 11, "monotask": 6, "more": [1, 2, 5, 6, 11], "most": [1, 2, 6, 7], "mount": [7, 10], "move": 2, "mq": 7, "msu": 11, "much": [5, 11], "multi": 1, "multi_statu": 1, "multidisciplinari": 11, "multipart": 1, "multipl": [1, 2], "music": 11, "musicalrecord": 11, "must": [1, 5, 6, 7, 11], "my": [1, 11], "myapitoken": 7, "mycours": 11, "myevent": 11, "myinveniodatacitepassword": 7, "mysteri": 1, "mytoken": 7, "myusernam": 1, "n": 1, "na": 2, "name": [2, 3, 5, 7, 10, 11], "name_parts_loc": 2, "namespac": [5, 11], "natur": 1, "navig": [2, 6, 7, 10], "nc": 11, "necessari": [2, 7, 10], "need": [1, 3, 8, 10, 11], "neither": [1, 11], "net": 11, "network": 1, "new": [2, 5, 7, 11], "new_commons_group_id": 1, "new_commons_group_nam": 1, "newer": 7, "newest": [1, 2], "newli": [5, 11], "newlin": 7, "newspap": 11, "newspaperarticl": 11, "next": [1, 6, 7], "nginx": 10, "node": 8, "node_modul": 6, "non": 1, "none": 1, "noowneravail": 1, "nor": [1, 11], "normal": [1, 6, 7, 10], "note": [1, 3, 6, 10, 11], "notic": 1, "notif": 8, "notificationop": 5, "notifications_moderator_rol": 5, "now": [1, 2, 7, 10], "npm": 6, "number": [1, 3, 5, 8, 11], "numer": 1, "nvm": 8, "o": 7, "oai": 1, "oauth": 1, "object": [5, 6], "obtain": [1, 7], "occup": 1, "occupi": 6, "occur": 1, "oclc": [5, 11], "octet": 1, "octob": 11, "often": [6, 7], "ok": 1, "old": [1, 7], "old_commons_group_id": 1, "oldest": 1, "onc": [1, 6, 7], "one": [1, 5, 7, 10, 11], "ongo": 1, "onli": [2, 3, 5, 6, 8, 11], "onlinepubl": 11, "onto": 10, "open": [1, 7, 11], "openfund": 11, "opengraph": 2, "opensearch": [3, 7, 10], "oper": [1, 5, 7, 10], "opt": [6, 7, 10], "option": [1, 2, 3, 5, 6, 10, 11], "orcid": [1, 2, 5], "order": [1, 2, 6], "org": [1, 5, 6, 7, 11], "organ": [1, 5], "organiz": [5, 11], "origin": [1, 2, 6, 11], "other": [1, 2, 5, 6, 7, 11], "otherwis": [7, 11], "our": 11, "out": [1, 7, 11], "output": 6, "outsid": 1, "over": 6, "overrid": [1, 6, 11], "overridden": 6, "overwhelm": 11, "own": [1, 6, 7], "owned_bi": 1, "owner": 11, "ownership": [5, 11], "p": [1, 3, 10, 11], "packag": [3, 7, 10, 11], "page": [1, 2, 6, 8, 10, 11], "panda": 1, "panel": 7, "paper": [5, 11], "paramet": [], "parent": [1, 7, 10, 11], "part": [0, 1, 2, 3, 5, 11], "particular": [7, 10], "particularli": [1, 6], "partli": 1, "pass": 1, "password": [3, 7, 10], "patch": 6, "patent": 11, "path": [1, 5, 11], "patienc": 10, "pdf": [1, 5, 11], "pdfj": 6, "pedagogi": 11, "peerreview": 11, "pend": 2, "perform": [1, 7, 11], "period": [1, 11], "perman": 1, "permiss": 2, "persist": [5, 6, 7, 11], "person": [5, 11], "person_or_org": [5, 11], "personnel": 1, "pgadmin": [7, 10], "pgadmin_default_email": 7, "pgadmin_default_password": 7, "phd": [5, 11], "photograph": 11, "physicalobject": 11, "pick": 6, "pid": [1, 6, 7, 10, 11], "pidfil": 7, "pin": 2, "pip": [6, 7], "pipenv": [6, 10], "pipfil": 6, "place": [1, 5, 11], "placehold": 1, "placeholder_avatar": 1, "plain": 1, "plaintext": 5, "platform": 2, "pleas": 1, "pmh": 1, "png": 1, "podcastepisod": 11, "poeticwork": 11, "poetri": [5, 11], "point": [1, 2, 11], "polici": 1, "popul": 1, "possess": 1, "possibl": [1, 6, 11], "post": [], "postgres_db": 7, "postgres_password": 7, "postgres_us": 7, "postgresql": 7, "potenti": [5, 11], "practic": 6, "pre": [1, 11], "prefix": [5, 11], "preprint": 11, "present": [2, 5, 11], "presentationtext": 11, "preserv": [5, 11], "press": 7, "prev": 1, "prevent": [1, 11], "previou": 1, "previous": [2, 5, 11], "primari": [2, 5], "primarili": [3, 5, 11], "principl": 1, "print": [7, 11], "printer": 11, "prior": [5, 7, 11], "privat": [7, 10], "privileg": 1, "problem": 6, "problemat": [5, 11], "proce": 7, "proceed": [5, 11], "process": [1, 3, 11], "produc": [2, 3, 5, 11], "product": [3, 5, 6, 11], "professionel": 11, "profil": [1, 2, 5, 11], "program": 11, "programminglanguag": 11, "project": [5, 6, 7, 11], "projectorteamlead": 11, "projectorteammanag": 11, "projectorteammemb": 11, "proper": [2, 5, 11], "properti": [1, 2, 11], "provid": [1, 3, 5, 6, 7, 10, 11], "provision": [10, 11], "prune": 6, "psychologi": 11, "psycopg2": 7, "public": [1, 2, 5, 11], "public_memb": 1, "publication_d": [1, 11], "publish": [1, 2, 5, 11], "pull": [6, 7], "purg": 1, "purpos": [5, 11], "push": 6, "put": [1, 7], "py": [3, 6], "pypi": 7, "pyproject": 6, "pytest": 6, "python": [8, 10, 11], "python3": 7, "python_local_git_packages_path": 7, "python_local_site_packages_path": 7, "queri": 2, "question": 1, "queue": 1, "quick": 10, "quickli": 7, "quickstart": 8, "rabbitmq": 7, "race": 11, "rais": 1, "random": [2, 7], "rang": 11, "rather": [1, 7], "rdm": [7, 10, 11], "rdmrecord": 5, "re": [1, 6, 7, 11], "reach": 6, "react": 6, "read": [1, 3], "readabl": [1, 5, 6, 11], "reader": [1, 5, 11], "readi": 6, "readm": [2, 6], "real": 7, "reason": [1, 7, 11], "rebuild": 7, "rebuilt": 6, "receiv": [1, 5, 7], "recent": [2, 6], "recipi": 5, "recogn": 11, "recommend": [1, 7], "record": [1, 2, 3, 6, 8, 10], "record_id": 1, "record_polici": 1, "record_url": 1, "recreat": [6, 7], "recurs": [6, 10], "redi": 7, "redis_domain": 7, "redund": [1, 6, 10], "refactor": 2, "refer": [1, 6, 7, 8, 10, 11], "refere": 11, "reflect": [1, 6, 10], "refresh": 6, "refuge": [5, 11], "regard": 1, "regardless": 7, "regist": 1, "registrationag": 11, "registrationauthor": 11, "registri": 11, "reject": 1, "rel": [1, 5, 11], "relat": [6, 11], "related_identifi": 11, "relatedperson": 11, "relation_typ": 11, "releas": [0, 7], "relev": [1, 11], "reliabl": [1, 7], "reload": [6, 7, 10], "remain": 1, "remot": [2, 3, 6, 7, 10, 11], "remov": [1, 2], "renam": 1, "repeat": 1, "replac": [1, 7], "repo": 6, "report": 11, "repositori": [0, 6, 7, 11], "repres": [1, 6], "represent": 1, "request": [2, 6, 7], "requir": [5, 6, 8, 10, 11], "research": [0, 1, 5, 10, 11], "researchgroup": 11, "researchparticip": 11, "reserv": 1, "resid": [5, 11], "resourc": [1, 2, 7, 8, 10], "resource_typ": 11, "resourcetypegener": 11, "respect": 6, "respond": 6, "respons": 7, "rest": [7, 8, 10], "rest_api_award": 1, "rest_api_commun": 1, "rest_api_drafts_record": 1, "rest_api_fund": 1, "rest_api_group": 1, "rest_api_index": 1, "rest_api_memb": 1, "rest_api_nam": 1, "rest_api_oaipmh_set": 1, "rest_api_request": 1, "rest_api_review": 1, "rest_api_statist": 1, "rest_api_us": 1, "rest_api_vocabulari": 1, "restart": [6, 7, 10], "restor": 1, "restrict": [1, 11], "result": [1, 2], "retriev": [], "return": 1, "review": [1, 11], "review_polici": 1, "review_requir": 1, "revision_id": 1, "right": [2, 7, 11], "rightshold": 11, "robust": 1, "role": [1, 5, 7, 8], "root": [6, 7], "rout": 2, "rule": 1, "run": [5, 7, 8, 10], "runner": 6, "same": [1, 5, 7, 11], "sandbox": 11, "save": 5, "schema": [1, 2, 8], "scheme": [1, 5, 8], "scholarli": 11, "scienc": [5, 11], "screenplayauthor": 11, "script": [6, 10], "search": [1, 2, 3, 10, 11], "second": [1, 5, 11], "secret": 7, "section": 11, "secur": [1, 7], "see": [0, 6, 7, 10, 11], "seen": 7, "segment": 1, "select": [2, 11], "selector": 2, "selenium": 6, "self": [1, 2], "self_html": 1, "semant": [5, 6], "semver": 6, "send": 5, "sent": [1, 5], "separ": [1, 6, 7, 10], "seri": [5, 11], "serial": 3, "series_titl": [5, 11], "series_volum": [5, 11], "serv": [1, 2, 7, 10, 11], "server": [6, 10], "serverless": 7, "servic": [2, 3, 5, 8, 11], "services_setup": 10, "session": 7, "set": [1, 2, 5, 6, 7, 10, 11], "settings_html": 1, "setup": [6, 7, 8], "sever": [1, 7], "sexual": 11, "sh": [6, 7, 10], "shape": 1, "share": [0, 1, 2, 7, 11], "shell": 7, "short": [1, 11], "should": [1, 2, 5, 6, 7, 10, 11], "side": 11, "sidebar": 2, "signal": [1, 5], "similarli": [5, 10, 11], "simpl": [5, 11], "simpli": [1, 6, 7], "sinc": [1, 2, 3, 6, 7], "singl": [1, 3, 6, 11], "site": [2, 3, 7, 8, 10], "size": [1, 7, 11], "sl": 7, "slackbot": 7, "slide": 11, "slider": 7, "slight": 1, "slug": 1, "so": [1, 2, 3, 5, 6, 7, 10, 11], "social": [1, 2], "soft": 1, "softwar": [5, 11], "solut": 7, "solv": 2, "some": [2, 5, 6, 10, 11], "someth": 7, "sometim": [2, 6], "sort": [2, 11], "sortbi": 1, "sourc": [6, 7, 10], "speaker": 11, "specif": [2, 5, 7, 11], "specifi": [1, 7], "sponsor": [5, 11], "squash": 6, "src": 6, "sso_saml_idp": 1, "stage": [3, 6, 7], "stamp": 7, "stand": 6, "standalon": 7, "standard": [5, 11], "standardisierung": 11, "start": [1, 6], "stat": [3, 5, 11], "state": 11, "stateless": 1, "statement": 10, "static": [2, 10], "statist": 1, "statu": [5, 11], "stdout": 7, "step": [1, 6, 7, 10], "still": 1, "stop": [6, 7, 10], "storag": 1, "store": [0, 1, 3, 5, 6, 7, 11], "str": 1, "stream": 1, "streamlin": 8, "strict_valid": 1, "strictli": [], "string": [1, 2, 5, 11], "strongli": [5, 11], "structur": [7, 11], "studi": 1, "style": 6, "sub": [3, 5, 7, 11], "subfold": 1, "submiss": [1, 2], "submit": [1, 2], "submitt": [5, 11], "submodul": 10, "subsequ": 1, "substant": [5, 11], "subtitl": 11, "subtyp": 11, "succe": 1, "succeed": 1, "successfulli": 1, "sudo": 7, "suffici": 1, "suffix": 6, "suggest": [5, 11], "suit": 6, "suitabl": 3, "superus": 7, "supervisor": 11, "supplement": [5, 11], "suppli": [1, 7], "support": [1, 6, 7, 11], "sur": 7, "sure": [6, 7], "susequ": 1, "syllabi": [5, 11], "syllabu": 11, "sync": 2, "syntax": 7, "synthet": 3, "system": [0, 1, 2, 3, 6, 10], "systemd": 7, "t": [7, 10], "tab": 7, "tabl": 7, "tag": [5, 11], "tail": 7, "tailor": 11, "take": [6, 7, 10], "taken": [1, 11], "task": [1, 6], "taxonomi": 11, "teach": 11, "technic": [2, 11], "technicalstandard": 11, "technisch": 11, "tell": 7, "templat": 8, "temporari": 6, "ten": 11, "term": [1, 11], "termin": [6, 7], "test": [7, 8, 10, 11], "text": [1, 11], "textdocu": 11, "than": [1, 2, 7, 11], "thei": [1, 2, 5, 6, 11], "them": [1, 2, 6, 7, 11], "theses": [5, 11], "thesi": [5, 11], "thi": [1, 2, 3, 5, 6, 7, 10, 11], "thing": 2, "those": [1, 5, 6, 7, 10, 11], "though": [1, 6], "three": [1, 7], "through": [1, 6], "time": [5, 6, 7, 10, 11], "timeout": 1, "titl": [1, 2, 5, 11], "tmp": [6, 7, 10], "token": 7, "token_hex": 7, "token_nam": 1, "toml": 6, "tool": [0, 5, 8, 11], "top": [1, 5, 7, 11], "topic": [5, 11], "toronto": [5, 11], "total": [1, 5, 11], "total_volum": 11, "track": 5, "transcrib": 11, "transfer": 1, "translat": 11, "trigger": 1, "true": [1, 5, 10, 11], "truli": 1, "try": [1, 6], "tweak": 2, "two": [1, 2, 5, 6, 7, 11], "txt": 0, "type": [1, 2, 5, 8], "typic": 1, "u": [5, 7, 11], "ubuntu": 7, "ui": [1, 2, 3, 5, 6, 7, 10], "ukranian": [5, 11], "ultim": 6, "unchang": 1, "under": [0, 1, 6, 7, 10, 11], "underli": 3, "uni": 5, "uniqu": 1, "unit": [5, 6], "univers": [5, 11], "unknown": [1, 2], "unless": [1, 6, 7, 10], "unlik": [5, 11], "unprocessableent": 1, "unpublish": [5, 11], "unread": 5, "until": [1, 6, 11], "up": [3, 6, 7, 10], "updat": [2, 3, 5, 8, 10, 11], "upload": [2, 6, 11], "upper": 1, "upstream": 8, "url": [1, 5, 11], "us": [2, 3, 5, 6, 8, 10, 11], "usag": [3, 5, 11], "useless": 2, "user": [2, 3, 6, 8, 11], "user_data_upd": 1, "user_object": 11, "user_profil": 11, "usermod": 7, "usernam": [1, 5], "usr": 7, "usual": [1, 6], "uuid": 1, "uwsgi": [6, 10], "uwsgi_api": 10, "uwsgi_rest": 7, "uwsgi_ui": [6, 7, 10], "v": [6, 7], "v1": [1, 11], "v16": 7, "v2": 7, "v3": [5, 11], "valid": [1, 5, 11], "valu": [1, 2, 5, 7, 11], "var": [7, 10], "variabl": [1, 5, 6], "variat": [5, 11], "varieti": [10, 11], "variou": [7, 10, 11], "veri": 6, "version": [0, 1, 2, 5, 8, 10, 11], "via": [5, 6, 7], "videorecord": 11, "view": [1, 2, 5, 6, 11], "virtual": 7, "virtualenv": 7, "visibl": [1, 2, 6, 11], "visualart": 11, "vocabulari": [1, 2, 8, 10], "volum": [5, 6, 7, 11], "voluntarili": [5, 11], "wa": [1, 2, 5, 11], "wai": [1, 5, 7, 11], "walk": 6, "want": [1, 5, 6, 7, 10, 11], "warn": [1, 3, 5, 6, 11], "watch": [6, 7], "watercolor": [5, 11], "we": [1, 6, 11], "web": [6, 7, 10], "webdriv": 6, "webhook": [1, 5], "webpack": [2, 6], "webpackthemebundl": 6, "websit": 1, "well": [1, 2, 5, 6, 7], "were": [1, 2, 5, 7, 11], "what": [6, 11], "when": [1, 2, 5, 6, 7, 10, 11], "whenev": [3, 6], "where": [1, 2, 6, 7, 10, 11], "wherev": 6, "whether": [1, 5], "which": [1, 2, 5, 6, 7, 10, 11], "whichev": 7, "while": [1, 6, 10, 11], "white": [5, 11], "whitepap": 11, "who": 11, "whole": [2, 5, 11], "whose": [1, 2], "why": 1, "wide": 11, "widget": 2, "wikidata": 11, "window": [6, 7], "wip": 6, "wish": 1, "wit": 11, "within": [1, 2, 5, 11], "without": [1, 6, 7, 11], "word": 2, "wordpress": [], "work": [0, 2, 5, 6, 10, 12], "worker": [1, 3, 6], "workflow": 11, "workingpap": 11, "workpackagelead": 11, "workshop": [5, 11], "worldcat": [5, 11], "would": [1, 2, 3, 5, 6, 7, 11], "wp": 1, "wrap": [2, 3], "wrapper": 1, "writerofaccompani": 11, "written": 7, "wsl2": 6, "www": [5, 7, 11], "x": [7, 11], "x86_64": 7, "y": 1, "ye": [1, 6], "yet": [1, 7], "yml": [6, 7, 10], "you": [1, 3, 5, 6, 7, 10, 11], "your": [1, 6], "zenodo": 11, "zip": 1, "zshrc": 7}, "titles": ["About", "API", "Changes", "CLI Commands", "Configuration of InvenioRDM", "Customizations to InvenioRDM", "Developing KCWorks", "In-depth Installation Instructions (NEEDS UPDATING)", "Welcome to the Knowledge Commons Works technical documentation!", "KCWorks Infrastructure", "Installation", "Metadata Schema, Vocabularies, and Identifiers", "Reference"], "titleterms": {"": 1, "0": [2, 7], "01": 2, "09": 2, "1": [2, 7, 10], "10": [2, 7], "11": 2, "12": 2, "16": 7, "17": 7, "18": 2, "2": [2, 10], "20": 7, "2024": 2, "2025": 2, "3": [2, 7, 10], "30": 2, "4": [2, 10], "5": [2, 10], "6": 10, "9": 7, "A": 1, "In": [5, 7], "The": [1, 6], "about": [0, 5, 7], "access": 1, "ad": 6, "add": 7, "addit": 7, "admin": [7, 10], "ai_usag": [5, 11], "all": 1, "an": [1, 6, 7], "api": [1, 5, 11], "app": 5, "applic": [7, 10], "asset": 10, "authent": [1, 5], "autom": 6, "basic": 6, "beta3": 2, "beta4": 2, "beta5": 2, "beta6": 2, "beta7": 2, "beta8": 2, "bodi": 1, "book_seri": [5, 11], "branch": 6, "build": [6, 7, 10], "bulk": 5, "can": 1, "celeri": 7, "cfg": 6, "chang": [1, 2, 6], "chapter_label": [5, 11], "cli": [3, 7], "clone": [7, 10], "code": [1, 6, 7], "collect": [1, 5, 11], "collis": 1, "command": [3, 7], "commit": 6, "committee_deposit": [5, 11], "common": [1, 7, 8], "commons_domain": [5, 11], "commons_search_recid": [5, 11], "commons_search_upd": [5, 11], "commun": 5, "compos": [7, 10], "configur": [1, 4, 7, 10], "contain": [3, 7], "container": 7, "content": [5, 8], "content_warn": [5, 11], "context": 7, "contributor": [5, 11], "control": [6, 7, 10, 11], "copyright": 0, "core": [5, 11], "course_titl": [5, 11], "creat": [1, 7, 10], "creation": 11, "creator": [5, 11], "credenti": 7, "css": 6, "custom": [3, 5, 11], "custom_field": [5, 11], "data": [1, 5], "databas": [7, 10], "deeper": 6, "degre": [5, 11], "delet": 1, "deposit": 5, "deprec": 11, "depth": 7, "detail": 5, "develop": [6, 10], "dig": 6, "disciplin": [5, 11], "docker": [7, 10], "document": [8, 12], "doe": 1, "doi": 11, "draft": [], "duplic": 1, "edit": [5, 11], "email": 5, "enabl": 7, "endpoint": 1, "ensur": 7, "entri": 6, "environ": 7, "error": [1, 7], "event": 1, "exampl": 11, "extern": 6, "fail": 1, "fast": [6, 11], "field": [5, 11], "file": [1, 6, 7, 10], "file_loc": [5, 11], "file_pid": [5, 11], "first": 5, "fix": 7, "flask": 10, "fly": 6, "folder": 6, "fork": 5, "form": 5, "found": 7, "framework": 5, "from": 11, "full": 10, "funder": 11, "get": 1, "git": [6, 10], "gnd": 11, "grid": 11, "group": [1, 5], "groups_for_deposit": [5, 11], "handl": [1, 11], "happen": 1, "have": 1, "hc": [5, 11], "hclegaci": [5, 11], "head": 11, "header": 1, "homosauru": 11, "html": 6, "i": [1, 7], "identifi": 11, "implement": [5, 11], "import": [1, 5], "includ": 6, "indic": 7, "inform": 7, "infrastructur": 9, "initi": [7, 10], "instal": [7, 10], "instanc": [1, 6], "institution_depart": [5, 11], "instruct": 7, "integr": 5, "intern": 1, "invalid": 1, "invenio": [3, 5, 6, 7], "inveniordm": [1, 4, 5, 11, 12], "isbn": 11, "isni": 11, "issn": 11, "j": [6, 7], "javascript": 6, "json": 11, "just": 7, "kc": [5, 11], "kcr": [5, 11], "kcwork": [3, 5, 6, 9, 10, 11], "knowledg": [7, 8], "legaci": [5, 11], "limit": 6, "line": 7, "linux": 7, "local": [7, 10], "log": 7, "maco": 7, "make": 1, "malform": 1, "media": [5, 11], "meeting_organ": [5, 11], "metadata": [1, 5, 11], "metadata_field": [5, 11], "moder": 5, "modul": [5, 6, 7], "modular": 5, "name": [1, 6], "necessari": 1, "need": [6, 7], "new": [1, 6], "newli": 1, "nginx": 7, "node": [6, 7], "note": [5, 7], "notif": 5, "number": 6, "nvm": 7, "oai": 11, "object": [1, 11], "ofr": 11, "onli": 1, "orcid": 11, "organ": 11, "other": 10, "output": 7, "overrid": 5, "own": 10, "owner": 1, "ownership": 1, "packag": [5, 6], "page": 5, "pagin": 1, "paramet": 1, "patch": 1, "path": 7, "payload": 1, "peopl": 11, "permiss": 1, "pipenv": 7, "point": 6, "post": 1, "previously_publish": [5, 11], "primari": 11, "process": [6, 7], "project": 10, "project_titl": [5, 11], "provis": 5, "provision": 5, "publication_typ": [5, 11], "publication_url": [5, 11], "pyenv": 7, "python": [6, 7], "queri": 1, "queue": 7, "quickstart": 10, "rdm": 5, "rebuild": 6, "recommend": 11, "record": [5, 11], "record_change_d": [5, 11], "record_creation_d": [5, 11], "record_identifi": [5, 11], "refer": 12, "releas": 6, "remot": 5, "repositori": 10, "request": 1, "requir": [1, 7], "resourc": [5, 11], "respons": 1, "rest": 1, "retriev": [1, 11], "role": 11, "ror": 11, "rotat": 7, "run": [3, 6], "saml": [1, 5], "schema": [5, 11], "scheme": 11, "script": 7, "search": [5, 7], "secondari": 11, "sensit": 7, "server": 7, "servic": [7, 10], "setup": 10, "shutdown": 7, "site": [5, 6, 11], "slow": 6, "some": [1, 7], "sort": 1, "specif": 1, "sponsoring_institut": [5, 11], "standard": 7, "start": [7, 10], "startup": 7, "static": 6, "statu": 1, "step": [], "strategi": 6, "streamlin": 1, "subject": [5, 11], "submitter_affili": [5, 11], "submitter_email": [5, 11], "submitter_id": [5, 11], "submitter_org_membership": [5, 11], "submitter_usernam": [5, 11], "submodul": 6, "success": 1, "sync": 5, "system": [5, 7, 11], "tabl": [], "tag": 6, "task": 7, "technic": 8, "templat": [5, 6], "test": 6, "theme": 6, "time": 1, "token": 1, "tool": 7, "total_download": [5, 11], "total_view": [5, 11], "type": 11, "unsuccess": 1, "updat": [1, 6, 7], "upload": 1, "upstream": 6, "us": [1, 7], "user": [1, 5, 7, 10], "user_defined_tag": [5, 11], "usernam": 11, "uwsgi": 7, "variabl": 7, "version": [6, 7], "via": 1, "view": [7, 10], "vocabulari": [5, 11], "webhook": [], "welcom": 8, "what": 1, "who": 1, "work": [1, 7, 8, 11], "worker": 7, "your": [7, 10]}}) \ No newline at end of file +Search.setIndex({"alltitles": {"0.3.0-beta3 (2024-11-30)": [[3, "beta3-2024-11-30"]], "0.3.1-beta4 (2024-12-10)": [[3, "beta4-2024-12-10"]], "0.3.2-beta5 (2024-12-11)": [[3, "beta5-2024-12-11"]], "0.3.3-beta6 (2024-12-18)": [[3, "beta6-2024-12-18"]], "0.3.4-beta7 (2025-01-09)": [[3, "beta7-2025-01-09"]], "0.3.5-beta8 (2025-01-10)": [[3, "beta8-2025-01-10"]], "1. Clone the git repository": [[11, "clone-the-git-repository"]], "2. Create your configuration files": [[11, "create-your-configuration-files"]], "3. Start the docker-compose project": [[11, "start-the-docker-compose-project"]], "4. Initialize the database and other services, and build asset files": [[11, "initialize-the-database-and-other-services-and-build-asset-files"]], "5. Create your own admin user": [[11, "create-your-own-admin-user"]], "6. View the application": [[11, "view-the-application"]], "A successful import response": [[1, "a-successful-import-response"]], "API": [[1, "api"]], "About": [[0, "about"]], "Add and Configure an Environment File": [[8, "add-and-configure-an-environment-file"]], "Adding new entry points": [[7, "adding-new-entry-points"]], "Adding new node.js packages to be included": [[7, "adding-new-node-js-packages-to-be-included"]], "Additional environment variables with sensitive information": [[8, "additional-environment-variables-with-sensitive-information"]], "Additional required environment variables with paths on your local file system": [[8, "additional-required-environment-variables-with-paths-on-your-local-file-system"]], "An unsuccessful import response": [[1, "an-unsuccessful-import-response"]], "Attaching configuration to the service": [[2, "attaching-configuration-to-the-service"]], "Augmented RecordService": [[2, "augmented-recordservice"]], "BaseService": [[2, "baseservice"]], "BaseServiceComponent": [[2, "baseservicecomponent"]], "Build and Configure the Containerized Services": [[8, "build-and-configure-the-containerized-services"]], "Build and start the containers": [[8, "build-and-start-the-containers"]], "Bulk Record Import (invenio-record-importer-kcworks)": [[6, "bulk-record-import-invenio-record-importer-kcworks"]], "CLI Commands": [[4, "cli-commands"]], "Changes": [[3, "changes"]], "Changes to external python modules (including Invenio modules)": [[7, "changes-to-external-python-modules-including-invenio-modules"]], "Changes to html template files": [[7, "changes-to-html-template-files"]], "Changes to invenio.cfg": [[7, "changes-to-invenio-cfg"]], "Changes to python code in the site folder": [[7, "changes-to-python-code-in-the-site-folder"]], "Changes to static files": [[7, "changes-to-static-files"]], "Changes to theme (CSS) and javascript files": [[7, "changes-to-theme-css-and-javascript-files"]], "Changing the Group Ownership of a Collection (PATCH)": [[1, "changing-the-group-ownership-of-a-collection-patch"]], "Clone the knowledge-commons-works Code": [[8, "clone-the-knowledge-commons-works-code"]], "Collections": [[6, "collections"]], "Collections for KC Groups (invenio-group-collections-kcworks)": [[6, "collections-for-kc-groups-invenio-group-collections-kcworks"]], "Commit strategy": [[7, "commit-strategy"]], "Configuration of InvenioRDM": [[5, "configuration-of-inveniordm"]], "Content moderation notifications": [[6, "content-moderation-notifications"]], "Contents:": [[9, null]], "Controlled Vocabularies": [[12, "controlled-vocabularies"]], "Controlling containerized nginx server": [[8, "controlling-containerized-nginx-server"]], "Controlling just the containerized services": [[8, "controlling-just-the-containerized-services"]], "Controlling the Application Services": [[8, "controlling-the-application-services"]], "Controlling the KCWorks (Flask) application": [[11, "controlling-the-kcworks-flask-application"]], "Copyright": [[0, "copyright"]], "Create an admin user": [[8, "create-an-admin-user"]], "Create and initialize the database, search indices, and task queue": [[8, "create-and-initialize-the-database-search-indices-and-task-queue"]], "Creating a Collection for a Group (POST)": [[1, "creating-a-collection-for-a-group-post"]], "Creating a new Work via the InvenioRDM REST API": [[1, "creating-a-new-work-via-the-inveniordm-rest-api"]], "Creator/contributor roles": [[12, "creator-contributor-roles"]], "Customizations to InvenioRDM": [[6, "customizations-to-inveniordm"]], "DOI": [[12, "doi"]], "DOI (primary identifier)": [[12, "doi-primary-identifier"]], "Deleting a Group\u2019s Collection (DELETE)": [[1, "deleting-a-group-s-collection-delete"]], "Deposit Form Customizations": [[6, "deposit-form-customizations"]], "Developing KCWorks": [[7, "developing-kcworks"]], "Digging deeper": [[7, "digging-deeper"]], "Docker log rotation": [[8, "docker-log-rotation"]], "Email templates": [[6, "email-templates"]], "Endpoint configuration": [[1, "endpoint-configuration"]], "Ensure some version of python is installed": [[8, "ensure-some-version-of-python-is-installed"]], "Error responses": [[1, "error-responses"]], "Event timing": [[1, "event-timing"]], "Example metadata record": [[12, "example-metadata-record"]], "FAST": [[12, "fast"]], "File service configuration": [[2, "file-service-configuration"]], "Fixing docker-compose \u201cnot found\u201d error": [[8, "fixing-docker-compose-not-found-error"]], "Forked Core Invenio Modules": [[6, "forked-core-invenio-modules"]], "FromConfigSearchOptions": [[2, "fromconfigsearchoptions"]], "Full local development setup": [[11, "full-local-development-setup"]], "Funders": [[12, "funders"]], "GET requests": [[1, "get-requests"]], "GND": [[12, "gnd"], [12, "id2"]], "Git Branching Strategy": [[7, "git-branching-strategy"]], "Git Submodules": [[7, "git-submodules"]], "Grid (deprecated)": [[12, "grid-deprecated"]], "Group Collections API": [[1, "group-collections-api"]], "Group collection owner": [[1, "group-collection-owner"]], "HC Legacy Custom Fields": [[6, "hc-legacy-custom-fields"], [12, "hc-legacy-custom-fields"]], "Handle (secondary identifier)": [[12, "handle-secondary-identifier"]], "Handling collection name collisions": [[1, "handling-collection-name-collisions"]], "Handling deleted group collections": [[1, "handling-deleted-group-collections"]], "Handling group name changes": [[1, "handling-group-name-changes"]], "Homosaurus": [[12, "homosaurus"]], "ISBN (secondary identifier)": [[12, "isbn-secondary-identifier"]], "ISNI": [[12, "isni"]], "ISSN (secondary identifier)": [[12, "issn-secondary-identifier"]], "Identifier Schemes": [[12, "identifier-schemes"]], "In-app notifications": [[6, "in-app-notifications"]], "In-depth Installation Instructions (NEEDS UPDATING)": [[8, "in-depth-installation-instructions-needs-updating"]], "Install Docker 20.10.10+ and Docker-compose 1.17.0+": [[8, "install-docker-20-10-10-and-docker-compose-1-17-0"]], "Install Node.js and NVM": [[8, "install-node-js-and-nvm"]], "Install Python and Required Python Tools": [[8, "install-python-and-required-python-tools"]], "Install and enable Python 3.9.16": [[8, "install-and-enable-python-3-9-16"]], "Install pyenv and pipenv": [[8, "install-pyenv-and-pipenv"]], "Install the Invenio Python Modules": [[8, "install-the-invenio-python-modules"]], "Install the invenio-cli command line tool": [[8, "install-the-invenio-cli-command-line-tool"]], "Installation": [[11, "installation"]], "Integrations with KC": [[6, "integrations-with-kc"]], "InvenioRDM Documentation": [[13, "inveniordm-documentation"]], "InvenioRDM Services": [[2, "inveniordm-services"]], "InvenioRDM\u2019s Layered Architecture": [[2, "inveniordm-s-layered-architecture"]], "JSON object for record creation": [[12, "json-object-for-record-creation"]], "JSON object retrieved from the record API": [[12, "json-object-retrieved-from-the-record-api"]], "Javascript tests": [[7, "javascript-tests"]], "KC Search Provisioning (invenio-remote-api-provisioner)": [[6, "kc-search-provisioning-invenio-remote-api-provisioner"]], "KC Username (recommended)": [[12, "kc-username-recommended"]], "KCWorks Architecture": [[2, "kcworks-architecture"]], "KCWorks Custom CLI Commands": [[4, "kcworks-custom-cli-commands"]], "KCWorks Custom Fields (kcworks/site/metadata_fields)": [[6, "kcworks-custom-fields-kcworks-site-metadata-fields"], [12, "kcworks-custom-fields-kcworks-site-metadata-fields"]], "KCWorks Implementation of Core InvenioRDM Fields": [[12, "kcworks-implementation-of-core-inveniordm-fields"]], "KCWorks Infrastructure": [[10, "kcworks-infrastructure"]], "Linux": [[8, "linux"]], "Loading configuration from app config variables": [[2, "loading-configuration-from-app-config-variables"]], "MacOS": [[8, "macos"]], "Making duplicate import requests": [[1, "making-duplicate-import-requests"]], "Metadata Schema Customizations": [[6, "metadata-schema-customizations"]], "Metadata Schema, Vocabularies, and Identifiers": [[12, "metadata-schema-vocabularies-and-identifiers"]], "Modular Framework (invenio-modular-deposit-form)": [[6, "modular-framework-invenio-modular-deposit-form"]], "Modular Framework (invenio-modular-detail-page)": [[6, "modular-framework-invenio-modular-detail-page"]], "Naming Commits": [[7, "naming-commits"]], "Note about docker contexts": [[8, "note-about-docker-contexts"]], "Notes about Implementation of Core InvenioRDM Fields": [[6, "notes-about-implementation-of-core-inveniordm-fields"]], "Notifications": [[6, "notifications"]], "OAI (secondary identifier)": [[12, "oai-secondary-identifier"]], "OFR": [[12, "ofr"]], "ORCID (recommended)": [[12, "orcid-recommended"]], "Only some of the works to be imported failed": [[1, "only-some-of-the-works-to-be-imported-failed"]], "Organizations": [[12, "organizations"]], "Overrides in the KCWorks Package (kcworks/site)": [[6, "overrides-in-the-kcworks-package-kcworks-site"], [6, "id1"]], "POST requests": [[1, "post-requests"]], "Page templates": [[6, "page-templates"]], "Pagination": [[1, "pagination"]], "Payload objects": [[1, "payload-objects"]], "People": [[12, "people"]], "Permissions and access in newly created collections": [[1, "permissions-and-access-in-newly-created-collections"]], "Python tests": [[7, "python-tests"]], "Query parameters": [[1, "query-parameters"]], "Quickstart": [[11, "quickstart"]], "RDMRecordService": [[2, "rdmrecordservice"]], "RDMRecordService Components": [[2, "rdmrecordservice-components"]], "ROR (recommended)": [[12, "ror-recommended"]], "Rebuilding changed files on the fly (fast but limited)": [[7, "rebuilding-changed-files-on-the-fly-fast-but-limited"]], "Record Detail Page Customizations": [[6, "record-detail-page-customizations"]], "RecordService": [[2, "recordservice"]], "RecordService Components": [[2, "recordservice-components"]], "Reference": [[13, "reference"]], "Request": [[1, "request"], [1, "id6"], [1, "id7"], [1, "id11"], [1, "id15"], [1, "id18"], [1, "id22"], [1, "id27"]], "Request body": [[1, "request-body"], [1, "id19"], [1, "id23"]], "Requesting a specific collection": [[1, "requesting-a-specific-collection"]], "Requesting all collections": [[1, "requesting-all-collections"]], "Requesting collections for a Commons instance": [[1, "requesting-collections-for-a-commons-instance"]], "Requesting collections for a specific group": [[1, "requesting-collections-for-a-specific-group"]], "Required headers": [[1, "required-headers"]], "Resource types": [[12, "resource-types"]], "Retrieving Group Collection Metadata (GET)": [[1, "retrieving-group-collection-metadata-get"]], "Running CLI Commands in the KCWorks Container": [[4, "running-cli-commands-in-the-kcworks-container"]], "Running Invenio CLI Commands": [[4, "running-invenio-cli-commands"]], "Running automated tests (NEEDS UPDATING)": [[7, "running-automated-tests-needs-updating"]], "SAML Authentication": [[6, "saml-authentication"]], "Search configuration": [[2, "search-configuration"]], "SearchConfig": [[2, "searchconfig"]], "SearchOptionsMixin": [[2, "searchoptionsmixin"]], "Service Classes": [[2, "service-classes"]], "Service Components": [[2, "service-components"]], "Service Configuration": [[2, "service-configuration"]], "Sorting": [[1, "sorting"]], "Standardized environment variables": [[8, "standardized-environment-variables"]], "Start the uwsgi applications and celery worker": [[8, "start-the-uwsgi-applications-and-celery-worker"]], "Startup and shutdown scripts": [[8, "startup-and-shutdown-scripts"]], "Streamlined Import API": [[1, "streamlined-import-api"]], "Subject headings": [[12, "subject-headings"]], "Success responses": [[1, "success-responses"]], "Successful Response Body:": [[1, "id9"], [1, "id13"], [1, "id17"]], "Successful Response Headers": [[1, "successful-response-headers"]], "Successful Response Status Code": [[1, "successful-response-status-code"], [1, "id16"]], "Successful response body": [[1, "successful-response-body"], [1, "id21"], [1, "id25"]], "Successful response headers": [[1, "id10"], [1, "id14"]], "Successful response status code": [[1, "id8"], [1, "id12"], [1, "id20"], [1, "id24"], [1, "id28"]], "Tagging Releases": [[7, "tagging-releases"]], "Template Customizations": [[6, "template-customizations"]], "The InvenioRDM REST API": [[1, "the-inveniordm-rest-api"]], "The basic build process (slow)": [[7, "the-basic-build-process-slow"]], "The import request": [[1, "the-import-request"]], "The request file upload failed": [[1, "the-request-file-upload-failed"]], "The request metadata is malformed or invalid": [[1, "the-request-metadata-is-malformed-or-invalid"]], "The token does not have the necessary permissions": [[1, "the-token-does-not-have-the-necessary-permissions"]], "Unsuccessful response codes": [[1, "unsuccessful-response-codes"], [1, "id26"], [1, "id29"]], "Updating an Instance with Upstream Changes": [[7, "updating-an-instance-with-upstream-changes"]], "Updating the running KCWorks instance with development changes": [[7, "updating-the-running-kcworks-instance-with-development-changes"]], "Use the application!": [[8, "use-the-application"]], "User Data Sync (invenio-remote-user-data-kcworks)": [[6, "user-data-sync-invenio-remote-user-data-kcworks"]], "User and Group Data Updates (Internal Only)": [[1, "user-and-group-data-updates-internal-only"]], "User-first-record notifications": [[6, "user-first-record-notifications"]], "User/Groups Metadata updates and SAML authentication": [[1, "user-groups-metadata-updates-and-saml-authentication"]], "Variables for local credentials": [[8, "variables-for-local-credentials"]], "Version Control": [[7, "version-control"]], "Version Numbering": [[7, "version-numbering"]], "View container logging output": [[8, "view-container-logging-output"]], "View logging output for uwsgi processes": [[8, "view-logging-output-for-uwsgi-processes"]], "Welcome to the Knowledge Commons Works technical documentation!": [[9, "welcome-to-the-knowledge-commons-works-technical-documentation"]], "What happens to an import request that fails?": [[1, "what-happens-to-an-import-request-that-fails"]], "Who can use the import API?": [[1, "who-can-use-the-import-api"]], "Works": [[12, "works"]], "custom_fields.hclegacy:collection": [[6, "custom-fields-hclegacy-collection"], [12, "custom-fields-hclegacy-collection"]], "custom_fields.hclegacy:committee_deposit": [[6, "custom-fields-hclegacy-committee-deposit"], [12, "custom-fields-hclegacy-committee-deposit"]], "custom_fields.hclegacy:file_location": [[6, "custom-fields-hclegacy-file-location"], [12, "custom-fields-hclegacy-file-location"]], "custom_fields.hclegacy:file_pid": [[6, "custom-fields-hclegacy-file-pid"], [12, "custom-fields-hclegacy-file-pid"]], "custom_fields.hclegacy:groups_for_deposit": [[6, "custom-fields-hclegacy-groups-for-deposit"], [12, "custom-fields-hclegacy-groups-for-deposit"]], "custom_fields.hclegacy:previously_published": [[6, "custom-fields-hclegacy-previously-published"], [12, "custom-fields-hclegacy-previously-published"]], "custom_fields.hclegacy:publication_type": [[6, "custom-fields-hclegacy-publication-type"], [12, "custom-fields-hclegacy-publication-type"]], "custom_fields.hclegacy:record_change_date": [[6, "custom-fields-hclegacy-record-change-date"], [12, "custom-fields-hclegacy-record-change-date"]], "custom_fields.hclegacy:record_creation_date": [[6, "custom-fields-hclegacy-record-creation-date"], [12, "custom-fields-hclegacy-record-creation-date"]], "custom_fields.hclegacy:record_identifier": [[6, "custom-fields-hclegacy-record-identifier"], [12, "custom-fields-hclegacy-record-identifier"]], "custom_fields.hclegacy:submitter_affiliation": [[6, "custom-fields-hclegacy-submitter-affiliation"], [12, "custom-fields-hclegacy-submitter-affiliation"]], "custom_fields.hclegacy:submitter_id": [[6, "custom-fields-hclegacy-submitter-id"], [12, "custom-fields-hclegacy-submitter-id"]], "custom_fields.hclegacy:submitter_org_memberships": [[6, "custom-fields-hclegacy-submitter-org-memberships"], [12, "custom-fields-hclegacy-submitter-org-memberships"]], "custom_fields.hclegacy:total_downloads": [[6, "custom-fields-hclegacy-total-downloads"], [12, "custom-fields-hclegacy-total-downloads"]], "custom_fields.hclegacy:total_views": [[6, "custom-fields-hclegacy-total-views"], [12, "custom-fields-hclegacy-total-views"]], "invenio-communities": [[6, "invenio-communities"]], "invenio-rdm-records": [[6, "invenio-rdm-records"]], "invenio-records-resources": [[6, "invenio-records-resources"]], "invenio-vocabularies": [[6, "invenio-vocabularies"]], "kcr:ai_usage": [[6, "kcr-ai-usage"], [12, "kcr-ai-usage"]], "kcr:book_series": [[6, "kcr-book-series"], [12, "kcr-book-series"]], "kcr:chapter_label": [[6, "kcr-chapter-label"], [12, "kcr-chapter-label"]], "kcr:commons_domain": [[6, "kcr-commons-domain"], [12, "kcr-commons-domain"]], "kcr:commons_search_recid (system field)": [[6, "kcr-commons-search-recid-system-field"], [12, "kcr-commons-search-recid-system-field"]], "kcr:commons_search_updated (system field)": [[6, "kcr-commons-search-updated-system-field"], [12, "kcr-commons-search-updated-system-field"]], "kcr:content_warning": [[6, "kcr-content-warning"], [12, "kcr-content-warning"]], "kcr:course_title": [[6, "kcr-course-title"], [12, "kcr-course-title"]], "kcr:degree": [[6, "kcr-degree"], [12, "kcr-degree"]], "kcr:discipline": [[6, "kcr-discipline"], [12, "kcr-discipline"]], "kcr:edition": [[6, "kcr-edition"], [12, "kcr-edition"]], "kcr:institution_department": [[6, "kcr-institution-department"], [12, "kcr-institution-department"]], "kcr:media": [[6, "kcr-media"], [12, "kcr-media"]], "kcr:meeting_organization": [[6, "kcr-meeting-organization"], [12, "kcr-meeting-organization"]], "kcr:project_title": [[6, "kcr-project-title"], [12, "kcr-project-title"]], "kcr:publication_url": [[6, "kcr-publication-url"], [12, "kcr-publication-url"]], "kcr:sponsoring_institution": [[6, "kcr-sponsoring-institution"], [12, "kcr-sponsoring-institution"]], "kcr:submitter_email": [[6, "kcr-submitter-email"], [12, "kcr-submitter-email"]], "kcr:submitter_username": [[6, "kcr-submitter-username"], [12, "kcr-submitter-username"]], "kcr:user_defined_tags": [[6, "kcr-user-defined-tags"], [12, "kcr-user-defined-tags"]], "metadata.creators/metadata.contributors": [[6, "metadata-creators-metadata-contributors"], [12, "metadata-creators-metadata-contributors"]], "metadata.subjects": [[6, "metadata-subjects"], [12, "metadata-subjects"]]}, "docnames": ["README", "api", "architecture", "changelog", "cli_commands", "configuration", "customizations", "developing", "in_depth", "index", "infrastructure", "installation", "metadata", "reference"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["README.md", "api.md", "architecture.md", "changelog.md", "cli_commands.md", "configuration.md", "customizations.md", "developing.md", "in_depth.md", "index.rst", "infrastructure.md", "installation.md", "metadata.md", "reference.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [3, 4, 6, 7, 8, 9, 12], "0": [0, 1, 7, 9, 11, 12], "00": [1, 6, 12], "000": 2, "0000": [1, 6, 12], "0001": 12, "00k4n6c32": 12, "00z": [1, 6, 12], "01": [1, 6, 9, 12], "01t00": [1, 6, 12], "0378": 12, "04": 8, "06": 12, "09": [9, 12], "1": [1, 2, 6, 7, 9, 12], "10": [1, 2, 9, 11, 12], "100": [1, 2], "1001634": [6, 12], "1038515d68f7": 1, "1086436": 12, "11": [8, 9, 12], "111023": 12, "12": [8, 9, 11], "123": 12, "1234": [1, 12], "12345": 1, "123456": [6, 12], "1234567890": 1, "1234567891": 1, "12345abcd": 12, "1263": [6, 12], "13": 12, "17": [9, 11], "18": 9, "19": 8, "2": [1, 2, 7, 8, 9, 12], "20": [9, 11], "200": 1, "2007": 12, "201": 1, "2018": 12, "202": 1, "2020": 12, "2022": 12, "2023": 0, "2024": [1, 6, 9, 12], "2025": [9, 12], "2029": 12, "204": 1, "207": 1, "22": 8, "2345": 12, "24": [0, 12], "25": 1, "251587": 12, "2nd": 12, "3": [0, 1, 7, 9], "30": 9, "304": 1, "32": 12, "3dmodel": 12, "4": [1, 9, 12], "400": 1, "403": 1, "404": 1, "409": 1, "410": 2, "422": 1, "45": 1, "456": 12, "458": 12, "4891": 1, "5": [0, 1, 9], "50": 1, "504": 1, "5402d72b": 1, "5601": [8, 11], "5955": 12, "6": [1, 8], "60": [2, 12], "6379": 8, "63932": 12, "6780": 12, "6789": 12, "67890": 1, "7": 1, "8": 12, "8601": [6, 12], "8gb": 8, "9": 1, "90": 1, "9200": 8, "94682": 12, "958235": 12, "966892": 12, "A": [2, 3, 6, 12], "As": 12, "At": 8, "But": [1, 11, 12], "By": [1, 7], "For": [1, 4, 6, 7, 8, 12], "If": [1, 2, 6, 7, 8, 11, 12], "In": [1, 2, 7, 9, 12], "It": [0, 1, 2, 3, 4, 6, 7, 8, 11, 12], "Its": 1, "NOT": [1, 11], "No": [1, 7], "Not": 1, "On": [4, 8], "One": [6, 8, 12], "Or": [7, 8], "TO": 11, "That": [6, 12], "The": [2, 3, 6, 8, 9, 11, 12, 13], "Then": [4, 7, 8], "There": [1, 7, 8], "These": [1, 2, 3, 4, 6, 7, 8, 11, 12], "To": [1, 4, 7, 8, 11], "With": [3, 8], "__init__": 7, "__name__": 7, "_files_attr_kei": 2, "_files_bucket_attr_kei": 2, "_files_bucket_id_attr_kei": 2, "_files_data_kei": 2, "_id": 2, "aa8": 1, "abil": 12, "abl": [1, 8], "about": [1, 7, 9, 12], "abov": [1, 7, 12], "absenc": 1, "abstract": [2, 12], "abus": [6, 12], "ac": 12, "academ": [0, 6, 12], "accept": [1, 12], "access": [2, 3, 8, 11, 12], "accesscompon": 2, "accident": 1, "accommod": 1, "account": [1, 6, 12], "acronym": 12, "across": 1, "action": [1, 2], "action_nam": 2, "activ": [1, 7, 8, 11, 12], "actor": 12, "actual": [1, 2, 8, 12], "ad": [1, 2, 3, 6, 12], "adaptor": 12, "add": [2, 3, 6, 7, 9, 11, 12], "addit": [1, 2, 6, 7, 11, 12], "addition": 8, "additional_descript": 12, "additional_titl": 12, "address": [1, 6, 8, 12], "admin": [1, 6, 12], "administ": 1, "administr": [1, 8, 11], "administrativ": 1, "advis": 8, "affect": [1, 3], "affili": [6, 12], "after": [1, 2, 7, 8, 11], "ag": 12, "again": [1, 7, 8, 12], "against": [2, 8], "agent": 1, "aggreg": [1, 4, 6, 12], "ai": [6, 12], "ai_descript": [6, 12], "ai_us": [6, 12], "alia": 8, "alias": 7, "all": [2, 3, 4, 6, 7, 8, 11, 12], "all_or_non": 1, "allow": [1, 2, 3, 6, 8, 11, 12], "alon": 7, "along": [6, 7, 12], "alongsid": 8, "alreadi": [1, 7, 8], "also": [1, 2, 3, 4, 6, 7, 8, 12], "altern": [8, 12], "although": 12, "alwai": [3, 8], "ambigu": [6, 12], "american": [6, 12], "among": 3, "an": [0, 2, 3, 6, 9, 11, 12, 13], "anaconda": 8, "analyst": 12, "ani": [1, 4, 6, 7, 8, 12], "annot": 12, "anoth": [2, 8], "anotherusernam": 1, "api": [2, 3, 4, 7, 8, 9, 11], "api_token": 8, "app": [8, 11], "appear": [1, 3, 11, 12], "append": [1, 8], "appli": 1, "applic": [1, 7, 9, 12], "approach": [8, 12], "appropri": [1, 8, 12], "ar": [1, 2, 3, 4, 6, 7, 8, 11, 12], "arbitrari": 12, "architectur": 9, "archiv": 1, "area": [6, 12], "aren": 8, "arg": 2, "argument": [2, 4], "aria": 3, "arli": 3, "arlisna": [6, 12], "around": 1, "arrai": [1, 6, 12], "arrang": 12, "art": [6, 12], "articl": [6, 12], "artifact": [6, 12], "artisan": 12, "artist": [6, 12], "asc": 1, "ascend": 1, "ask": 8, "asset": 7, "assign": [1, 2, 6, 8, 12], "assignfast": [6, 12], "associ": [1, 6, 12], "assum": [1, 8], "attach": [1, 12], "attempt": 1, "attribut": 2, "attributednam": 12, "audienc": 12, "audio": [6, 12], "audiorecord": 12, "audiovisu": 12, "augment": 12, "austen": [6, 12], "authent": [], "author": [1, 12], "authorofafterword": 12, "authorofforeword": 12, "authorofintroduct": 12, "auto": 3, "autom": 9, "automat": [1, 6, 7, 8, 12], "avail": [1, 2, 4, 7, 8, 12], "available_sort_opt": 2, "avatar": 1, "avoid": [1, 3, 7], "aw": 8, "awar": [6, 8, 12], "award": [1, 12], "awkward": 1, "b": [1, 2, 7, 12], "b144": 1, "back": [3, 4, 7], "backend": 6, "background": [1, 8], "bad": 1, "bar": [8, 12], "bare": 1, "base": [1, 2, 6, 12], "baserecordfilescompon": 2, "bash": [4, 7, 8, 11], "bashrc": 8, "basic": 12, "bearer": 1, "beat": 8, "becaus": [1, 3, 6, 7, 8, 12], "becom": 1, "been": [1, 2, 3, 6, 7, 8, 12], "befor": [1, 2, 4, 6, 7, 8, 12], "begin": [7, 8], "being": [1, 2, 3, 8, 12], "belong": [1, 6, 12], "below": [1, 8, 11, 12], "beneath": 12, "best": [3, 8, 12], "bestmatch": 3, "beta": 7, "beta3": 9, "beta4": 9, "beta5": 9, "beta6": [7, 9], "beta7": 9, "beta8": [0, 9], "between": [1, 2, 6, 7, 12], "beyond": [6, 12], "bibliographi": 12, "big": 8, "bin": 8, "binari": 1, "bind": [8, 11], "blob": [], "block": 8, "blogpost": 12, "blueprint": 2, "blueski": 3, "book": [6, 12], "booksect": 12, "boolean": [1, 6, 12], "boot": 8, "both": [1, 3, 6, 12], "break": [1, 8], "broke": 3, "browser": [7, 11], "bucket": [1, 2], "bug": [3, 7], "bugfix": 7, "build": [3, 6, 9], "builder": 6, "built": [0, 1, 8, 13], "bulk": [4, 9], "bundl": 7, "busi": 2, "c": [1, 2, 7, 8], "cach": 8, "call": [1, 2, 6, 8, 12], "callback": 1, "can": [2, 3, 4, 6, 7, 8, 11, 12, 13], "cannot": [1, 7], "carri": 1, "case": [1, 2, 6, 7, 12], "catalog": 12, "caution": [4, 7, 11], "cc": 12, "cd": [7, 8, 11], "central": [1, 6, 7, 12], "cern": [1, 13], "certain": 1, "cfg": 1, "ch": [1, 13], "chanc": 1, "chang": [2, 6, 8, 9, 11, 12], "change_m": 8, "changenotificationscompon": 2, "chapter": [6, 12], "chart": 12, "chatgpt": 12, "check": [1, 2, 6, 8], "check_permiss": 2, "check_revision_id": 2, "checksum": 1, "child": 2, "children": 1, "chmod": 8, "choos": [3, 12], "choreograph": 12, "chose": 8, "chrome": 7, "chronolog": [6, 12], "cinematograph": 12, "class": [1, 6], "clean": [2, 7], "cleanup": 2, "cleanup_draft": 2, "cleanup_record": 2, "clearer": 3, "cli": [1, 3, 9, 11], "click": 8, "client": [1, 2, 7], "clone": [7, 9], "close": 1, "cm": 12, "co": 8, "coar": 12, "code": [9, 11, 12], "codebas": 11, "coderepositori": 12, "cog": 8, "collabor": [0, 12], "collect": [3, 4, 7, 9, 11], "collection_id": 1, "collection_slug": 1, "collection_vis": 1, "collector": 12, "collid": 1, "com": [1, 6, 8, 11, 12], "command": [1, 3, 7, 9, 11], "commerci": 12, "commiss": [6, 12], "commit": 1, "committe": [6, 12], "committeechair": 12, "committeememb": 12, "common": [0, 2, 3, 6, 7, 11, 12, 13], "commons_api_token": [1, 8], "commons_group_descript": 1, "commons_group_id": 1, "commons_group_nam": 1, "commons_group_vis": 1, "commons_inst": 1, "commons_search_api_token": 8, "commun": [1, 2, 3, 11], "compar": 12, "comparison": 3, "compil": 8, "complement": [6, 12], "complet": [1, 6, 7, 11, 12], "complex": 2, "compon": [1, 3, 6, 7], "compos": [7, 9, 12], "compress": 1, "comput": 8, "computationalmodel": 12, "computationalnotebook": 12, "condit": 12, "conductor": 12, "conf": 7, "confer": [6, 12], "conferencepap": 12, "conferencepost": 12, "conferenceproceed": 12, "config": [1, 6, 8], "configr": 2, "configur": [7, 9], "confirm": 1, "conflict": [1, 3], "conform": 1, "confus": [1, 3, 12], "connect": 1, "consid": [1, 7], "consist": 2, "constrain": [6, 12], "construct": 2, "constructor": 2, "consult": 12, "contactperson": 12, "contain": [1, 3, 6, 7, 9, 11, 12], "container": 9, "content": [1, 11, 12], "contentmoderationcompon": 2, "continu": 7, "contribuor": 12, "contribut": 12, "contributor": 9, "control": [1, 2, 3, 6, 9], "conveni": [1, 8], "convert": [6, 12], "coordin": 12, "copi": [7, 8, 11], "copyright": 9, "core": [4, 9, 11], "corpor": [1, 6, 12], "correct": [1, 4, 8, 11, 12], "correctli": 3, "correspond": [1, 4, 6, 12], "corrupt": 1, "could": [1, 3], "count": 4, "cours": [6, 8, 12], "cover": [6, 12], "cpython": 8, "creat": [2, 3, 4, 6, 7, 12], "create_search": 2, "creatibutorsfield": 3, "creation": [1, 3, 6], "creativ": 12, "creativecommon": 12, "creator": [1, 9], "credit": 12, "crud": 2, "csl": 12, "ctrl": [7, 8], "curat": 1, "curation_polici": 1, "curl": 8, "current": [1, 2, 3, 7, 8, 12], "curriculum": 12, "custom": [2, 3, 7, 8, 9, 13], "custom_field": 1, "custom_pdf_viewer_j": 7, "customfieldscompon": 2, "d": [7, 8, 11], "daemon": 8, "dashboard": [3, 8, 11], "data": [2, 3, 4, 7, 8, 9, 11, 12], "databas": [1, 2, 4, 6, 12], "datacit": 12, "datacollector": 12, "datacur": 12, "datamanag": 12, "datamanagementplan": 12, "dataservicecompon": 2, "dataset": 12, "date": [1, 3, 6, 8, 12], "datetim": [6, 12], "db": 8, "de": 12, "deal": 2, "debug": [7, 11], "declar": [1, 7], "dedicate": 12, "deeper": 9, "default": [1, 2, 3, 6, 7, 8, 12], "default_files_en": 2, "default_media_files_en": 2, "defaultrecordscompon": 2, "defin": [2, 6, 7, 8, 12], "definit": [1, 2], "delai": 1, "deleg": 2, "delet": [2, 4, 7], "delete_draft": 2, "delete_record": 2, "deletion_statu": 1, "demo": 8, "depart": [6, 12], "depend": [1, 2, 7, 8, 11], "deploi": [4, 7], "deploy": 7, "deposit": [9, 11, 12], "depositor": 12, "depth": 9, "derefer": 2, "desc": 1, "descend": 1, "describ": [1, 6, 7, 11, 12], "descript": [1, 12], "descriptor": [6, 12], "design": 12, "desir": [1, 3, 6, 12], "desktop": 8, "despair": 11, "destroi": [4, 8, 11], "detail": [1, 2, 3, 9, 11, 12], "detect": 1, "determin": [6, 12], "dev": [1, 8, 11], "develop": [4, 8, 9, 13], "developmentstatu": 12, "diagram": 12, "dict": 7, "dictionari": [1, 7], "did": 1, "differ": [1, 6, 11, 12], "differenti": [6, 12], "difficult": 1, "dig": 9, "digit": 12, "direction": 6, "directli": [1, 7, 8], "director": 12, "directori": 8, "disabl": 2, "disambigu": 1, "discover": 1, "discoveri": [6, 12], "discuss": [1, 12], "displai": [3, 4], "dissert": [6, 12], "distinct": [2, 6, 7, 12], "distress": [6, 12], "distribut": [1, 12], "distributor": 12, "divers": 12, "divid": [3, 4, 6, 12], "divis": [3, 12], "dnb": 12, "do": [1, 7, 8, 11, 12], "doc": [1, 7, 8, 13], "doc_count": 1, "docker": [4, 7, 9], "dockerfil": 8, "document": [1, 3, 4, 6, 7, 8, 12], "documentari": 12, "doe": [2, 3, 6, 7, 8, 12], "doi": [1, 3], "domain": [6, 12], "don": 11, "done": [7, 8], "donor": 12, "down": [8, 11], "download": [1, 6, 8, 12], "dphil": [6, 12], "draft": [1, 2, 6], "draft_cl": 2, "draft_fil": 2, "draft_index": 2, "draft_indexer_cl": 2, "draft_indexer_queue_nam": 2, "drafter": 12, "draftfilescompon": 2, "draftmediafilescompon": 2, "draftmetadatacompon": 2, "draw": 2, "drawn": 12, "driver": 8, "dsl": 2, "dummi": 8, "dumper": 2, "duplic": [], "dure": [1, 2, 3, 4, 6, 7, 8, 11, 12], "dynam": [4, 7], "e": [1, 2, 3, 4, 6, 7, 11, 12], "e2": 7, "each": [1, 2, 3, 6, 7, 8, 11, 12], "earlier": [1, 2], "eas": 12, "easi": 8, "easili": 12, "edit": [1, 2, 3], "editor": 12, "editori": 12, "edtf": 1, "educ": [6, 12], "effect": [6, 7, 12], "effici": [6, 12], "eight": 12, "either": [1, 2, 4, 8, 11, 12], "electron": 12, "els": 8, "elsewher": 12, "email": [1, 4, 8, 11, 12], "emailbackend": 6, "embargo": [2, 12], "embed": 2, "emit": [2, 6], "emploi": [1, 2, 6, 7, 12], "empti": [1, 3], "emul": 7, "en": 12, "enabl": [2, 6, 12], "encompass": 12, "encount": 1, "encourag": [6, 12], "end": [1, 3, 7], "endpoint": 2, "enforc": 2, "eng": 12, "engag": 12, "engin": [8, 12], "english": 12, "enough": 8, "ensur": [1, 7, 11], "enter": [7, 8, 11], "entir": 1, "entiti": 1, "entri": [6, 12], "env": [8, 11], "environ": [1, 7, 9, 11], "er": 12, "error": [2, 3, 7], "especi": [3, 7, 8], "essai": 12, "establish": 1, "etc": [1, 2, 4, 6, 7, 11, 12], "eurepo": 12, "europ": [6, 12], "even": [1, 3, 6, 12], "event": [3, 4, 6, 8, 12], "eventu": 1, "everi": 7, "exactli": [1, 12], "examin": 12, "exampl": [1, 4, 6, 7, 8, 9], "exce": 1, "except": [1, 7, 12], "exclud": 2, "exec": [4, 7, 8, 11], "exist": [1, 2, 3, 4, 7, 8], "expand": [2, 12], "expandable_field": 2, "expected_revision_id": 2, "expir": 2, "explain": [8, 11], "export": [4, 12], "extend": 1, "extens": [6, 7, 8], "extern": [2, 12], "extra": 8, "extra_filt": 2, "extrem": 4, "f": 8, "facet": [2, 6, 12], "facilit": 12, "factori": 2, "fall": 12, "fals": [1, 2], "famili": 3, "familiar": 1, "family_nam": 12, "fast": 6, "favour": 12, "featur": [1, 7, 12], "feedback": 11, "field": [1, 2, 3, 9], "figur": 12, "file": [0, 4, 6, 9, 12], "file1": 1, "file2": 1, "file3": 1, "file_links_list": 2, "fileconfigmixin": 2, "filenam": 1, "files_attr": 2, "fill": [3, 12], "filter": [1, 2], "final": [1, 2, 8], "find": [3, 4, 7, 8, 11, 12], "first": [1, 4, 7, 8, 11], "firstrecordcreatednotificationbuild": 6, "firstrecordcreatednotificationservic": 6, "firstrecordpublishednotificationbuild": 6, "fit": 12, "fix": [3, 7], "fixtur": [7, 8, 11], "flag": [6, 8, 12], "flask": [2, 4, 6, 7, 9], "flat": 12, "flexibli": [6, 12], "flow": 7, "folder": [1, 8, 11], "follow": [1, 2, 4, 6, 7, 8, 11, 12], "foo": [2, 12], "forbidden": 1, "forc": [2, 7, 8, 12], "fork": [8, 9], "form": [1, 3, 9, 11, 12], "format": [1, 12], "former": 1, "formerown": 12, "formgenr": [6, 12], "forthcom": 1, "found": [1, 4, 6, 12, 13], "four": [1, 7], "fraction": 1, "fragil": 1, "free": [1, 6, 8, 12], "freecodecamp": 8, "from": [1, 3, 4, 6, 7, 8, 11], "fromconfig": 2, "frontend": 8, "full": [1, 3, 8, 9, 12], "full_nam": 1, "function": [2, 3], "fund": [6, 12], "funder": 1, "fundref": 12, "further": [2, 4, 8, 11], "futur": [1, 3, 12], "g": [1, 2, 3, 4, 6, 7, 11, 12], "gatewai": 1, "gender": 12, "gener": [1, 4, 6, 7, 8, 12], "geograph": [6, 12], "geometri": 12, "geonam": 12, "geopattern": 7, "get": [2, 3, 8], "gh_page": 7, "git": 8, "github": [3, 7, 8, 11, 12], "gitlab": 7, "given": [2, 3], "given_nam": 12, "gnd_node": 12, "gninx": 8, "good": 8, "grace": 2, "grant": [1, 2, 6, 12], "greatli": 12, "grep": 4, "group": [4, 7, 8, 9, 11, 12], "group_collect": 1, "group_collections_metadata_endpoint": 1, "group_identifi": [6, 12], "group_nam": [6, 12], "guarante": 8, "guid": 8, "h1": 12, "ha": [1, 2, 3, 6, 7, 8, 12], "handl": [2, 3], "handler": 2, "hard": 2, "have": [2, 3, 6, 7, 8, 11, 12], "hc": 9, "hcommon": [1, 6, 12], "head": 6, "header": 3, "held": 1, "help": [1, 4, 6, 7, 8, 12], "helper": 2, "here": [1, 6, 8, 11, 12], "hidden": 3, "hierarch": 12, "high": 2, "histor": [6, 12], "histori": [6, 7, 12], "historian": [6, 12], "hit": 1, "hold": [1, 6, 8, 12], "homoit0000669": [6, 12], "homosauru": 6, "hood": 1, "host": [6, 12], "hostinginstitut": 12, "hour": 11, "how": [4, 12], "how2shout": 8, "howev": [1, 12], "html": [2, 6, 8, 12], "http": [1, 6, 7, 8, 11, 12, 13], "human": [1, 6, 12], "hyphen": [6, 8, 12], "i": [0, 2, 3, 4, 6, 7, 11, 12, 13], "icon": 8, "id": [1, 2, 3, 6, 12], "id_": 2, "idea": 8, "ident": [1, 2, 12], "identifi": [1, 3, 6, 9], "identifier_orcid": 12, "idp": 1, "ignor": 1, "ignore_field_permiss": 2, "illustr": 12, "imag": [1, 3, 7, 8, 12], "immedi": [1, 7, 12], "implement": [1, 9], "import": [2, 4, 7, 8, 9, 11, 12], "import_data": 8, "import_fil": 2, "impos": [6, 12], "imprint": 12, "includ": [0, 1, 2, 3, 4, 6, 8, 11, 12, 13], "include_delet": 2, "incomplet": 1, "increment": 7, "independ": 1, "index": [1, 2, 4, 6, 8, 12], "index_dump": 2, "indexer_cl": 2, "indexer_queue_nam": 2, "indic": [1, 4, 11], "individu": [1, 8], "influenc": 12, "info": [6, 8, 12], "inform": [1, 2, 7, 12, 13], "informationen": 12, "infrastructur": [3, 9], "inherit": 2, "ini": 8, "init": [7, 11], "initi": [1, 2, 3, 7], "input": 2, "insert": [8, 11], "insid": [4, 7, 8, 11], "instal": [1, 3, 7, 9], "instanc": [0, 2, 4, 8, 9, 11, 13], "instance_path": [8, 11], "instanti": 2, "instead": [1, 3, 7, 8], "institut": [1, 6, 12], "instruct": [6, 7, 9, 11, 12], "instructionalresourc": 12, "integ": [6, 12], "integr": [1, 7, 9, 12], "intend": [1, 6, 12], "intens": 1, "inter": [7, 11], "interact": [2, 7], "interactiveresourc": 12, "interfac": [1, 2, 8, 12], "intern": [2, 6, 9, 12], "interpret": 8, "interrupt": 1, "intersex": [6, 12], "interview": 12, "interviewe": 12, "interviewrecord": 12, "interviewtranscript": 12, "introduc": [1, 2, 7], "introduct": [6, 12], "invenio": [1, 3, 9, 11, 12], "invenio_": 8, "invenio_app": 8, "invenio_csrf_secret_salt": 8, "invenio_custom_pdf_view": 7, "invenio_datacite_password": 8, "invenio_drafts_resourc": 2, "invenio_group_collections_kcwork": 1, "invenio_instance_path": 8, "invenio_notif": 6, "invenio_rdm_record": 2, "invenio_record_importer_data_dir": 8, "invenio_record_importer_local_data_dir": 8, "invenio_records_resourc": 2, "invenio_search_domain": 8, "invenio_secret_kei": 8, "invenio_security_login_salt": 8, "invenio_site_api_url": 8, "invenio_site_ui_url": 8, "invenio_sqlalchemy_database_uri": 8, "inveniordm": [0, 4, 7, 8, 9], "inventor": 12, "invers": 2, "invert": 3, "invit": 1, "invok": 4, "involv": [1, 2, 3, 6, 7, 11, 12], "irrevoc": 1, "is_delet": 1, "is_publish": 2, "is_select": 1, "isbn": [], "iscitedbi": 12, "iso": [6, 12], "issn": [], "issu": 12, "item": [2, 6, 12], "item_index": 1, "iter": 2, "its": [1, 2, 3, 7, 8, 11, 12], "itself": [6, 12], "j": [3, 9], "jammi": 8, "jane": [6, 12], "janedo": 12, "javascript": 12, "jdoe": [1, 6, 12], "jest": 7, "jinja": 6, "jinja2": 2, "john": [1, 6, 12], "journal": [6, 12], "journalarticl": 12, "json": [1, 2, 4, 7, 8], "juror": 12, "just": 12, "kc": [1, 3, 4, 8, 9], "kc_usernam": [1, 6, 12], "kcr": [1, 8], "kcr_api": 8, "kcr_ui": 8, "kcwork": [1, 3, 8, 9], "keep": [7, 8, 12], "kei": [1, 2], "keyboard": 3, "keyword": 2, "kind": [1, 2], "kingston": [6, 12], "know": 1, "knowldg": 11, "knowledg": [0, 1, 3, 7, 11, 12, 13], "knowledgecommon": 1, "kwarg": 2, "label": [1, 3, 6, 12], "labor": 12, "lago": 12, "lambda": 8, "lang": 12, "languag": 12, "larg": [2, 3], "last": [1, 4, 6, 7, 12], "later": [1, 2], "latest": [1, 2, 7], "latin": [6, 12], "launch": 12, "layer": 9, "layout": 3, "lcsh": [6, 12], "lcsh2fast": [6, 12], "lead": 3, "least": [1, 2, 3, 8], "leav": 7, "left": 1, "leftov": 7, "legaci": [4, 9], "legalcod": 12, "legalcom": 12, "legalrespons": 12, "less": [3, 6, 7, 12], "lessonplan": 12, "level": [1, 2, 6, 12], "lib": 8, "licens": [0, 12], "license": 12, "lift": 2, "lift_embargo": 2, "like": [1, 2, 7, 8, 12], "likewis": 7, "limit": 2, "line": [3, 4, 11], "link": [1, 2, 3, 4, 6, 12], "links_item": 2, "links_item_tpl": 2, "links_search": 2, "links_search_draft": 2, "links_search_vers": 2, "linkstempl": 2, "linux": 7, "list": [1, 2, 4, 6, 7, 12], "literatur": [6, 12], "live": [8, 11], "load": 4, "local": [1, 4, 7, 9], "localhost": [8, 11], "locat": [1, 6, 7, 12], "lock": [2, 8], "lock_edit_published_fil": 2, "log": [3, 6], "logic": 2, "loglevel": 8, "logo": [1, 3], "long": [1, 3, 7, 8], "longer": 1, "look": 1, "lost": 4, "low": 2, "lowercas": [6, 12], "lt": 8, "lyricist": 12, "m": 7, "ma": [6, 12], "mac": 8, "machin": 8, "made": [1, 3, 7, 12], "magazin": 12, "magazinearticl": 12, "mai": [1, 6, 7, 8, 11, 12], "mail": 6, "main": [3, 4, 6, 7, 11, 12], "maintain": 12, "make": [7, 8, 11], "manag": [1, 2, 3, 7, 8, 12], "mani": 12, "manual": 8, "manufactur": 12, "map": [2, 12], "mark": 2, "mark_record": 2, "mark_record_for_purg": 2, "markdown": 6, "match": [1, 2, 3, 8, 12], "materi": [6, 12], "matter": [6, 12], "max_files_count": 2, "maximum": [1, 2], "md": [3, 7], "mean": [3, 6, 7, 8, 12], "meantim": 7, "mechan": [1, 6, 12], "media": [2, 3], "meet": [6, 12], "member": [1, 3], "member_polici": 1, "membership": 1, "memori": 8, "mention": 12, "menu": 3, "merg": 7, "mesh": [0, 11], "messag": [1, 3], "met": 12, "metadata": [2, 3, 4, 9], "metadata_field": 9, "metadatacompon": 2, "method": [2, 12], "michigan": 12, "middl": 4, "might": [1, 3, 6, 8, 12], "migrant": [6, 12], "migrat": [6, 12], "mind": 1, "minim": 1, "minor": 7, "mint": [1, 12], "minut": [1, 8], "miss": [1, 3], "mit": 0, "mixin": 2, "mla": [6, 12], "modal": 3, "model": 2, "moder": [2, 12], "moderatorrolerecipi": 6, "modern": [6, 12], "modif": 1, "modifi": [1, 2, 3, 7], "modul": [1, 3, 9, 11], "modular": 11, "monograph": 12, "monotask": 7, "more": [1, 2, 3, 6, 7, 12], "most": [1, 3, 7, 8], "mount": [8, 11], "move": 3, "mq": 8, "msu": 12, "much": [6, 12], "multi": 1, "multi_statu": 1, "multidisciplinari": 12, "multipart": 1, "multipl": [1, 2, 3], "music": 12, "musicalrecord": 12, "must": [1, 6, 7, 8, 12], "my": [1, 12], "myapitoken": 8, "mycours": 12, "myevent": 12, "myinveniodatacitepassword": 8, "myservic": 2, "myserviceconfig": 2, "mysteri": 1, "mytoken": 8, "myusernam": 1, "n": 1, "na": 3, "name": [2, 3, 4, 6, 8, 11, 12], "name_parts_loc": 3, "namespac": [6, 12], "natur": 1, "navig": [3, 7, 8, 11], "nc": 12, "necessari": [3, 8, 11], "need": [1, 4, 9, 11, 12], "neither": [1, 12], "net": 12, "network": 1, "new": [2, 3, 6, 8, 12], "new_commons_group_id": 1, "new_commons_group_nam": 1, "new_vers": 2, "newer": 8, "newest": [1, 3], "newli": [6, 12], "newlin": 8, "newspap": 12, "newspaperarticl": 12, "next": [1, 2, 7, 8], "nginx": 11, "node": 9, "node_modul": 7, "non": 1, "none": [1, 2], "noowneravail": 1, "nor": [1, 12], "normal": [1, 7, 8, 11], "note": [1, 2, 4, 7, 11, 12], "notic": 1, "notif": [2, 9], "notif_tim": 2, "notificationop": 6, "notifications_moderator_rol": 6, "notimplementederror": 2, "now": [1, 2, 3, 8, 11], "npm": 7, "number": [1, 2, 4, 6, 9, 12], "numer": 1, "nvm": 9, "o": 8, "oai": [1, 2], "oai_record_sourc": 2, "oai_result_item": 2, "oauth": 1, "object": [2, 6, 7], "obtain": [1, 8], "occup": 1, "occupi": 7, "occur": 1, "oclc": [6, 12], "octet": 1, "octob": 12, "often": [7, 8], "ok": 1, "old": [1, 8], "old_commons_group_id": 1, "oldest": 1, "on_relation_upd": 2, "onc": [1, 2, 7, 8], "one": [1, 2, 6, 8, 11, 12], "ongo": 1, "onli": [2, 3, 4, 6, 7, 9, 12], "onlinepubl": 12, "onto": 11, "open": [1, 8, 12], "openfund": 12, "opengraph": 3, "opensearch": [2, 4, 8, 11], "oper": [1, 2, 6, 8, 11], "opt": [7, 8, 11], "option": [1, 2, 3, 4, 6, 7, 11, 12], "orcid": [1, 3, 6], "order": [1, 2, 3, 7], "org": [1, 6, 7, 8, 12], "organ": [1, 6], "organiz": [6, 12], "origin": [1, 2, 3, 7, 12], "other": [1, 2, 3, 6, 7, 8, 12], "otherwis": [8, 12], "our": 12, "out": [1, 8, 12], "output": 7, "outsid": 1, "over": 7, "overrid": [1, 2, 7, 12], "overridden": [2, 7], "overwhelm": 12, "own": [1, 7, 8], "owned_bi": 1, "owner": 12, "ownership": [6, 12], "p": [1, 4, 11, 12], "packag": [2, 4, 8, 11, 12], "page": [1, 3, 7, 9, 11, 12], "panda": 1, "panel": 8, "paper": [6, 12], "param": 2, "paramet": 2, "parent": [1, 2, 8, 11, 12], "parentpidscompon": 2, "parser": 2, "part": [0, 1, 3, 4, 6, 12], "particular": [8, 11], "particularli": [1, 7], "partli": 1, "pass": [1, 2], "password": [4, 8, 11], "patch": 7, "patent": 12, "path": [1, 6, 12], "patienc": 11, "pdf": [1, 6, 12], "pdfj": 7, "pedagogi": 12, "peerreview": 12, "pend": 3, "perform": [1, 2, 8, 12], "period": [1, 2, 12], "perman": 1, "permiss": [2, 3], "permission_act": 2, "permission_polici": 2, "permission_policy_cl": 2, "persist": [6, 7, 8, 12], "person": [6, 12], "person_or_org": [6, 12], "personnel": 1, "pgadmin": [8, 11], "pgadmin_default_email": 8, "pgadmin_default_password": 8, "phd": [6, 12], "photograph": 12, "physicalobject": 12, "pick": 7, "pid": [1, 2, 7, 8, 11, 12], "pidcompon": 2, "pidfil": 8, "pidscompon": 2, "pin": 3, "pip": [7, 8], "pipenv": [7, 11], "pipfil": 7, "place": [1, 6, 12], "placehold": 1, "placeholder_avatar": 1, "plain": 1, "plaintext": 6, "platform": 3, "pleas": 1, "pmh": 1, "png": 1, "podcastepisod": 12, "poeticwork": 12, "poetri": [6, 12], "point": [1, 3, 12], "polici": [1, 2], "popul": 1, "possess": 1, "possibl": [1, 7, 12], "post": 2, "post_publish": 2, "postgres_db": 8, "postgres_password": 8, "postgres_us": 8, "postgresql": 8, "potenti": [6, 12], "practic": 7, "pre": [1, 12], "prefer": 2, "prefix": [6, 12], "preprint": 12, "present": [2, 3, 6, 12], "presentationtext": 12, "preserv": [6, 12], "press": 8, "prev": 1, "prevent": [1, 2, 12], "preview": 2, "previou": [1, 2], "previous": [2, 3, 6, 12], "primari": [3, 6], "primarili": [2, 4, 6, 12], "principl": 1, "print": [8, 12], "printer": 12, "prior": [2, 6, 8, 12], "privat": [8, 11], "privileg": 1, "problem": 7, "problemat": [6, 12], "proce": 8, "proceed": [6, 12], "process": [1, 2, 4, 12], "produc": [2, 3, 4, 6, 12], "product": [4, 6, 7, 12], "professionel": 12, "profil": [1, 3, 6, 12], "program": 12, "programminglanguag": 12, "project": [6, 7, 8, 12], "projectorteamlead": 12, "projectorteammanag": 12, "projectorteammemb": 12, "proper": [3, 6, 12], "properti": [1, 2, 3, 12], "provid": [1, 2, 4, 6, 7, 8, 11, 12], "provision": [11, 12], "prune": 7, "psychologi": 12, "psycopg2": 8, "public": [1, 3, 6, 12], "public_memb": 1, "publication_d": [1, 12], "publish": [1, 2, 3, 6, 12], "pull": [7, 8], "purg": [1, 2], "purge_record": 2, "purpos": [6, 12], "push": 7, "put": [1, 8], "py": [4, 7], "pypi": 8, "pyproject": 7, "pytest": 7, "python": [2, 9, 11, 12], "python3": 8, "python_local_git_packages_path": 8, "python_local_site_packages_path": 8, "queri": [2, 3], "query_parser_cl": 2, "querystr": 2, "question": 1, "queue": [1, 2], "quick": 11, "quickli": 8, "quickstart": 9, "quota": 2, "rabbitmq": 8, "race": 12, "rais": [1, 2], "random": [3, 8], "rang": 12, "rather": [1, 8], "rdm": [8, 11, 12], "rdm_records_service_compon": 2, "rdmrecord": 6, "rdmrecordserviceconfig": 2, "re": [1, 2, 7, 8, 12], "reach": 7, "react": [2, 7], "read": [1, 2, 4], "read_al": 2, "read_delet": 2, "read_draft": 2, "read_latest": 2, "read_mani": 2, "readabl": [1, 6, 7, 12], "reader": [1, 6, 12], "readi": 7, "readm": [3, 7], "real": 8, "reason": [1, 8, 12], "rebuild": 8, "rebuild_index": 2, "rebuilt": 7, "receiv": [1, 6, 8], "recent": [3, 7], "recipi": 6, "recogn": 12, "recommend": [1, 8], "record": [1, 2, 3, 4, 7, 9, 11], "record_cl": 2, "record_id": 1, "record_polici": 1, "record_typ": 2, "record_url": 1, "recorddeletioncompon": 2, "recordfilesprocessorcompon": 2, "records_info": 2, "recordserviceconfig": 2, "recreat": [7, 8], "recurs": [7, 11], "redi": 8, "redis_domain": 8, "redund": [1, 7, 11], "refactor": 3, "refer": [1, 7, 8, 9, 11, 12], "refere": 12, "reflect": [1, 7, 11], "refresh": 7, "refuge": [6, 12], "regard": 1, "regardless": 8, "regist": [1, 2], "registr": 2, "registrationag": 12, "registrationauthor": 12, "registri": 12, "reindex": 2, "reject": 1, "rel": [1, 6, 12], "relat": [2, 7, 12], "related_identifi": 12, "relatedperson": 12, "relation_typ": 12, "relationscompon": 2, "relationship": 2, "releas": [0, 8], "relev": [1, 12], "reliabl": [1, 8], "reload": [7, 8, 11], "remain": 1, "remot": [3, 4, 7, 8, 11, 12], "remov": [1, 2, 3], "renam": 1, "render": 2, "repeat": 1, "replac": [1, 2, 8], "repo": 7, "report": 12, "repositori": [0, 7, 8, 12], "repres": [1, 7], "represent": 1, "request": [2, 3, 7, 8], "requir": [2, 6, 7, 9, 11, 12], "require_permiss": 2, "research": [0, 1, 6, 11, 12], "researchgroup": 12, "researchparticip": 12, "reserv": 1, "resid": [6, 12], "resourc": [1, 2, 3, 8, 9, 11], "resource_typ": 12, "resourcetypegener": 12, "respect": 7, "respond": 7, "respons": [2, 8], "rest": [8, 9, 11], "rest_api_award": 1, "rest_api_commun": 1, "rest_api_drafts_record": 1, "rest_api_fund": 1, "rest_api_group": 1, "rest_api_index": 1, "rest_api_memb": 1, "rest_api_nam": 1, "rest_api_oaipmh_set": 1, "rest_api_request": 1, "rest_api_review": 1, "rest_api_statist": 1, "rest_api_us": 1, "rest_api_vocabulari": 1, "restart": [7, 8, 11], "restor": [1, 2], "restore_record": 2, "restrict": [1, 2, 12], "result": [1, 2, 3], "result_item": 2, "result_item_cl": 2, "result_list": 2, "result_list_cl": 2, "retriev": 2, "return": [1, 2], "review": [1, 2, 12], "review_polici": 1, "review_requir": 1, "reviewcompon": 2, "revis": 2, "revision_id": [1, 2], "right": [3, 8, 12], "rightshold": 12, "robust": 1, "role": [1, 6, 8, 9], "roll": 2, "root": [7, 8], "rout": 3, "rule": 1, "run": [2, 6, 8, 9, 11], "run_compon": 2, "runner": 7, "same": [1, 2, 6, 8, 12], "sandbox": 12, "save": 6, "scan": 2, "scan_expired_embargo": 2, "scan_vers": 2, "schema": [1, 2, 3, 9], "schema_access_set": 2, "schema_gr": 2, "schema_par": 2, "schema_quota": 2, "schema_request_access": 2, "schema_secret_link": 2, "schema_tombston": 2, "scheme": [1, 6, 9], "scholarli": 12, "scienc": [6, 12], "screenplayauthor": 12, "script": [7, 11], "scroll": 2, "search": [1, 3, 4, 11, 12], "search_draft": 2, "search_gc_delet": 2, "search_opt": 2, "search_prefer": 2, "search_queri": 2, "search_record": 2, "search_vers": 2, "searchopt": 2, "second": [1, 6, 12], "secret": [2, 8], "section": 12, "secur": [1, 8], "see": [0, 7, 8, 11, 12], "seen": 8, "segment": 1, "select": [3, 12], "selector": 3, "selenium": 7, "self": [1, 2, 3], "self_html": 1, "semant": [6, 7], "semver": 7, "send": 6, "sent": [1, 6], "separ": [1, 7, 8, 11], "seri": [6, 12], "serial": [2, 4], "series_titl": [6, 12], "series_volum": [6, 12], "serv": [1, 3, 8, 11, 12], "server": [2, 7, 11], "serverless": 8, "servic": [3, 4, 6, 9, 12], "service_id": 2, "servicecompon": 2, "serviceconfig": 2, "services_setup": 11, "serviceschemawrapp": 2, "session": 8, "set": [1, 2, 3, 6, 7, 8, 11, 12], "set_quota": 2, "set_user_quota": 2, "settings_html": 1, "setup": [7, 8, 9], "sever": [1, 8], "sexual": 12, "sh": [7, 8, 11], "shadow": 2, "shape": 1, "share": [0, 1, 3, 8, 12], "shell": 8, "short": [1, 12], "should": [1, 3, 6, 7, 8, 11, 12], "side": [2, 12], "sidebar": 3, "signal": [1, 2, 6], "signalcompon": 2, "similarli": [6, 11, 12], "simpl": [2, 6, 12], "simpli": [1, 7, 8], "sinc": [1, 2, 3, 4, 7, 8], "singl": [1, 4, 7, 12], "site": [3, 4, 8, 9, 11], "size": [1, 8, 12], "skip": 2, "sl": 8, "slackbot": 8, "slide": 12, "slider": 8, "slight": 1, "slug": 1, "so": [1, 2, 3, 4, 6, 7, 8, 11, 12], "social": [1, 3], "soft": [1, 2], "softwar": [6, 12], "solut": 8, "solv": 3, "some": [2, 3, 6, 7, 11, 12], "someth": 8, "sometim": [3, 7], "sort": [2, 3, 12], "sort_default": 2, "sort_default_no_queri": 2, "sort_opt": 2, "sortbi": 1, "sourc": [2, 7, 8, 11], "speaker": 12, "specif": [2, 3, 6, 8, 12], "specifi": [1, 8], "sponsor": [6, 12], "sqlalchemi": 2, "squash": 7, "src": 7, "sso_saml_idp": 1, "stage": [4, 7, 8], "stamp": 8, "stand": 7, "standalon": 8, "standard": [6, 12], "standardisierung": 12, "start": [1, 7], "stat": [4, 6, 12], "state": [2, 12], "stateless": 1, "statement": 11, "static": [3, 11], "statist": 1, "statu": [6, 12], "stdout": 8, "step": [1, 7, 8, 11], "still": 1, "stop": [7, 8, 11], "storag": [1, 2], "store": [0, 1, 2, 4, 6, 7, 8, 12], "str": 1, "stream": 1, "streamlin": 9, "strict_valid": 1, "strictli": [], "string": [1, 3, 6, 12], "strongli": [6, 12], "structur": [8, 12], "studi": 1, "style": 7, "sub": [4, 6, 8, 12], "subfold": 1, "submiss": [1, 3], "submit": [1, 3], "submitt": [6, 12], "submodul": 11, "subsequ": 1, "subservic": 2, "substant": [6, 12], "subtitl": 12, "subtyp": 12, "succe": 1, "succeed": 1, "successfulli": 1, "sudo": 8, "suffici": 1, "suffix": 7, "suggest": [6, 12], "suit": 7, "suitabl": 4, "superus": 8, "supervisor": 12, "supplement": [6, 12], "suppli": [1, 8], "support": [1, 7, 8, 12], "sur": 8, "sure": [7, 8], "susequ": 1, "syllabi": [6, 12], "syllabu": 12, "sync": 3, "syntax": 8, "synthet": 4, "system": [0, 1, 3, 4, 7, 11], "systemd": 8, "t": [8, 11], "tab": 8, "tabl": 8, "tag": [6, 12], "tail": 8, "tailor": 12, "take": [7, 8, 11], "taken": [1, 12], "task": [1, 2, 7], "taxonomi": 12, "teach": 12, "technic": [3, 12], "technicalstandard": 12, "technisch": 12, "tell": 8, "templat": [2, 9], "temporari": 7, "ten": 12, "term": [1, 12], "termin": [7, 8], "test": [8, 9, 11, 12], "text": [1, 12], "textdocu": 12, "than": [1, 2, 3, 8, 12], "thei": [1, 2, 3, 6, 7, 12], "them": [1, 3, 7, 8, 12], "theses": [6, 12], "thesi": [6, 12], "thi": [1, 2, 3, 4, 6, 7, 8, 11, 12], "thing": 3, "those": [1, 6, 7, 8, 11, 12], "though": [1, 7], "three": [1, 8], "through": [1, 2, 7], "time": [2, 6, 7, 8, 11, 12], "timedelta": 2, "timeout": 1, "titl": [1, 3, 6, 12], "tmp": [7, 8, 11], "token": 8, "token_hex": 8, "token_nam": 1, "tombston": 2, "toml": 7, "tool": [0, 6, 9, 12], "top": [1, 6, 8, 12], "topic": [6, 12], "toronto": [6, 12], "total": [1, 6, 12], "total_volum": 12, "track": 6, "transcrib": 12, "transfer": 1, "translat": 12, "trigger": [1, 2], "true": [1, 2, 6, 11, 12], "truli": 1, "try": [1, 7], "tweak": 3, "two": [1, 3, 6, 7, 8, 12], "txt": 0, "type": [1, 2, 3, 6, 9], "typic": 1, "u": [6, 8, 12], "ubuntu": 8, "ui": [1, 3, 4, 6, 7, 8, 11], "ukranian": [6, 12], "ultim": 7, "unchang": 1, "under": [0, 1, 7, 8, 11, 12], "underli": 4, "uni": 6, "uniqu": 1, "unit": [2, 6, 7], "univers": [6, 12], "unknown": [1, 3], "unless": [1, 7, 8, 11], "unlik": [6, 12], "unmark_record": 2, "unmark_record_for_purg": 2, "unprocessableent": 1, "unpublish": [6, 12], "unread": 6, "until": [1, 2, 7, 12], "uow": 2, "up": [2, 4, 7, 8, 11], "updat": [2, 3, 4, 6, 9, 11, 12], "update_draft": 2, "update_tombston": 2, "upload": [3, 7, 12], "upper": 1, "upstream": 9, "url": [1, 2, 6, 12], "us": [2, 3, 4, 6, 7, 9, 11, 12], "usag": [4, 6, 12], "useless": 3, "user": [2, 3, 4, 7, 9, 12], "user_data_upd": 1, "user_object": 12, "user_profil": 12, "usermod": 8, "usernam": [1, 6], "usr": 8, "usual": [1, 2, 7], "uuid": 1, "uwsgi": [7, 11], "uwsgi_api": 11, "uwsgi_rest": 8, "uwsgi_ui": [7, 8, 11], "v": [7, 8], "v1": [1, 12], "v16": 8, "v2": 8, "v3": [6, 12], "valid": [1, 2, 6, 12], "validate_draft": 2, "valu": [1, 2, 3, 6, 8, 12], "var": [8, 11], "variabl": [1, 6, 7], "variat": [6, 12], "varieti": [11, 12], "variou": [8, 11, 12], "veri": 7, "verifi": 2, "version": [0, 1, 2, 3, 6, 9, 11, 12], "via": [2, 6, 7, 8], "videorecord": 12, "view": [1, 2, 3, 6, 7, 12], "virtual": 8, "virtualenv": 8, "visibl": [1, 3, 7, 12], "visualart": 12, "vocabulari": [1, 3, 9, 11], "volum": [6, 7, 8, 12], "voluntarili": [6, 12], "wa": [1, 3, 6, 12], "wai": [1, 6, 8, 12], "walk": 7, "want": [1, 6, 7, 8, 11, 12], "warn": [1, 4, 6, 7, 12], "watch": [7, 8], "watercolor": [6, 12], "we": [1, 7, 12], "web": [7, 8, 11], "webdriv": 7, "webhook": [1, 6], "webpack": [3, 7], "webpackthemebundl": 7, "websit": 1, "well": [1, 2, 3, 6, 7, 8], "were": [1, 2, 3, 6, 8, 12], "what": [7, 12], "whatev": 2, "when": [1, 2, 3, 6, 7, 8, 11, 12], "whenev": [4, 7], "where": [1, 3, 7, 8, 11, 12], "wherev": 7, "whether": [1, 2, 6], "which": [1, 2, 3, 6, 7, 8, 11, 12], "whichev": 8, "while": [1, 2, 7, 11, 12], "white": [6, 12], "whitepap": 12, "who": 12, "whole": [3, 6, 12], "whose": [1, 3], "why": 1, "wide": 12, "widget": 3, "wikidata": 12, "window": [7, 8], "wip": 7, "wish": 1, "wit": 12, "within": [1, 3, 6, 12], "without": [1, 7, 8, 12], "word": 3, "wordpress": [], "work": [0, 2, 3, 6, 7, 11, 13], "worker": [1, 4, 7], "workflow": [2, 12], "workingpap": 12, "workpackagelead": 12, "workshop": [6, 12], "worldcat": [6, 12], "would": [1, 3, 4, 6, 7, 8, 12], "wp": 1, "wrap": [3, 4], "wrapper": 1, "writerofaccompani": 12, "written": 8, "wsl2": 7, "www": [6, 8, 12], "x": [8, 12], "x86_64": 8, "y": 1, "ye": [1, 7], "yet": [1, 8], "yml": [7, 8, 11], "you": [1, 4, 6, 7, 8, 11, 12], "your": [1, 7], "zenodo": 12, "zip": 1, "zshrc": 8}, "titles": ["About", "API", "KCWorks Architecture", "Changes", "CLI Commands", "Configuration of InvenioRDM", "Customizations to InvenioRDM", "Developing KCWorks", "In-depth Installation Instructions (NEEDS UPDATING)", "Welcome to the Knowledge Commons Works technical documentation!", "KCWorks Infrastructure", "Installation", "Metadata Schema, Vocabularies, and Identifiers", "Reference"], "titleterms": {"": [1, 2], "0": [3, 8], "01": 3, "09": 3, "1": [3, 8, 11], "10": [3, 8], "11": 3, "12": 3, "16": 8, "17": 8, "18": 3, "2": [3, 11], "20": 8, "2024": 3, "2025": 3, "3": [3, 8, 11], "30": 3, "4": [3, 11], "5": [3, 11], "6": 11, "9": 8, "A": 1, "In": [6, 8], "The": [1, 7], "about": [0, 6, 8], "access": 1, "ad": 7, "add": 8, "addit": 8, "admin": [8, 11], "ai_usag": [6, 12], "all": 1, "an": [1, 7, 8], "api": [1, 6, 12], "app": [2, 6], "applic": [8, 11], "architectur": 2, "asset": 11, "attach": 2, "augment": 2, "authent": [1, 6], "autom": 7, "baseservic": 2, "baseservicecompon": 2, "basic": 7, "beta3": 3, "beta4": 3, "beta5": 3, "beta6": 3, "beta7": 3, "beta8": 3, "bodi": 1, "book_seri": [6, 12], "branch": 7, "build": [7, 8, 11], "bulk": 6, "can": 1, "celeri": 8, "cfg": 7, "chang": [1, 3, 7], "chapter_label": [6, 12], "class": 2, "cli": [4, 8], "clone": [8, 11], "code": [1, 7, 8], "collect": [1, 6, 12], "collis": 1, "command": [4, 8], "commit": 7, "committee_deposit": [6, 12], "common": [1, 8, 9], "commons_domain": [6, 12], "commons_search_recid": [6, 12], "commons_search_upd": [6, 12], "commun": 6, "compon": 2, "compos": [8, 11], "config": 2, "configur": [1, 2, 5, 8, 11], "contain": [4, 8], "container": 8, "content": [6, 9], "content_warn": [6, 12], "context": 8, "contributor": [6, 12], "control": [7, 8, 11, 12], "copyright": 0, "core": [6, 12], "course_titl": [6, 12], "creat": [1, 8, 11], "creation": 12, "creator": [6, 12], "credenti": 8, "css": 7, "custom": [4, 6, 12], "custom_field": [6, 12], "data": [1, 6], "databas": [8, 11], "deeper": 7, "degre": [6, 12], "delet": 1, "deposit": 6, "deprec": 12, "depth": 8, "detail": 6, "develop": [7, 11], "dig": 7, "disciplin": [6, 12], "docker": [8, 11], "document": [9, 13], "doe": 1, "doi": 12, "draft": [], "duplic": 1, "edit": [6, 12], "email": 6, "enabl": 8, "endpoint": 1, "ensur": 8, "entri": 7, "environ": 8, "error": [1, 8], "event": 1, "exampl": 12, "extern": 7, "fail": 1, "fast": [7, 12], "field": [6, 12], "file": [1, 2, 7, 8, 11], "file_loc": [6, 12], "file_pid": [6, 12], "first": 6, "fix": 8, "flask": 11, "fly": 7, "folder": 7, "fork": 6, "form": 6, "found": 8, "framework": 6, "from": [2, 12], "fromconfigsearchopt": 2, "full": 11, "funder": 12, "get": 1, "git": [7, 11], "gnd": 12, "grid": 12, "group": [1, 6], "groups_for_deposit": [6, 12], "handl": [1, 12], "happen": 1, "have": 1, "hc": [6, 12], "hclegaci": [6, 12], "head": 12, "header": 1, "homosauru": 12, "html": 7, "i": [1, 8], "identifi": 12, "implement": [6, 12], "import": [1, 6], "includ": 7, "indic": 8, "inform": 8, "infrastructur": 10, "initi": [8, 11], "instal": [8, 11], "instanc": [1, 7], "institution_depart": [6, 12], "instruct": 8, "integr": 6, "intern": 1, "invalid": 1, "invenio": [4, 6, 7, 8], "inveniordm": [1, 2, 5, 6, 12, 13], "isbn": 12, "isni": 12, "issn": 12, "j": [7, 8], "javascript": 7, "json": 12, "just": 8, "kc": [6, 12], "kcr": [6, 12], "kcwork": [2, 4, 6, 7, 10, 11, 12], "knowledg": [8, 9], "layer": 2, "legaci": [6, 12], "limit": 7, "line": 8, "linux": 8, "load": 2, "local": [8, 11], "log": 8, "maco": 8, "make": 1, "malform": 1, "media": [6, 12], "meeting_organ": [6, 12], "metadata": [1, 6, 12], "metadata_field": [6, 12], "moder": 6, "modul": [6, 7, 8], "modular": 6, "name": [1, 7], "necessari": 1, "need": [7, 8], "new": [1, 7], "newli": 1, "nginx": 8, "node": [7, 8], "note": [6, 8], "notif": 6, "number": 7, "nvm": 8, "oai": 12, "object": [1, 12], "ofr": 12, "onli": 1, "orcid": 12, "organ": 12, "other": 11, "output": 8, "overrid": 6, "own": 11, "owner": 1, "ownership": 1, "packag": [6, 7], "page": 6, "pagin": 1, "paramet": 1, "patch": 1, "path": 8, "payload": 1, "peopl": 12, "permiss": 1, "pipenv": 8, "point": 7, "post": 1, "previously_publish": [6, 12], "primari": 12, "process": [7, 8], "project": 11, "project_titl": [6, 12], "provis": 6, "provision": 6, "publication_typ": [6, 12], "publication_url": [6, 12], "pyenv": 8, "python": [7, 8], "queri": 1, "queue": 8, "quickstart": 11, "rdm": 6, "rdmrecordservic": 2, "rebuild": 7, "recommend": 12, "record": [6, 12], "record_change_d": [6, 12], "record_creation_d": [6, 12], "record_identifi": [6, 12], "recordservic": 2, "refer": 13, "releas": 7, "remot": 6, "repositori": 11, "request": 1, "requir": [1, 8], "resourc": [6, 12], "respons": 1, "rest": 1, "retriev": [1, 12], "role": 12, "ror": 12, "rotat": 8, "run": [4, 7], "saml": [1, 6], "schema": [6, 12], "scheme": 12, "script": 8, "search": [2, 6, 8], "searchconfig": 2, "searchoptionsmixin": 2, "secondari": 12, "sensit": 8, "server": 8, "servic": [2, 8, 11], "setup": 11, "shutdown": 8, "site": [6, 7, 12], "slow": 7, "some": [1, 8], "sort": 1, "specif": 1, "sponsoring_institut": [6, 12], "standard": 8, "start": [8, 11], "startup": 8, "static": 7, "statu": 1, "step": [], "strategi": 7, "streamlin": 1, "subject": [6, 12], "submitter_affili": [6, 12], "submitter_email": [6, 12], "submitter_id": [6, 12], "submitter_org_membership": [6, 12], "submitter_usernam": [6, 12], "submodul": 7, "success": 1, "sync": 6, "system": [6, 8, 12], "tabl": [], "tag": 7, "task": 8, "technic": 9, "templat": [6, 7], "test": 7, "theme": 7, "time": 1, "token": 1, "tool": 8, "total_download": [6, 12], "total_view": [6, 12], "type": 12, "unsuccess": 1, "updat": [1, 7, 8], "upload": 1, "upstream": 7, "us": [1, 8], "user": [1, 6, 8, 11], "user_defined_tag": [6, 12], "usernam": 12, "uwsgi": 8, "variabl": [2, 8], "version": [7, 8], "via": 1, "view": [8, 11], "vocabulari": [6, 12], "webhook": [], "welcom": 9, "what": 1, "who": 1, "work": [1, 8, 9, 12], "worker": 8, "your": [8, 11]}}) \ No newline at end of file diff --git a/docs/source/architecture.md b/docs/source/architecture.md new file mode 100644 index 000000000..d39a593ff --- /dev/null +++ b/docs/source/architecture.md @@ -0,0 +1,348 @@ +# KCWorks Architecture + +## InvenioRDM's Layered Architecture + +InvenioRDM employs a layered architecture with: + +1. Data layer + - Low-level data storage and retrieval. + - Primarily SQLAlchemy model classes. + - High-level data API classes that provide a Pythonic interface to the data layer. + - Validate data before storing it. +2. Service layer + - Retrieves and modifies data from the data layer, either for a view or for another service. + - Providing abstract CRUD methods for operating on the data layer's API classes. + - Providing abstracted "result items" and "result lists" + - Enforces permission and access control policies. +3. View layer + - Consists of + - Flask views (registered as Blueprints) + - rendering either + - Jinja2 templates to produce HTML + - JSON to produce API responses + - in some cases, React components embedded in the Jinja2 templates + - These are rendered on the client side + - Data is passed from the Jinja2 templates to the React components via HTML data attributes + +## InvenioRDM Services + +An InvenioRDM service is a class that provides methods for interacting with the data layer. The business logic of the service is usually delegated to one or more component classes, which are called during the service's methods. + +### Service Classes + +#### BaseService + +The base Service class is defined in `invenio_records_resources.services.base.Service`. It defines methods for: + +- Getting the service ID + - `id(self)`: Return the id of the service from config. +- Permissions checking + - `permission_policy(self, action_name, **kwargs)`: Factory for a permission policy instance. + - `check_permission(self, identity, action_name, **kwargs)`: Check a permission against the identity. + - `require_permission(self, identity, action_name, **kwargs)`: Require a specific permission from the permission policy. +- Handling service components + - `components(self)`: Return initialized instances of the service's component classes. + - `run_components(self, action, *args, **kwargs)`: Run components for a given action. +- Producing result items and lists + - `result_item(self, *args, **kwargs)`: Create a new instance of the resource unit, i.e. whatever the service provides. + - `result_list(self, *args, **kwargs)`: Create a new list of resource units. In some cases this is a simple iterable of resource units, but in other cases it is a more complex object that includes additional data. + +#### RecordService + +Services dealing with InvenioRDM records of some kind (e.g. records, drafts, communities, etc.) inherit from the `RecordService` class defined in `invenio_records_resources.services.records.service`. This class adds: + +- properties and methods related to the service's related data-layer API class + - A `schema` property that returns a `ServiceSchemaWrapper` instance. + - A `record_cls` property that returns the record class for the service. + - A `links_item_tpl` property that returns a `LinksTemplate` instance for constructing links to a resource unit. + - An `expandable_fields` property that returns a list of expandable fields for the service's data-layer API class. +- Methods for creating searches + - `create_search(self, identity, record_cls, search_opts, permission_action="read", preference=None, extra_filter=None, versioning=True)`: Instantiate a search class. + - `search_records(self, identity, params, **kwargs)`: A low-level method to create an OpenSearch DSL instance for searching records. + - `search(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: A high-level method to search for records matching the querystring. + - `scan(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: A high-level method to perform a rolling "scroll" search for records matching the querystring. (This is used for searching through large numbers of records, since OpenSearch will not return more than 10,000 records at a time.) +- Methods for indexing records + - `reindex(self, identity, params=None, search_preference=None, search_query=None, extra_filter=None, **kwargs)`: A high-level method to reindex records matching the query parameters. + - `rebuild_index(self, identity, uow=None)`: A high-level method to reindex all records managed by this service. +- CRUD methods + - `create(self, identity, data, uow=None, expand=False)`: Create a record. + - `exists(self, identity, id_)`: Check if the record exists and user has permission. (Does *not* use the search index.) + - `read(self, identity, id_, expand=False, action="read")`: Retrieve a record. (Does *not* use the search index.) + - `read_many(self, identity, ids, expand=False, action="read")`: Retrieve multiple records using the search index. + - `read_all(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: Retrieve all records matching the query parameters using the search index. + - `update(self, identity, id_, data, uow=None, expand=False)`: Update a record. + - `delete(self, identity, id_, uow=None)`: Delete a record. +- Helper methods for record management + - `check_revision_id(self, record, expected_revision_id)`: Validate the given revision_id with current record's one. + - `on_relation_update(self, identity, record_type, records_info, notif_time, limit=100)`: Handles the update of a related field record when the related field is updated. + +#### Augmented RecordService + +The `invenio_drafts_resources` package then overrides this with a `RecordService` class that adds (a) a distinction between published and draft records, (b) record versioning and a parent-child record relationship, and (c) file attachments to service records. This adds the following properties and methods to the `RecordService` class: + +- Properties and methods for draft records + - `draft_cls(self)`: Return the record class for the service. + - `draft_files(self)`: Return the draft files service for the service. + - `draft_indexer(self)`: A factory for creating an indexer instance. + - `search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Search for draft records matching the querystring. + - `read_draft(self, identity, id_, expand=False)`: Retrieve a draft record. + - `update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False)`: Replace a draft. + - `edit(self, identity, id_, uow=None, expand=False)`: Creates a new revision of a draft or a draft for an existing published record. + - `publish(self, identity, id_, uow=None, expand=False)`: Publishes a draft record. + - `delete_draft(self, identity, id_, revision_id=None, uow=None)`: Deletes a draft record. (Defaults to a soft delete, so the record is not actually deleted from the database or search index until a later cleanup operation.) + - `validate_draft(self, identity, id_, ignore_field_permissions=False)`: Validate a draft. + - `cleanup_drafts(self, timedelta, uow=None, search_gc_deletes=60)`: Hard delete of soft deleted drafts. +- Properties and methods for files + - `files(self)`: Return the files service for the service. + - `import_files(self, identity, id_, uow=None)`: Import files from previous record version. +- Properties and methods for versions and parent records + - `schema_parent(self)`: Return the parent schema for the service. + - `search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs)`: Search for record's versions. + - `read_latest(self, identity, id_, expand=False)`: Retrieve the latest version of a record. + - `new_version(self, identity, id_, uow=None, expand=False)`: Creates a new version of a record. +This overridden `RecordService` class also modifies the CRUD methods to enforce a workflow in which records are only modified via their draft records. This involves overriding: + +- `update(self, identity, id_, data, uow=None, expand=False)`: Now raises a `NotImplementedError` error. +- `create(self, identity, data, uow=None, expand=False)`: Now creates a draft record. +- `rebuild_index(self, identity)`: Now reindexes all draft records (instances of draft API class) as well as all published records (instances of record API class) and skips soft-deleted records. + +#### RDMRecordService + +The `invenio_rdm_records` package provides an `RDMRecordService` class that inherits from the `RecordService` class and adds: + +- Additional properties for accessing subservices + - `access`: Return the access service for the service. + - `pids`: Return the PIDs service for the service. + - `review`: Return the review service for the service. +- Methods for embargo handling + - `lift_embargo(self, identity, _id, uow=None)`: Lifts an embargo from the record and draft (if exists). + - `scan_expired_embargos(self, identity)`: Scan for records with an expired embargo. +- Properties and methods for file quota handling + - `schema_quota`: Return the schema for quota information. + - `set_quota(self, identity, id_, data, files_attr="files", uow=None)`: Set the quota values for a record. + - `set_user_quota(self, identity, id_, data, uow=None)`: Set the user files quota. +- Properties and methods for deletion of published records + - `schema_tombstone`: Return the schema for tombstone information. + - `delete_record(self, identity, id_, data, expand=False, uow=None, revision_id=None)`: Re-introduces soft-deletion of published records (which were previously removed by the `RecordService` class). + - `update_tombstone(self, identity, id_, data, expand=False, uow=None)`: Update the tombstone information for the (soft) deleted record. + - `cleanup_record(self, identity, id_, uow=None)`: Clean up a (soft) deleted record. + - `restore_record(self, identity, id_, expand=False, uow=None)`: Restore a record that has been (soft) deleted. + - `mark_record_for_purge(self, identity, id_, expand=False, uow=None)`: Mark a (soft) deleted record for purge. + - `unmark_record_for_purge(self, identity, id_, expand=False, uow=None)`: Remove the mark for deletion from a record, returning it to deleted state. + - `purge_record(self, identity, id_, uow=None)`: Purge a record that has been marked. +- Overridden methods to add deletion-related functionality + - `read(self, identity, id_, expand=False, action="read", include_deleted=False)`: Adds an `include_deleted` argument to the read method, and a check for the `read_deleted` permission if it is set to `True`. + - `read_draft(self, identity, id_, expand=False)`: Prevents reading a draft if there is a published deleted record. (410 response.) + - `search(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Adds a "read_deleted" permission action to the search method. + - `search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Adds a filter to exclude soft-deleted records from the search results. + - `search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs)`: Adds a "read_deleted" permission action to the search method. +- Additional overridden methods for other functionality + - `publish(self, identity, id_, uow=None, expand=False)`: Adds a check prior to the original publish method to allow enforcement of a config setting that requires a community to be present on a record before it can be published. + - `update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False)`: Adds a check prior to the original update_draft method to allow enforcement of a config setting that prevents a record from being restricted after the grace period. +- Additional new methods for other functionality + - `expandable_fields`: Expands the `communities` field to return community details. + - `oai_result_item(self, identity, oai_record_source)`: Get a result item from a record source in the OAI server. + - `scan_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read_deleted", **kwargs)`: Search for record's versions using a "scroll" search. + +### Service Configuration + +A service configuration is an object that provides the service with its configuration. It is passed to the service's constructor when it is instantiated during the Flask app initialization. + +The service configuration is defined in the service's `config` attribute. + +All service configurations inherit from the `ServiceConfig` class, which is defined in `invenio_records_resources.services.base.config`. They include at least: + +- `service_id`: The ID of the service. +- `permission_policy_cls`: The permission policy class to use for the service. +- `result_item_cls`: The result item class to use for the service. +- `result_list_cls`: The result list class to use for the service. + +This is expanded in a `RecordServiceConfig` class by the `invenio_records_resources` package to add: + +- `record_cls`: The record class to use for the service. +- `indexer_cls`: The indexer class to use for the service. +- `indexer_queue_name`: The name of the task queue to be used by the service's indexer. +- `index_dumper`: The dumper to be used for serializing records to be indexed by OpenSearch. +- `relations`: The inverse relation mapping for the service, defining which fields relate to which record type. +- `search`: The search configuration for the service. (This is a `SearchOptions` instance.) +- `schema`: The schema to be used when validating the service's records. +- `links_item`: The template for creating url links for the service's result items. +- `links_search`: The template for creating url links for the service's search endpoints. +- `components`: A list of components that will be used by the service. + +It is further expanded in an overridden `RecordServiceConfig` class by the `invenio_drafts_resources` package to add: + +- `draft_cls`: The draft record class to use for the service. +- `draft_indexer_cls`: The indexer class to use for the service's draft records. +- `draft_indexer_queue_name`: The name of the task queue to be used by the service's draft records indexer. +- `schema_parent`: The schema used to valid parent records for the service. +- `search_drafts`: A search class for searching for draft records. +- `search_versions`: A search class for searching for record versions. +- `default_files_enabled`: Whether files are enabled by default for the service. +- `default_media_files_enabled`: Whether media files are enabled by default for the service. +- `lock_edit_published_files`: Whether to lock editing of published files for the service. +- `links_search_drafts`: The template for creating url links for the service's search drafts endpoint. +- `links_search_versions`: The template for creating url links for the service's search versions endpoint. + +The `RDMRecordServiceConfig` class adds the following additional configuration attributes: + +- `max_files_count`: The maximum number of files that can be attached to a record. +- `file_links_list`: The list of file links for the service. +- `schema_access_settings`: The schema for access settings. +- `schema_secret_link`: The schema for secret links. +- `schema_grant`: The schema for grants. +- `schema_grants`: The schema for grants. +- `schema_request_access`: The schema for request access. +- `schema_tombstone`: The schema for tombstone. +- `schema_quota`: The schema for quota. + + +Additional common configration attributes are added by inheriting from additional mixin classes. + +#### Attaching configuration to the service + +The service config class can be passed to the service's constructor when it is instantiated during the Flask app initialization (i.e., in the `init_app()` method of the extension): + +```python +service = MyService(config=MyServiceConfig) +``` + +Alternatively, if the service config class inherits from the `ConfiguratorMixin` class, the service and its config class can be initialized like this: + +```python +service = MyService(MyServiceConfig.build(app)) +``` + +#### File service configuration + +The `FileConfigMixin` class (defined in `invenio_records_resources.services.records.components.files`) adds config class attributes for: ???? + +- `_files_attr_key`: The attribute key for the files field. +- `_files_data_key`: The attribute key for the files data. +- `_files_bucket_attr_key`: The attribute key for the files bucket. +- `_files_bucket_id_attr_key`: The attribute key for the files bucket ID. + +#### Search configuration + +##### SearchOptionsMixin + +This mixin class (defined in `invenio_records_resources.services.base.config`) adds config class attributes for: + +- `facets`: The search facet definitions for searches on the service's resource. +- `sort_options`: The sort options for searches on the service's resource. +- `sort_default`: The default sort option for searches on the service's resource. +- `sort_default_no_query`: The default sort option for searches on the service's resource when no query is present. +- `available_sort_options`: The available sort options for searches on the service's resource. +- `query_parser_cls`: The query parser class to use in constructing searches on the service's resource. + +##### SearchConfig + +The SearchConfig class (defined in `invenio_records_resources.services.base.config`) defines the search configuration that will be used to interface with OpenSearch. + +##### FromConfigSearchOptions + +The `FromConfigSearchOptions` class (defined in `invenio_records_resources.services.base.config`) is used to load search configuration from app config variables. In the service's config class, it is used like this: + +#### Loading configuration from app config variables + +The `FromConfig` class (defined in `invenio_records_resources.services.base.config`) is used to load configuration from app config variables. In the service's config class, it is used like this: + +```python +class MyServiceConfig(ServiceConfig): + foo = FromConfig("FOO", default=1) +``` + +In the app config, the config variable is defined like this: + +```python +FOO = 2 +``` + +When the service is instantiated, the `FromConfig` class will load the config variable from the app config and assign it to the `foo` attribute. + +### Service Components + +A service component is a class that provides methods that shadow the service's methods. When a service method is called, it passes the call through each of the service's components (using the `Service.run_components()` method), allowing each component to perform additional processing before the result is returned. If the service component includes a method with the same name as the service method that is being called, its matching method will be called. During this call, the component method is passed the service method's arguments and keyword arguments, and the service method's modified versions of these arguments are passed on to the next component. Once all the service's components have been called, the result is returned to the service method, which returns the final result or performs the final action. + +#### BaseServiceComponent + +The `BaseServiceComponent` class (defined in `invenio_records_resources.services.base.components`) is the base class for all service components. It provides a `uow` property that returns the Unit of Work manager. + +This class is overridden by the `ServiceComponent` class (defined in `invenio_records_resources.services.base.components.base`), which adds the following methods: + +- `create(self, identity, **kwargs)`: Perform additional processing while creating an item of the service's resource. +- `read(self, identity, **kwargs)`: Perform additional processing while retrieving an item of the service's resource. +- `update(self, identity, **kwargs)`: Perform additional processing while updating an item of the service's resource. +- `delete(self, identity, **kwargs)`: Perform additional processing while deleting an item of the service's resource. +- `search(self, identity, search, params, **kwargs)`: Perform additional processing while searching for items of the service's resource. + +The `invenio_drafts_resources` package overrides the `ServiceComponent` class to add methods matching the overridden RecordService methods for draft records and versioning. + +- `read_draft(self, identity, draft=None)`: Retrieve a draft record. +- `update_draft(self, identity, data=None, record=None, errors=None)`: Update a draft record. +- `delete_draft(self, identity, draft=None, record=None, force=False)`: Delete a draft record. +- `edit(self, identity, draft=None, record=None)`: Edit a record. +- `new_version(self, identity, draft=None, record=None)`: Create a new version of a record. +- `publish(self, identity, draft=None, record=None)`: Publish a draft record. +- `import_files(self, identity, draft=None, record=None)`: Import files from previous record version. +- `post_publish(self, identity, record=None, is_published=False)`: Post publish handler. + +#### RecordService Components + +The `invenio_records_resources` package provides the following components for the `RecordService` class: + +- `DataServiceComponent` (create, update): Adds data to the record. +- `BaseRecordFilesComponent` (create, update): + - Handles enabling/disabling files for a record. + - Handles setting the default preview file for a record. +- `MetadataComponent` (create, update): Adds metadata to the new/updated record from the input data. +- `RelationsComponent` (read): Dereferences a record's related fields in order to provide the data from the related records in a read result. +- `ChangeNotificationsComponent` (update): Emits a change notification for the updated record. + +The `invenio_drafts_resources` package provides additional components for the `RecordService` class: + +- an overridden `BaseRecordFilesComponent` class that adds methods for ??? +- `DraftFilesComponent`: Handles files for draft records. +- `DraftMediaFilesComponent`: Handles media files for draft records. +- `DraftMetadataComponent`: Handles metadata for draft records. +- `PIDComponent` (create, delete_draft): Handles registration of PIDs for draft records. +- an overridden `RelationsComponent` class that adds a `read_drafts` method + +The `invenio_rdm_records` package provides additional components for the `RDMRecordService` class: + +- `AccessComponent`(create, update_draft, publish, edit, new_version): Handles access settings for records. +- an overridden `MetadataComponent` class (create, update_draft, publish, edit, new_version): Adds metadata to the new/updated record from the input data. (Removes the `update` method from the earlier `MetadataComponent` class.) +- `CustomFieldsComponent`(create, update_draft, publish, edit, new_version): Adds custom fields to the metadata of a record. +- `PIDsComponent`(create, update_draft, delete_draft, publish, edit, new_version, delete_record, restore_record): Handles PIDs for records. +- `ParentPIDsComponent`(create, publish, delete_record, restore_record): Handles parent PIDs for records. +- `RecordDeletionComponent`(delete_record, update_tombstone, restore_record, mark_record, unmark_record, purge_record): Handles deletion of records. +- `RecordFilesProcessorComponent`(publish, lift_embargo): Handles file processing for records. +- `ReviewComponent`(create, delete_draft, publish): Handles reviews for records. +- `SignalComponent`(publish): Triggers signals on publish. +- `ContentModerationComponent`(publish): Creates a moderation request if the user is not verified. + +#### RDMRecordService Components + +The `invenio_rdm_records` package draws its list of components from the `RDM_RECORDS_SERVICE_COMPONENTS` config variable. The default list is defined in the `DefaultRecordsComponents` class (defined in `invenio_rdm_records.services.config`) and currently includes:. + +```python +[ + MetadataComponent, + CustomFieldsComponent, + AccessComponent, + DraftFilesComponent, + DraftMediaFilesComponent, + RecordFilesProcessorComponent, + RecordDeletionComponent, + # for the internal `pid` field + PIDComponent, + # for the `pids` field (external PIDs) + PIDsComponent, + ParentPIDsComponent, + RelationsComponent, + ReviewComponent, + ContentModerationComponent, +] +``` + +Note that the order of the components in the list is important, since the components are called in the order they are listed and some components depend on the results of previous components. \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 59ce7a8bd..4d71aac95 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -20,6 +20,7 @@ Welcome to the Knowledge Commons Works technical documentation! cli_commands infrastructure developing + architecture in_depth reference From 824876d795a2cd59e58a1756bfc1a77b30ff1d57 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Mon, 27 Jan 2025 19:29:31 -0500 Subject: [PATCH 07/16] feature(wip): Working on streamlined import api --- .../invenio-record-importer-kcworks | 2 +- site/tests/api/test_api_import.py | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 site/tests/api/test_api_import.py diff --git a/site/kcworks/dependencies/invenio-record-importer-kcworks b/site/kcworks/dependencies/invenio-record-importer-kcworks index d4de88408..90265b574 160000 --- a/site/kcworks/dependencies/invenio-record-importer-kcworks +++ b/site/kcworks/dependencies/invenio-record-importer-kcworks @@ -1 +1 @@ -Subproject commit d4de884081bd6155335cfe3b7e6af3e06e148547 +Subproject commit 90265b574a1a232bf0f546ad29d5fa48468e4db7 diff --git a/site/tests/api/test_api_import.py b/site/tests/api/test_api_import.py new file mode 100644 index 000000000..b92148589 --- /dev/null +++ b/site/tests/api/test_api_import.py @@ -0,0 +1,75 @@ +from invenio_access.permissions import authenticated_user +from invenio_access.utils import get_identity +import json +from pathlib import Path + + +def test_import_records( + running_app, + db, + client_with_login, + minimal_community_factory, + user_factory, + minimal_record_metadata, + search_clear, + mock_send_remote_api_update_fixture, +): + app = running_app.app + community = minimal_community_factory() + u = user_factory(email="test@example.com", token=True, saml_id=None) + token = u.allowed_token + identity = get_identity(u.user) + identity.provides.add(authenticated_user) + + file_path = ( + Path(__file__).parent.parent.parent / "tests/helpers/sample_files/sample.pdf" + ) + file_list = [{"key": "sample.pdf"}] + minimal_record_metadata["files"] = {"enabled": True, "entries": file_list} + + with app.test_client() as client: + with open( + file_path, + "rb", + ) as binary_file_data: + binary_file_data.seek(0) + response = client.post( + f"{app.config['SITE_API_URL']}/import/{community.to_dict()['slug']}", + content_type="multipart/form-data", + data={ + "metadata": json.dumps(minimal_record_metadata), + "review_required": "true", + "strict_validation": "true", + "all_or_none": "true", + "files": [ + ( + file_path, + "sample.pdf", + "application/pdf", + ) + ], + }, + headers={"Authorization": f"Bearer {token}"}, + ) + print(response.text) + print(app.config["SITE_API_URL"]) + print(f"{app.config['SITE_API_URL']}/import/{community.to_dict()['slug']}") + assert response.status_code == 200 + assert response.json == {"status": "success", "data": []} + + +# import requests + +# url = "https://works.hcommons.org/api/import" + +# payload = {'collection': 'mlacommons'} +# files=[ +# ('file1',('Test.pdf',open('/Users/ianscott/Downloads/Test.pdf','rb'),'application/pdf')) +# ] +# headers = { +# 'Cookie': 'SimpleSAMLCommons=41b2316ef1cefa7c21fa257f50b95b1b' +# } + +# response = requests.request("POST", url, headers=headers, data=payload, files=files) + +# print(response.text) From 0cebc1ff8b29bba5153b3bc53244c326daab9a18 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Wed, 29 Jan 2025 12:08:34 -0500 Subject: [PATCH 08/16] feature(neh; import): Work in progress on import API endpoint; basic endpoint responding to test --- .../dependencies/invenio-record-importer-kcworks | 2 +- site/tests/api/conftest.py | 4 ++-- site/tests/api/test_api_import.py | 10 ++++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/site/kcworks/dependencies/invenio-record-importer-kcworks b/site/kcworks/dependencies/invenio-record-importer-kcworks index 90265b574..4fa418ba7 160000 --- a/site/kcworks/dependencies/invenio-record-importer-kcworks +++ b/site/kcworks/dependencies/invenio-record-importer-kcworks @@ -1 +1 @@ -Subproject commit 90265b574a1a232bf0f546ad29d5fa48468e4db7 +Subproject commit 4fa418ba7d801928c63f9f9670bc9013ed7ad074 diff --git a/site/tests/api/conftest.py b/site/tests/api/conftest.py index bbc40691a..4be031308 100644 --- a/site/tests/api/conftest.py +++ b/site/tests/api/conftest.py @@ -3,12 +3,12 @@ # from pprint import pprint import pytest -# from invenio_app.factory import create_api +from invenio_app.factory import create_api # from pytest_invenio.fixtures import UserFixture, database, db -# @pytest.fixture(scope='module') +# @pytest.fixture(scope="module") # def create_app(): # return create_api diff --git a/site/tests/api/test_api_import.py b/site/tests/api/test_api_import.py index b92148589..25bc3ecc6 100644 --- a/site/tests/api/test_api_import.py +++ b/site/tests/api/test_api_import.py @@ -2,6 +2,7 @@ from invenio_access.utils import get_identity import json from pathlib import Path +from pprint import pformat def test_import_records( @@ -49,12 +50,13 @@ def test_import_records( ) ], }, - headers={"Authorization": f"Bearer {token}"}, + headers={ + "Content-Type": "multipart/form-data", + "Authorization": f"Bearer {token}", + }, ) print(response.text) - print(app.config["SITE_API_URL"]) - print(f"{app.config['SITE_API_URL']}/import/{community.to_dict()['slug']}") - assert response.status_code == 200 + assert response.status_code == 201 assert response.json == {"status": "success", "data": []} From 38ce7eb136291cee1f7faf2b19cba914eac5cad7 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Wed, 29 Jan 2025 12:09:31 -0500 Subject: [PATCH 09/16] fix(testing): More integration testing for collections and search provisioning --- site/tests/api/test_collections.py | 293 +++++++++++++++++++-- site/tests/fixtures/communities.py | 219 ++++++++------- site/tests/fixtures/search_provisioning.py | 4 +- 3 files changed, 401 insertions(+), 115 deletions(-) diff --git a/site/tests/api/test_collections.py b/site/tests/api/test_collections.py index 68b011ffc..ed0964e84 100644 --- a/site/tests/api/test_collections.py +++ b/site/tests/api/test_collections.py @@ -1,10 +1,15 @@ import pytest +import arrow +from datetime import timedelta import json -from invenio_access.permissions import system_identity, authenticated_user +from invenio_access.permissions import authenticated_user from invenio_access.utils import get_identity +# from pprint import pformat +import re -def test_collection_submission_by_owner( + +def test_collection_submission_by_owner_open( running_app, db, user_factory, @@ -12,41 +17,60 @@ def test_collection_submission_by_owner( minimal_community_factory, minimal_draft_record_factory, headers, + celery_worker, mock_send_remote_api_update_fixture, ): """ - Test the collection submission API. + Test collection submission by the owner when the collection does not require review. + + FIXME: This should not be allowed for collection owners. It violates the + review policy. - Create a collection that requires review, submit a record to it, and confirm that the record is submitted and the review is pending. Accept the review and confirm that the record is published. + Create a collection that requires review, submit a record to it, and confirm + that the record is published without review. """ app = running_app.app - collection_admin = user_factory() - token = collection_admin.token + collection_admin = user_factory(token=True) + token = collection_admin.allowed_token admin_user = collection_admin.user admin_id = admin_user.id + identity = get_identity(admin_user) + identity.provides.add(authenticated_user) # review policy is closed, so *all* submissions require review # record policy is open, so submissions can be received collection_rec = minimal_community_factory( owner=admin_id, access={ - "record_policy": "closed", - "review_policy": "open", + "record_policy": "open", + "review_policy": "closed", }, ) + collection_meta = collection_rec.to_dict() - draft = minimal_draft_record_factory() + draft = minimal_draft_record_factory(identity=identity) + draft_owner = draft.to_dict()["parent"]["access"]["owned_by"] + app.logger.debug(draft_owner) - with app.test_client() as client: + from invenio_rdm_records.services.permissions import RDMRecordPermissionPolicy + + app.logger.debug("RDMPermissionPolicy allows?") + app.logger.debug( + RDMRecordPermissionPolicy(action="update_draft") + .generators[0] + .needs(record=draft._record) + ) - create_review_response = client.post( - f"{app.config['SITE_API_URL']}/api/records/{draft['id']}/draft/review", + with app.test_client() as client: + # client = client_with_login(client, admin_user) + create_review_response = client.put( + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft/review", headers={**headers, "Authorization": f"Bearer {token}"}, data=json.dumps( { "receiver": { - "community": collection_rec["id"], + "community": collection_meta["id"], }, "type": "community-submission", } @@ -54,31 +78,252 @@ def test_collection_submission_by_owner( ) assert create_review_response.status_code == 200 - assert create_review_response.json == {} + created = create_review_response.json["created"] + updated = create_review_response.json["updated"] + review_id = create_review_response.json["id"] + assert create_review_response.json == { + "created": created, + "created_by": {"user": f"{admin_id}"}, + "expires_at": None, + "id": review_id, + "is_closed": False, + "is_expired": False, + "is_open": False, + "links": { + "actions": { + "submit": ( + f"{app.config['SITE_API_URL']}/requests/{review_id}/" + "actions/submit" + ), + }, + "comments": ( + f"{app.config['SITE_API_URL']}/requests/{review_id}/comments" + ), + "self": f"{app.config['SITE_API_URL']}/requests/{review_id}", + "self_html": f"{app.config['SITE_UI_URL']}/requests/{review_id}", + "timeline": ( + f"{app.config['SITE_API_URL']}/requests/{review_id}/timeline" + ), + }, + "number": "1", + "receiver": {"community": collection_meta["id"]}, + "revision_id": 2, + "status": "created", + "title": "", + "topic": {"record": draft["id"]}, + "type": "community-submission", + "updated": updated, + } read_draft_response = client.get( - f"{app.config['SITE_API_URL']}/api/records/{draft['id']}", + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft", headers={**headers, "Authorization": f"Bearer {token}"}, ) assert read_draft_response.status_code == 200 assert read_draft_response.json["id"] == draft["id"] - assert read_draft_response.json["access"]["review"] == { - "receiver": { - "community": collection_rec["id"], - }, + assert read_draft_response.json["parent"]["review"] == { + "id": review_id, + "links": {}, + "receiver": {"community": collection_meta["id"]}, + "status": "created", + "title": "", "type": "community-submission", } - response = client.post( - f"{app.config['SITE_API_URL']}/api/records/{draft['id']}/draft/submit-review", + submit_response = client.post( + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft/" + "actions/submit-review", + headers={**headers, "Authorization": f"Bearer {token}"}, + data=json.dumps( + { + "payload": { + "content": "Thank you in advance for the review", + "format": "html", + } + } + ), + ) + assert submit_response.status_code == 202 + + read_response = client.get( + f"{app.config['SITE_API_URL']}/records/{draft['id']}", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert read_response.status_code == 200 + assert read_response.json["id"] == draft["id"] + assert read_response.json["is_published"] + assert read_response.json["status"] == "published" + + +def test_collection_submission_by_curator_closed( + running_app, + db, + user_factory, + client_with_login, + minimal_community_factory, + minimal_draft_record_factory, + headers, + mock_send_remote_api_update_fixture, + celery_worker, +): + """ + Test the collection submission API by a curator when the collection requires review. + + Intended to confirm that the review policy is enforced. + + Create a collection that requires review, submit a record to it, and confirm + that the record is submitted and the review is pending. Accept the review and + confirm that the record is published. + """ + app = running_app.app + u = user_factory(email="test@example.com", token=True, saml_id=None) + token = u.allowed_token + identity = get_identity(u.user) + identity.provides.add(authenticated_user) + + admin_u = user_factory(email="admin@example.com", token=True, saml_id=None) + admin_token = admin_u.allowed_token + admin_identity = get_identity(admin_u.user) + admin_identity.provides.add(authenticated_user) + + collection_rec = minimal_community_factory( + owner=admin_u.user.id, + access={"record_policy": "open", "review_policy": "closed"}, + members={"curator": [u.user.id]}, + ) + collection_meta = collection_rec.to_dict() + + draft = minimal_draft_record_factory(identity=identity) + draft_owner = draft.to_dict()["parent"]["access"]["owned_by"] + app.logger.debug(draft_owner) + + with app.test_client() as client: + review_response = client.put( + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft/review", headers={**headers, "Authorization": f"Bearer {token}"}, data=json.dumps( { - "content": "Thank you in advance for the review", - "format": "html", + "receiver": {"community": collection_meta["id"]}, + "type": "community-submission", } ), ) + assert review_response.status_code == 200 + review_id = review_response.json["id"] + + submit_response = client.post( + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft/" + "actions/submit-review", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert submit_response.status_code == 202 + + read_response = client.get( + f"{app.config['SITE_API_URL']}/records/{draft['id']}", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert read_response.status_code == 404 + + read_draft_response = client.get( + f"{app.config['SITE_API_URL']}/records/{draft['id']}/draft", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert read_draft_response.status_code == 200 + assert read_draft_response.json["id"] == draft["id"] + assert not read_draft_response.json["is_published"] + assert read_draft_response.json["status"] == "in_review" + + accept_response = client.post( + f"{app.config['SITE_API_URL']}/requests/{review_id}/actions/accept", + headers={**headers, "Authorization": f"Bearer {admin_token}"}, + ) + assert accept_response.status_code == 200 + + read_response = client.get( + f"{app.config['SITE_API_URL']}/records/{draft['id']}", + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + assert read_response.status_code == 200 + assert read_response.json["id"] == draft["id"] + assert read_response.json["is_published"] + assert read_response.json["status"] == "published" + + +def test_group_collection_read_all( + running_app, + headers, + user_factory, + sample_communities_factory, + communities_links_factory, + mock_send_remote_api_update_fixture, +): + app = running_app.app + u = user_factory(token=True) + token = u.allowed_token + identity = get_identity(u.user) + identity.provides.add(authenticated_user) + + sample_communities_factory() + + app.logger.debug(app.config["KC_SEARCH_URL_DOCS"]) + + with app.test_client() as client: + response = client.get( + f"{app.config['SITE_API_URL']}/group_collections?size=4", + follow_redirects=True, + headers={**headers, "Authorization": f"Bearer {token}"}, + ) + app.logger.debug(response.text) + app.logger.debug(response.json) + assert response.status_code == 200 + assert response.json["hits"]["total"] == 8 + assert len(response.json["hits"]["hits"]) == 4 + assert response.json["sortBy"] == "updated-desc" + assert response.json["links"] == { + "next": f"{app.config['SITE_API_URL']}/group_collections?" + "page=2&q=%2B_exists_%3Acustom_fields.kcr%5C%3Acommons_instance%20" + "&size=4&sort=updated-desc", + "self": f"{app.config['SITE_API_URL']}/group_collections?" + "page=1&q=%2B_exists_%3Acustom_fields.kcr%5C%3Acommons_instance%20" + "&size=4&sort=updated-desc", + } + for hit in response.json["hits"]["hits"]: + assert re.match( + r"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", + hit["id"], + ) + assert hit["access"] == { + "member_policy": "open", + "members_visibility": "public", + "record_policy": "open", + "review_policy": "closed", + "visibility": "public", + } + assert hit["children"] == {"allow": False} + assert arrow.utcnow() - arrow.get(hit["created"]) < timedelta(seconds=3) + assert hit["links"] == communities_links_factory(hit["id"], hit["slug"]) + assert hit["metadata"]["curation_policy"] == "Curation policy" + assert "description" in hit["metadata"]["description"] + assert "Organization" in hit["metadata"]["organizations"][0]["name"] + assert "Information for" in hit["metadata"]["page"] + assert re.match(r".* Community \d+$", hit["metadata"]["title"]) + assert hit["metadata"]["website"] + assert hit["metadata"]["type"]["id"] in [ + "event", + "commons", + "group", + "organization", + ] + assert arrow.utcnow() - arrow.get(hit["updated"]) < timedelta(seconds=3) + assert re.match(r".*-community-\d+$", hit["slug"]) + assert hit["custom_fields"]["kcr:commons_group_description"] + assert hit["custom_fields"]["kcr:commons_group_name"] + assert hit["custom_fields"]["kcr:commons_group_id"] + assert hit["custom_fields"]["kcr:commons_group_visibility"] + assert hit["custom_fields"]["kcr:commons_instance"] + - assert response.status_code == 202 +@pytest.mark.skip(reason="Not implemented") +def test_group_collections_read_one(running_app, headers, user_factory): + pass diff --git a/site/tests/fixtures/communities.py b/site/tests/fixtures/communities.py index 7d162b8c6..4e63fcadc 100644 --- a/site/tests/fixtures/communities.py +++ b/site/tests/fixtures/communities.py @@ -9,101 +9,140 @@ from typing import Callable, Optional -def group_communities_data_set(): +@pytest.fixture(scope="function") +def communities_links_factory(): """ - Create metadata for group collections for testing. + Create links for communities for testing. """ - communities_data = [] - groups_data = { - "knowledgeCommons": [ - ( - "123", - "Commons Group 1", - "Community 1", - ), - ( - "456", - "Commons Group 2", - "Community 2", - ), - ( - "789", - "Commons Group 3", - "Community 3", - ), - ( - "101112", - "Commons Group 4", - "Community 4", - ), - ], - "msuCommons": [ - ( - "131415", - "MSU Group 1", - "MSU Community 1", - ), - ( - "161718", - "MSU Group 2", - "MSU Community 2", + + def assemble_links(community_id: str, slug: str): + return { + "featured": f"https://localhost/api/communities/{community_id}/featured", + "invitations": ( + f"https://localhost/api/communities/{community_id}/invitations" ), - ( - "181920", - "MSU Group 3", - "MSU Community 3", + "logo": f"https://localhost/api/communities/{community_id}/logo", + "members": f"https://localhost/api/communities/{community_id}/members", + "membership_requests": ( + f"https://localhost/api/communities/{community_id}/membership-requests" ), - ( - "212223", - "MSU Group 4", - "MSU Community 4", + "public_members": ( + f"https://localhost/api/communities/{community_id}/members/public" ), - ], - } - # Each top-level key is a commons instance, and each value is a list of tuples, - # where each tuple is a group on that commons. - # In each group tuple, the first element is the commons group id, the second - # is the group name, and the third is the community name. - - for instance in groups_data.keys(): - for c in groups_data[instance]: - slug = c[2].lower().replace("-", "").replace(" ", "") - rec_data = { - "access": { - "visibility": "public", - "member_policy": "open", - "record_policy": "open", - }, - "slug": c[2].lower().replace(" ", "-"), - "metadata": { - "title": c[2], - "description": c[2] + " description", - "type": { - "id": "event", + "records": f"https://localhost/api/communities/{community_id}/records", + "rename": f"https://localhost/api/communities/{community_id}/rename", + "requests": f"https://localhost/api/communities/{community_id}/requests", + "self": f"https://localhost/api/communities/{community_id}", + "self_html": f"https://localhost/collections/{slug}", + "settings_html": f"https://localhost/collections/{slug}/settings", + } + + return assemble_links + + +@pytest.fixture(scope="function") +def group_communities_data_factory(): + """ + Create metadata for group collections for testing. + """ + + def assemble_data() -> list[dict]: + communities_data = [] + groups_data = { + "knowledgeCommons": [ + ( + "123", + "Commons Group 1", + "Community 1", + ), + ( + "456", + "Commons Group 2", + "Community 2", + ), + ( + "789", + "Commons Group 3", + "Community 3", + ), + ( + "101112", + "Commons Group 4", + "Community 4", + ), + ], + "msuCommons": [ + ( + "131415", + "MSU Group 1", + "MSU Community 1", + ), + ( + "161718", + "MSU Group 2", + "MSU Community 2", + ), + ( + "181920", + "MSU Group 3", + "MSU Community 3", + ), + ( + "212223", + "MSU Group 4", + "MSU Community 4", + ), + ], + } + # Each top-level key is a commons instance, and each value is a list of tuples, + # where each tuple is a group on that commons. + # In each group tuple, the first element is the commons group id, the second + # is the group name, and the third is the community name. + + for instance in groups_data.keys(): + for c in groups_data[instance]: + slug = c[2].lower().replace("-", "").replace(" ", "") + rec_data = { + "access": { + "visibility": "public", + "member_policy": "open", + "record_policy": "open", + "review_policy": "closed", + "members_visibility": "public", + }, + "slug": c[2].lower().replace(" ", "-"), + "children": {"allow": False}, + "metadata": { + "title": c[2], + "description": c[2] + " description", + "type": { + "id": "event", + }, + "curation_policy": "Curation policy", + "page": f"Information for {c[2].lower()}", + "website": f"https://{slug}.com", + "organizations": [ + { + "name": "Organization 1", + } + ], }, - "curation_policy": "Curation policy", - "page": f"Information for {c[2].lower()}", - "website": f"https://{slug}.com", - "organizations": [ - { - "name": "Organization 1", - } - ], - }, - "custom_fields": { - "kcr:commons_instance": instance, - "kcr:commons_group_id": c[0], - "kcr:commons_group_name": c[1], - "kcr:commons_group_description": (f"{c[1]} description"), - "kcr:commons_group_visibility": "public", - }, - } - communities_data.append(rec_data) - return communities_data + "custom_fields": { + "kcr:commons_instance": instance, + "kcr:commons_group_id": c[0], + "kcr:commons_group_name": c[1], + "kcr:commons_group_description": (f"{c[1]} description"), + "kcr:commons_group_visibility": "public", + }, + } + communities_data.append(rec_data) + return communities_data + + return assemble_data @pytest.fixture(scope="function") -def minimal_community_factory(app, user_factory, create_communities_custom_fields): +def minimal_community_factory(app, db, user_factory, create_communities_custom_fields): """ Create a minimal community for testing. @@ -193,7 +232,9 @@ def create_minimal_community( @pytest.fixture(scope="function") -def sample_communities_factory(app, db, create_communities_custom_fields) -> Callable: +def sample_communities_factory( + app, db, create_communities_custom_fields, group_communities_data_factory +) -> Callable: """ Create communities for testing linked to commons groups. @@ -214,7 +255,7 @@ def sample_communities_factory(app, db, create_communities_custom_fields) -> Cal to commons groups. """ - def create_communities(app, metadata=[]) -> None: + def create_communities(metadata: list[dict] = []) -> None: """ Create communities for testing linked to commons groups. """ @@ -224,7 +265,7 @@ def create_communities(app, metadata=[]) -> None: if communities.total > 0: print("Communities already exist.") return - communities_data = metadata or group_communities_data_set() + communities_data = metadata or group_communities_data_factory() try: for rec_data in communities_data: rec = current_communities.service.create( diff --git a/site/tests/fixtures/search_provisioning.py b/site/tests/fixtures/search_provisioning.py index c3882970a..706373a79 100644 --- a/site/tests/fixtures/search_provisioning.py +++ b/site/tests/fixtures/search_provisioning.py @@ -1,7 +1,7 @@ import pytest from celery import shared_task -from invenio_queues.proxies import current_queues -from pprint import pformat + +# from pprint import pformat from typing import Optional From 3aa13a66757bc99f447d11f43240c63d292cc84f Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Wed, 29 Jan 2025 12:09:57 -0500 Subject: [PATCH 10/16] fix(user-data): Minor improvement to error handling in user data api calls --- site/kcworks/dependencies/invenio-remote-user-data-kcworks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/kcworks/dependencies/invenio-remote-user-data-kcworks b/site/kcworks/dependencies/invenio-remote-user-data-kcworks index 4eef862a8..0aeda19ec 160000 --- a/site/kcworks/dependencies/invenio-remote-user-data-kcworks +++ b/site/kcworks/dependencies/invenio-remote-user-data-kcworks @@ -1 +1 @@ -Subproject commit 4eef862a88edf36276d76f7890c70681b412e7c6 +Subproject commit 0aeda19ec81c45a996383449827de52865014715 From e41411e0fc102c1f28d07de3b41b7a49547839bf Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Thu, 6 Feb 2025 09:36:54 -0500 Subject: [PATCH 11/16] fix(docs): Updates to streamlined import api docs (cherry picked from commit 0e377553cfe4ccc47e80e9fb9aeb55d65e720299) --- docs/source/api.md | 139 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 117 insertions(+), 22 deletions(-) diff --git a/docs/source/api.md b/docs/source/api.md index adac6b9b6..310f263e9 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -103,9 +103,10 @@ Why is this API needed? The InvenioRDM REST API can be fragile and difficult to ### Who can use the import API? -The import API is available to any registered active user who has obtained an OAuth token for API operations. +The import API is available to authorized organizations who have obtained an OAuth token for API operations. -If the import is to include placing the work directly in a collection, without passing through the review process, the user must have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection ("owner", "manager", "curator", "reader") depends on the collection's review policy. +If the import is to include placing the work directly in a collection, without passing through the review process, the user to whom +the token is issued must also have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection ("owner", "manager", "curator", "reader") depends on the collection's review policy. The exception to this rule is for collection owners, who may override the collection's review policy and import works directly into the collection without review. @@ -130,8 +131,8 @@ This request must be made with a multipart/form-data request. The request body m | Name | Required | Content Type | Description | |-------|----------|--------------|-------------| | `files` | yes | `application/octet-stream` | The (binary) file content to be uploaded. If multiple files are being uploaded, a body part with this same name ("files") must be provided for each file. If more than three or four files are being uploaded, it is recommended to provide a single zip archive containing all of the files. The files will be assigned to the appropriate work based on filename, so where multiple files are provided these **must be unique**. If a zip archive is provided, the files must be contained in a single compressed folder with no subfolders. | -| `metadata` | yes | `application/json` | An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. In addition, an array of owners for the work may optionally be provided by adding an `access.owned_by` property to each metadata object. | -| `collection` | no | `text/plain` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, the work will be placed in the collection's review queue. | +| `metadata` | yes | `application/json` | An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. In addition, an array of owners for the work may optionally be provided by adding an `access.owned_by` property to each metadata object. Note that if no owners are provided, the work will be created with the organizational account that issued the OAuth token as the owner. | +| `collection` | no | `text/plain` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, and the `review_required` parameter is set to "true", the work will be placed in the collection's review queue. | | `review_required` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the work should be reviewed before publication. This setting is only relevant if the work is intended for publication in a collection that requires review. It will override the collection's usual review policy, since the work is being uploaded by a collection administrator. (Default: "true") | | `strict_validation` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the import request should be rejected if any validation errors are encountered. If this value is "false", the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is "true", the import request will be rejected if any validation errors are encountered. (Default: "true") | | `all_or_none` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is "false", the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: "true") | @@ -142,7 +143,7 @@ The array of owners, if provided in a metadata object's `access.owned_by` proper |-----|----------|------|-------------| | `full_name` | yes | `string` | The full name of the user. | | `email` | yes | `string` | The email address of the user. | -| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. | +| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. If the user already has a KCWorks account, the `kc_username` scheme should be used and the user's username provided as the identifier. | The resulting `owners` list should be shaped like this: @@ -176,16 +177,21 @@ Content-Type: application/json This response will include a JSON object with the following fields: - `status`: The status of the import request, which will be "success" if the import request was successful. -- `data`: An array of JSON objects with the following fields: +- `data`: An array of JSON objects, one for each record that was created in the operation +- `errors`: An array of JSON objects, one for each record that failed to be created. (In a successful import, this array will be empty.) +- `message`: A message describing the import request. (In a successful import, this will be "All records were successfully imported".) + +Each object in the `data` array will have the following fields: | key | type | description | |-----|------|-------------| -| `record_id` | `string` | The ID of the new work. | -| `record_url` | `string` | The URL of the new work. | -| `files` | `array` | A list of the filenames for the files that were successfully uploaded. This is for convenience. Details about the files, including their size and checksum, are available in the `files` property of the `metadata` object. | +| `item_index` | `integer` | The index of the record in the import request. (Starting with 0 for the first record.) | +| `record_id` | `string` | The KCWorks ID of the new work. | +| `record_url` | `string` | The URL of the new work. This is the URL of the work's landing page on KCWorks. Other URLs for the work, including the endpoints for API operations, are available in the `links` property of the record's `metadata` object. | +| `files` | `object` | An object whose keys are the filenames for the files that were successfully uploaded and whose values are 2 member arrays. The first member is a string representing the status of the file upload operation. The second member is an array of string error messages if any errors occurred during the upload. Further details about the files, including their size and checksum, are available in the `files` property of the `metadata` object. | | `collection_id` | `string` | The ID of the collection to which the work was published, if any. This is provided for convenience. Details about the collection are available in the `parent.communities` property of the `metadata` object. | -| `errors` | `array` | A list of errors that occurred during the import process. These might include validation errors for certain fields in the provided metadata that did not prevent creation of the work. (Only provided if the request was made with `strict_validation` set to "false".) | -| `metadata` | `object` | The metadata for the created work, in JSON format, following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. | +| `errors` | `array` | A list of objects, each of which describes an error that occurred during the import process. These might include validation errors for certain fields in the provided metadata that did not prevent creation of the work. | +| `metadata` | `object` | The metadata for the created work, in JSON format, following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. The returned metadata will include internal KCWorks system fields such as `created`, `updated`, `revision_id`, `id`, etc. It is identical to the metadata that would be returned by a GET request to the records API endpoint on KCWorks. | The response object will be shaped like this: @@ -197,7 +203,10 @@ The response object will be shaped like this: "item_index": 0, "record_id": "1234567890", "record_url": "https://works.hcommons.org/records/1234567890", - "files": ["file1.pdf", "file2.pdf"], + "files": { + "file1.pdf": ["success", []], + "file2.pdf": ["success", []] + }, "collection_id": "1234567890", "errors": [], "metadata": { @@ -208,14 +217,19 @@ The response object will be shaped like this: "item_index": 1, "record_id": "1234567891", "record_url": "https://works.hcommons.org/records/1234567891", - "files": ["file1.pdf", "file2.pdf"], + "files": { + "file1.pdf": ["success", []], + "file2.pdf": ["success", []] + }, "collection_id": "1234567890", "errors": [], "metadata": { /* ... */ } } - ] + ], + "errors": [], + "message": "All records were successfully imported." } ``` @@ -228,7 +242,7 @@ HTTP/1.1 403 Forbidden Content-Type: application/json ``` -This response will include a JSON object: +This response will include a JSON object with the following fields: ```json { @@ -249,24 +263,38 @@ a. the `strict_validation` request parameter was set to "true" and all of the su b. the `strict_validation` parameter is set to "false", but the validation errors affected fields that are required for the works to be created. c. the `all_or_none` request parameter is set to "true" and some of the supplied metadata objects raise validation errors. -The response will include a JSON object with the following fields: +The response will include a JSON object with the same shape as the successful response, but with the following differences: + +- The `status` field will be "error". +- The `data` field will be an empty array. +- The `errors` field will be an array of objects, each of which describes a work that failed to be created. In each object the `record_id` and `record_url` fields will be `null`, since the work was not created. The `errors` field will be an array of objects, each of which describes an error that occurred during the attempt to create the work. The `metadata` field will still contain the metadata that was provided in the request for reference. ```json { "status": "error", "message": "The request metadata is malformed or invalid.", + "data": [], "errors": [ { "item_index": 0, + "record_id": null, + "record_url": null, "errors": [ { "field": "title", "message": "Required field missing." } - ] + ], + "files": {}, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } }, { "item_index": 1, + "record_id": null, + "record_url": null, "errors": [ { "field": "metadata.creators.0.occupation", @@ -276,13 +304,63 @@ The response will include a JSON object with the following fields: "field": "metadata.publication_date", "message": "Date is not in Extended Date Time Format (EDTF)." } - ] + ], + "files": {}, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } } ] } ``` -If only some of the works to be imported are malformed or invalid, and the `all_or_none` request parameter is set to "false", the response will be `207 Multi-Status`. +### A partially successful import response + +If only some of the works to be imported are malformed or invalid, and the `all_or_none` request parameter is set to "false", the response will be `207 Multi-Status`. In this case the response will be shaped much like the successful and unsuccessful responses described above, but there will be items in *both* the `data` and `errors` arrays. The items in the `data` array will be works that were successfully created, and the items in the `errors` array will be works that failed to be created. + +The response will be shaped like this: + +```json +{ + "status": "multi_status", + "message": "The request metadata is malformed or invalid.", + "data": [ + { + "item_index": 1, + "record_id": "1234567891", + "record_url": "https://works.hcommons.org/records/1234567891", + "files": { + "file1.pdf": ["success", []], + "file2.pdf": ["success", []] + }, + "collection_id": "1234567890", + "errors": [], + "metadata": { + /* ... */ + } + } + ], + "errors": [ + { + "item_index": 0, + "record_id": null, + "record_url": null, + "errors": [ + { + "field": "title", + "message": "Required field missing." + } + ], + "files": {}, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } + }, + ] +} +``` #### The request file upload failed @@ -344,7 +422,10 @@ If the `all_or_none` request parameter is set to "false", it is possible that so "item_index": 0, "record_id": "1234567890", "record_url": "https://works.hcommons.org/records/1234567890", - "files": ["file1.pdf", "file2.pdf"], + "files": { + "file1.pdf": ["success", []], + "file2.pdf": ["success", []] + }, "collection_id": "1234567890", "errors": [], "metadata": { @@ -355,23 +436,37 @@ If the `all_or_none` request parameter is set to "false", it is possible that so "failed": [ { "item_index": 1, + "record_id": null, + "record_url": null, "message": "The request metadata is malformed or invalid.", "errors": [ { "field": "title", "message": "Required field missing.", } - ] + ], + "files": {}, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } }, { "item_index": 2, + "record_id": null, + "record_url": null, "message": "The file content is corrupted or invalid.", "errors": [ { "file": "file3.pdf", "message": "The file exceeds the maximum file size." } - ] + ], + "files": {}, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } } ] } From ba2c546026862631337da122564dfcaca856e074 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Thu, 6 Feb 2025 09:46:25 -0500 Subject: [PATCH 12/16] fix(docs): Updates to streamlined import api docs --- docs/source/api.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/source/api.md b/docs/source/api.md index 310f263e9..4943703ea 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -114,7 +114,7 @@ The exception to this rule is for collection owners, who may override the collec #### Request ``` -POST https://works.hcommons.org/api/import/ HTTP/1.1 +POST https://works.hcommons.org/api/import/ HTTP/1.1 ``` #### Required headers @@ -124,6 +124,15 @@ Accept: application/json Authorization: Bearer \ ``` +#### Request url path parameters + +Only one URL path parameter is required: + +| Name | Required | Type | Description | +|------|----------|------|-------------| +| `collection` | no | `string` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, and the `review_required` parameter is set to "true", the work will be placed in the collection's review queue. | + + #### Request body This request must be made with a multipart/form-data request. The request body must include parts with following names: @@ -132,7 +141,6 @@ This request must be made with a multipart/form-data request. The request body m |-------|----------|--------------|-------------| | `files` | yes | `application/octet-stream` | The (binary) file content to be uploaded. If multiple files are being uploaded, a body part with this same name ("files") must be provided for each file. If more than three or four files are being uploaded, it is recommended to provide a single zip archive containing all of the files. The files will be assigned to the appropriate work based on filename, so where multiple files are provided these **must be unique**. If a zip archive is provided, the files must be contained in a single compressed folder with no subfolders. | | `metadata` | yes | `application/json` | An array of JSON metadata objects, each of which will be used to create a new work. Each must following the KCWorks implementation of the InvenioRDM metadata schema described {ref}`here `. In addition, an array of owners for the work may optionally be provided by adding an `access.owned_by` property to each metadata object. Note that if no owners are provided, the work will be created with the organizational account that issued the OAuth token as the owner. | -| `collection` | no | `text/plain` | The ID (either the url slug or the UUID) of the collection to which the work should be published. If this value is provided, the work will be submitted to the collection immediately after import. If the collection requires review, and the `review_required` parameter is set to "true", the work will be placed in the collection's review queue. | | `review_required` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the work should be reviewed before publication. This setting is only relevant if the work is intended for publication in a collection that requires review. It will override the collection's usual review policy, since the work is being uploaded by a collection administrator. (Default: "true") | | `strict_validation` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the import request should be rejected if any validation errors are encountered. If this value is "false", the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is "true", the import request will be rejected if any validation errors are encountered. (Default: "true") | | `all_or_none` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is "false", the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: "true") | From c6e2073f0187fe56a8c33a6325a9298f9f79a2bb Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Tue, 18 Feb 2025 13:53:32 -0500 Subject: [PATCH 13/16] fix(docs): API docs updates --- docs/source/api.md | 278 +++++++++++++++++++++++++++++++-------------- 1 file changed, 192 insertions(+), 86 deletions(-) diff --git a/docs/source/api.md b/docs/source/api.md index 4943703ea..cdb97f1b0 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -145,13 +145,15 @@ This request must be made with a multipart/form-data request. The request body m | `strict_validation` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the import request should be rejected if any validation errors are encountered. If this value is "false", the imported work will be created in KCWorks even if some of the provided metadata does not conform to the KCWorks metadata schema, provided these are not required fields. If this value is "true", the import request will be rejected if any validation errors are encountered. (Default: "true") | | `all_or_none` | no | `text/plain` | A string representation of a boolean (either "true" or "false") indicating whether the entire import request should be rejected if any of the works fail to be created (whether for validation errors, upload errors, or other reasons). If this value is "false", the import request will be accepted even if some of the works cannot be created. The response in this case will include a list of works that were successfully created and a list of errors for the works that failed to be created. (Default: "true") | -The array of owners, if provided in a metadata object's `access.owned_by` property, must include at least the full name and email address of the users to be added as owners of the work. If the user already has a Knowledge Commons account, their username should also be provided. Additional identifiers (e.g., ORCID) may be provided as well to help avoid duplicate accounts, since a KCWorks account will be created for each user if they do not already have one. +#### Identifying the owners of the work + +The array of owners, if provided in a metadata object's `parent.access.owned_by` property, must include at least the full name and email address of the users to be added as owners of the work. If the user already has a Knowledge Commons account, their username should also be provided. Additional identifiers (e.g., ORCID) may be provided as well to help avoid duplicate accounts, since a KCWorks account will be created for each user if they do not already have one. | key | required | type | description | |-----|----------|------|-------------| | `full_name` | yes | `string` | The full name of the user. | | `email` | yes | `string` | The email address of the user. | -| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. If the user already has a KCWorks account, the `kc_username` scheme should be used and the user's username provided as the identifier. | +| `identifiers` | no | `array` | An array of identifiers for the user. Any identifier schemes supported by KCWorks will be accepted. If the user already has a KCWorks account, the `kc_username` scheme should be used and the user's username provided as the identifier. If you wish to provide an ORCID, it is recommended to use the `orcid` scheme. Identifiers for external organizations should be provided using the `import_user_id` scheme. | The resulting `owners` list should be shaped like this: @@ -168,6 +170,10 @@ The resulting `owners` list should be shaped like this: { "identifier": "jdoe", "scheme": "kc_username" + }, + { + "identifier": "1234567890", + "scheme": "import_user_id" } ] } @@ -175,6 +181,126 @@ The resulting `owners` list should be shaped like this: ``` Note that it is *not* assumed that the creators of a work should be the work's owners. The creators will only be added as owners if each of them is listed in the `access.owned_by` property of the work's metadata object. +> Note, too, that only the first member of the owners array will technically be assigned as the work's owner in KCWorks. The other owners will be assigned access grants to the work with "manage" permissions. + +#### Identifying the work for import + +It is crucial that each work to be imported is assigned a unique identifier. This may be an identifier used internally by the importing organization, it may be a universally unique string such as a UUID, or it may be a universal identifier such as a DOI or a handle. In either case it must be unique across all works to be imported for the collection. This identifier will be used to identify the work in the response, and will be used to identify the work when checking for duplicate imports. + +The identifier may be provided in the `metadata` object as an `identifiers` array with the scheme `import-recid`. E.g., + +```json +{ + "identifiers": [ + { + "identifier": "1234567890", + "scheme": "import-recid" + }, + // ... other identifiers ... + ] +} +``` + +### Example import request + +The following example shows a request to import a single work with two files and a single owner. + +#### Metadata JSON object + +The metadata JSON object for a journal article with a PDF file and a Word file, with a single owner might look like this: + +```json +{ + "metadata": { + "resource_type": { + "id": "textDocument-journalArticle", + }, + "creators": [ + { + "person_or_org": { + "type": "personal", + "name": "Fitzpatrick, Kathleen", + "given_name": "Kathleen", + "family_name": "Fitzpatrick", + "identifiers": [ { "identifier": "kfitz", "scheme": "kc_username" } ] + }, + "role": { "id": "author" }, + "affiliations": [ { "name": "Modern Languages Association" } ] + } + ], + "title": "Giving It Away: Sharing and the Future of Scholarly Communication", + "publisher": "University of Toronto Press Inc. (UTPress)", + "publication_date": "2012", + "languages": [ { "id": "eng" } ], + "identifiers": [ + { "identifier": "1234567890", "scheme": "import-recid" }, + { "identifier": "10.3138/jsp.43.4.347", "scheme": "doi" }, + { "identifier": "1710-1166", "scheme": "issn" }, + ], + "rights": [ + { + "id": "cc-by-4.0", + "title": { + "en": "Creative Commons Attribution 4.0 International" + }, + } + ], + "description": "Open access has great potential to transform the future of scholarly communication, but its success will require a focus on values -- and particularly generosity -- rather than on costs." + }, + "custom_fields": { + "journal:journal": { + "title": "Journal of Scholarly Publishing", + "issue": "4", + "volume": "43", + "pages": "347-362", + "issn": "1198-9742" + }, + "kcr:user_defined_tags": [ + "open access", + "Scholarly communication" + ], + }, + "parent": { + "owned_by": [ + { + "full_name": "Kathleen Fitzpatrick", + "email": "kfitz@msu.edu", + "identifiers": [ { "identifier": "kfitz", "scheme": "kc_username" } ] + } + ] + }, + "files": { + "enabled": true, + "entries": { + "fitzpatrick-givingitaway.docx": { + "size": 149619, + "key": "fitzpatrick-givingitaway.docx", + }, + "fitzpatrick-givingitaway.pdf": { + "size": 234567, + "key": "fitzpatrick-givingitaway.pdf", + } + } + }, +} +``` + +#### Request + +To submit the article to be included in the `my-organization` collection, one might use a command line tool like `curl`, with the following command. + +``` +curl -X POST https://works.hcommons.org/api/import/my-collection-id \ + -H "Content-Type: multipart/form-data" \ + -H "Accept: application/json" \ + -H "Authorization: Bearer " \ + -F "files=@path/to/files/fitzpatrick-givingitaway.pdf" \ + -F "files=@path/to/files/fitzpatrick-givingitaway.docx" \ + -F "metadata={// ... metadata JSON object goes here as a string ... //}" +``` + +Of course, in most cases the request will be made programmatically, not via a command line tool. The syntax for the request will vary depending on the programming language and tools being used. + ### A successful import response ``` @@ -194,7 +320,8 @@ Each object in the `data` array will have the following fields: | key | type | description | |-----|------|-------------| | `item_index` | `integer` | The index of the record in the import request. (Starting with 0 for the first record.) | -| `record_id` | `string` | The KCWorks ID of the new work. | +| `record_id` | `string` | The internal KCWorks ID of the new work. | +| `source_id` | `string` | The external identifier for the work that was provided in the import request using the `import-recid` scheme. | | `record_url` | `string` | The URL of the new work. This is the URL of the work's landing page on KCWorks. Other URLs for the work, including the endpoints for API operations, are available in the `links` property of the record's `metadata` object. | | `files` | `object` | An object whose keys are the filenames for the files that were successfully uploaded and whose values are 2 member arrays. The first member is a string representing the status of the file upload operation. The second member is an array of string error messages if any errors occurred during the upload. Further details about the files, including their size and checksum, are available in the `files` property of the `metadata` object. | | `collection_id` | `string` | The ID of the collection to which the work was published, if any. This is provided for convenience. Details about the collection are available in the `parent.communities` property of the `metadata` object. | @@ -280,7 +407,11 @@ The response will include a JSON object with the same shape as the successful re ```json { "status": "error", - "message": "The request metadata is malformed or invalid.", + "message": ( + "No records were successfully imported. Please check the list of failed records " + "in the 'errors' field for more information. Each failed item should have its own " + "list of specific errors." + ), "data": [], "errors": [ { @@ -325,6 +456,8 @@ The response will include a JSON object with the same shape as the successful re ### A partially successful import response +> NOT YET IMPLEMENTED. At present the `all_or_none` request parameter will always be "true". + If only some of the works to be imported are malformed or invalid, and the `all_or_none` request parameter is set to "false", the response will be `207 Multi-Status`. In this case the response will be shaped much like the successful and unsuccessful responses described above, but there will be items in *both* the `data` and `errors` arrays. The items in the `data` array will be works that were successfully created, and the items in the `errors` array will be works that failed to be created. The response will be shaped like this: @@ -332,11 +465,16 @@ The response will be shaped like this: ```json { "status": "multi_status", - "message": "The request metadata is malformed or invalid.", + "message": ( + "Some records were successfully imported, but some failed. Please check the " + "list of failed records in the 'errors' field for more information. Each failed " + "item should have its own list of specific errors." + ), "data": [ { "item_index": 1, "record_id": "1234567891", + "source_id": "xxx1234567891", "record_url": "https://works.hcommons.org/records/1234567891", "files": { "file1.pdf": ["success", []], @@ -353,6 +491,7 @@ The response will be shaped like this: { "item_index": 0, "record_id": null, + "source_id": "xxx1234567890", "record_url": null, "errors": [ { @@ -382,105 +521,72 @@ If the file content is uploaded but for some reason is considered corrupted or i ```json { "status": "error", - "message": "The file content is corrupted or invalid.", + "message": ( + "No records were successfully imported. Please check the list of failed records " + "in the 'errors' field for more information. Each failed item should have its own " + "list of specific errors." + ), + "data": [], "errors": [ { "item_index": 0, + "record_id": null, + "source_id": "xxx1234567890", + "record_url": null, "errors": [ { - "file": "file1.pdf", - "message": "The file size does not match the supplied metadata." - }, - { - "file": "file2.pdf", - "message": "The file checksum does not match the supplied metadata." + "validation_error": { + "metadata": {"title": ["Missing data for required field."]} + } } - ] + ], + "files": { + "file1.pdf": ["uploaded", []] + }, + "collection_id": "1234567890", + "metadata": { + /* ... */ + } }, { "item_index": 1, + "record_id": null, + "source_id": "xxx1234567891", + "record_url": null, "errors": [ { - "file": "file3.pdf", - "message": "The file exceeds the maximum file size." - } - ] - } - ] -} -``` - -If an upload simply fails to complete and times out, the client will instead receive a `504 Gateway Timeout` response. - -#### Only some of the works to be imported failed - -```http -HTTP/1.1 207 Multi-Status -Content-Type: application/json -``` - -If the `all_or_none` request parameter is set to "false", it is possible that some of the works to be imported were successfully created and others were not. In this case, the response will be `207 Multi-Status` and will include a JSON object with the following fields: - -```json -{ - "status": "multi_status", - "data": { - "succeeded": [ - { - "item_index": 0, - "record_id": "1234567890", - "record_url": "https://works.hcommons.org/records/1234567890", - "files": { - "file1.pdf": ["success", []], - "file2.pdf": ["success", []] + "validation_error": { + "metadata": {"creators" {"occupation": ["Unknown field."]}} + } }, - "collection_id": "1234567890", - "errors": [], - "metadata": { - /* ... */ - } - }, - ], - "failed": [ - { - "item_index": 1, - "record_id": null, - "record_url": null, - "message": "The request metadata is malformed or invalid.", - "errors": [ - { - "field": "title", - "message": "Required field missing.", + { + "validation_error": { + "metadata": {"publication_date": ["Date is not in Extended Date Time Format (EDTF)."]} } - ], - "files": {}, - "collection_id": "1234567890", - "metadata": { - /* ... */ - } + }, + { + "file upload failures": { + "sample.pdf": [ + "failed", + ["File sample.pdf not found in list of files."], + ] + }, + }, + ], + "files": { + "sample.pdf": ["failed", ["File sample.pdf not found in list of files."]], }, - { - "item_index": 2, - "record_id": null, - "record_url": null, - "message": "The file content is corrupted or invalid.", - "errors": [ - { - "file": "file3.pdf", - "message": "The file exceeds the maximum file size." - } - ], - "files": {}, - "collection_id": "1234567890", - "metadata": { - /* ... */ - } + "collection_id": "1234567890", + "metadata": { + /* ... */ } - ] - } + } + ] } ``` +If an upload simply fails to complete and times out, the client will instead receive a `504 Gateway Timeout` response. + ### What happens to an import request that fails? If all steps of an import request do not complete successfully, the work will not be created. The files that were successfully uploaded will be deleted, and any draft record created as part of the import request will be deleted. The client may attempt the import request again. From fcabb2b9dc0a7c4096ae8079f880c6ea079a2468 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Tue, 18 Feb 2025 14:59:10 -0500 Subject: [PATCH 14/16] fix(docs): API docs updates --- docs/source/api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/api.md b/docs/source/api.md index cdb97f1b0..30dd27c95 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -207,10 +207,10 @@ The following example shows a request to import a single work with two files and #### Metadata JSON object -The metadata JSON object for a journal article with a PDF file and a Word file, with a single owner might look like this: +The metadata JSON string for a journal article with a PDF file and a Word file, with a single owner might look like the sample below. **Note that the metadata must be provided as an array of metadata objects, even if it contains only a single object.** ```json -{ +[{ "metadata": { "resource_type": { "id": "textDocument-journalArticle", @@ -282,7 +282,7 @@ The metadata JSON object for a journal article with a PDF file and a Word file, } } }, -} +}] ``` #### Request From ee9d41b2c278e432f9fab805696f9568c8582aba Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Wed, 19 Feb 2025 15:57:46 -0500 Subject: [PATCH 15/16] fix(header): Removed focus group banner; changed feedback link to point to email form --- templates/semantic-ui/invenio_app_rdm/header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/semantic-ui/invenio_app_rdm/header.html b/templates/semantic-ui/invenio_app_rdm/header.html index 4fec197a5..f5cb7cfd6 100644 --- a/templates/semantic-ui/invenio_app_rdm/header.html +++ b/templates/semantic-ui/invenio_app_rdm/header.html @@ -47,9 +47,9 @@ {%- block site_banner %} - + {# #} - + {%- endblock site_banner %}
    From 7528fece804578a7cca7c4242563cd69ceb34c83 Mon Sep 17 00:00:00 2001 From: Ian Scott Date: Wed, 19 Feb 2025 15:54:58 -0500 Subject: [PATCH 16/16] fix(docs): API docs updates --- docs/source/api.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/source/api.md b/docs/source/api.md index 30dd27c95..04abde259 100644 --- a/docs/source/api.md +++ b/docs/source/api.md @@ -105,10 +105,9 @@ Why is this API needed? The InvenioRDM REST API can be fragile and difficult to The import API is available to authorized organizations who have obtained an OAuth token for API operations. -If the import is to include placing the work directly in a collection, without passing through the review process, the user to whom -the token is issued must also have sufficient permissions to publish directly in the collection. Exactly what role they must have in the collection ("owner", "manager", "curator", "reader") depends on the collection's review policy. - -The exception to this rule is for collection owners, who may override the collection's review policy and import works directly into the collection without review. +The import API places the works directly in a collection, without passing through the review process. So, the user to whom the token is issued must have sufficient permissions to publish directly in the collection. The exact role required depends on the collection's review policy: +- *If the review policy allows managers and curators to skip the review process*, the user of the import API must have one of the roles "manager," "curator," or "owner" in the collection. +- *If the review policy requires all submissions to be reviewed*, the user of the import API must have the "owner" role in the collection. ### The import request
  • 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 aX9)3o2B+p|>l3M&DKQnggzkEG>;D69G!I7r literal 1128802 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 delta 131 zcmZ3W)T6}Gz&e$2Ba02||NMvEm-iyu{qp blFEYA;wiOLGER0DXGj9+W1CO&hcW^HX1^@- diff --git a/docs/build/_sources/architecture.md.txt b/docs/build/_sources/architecture.md.txt new file mode 100644 index 000000000..872359139 --- /dev/null +++ b/docs/build/_sources/architecture.md.txt @@ -0,0 +1,342 @@ +# KCWorks Architecture + +## InvenioRDM's Layered Architecture + +InvenioRDM employs a layered architecture with: + +1. Data layer + - Low-level data storage and retrieval. + - Primarily SQLAlchemy model classes. + - High-level data API classes that provide a Pythonic interface to the data layer. + - Validate data before storing it. +2. Service layer + - Retrieves and modifies data from the data layer, either for a view or for another service. + - Providing abstract CRUD methods for operating on the data layer's API classes. + - Providing abstracted "result items" and "result lists" + - Enforces permission and access control policies. +3. View layer + - Consists of + - Flask views (registered as Blueprints) + - rendering either + - Jinja2 templates to produce HTML + - JSON to produce API responses + - in some cases, React components embedded in the Jinja2 templates + - These are rendered on the client side + - Data is passed from the Jinja2 templates to the React components via HTML data attributes + +## InvenioRDM Services + +An InvenioRDM service is a class that provides methods for interacting with the data layer. The business logic of the service is usually delegated to one or more component classes, which are called during the service's methods. + +### Service Classes + +#### BaseService + +The base Service class is defined in `invenio_records_resources.services.base.Service`. It defines methods for: + +- Getting the service ID + - `id(self)`: Return the id of the service from config. +- Permissions checking + - `permission_policy(self, action_name, **kwargs)`: Factory for a permission policy instance. + - `check_permission(self, identity, action_name, **kwargs)`: Check a permission against the identity. + - `require_permission(self, identity, action_name, **kwargs)`: Require a specific permission from the permission policy. +- Handling service components + - `components(self)`: Return initialized instances of the service's component classes. + - `run_components(self, action, *args, **kwargs)`: Run components for a given action. +- Producing result items and lists + - `result_item(self, *args, **kwargs)`: Create a new instance of the resource unit, i.e. whatever the service provides. + - `result_list(self, *args, **kwargs)`: Create a new list of resource units. In some cases this is a simple iterable of resource units, but in other cases it is a more complex object that includes additional data. + +#### RecordService + +Services dealing with InvenioRDM records of some kind (e.g. records, drafts, communities, etc.) inherit from the `RecordService` class defined in `invenio_records_resources.services.records.service`. This class adds: + +- properties and methods related to the service's related data-layer API class + - A `schema` property that returns a `ServiceSchemaWrapper` instance. + - A `record_cls` property that returns the record class for the service. + - A `links_item_tpl` property that returns a `LinksTemplate` instance for constructing links to a resource unit. + - An `expandable_fields` property that returns a list of expandable fields for the service's data-layer API class. +- Methods for creating searches + - `create_search(self, identity, record_cls, search_opts, permission_action="read", preference=None, extra_filter=None, versioning=True)`: Instantiate a search class. + - `search_records(self, identity, params, **kwargs)`: A low-level method to create an OpenSearch DSL instance for searching records. + - `search(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: A high-level method to search for records matching the querystring. + - `scan(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: A high-level method to perform a rolling "scroll" search for records matching the querystring. (This is used for searching through large numbers of records, since OpenSearch will not return more than 10,000 records at a time.) +- Methods for indexing records + - `reindex(self, identity, params=None, search_preference=None, search_query=None, extra_filter=None, **kwargs)`: A high-level method to reindex records matching the query parameters. + - `rebuild_index(self, identity, uow=None)`: A high-level method to reindex all records managed by this service. +- CRUD methods + - `create(self, identity, data, uow=None, expand=False)`: Create a record. + - `exists(self, identity, id_)`: Check if the record exists and user has permission. (Does *not* use the search index.) + - `read(self, identity, id_, expand=False, action="read")`: Retrieve a record. (Does *not* use the search index.) + - `read_many(self, identity, ids, expand=False, action="read")`: Retrieve multiple records using the search index. + - `read_all(self, identity, params=None, search_preference=None, expand=False, **kwargs)`: Retrieve all records matching the query parameters using the search index. + - `update(self, identity, id_, data, uow=None, expand=False)`: Update a record. + - `delete(self, identity, id_, uow=None)`: Delete a record. +- Helper methods for record management + - `check_revision_id(self, record, expected_revision_id)`: Validate the given revision_id with current record's one. + - `on_relation_update(self, identity, record_type, records_info, notif_time, limit=100)`: Handles the update of a related field record when the related field is updated. + +#### Augmented RecordService + +The `invenio_drafts_resources` package then overrides this with a `RecordService` class that adds (a) a distinction between published and draft records, (b) record versioning and a parent-child record relationship, and (c) file attachments to service records. This adds the following properties and methods to the `RecordService` class: + +- Properties and methods for draft records + - `draft_cls(self)`: Return the record class for the service. + - `draft_files(self)`: Return the draft files service for the service. + - `draft_indexer(self)`: A factory for creating an indexer instance. + - `search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Search for draft records matching the querystring. + - `read_draft(self, identity, id_, expand=False)`: Retrieve a draft record. + - `update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False)`: Replace a draft. + - `edit(self, identity, id_, uow=None, expand=False)`: Creates a new revision of a draft or a draft for an existing published record. + - `publish(self, identity, id_, uow=None, expand=False)`: Publishes a draft record. + - `delete_draft(self, identity, id_, revision_id=None, uow=None)`: Deletes a draft record. (Defaults to a soft delete, so the record is not actually deleted from the database or search index until a later cleanup operation.) + - `validate_draft(self, identity, id_, ignore_field_permissions=False)`: Validate a draft. + - `cleanup_drafts(self, timedelta, uow=None, search_gc_deletes=60)`: Hard delete of soft deleted drafts. +- Properties and methods for files + - `files(self)`: Return the files service for the service. + - `import_files(self, identity, id_, uow=None)`: Import files from previous record version. +- Properties and methods for versions and parent records + - `schema_parent(self)`: Return the parent schema for the service. + - `search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs)`: Search for record's versions. + - `read_latest(self, identity, id_, expand=False)`: Retrieve the latest version of a record. + - `new_version(self, identity, id_, uow=None, expand=False)`: Creates a new version of a record. +This overridden `RecordService` class also modifies the CRUD methods to enforce a workflow in which records are only modified via their draft records. This involves overriding: + +- `update(self, identity, id_, data, uow=None, expand=False)`: Now raises a `NotImplementedError` error. +- `create(self, identity, data, uow=None, expand=False)`: Now creates a draft record. +- `rebuild_index(self, identity)`: Now reindexes all draft records (instances of draft API class) as well as all published records (instances of record API class) and skips soft-deleted records. + +#### RDMRecordService + +The `invenio_rdm_records` package provides an `RDMRecordService` class that inherits from the `RecordService` class and adds: + +- Additional properties for accessing subservices + - `access`: Return the access service for the service. + - `pids`: Return the PIDs service for the service. + - `review`: Return the review service for the service. +- Methods for embargo handling + - `lift_embargo(self, identity, _id, uow=None)`: Lifts an embargo from the record and draft (if exists). + - `scan_expired_embargos(self, identity)`: Scan for records with an expired embargo. +- Properties and methods for file quota handling + - `schema_quota`: Return the schema for quota information. + - `set_quota(self, identity, id_, data, files_attr="files", uow=None)`: Set the quota values for a record. + - `set_user_quota(self, identity, id_, data, uow=None)`: Set the user files quota. +- Properties and methods for deletion of published records + - `schema_tombstone`: Return the schema for tombstone information. + - `delete_record(self, identity, id_, data, expand=False, uow=None, revision_id=None)`: Re-introduces soft-deletion of published records (which were previously removed by the `RecordService` class). + - `update_tombstone(self, identity, id_, data, expand=False, uow=None)`: Update the tombstone information for the (soft) deleted record. + - `cleanup_record(self, identity, id_, uow=None)`: Clean up a (soft) deleted record. + - `restore_record(self, identity, id_, expand=False, uow=None)`: Restore a record that has been (soft) deleted. + - `mark_record_for_purge(self, identity, id_, expand=False, uow=None)`: Mark a (soft) deleted record for purge. + - `unmark_record_for_purge(self, identity, id_, expand=False, uow=None)`: Remove the mark for deletion from a record, returning it to deleted state. + - `purge_record(self, identity, id_, uow=None)`: Purge a record that has been marked. +- Overridden methods to add deletion-related functionality + - `read(self, identity, id_, expand=False, action="read", include_deleted=False)`: Adds an `include_deleted` argument to the read method, and a check for the `read_deleted` permission if it is set to `True`. + - `read_draft(self, identity, id_, expand=False)`: Prevents reading a draft if there is a published deleted record. (410 response.) + - `search(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Adds a "read_deleted" permission action to the search method. + - `search_drafts(self, identity, params=None, search_preference=None, expand=False, extra_filter=None, **kwargs)`: Adds a filter to exclude soft-deleted records from the search results. + - `search_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read", **kwargs)`: Adds a "read_deleted" permission action to the search method. +- Additional overridden methods for other functionality + - `publish(self, identity, id_, uow=None, expand=False)`: Adds a check prior to the original publish method to allow enforcement of a config setting that requires a community to be present on a record before it can be published. + - `update_draft(self, identity, id_, data, revision_id=None, uow=None, expand=False)`: Adds a check prior to the original update_draft method to allow enforcement of a config setting that prevents a record from being restricted after the grace period. +- Additional new methods for other functionality + - `expandable_fields`: Expands the `communities` field to return community details. + - `oai_result_item(self, identity, oai_record_source)`: Get a result item from a record source in the OAI server. + - `scan_versions(self, identity, id_, params=None, search_preference=None, expand=False, permission_action="read_deleted", **kwargs)`: Search for record's versions using a "scroll" search. + +### Service Configuration + +A service configuration is an object that provides the service with its configuration. It is passed to the service's constructor when it is instantiated during the Flask app initialization. + +The service configuration is defined in the service's `config` attribute. + +All service configurations inherit from the `ServiceConfig` class, which is defined in `invenio_records_resources.services.base.config`. They include at least: + +- `service_id`: The ID of the service. +- `permission_policy_cls`: The permission policy class to use for the service. +- `result_item_cls`: The result item class to use for the service. +- `result_list_cls`: The result list class to use for the service. + +This is expanded in a `RecordServiceConfig` class by the `invenio_records_resources` package to add: + +- `record_cls`: The record class to use for the service. +- `indexer_cls`: The indexer class to use for the service. +- `indexer_queue_name`: The name of the task queue to be used by the service's indexer. +- `index_dumper`: The dumper to be used for serializing records to be indexed by OpenSearch. +- `relations`: The inverse relation mapping for the service, defining which fields relate to which record type. +- `search`: The search configuration for the service. (This is a `SearchOptions` instance.) +- `schema`: The schema to be used when validating the service's records. +- `links_item`: The template for creating url links for the service's result items. +- `links_search`: The template for creating url links for the service's search endpoints. +- `components`: A list of components that will be used by the service. + +It is further expanded in an overridden `RecordServiceConfig` class by the `invenio_drafts_resources` package to add: + +- `draft_cls`: The draft record class to use for the service. +- `draft_indexer_cls`: The indexer class to use for the service's draft records. +- `draft_indexer_queue_name`: The name of the task queue to be used by the service's draft records indexer. +- `schema_parent`: The schema used to valid parent records for the service. +- `search_drafts`: A search class for searching for draft records. +- `search_versions`: A search class for searching for record versions. +- `default_files_enabled`: Whether files are enabled by default for the service. +- `default_media_files_enabled`: Whether media files are enabled by default for the service. +- `lock_edit_published_files`: Whether to lock editing of published files for the service. +- `links_search_drafts`: The template for creating url links for the service's search drafts endpoint. +- `links_search_versions`: The template for creating url links for the service's search versions endpoint. + +The `RDMRecordServiceConfig` class adds the following additional configuration attributes: + +- `max_files_count`: The maximum number of files that can be attached to a record. +- `file_links_list`: The list of file links for the service. +- `schema_access_settings`: The schema for access settings. +- `schema_secret_link`: The schema for secret links. +- `schema_grant`: The schema for grants. +- `schema_grants`: The schema for grants. +- `schema_request_access`: The schema for request access. +- `schema_tombstone`: The schema for tombstone. +- `schema_quota`: The schema for quota. + + +Additional common configration attributes are added by inheriting from additional mixin classes. + +#### Attaching configuration to the service + +The service config class is passed to the service's constructor when it is instantiated during the Flask app initialization: + +```python +service = MyService(config=MyServiceConfig) +``` + +#### File service configuration + +The `FileConfigMixin` class (defined in `invenio_records_resources.services.records.components.files`) adds config class attributes for: ???? + +- `_files_attr_key`: The attribute key for the files field. +- `_files_data_key`: The attribute key for the files data. +- `_files_bucket_attr_key`: The attribute key for the files bucket. +- `_files_bucket_id_attr_key`: The attribute key for the files bucket ID. + +#### Search configuration + +##### SearchOptionsMixin + +This mixin class (defined in `invenio_records_resources.services.base.config`) adds config class attributes for: + +- `facets`: The search facet definitions for searches on the service's resource. +- `sort_options`: The sort options for searches on the service's resource. +- `sort_default`: The default sort option for searches on the service's resource. +- `sort_default_no_query`: The default sort option for searches on the service's resource when no query is present. +- `available_sort_options`: The available sort options for searches on the service's resource. +- `query_parser_cls`: The query parser class to use in constructing searches on the service's resource. + +##### SearchConfig + +The SearchConfig class (defined in `invenio_records_resources.services.base.config`) defines the search configuration that will be used to interface with OpenSearch. + +##### FromConfigSearchOptions + +The `FromConfigSearchOptions` class (defined in `invenio_records_resources.services.base.config`) is used to load search configuration from app config variables. In the service's config class, it is used like this: + +#### Loading configuration from app config variables + +The `FromConfig` class (defined in `invenio_records_resources.services.base.config`) is used to load configuration from app config variables. In the service's config class, it is used like this: + +```python +class MyServiceConfig(ServiceConfig): + foo = FromConfig("FOO", default=1) +``` + +In the app config, the config variable is defined like this: + +```python +FOO = 2 +``` + +When the service is instantiated, the `FromConfig` class will load the config variable from the app config and assign it to the `foo` attribute. + +### Service Components + +A service component is a class that provides methods that shadow the service's methods. When a service method is called, it passes the call through each of the service's components (using the `Service.run_components()` method), allowing each component to perform additional processing before the result is returned. If the service component includes a method with the same name as the service method that is being called, its matching method will be called. During this call, the component method is passed the service method's arguments and keyword arguments, and the service method's modified versions of these arguments are passed on to the next component. Once all the service's components have been called, the result is returned to the service method, which returns the final result or performs the final action. + +#### BaseServiceComponent + +The `BaseServiceComponent` class (defined in `invenio_records_resources.services.base.components`) is the base class for all service components. It provides a `uow` property that returns the Unit of Work manager. + +This class is overridden by the `ServiceComponent` class (defined in `invenio_records_resources.services.base.components.base`), which adds the following methods: + +- `create(self, identity, **kwargs)`: Perform additional processing while creating an item of the service's resource. +- `read(self, identity, **kwargs)`: Perform additional processing while retrieving an item of the service's resource. +- `update(self, identity, **kwargs)`: Perform additional processing while updating an item of the service's resource. +- `delete(self, identity, **kwargs)`: Perform additional processing while deleting an item of the service's resource. +- `search(self, identity, search, params, **kwargs)`: Perform additional processing while searching for items of the service's resource. + +The `invenio_drafts_resources` package overrides the `ServiceComponent` class to add methods matching the overridden RecordService methods for draft records and versioning. + +- `read_draft(self, identity, draft=None)`: Retrieve a draft record. +- `update_draft(self, identity, data=None, record=None, errors=None)`: Update a draft record. +- `delete_draft(self, identity, draft=None, record=None, force=False)`: Delete a draft record. +- `edit(self, identity, draft=None, record=None)`: Edit a record. +- `new_version(self, identity, draft=None, record=None)`: Create a new version of a record. +- `publish(self, identity, draft=None, record=None)`: Publish a draft record. +- `import_files(self, identity, draft=None, record=None)`: Import files from previous record version. +- `post_publish(self, identity, record=None, is_published=False)`: Post publish handler. + +#### RecordService Components + +The `invenio_records_resources` package provides the following components for the `RecordService` class: + +- `DataServiceComponent` (create, update): Adds data to the record. +- `BaseRecordFilesComponent` (create, update): + - Handles enabling/disabling files for a record. + - Handles setting the default preview file for a record. +- `MetadataComponent` (create, update): Adds metadata to the new/updated record from the input data. +- `RelationsComponent` (read): Dereferences a record's related fields in order to provide the data from the related records in a read result. +- `ChangeNotificationsComponent` (update): Emits a change notification for the updated record. + +The `invenio_drafts_resources` package provides additional components for the `RecordService` class: + +- an overridden `BaseRecordFilesComponent` class that adds methods for ??? +- `DraftFilesComponent`: Handles files for draft records. +- `DraftMediaFilesComponent`: Handles media files for draft records. +- `DraftMetadataComponent`: Handles metadata for draft records. +- `PIDComponent` (create, delete_draft): Handles registration of PIDs for draft records. +- an overridden `RelationsComponent` class that adds a `read_drafts` method + +The `invenio_rdm_records` package provides additional components for the `RDMRecordService` class: + +- `AccessComponent`(create, update_draft, publish, edit, new_version): Handles access settings for records. +- an overridden `MetadataComponent` class (create, update_draft, publish, edit, new_version): Adds metadata to the new/updated record from the input data. (Removes the `update` method from the earlier `MetadataComponent` class.) +- `CustomFieldsComponent`(create, update_draft, publish, edit, new_version): Adds custom fields to the metadata of a record. +- `PIDsComponent`(create, update_draft, delete_draft, publish, edit, new_version, delete_record, restore_record): Handles PIDs for records. +- `ParentPIDsComponent`(create, publish, delete_record, restore_record): Handles parent PIDs for records. +- `RecordDeletionComponent`(delete_record, update_tombstone, restore_record, mark_record, unmark_record, purge_record): Handles deletion of records. +- `RecordFilesProcessorComponent`(publish, lift_embargo): Handles file processing for records. +- `ReviewComponent`(create, delete_draft, publish): Handles reviews for records. +- `SignalComponent`(publish): Triggers signals on publish. +- `ContentModerationComponent`(publish): Creates a moderation request if the user is not verified. + +#### RDMRecordService Components + +The `invenio_rdm_records` package draws its list of components from the `RDM_RECORDS_SERVICE_COMPONENTS` config variable. The default list is defined in the `DefaultRecordsComponents` class (defined in `invenio_rdm_records.services.config`) and currently includes:. + +```python +[ + MetadataComponent, + CustomFieldsComponent, + AccessComponent, + DraftFilesComponent, + DraftMediaFilesComponent, + RecordFilesProcessorComponent, + RecordDeletionComponent, + # for the internal `pid` field + PIDComponent, + # for the `pids` field (external PIDs) + PIDsComponent, + ParentPIDsComponent, + RelationsComponent, + ReviewComponent, + ContentModerationComponent, +] +``` + +Note that the order of the components in the list is important, since the components are called in the order they are listed and some components depend on the results of previous components. \ No newline at end of file diff --git a/docs/build/_sources/index.rst.txt b/docs/build/_sources/index.rst.txt index 59ce7a8bd..4d71aac95 100644 --- a/docs/build/_sources/index.rst.txt +++ b/docs/build/_sources/index.rst.txt @@ -20,6 +20,7 @@ Welcome to the Knowledge Commons Works technical documentation! cli_commands infrastructure developing + architecture in_depth reference diff --git a/docs/build/architecture.html b/docs/build/architecture.html new file mode 100644 index 000000000..347ab7783 --- /dev/null +++ b/docs/build/architecture.html @@ -0,0 +1,769 @@ + + + + + + + + + KCWorks Architecture - Knowledge Commons Works 0.3.5 documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +