From d0dabb4941b3e0b70317dca054ff55a70270bde0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 16 Jan 2024 09:05:41 +0900 Subject: [PATCH 01/84] InitialCommit --- Dockerfile | 22 + app/__pycache__/app.cpython-36.pyc | Bin 0 -> 2370 bytes app/__pycache__/config.cpython-36.pyc | Bin 0 -> 952 bytes app/__pycache__/db_setting.cpython-36.pyc | Bin 0 -> 3115 bytes app/__pycache__/models.cpython-36.pyc | Bin 0 -> 2133 bytes app/api.py | 148 + app/app.py | 71 + app/config.py | 42 + app/db_setting.py | 93 + app/models.py | 63 + app/requirements.txt | 27 + app/static/css/KaTeX/katex.min.css | 1 + .../css/highlight.js/monokai-sublime.min.css | 1 + app/static/css/style.css | 28 + app/static/css/weko_theme/_variables.scss | 31 + app/static/css/weko_theme/bootstrap_cus1.css | 6765 ++++++ app/static/css/weko_theme/gridstack.min.css | 1 + app/static/css/weko_theme/jsontreeview.css | 26 + app/static/css/weko_theme/quill.snow.css | 947 + app/static/css/weko_theme/styles.bundle.css | 1 + app/static/css/weko_theme/styles.scss | 342 + app/static/css/weko_theme/styling.css | 265 + app/static/css/weko_theme/theme.scss | 229 + app/static/css/weko_theme/widget.css | 251 + app/static/favicon.ico | Bin 0 -> 1406 bytes app/static/favicon_default.ico | Bin 0 -> 3262 bytes app/static/images/weko-logo.png | Bin 0 -> 74099 bytes app/static/js/addthis/addthis_widget.js | 70 + app/static/js/axios/axios.min.js | 2 + app/static/js/babel-cores/browser.min.js | 30 + app/static/js/jquery/jquery.min.js | 4 + .../js/react/react-dom.production.min.js | 239 + app/static/js/react/react.production.min.js | 32 + app/static/js/weko_theme/ResizeSensor.js | 261 + app/static/js/weko_theme/base.js | 26 + app/static/js/weko_theme/gridstack.js | 1726 ++ app/static/js/weko_theme/inline.bundle.js | 1 + app/static/js/weko_theme/jsontreeview.js | 18463 ++++++++++++++++ app/static/js/weko_theme/lang_combobox.js | 36 + app/static/js/weko_theme/lodash.js | 17108 ++++++++++++++ app/static/js/weko_theme/main.bundle.js | 1 + app/static/js/weko_theme/polyfills.bundle.js | 1 + app/static/js/weko_theme/search_detail.js | 484 + app/static/js/weko_theme/top_page.js | 388 + app/static/js/weko_theme/widget.js | 1098 + .../oa/crosstalk-1.2.0/css/crosstalk.min.css | 1 + app/static/oa/crosstalk-1.2.0/js/crosstalk.js | 1474 ++ .../oa/crosstalk-1.2.0/js/crosstalk.js.map | 37 + .../oa/crosstalk-1.2.0/js/crosstalk.min.js | 2 + .../crosstalk-1.2.0/js/crosstalk.min.js.map | 1 + .../oa/crosstalk-1.2.0/scss/crosstalk.scss | 75 + .../oa/htmlwidgets-1.5.4/htmlwidgets.js | 903 + app/static/oa/jquery-3.5.1/jquery-AUTHORS.txt | 357 + app/static/oa/jquery-3.5.1/jquery.js | 10872 +++++++++ app/static/oa/jquery-3.5.1/jquery.min.js | 2 + app/static/oa/jquery-3.5.1/jquery.min.map | 1 + app/static/oa/plotly-binding-4.10.1/plotly.js | 939 + .../plotly-htmlwidgets.css | 9 + .../plotly-main-2.11.1/plotly-latest.min.js | 69 + .../oa/typedarray-0.1/typedarray.min.js | 1 + app/templates/_macros.html | 33 + app/templates/affi_index.html | 10 + app/templates/item_index.html | 10 + app/templates/login_index.html | 68 + docker-compose.yml | 54 + modules/app/__pycache__/app.cpython-36.pyc | Bin 0 -> 290 bytes nginx/Dockerfile | 85 + nginx/attribute-map.xml | 196 + nginx/attribute-policy.xml | 97 + nginx/htdigest | 2 + nginx/htpasswd | 1 + nginx/idp-metadata.xml | 25 + nginx/index.php | 388 + nginx/keys/README | 7 + nginx/keys/dummy | 0 nginx/keys/server.crt | 19 + nginx/keys/server.csr | 16 + nginx/keys/server.key | 27 + nginx/keys/subjectnames.txt | 1 + nginx/login.php | 50 + nginx/nginx.conf | 57 + nginx/phpinfo.php | 1 + nginx/redirect_list.map | 2 + nginx/shib_clear_headers | 30 + nginx/shib_fastcgi_params | 130 + nginx/shibboleth2.xml | 133 + nginx/supervisord.conf | 80 + nginx/tip.tar.gz | Bin 0 -> 1065143 bytes nginx/weko.conf | 373 + packages.txt | 39 + postgresql/overlay.sql | 112 + 91 files changed, 66113 insertions(+) create mode 100644 Dockerfile create mode 100644 app/__pycache__/app.cpython-36.pyc create mode 100644 app/__pycache__/config.cpython-36.pyc create mode 100644 app/__pycache__/db_setting.cpython-36.pyc create mode 100644 app/__pycache__/models.cpython-36.pyc create mode 100644 app/api.py create mode 100644 app/app.py create mode 100644 app/config.py create mode 100644 app/db_setting.py create mode 100644 app/models.py create mode 100644 app/requirements.txt create mode 100644 app/static/css/KaTeX/katex.min.css create mode 100644 app/static/css/highlight.js/monokai-sublime.min.css create mode 100644 app/static/css/style.css create mode 100644 app/static/css/weko_theme/_variables.scss create mode 100644 app/static/css/weko_theme/bootstrap_cus1.css create mode 100644 app/static/css/weko_theme/gridstack.min.css create mode 100644 app/static/css/weko_theme/jsontreeview.css create mode 100644 app/static/css/weko_theme/quill.snow.css create mode 100644 app/static/css/weko_theme/styles.bundle.css create mode 100644 app/static/css/weko_theme/styles.scss create mode 100644 app/static/css/weko_theme/styling.css create mode 100644 app/static/css/weko_theme/theme.scss create mode 100644 app/static/css/weko_theme/widget.css create mode 100644 app/static/favicon.ico create mode 100644 app/static/favicon_default.ico create mode 100644 app/static/images/weko-logo.png create mode 100644 app/static/js/addthis/addthis_widget.js create mode 100644 app/static/js/axios/axios.min.js create mode 100644 app/static/js/babel-cores/browser.min.js create mode 100644 app/static/js/jquery/jquery.min.js create mode 100644 app/static/js/react/react-dom.production.min.js create mode 100644 app/static/js/react/react.production.min.js create mode 100644 app/static/js/weko_theme/ResizeSensor.js create mode 100644 app/static/js/weko_theme/base.js create mode 100644 app/static/js/weko_theme/gridstack.js create mode 100644 app/static/js/weko_theme/inline.bundle.js create mode 100644 app/static/js/weko_theme/jsontreeview.js create mode 100644 app/static/js/weko_theme/lang_combobox.js create mode 100644 app/static/js/weko_theme/lodash.js create mode 100644 app/static/js/weko_theme/main.bundle.js create mode 100644 app/static/js/weko_theme/polyfills.bundle.js create mode 100644 app/static/js/weko_theme/search_detail.js create mode 100644 app/static/js/weko_theme/top_page.js create mode 100644 app/static/js/weko_theme/widget.js create mode 100644 app/static/oa/crosstalk-1.2.0/css/crosstalk.min.css create mode 100644 app/static/oa/crosstalk-1.2.0/js/crosstalk.js create mode 100644 app/static/oa/crosstalk-1.2.0/js/crosstalk.js.map create mode 100644 app/static/oa/crosstalk-1.2.0/js/crosstalk.min.js create mode 100644 app/static/oa/crosstalk-1.2.0/js/crosstalk.min.js.map create mode 100644 app/static/oa/crosstalk-1.2.0/scss/crosstalk.scss create mode 100644 app/static/oa/htmlwidgets-1.5.4/htmlwidgets.js create mode 100644 app/static/oa/jquery-3.5.1/jquery-AUTHORS.txt create mode 100644 app/static/oa/jquery-3.5.1/jquery.js create mode 100644 app/static/oa/jquery-3.5.1/jquery.min.js create mode 100644 app/static/oa/jquery-3.5.1/jquery.min.map create mode 100644 app/static/oa/plotly-binding-4.10.1/plotly.js create mode 100644 app/static/oa/plotly-htmlwidgets-css-2.11.1/plotly-htmlwidgets.css create mode 100644 app/static/oa/plotly-main-2.11.1/plotly-latest.min.js create mode 100644 app/static/oa/typedarray-0.1/typedarray.min.js create mode 100644 app/templates/_macros.html create mode 100644 app/templates/affi_index.html create mode 100644 app/templates/item_index.html create mode 100644 app/templates/login_index.html create mode 100644 docker-compose.yml create mode 100644 modules/app/__pycache__/app.cpython-36.pyc create mode 100644 nginx/Dockerfile create mode 100644 nginx/attribute-map.xml create mode 100644 nginx/attribute-policy.xml create mode 100644 nginx/htdigest create mode 100644 nginx/htpasswd create mode 100644 nginx/idp-metadata.xml create mode 100644 nginx/index.php create mode 100644 nginx/keys/README create mode 100644 nginx/keys/dummy create mode 100644 nginx/keys/server.crt create mode 100644 nginx/keys/server.csr create mode 100644 nginx/keys/server.key create mode 100644 nginx/keys/subjectnames.txt create mode 100644 nginx/login.php create mode 100644 nginx/nginx.conf create mode 100644 nginx/phpinfo.php create mode 100644 nginx/redirect_list.map create mode 100644 nginx/shib_clear_headers create mode 100644 nginx/shib_fastcgi_params create mode 100644 nginx/shibboleth2.xml create mode 100644 nginx/supervisord.conf create mode 100644 nginx/tip.tar.gz create mode 100644 nginx/weko.conf create mode 100644 packages.txt create mode 100644 postgresql/overlay.sql diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9ae5107 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +# pythonのバージョンは任意 +FROM python:3.6-slim-buster + +WORKDIR /usr/src/app +ENV FLASK_APP=app + +COPY /app/requirements.txt ./ +ENV INVENIO_WEB_HOST=127.0.0.1 +ENV INVENIO_WEB_INSTANCE=invenio +ENV INVENIO_WEB_VENV=invenio +ENV INVENIO_WEB_HOST_NAME=invenio +ENV INVENIO_USER_EMAIL=wekosoftware@nii.ac.jp +ENV INVENIO_USER_PASS=uspass123 +ENV INVENIO_POSTGRESQL_HOST=postgresql +ENV INVENIO_POSTGRESQL_DBNAME=invenio +ENV INVENIO_POSTGRESQL_DBUSER=invenio +ENV INVENIO_POSTGRESQL_DBPASS=dbpass123 +ENV INVENIO_WORKER_HOST=127.0.0.1 +ENV INVENIO_DB_POOL_CLASS=QueuePool + +RUN pip install --upgrade pip +RUN pip install -r requirements.txt \ No newline at end of file diff --git a/app/__pycache__/app.cpython-36.pyc b/app/__pycache__/app.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49cf7816525fc88c51747ae94ac42e48fa703728 GIT binary patch literal 2370 zcma)8UvC^W5V!Z=?OpD2*Cb8SG;PyARGdILq#}??RJEi@L2c8j2}oE%tL@o$*~{*2 z>h;m))JP~B3Hp!+J_4vO2oOj-A@NE4dJm{yp-;?slMtak^dfu5W6#+0^KZtvR;yK7 z|GX5dB|=8z#LofwCbaAdC4>`BW5S9rWfaC%Y$Z0c6Nfp8%iP3cUQ%ME#Akj|X62;9 zDiqh-@mNx2)uhI1X6(e{NuAY`25XqH8=p!h*o2Y2cruw{Q^{#|I+hI#e8puSC+^f!pC@ZpYW=f$Zb{!{RLj* z<6X+@2NrMeQ~LxwEF9`54)v3K%IGih^L(1m>{E8hteDLyKf~wD+-0MI{rNmUXEawh zT_?>8uMobqrmx-AILx+mU5Y*zGEgGfjzcB1F9naJXe(VB$T;YvQkSH7G7y>4ZU<~O zbtw~B7NvbX)*eW(S3$VF-L!NiPPOGY2hyAcCB+Qk~cr}%YZXEgzG6D9H z+G$c4f9VVGr4Q_0N`?8fguSiT#qfA;yO!R=cc zw?N~30oyYVd`qEpWqoD&(aJ_}cjc=#Mt=0OK)4Aly8@jc$QEV^n^VBs5iYmj>xmM# z;p=k;kaJ}fmJUusH_Cq;<$sUzUq*XBjq(?x{MXUmUxT`t`2oaH{=1ofF+h`1{@ZBp zkI~-CQU2#zv#k9f=!c020$mA$B;|t`H7TgB5#qAw)W^|Bw(D@YqjBe<)%w=i&&dLU$R!W50OnG(; z5(0$jwT#9Hl7jT&)&bom&xxYkULwlM$u3nkcb-%39#{a9xAy8LtObW&Ec#uw2^7g> zCy-&Er^&EU5F`S|JzLyVNem0?g$_xBWJ{Wkp6rUgkU+*myC73i`ry|bUD~*VB^OX} z5xZjyK?;$~kX*#_0I6}>pq}N^DwXen?$x)@ zwV}$IAAVhE2wZj*I%S}G0Tk(3-;oXwh1>hSp$5sV+fc=FtUm5=>dxWSE))s6uqAdD z^?#m^Xm<@gFF^O4d_B8Mzb8E)UC)AM&w#ft2_;V~j_}eoV2sz^Ory5Y9xw&a)wM8d zM^O+9rG(71$D?kfGAKjV;s=@r0JSaq-2w>Y%cUY$6d4JVilsU0vVFpq@T5q}NU_jr!V!xvpqZc>&g%jY0kpW!zt0f^HF7!Bxw* z99p49JDh5TolX=-p@NbNHB%{w@R++`L-4fAN5+_^25f6>SVzm?WV)H;IY9uEIwotX zMb;F1eT?4FEdho@KOApG5K$mSH-gaQTW)V`-fsI!u{~ORa$<9o0jT%!^N#!oKC%T} z@e*xGJYo?N=C4FfO00B67MPMzh9Minhij`S39^C<#!x+8sE^*EqP)~_rd-TCRUJ8w z;}S@aOPQ(6rUn;v*=wi$PSiC?3IANAT*O(Chxkxv8_F=N6%{Ti-a_q1{m8tSz=?DK zU|xomCdtfw8@wgP{l;tZmx?Fj28M15GuHHXAzK@et5eXbkhLDLr(!kS*|FJLr99#M E3wGsANdN!< literal 0 HcmV?d00001 diff --git a/app/__pycache__/config.cpython-36.pyc b/app/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2c5be79c0b30e171195a560ae4bb120de2116ee GIT binary patch literal 952 zcma)4%Wm306gAj91A&%^e_#U`J7A=$!cf#A6dcvr)SJ=RGtfzl?fRiASyk#|U8&1t z6Df;!(@i)1hJJ##Rhsq}y6V^zj4Bo#>s}w7b95h?5z6Hv_;!O!1%~;~Y@I!d2Q)m3 zrpF9oQ0fg0%)Dl`6iOo&aVUebR~*X4I3MEz#YL(_{2nT8Jmna#Jo^-{Jr(M&{`KFx z%4unIUu7CKgZA8<6h#9X-T_URq1_qkOKB`hYaC*!p9>4Jt*~A} z4Cp&#?ml1Ny?^)f)!Rny;$SWD^1vdb3618dldzqgtgw^ihdV3mWQA?E7R>nzUjx+6_RMzAqxUOa79UD`>auFDEPhO49HfIOh6SpbS@NmDcFO3)^?04h!JY`U`Vn z`d6WGv`QE05?!V%v_Y@@P{PqQScWxv^@ZuL?-_KJu01#C8aNZ%x9K|Fcy9O`^cua6 z?`vSgI^9Ig>##I2{7txe^v1-1O>%?2acDGe{EX)`nx=HS*_R*+mZDrc{NiCJ4u_D8 zu(ud82m}yF2T=+*P~M$NwyYci=TVl*I-d$ja12Z?@i5DQlGz}dtWXH!fCVCY2Ba5o zXxh?!1R}T}h(MO$8Kgowg^1$uM|sA@fB`>=x7+P@l;XE2+orud;QY?r_dboYFo=h! zw0-x3_ix{MsWC1UqJQg;51N*AAq_Jcr32|eILvT;rx&GkycV63cis)NxJXiRo5Vp6 z;wB$&6(=|>f?fy%P1SP-RRW;p)1|5~-#iWjpp=mTTuqRXp} z8~Llo&62dDQ)v|^(h85I)yF44#sf8QDm)+wGvyzFF$h&4U;aunfq#es7`{mj-=d~( ze{b|nYEk>S>pM_F;8hT6&JQ*%(eiT#p;i6fa16hO(5NsQjmLl3Px2TNT*S+mmpua( zQSjhYK&nFTB_M_w<*m?}t*PGXQP%uzY=j}qGh<>MS!d>%b!Ja&(>ODZZ0y++3sb1bH5h2xSN;MutIn%;grD&Aw0ZlNcwiFs~+ZKQV{Ls-W(_LXUzBPos7g?(voQ>2h!N@J~G zaoAH&eOED`Z`t3xe^2A*;m&8fkG>_34-OuZ$DN(eJA1p*Z261$S&!{J>>M6;WmWk^ zV?{11k>m_Wj_7#OtjIF@t{)BLVwB_=69h>@u~BvRGz5(`S^c7b0v@BGEXUbkfUH@f z&?^SAhA5-Z4~kecOLNfpOE`&!@D!nbO|LrLK?&0$W9&_Y&b0X*O8&LqN`jWc*(x?h z)iUe&x6GQkVmjuVD37-;0r|IPXf8;XXwD-<)(A;5S|EE8StsPA2x3Ka*sBmivyc#- zE?6W47JzU{7_yx8jxaH$qvFm~DzIzV$i-O-h7iYSd2yzu$!;nobu`TZTPScB8`pHK zx@(zw^dhMgO{iIQQmI)~8ci^T&a5MoVr@kdLQ0w#NI(|C-yZ*CH{}I#51u~~i2orV zt9XizqCu(vsZwIb_k5NP50Df41w+s=k77NGV(xJO?=AdrVTQb=VDJ`x(Wv8ImTJ5X zg~&NpIdl?lT|#Td25m^&F_v8}+B6DcG~{j6z>T$rB8j(V+q#9@x;2|$PdQ$H{AFkF zQRn5p2`cbEA9TA|am!)Bc*bM}P9ZD=$Wj<*x)!g{UXVwZ$Wk`u=}#Dhn2PLubmBZ7 zIuNo!Gcw)QOJnWtGO8LC7h%Qzgi>g#KK|7EA}CAPnev||04_xVseMvetjJB(e(JYI2Ohrj>hU5;caF+nXok#oKJ+gDq{c5-SWdESc zK2hchJo^07qCM%{!@A@zofN=E$hQgsVkAqtf61YmG89cn_me3x{Y80_-^HeGDZZ7E%T*+{?&8W4gxY=VTu384)nL6LSN*kq-ZFRf17lk~*hJ+a-p zJGlU> zRDIO1253+X(ay2M);Q=bIW5L?*3HnFp?NHpzX7kk$>iXX5h!9HXh$WYyei@cg$ z{d%XSRf7pltMcuWvQFQW;yj(Oybxtm=QQP{Xll$;-p*zX6WdXg!gKudvt3%8lWP9t zr6?&+6@EJKDjIGGPwPgc=lN@LyE&aSOmBZT{E~5GYnjX0LNr z=C#o0pkQzJWdG#w`98B?h4flc)Xf{|7mNUjSo-Zul?ndCU>~SBO8mXG({i@MS+SGP zW;+^2zCD|>0XPE~e54fDu^e;Lbj)D&ul@hxUtR5~+JHfH`NtM=h&%O&k8SM0u(5mX zqCne1>@A=guzzi#XtioN>)rboCRB)upjX2z!2#4lC>>SbS3@OJNG)Fyw=JC(EGGwJ zNA_l{ta3KbF36mzQ~;K`ylja~@>Vou4d7Iy7B@eEZ*1x%Kn>e~Dce-ykrG=VWRhh< zQMY8KLx{pjS|w(oQharIR$|%DCzFzvxvD~#qewd%R)Ei8@RHusu+% zzy#o}O>1QJ;irA;K}WFo!Jzv9xCelT8q^5;ngV56g5I^nE2y`2JITBt&_qhnu=!Qm zv9mjKhYhsVh2egQqKAD1*VdS`kCm2!SdqX!0sUy4tYd?r zSMPV`>ET`nS)J{F!Km@OE9m(D!Ke}3Sn&ottMZ*`7>8Y>dJ)z_`6a;e4GbQExP=mc zRQ99s*0MkKCp70588qjXm153pa54u3+JJ9UzHH6gxXdXj1lKK&sopB1d-t*-YW~%o znL2OTA0vDUp@o2N8B>I^LK*czHc O^Rc;U4M(HFDESAW@Avlr literal 0 HcmV?d00001 diff --git a/app/api.py b/app/api.py new file mode 100644 index 0000000..12f3e84 --- /dev/null +++ b/app/api.py @@ -0,0 +1,148 @@ +from datetime import datetime + +from flask_security import RoleMixin, UserMixin +from sqlalchemy.dialects import mysql, postgresql +from sqlalchemy import Column, Integer, String, Float, DateTime, and_, asc, desc, func, or_ +from db_setting import Engine, Base, db + +from models import User as _User +from models import Affiliation_Id as _Affiliation_Id +from models import Affiliation_Repository as _Affiliation_Repository + +class Affiliation_Repository(object): + """operated on the Affiliation repository""" + def create_aff_repository(self, aff_repository): + """ + create new aff_repository + :param aff_repository: + :return: + """ + assert aff_repository + try: + with db.session.begin_nested(): + db.session.execute(_Affiliation_Repository.__table__.insert(), aff_repository) + db.session.commit() + return aff_repository + except Exception as ex: + db.session.rollback() + return None + + def upt_aff_repository(self, aff_repository): + assert aff_repository + try: + with db.session.begin_nested(): + _aff_repository = _User.query.filter_by(id=aff_repository.get('id')).one_or_none() + if _aff_repository: + _aff_repository.affiliation_id = aff_repository.get('affiliation_id') + _aff_repository.role = aff_repository.get('repository_url') + _aff_repository.access_token = aff_repository.get('access_token') + db.session.merge(_aff_repository) + db.session.commit() + return _aff_repository + except Exception as ex: + db.session.rollback() + return None + + def get_aff_repository_by_affiliation_id(self, affiliation_id): + with db.session.autoflush(): + query = _Affiliation_Repository.query.filter(affiliation_id=affiliation_id) + return query.one_or_none() + + +class User(object): + """operated on the user""" + def create_user(self, user): + """ create new user + :param user: + :return: + """ + assert user + try: + with db.session.begin_nested(): + db.session.execute(_User.__table__.insert(), user) + db.session.commit() + return user + except Exception as ex: + db.session.rollback() + return None + + def upt_user(self, user): + assert user + try: + with db.session.begin_nested(): + _user = _User.query.filter_by(id=user.get('id')).one_or_none() + if _user: + _user.affiliation_id = user.get('affiliation_id') + _user.user_orcid = user.get('user_orcid') + _user.role = user.get('role') + db.session.merge(_user) + db.session.commit() + return _user + except Exception as ex: + db.session.rollback() + return None + + def get_user_by_user_id_and_affiliation_id(self, user_id, affiliation_id): + with db.session.no_autoflush: + query = _User.query.filter(and_(_User.user_id == user_id, + _User.affiliation_id == affiliation_id)) + return query.one_or_none() + + def get_users_by_user_id(self, user_id): + with db.session.no_autoflush: + query = _User.query.filter(user_id=user_id) + return query.all() + + def get_users_by_affiliation_id(self, affiliation_id): + with db.session.no_autoflush: + query = _User.query.filter(affiliation_id=affiliation_id) + return query.all() + + +class Affiliation_Id(object): + """ + operated on the Affiliation ID + """ + def create_affiliation_id(self, affiliation_idp_url, affiliation_name): + """ + create new affiliation_id + :param affiliation_id: class _Affiliation_Id + :return: + """ + assert affiliation_idp_url + assert affiliation_name + affiliation_id = _Affiliation_Id(affiliation_idp_url=affiliation_idp_url, affiliation_name=affiliation_name) + try: + with db.session.begin_nested(): + db.session.execute(_Affiliation_Id.__table__.insert(), affiliation_id) + db.session.commit() + return affiliation_id + except Exception as ex: + db.session.rollback() + return None + + def upt_affiliation_id(self, affiliation_id): + assert affiliation_id + try: + with db.session.begin_nested(): + _affliation_id = _Affiliation_Id.query.filter_by(id=affiliation_id.get('id')).one_or_none() + if _affliation_id: + _affliation_id.affiliation_idp_url = affiliation_id.get('affiliation_idp_url') + _affliation_id.affiliation_name = affiliation_id.get('affiliation_name') + db.session.merge(_affliation_id) + db.session.commit() + return _affliation_id + except Exception as ex: + db.session.rollback() + return None + + def get_affiliation_id_by_id(self, affiliation_id): + with db.session.no_autoflush(): + query = _Affiliation_Id.query.filter_by(id = affiliation_id) + return query.one_or_none() + + def get_affiliation_id_by_idp_url(self, idp_url): + with db.session.no_autoflush(): + query = _Affiliation_Id.query.filter_by(affiliation_idp_url = idp_url) + return query.one_or_none() + diff --git a/app/app.py b/app/app.py new file mode 100644 index 0000000..c711464 --- /dev/null +++ b/app/app.py @@ -0,0 +1,71 @@ + +import random +import string +from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app +from flask_login import login_user, LoginManager +from flask_security import LoginForm, url_for_security +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField ,PasswordField +from config import MOCK_SHIB_DATA +from models import User as _User +from models import Affiliation_Id as _Affiliation_Id +from api import User +from api import Affiliation_Id + +app = Flask(__name__) +login_manager = LoginManager() +login_manager.init_app(app) +app.config['SECRET_KEY'] = "secret" + +class LoginForm(FlaskForm): + email = StringField('メールアドレス') + password = PasswordField('パスワード') + submit = SubmitField('ログイン') + +@app.route("/login", methods=['GET']) +def index_login(): + # login_user() + # if not current_user: + # return render_template("login_index.html") + # return index_item() + csrf_random = generate_random_str(length=64) + session['csrf_random'] = csrf_random + login_user_form = LoginForm() + return render_template("login_index.html", login_user_form = login_user_form) + +@app.route("/login", methods=['POST']) +def login(): + form=LoginForm() + if form.validate_on_submit(): + shib_data = MOCK_SHIB_DATA.get(form.email.data) + if shib_data and form.password.data == "testpass": + affiliation_idp_url = shib_data.get("affiliation_idp_url",None) + if not Affiliation_Id.get_affiliation_id_by_idp_url(affiliation_idp_url): + _affili_id = _Affiliation_Id() + Affiliation_Id.create_affiliation_id() + user = _User( + affiliation_id= + ) + # login_user() + return form.email.data + flash("Missing SHIB_ATTRs!", category='error') + return index_login() + + +def generate_random_str(length=128): + """Generate secret key.""" + rng = random.SystemRandom() + + return ''.join( + rng.choice(string.ascii_letters + string.digits) + for _ in range(0, length) + ) + +@app.route("/affiliation_setting") +def index_affili(): + return render_template("affi_index.html") + +@app.route("/item_register") +def index_item(): + return render_template("item_index.html") + \ No newline at end of file diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..293826a --- /dev/null +++ b/app/config.py @@ -0,0 +1,42 @@ +class AppConfig(object): + # セッション Cookie に安全に署名するために使用される秘密キー + SECRET_KEY = 'fbc0b8ddc8deba4769b780a959405de3370c883f6c6b47499487e364e17b24a1' + + # セッション Cookieの名前 + SESSION_COOKIE_NAME = 'flask_login_app' + +MOCK_SHIB_DATA={"testuser1A@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.alphaalpha.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser1A", + "OrganizationName":"alpha", + "wekoSocietyAffiliation":"", + "eduPersonOrcid":"orcid_testuser1"}, + "testuser2A@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.alphaalpha.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser2A", + "OrganizationName":"alpha", + "wekoSocietyAffiliation":"", + "eduPersonOrcid":"orcid_testuser2"}, + "testuser3A@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.alphaalpha.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser3A", + "OrganizationName":"alpha", + "wekoSocietyAffiliation":"図書館員", + "eduPersonOrcid":""}, + "testuser1B@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.betabeta.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser1B", + "OrganizationName":"beta", + "wekoSocietyAffiliation":"", + "eduPersonOrcid":"orcid_testuser1"}, + "testuser2B@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.betabeta.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser2B", + "OrganizationName":"beta", + "wekoSocietyAffiliation":"", + "eduPersonOrcid":"orcid_testuser2"}, + "testuser3B@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.betabeta.ac.jp/idp/profile/SAML2/Redirect/SSO", + "eduPersonPrincipalName":"testuser2C", + "OrganizationName":"beta", + "wekoSocietyAffiliation":"図書館員", + "eduPersonOrcid":""}, + "testadmin@nii.ac.jp":{"affiliation_idp_url":"https://idp.auth.alphaalpha.ac.jp/idp/profile/SAML2/Redirect/SSO",, + "eduPersonPrincipalName":"testuser4", + "OrganizationName":"alpha", + "wekoSocietyAffiliation":"管理者", + "eduPersonOrcid":""}} \ No newline at end of file diff --git a/app/db_setting.py b/app/db_setting.py new file mode 100644 index 0000000..fe358ab --- /dev/null +++ b/app/db_setting.py @@ -0,0 +1,93 @@ + +from typing import NoReturn + +from flask_sqlalchemy import SQLAlchemy as FlaskSQLAlchemy +from sqlalchemy import create_engine +from sqlalchemy.engine import Engine +from sqlalchemy.orm import Session, sessionmaker, scoped_session +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import MetaData, event, util + +# 接続先DBの設定 +DATABASE = 'postgresql:///invenio:dbpass123@localhost:25401/invenio' + +Engine = create_engine( + DATABASE, + encoding="utf-8", + echo=False +) + +session = scoped_session(sessionmaker(bind = Engine)) + + + +NAMING_CONVENTION = util.immutabledict({ + 'ix': 'ix_%(column_0_label)s', + 'uq': 'uq_%(table_name)s_%(column_0_name)s', + 'ck': 'ck_%(table_name)s_%(constraint_name)s', + 'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', + 'pk': 'pk_%(table_name)s', +}) +"""Configuration for constraint naming conventions.""" + +metadata = MetaData(naming_convention=NAMING_CONVENTION) +"""Default database metadata object holding associated schema constructs.""" +class SQLAlchemy(FlaskSQLAlchemy): + """Implement or overide extension methods.""" + + def apply_driver_hacks(self, app, info, options): + """Call before engine creation.""" + # Don't forget to apply hacks defined on parent object. + super(SQLAlchemy, self).apply_driver_hacks(app, info, options) + + # Set database pool connection + self.__set_db_connection_pool(app, options) + + @staticmethod + def __set_db_connection_pool(app: object, options: dict) -> NoReturn: + """Set database connection pool. + + :param app: Invenio app. + :param options: The `options` parameter is + a dictionary of keyword arguments that will then be used to call + the :func:`sqlalchemy.create_engine` function. + """ + try: + str_pool_class = app.config['DB_SQLALCHEMY_POOL_PACKAGE'] + '.' + \ + app.config['DB_POOL_CLASS'] + pool_class = import_string( + str_pool_class) + except Exception as error: + pool_class = QueuePool + app.logger.debug(error) + options.setdefault('poolclass', pool_class) + options.setdefault('pool_pre_ping', True) + + +def do_sqlite_connect(dbapi_connection, connection_record): + """Ensure SQLite checks foreign key constraints. + + For further details see "Foreign key support" sections on + https://docs.sqlalchemy.org/en/latest/dialects/sqlite.html#foreign-key-support + """ + # Enable foreign key constraint checking + cursor = dbapi_connection.cursor() + cursor.execute('PRAGMA foreign_keys=ON') + cursor.close() + + +def do_sqlite_begin(dbapi_connection): + """Ensure SQLite transaction are started properly. + + For further details see "Foreign key support" sections on + https://docs.sqlalchemy.org/en/rel_1_0/dialects/sqlite.html#pysqlite-serializable # noqa + """ + # emit our own BEGIN + dbapi_connection.execute('BEGIN') + +db = SQLAlchemy(metadata=metadata) + + +Base = declarative_base() +Base.query = session.query_property() + diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..2dc126d --- /dev/null +++ b/app/models.py @@ -0,0 +1,63 @@ +from datetime import datetime + +from flask_security import RoleMixin, UserMixin +from sqlalchemy.dialects import mysql, postgresql +from sqlalchemy import Column, Integer, String, Float, DateTime +from db_setting import Engine, Base, db + +class Timestamp(object): + """Timestamp model mix-in with fractional seconds support. + + SQLAlchemy-Utils timestamp model does not have support for + fractional seconds. + """ + + created = db.Column( + DateTime().with_variant(mysql.DATETIME(fsp=6), 'mysql'), + default=datetime.utcnow, + nullable=False + ) + updated = db.Column( + DateTime().with_variant(mysql.DATETIME(fsp=6), 'mysql'), + default=datetime.utcnow, + nullable=False + ) + +class User(UserMixin, Timestamp): + """User data model.""" + + __tablename__ = "user" + + id = db.Column(Integer, primary_key=True, nullable=False, unique=True, autoincrement=True) + + user_id = db.Column(String(80), nullable=False) + + affiliation_id = db.Column(Integer, nullable=False) + + user_orcid = db.Column(String(80)) + + role = db.Column(String(80)) + +class Affiliation_Repository(Base, Timestamp): + """Affiliationrepository data model""" + + __tablename__ = "affiliation_repository" + + id = db.Column(Integer, primary_key=True, nullable=False, unique=True, autoincrement=True) + + affiliation_id = db.Column(Integer, nullable=False) + + repository_url = db.Column(String(80), nullable=False) + + access_token = db.Column(String(80), nullable=False) + +class Affiliation_Id(Base, Timestamp): + """Affiliation ID data model""" + + __tablename__ = "affiliation_id" + + id = db.Column(Integer, primary_key=True, nullable = False, unique=True, autoincrement=True) + + affiliaiton_idp_url = db.Column(String(80), nullable=False) + + affiliaiton_name = db.Column(String(80), nullable=False) \ No newline at end of file diff --git a/app/requirements.txt b/app/requirements.txt new file mode 100644 index 0000000..80021cf --- /dev/null +++ b/app/requirements.txt @@ -0,0 +1,27 @@ +Flask==1.0.4 +Flask-Admin==1.5.3 +Flask-Alembic==2.0.1 +Flask-Assets==0.12 +Flask-BabelEx==0.9.4 +Flask-Breadcrumbs==0.5.0 +Flask-Caching==1.10.1 +Flask-Collect==1.2.2 +Flask-Cors==3.0.3 +Flask-Limiter==1.1.0 +Flask-Login==0.4.1 +Flask-Mail==0.9.1 +Flask-Menu==0.6.0 +Flask-OAuthlib +Flask-WTF==0.14.3 +Flask-Security==3.0.0 +email-validator +github3.py==1.1.0 +requests==2.18.4 +requests-oauthlib==1.1.0 +SQLAlchemy==1.2.19 +SQLAlchemy-Continuum==1.3.6 +SQLAlchemy-Utils==0.35.0 +# fpdf==1.7.2 +flask-marshmallow==0.14.0 +sword3common==0.1.1 +wtforms \ No newline at end of file diff --git a/app/static/css/KaTeX/katex.min.css b/app/static/css/KaTeX/katex.min.css new file mode 100644 index 0000000..d6fb837 --- /dev/null +++ b/app/static/css/KaTeX/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.eot);src:url(fonts/KaTeX_AMS-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_AMS-Regular.woff2) format('woff2'),url(fonts/KaTeX_AMS-Regular.woff) format('woff'),url(fonts/KaTeX_AMS-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.eot);src:url(fonts/KaTeX_Caligraphic-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Bold.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.eot);src:url(fonts/KaTeX_Caligraphic-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'),url(fonts/KaTeX_Caligraphic-Regular.woff) format('woff'),url(fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.eot);src:url(fonts/KaTeX_Fraktur-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Bold.woff) format('woff'),url(fonts/KaTeX_Fraktur-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.eot);src:url(fonts/KaTeX_Fraktur-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'),url(fonts/KaTeX_Fraktur-Regular.woff) format('woff'),url(fonts/KaTeX_Fraktur-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.eot);src:url(fonts/KaTeX_Main-Bold.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Bold.woff2) format('woff2'),url(fonts/KaTeX_Main-Bold.woff) format('woff'),url(fonts/KaTeX_Main-Bold.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.eot);src:url(fonts/KaTeX_Main-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Italic.woff2) format('woff2'),url(fonts/KaTeX_Main-Italic.woff) format('woff'),url(fonts/KaTeX_Main-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.eot);src:url(fonts/KaTeX_Main-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Main-Regular.woff2) format('woff2'),url(fonts/KaTeX_Main-Regular.woff) format('woff'),url(fonts/KaTeX_Main-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.eot);src:url(fonts/KaTeX_Math-Italic.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Math-Italic.woff2) format('woff2'),url(fonts/KaTeX_Math-Italic.woff) format('woff'),url(fonts/KaTeX_Math-Italic.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Regular.eot);src:url(fonts/KaTeX_SansSerif-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'),url(fonts/KaTeX_SansSerif-Regular.woff) format('woff'),url(fonts/KaTeX_SansSerif-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.eot);src:url(fonts/KaTeX_Script-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Script-Regular.woff2) format('woff2'),url(fonts/KaTeX_Script-Regular.woff) format('woff'),url(fonts/KaTeX_Script-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.eot);src:url(fonts/KaTeX_Size1-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size1-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size1-Regular.woff) format('woff'),url(fonts/KaTeX_Size1-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.eot);src:url(fonts/KaTeX_Size2-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size2-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size2-Regular.woff) format('woff'),url(fonts/KaTeX_Size2-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.eot);src:url(fonts/KaTeX_Size3-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size3-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size3-Regular.woff) format('woff'),url(fonts/KaTeX_Size3-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.eot);src:url(fonts/KaTeX_Size4-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Size4-Regular.woff2) format('woff2'),url(fonts/KaTeX_Size4-Regular.woff) format('woff'),url(fonts/KaTeX_Size4-Regular.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.eot);src:url(fonts/KaTeX_Typewriter-Regular.eot#iefix) format('embedded-opentype'),url(fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'),url(fonts/KaTeX_Typewriter-Regular.woff) format('woff'),url(fonts/KaTeX_Typewriter-Regular.ttf) format('truetype');font-weight:400;font-style:normal}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:inline-block;text-align:initial}.katex{font:400 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;white-space:nowrap;text-indent:0}.katex .katex-html{display:inline-block}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .base,.katex .strut{display:inline-block}.katex .mathrm{font-style:normal}.katex .textit{font-style:italic}.katex .mathit{font-family:KaTeX_Math;font-style:italic}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .amsrm,.katex .mathbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr{font-family:KaTeX_Script}.katex .mathsf{font-family:KaTeX_SansSerif}.katex .mainit{font-family:KaTeX_Main;font-style:italic}.katex .mord+.mop{margin-left:.16667em}.katex .mord+.mbin{margin-left:.22222em}.katex .mord+.mrel{margin-left:.27778em}.katex .mop+.mop,.katex .mop+.mord,.katex .mord+.minner{margin-left:.16667em}.katex .mop+.mrel{margin-left:.27778em}.katex .mop+.minner{margin-left:.16667em}.katex .mbin+.minner,.katex .mbin+.mop,.katex .mbin+.mopen,.katex .mbin+.mord{margin-left:.22222em}.katex .mrel+.minner,.katex .mrel+.mop,.katex .mrel+.mopen,.katex .mrel+.mord{margin-left:.27778em}.katex .mclose+.mop{margin-left:.16667em}.katex .mclose+.mbin{margin-left:.22222em}.katex .mclose+.mrel{margin-left:.27778em}.katex .mclose+.minner,.katex .minner+.mop,.katex .minner+.mord,.katex .mpunct+.mclose,.katex .mpunct+.minner,.katex .mpunct+.mop,.katex .mpunct+.mopen,.katex .mpunct+.mord,.katex .mpunct+.mpunct,.katex .mpunct+.mrel{margin-left:.16667em}.katex .minner+.mbin{margin-left:.22222em}.katex .minner+.mrel{margin-left:.27778em}.katex .minner+.minner,.katex .minner+.mopen,.katex .minner+.mpunct{margin-left:.16667em}.katex .mbin.mtight,.katex .mclose.mtight,.katex .minner.mtight,.katex .mop.mtight,.katex .mopen.mtight,.katex .mord.mtight,.katex .mpunct.mtight,.katex .mrel.mtight{margin-left:0}.katex .mclose+.mop.mtight,.katex .minner+.mop.mtight,.katex .mop+.mop.mtight,.katex .mop+.mord.mtight,.katex .mord+.mop.mtight{margin-left:.16667em}.katex .reset-textstyle.textstyle{font-size:1em}.katex .reset-textstyle.scriptstyle{font-size:.7em}.katex .reset-textstyle.scriptscriptstyle{font-size:.5em}.katex .reset-scriptstyle.textstyle{font-size:1.42857em}.katex .reset-scriptstyle.scriptstyle{font-size:1em}.katex .reset-scriptstyle.scriptscriptstyle{font-size:.71429em}.katex .reset-scriptscriptstyle.textstyle{font-size:2em}.katex .reset-scriptscriptstyle.scriptstyle{font-size:1.4em}.katex .reset-scriptscriptstyle.scriptscriptstyle{font-size:1em}.katex .style-wrap{position:relative}.katex .vlist{display:inline-block}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist .baseline-fix{display:inline-table;table-layout:fixed}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{width:100%}.katex .mfrac .frac-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .mfrac .frac-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .mspace{display:inline-block}.katex .mspace.negativethinspace{margin-left:-.16667em}.katex .mspace.thinspace{width:.16667em}.katex .mspace.negativemediumspace{margin-left:-.22222em}.katex .mspace.mediumspace{width:.22222em}.katex .mspace.thickspace{width:.27778em}.katex .mspace.sixmuspace{width:.333333em}.katex .mspace.eightmuspace{width:.444444em}.katex .mspace.enspace{width:.5em}.katex .mspace.twelvemuspace{width:.666667em}.katex .mspace.quad{width:1em}.katex .mspace.qquad{width:2em}.katex .llap,.katex .rlap{width:0;position:relative}.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .rlap>.inner{left:0}.katex .katex-logo .a{font-size:.75em;margin-left:-.32em;position:relative;top:-.2em}.katex .katex-logo .t{margin-left:-.23em}.katex .katex-logo .e{margin-left:-.1667em;position:relative;top:.2155em}.katex .katex-logo .x{margin-left:-.125em}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .overline .overline-line,.katex .underline .underline-line{width:100%}.katex .overline .overline-line:before,.katex .underline .underline-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .overline .overline-line:after,.katex .underline .underline-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.sqrt-sign{position:relative}.katex .sqrt .sqrt-line{width:100%}.katex .sqrt .sqrt-line:before{border-bottom-style:solid;border-bottom-width:1px;content:"";display:block}.katex .sqrt .sqrt-line:after{border-bottom-style:solid;border-bottom-width:.04em;content:"";display:block;margin-top:-1px}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:2em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:3.46em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:4.14em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.98em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.47142857em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.95714286em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.55714286em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.875em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.125em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.25em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.5em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.8em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.1625em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.5875em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:3.1125em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.77777778em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.88888889em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.6em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.92222222em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.3em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.76666667em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.7em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.8em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.9em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.2em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.44em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.73em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:2.07em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.49em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.58333333em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.66666667em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.75em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.83333333em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44166667em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.725em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.075em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.48611111em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.55555556em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.625em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.69444444em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.20138889em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.4375em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72916667em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.28901734em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.40462428em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.46242775em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.52023121em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.57803468em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69364162em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83236994em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.19653179em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.43930636em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.24154589em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.33816425em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.38647343em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.43478261em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.48309179em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.57971014em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69565217em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83574879em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20289855em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.20080321em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2811245em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.32128514em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.36144578em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.40160643em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48192771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57831325em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69477912em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8313253em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist>span,.katex .op-limits>.vlist>span{text-align:center}.katex .accent .accent-body>span{width:0}.katex .accent .accent-body.accent-vec>span{position:relative;left:.326em}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid #000}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist{text-align:center}.katex .mtable .col-align-l>.vlist{text-align:left}.katex .mtable .col-align-r>.vlist{text-align:right} \ No newline at end of file diff --git a/app/static/css/highlight.js/monokai-sublime.min.css b/app/static/css/highlight.js/monokai-sublime.min.css new file mode 100644 index 0000000..589eff9 --- /dev/null +++ b/app/static/css/highlight.js/monokai-sublime.min.css @@ -0,0 +1 @@ +.hljs{display:block;overflow-x:auto;padding:0.5em;background:#23241f}.hljs,.hljs-tag,.hljs-subst{color:#f8f8f2}.hljs-strong,.hljs-emphasis{color:#a8a8a2}.hljs-bullet,.hljs-quote,.hljs-number,.hljs-regexp,.hljs-literal,.hljs-link{color:#ae81ff}.hljs-code,.hljs-title,.hljs-section,.hljs-selector-class{color:#a6e22e}.hljs-strong{font-weight:bold}.hljs-emphasis{font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-name,.hljs-attr{color:#f92672}.hljs-symbol,.hljs-attribute{color:#66d9ef}.hljs-params,.hljs-class .hljs-title{color:#f8f8f2}.hljs-string,.hljs-type,.hljs-built_in,.hljs-builtin-name,.hljs-selector-id,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-addition,.hljs-variable,.hljs-template-variable{color:#e6db74}.hljs-comment,.hljs-deletion,.hljs-meta{color:#75715e} \ No newline at end of file diff --git a/app/static/css/style.css b/app/static/css/style.css new file mode 100644 index 0000000..3e86244 --- /dev/null +++ b/app/static/css/style.css @@ -0,0 +1,28 @@ +body.cover-page { + background-color: rgba(13,95,137,.8); + text-align: center; +} +.row { + margin:80px; +} + +.panel-body { + padding-left: 40px; + padding-right: 40px; + padding-bottom: 40px; +} + +.container { + width: 1170px; +} +.container, .container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +.panel { + color: #000; + border-radius: 12px; +} \ No newline at end of file diff --git a/app/static/css/weko_theme/_variables.scss b/app/static/css/weko_theme/_variables.scss new file mode 100644 index 0000000..f6c4467 --- /dev/null +++ b/app/static/css/weko_theme/_variables.scss @@ -0,0 +1,31 @@ +//** Background color for ``. +$body-bg: #ffffff !default; + +//** Background color for ``. +$panel-bg: #ffffff !default; + +//** Background color for `
`. +$navbar-default-bg: #0d5f89 !default; + +//** Background color for ` \ No newline at end of file From fe7267c242f898b1141807a70d36431e850e485e Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Wed, 21 Feb 2024 11:29:55 +0900 Subject: [PATCH 27/84] =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=80=85=E3=81=8C?= =?UTF-8?q?=E6=A9=9F=E9=96=A2=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=80=81=E3=83=97=E3=83=AB=E3=83=80=E3=82=A6?= =?UTF-8?q?=E3=83=B3=E3=81=AE=E8=BF=BD=E5=8A=A0=E5=87=A6=E7=90=86=20api.py?= =?UTF-8?q?=20DB=E3=81=8B=E3=82=89=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E8=BF=BD=E5=8A=A0=20views.py=20=E6=A9=9F=E9=96=A2?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _macro.html add_affili.html add_affili.js 機関追加ページ追加 overlay.sql default値追加 affi_index.html admin_settings.js プルダウン処理追加 --- .../admin_setting/static/js/add_affili.js | 47 +++++++++++++ .../admin_setting/static/js/admin_settings.js | 16 +++++ .../templates/admin_setting/_macros.html | 3 + .../templates/admin_setting/add_affili.html | 67 +++++++++++++++++++ .../templates/admin_setting/affi_index.html | 16 ++++- .../admin_setting/permission_required.html | 2 +- .../admin_setting/templates/footer.html | 9 --- app/modules/admin_setting/views.py | 36 +++++++++- app/modules/api.py | 22 +++++- .../templates/item_register/_macros.html | 3 + app/static/css/admin.css | 20 +++++- postgresql/overlay.sql | 4 ++ 12 files changed, 226 insertions(+), 19 deletions(-) create mode 100644 app/modules/admin_setting/static/js/add_affili.js create mode 100644 app/modules/admin_setting/templates/admin_setting/add_affili.html diff --git a/app/modules/admin_setting/static/js/add_affili.js b/app/modules/admin_setting/static/js/add_affili.js new file mode 100644 index 0000000..34be28d --- /dev/null +++ b/app/modules/admin_setting/static/js/add_affili.js @@ -0,0 +1,47 @@ +function closeError() { + document.getElementById("errors").innerHTML = ""; +} + +function showMsg(msg , success=false) { + text = '
' + + '' + msg + '
'; + document.getElementById("errors").insertAdjacentHTML('afterbegin',text); + +} + +async function componentDidMount() { +/** set errorMessage Area */ + const header = document.getElementsByClassName("content-header")[0]; + if (header) { + const errorElement = document.createElement('div'); + errorElement.setAttribute('id', 'errors'); + header.insertBefore(errorElement, header.firstChild); + } +} + +function handleAddSubmit(){ + closeError(); + const form ={ + 'affiliation_name': document.getElementById("affiliation_name").value, + 'affiliation_idp_url': document.getElementById("affiliation_idp_url").value, + } + let pattern = /^(https?|ftp)(:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+)/ + if(pattern.test(form.affiliation_idp_url)){ + fetch("/admin_setting/add" ,{method:'POST' ,headers:{'Content-Type':'application/json'} ,credentials:"include", body: JSON.stringify(form)}) + .then(res => { + if(!res.ok){ + console.log(etext); + } + console.log("ok"); + showMsg("Successfully Registered Settings." , true); + }) + .catch(error => { + console.log(error); + showMsg("Failed To Register Settings" , false); + }); + }else{ + showMsg("Idp URL: Please input in URL format." , false); + } +} +componentDidMount(); \ No newline at end of file diff --git a/app/modules/admin_setting/static/js/admin_settings.js b/app/modules/admin_setting/static/js/admin_settings.js index 387cb6f..7f2f0a7 100644 --- a/app/modules/admin_setting/static/js/admin_settings.js +++ b/app/modules/admin_setting/static/js/admin_settings.js @@ -27,6 +27,22 @@ if(role=="管理者"){ } }); +function handleSelect(){ + closeError(); + const aff_repository_dict = document.getElementById("aff_repository_dict").value; + const aff_repository_info = JSON.parse(aff_repository_dict); + const affiliation_name_id = document.getElementById("affiliation_name").value; + const repogitory_url = document.getElementById("repository_url"); + const access_token = document.getElementById("access_token"); + if(affiliation_name_id in aff_repository_info){ + repogitory_url.value = aff_repository_info[affiliation_name_id]["repository_url"]; + access_token.value = aff_repository_info[affiliation_name_id]["access_token"]; + }else{ + repogitory_url.value = ""; + access_token.value = ""; + } +} + function handleAffiliSubmit(){ closeError(); const form ={ diff --git a/app/modules/admin_setting/templates/admin_setting/_macros.html b/app/modules/admin_setting/templates/admin_setting/_macros.html index eed143e..9aad15e 100644 --- a/app/modules/admin_setting/templates/admin_setting/_macros.html +++ b/app/modules/admin_setting/templates/admin_setting/_macros.html @@ -1,4 +1,7 @@ {% macro tabs_selector(tab_value='top') %} +{%- if current_user.role == "管理者" %} +
  • {{ ('登録先追加') }}
  • +{%- endif %}
  • {{ ('登録先設定') }}
  • {{ ('アイテム登録') }}
  • {% endmacro %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/add_affili.html b/app/modules/admin_setting/templates/admin_setting/add_affili.html new file mode 100644 index 0000000..5bc5c78 --- /dev/null +++ b/app/modules/admin_setting/templates/admin_setting/add_affili.html @@ -0,0 +1,67 @@ +{% extends "base.html" %} + +{%- block body %} +{% include "header.html" %} +
    +
    +
    +
    +
    +
    +
    +
    + +

    overlay

    +
    +
    +
    +
    +
    +
    +
    +
    +{% include "footer.html" %} + +{%- endblock body %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/affi_index.html b/app/modules/admin_setting/templates/admin_setting/affi_index.html index 32babf5..90a9b50 100644 --- a/app/modules/admin_setting/templates/admin_setting/affi_index.html +++ b/app/modules/admin_setting/templates/admin_setting/affi_index.html @@ -11,7 +11,7 @@
    -

    WEKO3

    +

    overlay

    @@ -28,14 +28,24 @@
    + +
    + {%- if current_user.role == "図書館員" -%} - + value={{affiliation_name}} readonly> + {%- endif -%} + {%- if current_user.role == "管理者" -%} + + {%- endif -%}
    diff --git a/app/modules/admin_setting/templates/admin_setting/permission_required.html b/app/modules/admin_setting/templates/admin_setting/permission_required.html index e1e7f87..76ee3dd 100644 --- a/app/modules/admin_setting/templates/admin_setting/permission_required.html +++ b/app/modules/admin_setting/templates/admin_setting/permission_required.html @@ -11,7 +11,7 @@
    -

    WEKO3

    +

    overlay

    diff --git a/app/modules/admin_setting/templates/footer.html b/app/modules/admin_setting/templates/footer.html index 3a23fd0..d198abe 100644 --- a/app/modules/admin_setting/templates/footer.html +++ b/app/modules/admin_setting/templates/footer.html @@ -7,15 +7,6 @@
    -
    -
    -

    Powered by WEKO3

    -

    - Change consent - settings -

    -
    -
    \ No newline at end of file diff --git a/app/modules/admin_setting/views.py b/app/modules/admin_setting/views.py index 1b7069f..14ece49 100644 --- a/app/modules/admin_setting/views.py +++ b/app/modules/admin_setting/views.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint +from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint, json from flask_login import login_user, current_user, logout_user, login_required from flask_security import LoginForm, url_for_security from flask_wtf import FlaskForm @@ -22,10 +22,10 @@ def index_affili(): if not current_user.is_authenticated: return index_login() if request.method == "POST": - affiliation_name = request.json.get("affiliation_name") + affiliation_name_id = request.json.get("affiliation_name") repository_url = request.json.get("repository_url") access_token = request.json.get("access_token") - affiliation_id_info = Affiliation_Id().get_affiliation_id_by_affiliation_name(affiliation_name) + affiliation_id_info = Affiliation_Id().get_affiliation_id_by_id(affiliation_name_id) if affiliation_id_info: affiliation_repository_info = Affiliation_Repository().get_aff_repository_by_affiliation_id(affiliation_id_info.id) if affiliation_repository_info: @@ -66,12 +66,42 @@ def index_affili(): if affiliation_repository_info: repository_url = affiliation_repository_info.repository_url access_token = affiliation_repository_info.access_token + affiliation_id_list = Affiliation_Id().get_affiliation_id_list() + affiliation_repository_list = Affiliation_Repository().get_affiliation_repository_list() + aff_repository_dict = {} + for affiliation_repository in affiliation_repository_list: + aff_repository_dict[affiliation_repository.affiliation_id] = {"repository_url":affiliation_repository.repository_url, "access_token":affiliation_repository.access_token} form = FlaskForm(request.form) return render_template("admin_setting/affi_index.html", form = form, + affiliation_id_list = affiliation_id_list, + aff_repository_dict = json.dumps(aff_repository_dict), affiliation_name = affiliation_name, repository_url = repository_url, access_token = access_token) else: form = FlaskForm(request.form) return render_template("admin_setting/permission_required.html", form = form) + +@blueprint.route("/add", methods=['GET', 'POST']) +def add_affili(): + if not current_user.is_authenticated: + return index_login() + if request.method == "POST": + affiliation_name = request.json.get("affiliation_name") + affiliation_idp_url = request.json.get("affiliation_idp_url") + affiliation_id_info = Affiliation_Id().get_affiliation_id_by_idp_url(affiliation_idp_url) + try: + if not affiliation_id_info: + Affiliation_Id().create_affiliation_id(affiliation_idp_url, affiliation_name) + return jsonify(success=True),200 + except Exception as e: + return current_app.logger.error( + 'ERROR affliation settings: {}'.format(e)) + else: + if current_user.role == "管理者": + form = FlaskForm(request.form) + return render_template("admin_setting/add_affili.html", form = form) + else: + form = FlaskForm(request.form) + return render_template("admin_setting/permission_required.html", form = form) \ No newline at end of file diff --git a/app/modules/api.py b/app/modules/api.py index 5fa6c78..db52e7c 100644 --- a/app/modules/api.py +++ b/app/modules/api.py @@ -51,6 +51,15 @@ def get_aff_repository_by_affiliation_id(self, affiliation_id): with db.session.no_autoflush: query = _Affiliation_Repository.query.filter_by(affiliation_id=affiliation_id) return query.one_or_none() + + def get_affiliation_repository_list(self): + """Get affiliation_repository list info. + + :return: + """ + with db.session.no_autoflush: + query = _Affiliation_Repository.query.filter_by().order_by(asc(_Affiliation_Repository.id)) + return query.all() class User(object): @@ -153,9 +162,9 @@ def get_affiliation_id_by_id(self, affiliation_id): query = _Affiliation_Id.query.filter_by(id = affiliation_id) return query.one_or_none() - def get_affiliation_id_by_idp_url(self, idp_url): + def get_affiliation_id_by_idp_url(self, affiliation_idp_url): # with db.session.no_autoflush(): - query = _Affiliation_Id.query.filter_by(affiliation_idp_url = idp_url) + query = _Affiliation_Id.query.filter_by(affiliation_idp_url = affiliation_idp_url) return query.one_or_none() def get_affiliation_id_by_affiliation_name(self, affiliation_name): @@ -163,3 +172,12 @@ def get_affiliation_id_by_affiliation_name(self, affiliation_name): query = _Affiliation_Id.query.filter_by(affiliation_name = affiliation_name) return query.one_or_none() + def get_affiliation_id_list(self): + """Get affiliation_name list info. + + :return: + """ + with db.session.no_autoflush: + query = _Affiliation_Id.query.filter_by().order_by(asc(_Affiliation_Id.id)) + return query.all() + diff --git a/app/modules/item_register/templates/item_register/_macros.html b/app/modules/item_register/templates/item_register/_macros.html index 78024b6..ad059ee 100644 --- a/app/modules/item_register/templates/item_register/_macros.html +++ b/app/modules/item_register/templates/item_register/_macros.html @@ -1,4 +1,7 @@ {% macro tabs_selector(tab_value='top') %} +{%- if current_user.role == "管理者" %} +
  • {{ ('登録先追加') }}
  • +{%- endif %} {%- if current_user.role == "管理者" or current_user.role == "図書館員" %}
  • {{ ('登録先設定') }}
  • {%- endif %} diff --git a/app/static/css/admin.css b/app/static/css/admin.css index 4885e26..a944b80 100644 --- a/app/static/css/admin.css +++ b/app/static/css/admin.css @@ -942,4 +942,22 @@ } .ql-container.ql-snow { border: 1px solid #ccc; - } \ No newline at end of file + } + .alert-success { + border-color: #008d4c +} +.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header { + color: #fff!important +} +.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body { + background-color: #00a65a!important; +} +.alert .close { + color: #000; + opacity: .2; + filter: alpha(opacity=20) +} +.alert .close:hover { + opacity: .5; + filter: alpha(opacity=50) +} \ No newline at end of file diff --git a/postgresql/overlay.sql b/postgresql/overlay.sql index 81fe5d2..ee663a5 100644 --- a/postgresql/overlay.sql +++ b/postgresql/overlay.sql @@ -31,6 +31,10 @@ create sequence public.affiliation_id_seq alter sequence public.affiliation_id_seq owned by public.affiliation_id.id; +-- 「default」レコードの追加 +insert into affiliation_id(created,updated,id,affiliation_idp_url,affiliation_name) +values(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1,'-','default'); + -- 新テーブルの作成 (user) create table public.user ( From edfd774f53cf71ba3e387d83436cde22bc3bebd3 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Wed, 21 Feb 2024 11:36:52 +0900 Subject: [PATCH 28/84] =?UTF-8?q?Revert=20"=E7=AE=A1=E7=90=86=E8=80=85?= =?UTF-8?q?=E3=81=8C=E6=A9=9F=E9=96=A2=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=80=81=E3=83=97=E3=83=AB=E3=83=80?= =?UTF-8?q?=E3=82=A6=E3=83=B3=E3=81=AE=E8=BF=BD=E5=8A=A0=E5=87=A6=E7=90=86?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fe7267c242f898b1141807a70d36431e850e485e. --- .../admin_setting/static/js/add_affili.js | 47 ------------- .../admin_setting/static/js/admin_settings.js | 16 ----- .../templates/admin_setting/_macros.html | 3 - .../templates/admin_setting/add_affili.html | 67 ------------------- .../templates/admin_setting/affi_index.html | 16 +---- .../admin_setting/permission_required.html | 2 +- .../admin_setting/templates/footer.html | 9 +++ app/modules/admin_setting/views.py | 36 +--------- app/modules/api.py | 22 +----- .../templates/item_register/_macros.html | 3 - app/static/css/admin.css | 20 +----- postgresql/overlay.sql | 4 -- 12 files changed, 19 insertions(+), 226 deletions(-) delete mode 100644 app/modules/admin_setting/static/js/add_affili.js delete mode 100644 app/modules/admin_setting/templates/admin_setting/add_affili.html diff --git a/app/modules/admin_setting/static/js/add_affili.js b/app/modules/admin_setting/static/js/add_affili.js deleted file mode 100644 index 34be28d..0000000 --- a/app/modules/admin_setting/static/js/add_affili.js +++ /dev/null @@ -1,47 +0,0 @@ -function closeError() { - document.getElementById("errors").innerHTML = ""; -} - -function showMsg(msg , success=false) { - text = '
    ' + - '' + msg + '
    '; - document.getElementById("errors").insertAdjacentHTML('afterbegin',text); - -} - -async function componentDidMount() { -/** set errorMessage Area */ - const header = document.getElementsByClassName("content-header")[0]; - if (header) { - const errorElement = document.createElement('div'); - errorElement.setAttribute('id', 'errors'); - header.insertBefore(errorElement, header.firstChild); - } -} - -function handleAddSubmit(){ - closeError(); - const form ={ - 'affiliation_name': document.getElementById("affiliation_name").value, - 'affiliation_idp_url': document.getElementById("affiliation_idp_url").value, - } - let pattern = /^(https?|ftp)(:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+)/ - if(pattern.test(form.affiliation_idp_url)){ - fetch("/admin_setting/add" ,{method:'POST' ,headers:{'Content-Type':'application/json'} ,credentials:"include", body: JSON.stringify(form)}) - .then(res => { - if(!res.ok){ - console.log(etext); - } - console.log("ok"); - showMsg("Successfully Registered Settings." , true); - }) - .catch(error => { - console.log(error); - showMsg("Failed To Register Settings" , false); - }); - }else{ - showMsg("Idp URL: Please input in URL format." , false); - } -} -componentDidMount(); \ No newline at end of file diff --git a/app/modules/admin_setting/static/js/admin_settings.js b/app/modules/admin_setting/static/js/admin_settings.js index 7f2f0a7..387cb6f 100644 --- a/app/modules/admin_setting/static/js/admin_settings.js +++ b/app/modules/admin_setting/static/js/admin_settings.js @@ -27,22 +27,6 @@ if(role=="管理者"){ } }); -function handleSelect(){ - closeError(); - const aff_repository_dict = document.getElementById("aff_repository_dict").value; - const aff_repository_info = JSON.parse(aff_repository_dict); - const affiliation_name_id = document.getElementById("affiliation_name").value; - const repogitory_url = document.getElementById("repository_url"); - const access_token = document.getElementById("access_token"); - if(affiliation_name_id in aff_repository_info){ - repogitory_url.value = aff_repository_info[affiliation_name_id]["repository_url"]; - access_token.value = aff_repository_info[affiliation_name_id]["access_token"]; - }else{ - repogitory_url.value = ""; - access_token.value = ""; - } -} - function handleAffiliSubmit(){ closeError(); const form ={ diff --git a/app/modules/admin_setting/templates/admin_setting/_macros.html b/app/modules/admin_setting/templates/admin_setting/_macros.html index 9aad15e..eed143e 100644 --- a/app/modules/admin_setting/templates/admin_setting/_macros.html +++ b/app/modules/admin_setting/templates/admin_setting/_macros.html @@ -1,7 +1,4 @@ {% macro tabs_selector(tab_value='top') %} -{%- if current_user.role == "管理者" %} -
  • {{ ('登録先追加') }}
  • -{%- endif %}
  • {{ ('登録先設定') }}
  • {{ ('アイテム登録') }}
  • {% endmacro %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/add_affili.html b/app/modules/admin_setting/templates/admin_setting/add_affili.html deleted file mode 100644 index 5bc5c78..0000000 --- a/app/modules/admin_setting/templates/admin_setting/add_affili.html +++ /dev/null @@ -1,67 +0,0 @@ -{% extends "base.html" %} - -{%- block body %} -{% include "header.html" %} -
    -
    -
    -
    -
    -
    -
    -
    - -

    overlay

    -
    -
    -
    -
    -
    -
    -
    -
    -{% include "footer.html" %} - -{%- endblock body %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/affi_index.html b/app/modules/admin_setting/templates/admin_setting/affi_index.html index 90a9b50..32babf5 100644 --- a/app/modules/admin_setting/templates/admin_setting/affi_index.html +++ b/app/modules/admin_setting/templates/admin_setting/affi_index.html @@ -11,7 +11,7 @@
    -

    overlay

    +

    WEKO3

    @@ -28,24 +28,14 @@
    - -
    - {%- if current_user.role == "図書館員" -%} - {%- endif -%} - {%- if current_user.role == "管理者" -%} - - {%- endif -%} + value={{affiliation_name}} readonly> +
    diff --git a/app/modules/admin_setting/templates/admin_setting/permission_required.html b/app/modules/admin_setting/templates/admin_setting/permission_required.html index 76ee3dd..e1e7f87 100644 --- a/app/modules/admin_setting/templates/admin_setting/permission_required.html +++ b/app/modules/admin_setting/templates/admin_setting/permission_required.html @@ -11,7 +11,7 @@
    -

    overlay

    +

    WEKO3

    diff --git a/app/modules/admin_setting/templates/footer.html b/app/modules/admin_setting/templates/footer.html index d198abe..3a23fd0 100644 --- a/app/modules/admin_setting/templates/footer.html +++ b/app/modules/admin_setting/templates/footer.html @@ -7,6 +7,15 @@
    +
    +
    +

    Powered by WEKO3

    +

    + Change consent + settings +

    +
    +
    \ No newline at end of file diff --git a/app/modules/admin_setting/views.py b/app/modules/admin_setting/views.py index 14ece49..1b7069f 100644 --- a/app/modules/admin_setting/views.py +++ b/app/modules/admin_setting/views.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint, json +from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint from flask_login import login_user, current_user, logout_user, login_required from flask_security import LoginForm, url_for_security from flask_wtf import FlaskForm @@ -22,10 +22,10 @@ def index_affili(): if not current_user.is_authenticated: return index_login() if request.method == "POST": - affiliation_name_id = request.json.get("affiliation_name") + affiliation_name = request.json.get("affiliation_name") repository_url = request.json.get("repository_url") access_token = request.json.get("access_token") - affiliation_id_info = Affiliation_Id().get_affiliation_id_by_id(affiliation_name_id) + affiliation_id_info = Affiliation_Id().get_affiliation_id_by_affiliation_name(affiliation_name) if affiliation_id_info: affiliation_repository_info = Affiliation_Repository().get_aff_repository_by_affiliation_id(affiliation_id_info.id) if affiliation_repository_info: @@ -66,42 +66,12 @@ def index_affili(): if affiliation_repository_info: repository_url = affiliation_repository_info.repository_url access_token = affiliation_repository_info.access_token - affiliation_id_list = Affiliation_Id().get_affiliation_id_list() - affiliation_repository_list = Affiliation_Repository().get_affiliation_repository_list() - aff_repository_dict = {} - for affiliation_repository in affiliation_repository_list: - aff_repository_dict[affiliation_repository.affiliation_id] = {"repository_url":affiliation_repository.repository_url, "access_token":affiliation_repository.access_token} form = FlaskForm(request.form) return render_template("admin_setting/affi_index.html", form = form, - affiliation_id_list = affiliation_id_list, - aff_repository_dict = json.dumps(aff_repository_dict), affiliation_name = affiliation_name, repository_url = repository_url, access_token = access_token) else: form = FlaskForm(request.form) return render_template("admin_setting/permission_required.html", form = form) - -@blueprint.route("/add", methods=['GET', 'POST']) -def add_affili(): - if not current_user.is_authenticated: - return index_login() - if request.method == "POST": - affiliation_name = request.json.get("affiliation_name") - affiliation_idp_url = request.json.get("affiliation_idp_url") - affiliation_id_info = Affiliation_Id().get_affiliation_id_by_idp_url(affiliation_idp_url) - try: - if not affiliation_id_info: - Affiliation_Id().create_affiliation_id(affiliation_idp_url, affiliation_name) - return jsonify(success=True),200 - except Exception as e: - return current_app.logger.error( - 'ERROR affliation settings: {}'.format(e)) - else: - if current_user.role == "管理者": - form = FlaskForm(request.form) - return render_template("admin_setting/add_affili.html", form = form) - else: - form = FlaskForm(request.form) - return render_template("admin_setting/permission_required.html", form = form) \ No newline at end of file diff --git a/app/modules/api.py b/app/modules/api.py index db52e7c..5fa6c78 100644 --- a/app/modules/api.py +++ b/app/modules/api.py @@ -51,15 +51,6 @@ def get_aff_repository_by_affiliation_id(self, affiliation_id): with db.session.no_autoflush: query = _Affiliation_Repository.query.filter_by(affiliation_id=affiliation_id) return query.one_or_none() - - def get_affiliation_repository_list(self): - """Get affiliation_repository list info. - - :return: - """ - with db.session.no_autoflush: - query = _Affiliation_Repository.query.filter_by().order_by(asc(_Affiliation_Repository.id)) - return query.all() class User(object): @@ -162,9 +153,9 @@ def get_affiliation_id_by_id(self, affiliation_id): query = _Affiliation_Id.query.filter_by(id = affiliation_id) return query.one_or_none() - def get_affiliation_id_by_idp_url(self, affiliation_idp_url): + def get_affiliation_id_by_idp_url(self, idp_url): # with db.session.no_autoflush(): - query = _Affiliation_Id.query.filter_by(affiliation_idp_url = affiliation_idp_url) + query = _Affiliation_Id.query.filter_by(affiliation_idp_url = idp_url) return query.one_or_none() def get_affiliation_id_by_affiliation_name(self, affiliation_name): @@ -172,12 +163,3 @@ def get_affiliation_id_by_affiliation_name(self, affiliation_name): query = _Affiliation_Id.query.filter_by(affiliation_name = affiliation_name) return query.one_or_none() - def get_affiliation_id_list(self): - """Get affiliation_name list info. - - :return: - """ - with db.session.no_autoflush: - query = _Affiliation_Id.query.filter_by().order_by(asc(_Affiliation_Id.id)) - return query.all() - diff --git a/app/modules/item_register/templates/item_register/_macros.html b/app/modules/item_register/templates/item_register/_macros.html index ad059ee..78024b6 100644 --- a/app/modules/item_register/templates/item_register/_macros.html +++ b/app/modules/item_register/templates/item_register/_macros.html @@ -1,7 +1,4 @@ {% macro tabs_selector(tab_value='top') %} -{%- if current_user.role == "管理者" %} -
  • {{ ('登録先追加') }}
  • -{%- endif %} {%- if current_user.role == "管理者" or current_user.role == "図書館員" %}
  • {{ ('登録先設定') }}
  • {%- endif %} diff --git a/app/static/css/admin.css b/app/static/css/admin.css index a944b80..4885e26 100644 --- a/app/static/css/admin.css +++ b/app/static/css/admin.css @@ -942,22 +942,4 @@ } .ql-container.ql-snow { border: 1px solid #ccc; - } - .alert-success { - border-color: #008d4c -} -.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header { - color: #fff!important -} -.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body { - background-color: #00a65a!important; -} -.alert .close { - color: #000; - opacity: .2; - filter: alpha(opacity=20) -} -.alert .close:hover { - opacity: .5; - filter: alpha(opacity=50) -} \ No newline at end of file + } \ No newline at end of file diff --git a/postgresql/overlay.sql b/postgresql/overlay.sql index ee663a5..81fe5d2 100644 --- a/postgresql/overlay.sql +++ b/postgresql/overlay.sql @@ -31,10 +31,6 @@ create sequence public.affiliation_id_seq alter sequence public.affiliation_id_seq owned by public.affiliation_id.id; --- 「default」レコードの追加 -insert into affiliation_id(created,updated,id,affiliation_idp_url,affiliation_name) -values(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1,'-','default'); - -- 新テーブルの作成 (user) create table public.user ( From 3c5cf6cea5ae8ad4f5274b2306abb1768a412b28 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Wed, 21 Feb 2024 11:38:49 +0900 Subject: [PATCH 29/84] =?UTF-8?q?Revert=20"Revert=20"=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E8=80=85=E3=81=8C=E6=A9=9F=E9=96=A2=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=80=81=E3=83=97=E3=83=AB?= =?UTF-8?q?=E3=83=80=E3=82=A6=E3=83=B3=E3=81=AE=E8=BF=BD=E5=8A=A0=E5=87=A6?= =?UTF-8?q?=E7=90=86""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit edfd774f53cf71ba3e387d83436cde22bc3bebd3. --- .../admin_setting/static/js/add_affili.js | 47 +++++++++++++ .../admin_setting/static/js/admin_settings.js | 16 +++++ .../templates/admin_setting/_macros.html | 3 + .../templates/admin_setting/add_affili.html | 67 +++++++++++++++++++ .../templates/admin_setting/affi_index.html | 16 ++++- .../admin_setting/permission_required.html | 2 +- .../admin_setting/templates/footer.html | 9 --- app/modules/admin_setting/views.py | 36 +++++++++- app/modules/api.py | 22 +++++- .../templates/item_register/_macros.html | 3 + app/static/css/admin.css | 20 +++++- postgresql/overlay.sql | 4 ++ 12 files changed, 226 insertions(+), 19 deletions(-) create mode 100644 app/modules/admin_setting/static/js/add_affili.js create mode 100644 app/modules/admin_setting/templates/admin_setting/add_affili.html diff --git a/app/modules/admin_setting/static/js/add_affili.js b/app/modules/admin_setting/static/js/add_affili.js new file mode 100644 index 0000000..34be28d --- /dev/null +++ b/app/modules/admin_setting/static/js/add_affili.js @@ -0,0 +1,47 @@ +function closeError() { + document.getElementById("errors").innerHTML = ""; +} + +function showMsg(msg , success=false) { + text = '
    ' + + '' + msg + '
    '; + document.getElementById("errors").insertAdjacentHTML('afterbegin',text); + +} + +async function componentDidMount() { +/** set errorMessage Area */ + const header = document.getElementsByClassName("content-header")[0]; + if (header) { + const errorElement = document.createElement('div'); + errorElement.setAttribute('id', 'errors'); + header.insertBefore(errorElement, header.firstChild); + } +} + +function handleAddSubmit(){ + closeError(); + const form ={ + 'affiliation_name': document.getElementById("affiliation_name").value, + 'affiliation_idp_url': document.getElementById("affiliation_idp_url").value, + } + let pattern = /^(https?|ftp)(:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+)/ + if(pattern.test(form.affiliation_idp_url)){ + fetch("/admin_setting/add" ,{method:'POST' ,headers:{'Content-Type':'application/json'} ,credentials:"include", body: JSON.stringify(form)}) + .then(res => { + if(!res.ok){ + console.log(etext); + } + console.log("ok"); + showMsg("Successfully Registered Settings." , true); + }) + .catch(error => { + console.log(error); + showMsg("Failed To Register Settings" , false); + }); + }else{ + showMsg("Idp URL: Please input in URL format." , false); + } +} +componentDidMount(); \ No newline at end of file diff --git a/app/modules/admin_setting/static/js/admin_settings.js b/app/modules/admin_setting/static/js/admin_settings.js index 387cb6f..7f2f0a7 100644 --- a/app/modules/admin_setting/static/js/admin_settings.js +++ b/app/modules/admin_setting/static/js/admin_settings.js @@ -27,6 +27,22 @@ if(role=="管理者"){ } }); +function handleSelect(){ + closeError(); + const aff_repository_dict = document.getElementById("aff_repository_dict").value; + const aff_repository_info = JSON.parse(aff_repository_dict); + const affiliation_name_id = document.getElementById("affiliation_name").value; + const repogitory_url = document.getElementById("repository_url"); + const access_token = document.getElementById("access_token"); + if(affiliation_name_id in aff_repository_info){ + repogitory_url.value = aff_repository_info[affiliation_name_id]["repository_url"]; + access_token.value = aff_repository_info[affiliation_name_id]["access_token"]; + }else{ + repogitory_url.value = ""; + access_token.value = ""; + } +} + function handleAffiliSubmit(){ closeError(); const form ={ diff --git a/app/modules/admin_setting/templates/admin_setting/_macros.html b/app/modules/admin_setting/templates/admin_setting/_macros.html index eed143e..9aad15e 100644 --- a/app/modules/admin_setting/templates/admin_setting/_macros.html +++ b/app/modules/admin_setting/templates/admin_setting/_macros.html @@ -1,4 +1,7 @@ {% macro tabs_selector(tab_value='top') %} +{%- if current_user.role == "管理者" %} +
  • {{ ('登録先追加') }}
  • +{%- endif %}
  • {{ ('登録先設定') }}
  • {{ ('アイテム登録') }}
  • {% endmacro %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/add_affili.html b/app/modules/admin_setting/templates/admin_setting/add_affili.html new file mode 100644 index 0000000..5bc5c78 --- /dev/null +++ b/app/modules/admin_setting/templates/admin_setting/add_affili.html @@ -0,0 +1,67 @@ +{% extends "base.html" %} + +{%- block body %} +{% include "header.html" %} +
    +
    +
    +
    +
    +
    +
    +
    + +

    overlay

    +
    +
    +
    +
    +
    +
    +
    +
    +{% include "footer.html" %} + +{%- endblock body %} \ No newline at end of file diff --git a/app/modules/admin_setting/templates/admin_setting/affi_index.html b/app/modules/admin_setting/templates/admin_setting/affi_index.html index 32babf5..90a9b50 100644 --- a/app/modules/admin_setting/templates/admin_setting/affi_index.html +++ b/app/modules/admin_setting/templates/admin_setting/affi_index.html @@ -11,7 +11,7 @@
    -

    WEKO3

    +

    overlay

    @@ -28,14 +28,24 @@
    + +
    + {%- if current_user.role == "図書館員" -%} - + value={{affiliation_name}} readonly> + {%- endif -%} + {%- if current_user.role == "管理者" -%} + + {%- endif -%}
    diff --git a/app/modules/admin_setting/templates/admin_setting/permission_required.html b/app/modules/admin_setting/templates/admin_setting/permission_required.html index e1e7f87..76ee3dd 100644 --- a/app/modules/admin_setting/templates/admin_setting/permission_required.html +++ b/app/modules/admin_setting/templates/admin_setting/permission_required.html @@ -11,7 +11,7 @@
    -

    WEKO3

    +

    overlay

    diff --git a/app/modules/admin_setting/templates/footer.html b/app/modules/admin_setting/templates/footer.html index 3a23fd0..d198abe 100644 --- a/app/modules/admin_setting/templates/footer.html +++ b/app/modules/admin_setting/templates/footer.html @@ -7,15 +7,6 @@
    -
    -
    -

    Powered by WEKO3

    -

    - Change consent - settings -

    -
    -
    \ No newline at end of file diff --git a/app/modules/admin_setting/views.py b/app/modules/admin_setting/views.py index 1b7069f..14ece49 100644 --- a/app/modules/admin_setting/views.py +++ b/app/modules/admin_setting/views.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint +from flask import Flask, render_template, redirect, url_for, request, flash, session ,current_app, jsonify, Blueprint, json from flask_login import login_user, current_user, logout_user, login_required from flask_security import LoginForm, url_for_security from flask_wtf import FlaskForm @@ -22,10 +22,10 @@ def index_affili(): if not current_user.is_authenticated: return index_login() if request.method == "POST": - affiliation_name = request.json.get("affiliation_name") + affiliation_name_id = request.json.get("affiliation_name") repository_url = request.json.get("repository_url") access_token = request.json.get("access_token") - affiliation_id_info = Affiliation_Id().get_affiliation_id_by_affiliation_name(affiliation_name) + affiliation_id_info = Affiliation_Id().get_affiliation_id_by_id(affiliation_name_id) if affiliation_id_info: affiliation_repository_info = Affiliation_Repository().get_aff_repository_by_affiliation_id(affiliation_id_info.id) if affiliation_repository_info: @@ -66,12 +66,42 @@ def index_affili(): if affiliation_repository_info: repository_url = affiliation_repository_info.repository_url access_token = affiliation_repository_info.access_token + affiliation_id_list = Affiliation_Id().get_affiliation_id_list() + affiliation_repository_list = Affiliation_Repository().get_affiliation_repository_list() + aff_repository_dict = {} + for affiliation_repository in affiliation_repository_list: + aff_repository_dict[affiliation_repository.affiliation_id] = {"repository_url":affiliation_repository.repository_url, "access_token":affiliation_repository.access_token} form = FlaskForm(request.form) return render_template("admin_setting/affi_index.html", form = form, + affiliation_id_list = affiliation_id_list, + aff_repository_dict = json.dumps(aff_repository_dict), affiliation_name = affiliation_name, repository_url = repository_url, access_token = access_token) else: form = FlaskForm(request.form) return render_template("admin_setting/permission_required.html", form = form) + +@blueprint.route("/add", methods=['GET', 'POST']) +def add_affili(): + if not current_user.is_authenticated: + return index_login() + if request.method == "POST": + affiliation_name = request.json.get("affiliation_name") + affiliation_idp_url = request.json.get("affiliation_idp_url") + affiliation_id_info = Affiliation_Id().get_affiliation_id_by_idp_url(affiliation_idp_url) + try: + if not affiliation_id_info: + Affiliation_Id().create_affiliation_id(affiliation_idp_url, affiliation_name) + return jsonify(success=True),200 + except Exception as e: + return current_app.logger.error( + 'ERROR affliation settings: {}'.format(e)) + else: + if current_user.role == "管理者": + form = FlaskForm(request.form) + return render_template("admin_setting/add_affili.html", form = form) + else: + form = FlaskForm(request.form) + return render_template("admin_setting/permission_required.html", form = form) \ No newline at end of file diff --git a/app/modules/api.py b/app/modules/api.py index 5fa6c78..db52e7c 100644 --- a/app/modules/api.py +++ b/app/modules/api.py @@ -51,6 +51,15 @@ def get_aff_repository_by_affiliation_id(self, affiliation_id): with db.session.no_autoflush: query = _Affiliation_Repository.query.filter_by(affiliation_id=affiliation_id) return query.one_or_none() + + def get_affiliation_repository_list(self): + """Get affiliation_repository list info. + + :return: + """ + with db.session.no_autoflush: + query = _Affiliation_Repository.query.filter_by().order_by(asc(_Affiliation_Repository.id)) + return query.all() class User(object): @@ -153,9 +162,9 @@ def get_affiliation_id_by_id(self, affiliation_id): query = _Affiliation_Id.query.filter_by(id = affiliation_id) return query.one_or_none() - def get_affiliation_id_by_idp_url(self, idp_url): + def get_affiliation_id_by_idp_url(self, affiliation_idp_url): # with db.session.no_autoflush(): - query = _Affiliation_Id.query.filter_by(affiliation_idp_url = idp_url) + query = _Affiliation_Id.query.filter_by(affiliation_idp_url = affiliation_idp_url) return query.one_or_none() def get_affiliation_id_by_affiliation_name(self, affiliation_name): @@ -163,3 +172,12 @@ def get_affiliation_id_by_affiliation_name(self, affiliation_name): query = _Affiliation_Id.query.filter_by(affiliation_name = affiliation_name) return query.one_or_none() + def get_affiliation_id_list(self): + """Get affiliation_name list info. + + :return: + """ + with db.session.no_autoflush: + query = _Affiliation_Id.query.filter_by().order_by(asc(_Affiliation_Id.id)) + return query.all() + diff --git a/app/modules/item_register/templates/item_register/_macros.html b/app/modules/item_register/templates/item_register/_macros.html index 78024b6..ad059ee 100644 --- a/app/modules/item_register/templates/item_register/_macros.html +++ b/app/modules/item_register/templates/item_register/_macros.html @@ -1,4 +1,7 @@ {% macro tabs_selector(tab_value='top') %} +{%- if current_user.role == "管理者" %} +
  • {{ ('登録先追加') }}
  • +{%- endif %} {%- if current_user.role == "管理者" or current_user.role == "図書館員" %}
  • {{ ('登録先設定') }}
  • {%- endif %} diff --git a/app/static/css/admin.css b/app/static/css/admin.css index 4885e26..a944b80 100644 --- a/app/static/css/admin.css +++ b/app/static/css/admin.css @@ -942,4 +942,22 @@ } .ql-container.ql-snow { border: 1px solid #ccc; - } \ No newline at end of file + } + .alert-success { + border-color: #008d4c +} +.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header { + color: #fff!important +} +.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body { + background-color: #00a65a!important; +} +.alert .close { + color: #000; + opacity: .2; + filter: alpha(opacity=20) +} +.alert .close:hover { + opacity: .5; + filter: alpha(opacity=50) +} \ No newline at end of file diff --git a/postgresql/overlay.sql b/postgresql/overlay.sql index 81fe5d2..ee663a5 100644 --- a/postgresql/overlay.sql +++ b/postgresql/overlay.sql @@ -31,6 +31,10 @@ create sequence public.affiliation_id_seq alter sequence public.affiliation_id_seq owned by public.affiliation_id.id; +-- 「default」レコードの追加 +insert into affiliation_id(created,updated,id,affiliation_idp_url,affiliation_name) +values(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1,'-','default'); + -- 新テーブルの作成 (user) create table public.user ( From b7a8a12758f79e6755ba759ab6d7161b3f9f1fa8 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Wed, 21 Feb 2024 11:52:08 +0900 Subject: [PATCH 30/84] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin_setting/templates/admin_setting/add_affili.html | 2 +- .../admin_setting/templates/admin_setting/affi_index.html | 2 +- .../templates/admin_setting/permission_required.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/modules/admin_setting/templates/admin_setting/add_affili.html b/app/modules/admin_setting/templates/admin_setting/add_affili.html index 5bc5c78..47403ef 100644 --- a/app/modules/admin_setting/templates/admin_setting/add_affili.html +++ b/app/modules/admin_setting/templates/admin_setting/add_affili.html @@ -11,7 +11,7 @@
    -

    overlay

    +

    Overlay

    diff --git a/app/modules/admin_setting/templates/admin_setting/affi_index.html b/app/modules/admin_setting/templates/admin_setting/affi_index.html index 90a9b50..d39098a 100644 --- a/app/modules/admin_setting/templates/admin_setting/affi_index.html +++ b/app/modules/admin_setting/templates/admin_setting/affi_index.html @@ -11,7 +11,7 @@
    -

    overlay

    +

    Overlay

    diff --git a/app/modules/admin_setting/templates/admin_setting/permission_required.html b/app/modules/admin_setting/templates/admin_setting/permission_required.html index 76ee3dd..e4bb73b 100644 --- a/app/modules/admin_setting/templates/admin_setting/permission_required.html +++ b/app/modules/admin_setting/templates/admin_setting/permission_required.html @@ -11,7 +11,7 @@
    -

    overlay

    +

    Overlay

    From c9e8b79d78894b02ba4943b795fd2ef471578110 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Wed, 21 Feb 2024 15:42:42 +0900 Subject: [PATCH 31/84] =?UTF-8?q?views.py=20affiliation=5Frepository?= =?UTF-8?q?=E3=81=AB=E6=83=85=E5=A0=B1=E3=81=8C=E3=81=82=E3=82=8B=E3=81=8B?= =?UTF-8?q?=E6=A9=9F=E9=96=A2=E5=90=8D=E3=81=A7=E6=A4=9C=E7=B4=A2=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/admin_setting/static/js/admin_settings.js | 6 ------ .../admin_setting/templates/admin_setting/affi_index.html | 2 +- app/modules/admin_setting/views.py | 7 +++++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/modules/admin_setting/static/js/admin_settings.js b/app/modules/admin_setting/static/js/admin_settings.js index 7f2f0a7..e457fb4 100644 --- a/app/modules/admin_setting/static/js/admin_settings.js +++ b/app/modules/admin_setting/static/js/admin_settings.js @@ -20,12 +20,6 @@ async function componentDidMount() { } } -window.addEventListener("load",(event) =>{ -const role= document.getElementById("user_role").value; -if(role=="管理者"){ - document.getElementById("affiliation_name").removeAttribute("readonly"); -} -}); function handleSelect(){ closeError(); diff --git a/app/modules/admin_setting/templates/admin_setting/affi_index.html b/app/modules/admin_setting/templates/admin_setting/affi_index.html index d39098a..09c5ea3 100644 --- a/app/modules/admin_setting/templates/admin_setting/affi_index.html +++ b/app/modules/admin_setting/templates/admin_setting/affi_index.html @@ -37,7 +37,7 @@
    {%- if current_user.role == "図書館員" -%} + value={{affiliation_name}} readonly> {%- endif -%} {%- if current_user.role == "管理者" -%} + {{current_user.user_id}} + + ログアウト +
    +
    + + + + + + {% endblock header %} +
    + {%- block page_body %} + {%- endblock page_body %} +
    + + + + \ No newline at end of file diff --git a/app/db_setting.py b/app/db_setting.py index 34143d5..e2310ed 100644 --- a/app/db_setting.py +++ b/app/db_setting.py @@ -18,8 +18,12 @@ DBUSER=os.environ.get("INVENIO_POSTGRESQL_DBUSER") #invenio # 接続先DBの設定 +<<<<<<< Updated upstream DATABASE = HOST_NAME+"://"+DBUSER+":"+DBPASS+"@"+HOST_NAME+":5432/"+ DBNAME # DATABASE = 'postgresql://invenio:dbpass123@192.168.56.111:25401/invenio??charset=utf8' +======= +DATABASE = 'postgresql://invenio:dbpass123@192.168.56.103:25401/invenio' +>>>>>>> Stashed changes Engine = create_engine( DATABASE, diff --git a/app/modules/common/ext.py b/app/modules/common/ext.py new file mode 100644 index 0000000..3f94399 --- /dev/null +++ b/app/modules/common/ext.py @@ -0,0 +1,10 @@ +from .views import blueprint + +class CommonApp(object): + def __init__(self, app=None): + if app: + self.init_app(app) + + def init_app(self, app): + app.register_blueprint(blueprint) + app.extensions['common'] = self \ No newline at end of file diff --git a/app/modules/common/templates/theme/base.html b/app/modules/common/templates/theme/base.html new file mode 100644 index 0000000..4442328 --- /dev/null +++ b/app/modules/common/templates/theme/base.html @@ -0,0 +1,54 @@ + + + + + + +
    +
    +
    +
    + + + {% block css %} + + + + + {% endblock %} + {% block header %} + + {% endblock header %} +
    + {%- block page_body %} + {%- endblock page_body %} +
    + {% block footer %} + + {% endblock footer %} + + + \ No newline at end of file diff --git a/app/modules/common/templates/theme/footer.html b/app/modules/common/templates/theme/footer.html new file mode 100644 index 0000000..3a23fd0 --- /dev/null +++ b/app/modules/common/templates/theme/footer.html @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/app/modules/common/templates/theme/header.html b/app/modules/common/templates/theme/header.html new file mode 100644 index 0000000..84e9461 --- /dev/null +++ b/app/modules/common/templates/theme/header.html @@ -0,0 +1,23 @@ + + \ No newline at end of file diff --git a/app/modules/common/views.py b/app/modules/common/views.py new file mode 100644 index 0000000..f90825d --- /dev/null +++ b/app/modules/common/views.py @@ -0,0 +1,8 @@ +from flask import Blueprint + +blueprint = Blueprint( + "common", + __name__, + url_prefix="/common", + template_folder="templates", + static_folder="static") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6029f8d --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +# To ensure app dependencies are ported from your virtual environment/host machine into your container, run 'pip freeze > requirements.txt' in the terminal to overwrite this file From 7d0c5f19833cee9462831fabba35514e466c25f4 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Thu, 22 Feb 2024 10:59:21 +0900 Subject: [PATCH 33/84] fixed conflict --- app/app.py | 4 ---- app/db_setting.py | 4 ---- 2 files changed, 8 deletions(-) diff --git a/app/app.py b/app/app.py index 88869dd..4f2c860 100644 --- a/app/app.py +++ b/app/app.py @@ -19,7 +19,6 @@ app = Flask(__name__) app.config['SECRET_KEY'] = "secret" app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False -<<<<<<< Updated upstream HOST_NAME=os.environ.get("INVENIO_POSTGRESQL_HOST") #postgresql DBNAME=os.environ.get("INVENIO_POSTGRESQL_DBNAME") #invenio @@ -28,9 +27,6 @@ # 接続先DBの設定 app.config['SQLALCHEMY_DATABASE_URI'] = HOST_NAME+"://"+DBUSER+":"+DBPASS+"@"+HOST_NAME+":5432/"+ DBNAME -======= -app.config['SQLALCHEMY_DATABASE_URI']='postgresql://invenio:dbpass123@192.168.56.103:25401/invenio' ->>>>>>> Stashed changes app.logger.setLevel(logging.INFO) app.logger.addHandler(logging.StreamHandler(sys.stdout)) app.logger.setLevel(logging.DEBUG) diff --git a/app/db_setting.py b/app/db_setting.py index e2310ed..34143d5 100644 --- a/app/db_setting.py +++ b/app/db_setting.py @@ -18,12 +18,8 @@ DBUSER=os.environ.get("INVENIO_POSTGRESQL_DBUSER") #invenio # 接続先DBの設定 -<<<<<<< Updated upstream DATABASE = HOST_NAME+"://"+DBUSER+":"+DBPASS+"@"+HOST_NAME+":5432/"+ DBNAME # DATABASE = 'postgresql://invenio:dbpass123@192.168.56.111:25401/invenio??charset=utf8' -======= -DATABASE = 'postgresql://invenio:dbpass123@192.168.56.103:25401/invenio' ->>>>>>> Stashed changes Engine = create_engine( DATABASE, From f1f2b7b6c9daa23e28e708bbcce4d9c84e112933 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Thu, 22 Feb 2024 11:54:08 +0900 Subject: [PATCH 34/84] =?UTF-8?q?=E9=96=93=E9=81=95=E3=81=88=E3=81=A6?= =?UTF-8?q?=E3=83=97=E3=83=83=E3=82=B7=E3=83=A5=E3=81=97=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=9F=E3=82=82=E3=81=AE=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 27 ------ .vscode/launch.json | 16 ---- app/base.html | 92 ------------------- app/modules/common/ext.py | 10 -- app/modules/common/templates/theme/base.html | 54 ----------- .../common/templates/theme/footer.html | 21 ----- .../common/templates/theme/header.html | 23 ----- app/modules/common/views.py | 8 -- requirements.txt | 1 - 9 files changed, 252 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .vscode/launch.json delete mode 100644 app/base.html delete mode 100644 app/modules/common/ext.py delete mode 100644 app/modules/common/templates/theme/base.html delete mode 100644 app/modules/common/templates/theme/footer.html delete mode 100644 app/modules/common/templates/theme/header.html delete mode 100644 app/modules/common/views.py delete mode 100644 requirements.txt diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 0b1e1e7..0000000 --- a/.dockerignore +++ /dev/null @@ -1,27 +0,0 @@ -**/__pycache__ -**/.venv -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/bin -**/charts -**/docker-compose* -**/compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -LICENSE -README.md diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index be06451..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - // IntelliSense を使用して利用可能な属性を学べます。 - // 既存の属性の説明をホバーして表示します。 - // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python デバッガー: 現在のファイル", - "type": "debugpy", - "request": "launch", - "program": "${file}", - "redirectOutput": true, - "console": "integratedTerminal" - } - ] -} \ No newline at end of file diff --git a/app/base.html b/app/base.html deleted file mode 100644 index 1a994bd..0000000 --- a/app/base.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - -
    -
    -
    -
    - - - {% block css %} - - - - - {% endblock %} - {% block header %} - - {% endblock header %} -
    - {%- block page_body %} - {%- endblock page_body %} -
    - - - - \ No newline at end of file diff --git a/app/modules/common/ext.py b/app/modules/common/ext.py deleted file mode 100644 index 3f94399..0000000 --- a/app/modules/common/ext.py +++ /dev/null @@ -1,10 +0,0 @@ -from .views import blueprint - -class CommonApp(object): - def __init__(self, app=None): - if app: - self.init_app(app) - - def init_app(self, app): - app.register_blueprint(blueprint) - app.extensions['common'] = self \ No newline at end of file diff --git a/app/modules/common/templates/theme/base.html b/app/modules/common/templates/theme/base.html deleted file mode 100644 index 4442328..0000000 --- a/app/modules/common/templates/theme/base.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - -
    -
    -
    -
    - - - {% block css %} - - - - - {% endblock %} - {% block header %} - - {% endblock header %} -
    - {%- block page_body %} - {%- endblock page_body %} -
    - {% block footer %} - - {% endblock footer %} - - - \ No newline at end of file diff --git a/app/modules/common/templates/theme/footer.html b/app/modules/common/templates/theme/footer.html deleted file mode 100644 index 3a23fd0..0000000 --- a/app/modules/common/templates/theme/footer.html +++ /dev/null @@ -1,21 +0,0 @@ - - \ No newline at end of file diff --git a/app/modules/common/templates/theme/header.html b/app/modules/common/templates/theme/header.html deleted file mode 100644 index 84e9461..0000000 --- a/app/modules/common/templates/theme/header.html +++ /dev/null @@ -1,23 +0,0 @@ - - \ No newline at end of file diff --git a/app/modules/common/views.py b/app/modules/common/views.py deleted file mode 100644 index f90825d..0000000 --- a/app/modules/common/views.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import Blueprint - -blueprint = Blueprint( - "common", - __name__, - url_prefix="/common", - template_folder="templates", - static_folder="static") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 6029f8d..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -# To ensure app dependencies are ported from your virtual environment/host machine into your container, run 'pip freeze > requirements.txt' in the terminal to overwrite this file From 8366039ff4f376b869160c49f8d6d61972e16cc6 Mon Sep 17 00:00:00 2001 From: "kanon.yoneji" Date: Thu, 22 Feb 2024 11:56:00 +0900 Subject: [PATCH 35/84] =?UTF-8?q?=E9=96=93=E9=81=95=E3=81=88=E3=81=A6?= =?UTF-8?q?=E3=83=97=E3=83=83=E3=82=B7=E3=83=A5=E3=81=97=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=9F=E3=82=82=E3=81=AE=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/app.py b/app/app.py index 4f2c860..8139434 100644 --- a/app/app.py +++ b/app/app.py @@ -13,7 +13,6 @@ from modules.login.ext import LoginApp from modules.admin_setting.ext import AdminSettingApp from modules.item_register.ext import ItemRegisterApp -from modules.common.ext import CommonApp from modules.api import User app = Flask(__name__) @@ -41,8 +40,6 @@ adminapp.init_app(app) itemregister = ItemRegisterApp() itemregister.init_app(app) -commonapp = CommonApp() -commonapp.init_app(app) @login_manager.user_loader def load_user(user_id): From 65e7f108e72ba47f13788577d3c76489a0a0970e Mon Sep 17 00:00:00 2001 From: Indie-Kimura Date: Thu, 22 Feb 2024 13:44:45 +0900 Subject: [PATCH 36/84] =?UTF-8?q?=E3=83=95=E3=83=AD=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=20=E3=83=BB=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E6=83=85=E5=A0=B1=E8=87=AA=E5=8B=95=E5=85=A5?= =?UTF-8?q?=E5=8A=9B=E3=81=AE=E6=A9=9F=E8=83=BD=E8=BF=BD=E5=8A=A0=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=EF=BC=89=20=E3=80=80=E3=80=80=E7=8F=BE?= =?UTF-8?q?=E5=9C=A8=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92HTML?= =?UTF-8?q?=E3=81=AB=E5=9F=8B=E3=82=81=E8=BE=BC=E3=82=93=E3=81=A0=E5=BE=8C?= =?UTF-8?q?=E3=80=81=E3=83=91=E3=83=8D=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=81=A8=E5=8F=8D=E6=98=A0=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=AA=E3=81=84=E3=80=82=20=E3=83=BB=E6=97=A5?= =?UTF-8?q?=E4=BB=98=E3=81=AE=E5=85=A5=E5=8A=9B=E3=81=AE=E9=9A=9B=E3=80=81?= =?UTF-8?q?input=E3=81=AEdate=E5=9E=8B=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20?= =?UTF-8?q?=E3=83=BB=E9=80=81=E4=BF=A1=E5=BE=8C=E3=80=81=E3=83=AC=E3=82=B9?= =?UTF-8?q?=E3=83=9D=E3=83=B3=E3=82=B9=E3=81=8C=E8=BF=94=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=81=8F=E3=82=8B=E3=81=BE=E3=81=A7=E9=80=81=E4=BF=A1=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=81=8Cdisable=E3=81=AB=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit バックエンド リクエスト送信時の処理の修正   抜けていたヘッダー情報の追加   aff_repositoryが設定されていない場合の分岐の追加   一時ファイルをリクエスト後に削除されるように修正    --- app/modules/api.py | 3 +- app/modules/item_register/views.py | 47 +-- app/static/css/theme.css | 2 +- app/static/js/app.js | 545 +++++++++++------------------ app/static/json/jsonschema.json | 86 ++--- app/uwsgi.py | 4 - 6 files changed, 276 insertions(+), 411 deletions(-) delete mode 100644 app/uwsgi.py diff --git a/app/modules/api.py b/app/modules/api.py index 253b4f5..7fc65d7 100644 --- a/app/modules/api.py +++ b/app/modules/api.py @@ -52,8 +52,7 @@ def get_aff_repository_by_affiliation_id(self, affiliation_id): query = _Affiliation_Repository.query.filter_by(affiliation_id=affiliation_id) return query.one_or_none() - - def get_affiliation_id_by_affiliation_name(self, affiliation_name): + def get_aff_repository_by_affiliation_name(self, affiliation_name): with db.session.no_autoflush: query = _Affiliation_Id.query.filter_by(affiliation_name = affiliation_name) return query.one_or_none() diff --git a/app/modules/item_register/views.py b/app/modules/item_register/views.py index 70588e9..5b3da69 100644 --- a/app/modules/item_register/views.py +++ b/app/modules/item_register/views.py @@ -26,7 +26,6 @@ def index_item(): if current_user.is_anonymous: return redirect(url_for('login.index_login')) - current_app.logger.info(current_user.affiliation_id) form = FlaskForm(request.form) return render_template("item_register/item_index.html", form = form) @@ -40,56 +39,41 @@ def register(): post_dataの例: {"item_metadata;{}, "contentfiles": [{"name":"file.png", "base64":"aaaaa"}, "thumbneil":[{"name":"thumb.png", "base64":"bbbb"}] ]} """ - current_app.logger.info("はじまり") - # current_app.logger.info(request) post_data = request.get_json() - current_app.logger.info("jsonのowari") tmp_zip_name = str(uuid.uuid4())+".zip" - # current_app.logger.info(post_data) - - # メモリー内にzipファイルを作る処理 - current_app.logger.info("mem_zip") - # zipファイル確認のため"test.zip"だが本来はmem_zipバッファ内でzip持ってるとファイル名を決められないのでやめます。 - # ex: with zipfile.ZipFile(mem_zip, mode="w") as zipf + + # app/tmpディレクトリがないなら生成 + if not(os.path.exists(os.path.join('./', 'tmp'))): + os.mkdir("./tmp") with zipfile.ZipFile("tmp/"+tmp_zip_name, mode="w") as zipf: - current_app.logger.info("zipf") # xml書き出し - current_app.logger.info("xmlの始まり") xml_string = dicttoxmlforsword("jpcoar2.0", post_data.get("item_metadata")) zipf.writestr("data/metadata.xml", xml_string) - current_app.logger.info("xml終わり") # コンテンツファイル書き込み - current_app.logger.info("コンテンツファイル始まり") for file in post_data.get("contentfiles"): binary_data = base64.b64decode(file.get("base64", "")) zipf.writestr("data/contentfiles/"+file.get("name",""), binary_data) - current_app.logger.info("コンテンツファイル終わり") # サムネイル書き込み - current_app.logger.info("サムネイル始まり") for file in post_data.get("thumbnail"): binary_data = base64.b64decode(file.get("base64", "")) zipf.writestr("data/thumbnail/"+file.get("name",""), binary_data) - current_app.logger.info("サムネイル終わり") # current_userよりaffiliation_idをとってaffiliaiton_repositoryテーブルからリポジトリURLをとる処理 current_affiliation_id = current_user.affiliation_id aff_repository = Affiliation_Repository().get_aff_repository_by_affiliation_id(current_affiliation_id) # 設定されている場合 - if aff_repository: + if aff_repository and not(aff_repository.repository_url=="" or aff_repository.access_token==""): repository_url=aff_repository.repository_url access_token=aff_repository.access_token # 設定されていない場合デフォルトURLをとる。いまはしらない。 else: - aff_repository = Affiliation_Repository().get_affiliation_id_by_affiliation_name("default") - # 現在はまだデフォルトが何も決まっていないのでモックする。 - repository_url="https://repository.repo.nii.ac.jp" - access_token="accessToken" - # repository_url=aff_repository.repository_url - # access_token=aff_repository.access_token + aff_repository = Affiliation_Repository().get_aff_repository_by_affiliation_name("default") + repository_url=aff_repository.repository_url + access_token=aff_repository.access_token sword_api_url = repository_url+"/sword/service-document" @@ -101,13 +85,15 @@ def register(): # ヘッダーを定義 headers = { 'Authorization': 'Bearer '+access_token, - 'Content-Disposition': 'attachment; filename='+tmp_zip_name + 'Content-Disposition': 'attachment; filename='+tmp_zip_name, + "Packaging":"http://purl.org/net/sword/3.0/package/SimpleZip", } # 送信するファイル files = {'file': open('tmp/'+tmp_zip_name, 'rb')} # ファイルのパスを指定してファイルを開く - # # POSTリクエストを送信 + # POSTリクエストを送信 + # 該当リポジトリのswordapiにzipを投げる処理 try: # current_app.logger.info(sword_api_url) # current_app.logger.info(data) @@ -116,13 +102,14 @@ def register(): response = requests.post(url=sword_api_url, data=data, headers=headers, files=files) except requests.exceptions.RequestException as ex: current_app.logger.info(ex) - response = 400 + return jsonify({"error":str(ex)}), 504 + finally: + current_app.logger.info("一時zipファイル削除:"+tmp_zip_name) + os.remove('tmp/'+tmp_zip_name) # レスポンスを処理 - # 該当リポジトリのswordapiにzipとユーザー情報?を投げる処理 # ここまでエラーなしだった場合、successfullyを返す。 # エラーが起きたら、failedを返す。 - current_app.logger.info(response) - return jsonify(response) + return jsonify(response.json()) \ No newline at end of file diff --git a/app/static/css/theme.css b/app/static/css/theme.css index 029668d..e5d8b63 100644 --- a/app/static/css/theme.css +++ b/app/static/css/theme.css @@ -1 +1 @@ -.break-word,.table-bordered td,.table-bordered th,dl dd{word-break:break-all}.break-word,dl dd{word-wrap:break-word}.p-left-5,dl dd{padding-left:5px}.btn-menu{color:#333;background-color:#fff;border-color:#ccc}.btn-menu:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-menu:active,.btn-menu:focus,.btn-menu:visited{color:#fff;background-color:#337ab7;border-color:#2e6da4}.row{margin-top:5px}.row>hr{margin:5px 15px}.pagination{margin:-10px 0}.badge{font-size:10px}input[type=date]{width:180px}span.indent{margin-left:10px;margin-right:10px}.panel_bread .breadcrumb{margin-bottom:5px}.close-container{height:21px}.flow-root{display:flow-root}.p-left-10{padding-left:10px}.p-top-20{padding-top:20px}.m-top-5,.row-line-space{margin-top:5px}.m-top-20{margin-top:20px}.del-col-space{margin-left:-30px}.max-width-64{max-width:64px}table .license{width:120px}div .pre-scrollable{overflow-x:hidden}td .list-group{margin-bottom:0}.list-group .list-group-item .radio{margin-top:0;margin-bottom:0}.fileupload-buttonbar .btn,.fileupload-buttonbar .toggle{margin-bottom:5px}.fileinput-button{position:relative;overflow:hidden;display:inline-block}.fileinput-button input{position:absolute;top:0;right:0;margin:0;opacity:0;-ms-filter:'alpha(opacity=0)';font-size:200px!important;direction:ltr;cursor:pointer}@media screen\9{.fileinput-button input{filter:alpha(opacity=0);font-size:100%;height:100%}}tree-internal .tree .folding.weko-node-leaf{display:none}tree-internal .tree .folding.weko-node-empty:before{content:'\25B7';color:#757575}tree-internal ul .more{-webkit-text-fill-color:#337ab7;text-decoration:underline}tree-internal ul .value-container{font-size:15px}tree-internal ul .tree{margin-left:0;padding-left:1em;text-indent:0;padding-inline-start:1em}tree-internal .rootless{margin:-1em;text-indent:0}.hide-on-collapsed{display:block}.panel-toggle.collapsed .hide-on-collapsed,.show-on-collapsed{display:none}.panel-toggle.collapsed .show-on-collapsed{display:block}.rss_icon{background-color:orange;padding:5px;padding-top:3px!important;padding-bottom:3px!important;text-decoration:none;border-radius:25%;color:#fff}@media print{@page{size:auto;margin:0}body{padding:72px}a,a:link:after,a:visited{text-decoration:underline}a[href]:after,abbr[title]:after{content:none!important}}.node-menu .node-menu-content,tree-internal .tree{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.node-menu{position:relative;width:150px}.node-menu .node-menu-content{width:100%;padding:5px;position:absolute;border:1px solid #bdbdbd;border-radius:5%;box-shadow:0 0 5px #bdbdbd;background-color:#eee;color:#212121;z-index:999}.node-menu .node-menu-content li.node-menu-item{list-style:none;padding:3px}.node-menu .node-menu-content .node-menu-item:hover{border-radius:5%;opacity:unset;cursor:pointer;background-color:#bdbdbd;transition:background-color .2s ease-out}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon{display:inline-block;width:16px}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.new-tag:before{content:'\25CF'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.new-folder:before{content:'\25B6'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.rename:before{content:'\270E'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.remove:before{content:'\2716'}.node-menu .node-menu-content .node-menu-item .node-menu-item-value{margin-left:5px}tree-internal ul{padding:3px 0 3px 25px}tree-internal li{padding:0;margin:0;list-style:none}tree-internal .over-drop-target-sibling::before{content:"Drop here..."!important;color:#fff!important;display:block;border:4px solid #757575;transition:padding .2s ease-out;padding:5px;border-radius:5px}tree-internal .over-drop-target-sibling{border:0 solid transparent;transition:padding .2s ease-out;padding:0;border-radius:5%}tree-internal .over-drop-target{border:4px solid #757575;transition:padding .2s ease-out;padding:5px;border-radius:5%}tree-internal .tree{box-sizing:border-box}tree-internal .tree li{list-style:none;cursor:default}tree-internal .tree .folding.node-collapsed,tree-internal .tree .folding.node-expanded{cursor:pointer}tree-internal .tree li div{display:inline-block;box-sizing:border-box}tree-internal .tree .node-value{display:inline-block;color:#212121}tree-internal .tree .node-value:after{display:block;width:0;height:2px;background-color:#212121;content:'';transition:width .3s}tree-internal .tree .node-value:hover:after{width:100%}tree-internal .tree .node-left-menu{display:inline-block;height:100%;width:auto}tree-internal .tree .node-left-menu span:before{content:'\2026';color:#757575}tree-internal .tree .node-selected:after{width:100%}tree-internal .tree .folding{width:25px;display:inline-block;line-height:1px;padding:0 5px;font-weight:700}tree-internal .tree .folding.node-collapsed:before{content:'\25B6';color:#757575}tree-internal .tree .folding.node-expanded:before{content:'\25BC';color:#757575}tree-internal .tree .folding.node-empty{color:#212121;text-align:center;font-size:.89em}tree-internal .tree .folding.node-empty:before{content:'\25B6';color:#757575}tree-internal .tree .folding.node-leaf{color:#212121;text-align:center;font-size:.89em}tree-internal .tree .folding.node-leaf:before{content:'\25CF';color:#757575}tree-internal ul.rootless{padding:0}tree-internal div.rootless{display:none!important}tree-internal .loading-children:after{content:' loading ...';color:#6a1b9a;font-style:italic;font-size:.9em;-webkit-animation-name:loading-children;animation-name:loading-children;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes loading-children{0%{color:#f3e5f5}12.5%{color:#e1bee7}25%{color:#ce93d8}37.5%{color:#ba68c8}50%{color:#ab47bc}62.5%{color:#9c27b0}75%{color:#8e24aa}87.5%{color:#7b1fa2}100%{color:#6a1b9a}}@keyframes loading-children{0%{color:#f3e5f5}12.5%{color:#e1bee7}25%{color:#ce93d8}37.5%{color:#ba68c8}50%{color:#ab47bc}62.5%{color:#9c27b0}75%{color:#8e24aa}87.5%{color:#7b1fa2}100%{color:#6a1b9a}} \ No newline at end of file +.break-word,.table-bordered td,.table-bordered th,dl dd{word-break:break-all}.break-word,dl dd{word-wrap:break-word}.p-left-5,dl dd{padding-left:5px}.btn-menu{color:#333;background-color:#fff;border-color:#ccc}.btn-menu:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-menu:active,.btn-menu:focus,.btn-menu:visited{color:#fff;background-color:#337ab7;border-color:#2e6da4}.row{margin-top:5px}.row>hr{margin:5px 15px}.pagination{margin:-10px 0}.badge{font-size:10px}span.indent{margin-left:10px;margin-right:10px}.panel_bread .breadcrumb{margin-bottom:5px}.close-container{height:21px}.flow-root{display:flow-root}.p-left-10{padding-left:10px}.p-top-20{padding-top:20px}.m-top-5,.row-line-space{margin-top:5px}.m-top-20{margin-top:20px}.del-col-space{margin-left:-30px}.max-width-64{max-width:64px}table .license{width:120px}div .pre-scrollable{overflow-x:hidden}td .list-group{margin-bottom:0}.list-group .list-group-item .radio{margin-top:0;margin-bottom:0}.fileupload-buttonbar .btn,.fileupload-buttonbar .toggle{margin-bottom:5px}.fileinput-button{position:relative;overflow:hidden;display:inline-block}.fileinput-button input{position:absolute;top:0;right:0;margin:0;opacity:0;-ms-filter:'alpha(opacity=0)';font-size:200px!important;direction:ltr;cursor:pointer}@media screen\9{.fileinput-button input{filter:alpha(opacity=0);font-size:100%;height:100%}}tree-internal .tree .folding.weko-node-leaf{display:none}tree-internal .tree .folding.weko-node-empty:before{content:'\25B7';color:#757575}tree-internal ul .more{-webkit-text-fill-color:#337ab7;text-decoration:underline}tree-internal ul .value-container{font-size:15px}tree-internal ul .tree{margin-left:0;padding-left:1em;text-indent:0;padding-inline-start:1em}tree-internal .rootless{margin:-1em;text-indent:0}.hide-on-collapsed{display:block}.panel-toggle.collapsed .hide-on-collapsed,.show-on-collapsed{display:none}.panel-toggle.collapsed .show-on-collapsed{display:block}.rss_icon{background-color:orange;padding:5px;padding-top:3px!important;padding-bottom:3px!important;text-decoration:none;border-radius:25%;color:#fff}@media print{@page{size:auto;margin:0}body{padding:72px}a,a:link:after,a:visited{text-decoration:underline}a[href]:after,abbr[title]:after{content:none!important}}.node-menu .node-menu-content,tree-internal .tree{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.node-menu{position:relative;width:150px}.node-menu .node-menu-content{width:100%;padding:5px;position:absolute;border:1px solid #bdbdbd;border-radius:5%;box-shadow:0 0 5px #bdbdbd;background-color:#eee;color:#212121;z-index:999}.node-menu .node-menu-content li.node-menu-item{list-style:none;padding:3px}.node-menu .node-menu-content .node-menu-item:hover{border-radius:5%;opacity:unset;cursor:pointer;background-color:#bdbdbd;transition:background-color .2s ease-out}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon{display:inline-block;width:16px}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.new-tag:before{content:'\25CF'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.new-folder:before{content:'\25B6'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.rename:before{content:'\270E'}.node-menu .node-menu-content .node-menu-item .node-menu-item-icon.remove:before{content:'\2716'}.node-menu .node-menu-content .node-menu-item .node-menu-item-value{margin-left:5px}tree-internal ul{padding:3px 0 3px 25px}tree-internal li{padding:0;margin:0;list-style:none}tree-internal .over-drop-target-sibling::before{content:"Drop here..."!important;color:#fff!important;display:block;border:4px solid #757575;transition:padding .2s ease-out;padding:5px;border-radius:5px}tree-internal .over-drop-target-sibling{border:0 solid transparent;transition:padding .2s ease-out;padding:0;border-radius:5%}tree-internal .over-drop-target{border:4px solid #757575;transition:padding .2s ease-out;padding:5px;border-radius:5%}tree-internal .tree{box-sizing:border-box}tree-internal .tree li{list-style:none;cursor:default}tree-internal .tree .folding.node-collapsed,tree-internal .tree .folding.node-expanded{cursor:pointer}tree-internal .tree li div{display:inline-block;box-sizing:border-box}tree-internal .tree .node-value{display:inline-block;color:#212121}tree-internal .tree .node-value:after{display:block;width:0;height:2px;background-color:#212121;content:'';transition:width .3s}tree-internal .tree .node-value:hover:after{width:100%}tree-internal .tree .node-left-menu{display:inline-block;height:100%;width:auto}tree-internal .tree .node-left-menu span:before{content:'\2026';color:#757575}tree-internal .tree .node-selected:after{width:100%}tree-internal .tree .folding{width:25px;display:inline-block;line-height:1px;padding:0 5px;font-weight:700}tree-internal .tree .folding.node-collapsed:before{content:'\25B6';color:#757575}tree-internal .tree .folding.node-expanded:before{content:'\25BC';color:#757575}tree-internal .tree .folding.node-empty{color:#212121;text-align:center;font-size:.89em}tree-internal .tree .folding.node-empty:before{content:'\25B6';color:#757575}tree-internal .tree .folding.node-leaf{color:#212121;text-align:center;font-size:.89em}tree-internal .tree .folding.node-leaf:before{content:'\25CF';color:#757575}tree-internal ul.rootless{padding:0}tree-internal div.rootless{display:none!important}tree-internal .loading-children:after{content:' loading ...';color:#6a1b9a;font-style:italic;font-size:.9em;-webkit-animation-name:loading-children;animation-name:loading-children;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes loading-children{0%{color:#f3e5f5}12.5%{color:#e1bee7}25%{color:#ce93d8}37.5%{color:#ba68c8}50%{color:#ab47bc}62.5%{color:#9c27b0}75%{color:#8e24aa}87.5%{color:#7b1fa2}100%{color:#6a1b9a}}@keyframes loading-children{0%{color:#f3e5f5}12.5%{color:#e1bee7}25%{color:#ce93d8}37.5%{color:#ba68c8}50%{color:#ab47bc}62.5%{color:#9c27b0}75%{color:#8e24aa}87.5%{color:#7b1fa2}100%{color:#6a1b9a}} \ No newline at end of file diff --git a/app/static/js/app.js b/app/static/js/app.js index e5daedc..aeacd26 100644 --- a/app/static/js/app.js +++ b/app/static/js/app.js @@ -6,17 +6,34 @@ const contentFilesContext = createContext([]); const setContentFilesContext = createContext(null); const thumbnailContext = createContext([]); const setThumbnailContext = createContext(null); +const metadataContext = createContext({}); +const setMetadataContext = createContext(null); +const changeMetadataContext = createContext(null); const FileProvider = ({ children }) => { const [contentfiles, setcontentfiles] = useState([]); const [thumbnail, setthumbnail] = useState([]); + const [metadata, setmetadata] = useState({}) + + function changemetadata(key, value) { + setmetadata((prevState) => ({ + ...prevState, [key]: value + })); + + } return ( - {children} + + + + {children} + + + @@ -28,11 +45,14 @@ const useFilesValue = () => useContext(contentFilesContext); const useFilesSetValue = () => useContext(setContentFilesContext); const useThumbnailValue = () => useContext(thumbnailContext); const useThumbnailSetValue = () => useContext(setThumbnailContext); +const useMetadataValue = () => useContext(metadataContext); +const useMetadataSetValue = () => useContext(setMetadataContext); +const useMetadataChangeValue = () => useContext(changeMetadataContext); function PDFform() { const contentfiles = useFilesValue(); const setcontentfiles = useFilesSetValue(); - const [pdffile, setpdffile] =useState([]); + const [pdffile, setpdffile] = useState([]); const contentfilenames = contentfiles.map(contentfile => contentfile.name); function addfiles(files) { // 一時的なリストをdeepcopyで生成 @@ -40,14 +60,14 @@ function PDFform() { // リストに名前が存在しないなら一時リストにプッシュ if (files.length > 0) { const firstFile = files[0]; - if(check_filesize_over_100MB(firstFile)){ + if (check_filesize_over_100MB(firstFile)) { console.log("ファイルサイズが100MBを超えています。") console.log(firstFile.name) } else if (firstFile.type === "application/pdf") { if (!(contentfilenames.includes(firstFile.name))) { tmpfiles.push(firstFile) } - if (pdffile.length===0 || pdffile[0].name!==firstFile.name){ + if (pdffile.length === 0 || pdffile[0].name !== firstFile.name) { setpdffile([firstFile]) } } else { @@ -58,7 +78,7 @@ function PDFform() { } setcontentfiles(tmpfiles); } - + function deletefile(filename) { setpdffile([]); } @@ -78,16 +98,16 @@ function PDFform() { PDFからメタデータの自動入力

    - {(pdffile.length !== 0) && } + {(pdffile.length !== 0) && } ) } -function Datalistform({ order, value, item }) { +function Datalistform({ parent_id, order, value, item }) { return ( - + ) } @@ -144,7 +164,7 @@ function DropFileArea({ addfiles }) { console.log("no files"); isfiles = false; } - if (isfiles == true) { + if (isfiles === true) { addfiles(event.dataTransfer.files) } } @@ -172,29 +192,70 @@ function AddFileButton({ addfiles, acceptfiletype }) { ) } -function FileUploadForm({ }) { +function FileUploadForm({ addarray, deletearray, schema }) { const contentfiles = useFilesValue(); const setcontentfiles = useFilesSetValue(); + let metadata = useMetadataValue(); + const setmetadata = useMetadataSetValue(); const contentfilenames = contentfiles.map(contentfile => contentfile.name); function addfiles(files) { + console.log(schema.file_info) + const fileproperty = schema.file_info // 一時的なリストをdeepcopyで生成 let tmpfiles = contentfiles.map(contentfile => contentfile) + let tmpmetadata = structuredClone(metadata) + deletearray() // リストに名前が存在しないなら一時リストにプッシュ Array.from(files).forEach(file => { - if(check_filesize_over_100MB(file)){ + if (check_filesize_over_100MB(file)) { console.log("ファイルサイズが100MBを超えています。") console.log(file.name) - }else if (!(contentfilenames.includes(file.name))) { + } else if (!(contentfilenames.includes(file.name))) { contentfilenames.push(file.name) tmpfiles.push(file) } }) + // ファイルを埋め込んだ時ファイルの名前、サイズ、mimetypeをtmpmetadataに埋め込む + for (let i = 0; i < tmpfiles.length; i++) { + let file = tmpfiles[i]; + tmpmetadata[fileproperty.file_name.replace("[]", "[" + String(i) + "]")] = file.name + tmpmetadata[fileproperty.file_url.replace("[]", "[" + String(i) + "]")] = "data/contentfiles/" + file.name + tmpmetadata[fileproperty.file_label.replace("[]", "[" + String(i) + "]")] = file.name + tmpmetadata[fileproperty.file_format.replace("[]", "[" + String(i) + "]")] = file.type + tmpmetadata[fileproperty.file_size.replace("[]", "[" + String(i) + "]")] = String(Math.round(file.size / 1024)) + " KB" + } // 一時的なリストからレンダー setcontentfiles(tmpfiles); + // tmpmetadataをsetすること + setmetadata(tmpmetadata) + console.log(tmpmetadata) } + function deletefile(filename) { + const fileproperty = schema.file_info let tmpfiles = contentfiles.map(contentfile => contentfile).filter(file => file.name !== filename) + let tmpmetadata = structuredClone(metadata) + deletearray() + for (let i = 0; i < tmpfiles.length; i++) { + let file = tmpfiles[i]; + tmpmetadata[fileproperty.file_name.replace("[]", "[" + String(i) + "]")] = file.name + tmpmetadata[fileproperty.file_url.replace("[]", "[" + String(i) + "]")] = "data/contentfiles/" + file.name + tmpmetadata[fileproperty.file_label.replace("[]", "[" + String(i) + "]")] = file.name + tmpmetadata[fileproperty.file_format.replace("[]", "[" + String(i) + "]")] = file.type + tmpmetadata[fileproperty.file_size.replace("[]", "[" + String(i) + "]")] = String(Math.round(file.size / 1024)) + " KB" + } + console.log(tmpmetadata) + for (let i = tmpfiles.length; i < contentfiles.length; i++) { + delete tmpmetadata[fileproperty.file_name.replace("[]", "[" + String(i) + "]")] + delete tmpmetadata[fileproperty.file_url.replace("[]", "[" + String(i) + "]")] + delete tmpmetadata[fileproperty.file_label.replace("[]", "[" + String(i) + "]")] + delete tmpmetadata[fileproperty.file_format.replace("[]", "[" + String(i) + "]")] + delete tmpmetadata[fileproperty.file_size.replace("[]", "[" + String(i) + "]")] + } + // 一時的なリストからレンダー + console.log(tmpmetadata) setcontentfiles(tmpfiles); + setmetadata(tmpmetadata) } return ( @@ -212,6 +273,7 @@ function FileUploadForm({ }) { ) } +//jpcoar2.0では使わない function ThumbnailUploadForm() { const thumbnail = useThumbnailValue(); const setthumbnail = useThumbnailSetValue(); @@ -220,9 +282,9 @@ function ThumbnailUploadForm() { function addfiles(files) { if (files.length > 0) { const firstFile = files[0]; - if(check_filesize_over_100MB(firstFile)){ + if (check_filesize_over_100MB(firstFile)) { console.log("ファイルサイズが100MBを超えています。") - }else if(!(firstFile.type.startsWith('image/'))) { + } else if (!(firstFile.type.startsWith('image/'))) { console.log("画像ファイルではありません。") } else { setthumbnail([firstFile]); @@ -251,10 +313,11 @@ function ThumbnailUploadForm() { ) } -function Metadatatitle({ title, metadatakey }) { +function Metadatatitle({ item }) { let required = false; + let title = ("title_i18n" in item) && ("ja" in item.title_i18n) ? item.title_i18n.ja : item.title let classvalue; - if (schema.required.includes(metadatakey)) { + if (schema.required.includes(item.key)) { required = true; } if (required) { @@ -269,57 +332,77 @@ function Metadatatitle({ title, metadatakey }) { ) } -function Textform({ metadatatitle, value, order, item }) { +function Textform({ item, parent_id }) { + const metadata = useMetadataValue(); + const changemetadata = useMetadataChangeValue(); + const form_id = parent_id + "." + item.key.split(".")[item.key.split(".").length - 1] let readonly = false; + // とりあえず今はコメントアウト - // if ("readonly" in item && item.readonly == true) { + // if ("readonly" in item && item.readonly === true) { // readonly = true; // } return (
    - +
    changemetadata(form_id, e.target.value)} >
    ); } -function Textareaform({ metadatatitle, value, order, item }) { + +function Textareaform({ parent_id, item }) { + const metadata = useMetadataValue(); + const changemetadata = useMetadataChangeValue(); + const form_id = parent_id + "." + item.key.split(".")[item.key.split(".").length - 1] return (
    - +
    + defaultValue={metadata[form_id]} + onBlur={(e) => changemetadata(form_id, e.target.value)} + >
    ); } -function Selectform({ metadatatitle, map, order, value, item }) { +function Selectform({ parent_id, map, item }) { + const metadata = useMetadataValue(); + const changemetadata = useMetadataChangeValue(); const titlemap = []; + const form_id = parent_id + "." + item.key.split(".")[item.key.split(".").length - 1] map.forEach(element => { titlemap.push( - + ); }) return (
    - +
    - changemetadata(form_id, e.target.value)}> {titlemap} @@ -330,14 +413,14 @@ function Selectform({ metadatatitle, map, order, value, item }) { } // 未完成jpcoar2.0では使わない -function Radioform({ metadatatitle, map, order, value, item }) { +function Radioform({ parent_id, map, order, value, item }) { const titlemap = []; map.forEach(element => { titlemap.push(