From 90c139604a584b6b17c50d518da279a38985bfb0 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:05:39 +0200 Subject: [PATCH 001/160] Move projects js assets to projects directory --- rdmo/projects/assets/js/projects.js | 4 ++-- rdmo/projects/assets/js/{ => projects}/actions/actionTypes.js | 0 .../assets/js/{ => projects}/actions/configActions.js | 0 .../assets/js/{ => projects}/actions/projectsActions.js | 0 rdmo/projects/assets/js/{ => projects}/actions/userActions.js | 0 rdmo/projects/assets/js/{ => projects}/api/AccountsApi.js | 0 rdmo/projects/assets/js/{ => projects}/api/ProjectsApi.js | 0 .../js/{ => projects}/components/helper/PendingInvitations.js | 0 .../js/{ => projects}/components/helper/ProjectFilters.js | 0 .../js/{ => projects}/components/helper/ProjectImport.js | 0 .../assets/js/{ => projects}/components/helper/Table.js | 0 .../assets/js/{ => projects}/components/helper/index.js | 0 .../assets/js/{ => projects}/components/main/Projects.js | 0 rdmo/projects/assets/js/{ => projects}/containers/Main.js | 0 rdmo/projects/assets/js/{ => projects}/hooks/useDatePicker.js | 0 .../assets/js/{ => projects}/reducers/configReducer.js | 0 .../assets/js/{ => projects}/reducers/projectsReducer.js | 0 .../projects/assets/js/{ => projects}/reducers/rootReducer.js | 0 .../projects/assets/js/{ => projects}/reducers/userReducer.js | 0 .../projects/assets/js/{ => projects}/store/configureStore.js | 0 rdmo/projects/assets/js/{ => projects}/utils/constants.js | 0 .../assets/js/{ => projects}/utils/getProjectTitlePath.js | 0 rdmo/projects/assets/js/{ => projects}/utils/getUserRoles.js | 0 rdmo/projects/assets/js/{ => projects}/utils/index.js | 0 rdmo/projects/assets/js/{ => projects}/utils/translations.js | 0 rdmo/projects/assets/js/{ => projects}/utils/userIsManager.js | 0 26 files changed, 2 insertions(+), 2 deletions(-) rename rdmo/projects/assets/js/{ => projects}/actions/actionTypes.js (100%) rename rdmo/projects/assets/js/{ => projects}/actions/configActions.js (100%) rename rdmo/projects/assets/js/{ => projects}/actions/projectsActions.js (100%) rename rdmo/projects/assets/js/{ => projects}/actions/userActions.js (100%) rename rdmo/projects/assets/js/{ => projects}/api/AccountsApi.js (100%) rename rdmo/projects/assets/js/{ => projects}/api/ProjectsApi.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/helper/PendingInvitations.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/helper/ProjectFilters.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/helper/ProjectImport.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/helper/Table.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/helper/index.js (100%) rename rdmo/projects/assets/js/{ => projects}/components/main/Projects.js (100%) rename rdmo/projects/assets/js/{ => projects}/containers/Main.js (100%) rename rdmo/projects/assets/js/{ => projects}/hooks/useDatePicker.js (100%) rename rdmo/projects/assets/js/{ => projects}/reducers/configReducer.js (100%) rename rdmo/projects/assets/js/{ => projects}/reducers/projectsReducer.js (100%) rename rdmo/projects/assets/js/{ => projects}/reducers/rootReducer.js (100%) rename rdmo/projects/assets/js/{ => projects}/reducers/userReducer.js (100%) rename rdmo/projects/assets/js/{ => projects}/store/configureStore.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/constants.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/getProjectTitlePath.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/getUserRoles.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/index.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/translations.js (100%) rename rdmo/projects/assets/js/{ => projects}/utils/userIsManager.js (100%) diff --git a/rdmo/projects/assets/js/projects.js b/rdmo/projects/assets/js/projects.js index 414a8c915f..e4c4e562e7 100644 --- a/rdmo/projects/assets/js/projects.js +++ b/rdmo/projects/assets/js/projects.js @@ -2,12 +2,12 @@ import React from 'react' import { createRoot } from 'react-dom/client' import { Provider } from 'react-redux' -import configureStore from './store/configureStore' +import configureStore from './projects/store/configureStore' import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' -import Main from './containers/Main' +import Main from './projects/containers/Main' const store = configureStore() diff --git a/rdmo/projects/assets/js/actions/actionTypes.js b/rdmo/projects/assets/js/projects/actions/actionTypes.js similarity index 100% rename from rdmo/projects/assets/js/actions/actionTypes.js rename to rdmo/projects/assets/js/projects/actions/actionTypes.js diff --git a/rdmo/projects/assets/js/actions/configActions.js b/rdmo/projects/assets/js/projects/actions/configActions.js similarity index 100% rename from rdmo/projects/assets/js/actions/configActions.js rename to rdmo/projects/assets/js/projects/actions/configActions.js diff --git a/rdmo/projects/assets/js/actions/projectsActions.js b/rdmo/projects/assets/js/projects/actions/projectsActions.js similarity index 100% rename from rdmo/projects/assets/js/actions/projectsActions.js rename to rdmo/projects/assets/js/projects/actions/projectsActions.js diff --git a/rdmo/projects/assets/js/actions/userActions.js b/rdmo/projects/assets/js/projects/actions/userActions.js similarity index 100% rename from rdmo/projects/assets/js/actions/userActions.js rename to rdmo/projects/assets/js/projects/actions/userActions.js diff --git a/rdmo/projects/assets/js/api/AccountsApi.js b/rdmo/projects/assets/js/projects/api/AccountsApi.js similarity index 100% rename from rdmo/projects/assets/js/api/AccountsApi.js rename to rdmo/projects/assets/js/projects/api/AccountsApi.js diff --git a/rdmo/projects/assets/js/api/ProjectsApi.js b/rdmo/projects/assets/js/projects/api/ProjectsApi.js similarity index 100% rename from rdmo/projects/assets/js/api/ProjectsApi.js rename to rdmo/projects/assets/js/projects/api/ProjectsApi.js diff --git a/rdmo/projects/assets/js/components/helper/PendingInvitations.js b/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js similarity index 100% rename from rdmo/projects/assets/js/components/helper/PendingInvitations.js rename to rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js diff --git a/rdmo/projects/assets/js/components/helper/ProjectFilters.js b/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js similarity index 100% rename from rdmo/projects/assets/js/components/helper/ProjectFilters.js rename to rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js diff --git a/rdmo/projects/assets/js/components/helper/ProjectImport.js b/rdmo/projects/assets/js/projects/components/helper/ProjectImport.js similarity index 100% rename from rdmo/projects/assets/js/components/helper/ProjectImport.js rename to rdmo/projects/assets/js/projects/components/helper/ProjectImport.js diff --git a/rdmo/projects/assets/js/components/helper/Table.js b/rdmo/projects/assets/js/projects/components/helper/Table.js similarity index 100% rename from rdmo/projects/assets/js/components/helper/Table.js rename to rdmo/projects/assets/js/projects/components/helper/Table.js diff --git a/rdmo/projects/assets/js/components/helper/index.js b/rdmo/projects/assets/js/projects/components/helper/index.js similarity index 100% rename from rdmo/projects/assets/js/components/helper/index.js rename to rdmo/projects/assets/js/projects/components/helper/index.js diff --git a/rdmo/projects/assets/js/components/main/Projects.js b/rdmo/projects/assets/js/projects/components/main/Projects.js similarity index 100% rename from rdmo/projects/assets/js/components/main/Projects.js rename to rdmo/projects/assets/js/projects/components/main/Projects.js diff --git a/rdmo/projects/assets/js/containers/Main.js b/rdmo/projects/assets/js/projects/containers/Main.js similarity index 100% rename from rdmo/projects/assets/js/containers/Main.js rename to rdmo/projects/assets/js/projects/containers/Main.js diff --git a/rdmo/projects/assets/js/hooks/useDatePicker.js b/rdmo/projects/assets/js/projects/hooks/useDatePicker.js similarity index 100% rename from rdmo/projects/assets/js/hooks/useDatePicker.js rename to rdmo/projects/assets/js/projects/hooks/useDatePicker.js diff --git a/rdmo/projects/assets/js/reducers/configReducer.js b/rdmo/projects/assets/js/projects/reducers/configReducer.js similarity index 100% rename from rdmo/projects/assets/js/reducers/configReducer.js rename to rdmo/projects/assets/js/projects/reducers/configReducer.js diff --git a/rdmo/projects/assets/js/reducers/projectsReducer.js b/rdmo/projects/assets/js/projects/reducers/projectsReducer.js similarity index 100% rename from rdmo/projects/assets/js/reducers/projectsReducer.js rename to rdmo/projects/assets/js/projects/reducers/projectsReducer.js diff --git a/rdmo/projects/assets/js/reducers/rootReducer.js b/rdmo/projects/assets/js/projects/reducers/rootReducer.js similarity index 100% rename from rdmo/projects/assets/js/reducers/rootReducer.js rename to rdmo/projects/assets/js/projects/reducers/rootReducer.js diff --git a/rdmo/projects/assets/js/reducers/userReducer.js b/rdmo/projects/assets/js/projects/reducers/userReducer.js similarity index 100% rename from rdmo/projects/assets/js/reducers/userReducer.js rename to rdmo/projects/assets/js/projects/reducers/userReducer.js diff --git a/rdmo/projects/assets/js/store/configureStore.js b/rdmo/projects/assets/js/projects/store/configureStore.js similarity index 100% rename from rdmo/projects/assets/js/store/configureStore.js rename to rdmo/projects/assets/js/projects/store/configureStore.js diff --git a/rdmo/projects/assets/js/utils/constants.js b/rdmo/projects/assets/js/projects/utils/constants.js similarity index 100% rename from rdmo/projects/assets/js/utils/constants.js rename to rdmo/projects/assets/js/projects/utils/constants.js diff --git a/rdmo/projects/assets/js/utils/getProjectTitlePath.js b/rdmo/projects/assets/js/projects/utils/getProjectTitlePath.js similarity index 100% rename from rdmo/projects/assets/js/utils/getProjectTitlePath.js rename to rdmo/projects/assets/js/projects/utils/getProjectTitlePath.js diff --git a/rdmo/projects/assets/js/utils/getUserRoles.js b/rdmo/projects/assets/js/projects/utils/getUserRoles.js similarity index 100% rename from rdmo/projects/assets/js/utils/getUserRoles.js rename to rdmo/projects/assets/js/projects/utils/getUserRoles.js diff --git a/rdmo/projects/assets/js/utils/index.js b/rdmo/projects/assets/js/projects/utils/index.js similarity index 100% rename from rdmo/projects/assets/js/utils/index.js rename to rdmo/projects/assets/js/projects/utils/index.js diff --git a/rdmo/projects/assets/js/utils/translations.js b/rdmo/projects/assets/js/projects/utils/translations.js similarity index 100% rename from rdmo/projects/assets/js/utils/translations.js rename to rdmo/projects/assets/js/projects/utils/translations.js diff --git a/rdmo/projects/assets/js/utils/userIsManager.js b/rdmo/projects/assets/js/projects/utils/userIsManager.js similarity index 100% rename from rdmo/projects/assets/js/utils/userIsManager.js rename to rdmo/projects/assets/js/projects/utils/userIsManager.js From eb737fadae950847e09863fd69fdab1f0a7a798b Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:33:14 +0200 Subject: [PATCH 002/160] Add fonts and images for core assets --- rdmo/core/assets/fonts/DroidSans-Bold.ttf | Bin 0 -> 42480 bytes rdmo/core/assets/fonts/DroidSans.ttf | Bin 0 -> 41028 bytes rdmo/core/assets/fonts/DroidSansMono.ttf | Bin 0 -> 117072 bytes rdmo/core/assets/fonts/DroidSerif-Bold.ttf | Bin 0 -> 48880 bytes .../assets/fonts/DroidSerif-BoldItalic.ttf | Bin 0 -> 45652 bytes rdmo/core/assets/fonts/DroidSerif-Italic.ttf | Bin 0 -> 40416 bytes rdmo/core/assets/fonts/DroidSerif.ttf | Bin 0 -> 43648 bytes rdmo/core/assets/img/favicon.png | Bin 0 -> 1129 bytes rdmo/core/assets/img/rdmo-logo.svg | 260 ++++++++++++++++++ 9 files changed, 260 insertions(+) create mode 100755 rdmo/core/assets/fonts/DroidSans-Bold.ttf create mode 100755 rdmo/core/assets/fonts/DroidSans.ttf create mode 100755 rdmo/core/assets/fonts/DroidSansMono.ttf create mode 100755 rdmo/core/assets/fonts/DroidSerif-Bold.ttf create mode 100755 rdmo/core/assets/fonts/DroidSerif-BoldItalic.ttf create mode 100755 rdmo/core/assets/fonts/DroidSerif-Italic.ttf create mode 100755 rdmo/core/assets/fonts/DroidSerif.ttf create mode 100644 rdmo/core/assets/img/favicon.png create mode 100644 rdmo/core/assets/img/rdmo-logo.svg diff --git a/rdmo/core/assets/fonts/DroidSans-Bold.ttf b/rdmo/core/assets/fonts/DroidSans-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..942bbf5ba3aa04288175d094bc9c11d109c5726c GIT binary patch literal 42480 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 literal 0 HcmV?d00001 diff --git a/rdmo/core/assets/fonts/DroidSans.ttf b/rdmo/core/assets/fonts/DroidSans.ttf new file mode 100755 index 0000000000000000000000000000000000000000..efd1f8bbd882a6a434159fa1da7238babbaa2fb3 GIT binary patch literal 41028 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 literal 0 HcmV?d00001 diff --git a/rdmo/core/assets/fonts/DroidSansMono.ttf b/rdmo/core/assets/fonts/DroidSansMono.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d604425b26f52cc6415ccaa028d4b420f8043447 GIT binary patch literal 117072 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

Up~WYpX2pC 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

W zj#FBZl8}}-lv33B>GtU+GuiU`hocWU$k*ws>-My}Jj?d1k-Ztje2E!nL?2Qg{Oi8q z1fY&fpEr))+P&(!zH;HK^_doc|PZC|wC0}C$N?%~V< ztA+hqp7$wlURZMpd_y>viByKFH*)*l}&U^)jop z-pc*f8mq)%sbMm?O(9daY0LzaB1c-9<2}7rt0U$t6jY?xi76$(JA^4f+(I$dzCy}X zLGF)|$(Z3y?K$F6R7ga`U|?2M3!~cN$k02AOF$O@Acl$SFYMReZ>{i)4O+1 zKZfnbANzKo_Zs3gG(T8aM~p_=v5+v)DuQ&fIMuqfq1Xz7Zp(CAk{<)$sYILNt-!S6 z?_N8^Rt$@l4)EKi@tc^jW-VP>gYi9$KtGpe-gcuAHuF~cW#fLU~X@K zt;MbC=S@C#`L~%VkNpJBHO#DKKb5aO^(3o^xMiupCQEM?@CNMhz^`)h5Jq`yaLPgF z8&TEVjH;}_mk1TC0WM3ibgy2VuJox$cS^qJ)Kjb^k|h<}q`QmxRmHrRzwhLc^QDSJ zDNXFeiM+moyh0Nq@`@GLd|t~V*|O9@dF|jEJ9t9}@8F-*^B>joFW2+2dhV|0^^{j7 zryGz>$||+ncywCjQ1u8L_}iXgRhSDAgJK_4k3lTKPfiZ>)fb-6v3giLD|# z3!uMHv|!*?Bpu+f5cDXBzgEn1pc)3UEXlb9mz{Spfv{)Mm_r(}@v;E{_`7C2Vi$nF z&>$&*zyAWj-LHx z@i90+p&go75nshDvr?tnCp|s4YqqW_F*BD3Dj5FH5q}p<99A*x%_KG9fiG3oFT_4) z`p4M!7sZz=m!32J=zM-&V6#eomWup*HhaOMH_Yc})qMQz>~X}mACaY2wNFL~{yJNE zq4EwY!lE*$=AZcyKfG*~ zB0SI>{H#31t`Q3IXnv4Udo05Hu?)Xij7V zj&jII}d{Z(IIjcg^f?l(!q0Sp+_KKb&sbQb$oftOf1N_%fNA$kv zUj9$>2%Rkze|Xqklj_eM8M$DUs?0Et(Q8&;4oESF-Q~=ut_Z=uyefcD4!et&t>&SAc@K)z_@VSEy0EBLrglT$BN% zLVYm$AIdx2;vI)(a|?l+vCs$c4q3e@{;s(vVr3}A16$p`h1l`*A@!m@uB3l#?t(?} zxjS%1e58;3P#Ki?+eLg)h9H%JxtAzU#LIxbfM*20Z5Aw6dLqHxe9XBAL6v)h&jsb2 ze3Lm}PTErJ1z>ER(U|jwiQfT%qe*L*^A{j*X@Vt|(L}{CVJ3GCGI7Vu3k!xcti0zD zaG^4dOL!JgaG?-72NLc>4=K=xi?DDxuoce2!{x7D$-gQ9eC8o>qnM#T4^&*GT{QtM z@g>;VqK#f)Cu4P3g*w+ZmFaWhEhOq(;M9paFIC!8JR14>fJ)H2y#RolW&plmXFHs%OA@+`3cBk zX%Qm^SB$TWY)k@y1UT7p;HFp;xK^r-{%jjB5?{P%DEbo)CC2XPPqy(OFB**gj0bTq z`jf3fKk}&h9gQB?%v9QSkxIWSkfn0u>GEuOQl8DC)vJ=&Ah4IX)?sx>j-;(+fh@mE zOq6bJBS9AJZ%?!E)dC-cnheOzZvG;VIB!{JZ=i}`fyJQe3xi^79%u` z)*>Bzt8Wx#s}p701zZdm9X?Mt{5~BI*KWVLG-iU>0ceVo$?13V`$qgCbtB%^eX0B@91oOza>7#5qr$Ci%uSn{({ zCJDolABtl$MqeZZ$GSxTjxqF9T}G%NSE?Vq3w6L*BJA>e;0L;jz5fh0rTg#*Opj#Y zw(%jk$H9dVjyrGBhZsluRd3vj_HQXwW0`xT#jH>^obAvDGF+m^HiX+#kw-4)rLM&v1GF>h)OETUR!nGU&n9$@s-tl zvUE+O&khIb$l6L9Z3VsI{-ry#-ilU#%gWSXcYW99T6@Vwm%;G5W_3k5wrYy%1vK>G z!>UWJdTcn@dFxv@Cb}yMa>Bu&Gpnn2eQ3?qz5ZO^UjQqZ-M%!ZzABvQUAcZsMcZIY zuIiF&SLJ%zMmj&+uK4!9e6yf;fxV*1M!&&w-K=3v|IBDcA2HL&uy?j)SvY@z-qFua zkFSN#|Mj2&n$s`CBU>V^=Z&vn$DAU4icItENY^>zJLmKB0x)8bpDq#q)7jp0r_bi& zZwIItjXW#NV&wUFHgbvbhWPwrz6{sKp3$-&L583_)uKH0*V)dCLMqzy`ngGxMdAW(AN_~-|q>v-(UKzJecd|rsAmAq^Rd16K_ zOEpBE)zaUa340>!FHI?u^EcRZ$%~7;%dYCN#U~_4=|?c5)N0Sy?9BhHF-pTBV-oOVKx%?tAt6{jcn6a$B<-8ynrX&1`h%CS5IC zy@j@G_jlCab@bgA2M!HZR16*(fWK&I$-tecX4HNG<}=wE;-^q_fv#VGPz{vPEL!WY zvnv|XD$kPil?(~V?l=$0`K8*)u3TMX~mMU+Ej|Z63&#-r(=Y5x% zVFjPZUW*(&>HXX*eUSC1Ea`)cKV?WK(>_m=PMSYAOCKcuDN*`B_a~inQu{T%f??AvGsE5Lqv|)+@2ju zRTdX3E8&?d7FJLbERhtK{u{O}y>)Bvdh+UTzbf2#%h0N|r>xjwq_2E{eERvr8g2A& zS${43{1yNHz|aG2A0CE7Wroc@^lZcw{gXK5u;VH%#-;|0(j*bHAMp)t)mx z^&cfa+dCC*-GB~C=sL{Ffx01N=Dz;|;2^y`4sh@W_8`^%9T*2oRxZLg z(4-Q^!EkiHb2ZTH{(htb;?qhUQoU0hYS?z281p5*k}6)kv`?wSSgi|88tGB!xos>E zu`l4QbZ5wfxMEQdSK?3*w6+0@C<*;zh%0Af{&4mIbob9fcW-0spL$F4Yt5hGq)a`$ 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 literal 0 HcmV?d00001 diff --git a/rdmo/core/assets/fonts/DroidSerif-BoldItalic.ttf b/rdmo/core/assets/fonts/DroidSerif-BoldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..045e8a625fabed3c93b990cf4f7cd9869936f077 GIT binary patch literal 45652 zcmc$`33waTy*GT$%xJSEYu|Ut+AM3aR@;&-*_L<5dmP7!9XpHTEY40ALP$b@kc1E* zAuNHAo6?j51tpi#l(sZ2DJ|tvND1Y(y%Z>IDSe@&T-wV+V)^@@k(>?M_xqmbd!JYK zSfiQI_?-Xx`!8n@MhMB^4}&aCP5rZa)wcZzeM1OG4b7RxCX5jcpWX1;(%jwE_sZ%X z^0@_}qK}&UX4kL0XTt%6PDRN1uD(F%u}{AJ5<>WK_&mC3a%|1lR-AqkA5g-2yrhV#N#X-TfYYJ;0JvJzK(=TS8f^K(Y@nA7~q`< z-JzLSGPd|1?^*s1-z|spu?aX(@?*|v_`DcCmrhJ>*!=6?RD6LD#Yc$lUb%YFSp7e2 z^AVD~3)eg`IktHXm7u(^e+OJ|Sv5Afq!%skM(Cl(U_KLTR zZpoVe-g-w3jF*AyKR|?5u&p0fI~ItOe@ABcH}LwIx?91%&%b?m>b;yoFu+?6RO2Ix zJ}5g@b^r;H}$??04+w!!nyq0dG_At(I&(}tAH02lAr(@f|D1p0`3J|V7^X$ zAI|bQ4{^e9OH=-xejSbDPboyfl(`%vpwPRB`Xr4k^WeK~a`TG1z6NAP7E6Zffic|3 zTaQ1oAp9sf$Fy;tgEtFHFmeC}4b+2?(jIh_k>EJ91y#Wo=6TUU?gVP0dU2c%qX9ZR zeS-NEGjQ$%H8lMpwG}C-)o6(7oc6)74%m8`Ez|GAmVzcA-qq(XCt!H186H}A-Vy^Vg=#uVBVa5i^=95XEp(y z_n>ZO3nioXOy9$7LyHTv*OIXS?LLF|$C+-_1lLHIA>@OxZR5U(cGBz7!^~>5h0u-A zo;~)|^gn<%?~!Bho*)}Lm*vx!I1Jha{CS#s0)^rDF1j8agzx*fr%|l1RWdDzA$0$$ zjrZyF3Bn7)hpV?dA7=OgbO&C|@PY8+>J7&AQ@y$1_eaqX%Ll@Xt2ZKNpCUcs#nl_j3*Z@fXYX+oXQ(GI1+>c$ znlWhl13qk24I_tP$#=8we(T-)-@U8wAK~j?{lZ+2iC@yyZTBAXpI!N20NKWmR<| zSyP)z*VQ+G_h@cuZENqC)!EhE)7#fSdtlDs+@X2%hesBSj-lIk@7Z_ofumnL{@97H zf8(1^KJnDIo_RWZ^54Jx>~p8T^ZoDr;03g9@see)ZT`14E6~Q}=#GcbdW4pO#=vXk zP3ZCGcP?5*_9wTYg}2;xKSDqK*?+wH^3T7EeuRFBUOxwCw!HESbnBhF_U}D#_dR#r zcNiUd_>m(&e(@)35juM#`6fy?&K;cH-`CsI-PJj(qrI)QrMamw(@TUvbNvwaK> zj9qnLG;4uFP1jzNwUFbgp_PLhq$L#(rcAs&wA4KrMYK3oD8Z{FcOBRn>8naCsC-yduW_;!NWN}f0yFdRY%4ON4O5j z-w`?41f1Htx5;j4+B>>;?DX`Gg?5X?zW1b1xOYt>P#AR&W-%OpexE+ubm!cxWOM>o z7be@(+n$y8%p1&7jwZ{*7)&32Q+8{m-YSI&umov>?|=1a1cU%`08On{GVy(<(`X@l z$nNMF%zw6^h5Az{9q`W0QlsR|nVB=n+2qWQnKPHaK57SUw)YM0%`%SG#r8&^@xHO_ zj)fpk%Lyy&l5EL8^j7;`nbcAhfHA_g78rEv;$@aB$C>4lZ(aQbkV5j6z3>N^Q1Xxb z+sAtN2TrNXQe}tRkoz>+8%GPj8z(gIA1%J}Y>PL~`u@ReIs?>5j}^qC@nkRn-xwPO z7A+&3>>11k>}#?LdwpJR-~bs`a-TiHM(d>4ehaW9cAG6Zrj zd(Yr^QF!{@lM##l-@_<^=4RkaE%ITww5A`{0tf zM9_djo_FEj!3(C9r5gGN+xzV8Jwt=QRqI^#3^_q=$2c0VyN!KNpT7-=T$b3gwvH$m^SD-(Pw+pnB5`)jb`Xog$;@>W9Aomw((JLh@B%JrCO{y;us2#36aL&ZcVh48Tq5I01r&i_oW=H9 zppL!vB&N8+Y>|CQeYV(MPmZU^@l^gemmKHW>$6yeedRaql{DJ_uJIw5+osRawE3Oz z+p~Wcrf0v6>Dm89Pn(Y%)|$^8e*N&fhiM(w%+|`M%{*q>%!O0(uxvI5E@R+wF}G@;BWxl;z%$MYD(I4W7jKuDQ4E-;e5z?b%S@V0P3v zw>`TUcG6^L2kc0UCsn9^?)vrXH+b3C`uv+0uSfYk4dN;w>gt4uM-BMzInJvv^{ZY? z8&V*MWv3xFz4~uXK_a*R|6ci+@n7EWRrD$vg`a=+`W$_Z*22&K!54;zJ^#Y(GkgEH z-Z{@*I)s$dpZtIQ|6D~5asiiL8FUNad5StlchVc_)AZ*|2Xiy?Eb|NIbB>C$nDYYH z!hMXV|L0Yg^@Vg?WC{{F7^!?&Hg(~3*5m&UKgetkUBqu&2F-Z1G2c*x- zMr6O2SIW;QVv64=`<2hD)~SA@9#Ma;xmojbZIQNIJEFZs`+)ZQx(?l+^=&I?|`?&l2o;J_J@bh0~ z%e^x1#_~}4kk91n_ZRtZ@t^Vk&i|*t3xWR(mIfCF&sGdo>GZVKHRdLhgW_lEBc z|0be~WFjXbFGPM7`D>ILwM09jmtu-oc`Or~AKMtaD|RCGLhL`| zAFrvb>8x2?b5qTsnkQ<0T&tDph^{;4*X%BFsvwx#>i$I|cC71delVs$I) z9 z41OKIi@BIaoNmr2XAOtpoSr_D)+y92oC`d>orfhn3opo{#XQX8Q4HduROrA&peJU8_!6`o=Z5=CN1<~I1>dSu3m^b-n`k;5n% zrHY}|Iz2_J+G$)xV?T}cG#1d9_G+*|qt#Fv^uJUWRn$8w{G{r8s#jF>BPzU4g}19P zUxigF>uM{On+;r^j3<*yL_z^ynvvp|6kDZOA;nxNmhwtUi!irHRYVoN&c{#kzsG-t zPd~`V`}mm0$9%I%ClaX@a*5HP7Yex?N+5wBzDg;R(maOdqd+(uPQfOt0-Pv?oiO=x zc_&YZ;n47KCE zw*7eh0lYuAo@@tl@CoE9JUznP0RAF`YETn8ksh)71C>=Aun-orslHAj=kv_Ghs=1Z z8CRLH*Ng>bt(h`&dAwqG7>ALks}z^EJXecdwYYY>7Hdn2>jH{Orpi<$=X2`)R#TdT zIVO$??uU3>pj;|XH6THOYBF^d4unCZhleG<8V;Qe4NF0`^E8oc+kKXOv9!zY0$o7j z#n>MA<7gxnR+uQY+)oqvPvJ1ngq1`gB7Vw6t4)~0?$pv)p;F6BXolOk^E>N8>%!kV zy=hY8t98w9T{FwoaO0E9EbHyZk85Ic>q-nh^FUz#p4=Bjh6-nYa8}He`@Eu}!=4Hn z@OujmO;l2Uy&%4O{n%j3s_sY$e%94Byt;Yz?vV(6--Du6{blujjbm1Gl_a-P)0RDF zsPG4MxlPy@X`%in(P_tvIa*&Gq>9nO>5sU7S*+|gIRqTPefxf^00 zeTh4ie|O=||5ulR+Mi0_dB@h_xW9KzUE+@0Z(300>R3(H#Ru1Hm~{7y#Ru1JnDq3{ zzxZ9a?8d@nyLWGe%i7ma>FX~8iZuc427q=kltKMyNxCLzwRAJHa4KEGNTZrY+$h## zy>mb{3-e~-S<*Ooxsnz^G^TWQt8gl4OvsrC6~HsH& zoC7YXYiVX+eD-_y-Sq6ns+Jp%5BWp2H#|8xvS-L!w%~zPm+T?21V5yf+3Qo48grv> zr+K(utiE{2Qae;N`ba8ws%CanLv3$uEv@xw-R{)fO5OgJxz!VQ_Kn}Oyu;e{K+E8* zgFa8oSY`8yp&noE+iefE&sxbh#{9|MP2Vglo5b6y#+ux%wfHq#OV2R%x1M>1Sa&$F zJgJY>0tCXuCr}4jpHPvuUF#7p(0DtICA5VO(zF>Sstd@@RN;p7K ze2=WGF{Hogj%Q##N5)c5svqOLp5Tg+{ z(MknXLi6IaoOmt9Kl!I4p#PD&d0k-ytG4HIFoN4lcNIo(i|g;^mZ zi~z}Dti!JkgN(vo@Uw_G4;pGMR>yK_%e z;5Lr;bnef%Kal&6dw(lBcnV8$PX%!G;a^KxUY)=WM!_6J#VC^26=MO$+-?RluT%H{ zgo+fi12K$%$3cOYi1pSFZ#`*ZH3>3~mGz(Ib5kJ_i z0=jvsYV9}IsNaz4j5?{dtkUeL3mUd}-np(%xiYj_Y1V4Y9+NfVkZS{tMD`T;MQV_G z2rPywT|{wES|Dm6#|g8&l9wui^0<|!2vUjwe(|lhSXn_s(--h5oB&>_(?#eopD&k* zj&Q(8e4HO!eqdKau2TeTwawQC>R7P#`1LpoPy43%bQJt7jm&8Y^)7vZrf3dY4Tz6q zqys4;dJ?cU6+s>t@bEEu*`uHH2vh{D*a4NJT@b~okr&z0Qkzid)8r?jmunq79&5c| zIw3$6-~r^99AiJox;&!3WmX*&3JM^ZeQckF2T1nt_(&cyFpq)z@CV zxHny{#=l{6kX`2(tWDId<61g}>6det=puDlrFF6D(ka!J)*GdY=Pqdu%1cb3~jU2$Vqi$GHvb}k2c;_3GR zcWwjU5kQq`li$y?SSq9uRYparRL%ry2Z{^zJfF|$1PM(Mq7sh)P!2{+C`?S0J&tR^ zKKTK7gNPP$}bQEiar5|TU3gwwaU`GoIn&Y z3+YW7Xu&2-anZjv5a|WQ2=20a;pCFmvO+b7 z8311;gc|UobX;dNX-yoVQUP&-hKQoZv|WJ}in3y{$_xxv7?nz$S}Zh^_^L$9(Qut5 zB_d!mPyzrwPywV8_JKZxO5_vBC<{U*fJDK-fky(D0C5*fA@KQe2yy_BgO4i6Fm;@- z(i+67>Y8d*?mmFtr<4g(ZLF+VH}z8^Ey3nj-ZZ|cqd9VW$m~$l%ROTg6G40b><)dd zVd~N(&zOj8+fF}!sdM*sVOf#RBIQmJI{>x}czyup8b_J5lQRv#yHqU0GFg>gYLH06 z3;f&t2mFuv8Gn)4EJYrzUJCk_2R1XVElk9DnEZkfyPCr;IfNRufTx{yD_x6cM0p18 zgiSO))i61$%vnD#>PUvl6$9sJZekn7lvU>zZ*eYeU;fmV`hkD@^T8E|=6lqEmI^Gd z7})Bczi)p1!g>o|B;k9hmvVRN5+b!Bx3gFk8apt&=12Rxopp06Yzd#Pe11oe@N)v@ z_#DV}8A_tYXRAdbr=5hJ7OAF1Y&Y8j_AWbPx7X64kXVh?UOqpHOuVQ}d(A{yxgPcs zH~}03NL@=`H=zPN=8`ahCMwL$<6|QHbj__VrPRsxxskcMW_ud;ymsf{kqr%jdAEM^ z)s6kz2fVl6$kPV@Xst^|l-iN*$Uv=a7Nn{FXIeHm=gUxBB^s5C9Z0)eO)8bs1X z;uapo=MwvqN27s)Z4YCsjSHcV+{(jm(w?bLD_cqo+xqEq>Pt^CZ$-mP@zYzrcoDpe z9_Y9S=;#7zX+eGIP?3q_3)r#UE~xZWQk7b58@JwBPt}i#*N7>xILb*2G%cKrsVKy_ zYZN>;0+K?E!3Jl9k`Sa4`mIAPV|OUipa>$SpzqXKw`gV{&;-W-la9Z?p5i|O(X3#+pKxZYu7xsJhIVJH(D3! zZ*Q;!Pu#qGGZQFlj+pFq^Q(_7H#c_=u|Bm5=(8T^QvuYePMbN&Bv7PD>`Rs5vUG{G zr7V;#!bL?2QO%)f70B_j|Qs~Uzk9Xh$JcVkEC>~^dutHT_3V^%JT-TIJA9Uj`&w&Pb1&W;sANDUg^Q}WGYHU><-o{o}ciK%2 zVS}&Is7)p-l?`Jx#*VE=x)zUvo&m<8#+iP=ICfN)R?80W&|w|HI*!uS4y-<6mJ}dQ z>SM@OfF=C+{P4$L0zTKLp02||&(6Ril7lMOUJHw;&mtrn)#1qm^&}fb5nRZQNdwyN zNh`F6tp#vc?lm28N&p~w2|%2IVE_@&7lw2lNW6YnUxgW;zjkc@1VYlvYX`~N;S=ah zz{r0DG-FFE7zk}J7jZ4r8tQK97Qp~| z=ihSo=N>*zY&wNb;8z(V^jFZ(4OR_SJqw7COQ1G)4KK?(!@Iy^NRn+c;QlpKmO2CX zXUP4-!+^V4s}BDLjGWR6|Hm3-jFTyI$k({8XaUc58PJnt&6VsWv#|4y?@hMu z;>Qn}dyh9q&^8)@LTiA6r*D_4y3j@<^N6H22_^g|6pv)~+Qx`@@|vL#S_M z_0jlPOPRZW$HiY?2gE5fn0uR>1A9A+)}hIC^@!ZObg6~kG`?MaKu*cW<>M$J?lt!Y zdgP|G=0}eT=Lxfi=Vb6ys2^n zzn7~v*(8y^bif1ydGNy5=geK|Zi<-725udS@7TU+Uc6N6%^{)F?GTp5%*B~qKfd|S zH}*HjChq^yUv__c8Xa#l1#2yxo|c%!JGd+RU$^b~;>~Yutsg)6w_MfuWLe{Y4<9d4 zig}UQlhFS{O+O5Yu`KY%0U5~~()Eszx3pA&D!dqK0$#aX`V+;Q3aUx*oPw$XTo+j# z!IDUKZ%_P$Z zkt+dskYUUtJQm5R3c(1l09)lIdL}jjd=S92pLPKVq^^&VDyU(E~*7 zu%p#mYC;bFISyatibGEN*-6fVBXAm*$*@<9KN;iQCL6l@<)uX%b??Kc0=ZFAO4ZomJ|$(5{q+d2Ia z=NRV=picDL_HM}En+Rl7%QY<~KrBBDe-fqx7XT=`wG0x;S)@qd{jlV`_v{Q1ju+C# zc~Db;hhUlVz=dQ_>3H+Hp^Q$buHABK!@&<8?XO<-=*t)Oj6b*}R6c8Yte;h) zPQrZZ0ZX*rE^w;DOZ&pD`(NF)^{>Br_SQCgYF^xz323|%L&>)7kALsQdC&Y1h7U6T z8uSGt;IA2#qrQ_4H5t86p=nX8{Q>_p(7M3S^6MEYEk|aV_X;boFp+SPWuNye8COUR zTLHdcS)QF(Z)92ZCc`PP>HwK!c+tIQKHfJKptjuo`-gi&!?*PgOrt!9{#tCvbEswi z>v!Dv$CtmcxqkZ%Z{X5rRy;CZaj}Wa4YRU4ALiyq`_et$a#_mSWu>gv(q#%f2nsBh zcgsd)lq_hsm`ly2T=Q3oE|2TCTVA$cuSKD-cxh=V^2^MU{Jcrr76R1{1i;$PWEL)q zF;Q%+A&C{B2WWd>Sn?9M%P)yC#6J0O-b!1c=rR+(TMP1gnJCO)%RQK;X^AcF&Rv+q z=k&S2R-6fTRJw%Ldly_>b{%PQyLhE8D`N;bl{vI^>W6xNjcqWu>k4g_v$WZiZYVED z%glJtjLjyKG3fOJ1}c-wi5|<*S=o6Rm6hRrvLiq%e*mnZ*=rUW%Jg~}lGDWonlBU< z6H^D&09wEsQD~qDv2{eLi9E1Yju3;T1(-sBbC-iwl6V1ICnw1^R=KaG2t{!?DtFwX zS5Ku?1)Ub<<%Ah;zL$djKuKxBoBPWq{6|er_o>>-SLwx^$vipUib`2k&h3&q?OMhd zawwmeFRM^SytlhNrmX@O*AM38&@c1t; z?%(+IhN?jKWR1RRPO|f^8y7V>ZS6Po1r|CoLX|59WT2j)It99rJGVt+*A#c$^~&~J z|9<}In=)mYLBG2(Y)Y^0^{3Yz{r;P)2lkIwN`yEV6SFkP>jcjXeD6eGOE2aJD|ihR z6@<|hnLqG8<53A-J8vtG_K@0Yw;|n)1pz36`;A6&jj`yg;k<#$8t^{D5d&r53k1QJ z12_;+Icuvu4u`*?!pJieW%$a3lkSi~ITR_c^?^Vu*4_jC2pO-EkKJd^sRuY5 zHHaKI4LHbt^$qwQOZ`c{KIp-3xA zrFe9FKB29if0lQiM`d|{;G*2pL1lt4aL{!KY8cPX55#BfYjqtQf{KqemyD6tn%m~{C38Du=6bV3hq|mNi+IM`o?9ZJ*ID(=oS<9n6ODM*Az)DR*Ci7 zQhY*+Z z7(g$0fq7-}&W5$G#2yi!;)Jq2k7Sr|9z_z{$2r7NDd<`i<*V*u$uCy zJsq91D{{|%qV;&gcCKQ@`0n94>-}3gW+dlJM)|UEjWYv|M4+@pr(eEYQI;;x{dVe1 zRd*AMocR>^Vn>7NFqed*j;sUQq*6j!sr{_vyoAb1 z@IJ{A2_-RVwGyd~)(N=WA{}inDiX~2CDOj4t^(p*WpjXzzaa4|$)iB=p8jXVpzAAp zYy5J@uC*7tuk$~br~1J*L%hFoG8g}fnOw}~b)H`V^Qc98({qf5np&P-pV#}E$8^u? z&g=f5`%K3v*0t-l>S&!Vl}?&Wp%A$uWIkJQzJkhD;C&TGDyRy*iK?#Vg-m8$1;2)0 zR-2#|60g@NFJpxV1STJDTrWGUTLym&K_O@txeSEldP6Zo0&Fk7wk~pwdzNEo;$x`9GQN3bQ34&qm5Fr(KA^a~i248XLd1_*&Y3j`%{Zj(qpW^?1 zs+c$zu9{-hIs$wJxl7FMODn#5;urr!djb;He*@Km?u!*9ce8W)L%=SiE*C)Vw6gRW zAr=ZN-l@Qv3xI5la=C}c=0gZpfu@#x*8R)XIX3i%2%k-nGCM04-ut6Z?_T@r!}9|R z4*cl9@7;3l!9m>VZ6B|my>C@dR9DtIo`k*LsE)EO{LgbgI54|@@A-oxzxw5wgM+Pi zpC4Ls&v1F~o|7;9pl9*jBR<&s;SV6jATi`1@JtB#;MM6m0S|KnRj*g!1yu*CC=?e7 zMM8^(@XI1PYd&wLvSz%`d;~gugl@OUY@t1xIH(XpS`V$%YBg7Mn$(W2*Xlgd90uh+ z3%WhbW-{`);9oGY(68df)WU(`o!zDO+Bsq0r+K81QBSF_7vi?fKi=J{2oLRh@zx{M ziOMDW`ev=nm@hu|)%GmBJ^w_+Uq8!K~=atpSHF|xlz)QA$3G!PINI+0gRYh{6AfH#W6;j}kE?^D4pLXO^ zJD2$@-+qO`j@C8zeSa-oTH6=4>JH66dP9aDJ_6O)ujKY8SF^kS`R|>)Z;gKKJ$;r< z@f%LxBA>hOdzr7`{M0uKyx+$1z8>vP7u!{(N|h2B3|t9`G;1N!lt?n-%qJO`uh1zJ zR#g!}sB)gIJYPv=EAhU{BTz9A*40%xE9nYly~BY}sGjzRLZ%8(;!wSTn#b3vgdx7V%h3u;0g;fWJ}|FmJ*EvdVdZeP?6 z{dp@MS<|N8xxbswBC4;FnopfQJLfl!B(z(ecxvL_Mb+ZmuIlaz<)kb;uNB{$+v9M2 z6`&+C0~!rAgBRIYC7pIEYHGZ0(oNuYH*9afl7?VIx`B=^Fio2%lc|Ukv@>D^@e0&X zKw8-P2{8eMqSQ?Bgfy?sP{Nh(Vapd%*veGCWCG1F`Q!wp-u}YPDOdAY!rihsSv{1p zDk~Sx>fX}hY1@1D#&u7ut-Sew%-@;x^rYRk%y{FGLtO`7SNOXp)4`UYW@PWYa%<<6e@53Q~#t?du?E$}byi|Ha=u~a{)|U^c?sS;9?esH0vJq!rEuQFlhV#BfVrv=kV(A675=|ju+JYn7Hp`niH&HG=F!YEnRh@(m~;kLdpzX3o`m~(H$LKi(oNm&#+%)EnHvwe zvD=LWZmpYgH$>&)ii&Ct*W*rbw0x5!L?cr^|CA5X0Rns(a)TDJUNDa;3$c5l()1Pa z)l9H^b?iO^DIl+`qM6|x0};tl5<0QLl)ey5J*HW3@MpJdK7Df?!{sxFXX4tkDm?^X z4#5%9=Cfm4Y{9Nh>JQS=tK+DDtj}($fqH1aBp9xcQP0Qok?l%>Ht3oP$jSpj<MY7q!*VzW88I*4goxlZMF+sw3Bz_F@5wABK31llZS$N~s4Uv4Du znpg|cya{PWsHCw02uU#(n(eS1vayAaT0oKb4NUuRP=z^!X$mVjw+DNZgV55ZRZd9F@Q8tA zI}2FD2eV<}FWA5UnQa~g=I6*}FJL;?%m_G`pE-`>upI0Fkbso}mIQ)Sg~{)7sit21 z%l=$RZWXPvmy^jol21IlXfB6VR+{n4hc}ccg*K00{eFowmIx>)HK$EzP53W%(C01% zE>E*UT5ily`nd}iSd&|l^yH;a$4=JUhL%i(@Q21~LKqUKJpp_j1v)gNk#t1uEmxJR zcr{5rpI`edl)|_Wg5hL&xu&d~Tbr!mdDSXS8DD5`iiK%$acOCZz2GxgvOw=I$=~GJ z4H=058(u*NG}~;ECkagZs`R^y{t_%E3Hccj0D_tE6$)|NKFmwk`OD;Du^_CqoB0u5RN$4+HCGI19vzdk4Xz@w zIq{(+_Jm-nA~<72uO$MJ8a4D$T_HsQ8eg%j@2lgMWT;e-cv~RXxlAB8531$|TtZonBm(4K94?F{dL+r2;axX548uJCBtP+cr0cA=_E7d<# zV_8;?<+zwH=gV=4g2rralSN(u$aS&3;?OES93r{gVZr5gE7FToXpi6=xFo_S{Joi& zOm%4C#c>(^Y3||SwL1I3#Y{b?^I|{~nO)nK8yaWc=pWgHPY@n?b6?PZgdRNw3a8D` z`B=0SJ&C9VXf>kPwy*%g#c&xz5`hcf^{HTh;e`N69V$EU4ZRW)gb=&W4SZApB#f_D2u2U zrs~($CGoQ~hjc=cu1wOD2?Mm!%%yrA{lnbbkSNCZQ|8z73tTG_A?de8 zX)bpMa6kur$GTVHYADCWtsw3^I#s@C{wyUI`-HACuawLDTGu_N-=uU5^tNd9BxdV{ zT9J?$K|$1rhSM>l*_@n6;<-tjv~UxNM0#A0Vqiym)cEa7)(V$*AxtkFd^W7F>)Z)|C_biy& zBQ<(7zR~^$X^W!Som|vi<54L3x-B*C=GE=4s>OS{yPtXDp$&~9g;rECwNqM|N+`l1 zt*lq!Emh+U2>`yG+mH3)exspw;?}$N0)4!Iai0MB@dJG}q?-a=7HqLJry`&f}Brfm@ zxuE-yML5t&L(CXi6Ejn51ZL(7F~pohc9Ivq+`7fCWN<-uY#~tQ(QJvF!3mnnP(odq zF(Ai(>t&=$txCoza&(WZ%G9mu^0_{x;k(%5pXHzQbF>w1;8ENZDkc;8UpsV5&?pAjl_;so`6O@Bn=YneN@ zOPkxKwWOBby7x9B%S5i2Dv+xRlsIKK@kwB1k||pN3Y)@anEitA_AnEW5rKj_qy&jT zh**{M=7COt&2q5qME~1LBsCeE(-c#RWPwEwEF1p%))r^S+QZMUp1rlpsZTD*$enRV z`K)w>UAAtwF_<(917>$$gEzAL=!%Z7KYCzg+Mehtx71XaVq>jkiLq_B?Tl^%n4i~; z3fBG<^NEabtT?`(XP-JDv+`f0e;v!zTL6_3{^qHQKsIM(*gvM(|=}9>p{n!dV|}>aU`#E&ZT~)tIG(JQ2g?oOZdG}yO6jig z$W2D8s%uS)H93AqM_%7_YLVS;7W7^bDv%MDzDy0shzD{o^=W5u6h{qwzQIsst_oD8 zsy?Y=0xnlxL`s7}QP~wSA<;FV9pst`aD*jikY4^uVPQ-1_A;FByOWc|b3VRwQp-a_ zvuaerlHj5TmyMj**5dBE;h`U{J$QWn@po^Py5%%peL6JM5)sNec8$fOyN!W_Ssc(g zdK-O_Wsk1tI02%Q+P<#uf%O?m;gN3INzZTJd|#`(eWET!ioH1Zeon#c&6YKuS&Rqbe`!tV(gta^P&O@W`)XhLGY70U$ryrCdML*#`` zC_v8!K|M7jaxS!K5O4^A6X{JLt^&*in`?m*K3k%Y+f&qx)hL9~&@ySI$8(o{tZtpR ze9eZqxYTAU(n@3M(5#vYjkP(LtUd%k16_vOOun2ZR+&P zX%3g(#3{1%+%ZnSKIZLMa{rQ$Az0_gbhuh8t!virfS#Cpp~ydDT64D$+Y>=&7W+hf}8OM;@s155p)_M-@9!W+Nid+d1;bZ zNH1|Vh6cLyeEQ>osR3&B0FDhb4N%Sj=KyCkq1T93b0k18vJwoa1;yUs;X*(`M1^D= zNVbbnB%~vSQ_!@fz3!m6_Pgws1 zOPT_(vT3GwiO#PsBaj_*_qo*eGq+?m`P7l>dS|LyWC}YRc7tD`GU_7TtL~gFFq#a4 zU|MQ)YyNcj8?(Rm@dMjVu8GFyZ%iqiMwu?wU!CcIKxFxIzOJNQUA3rvXlI}MiPB`S zR4uHEMZ05$YU+6NBfDmsZN{)eRTI=k%5-IZh1570@GTmfn{fl4ppHe z3_rLs>Bx*FVuN+%#YJ{sSZ}F}#VwYbr})*i0twd^O4%)OkH!*frq0_cn>$)fEe%Z* zHw4=2!M=lEPG%0ye>l z+^fLJg6Z?h@h78vxuCd6=;|9?o2eU$Yxu4ITs#hsWrU;XzxqS8I+mIjsqw-WqRW+NQ>@nc^ZK6W(^&6-=HM zTY?r}$|EnaRM^T=Fir3cIe3~LbsT6Q2kSYUPMD)z(e2T9qKv{d;leJbcr|A`2YN7+ z-*dj=q?{Ho4^Ed;Nh_>6eMlj$M%aU}2IRDetYm{p6L682B_c}1RIqg48;qEiqDDnO^A&>PelcDsE(t1}7}`KZ(Bz*b@ct=70Wj**Ha7HJwMsCJ5? zSdF60RDhx>r`n-HE_aw$ZZ_L2upqHSg31F}2}B?S07(ER0?k2J=~TXc%O<2*C&Sil zONc`u&45HcuGJ@4>_I4!uj7IvxjIdapBubhb5_dqdZP@dv?eJxn?FJ0O<@BZAWmcfv8QWB^Su`>vOL@bw$VUZ(U;d?2%

4At^=lcHxc_i!{?7UDZsVOP+3e@@SwKHBP``rvTjk;daM;1{T!vr(o*#V zEZR}32=i1Gyh_Y?lZ`5e$SYCH6|~A$Du%jL;7i`Hz&r>OXZn+%fKYIS|9ghydsMG; zg0#$PWq|BFxs~|9YVd&**An`tYEj<%&5dh#;Qjm{^>#~?cmY-?UKo7%%g*m=`u+A_ zyS+j@a1`i9)^(PrwdO8TKlZKmJ?f*}u)b5+f;4iKjYmKpy9(%^){r@up%-aX?JaFx zb>9!x4?eshV{4u~^!*K^$JV9sTk*Ng5v#PXB{J9?bIAJfL$e+`x_^0X#l+XvwH<#1 z!oui^z{yeYETz+A7@Y(S!dXj>RH|MXb)W@ z5*E8%P4Htd%+umoS{%@(w3I=MMesC;CN1>*a6~d0tcBya{m>oaaEUv$d7#glXJVlV zeg&P(X9XawCk==4(C6yBz?HC{bRsc=t3l5dl>_MNbaA1D8&sBsrjR+NZz$G!Ew+YK z9Q3JEU~>92@ddMzZsny;th!3Kz8fvEw+*f9Xjt9pwKpxh>*Vs<6>eDK&V>~k1&7}$ zquws-s&%^R2Zl#HxqAdkNij>Si)%UhE4q{WB)ziJ8ywj?)b`|)N4KK~RbbSNps)Fvvo6?=draDnvB&z&J9e%$K-&S{D-M8!L@w$z5)T}yOU57n&SXYOI zb-1ps!Q8MKs*aB~FtAVt1jSQZr;nO~rJ`a9M-mH4IHh^3pO2&RMv%k;*OZnB;fXT@ zmshA!&xGGV+L`sYGvPLyxynOHl8etr+vZelRlrfyR?<{a19=pe0$0*SLJ?Oi6WZJ6 zZS1OB(cyKqP2Ty1DU?yDcY^ z1S)GxO`Q#son^t1JLl)aX`x&rZ201wu3F)+P7=QYYvyhMx|Kry*d~XkB}gPro(Y~< z!nN5*oe6LQ&m^)cEgF%8;Q}ZG^$C#lQ{E92{J@n6l3ni#i#Q9h&`jx-AZy5;V{WJ# zaNbY6MfT>|D_bU)-?UMnb{UQ7bWNpS(wTeZX<9%Zc3LNMAGEFMaP@XBpYXRw4T0XZ zx82*GJ4(l;l`v-e^hfj`VayF^G+oOH8lC~=&^DSIQ;k1tq@Ch4xNxyJ^-T2-tEp;& ze5&m!tb~QnDV#!4m9@-(wFX>lzy<{|2jIA1PUH z%WhciQltotUoLBjm`J;8axCLWZ+>#+(gSl{H&05O$#Qqfr_ompChJF2=G4v4Zyh|a zB<`%~@~DEd#+9xrhdmbX8x85s(PaDP**;6O$9>C2RNG}NYGY!kMpo|kK||#-Q)X4yr8}oy z^R*hok^DR$hT+u1lhx{=C#sfHR_-e=4}850KU9WW%Wwh~6_#Ob87?9_(gs+BY_68J zNhy)kDD_Ecsk6Aaj8h(|QI+crL|%cpAg(YOc4kCT!90=xpS%isO9DZd&gJDq?6P@w z(FMtz=JRJHuUr6hg?uyNIjx0<%urI_oQ3OJ>xW_*O>rB)h!ygWc5{VAJZH$aU`|Fh zi7WPr@=hA2mK>e9icYkz+Kv z?sgq>QDRrXMQI@1hCIo;X)8PqV+Dd|w&8Y!A?hh7B^f>VQX$Ww(nz>GR@*_>q2-Ew zkpu`p1yBu0&=Zsg1tVBGMbgVqR#bz|6KD@l5h}DF@i;GX)%KuCp~3f#h(#Q3(~gDJ zomKNYEtO?ZGFo-Rx=I%^3Lw9BHZr%MlYFvl;uvSw>$YB!8TDoCni={}^BJ+6MX^C4L zw2El1S|^rr^F9E=pA-;;ts1e^n4yQdP_bYMMBp(?ocvlnc;beOOYt~`nj%@@!&L&Y zQt&u-^3K{9)?RYY4ITdR(l2051jFF&U)+)VOo>&Fut{izbw@>zQV@s77mt>I!G$LY z^O%yMjg1DG!6B#ho`^BiPG^^Y^!NW>qe>lo_~E-Ydtb;c{ke?p4^&%=C&ynox!=>d zfYWp4{CjKp;X{vSAK7kS{qKi1hfP7dlH-coC1fct)V$!a9n5b*_grWw4c(6pu|sB% z+U{05Bfk34bQ~M?6(sH9lfp^}G4PPi6ra&NC`o?{7 zYiYSjugtA~DEFgDfgw_c4Y=PGG!#wdw&L3+h1M$HXSv6{l~&OtKAKxd=9YULFv4n( zp(y%MT9l2y9={N$|5W;qQmXXy^qDD846(cSrFS zSjQQ~hlGy_&kD~AncIYTix4Y?IC{ON#qW+Ei&NrwAWlKuo-Ajzh~+I`p=41`(4*H$ z7*1Zzh>*^H(U$-4Z4XcJ;9R_}0L@94{VS4)zR#22wErmrL+j!Em13N5~8 zcaaKCa>-*b8j{-bq`hx;Z1I7iwp+ICyywYfiPc`SW=?A4;oEMA(`#!2lT#nNSF9M; z_MUj;u0&&tyUwqj-`joaXYX#Cc>2y|&31)!JzpN0y{?Xx8}f(AfZV82TRKq8Q>Nkh zc1rCr?HTR6T3W0PXuGu2T1G9O7GQXKl&D3(m2>54p+c+{kOTv3qe(s5JNyz%5uU;I z3zD6?+{uisGhIzQOub@{c`PN0O@o(u)znkDi=IlaUCwM9qF1Y@diPnQ_0~Xc{{%gt z4`w`k+_B=)Q~5D=Pb0<)F@GGbht-h&KxrVrFIB4qe6@NWe=C0hVYgd#qNtao7rExyOb#>809v8NE4oT<2FrOfcufg+Um?Cx2F$=crFmTq0?iL*roe{k&x&RLd zB{P3X_cjPW*Z>km_@NgK#3IT%Q?)6-U__aJW*Q}N#C;x>F_Ea$ESc)+bP zB&#d6p&L8M5$XYnQpAy4eA=TcIU=n>qJmG>a_u9rIHyEQ^npU!+&$EOW)OI;gf0yo z02zcVzV&*ju%nZ})v!wo?-o6CB&Faec-tUuad6gG=k!4x3 zc(}kr2 zt%t`@pz~&Uokt6=kLmQa#D4#CKgpIuLZ|b7Z=xLQlXSoP-Fwfu=bn4Et5`iC4)NnF z5AgoW6K1a5A^&%tyB0q#QWW6%H-l#^!1uw%iZLTAO?kG6$dt$wW3tN`r8OEO_1bK$ z6sqM~ZJZ`Mtu)x4V9&H4MNXDDC-h#fykt`ZUbsQlMg}kuEWRKV_=b^V@tdxT6xBwO z9_`PBv5Uw@Y}H7FRV*?h10oq?pp`<}Lq()7$jA&+QXQ(L#j-sur3n!_`@XvettZmA z+&WZ>ZS5`J97;Wr+BVr}NiN@8n~`z;{lda?c`cO=OEj+|dvQd*DWjv-CO>*EylUi* zJ&pI@_oYKEVfWvw&M0lpBD-<(HP%mGN?C2YJ zyZZ(YR%O>$RasJP^@!{(2v&b+d?6^Z^-C`u+kV5Y{OkX!qha`9q?(T>OFz^kCZ|MH z4R3F;Xmn8thJ=vVl=xwNU1hE@%^0jrjEWr3OX(Ur)o!UaAI}(bjlMi&Ly{>;6|6x@RarJ2 zL-4DHf^Vdxq~@0Tn!N1noFol`bW|y_$>d>{ANb6to3UD0QY^aK963s-izRClt}7?oA18*A7?5L%{JXpF9`^Yw$`ezI>eFIOjdKs}+ zdSY2#YH^{*oa{9w)#oI*3OqmqayB1V{ZXaExk3?;bmE?kjAt5sSS$r{QVM3l2xt>0 z3_Dng*?_Uc9@qro>srpIE(& z&3Mp`hi^lD_O8RXJ-lQ7*XIUtb^7c|X=0W$DI_&Mxzv$TbL`RKfk%$jCS(?x;?wjI z$;CEhbf~Ip36?cUWp$fv?iObP z=yLc}hi8+isi9S)&DGfw3=z3S)hmOcF$ocdQdd@pGu*AWl-jL{;c}$Mq4y>@+KWxr zicW`PY`7PM9cx_qQci7BVQi!`(qhzoY_TPWJ6pD8EXC-oWvv~XMSthmX;qcH1V7RU z^w$guD`!{2aMv)S7^x#`TXrGZy&w=H%Q<)e|qH~j-39jG{Lv63?cvZ%mM!e)+CYVR8B|oQS2S$^NgRy zmueNqG`a|)L}pdgtzF&CeE~l?Bq%g&K39J5`qA@`@yAI;u+8oKoI^D^}*=^o! z@g}o_AvQV3Y!1pda$}G&sIRN&7;%L`M@Vz&(=wmS}q#p5VcEiP3lB1-tOLtlOF{WeLLmWUP|gWUsKMRoau1?3HQO3VV|3 z#M;k?x*d-0L)F%be1jn$rK;=(gS|@3Avms!e7*3YW|dwO;~K3xLah#^G&rvZ@zYr8 zB_5!0`}9s3DSQ1{eD9E?fHc0CE@e`) zTn2eRm%*Dc`yt5ki7@@|Ihs*NNy=uAX9RqS=J z>Vr@*V4ieEttj@8>j}XGxvEoL@Og5}Wk#M~+3ku8(WNFD?bZZUQ+Hn1krwZ8Q>L+T zcKa&hHit7js-r||zUv)ZSI3rI@+PwsZ^|mQ=QOyJpw<$rZqa#wyO`cNTz z(1&VRHd{+85)(BsF%QARph@JrHx<+#fzt4N&I>tGjz*@g$fb#iC7GKtrO?cz%$!U) zGhee;KdF~m^gKkb*Gqc6CI6QZqNi1Ep|gh*0vH#mq>)vegq$~#TAU`Q*xdLyHmD^) zGWRJ2NHtA6>W!nJ=v*QtKJu0O60(cUFFZuOr#$ zuFEXyD1})ftaoeuSR(>H6(4++4L76{x$(_l~C!5bVzt=3M(e5GQgXDipmL5&!N0V<%zBgG;CJlHv z%wsq<)Me2o7)onv?Ub^aI3%1wAYFjo$>D>(AXg~iuTMHku{|Kgos#H+EGLi_>4V>H zq?l7^TL~M>XU!>vvejDK-0j}=h4kRCU{yqVwOf;4+nHl@T6LD98uN|3_-0uXtd20| zrtG~gdyad)yzWWY(O*&3<Xs@7Xeatvx)U0%G_TAWjH-w!@nkd9wE zu7!J4Y_cmo{@Ep|Xrpz-TGEn@F=eM#jjDfye4fdi-b9IoMTJRWVbPhU?C3-u&(c+@ zOgRip?iCRRf{`IsM@jm8YO>TqWufqQ+?^Un)E5^mc0zHf@|T}jdE8*Bv>EQ~Io4#d zw9ajpElD_B#9**hSd&&BSKsr0ZX6FWl{%zPt0(X1=)7THfrxYYQ?R4d6arrYtexj1 zmlPx)$J+Ta(E)Q~k5Yno8Y6gd2=qM$7MdI#3R#v^?^uU{7`0EeA+nIHtyGyFH$RnK z>qx2?I@Ms_ZZ%jNl1;@~iE(MJJ(c^YR%qCqc(g_qY2k%ChJo5k#1EYlmubUGduTNb-3_CTyER%iZYL})nJ6q(@2_(tS{DJtxR0UJV3tk_bEpbAd>ySVcgf-M0@{-R%ppU5;(Hhu^9h^*^JKUjZVi6H5F5C-2*G46`?7M-L$Jaq zAoLOn<%L97%kXuZ8)rLhhJyByldayVZs$MeI10K-Om@4c%ag2H%I)v(sn1S@P1ioS zZ+lH7|IR0$m3l3Z&#I)&ihPzIQWdf}L=K4zJEP)4 zNb^Z(WCU<;l+X|X#BpqiT6vS-UO9f6XU?7eaHY+E#XneilrJDt^63Nq3!;@G#LP{r zUyRCN*M6HtWwO7M5tJMq%-)dQm!3w1LbEJ66J^O!!lO!f3IE6fheiIpg+FQGXDs}* zg`cqSNeka=;THB$EPpqazZT1%kL6Fs@-wmgbSys+%O_*`UWzq~UNcwhE?mE+%fdod z1@N`!)Q0xpd}6d`R&KiVEW9?6FCbC+D4jo_&do4u`Wp0_XcL<9A8CYW3pIeAj}v=> zu2KI)j0DaI#rqp_*`=qE<@xX>9DnRhk$6<1#2txvgEQ#6oS)`=lJmWslZw>W$ACTo z$EuZU<@;3Ipkpdvw!oa8g$ep1O6nOElS08`$mt1Yq3{bOsb>Nt9IVOUl*BNJ?mRA9 ztciUJ{yqI zvva&mN$J^jQk8X?N_KTs$r%|u6O#eWHQ}R{J-|CztT#+@t23lmi>pGD(s^zn!++vI zpDBNYkDz?qqEwCI7x>Q>Yf9GdxI+0Qo~o3u66I}+EtOX&Ke^VPm$*SGUn$COS=@A` z`din^kMV4j*FPgm#p(m_J#}PZV=+ zF^?*SOOABDf}gJ7jtXwBz)^JRixqBB8<9L}V=;pE3!vnYRv}MntdMg{kQL*Mx2r5Y zqavdm@~Aa3Iwm3}qN2iDrQJ*kqghOh)mo%a8kP7C$j;cFRb>=eGm=Zn)6>eLBYzah z^<|Ng6j`QMIVy@HO5{9ajKh(f?+^Y3e?`7^k+)AI?h{HnuzW-VCqfNGMnhVh@DWQj zWl{wrUNfZlj42y))U9Xj6V?>y?BE6lmPr0ezIaC{N0H4_V+}~+_tE%T62F!bB=Ngr z&!0wpsYaYDwz(8TaiNt`=;#eDcacd>pO63JrGMggKB#`?D!KhcCW7BSky{&WHcm{$ zW|n8G++pL#k?8W*n8RO$+=E<|z*~l()ob9m%|LsccU18UtD6_AJTWPt*4>3rxB$=QwIyaL59@QKCB!u30@Q2!G9M_>JA zxM8)ibiK5gJ4*dTt4e#u*b>Socq1_9LEZdcJr&9w3Z?q*k$))qkf-!vwaE933_PPI z*TrHl?}I8Qp!|{5OG+Q`1oXkXSeUndhtdc6gMji&t1tWNcj1O7DxK@4*V^;s9>@`sU$j~z z<%fk)c8IWo%hGj*S>y6`1y*-(u;WLFp9_s+))-wJE$vWWlN2T-Q_wj{KEhpF$&;bv zPFbVt zhLx2$LBo9cIA5T+ZOX!Wr5v9tkV{`w#y{wjVB&X9f!~+-HsAPzLGss|OCxdv@vG!b z68LiYX!<^-yyU>}n+wZX_~({C!sk#P{956s#fw!%>vzx`qr6N3^)K-nU;X8%|7=s) zdTF8uUwLZ3(w>)ig0DR0fb?)fK(|m!+!ii!apw;wws?DvSB}bDQ2C*w-N6Ra7Wa zRPmd0+s&WO6y}T6Rbri1^0f#&Lh=#o`UQb^UQ2vn^{vIG&DLl?r2vm2ze_;*BakT- zUbzJ~{H}A;dTD{j%gZl8SW?PwM)|Q_?N=;Mcvspp#=8}~OT3Br#$d}91AfWL+0eEx?~g$#*%{E%JO- zA0j-6tVbH@;julur`ZH2TdBT2s8iFK*eP|Eh4kzDrTz}2>KQsQ#FO;KB>j+* z=*MUr3PJ!K?000p(%be%ZT80NkwqnfS-DYbNY+J=?>Yox=oBc>Oz5&8t6&Uw?~Y+5 z$8S_$iKF%*tT8txLNle-WNy7-ul)M0RkLUI=h?fCG$mEn)g~wAmZuvXcBiT2 zj{RG%-{Vdx?JUfy%8hsIY0d9xHkT9?7(Mq5bRBI=%Wt!E4=Hn7Kio5><)pzar59sMF_50dESL@1%=_wH59Y zLJ28cEEL~0pK}S(=bCFVDH#wdjQOu@>HOj4emfHRg$d^$6`eHc4>(ubTs^Ioap79W z{)N%+yq^)9(Y|LkAgRUhBaIzDIll095r3W?gZT4Le@Y20(mPse5<`fw4NPW>&)b5Xqe+PcDtk^USl z%uyoQh13pv)t&)oPRketuoHgZYl$2Vz)ypq$!i7}%kV~X{!kUay^8OvA{m{Ln7(yQ zOs82*qPmZMR271zn-rS-geA8lM?|!@M{Rv@{|rG&a=ZF-0=C ztIM&mY%_dIY9?z=*PN-5VPB=-Ds4nkls+LSF*33=6f(Kakr5A+#a?D6>KqFe85FTVb-FO2Uz|Ip2YC52;O>#grAPj+uTc;v9_ z__TZL_{<@JgC4{uv;`4w+Y(9q_9ggE6UMrLf&F{h6GoR#{~a|RPH3YUnnTuAeGBF7w2u*&fbAN!-UxLGH?95I3Fuf zV}VsSJgn(7DCNc0;kBLa$Js=YRBY`GdpB`c!bT}?ryKHcJK1?HZRZjR(YjlFOTqYZ)-bq+bX>VTaFS{ znG>(pr%*r`sSwD>rL6Oc>4KIf(kZNEk??0s@p;i8fs%-%gx%FI*wdV0iV_ zgDF?$|9tS|r9bdv{!sFKk*z5vUY`)FzDiK#J%28WGU%VzA}U4RrkaMTf=Hqd1t$WB z3Qoo@B6smK5-%eZUf_JOvQELu+8V-%2Bk&VB(1F4i?ctkmV6>T?K24{eC~xb;u|bR zFvqM1*#~Bs_%m50{%jHn&^qUJs<%|Bu*W8{*k{5LV3_>ceg8>7ZomVF>MOOLBBfKF1pks5Z7`aG$MlJq)q zT2anh-hJ^mibhEC&{3Ge^-iGi199B)-$m`9@T4;N`cUDGMj!O|WHE8x;u^-nV+dpDNQ#0p z7gW>e2(U)Sb4UGBIi&jv$Rm%_e-A$S<9`8?*E(|K657c@t1yzC^wOG7imA`~iIK0HFG{8hw5MQpL&%;Q;V2{GV1H7iRx2qe{jv zy$=QG1JHfaS?wXn(g!vhBY{~Uzb2f7p_oj?(da9u&#AOepp?W)q*l2KeiH`ReYbn_ z^_Y-}ri3(|$;5PKYaDrNk$Z=JSK5IzsX2|S=)~j*Q({7Zj|YS%v{5YDw9`wfc*o^h zPcw({Ue|OgMnsquk%<{6J|hveClV2FZs|siS`O1CMP|pWWXF_7n+!U28!2F|lO64c%7$6)?)8 zP5(HSwP$_TaO`1k`>thX;Wpp3iY4%qzH2p$=P&!NgIJst;=2xJ?b7#r*BYjii+tCi zyg~hz?>dYn2lx1{!`^uhm<3$J2B9xD1N!i}4_EuyBs@9i*t94$f^W_2F@Os> zVjYMR%)>P@+u$_}-`+uds>Ss*?xDX_%P6i6B4aA68yy~<9ld67z&y}5+h^WCd1!8W zba-Ue{FvG0aCq{}jgynZ~Fr(|xm}lLzT8R5OW6s99Zj05t?!(z@x%(E)SU z;Pfay)S$$;D6vU2dmLr<JIp9QC`fJw^$19U$ z{IpG@JBMEfF`j*5Jj~*10{tHsWog`rFosc=GIm3#cUp|zB*t3#L}S?Ro0K%hePRR; z;x57!jWx{(`h{kN9iIbny-qLw_RpX$dL}Uer5#Fds5J*g`)Q8OqHYD>$55KuOiYEo z9}(|;_-+z7rBU$H3{k-`@tJTugT9ZWwR8BEYV^02C~X|CjqN5nFhfWiP7;n^T6QD=^Ubp(gXX@8 z$-@U{X@1TQ9-B1}jLsYy@0&wGs&%3d!Fo#FGj=oh+3e{4K72DfJvf8;jhQ@oXz(C4 zY+{CGFUTdCp5;50o(=_YmX z(D>lQAlgKQ>0{qPD(mCPeS#+txzA$AOL2}>KG01sI}osOIU&T*s%HlQ5{mM%@XyX3 zD$UP7di1Eh&$n*u$I@oUbLiLqV6}eU5J)vdO@wo*a{`p}xsN8C`|vzHV;`BNV}e^j zOv>U&Y=|ZbO;CCSF%|#Rtrmp0-#3vr-a~T0&^}Q7oE74~NClNt951sBb^s ze81!oy2bM4vZMUfMuwcJp1mE?LOs@aUn2sMAs%j@ zoF2}HWI#=u$#30MTi@PQZxaoWpd;3`1BbB+qcf zYDGe09tF)u40bF!76&;m0iw5_B|#ETh9`Flv@&Lv3ZGIdB=dB5x@E#!EE}3@zhy)}f0HSaO@t>1Nh~&bOiCn^^~< z%sVjv-H1lr#V838*vY!LJ|C9X&nF7Xux&wk-4?=4; z$)-SEM8?E^k6@1d3zmdyz+$gu$Jt*&fBj$B3HAkcl6{eV$bQS7W6SLC5l8YCSFxwq zx7jn;0bGPX$fd!BultAh_89CbLV>p~_m@nR0LgZxcFnLc)g*6&R&|lKA`v{z9pZ zPed0Cl#l{U^6|degQ$~!Ass&b!Ve5i(|1Zax{IF52||-Z$<6Fhyk6yu|2L^vIwIX9 z$H)%(WvQ6GDizD0sD@OF>LcpAgL;Co57DG)N;OURJ0`A5HH(^GX+8-F3Q1glp$`8G z$CRzVP>Xm4_ejO4B`x4ZpGwzXAwil_)cLzmUC8f1=V`0GtaL-)KPE>HO9Lp z=As;c3s3;?;JaeHm!M23%9H~d@VODt1ZW0y0=fY^06S5>XLX77;z@Vo^H%`(0PY3c z2Uq~y4|o9Z*MJ8BXHe&3cz+!5O~4a?ZvmbHECQYeJOg+ZZ~^cf;5&ft0=@_MKHzyg z??u3mQP(Sg1oUVbJzBfF;>eM zt7VMU5?Xf-wJ)RgWz@cm+Lys=HrBk1nwNbwFMUpJ3#e@g6jy@MbVoVh48Vd`PO&;X zsR7UkXaW$vI|1E*>+t(2!1aK6zzu*K0XMCh*w^s;!+^7ZuLB+dd;{<(;4#4CfNuhx z0DKGZ6krkXG~gM)vw#bL=K#T?XUcf3xA7)lJHa<`6-XbSM+*uaEM1ij{@-!F1gtD! z1yFLf}j2lU`OqL8c8 z@`s@14?)Wxf|frN_`RH3Vn2sk{yj9P(1^cQ2WEK_W_c56=Ckv)4sC7#Gy<9c&45lo zH{d#yKLxlRFb}u^a3g>?!qxisHQe_w;4I+lfJXq|06YqK4DdMMn}8<(-vT@ZSOh!` zcn0t+-~!+|z)#TTR{_CdPF`)!Inh58`e#C^-p|lm9opLfXaqC?ngN}FZooFs?^XHZ z%I`m?kMro`Jo-3~KF*_$^XTI|`Z$k1&ZCd>=;J*4IFCNgqmT3G<2?E}k3P<$kMro` zJo-3~KAO-+6J&|c$I`-8dvR4PeQpmH(1Qi^U;#Z?Ko1tsg9Y?p;Xlv=1xwn`jC~R4 zTba{W=k0zz>_Y#0fyG|I*)o9r9DoZ@04TzYQZP9MOilrlQ^4dDFgXQGP63nipTqH* zfXOASEK68fmawucVP#pu%CZDb_<5L|0w$+`$thrR3YeS%CZ~YODPVF6n4AJ8r+~>R zU~&qW>;)!!A#18ZSD^sn1O8bkZ}>zuinEYF&SDL|0BQ6rWW@`R_bxy(I}5q&EacLw zamv4x3x=Wo3XI+|db+HL<+BQv?Ki89Q%=aLq zn*zsIC(WFE-<(f;F@*Rl2+6p~p1FduQr&J^zi|@EZ8MXRTC7zhhU{v|kfV3L=|>2$I7V|G+)6Iid+6 z`PlYr?bj3pH6U~1T>R$~>Diy462zfWzy(193Zc>Px&T%J1~6jS@%S+~E9W+GVQ5c| z|1uw;N%&`i2;mXWA$ar!L@q~=XAC^J3w?M_pAmiGevhXgpALOkD4T;XdJx`5&#@KU z0r>Gq0HY1iX@DN|lxOP?K*5Mvk016o+}aRU%WBaI zZb!#ju1Ciijzv?sQypj6o3I^%;{#|aU)^zrT!HO#@hxtXbndKdS;tx4*>M*7IF-E? z|K+ke_Oqjrmi-QG;m)Gt+$6M9J{BF|$~v}i2yJE0c6>?BBPAJvz9VfN+o2Cl%3O5RSscm=1H6~2&LmS{X9kxoi{u+Cx z<0g9rjR#o24tOnt_Ek(4S`GK-@Q08yv84e%i3E2F``>J`Egj1!E+jlqTqHIL4-^-P zjl14)rV|eo7k6&Zug9fhii zmE8*WcH)8J;?9lI*;b^Ka6$3Wxlvp+cbuj;q0a-DEg-uvf!}HtbzGOj2CRG*ww;vL znN8>{Y&)4vK=vQTu!T``JB5ESun@>hX-fjmqo4I~ME8<_x9^8v2kH=LJWP}r@gdyk&IdKX9fl=KCSF`%rxV&I^` zLxxrk8$P0HWb~fuQKQF@2d4Xh|H8&KN6U*D2Gk>cLHdiLmE)UB`}KPNlXH7m1AAkClZOYypG zCcU83YE(*vT*h-OLomwh?<=kM#M0_xY?`mEEQ=od#zDilI~wX^9%w4P`N%8zimoCPYl<4`o~J=Pg&EyzF$@*-ltOb_4S>o%*sUjlq%R&!CtJ3Z{|MS zr8ky#NSFTI_kl9g(AUNofB$g}vC3i9{rfq+-cebZJ<@Y; z47!e5Jo_?_t$E~-fX3Gc)eXLeabv4v%s9Ar4by+knpH7Z%Q9yH$hGKz$P zqhh3Z___k$wP;$hZVq^xu~qf;-051B&jYm>gCe3;AZoOumvh z-9Q8FR{wiPR7dMePduaChm%b`oq0I?ETkJ+M->c&+-kcK8(U07xv|OoUepY z9vamTnq!u}Kv!w~*Hkx5in;5Z4ZvxWJk?HbEHVlZJjz!+aTFyqfKd7ccpZFTSTWMK zs(RoE-@sv`s{yOtQPLTDf86Ka1Futl_LYwFc?95SiJ#Z(i$o|dPoZqP##i33#y6t6r*t() zkR{HA^xXzD5D%;>$;t#_RX!*7ed|j`?MsDo)rUO@ zMWj|jTWKS`#6u70lZL~AT)N(QID*hp=`1TXNXHWnVI;N1FM>9VCLAL1Hlg!60&Q%( zEh4pzf)8NHHU$V01bcr^1I5qcQB&5`kD@e=EC3Ps$1&{d4bbuR-iHaVjwyW;OJXWt z32iT??ZxqSp0>+;B{6KlS(yvh2>pHkwq+q0Tl5#y;XWV!a^&B_%*Zb>Gx7_j!@cz2 zm4igLvv?=jz8UK_yEl`^p4|Q<$=-m6K7nn12NQ zjtm$N6YPRghZ1#>5j|(pLgT_Dm>;*bR2zxev%#-MPtzvG!HF9)PVdF{${}+{hR=2 z@&t;aNoXcoA+;bZU;(b37e7jTpGIfUJ7_W-(Q9WR@SgwcrxtLu6HK*#;74zrZ-BNY zc=}pghQ5!tVjjEECc2Lu@D+uviXPqhAvti=1ka-1)Y|U+JV%bADrPktZh|xM&vCF6 zQs8L=VH{w$ON}$pJqRKTcYWSK&!8n}+MRFX4%}Ri%pLziFQZ-P&|O#4gHP~vMk%$v z36P?nYE(;qc$0XY{w6-%(G=VTe@2FrpBXLFlbO!!V*bGATeP_9(TRZCT$sWa3YG)OaBtJPL%pVQ^)77I#YjqsVi zyMC*|VVG~YV5~B}VJbCUH$P;4-z-{^ErTpGEGsR~SOx1t){ktJww?AQ`x}m~jt3oI zILA6SCG|^+C0%tjxV}ivPTrY(%{|rqfoG8CeQ$T~O7A<~Z&SLYOohLlz7*fiRFwLu zpZK5fA4{u9+mZG~Kp8Lu-Vc1+#nWYamt*NE={?i;q~FX)&M3`zIOABx^L-ykAUvk#uJd<-I=cAl&bHrR*?)KaRxgX_zA0}Z(I5%7o9v@zuNAhfW zUGqxw#^%k=Ta))ieo20H{>=Q9`CIe%7i1Qc7OX7TS@8ElLt#c?N#TsbErlO+OX@bG z+uPl~FOnB!7L^qpLIf@9xI$I|cQQzWdPmX-bArJ@Ri`n24P%_HDpC>EhE^W)3{nVy zm(8pNt}QNZulW#%YA)4$P*am@D5}wibFy(5`}0S4h8nbCh0SgwHuR(AhJ~EB;1?~gSx#D*r!Ba}f*UQ(7Gkk@ zjqW5~W{?^5f<~>7>-*_(fgXGH*rdn29_wY=R3+w>79~->D1S|UQvRd-hMap!j$7nd z?oM`SG***Qa3wj_YMvtiNI@aDm<@VH#ximg3WvkRuo;TL;?%=Vn10>bfzbny;XfC? z;Irx&eDpXhbneje@Ck=ullD4K=o8lf&}3f5XQZ32Fbtd57-r}emid@;Z1l2Pttd7v zY7)P?e^Jv;?HdcOYOr$Nk_Ff`f6;>N>I3t{DcChn{EFC{#Cp7)ZcX^{CcI9(k8Vw3 zBYqq>o9py*i7}Z%JQLBI%EmC$m_-az%nW4+lWMaW^xK5J0ucm*&)!9Oj~!Plv0Z7=2?mcL zVyHAMHN*_OA;s%WS13GuC6(qO3NC#(Hxv#5V2X-rfJEsZ9MK;N(_s8C0d;**C$uEs z-gS_Z?eB^yVVf*gV=C+vR%R!r^T>x&7_AQl#Et&T;Wf1Cm?!aLND%vl)oHbv zEp?Xjmdln73v093Eb=bwg~Q#jX+x~*5w?F*}p0MW=aqEpAxdZKQ z(G!p0{`ADwPw=?CpNQLlrph`l@+@}}rJ-z8gjyoiUb88{hI}EFFGG)WauqD7E{ybo z-lLD{SryXjk&5A4?3?W`+8Mh?r7N@Bd*t&Gg{F*`uFpbQTE}3Uty{ok2HHp67>j=} z*eS(r#o=OWk)bHm22^6O7U7UYCBYil4~2ke;1{SWeljQ98{oYZG6jY7E1YWqQs6L< zhgarH(P9}dvs!v!8Ky*$=1Vb~6j%%7VhQK6Ws44rS3kLQ?57FmKYMQf2JtL*-;*KW zSq9^zvFXDD;hDv242JgfmmaGd+J^JR9ow5*7k|3zjgMd2_C@vcD|a1yY~hL>)5HZk z-l>fCDtd8P<)&zqY3{SUaoB`Qvv1zOUzI=m@PfE0fm!AZ;U#(NiU_x)Z49Izp#t_) zT)ZYEYgR&_0zjkUb%ye?3V9<2#PGcGijHwJA%1>nxMaL7=Ulg-Ie^#bzC zSfUs38I$-sycUl$i{G^Gtlfsc#!r(?^j$T!&R!ctBE>~=?CvZs2CKBG<+C+AvRhWzg2@} zekNe#0)A|tf|dF`i*T)9d=mGbB>q#qXMy;KR6L2RXcceb3cq-I(QfCimYd=sKh9aQ z+ZBKJ2JB~9b{&kZG7`R^!gVUFQYr8*emjfVVltF8lU8z?aO5(v$h_pm*=ozyaNdPU?MnZ@w4k&ub>D7l{w!`xoIwWV^TmFKWUI z#g$C}+jqq?xCrw|hcY8cIz47KrfRU}NwiHTbIXVf?bIpV%8(N5w@}U3@cfJIHEr;0 z1_FS2f!l;!B>%XiZ)s8g(Qk-nqM;?J85z9`OU4Y|0BJ3ZT(}Kvx<$a9h698^QsFR0 zA&?>>wkb}7XmrOFTn`x?1#(A>>9Qi|#|9m7lMrDDw;5Sb@g?ZV zCFq9rmI-lAG9CnKHmU=B?%9s5j zQ&U_JG`!;nwikFED&X$Sh(kA%i5P5U3}ZFTR74c&GKG2`Z`aS0WMMJ%KM0HuUjS)f zW&wFqNWOrKxj=Uy_4EQcwEtuAW$~wjpW>>rm(PCk%3rus*UpRc+ZSQ}A9xL!dVMV! zis$3v_C4Yg;_GpG7y^oM3ik%GqfwC}3lanY1d)J$(EO?)nrx$`Y@-IR)nL-B!P7Lj zMuUqrIHlL2?;Np(!9T!<2^fevb z8;PVfDpZidvtlb!sgRX%agF+j##W}+2R$y2!dB)op}9ZcUoipuwgzKrbYiVdl%BILzr(EVy2xT&rR;Sb{ZB|PX&)GPIjZ&12 zQ>%5l%N#zzo#V(}4nM`=77jOacnmjHlJ{)e#%>@Mr25Bd?fo%y`)rW(*x9m>3LqP=OCy^bfy+S}H*p#w3F){^( zJm45i^tZE$`S|9LIk7JK;ZbJ!_s=ey z+J2tm7YTshelUIyS{NCmBt(Ui8ilX%RZL#PC-LW)`BAtbkaq-3{c|(NL`=4_CeUn5 ziq%XpZU$S>Jx{e)a};<@L+tacM!Rx82T5ZfGmJP1HuE; zbfzfxGI1@Byq^5La3`8mFe&|l?CuujYsERMCX9RkYw=C-y7<&4*0{z1Y{{-#%#m{KLZ!t)udR`d}B?SwO>9u<0ryL1Z&JjC#F$#*f?$j&NNx zLK#Oz700DIRNlFSBw6MfwX&pna=T=(0HaaKD=}RV^f5I~ia;gfL{~v@feiCfIy}0ZEQ&RDj(9xKW~kk&x03JP4UJ9?L(M+#g2nfu5&>1El7f z!GZLsb!EH)&*$a5QW6#beQIA(x&lF_2e<>_HWT?ubNuKFJUFMR9$a+vJ#Avh0yUZ-o;1mrO zK$L3als4q@%#@kN2vCMmW#RmDkpSHaBJ7cVJy0$n*qw7ZDhi6hYY5hWLMWo$l=Olm z7+?f(5U zg_#qUJUL$c_|b)r#U3UXAA9SykDp!n(9vN}p8dG(?JbWU`@`G|4UOv;K6|6FW6p|= zE2cvFk5HSKO$VB>p;Xi_5@nP{*@$Zo$ zcHFQ>PcHPlvFfdRt9Ot$T8?bGjw?Pr1}d@mP`F>s4D7?_SKNm!;)TQa&5YA~3B()_ zTLrd&356oAgf&1&x}nHG3>(xDg|1Ak+pI*JA);A)DFl{5@DjNH)H=Yotb^NngvU*i zrEm?td-g47ik1wxXGulX&4XY$^ecjp1Hj8Ko*}ICPCM!q31~K^f|htv-}&x{-cm-0 za+_YcQ)hCULg0*czMYy#7XeC_Y6P&8?(6~njlqPMNZk;pCJd)BZ+3R&#+F+KRL#IA zKLp;{fZD)DJO^sMA>x8K#|5whBOuv{yci9Icy24&1|A<=$Q|nVC8E{Z$~c~p!w*9| z5NrM=BEUXIv;}G%ma-5lu><=A!$HTX+#vj88z?d1onTF_9!S)fkIf2f-oVUguOu;Y zs0^Q5Ew+fQ5H2KW13tsDOdD{O3}QfCxC`)F+83mV@SW!BHn8!isrnMLlz*vM)=2G0 zFwY%-1IYuS35W0@ya|9~_QIRI`7C?$31$XtZB0!O9-#5ayT_ag^*SIF=xca6#IWxg zb9|tzG)|2)P7hB<%1gjd!X8&imJ&k#+nB?2&~(g&`3el3*+63LmCTH`)p!=3w^|I8 zQJIU?9aq>a;2#56Ikl0Vh+$xG>CPfhi5ptYd(EfK=OJuF#je?`<~R_?%4~H^eN6q4 znpG2I6Ch-?*=SM9bu4I-a3UT?*+~)(K`>>(Scr3$%x6s1Q&|uvSr7OyaVnKVSoesh+8+kwhUi6TnUg zgWwJ)t^oA=Zb=bqVHgw*m3s!NeLUcv!*`*T?c9Y12rDoEmbh#&vW=>7ue9vOjw`c= z49}UO?c06gAH?^>tKy%)8Z5<0*zr@gcu9O$+%C=}Nq7q`!E=6n>Se(d-E`!h{=0K< z^^qex{)#8|3btP>?OQw;=lldkCTSuT=Ry?az^;mucm*Dd50XCOQ{t!MKg7owbuTe? zX!^YvNCIrFwGd<}0hqc#rml%prMes*hk$$@;?a6MIvv?B;3WbcBTN&>5P-0drc1*F z0%eCaxJ9#B^P+|srMXwr1keVWO7-~^8X`DYxksmEtVT{zW04!E)d7JipcnurC=ob{ z8(0*M08j`p0NKQYPv8K9fdxQKSW|J+9*2#|IAQ4L=Y=qn7T{%!7jIk?n4PT`d3~U; zq8B-_{ZGo=UQT`cCqni**4qahty!Pr)A)z8{km2}qeYY1V>dLBtY~yfM$$L<)L*AI z{z+T~Zc4`)(CIe;1{Mhlb0THlF#<9OAeRlvjxnv8ZJNE5n$kjPb!p9Mj5Rgcm7L7D zSe9C#Y#q}GZnZA8HWQ?)Rf%enYb^#>t)fN=G2^y2_?Jit^eKp{&T(RC=u|7!6oGsV zgmb}v$D;f;>Sbexxcpk%;ez0?{8S}A}FS$GHGhZMJ@;AfE^8u z`I+o)xN+8$b>(Ymxmt94q&=)k5i*6CHOtsZg4gdqt- zqI^M72z)`U0?OUKINeKuAs-lAK=j^RHplt(d*Z*rOaB^AdF8zsV?JmXU&PZd;h-^R z{8Km?(m)T9!bSI%N3o^-oOoDV7N<|Z4Yw9>V}L5EzL5;em{u+ADx=jVole5`1P&Z= zBsgkOjlp2Q6ZRD96zp+${|3^OKhv?F_7|Xh8@|0E3E5RF5nI|9k!ncgj1m_;BVN4) z*z>@j_qTUU!SCSNICjGZFr_ra8K9qDbZ?}W)nYNT9Op)6v#;2Plf6J#E{%qgiw4!H z8zC6utqmn#PVPu%l9T1GTC1_f#K>z{R4W5^X#*=AHcA{+_DKDg{0=$@u)ru0QS-&` z&83cHr~3=07o{J@M^!Xf?OvG|FTyP^_3%s^edB=OoH9&%hVNGGFtGAI(|GO)apyez zlSwp8+F31bik3&1pOVbkxlwUbakhMQ`}qb+E4Rj#f+k10+tg02Mw9T2)#}vdR9v5m zA<1BII#~u!3z>{=%8p+ z4S0b%^KoXNgSkB%DqN`;a60R&jAtn;(4nwUythe=HRGSmqH(P3(Y`|a@@UBb=9 zn^KMX6wT`PSc5p&Yp9PV=zjyyzaLGClqB=K7pxK!+mB^f(@Fj3da_NwS5Fq{Tl8e8 z9tZV3^hBd~>4{z+aE#GGTnnex`29)NI+K=7s*?jVP^Sv8CCRlr83M*7Aqqoe6a?1Y zoI#bN#2TH0T9DCKfW2WamUAuB!EQ6tYWao%ims$7@h zWb)Nms6o2hk{tv)74ei}ED38O+ z+erZl&`F4Adg&eGt929GCrwfS^4oU{&IwT=E)%N^&hb%QHQ6*;zRqbRRYnIKo}v5T zYU2x{EvSX4&%m;{aEw-zi{tTgQY2_#*-cXda1y;UkX!>Fqg%vR=Q!#Bbrx|D&S0Pb zGVpc!MxX>@t+6pmZHWnd-kuGGgHz8h`U zv4)r5WxvbNNrWcBi>Gog7d1u7&8~nqU9QoWrMul;7ZY?i@|yGZ<`H8?P#+Ak`h~}xu z8%NjOr1K>HW^FL5s%k)!xTk&Bj%eRS`1(5W^-N7C|D6S!Vl}|U4&Ftog@)&>&PFHh z1c4zA1B(IG*bOjdI%G;nZvv_kc%q6Gg#2CNFh011*tdcd)ZZfhaaFpX@w%sb7fhXc zNa0c z1x%$wd~9%*S`0v#w`2kKseTj9jY|Wglvbj`Q$ifO$-v)Js{cp3X~w(XP{fGH;G8s6 zD=7o~@gA}jpSXkb`$X8%>tAuM8*fY8Rn{l26mHC7TLDD3*gg&$ek;Jnk5=s0`u!RW z<)=y*um*jq{#t!i%^Xm_qb5VuI7{72P26g%RtFjb%>g0=A_0=B)45y}J}#jysWFKp zDY%px$j8oElKD4|fvoU7`|m zAxYQ~81hI#yt$(NpC5JtrIR-BJbZ;clMr+_!ffnj&Rvr5#s&~J1Z=_|xR{hPu%f(( zM>nRGp}8se*w5SXQad(}(SetwuH%h{It2b7NER4CTfFNuM376ZDKAxN$Osk{jk+Pd z$-->?38#wP#LfQ_|B62t1>Q-Y7oO@s;ve^Lr^LU2Mfm&nJy1o#;d(L%5()XZ+JZgAF9g#t83G=IAa zF4?;q%N6VU8fvHGn0TfZWO!V)eE7#7#Q%spse~k(a4QbR;Vb4y@HK;lI4IH;DU}-g z7?qi4G_A&M#=S8n7y~ zf^EU1#bcfn1JtJN!~nUXxOZAbAMNA`;wt^SZTJH`g`(s^vE~kBXb(PXhDj*K-~wI(JR97B&BCZa*;9VC3*MG6CIAg&HF{g$mO-!noR~Q|Va9HOw5Ia62u2`R1(OnRnu_uD_4{km9PSd(a z$O>^R#Z|OZIEXvMJ)^~ndyAqq>+tXDU)%HW17I_1A@+D5*ozG>PGg@m+QiLRK7E)W6@^?JO4#NX_Gj_&C1GL5>o=%~0Y8pAU zNYxdIfa>n&9&deN-0ycZWA!&LfBNd|#)Vr(?D~DH_;vfo*GA#pPal1B;kcD!>fU=` z-{*_RJ$nBmkIcWPc|z@x1t-6Hws`>L578FzOXf)Yvp6!i*hQ0=M!g|wzy@dBA5mM( zE6tF{8D+xVO*q|zA(`~H`cpM|QH`gn@hCM8s<8vaoy7pR)FQRa$guJn$xq2Grt#oh z7#nbv^Z|2M66`Qwnl_;WhX!y}?y~fJ@nE-~fIJ9fT1oANq8^#H>i@X=c>4kV{Zy7WQf?m%W*wtEG zrmfaa0WVm9V4YU$b3J6hO$KZ+q=9e(+&a{9OO4iLU|GGw%EUEur`qWZz5q#5n-J78 z#TCWTEjzGN>o8p*T?j^$M3+{hg)|Quji(1@hXj1x80g|p1z4CA|a95TPDjCiV zGoRSEjkJ_zl}Dqcqiz(lS9^t`(ZU>`uYK}vkb@Wvk z8#br9^V~$`cDji>oR0i8X}mL~E9W(GnR@th=BF_>wLGat<&0Y-)Y1k{4pFPxP$Wi4mMCO9Avw0f7Y#p?d#ZjE0Qo4fsv2 zzGsbC)xPt-Xf)lOF#(r~yT{}g0?`e|KN0T~i1xW^A=VTa9Sl>47^AHK=Qjb)SwMFq zx$n~dlTO}A$LrJgr<1hwmFdKuj?>cvngiBvtz?rG-)n8MuC_8(tHN#%1d`tNhJZGT!}L3md!@8Nhe(St5^hN$PUJG#n>T(TzKsR0Y0(?+ z=viL$Jy`&vo%t6x{sv29PQzJ|iggJ;N~pVvLY<2iDpu?=g0V*4f?fo}R7%RQSMe|E zs|d=kBrAxPfKa%CU{1IP2~tzy<@ki5y8a$P{8GNI+8|z+Iih6)ugB={rT2W-A;$;c zJq+?iOw4&GN9usYX+))kR2YWWK@}FH|8sL`jusvdb)(-csBYp-zg&gefnT?a*U1l3 zKRpp0hqPK1uTfo9|AKG#uCs59WK?!iItHf+m45TE=r7+& zeQP3K)(!aJQBp+9lNZ_7SkemRQ#|w*D%R}4lE;q&^+3(B0{cjpGQ4-SctAV=e&)?- z`$Fh|8NrTi4keLlxL&U+yXrrpmI z77AKv>hTo3B`r`Gwpe9MuT3-fQ#}Xs?70n3n>RnmJ>{Iy8OnrDc;Yq(W8U!Q=a|1OL4uuYKm)=#>1P3wQM)Z53kQA1~pq zuSjDngs}wx$Fw$KZe)2}qeGT8k<>Gqwcl46VSY%g3AZl}}z+xCU}W;yQEhaW8+rY~~qfeh>DS zDqDS2%$u+q`(HmGekHn|EywR%xGbKC>mG_j<{JrzeIi|6BPR)bv^vniNueZcE!WB2 z@({!XOhcf$6zlaW!9I+WPz3@_h$D*n_2AY6ex%5M0z=Y1HD?K}x?u9nZ$9(N7kD(5 zuiZLfL{&xWnYLFj(xeS<{rhpO#z$vX^&WoT3bE>xND~xs+S&>5PXTES@Xz$AbSb(N zt5x^C`4=lOgm9NzH0BuQw&)bb!DgiLWm;1>#t(#+ zaVMccy!I|y1G(IZhP#OkYPD{m!VI;*)YbZ5iEd6*keRft0$5`|{r}KjPOW)-e`|g8 z#*Y6&fztSylYkdHK%h?~&0$F{*8*m=sk+oqDzV%`jAMwwzNK$w4 zANc*)BddRpp)FIpjBb+}B$c*O@76hom_l}Jx0|qX2mcrcGlS=>f@F& z+-v!YT~h{*usOeC&fIkV=No;kcGqd<7|lMK(Ax`FYHWaf>H66?N&AC5oSf z3{TwqHtsE6fUr!TS2m9yHmenLpDhefxg-u-`MU60o`SA-(9yJ1O; z9;IQWIprTm&tTPz&B@s{#ns*W?tKY6+gJUtX6KI&?-ad8oH2XE%PVHBq;}Y7kgb%r zGf+*Wn@KLWLYbEq%Dgf?nUPH5$_OL}0v=DY&h2)G+>F~lIDp*ACb`SXW$;8bOt3hH z5h##}tBVk1loDqC?U+F#G?Ai=W$1&NiZ^n}?ox0qUn&+hv8bAP_GtVfxD z<=l}I1EJ*F+5hy+IEt0V$0#dTre-l^*z{GO?LRLXJ3iEN?u^>ngP$($+a#XY(0-Nu zc{HSz#D{l+gF{er$3-%nw?dtd2Y5G-of1i@PuZTrs*{rJvI;_U$AG*Y+9XD;A7-&A z2di~x1k}6~UrG!~8cygE#XTkHTa`aFv3J*4;_fCsIj3*8IsL^447jny-LFTr|It;0 zYP$}VE#a&)`wX2`S}uMWZJ)8Ok}A3xRb#)!_j}DzL@3XaGO3>~G$N9p?T)yKO|KVZ z72C*OstD}L1_2icr2^3jZXqNvP+_5GY?>iSPRn51|LnEIlTgk4UwSU37&`Mg5{Keb zQnzpZ4H$9qye_ZHmN;PmKjxi&y?bZBf7RA%55CRN?nZAsclCRTc7A400PT3t;}Nhl z3`&KO7H+6CjEUtBbzF$_g#xfew893=IVX>Gv^*rm=y4~zOfHwjV$zx2=8%~&CtJ+U z!7j+on$()X0$c!<#JtwR$_Dc~pe+b%&;Tu+Bq9kMm{!v{HAX7XrxkK>Mif?QrI|C7 z6BGFc9i$t=vUsxLHkA<>Iq>8d13qqC@aMy?4P9o~wY_k~k*eDyHY0~IEbr}(Mvv|i zr|pgoeFzVjFHY^Gt@ayF!}vDUH>TTO?EL175$DlNW6^Lw@+JXiX zAScQnR8~q_4P0HQPXBM@bJ~EHUrLZoMP1hOn#Z^|Kr1~ljFQXr=(sk<(92z);9HrT z9SiH7Y>ABTnS_#(cpja^KVq^HZ@^>$#%Z*$IIIl^0tKm*r&Ck=H1=ujLxet&K12;R zpT(lnX>?k*HUxnSYjSD<-%}k3D;ycaLYAZ=#W1f!Fb%fou-2>rD-=S5RQgLkyh{li+~^mqxhEYhHQc_&u|Bq-y%9{LzzvIDfPcf1rQd5+4xqTp_Bi2tEnbm zRA_qc^yjSU`42%zI0k@_c<}zJNdaH5?%oSoUQO4oc<}IB!hk6(@{Nm%B1j9nEiN(^ z)OU)E?Z>+|iT_%+uA6v->dm+;1ekU~b&>9FqcKIGa1(?KPevqzbb&cz3I)`A=^)t) zH7{5xq;xU5d5vY5)8Zed5oCiEI&6k&&|=A`Oqi5+fT% zz=e0Q2_L-iGk*Lkc8N2tiQhu*;Aha+rO*!-KzMAV&{tlpAF8i|gsDEGIb&M}iDY0) zvP$WIKZYR=qGFOQtkyHc1mM+DgI(tuOeD<=y_3L83l~5Z#LL0sbSU)}DlIzo$sN`@ zm>g7OGqsQlKK}fEt~ompExzj8KV{; zq|4a<#(pROGlojMOGditNT3`a{qC}OZX1O&j1ShA0y{Ak>}0LaZnZcpN{2%WjHab? z^NaN6vhmv4w1g+E5lWY~r5#N>pVpDayUTT)n+tIaXVnp4I;Ya%v$I4iBn^=Z-eDx} zkWn$%DM#Y-BE> zjbckwK4NaxjD0^YoA|fDZMUp2$$9+*{%3hMcE!enK$!i4)|Ej3ASs8LZRE%sk{9s7#@<8;Gq_ zs&~p07?0#y!GzIU$m|U^vf0GAhu5764+hrw12|k$gXZDer|x9(pApww6k8G;aqi$l zYay6N`xyqmsu}n?4K?rQ-FB6V;=%!eXt&C((j&hIroZ_8U36VSU5<8POpv<25a|ka z+GF(7^e+N=(m8v2W=P6>1XJTNf|;Y%A=)ZagNY6W$}>z_zz+>736gm%`C?Qh#l<4X z{ZJ^88OOJB3Z3qmG@&z`3t18=^#JxGoFU(gyJzgQNz<-Z;Ri!+BO{K&PSm#%ZAfR{m$Ol+*v zHR_1Y1B1}%>=8gry`9l(HAeVT$a$k)Ua3)Pb(VxT7Cr?c9?V>b+1|F{pdt|B(Q!|! z5T@?t8pAR=ZCA2@$Q0k2HRnxBwiw@=Rh$2d{g=h|`$lXUH2(77Ix=K9cHf-WerSGo zsqPx1d0=nuf)y9Kpy?5XTnYZVMxz9TT!<8ztYs={DX3I&fs0d9nNPi6d#`$#*Ssga z#0v>=hsJA@VSZS$MHptbC{?;HgE2J`B;}OI7)TOVg1w}ZU=$EIN~l{yAxt>F+ir_b zQp!u@5LV$OtI`|p{g;2*J8Rwjx|jPOd~k4`QfS;e<8yx{$O*Qhee;oCOK@m67Tae$ zK72}6&)GAo^7|cp5X@0Ld06_mIL-Mweqxnu71XWFjFemDa+?jo%$Sp=&w*Y%g0ZXt z5<4bGvEwq-vV4wyL^lvK7d?asOd_p=Y#r)_1|!B!sg1MAt!AA;UQG9y1kDUcXp9ez&QOmJ(3;2!81!LeEQD`5&Hx>yfT1t} zU(?~jp{699$IG$mja@2OrG8@zVEIPUotSW%LYZoN>Pc=;5X#$--xqM;m7CK zx|*I6&$TyLnE79}FQalp%5^UXT6IHxMo??9X>1xfpX`#mTsFB4=>(6_R`wKFdLBr% zb{ge^*NteYLI%w6Yd{pGOgS2bNDqLgNv5^%$u?H5ap1u&x7nZ?3r9wsKES+K)A@M$HEqvl*D@-J%^Q@ zU7H&2=@i6E&xxm^;n6S`uDC8g3T0PYquob~7saQ?7Dn+~VlO&&aX-Wmu7k`>M)M*= z%!=e>AYW~ZakKG7<4NP^My|m)*GP;;PqC-Y)9ktIVeR}jgr}iJs0A^1Q!u^Tom6Rc zYV`sex9BOmQe1ZCDWwu_py&h@QzDKhevAfd7&7Mx8kS?PR3YWTI}E*h0k(tNE7UwT zPpm9xY5$A(ig;!ENOxH^%)oUpt9s@{+s}#}v+=W-Y3x6I_kV6K6aVU;Y{l~^Zbi^t z?*eX(s4UWj<+LCpVQLzulPUBOsO{J5%|;njXflINQK{D%E9I;VEITNtfl^RPqtJW! zl7u@DsZ{&1 zEblj7j(t@(6SBJn;_gB4DUwhZm@4#7h5=uRzbcbyoL7^6)n0|QP^sxd3nw7@g5d|W zBt-f2d4c?be5i{En<15emOQ@30$kM;0^e{{5L~L-*U?Mqu z(XmnNLa&TIa8#^dFcuVs!MF;58O2|3O8T~T)3jbi1=>Y{&&REu-@Rvd62OyIOu&=)~g@p0l~t0C^7feM9mwdMr8OsPDk!uuhCnkFltlaJky?tqU@rKaW|or4UP zH>_$BlHA(67d8PAE(JOZ=*lB_hcwG){3V=L$5zLu8eK196S)8ge6U53w{SwH`oT!4 zLT|7;#g@aK>@ zoer}c?xYqD{L@g^T?>SC0*fjo%E2^nPNh|+hYofFt*JnCxe95S3c6rLK_Rt&;tN*5 z%nN*F%T8Qy16HY+yKKUU>epYGWsYs~PwM-}HE$ene6jmie9->8Csor1_8#_J;msBN zqdNc4NB9^nW|r8+@qheG;%Bfc7C}8o7%cCexw#}m+oems$CUzw&^DA4A|w<_wp~fV zkOfFi&T+d{nY9^ynayg@s8oW9J0-)f(dAwQT1p=mL@)xXm1rR`RXiA0UN98F4z2j6 zJMaSs(y)OCVLY4_R1l>VDI`rvMTY~0FzY4&8uS7bp44a6tE!<&RFR`)2duT_;*LxbRpDc{ww3X`{j)2-Ng@y=&K= z+TrOtu_1Tx*hX&tUe=y_GGKf%eu(bN@F2{sSmClI*TmV;vNX_=_EN4&sP_ zo#jYsG-3prJOw8DzxioR&6`x~N;@!?K%q2}LMsho%B->g5MDqQpm9qnXi1p>>SD0- z;poZ<3+GN;9bHvcwyJ9NlsSv*ps62TFn!a;8PhjD#T;67&%L^gLXDCm}cEsQ@8;}c=LIs96fG=;G# zjKkr4f46RW&u13ApRSOD*IRItWwnLmS#Y`qLw_Km1X&S-R*SEz@OLWwj>K#)sPJYL zZc?pQk%21Q4Y)5mGs#}#=&7j{iiB?ZT2sE?v{ZOZAP}`l6|hsl#ipSq;xS>J2@7E1 zcXixRVFT;9&^0*dXBH?hNWB83x8=frJV_rvm9Svog2c7J8Ir>5JeH2`uEQy&=|K1k zCv*4sIccx6Ob26G8yUQ()94+-ZMLug8+#wE6yu-h%Rng8>&(6tvN<Q3IBqaJP_GHv*{fsHUxSj1XM65(!0=~8^~2@ zvWt>0)6x@Fk&h1qeA`reVJRq|%9my9pqZxLs5z@Oi)3lCof-Z@12Yt5IEUB_@ak|I zOl!K8p`fsbUP#@c7NrFIcmwnZnjyt^s{#zD{En4WZdZX(UVsgF0j?;ZzO}^)sG-YM z>{>Z@$>zy_{Ca=RwWF>3E5=T!Yj||TYu8^+7e9XbXgN+D-mto9$e>RiUw;1+E2j6k zf70R)pPM;i($4qqud3)bXVuJcmD47!JhXfDpg{*OHQ(E(l*#Hja?tcaeFuyvUo>Z^ z1RuPG(=yk%YmgV#p+Ll}T`^RNl}dgEQL|6TPs5sfz(;h=j@(O73P9DEWEjBwaL^lG zh+5NMLMF|aj4klRX(um>|A85VmVuo=K2d9$1KH#5S)O!9ng{+Ay0=2G1QM)s5jMYd zRB>8y9)d*KHdip+r*pYo1c5XoE}zSX)bH_z_oO=15RG(F76IaqTX@nGjCiZm1|kN^ zAv-7J-L-!kz>*`(Ln_4sMXQjsoCWhJUl&Wo6EGdG3?IP-SdN>-RpKvD+_?tNC+V)| zANkW?{&DJ|^+S3+AzoXvd>7QS_J_+)iluOQJ}$(sU2nzrW0`d0O7T~i9lr{1F$W_J zSI+(UUzH`n{4L_+`;JQRhV|FA%y90Aluz#yNkM))vkOq|CZ&6vCx;p11Qez@MC-JVtrR0zn6p~)@X`7?9mtP%UQk+$9 zPWRr`=>sKQ-dyX#fa=)p1|12MR;TSjioDIqzp=6^}HR- z56m8@SJ0sJh?)73T#V3=yYffPMTJ7A<}S&h#54SLE;TRODUn>FCJvYrMjzvk|Fqy0 zlf`q(CSStK@QO*|Uty0_;0AFPtnSiK(z!!nMCa1pggLu*m?PXX(xsRk$~LpD>^7D| zP$NNhU4Za2EfxWQWA>%H7M6imW8pJcCjh7fh(TIUhGiGEYZ!a`S9nJgtiYXE+r_|x zNd)H1T{Id78S#h6giL=h&7YQ@*R`v&NBY2YlHSedab9pqT!|2@gK`QgWxzxRF$$>j=6jg~HzUk3-UM14XmB@E!Pr5Ut04O1kC=437{_NiaudBaQaMDU=bx^Mae&xlVCN(mFe*{k8*`~YG`)%j)jlt3P`sXKcW-O?_2<>y&l#;Lg}Oe78asw*uaV!N{ur~ z1Ap9k<7Hz9Enab3br4$U0Dwf)#xkUo34f!rQeX+tVhDv6fv-u8G7u<0YjLAnitfZ0 zu>lxCQtQ@&U%Gg;mn>b0dpFLQ+92X3;V?OaKLG_^AD%t%;2Nf4;Kcv0w=aQj^0@Y$ z`95uyWm}dP;SI~X!HaA|uw$SW0gTyfAjBao24Txa#+xkJgpd>nQGk$?&?ba9P?D5V z5|$9^1e#`}4%rAGe(xcUHImLZbIzPI zGiR1_=K0x6m)^N%&8gbCuEtwlnjD_=gnw^sRXgLjXW>KnlzMIoYs`DFwyd6;!psdZ z&@%Wxx*9*y9e87j=JNK#ai{Nuj{gJe^;^YSR1 z!RSBqRKwE?ACCUA?Z1Yr>55*>$hI2HCD1Owk;JU6sTt zpOp->@STpOID^5IR6!P03OSETrszmUJGVTNjniQ2Owk}|_5;lm!1>^*_k`L|?K(%Q<(wMl`q+GGFQQ@db}9L@Le z7Wn!6{iCY+h;Etqd6BXmg+0y+&$_KN{dNYY<#VDY&ldgJPT3^S(!MD6>v9~ivGDbJ+{*1%9(55j^k`<%Db@xlnOGqu zu~26K^8(FDl4*J-S{Xm&-}|Q*?tb{+E7opls=re4WDaG!gipgFZ-&2Ps{`8yK(H1%adZX z%A349u&I&f`5V6oYz}N{5-G_L*pHQ?O@aM41rvy|JP3VcI-mBeIh$>Ih?#TP2XZQ7 z(R%iCdHTR}IA4#@c&YKS^mr;?gxyxmR`_5neSU+(JnE$D*Giq>jI5}WC8(2GjsjVl zggW`%B>wm$-Z6sl=%RkEHKh5RqbNPx~K0lXF&E>g4j)SGBJVV}6V3VAo zsYT4B6y|hT!y_Y2h^AneVvr1bw@8mmuS)Mr8j1Rf3~?gL9Jks!XqBwiRC7)8YBOLQPo&*pgum@{uJB9H`} zEz5s75fMlNcWG*|s5QH6{>=kWrVsW7K5E#=Gd6h+@TI(z>Pm@|q4!#{vDZpLs3J|6%WyMj=iOnlPk)Z-fPbuqnxTC{ATvGD90!hBeL{h z4vM+CH)oPk474`yhT(F|L(jd&d)Naws~sy#&maJ07Pn<_GtR}!(wbbvu=%Dpw=j}w zWEFC-P_vj!6K`n{J01E{u-7IcuIUqw+6;Ss791S%i_+8b(s1)ioY|b0mzI!dNsNn2 zOAFJ68;xOMC0W`$vo62Rke*RzFS5thMcbplj2?`Z?MQHKT9%v~u3u%4lXFwz_^Jf* z_(N1aY$(F;!xo1!J*2>9!|NubIRIfp(6pV>V#7o1L8|GY&5s4=gVHrdY9&|^S z2PbwlQVFJ92>Z4?1jo=3cWD!n25=M^ZLgAg?Y1TwTq5iM643@W6gnB ziroP@p!Grz?|^Z@SmaM&UUc-Prx+qhr=SmE`kJfiYb@jpedX!eY`!fsS05MD zKB2Fp@w?fFLXSA~2pVx??}V)3C&tLXk39|iBuBJ(preqlDdZm)=7?t$WmVdRQV!{# zLRT}}is!732#E-j_^&gIlyZdP4Lu{*310FQUIx=uUJ^ju`lQqdHkudtyCL}9gTGUF zNfo>#_S%w%pHO&_eIfXLgO92C(*sXsjUUDi)|I?NPdq5}G!K3^$O8zH_}Qc!<%u8< z(0k(hdFXvS&h+AxEaGFYusEVy%uN7DXyCu z0tH4w@RWm%)<%ZHpitNlnL?p7zF|GLTzIcF4TVElB5lPvuN8q!=ezhl*1%m`Yrn@o zZBXJU1ct(*yvBX}Bx&&hMSk$%)qP)2eN?fK-#K2P*6#$=@9&Cotol&-DZa=;9wn;o zo>lOraj4!$632&O^XL#B8OM zAsyjt4}!V;n`S5Mu(dy7Vc68QMvbc~4Vx2oYnUvXkuH;~}>@_9WDTYFE5u>w` ztL00@AHK9Ua14K>?SW&lY=^FZ`(9LRa;kN;MU$$=NTKyn5TSZ^&?lIYm@LK9(i|52GfJ~5 zRT757L(oaYjgH64Nc3dQ+2##<50MM`5AR&Fapw_oVE*Aine^q-o#aO@FCVbfZX;J_ z?be+?+lLre@F<_>e`P-(hXX_lt`uk@YssN}m%QxC9*;h3Mj z!fMT%nztfvecrCTqj?|Y=}d6OjhT>OuZ5`=)U%Rj}PPpGMFEA~sMYJ^XzUP6@Fz>#A zxY%WEi=#R{H8!szwI)@H%1h0w$g9cIq#~iS+oN(45+=Wb`(-Xh$x%_|UzX!M$E0vf z?-+S5NjkZ@G|5t35S3Y-o*Z9XjgZ;ZMsYxfPN~vFoTf)urlJ>dij@e}#86kKX@Pe3f}4=wahQf5+!No`I;6(L%j2-Fhz3`eCKJ12g4IPP#{9enHqHX^>{1NM0e{}=`Q!czv9>}VTeCBQWigP;O7kIt(z9W@& zc2D1v&$c_K&AaTr?Y@=Y{t=(lH1mAmlPe4U{wZ`x_;cyfpntQVOFB059!5QAb~LQj z!7qDr^K~Qag;Dr=)=f9c2zxjmkNmb^!gcX=tS@C4dtpi5Fm{j@?ZqKl&J8HI6OgmB z2rdpmtscVtW(c?WKM)JqfnFAr%TiVDWCdGkH9>scHWgpbUSpqu?%^lg6YQZ+;5V6g z)h)-lq;%{Sm0^xHHKizZvY}9ttf_M|EY`xph{t*AOVSv#dV z)@-mCv#Md$E;h!e1>JPSp-Sach3F8eU10b|+fm+V42Q0$N|7^s%5sWmCm|j@*%>$& zE4GqKr{F|`P#B%|T^T1Eip7n4 zQ?g$n7oUdXh;NX!^ntw(27dD|ui)~ibDK8{N1uf0fj`M+f1vvJcij8>k)r#qo)w@aN(T<1&&JO+o5I5@%r)lK@b)l^ z^TLuNn`g|8icgKV$IJ0rqb6JKk!!jo!Z;!WXtgCU%@K&j&sN=?UFpuu9N zb9lhVgo`$>g_;K^U!>*PIob+xHjTGtMInMg92o8-{MftLdR*83~Ih+A3%AK)zbkqdJFPn!378)w;@?CzefCRgC)XA#Sz_E#?j z_`!cn;awNGDX^p+HW7VkC*X6uU$s5wIqWHMvFUT^Fu-bId!EeVo3jpPNscTI7lWwOC_6^-m{FrfAmWCtb|9x42cbFUdg}r z4d#rHyEvCDbPDI-XuN$^(LeNAT$5+d9kSf6!lkhm_r{62ydBu@73B|OkC}HLbd6^I zguU>F!eQ)S-a=0lI+|}(dlBk9d1qd!f*tG!m2;Yc?v;XWT!J9-&O+V?veVfR-LN;` zgWW}b)T!{8Y;sg&&86|*PJqxM&NpBm>qG2g znc)AgHA#EI#XiV8XrtK2g8P34h1$*FcfGK*FQrXawffe*9m_PAPj`2nNt&@?Gn9oQ zWNXezU+A`po}^s(rHcsS}*=$cWjOm%>vXu@2RaO<#ml zta|f7t2Hgrc*IN>}4 zT7RTaGD9fbN9G^;T*yfJ0Bgdu)j!`+j85mjM`paOTy+`Bkmw+ZuY7%cV+AY|1libjI1n=}C8 zyF>=Q4t%YV0{yr?3_*LK^EihjZ4mp3R)>)`5+%u?{TxS+{#7}6G<4=@=&+GEV&n~M z72u@WL3bel&cC(l|b(h`-J$Z&YT zYW^7UISn}5K~_2Kkt!MlBzpH5j%awki zrj645GH#j^Wredc-5=DniLKOsOHD^0eO^sRvZaP)Sfz2}4qi7re%$O1=3))Z25{oD z6RCRKv)h4l&Yc2l9lo`(rvN3`bt^(l=zOH-0H+;!wBTtQ_A}do-68%`E^egSSRrGx z+)Zwu`wmxwt-w3*7%Ev`m(qXLP`V!TRl zf3d66iz=`c7Zw%S)^@pD8f?YI_K@y!8rIDC| zdf^qCA%yAn+MG6Dr?bJ;>g-%^Yi|rHgtM)|*6Q47TkEoQx|-ZxpQ{r}XLqD^q!I;82HqGr5;Z&Fbk ze&2{+T}V4ceb_{*75TIXT+&NYh9=~t)LkR;?G&}wj=EMpQ5~*T+ZNR^$&2c=33x<> zP3SrOLb_gv&%+ur7X4o2MP*W3R_IW;A!^!?mqLjTc`Ne19oR%O^$o<+I`QtrckPfV z)k08bNDFQkpNT>*cy9r<8`T_xw2}_B;5CwN(gPdr>{hgfG=#7Shjf(cNzqwq%~T%M zEAg(>QLFehC>7E(YEVQEQB0gr|3*0kYmn-cn`j~R?QK3+EA^0_ z8*N_d0BydF9j-=az0202uxgvo*NA z9WBm{K%`t-oh>bD-rhnR`Y@ln-idE~oh~ohH(GLghpUYUYxPnYzE1brE*~;(x4C^@ zL7;Q3yT$F>Xv0JeB-6JYo$cV4TDOuzx2uziQP?B~J6c?=F3?2C^wHTyxM~;d6nz4z zyAM@fj-_`y#7(b42w>zOL4u*ds}KrEBC=!r_W3%>?e+~DHWWJ5aiJa~R3XZtU;oK$ zgMCA&){r)l%qh=SXwG$uCYh^p?(`O}^R)th0hCD@@`BBn8YmS(ol3Cj&Jc=MuQue7 z&(Lr_dXy>wNkz!qjX{z0p-T*nqzN-Rob`B9f5|6tiy^C|5ct=s8Pa;C@Iq19O{ipQ zhr@(>@y!B^XfxStR*gY_Hb!ohh)`jO!VB9wo9r0xi8QZ$!Q7d%t8boNAP9gx%m!(V zwh_I=SpR;3FDX)^j8pnr*o}H-z==*HtVt965F#=2F=JK0f>pv;76;qS3ZHmd^G;&P zIDa-C^CBDk6w|SLor&0m+3;D*#eV2StWo8I;zDpyB!==yY%=0}O@Xykh8vj6*;IG| zOlRLh1RMv3s++*)Ebv$fJE{s?&tvn!{X%eF!xpi{Yzb;$DZ2$?xfR>;w;^`L3bvB1 zVs&gaTZ6hh#(n@_Z9jVnE3bcK_pqRW8Y(6v%lhu)gx>NY|f9_ zU$Ec%H2WL7%)Vhyvg7P6_69qF{;-}s2xU1Bb$OG$&E8}0unX*6>}oZ#U$FOKRX>AK z<14m@{hIxf{R;B^Gy9zFgca_F-9Y-<#vX@6Jy0*wW9omq(a8RUG2ssMv70cvx)Zk^ zKEXD#Z?i3IE4#$LU@x$K*uKAIAF@;I$B5~B8vAIy>^XLhZD%jDSJ;bOqwi{S7ZuHz z71oY+??u~lnHt->I=x*T==|C{NwN|oCt(dz781puHv%Uw(hq09`l)b3degdy>~FHo z8Kg-6B=Py@_>1`=>5BMlgk19(Z*ltCkSF~@YpnDnU+?Oq?-V?Gib};La*P`j1!fK6 zEFWR-a>jonl}X*w4%s3X$*)Ug>|Lo$zN~4~^lH1c59yZcll9ASNkX}y3V)kLs@%|P z_|$MYOcyq8_=P-zuQKE~^g=G;rC%Vmi+4o-lBJ~kEUX-H4UJ9dCTX+P?!A9dA_ zy6Q(=^`ox(QCIz_t3FV70=f4i_kQHwkKFswzl_YeA367{Irm*Bw;try2aUTC*!09S zz(GJdsPwQ|D5(-K2T%ndc`pGh1>B9_w*l?}_yP9h?MdG*<%V z0IC4<080Q%0e1s`8{i&*A8;>VJAitGYw`Cap8Emd5a5S^!+;+FjsTtlJPkMsI0iTl zI0fhhJO_9la2jw1@B-j%(0l=)7j5!dZLS#n;r@C6^?9RZGz;`r0_Fg!0P_G#080V2 z(BEtJkAZKl!=oQO`oW_gJo>?-A3XZOqaQr_!J{8M`oW_gJo>?-A3XZOqaQr_!J{8M z`oW_gJf?!jRM-#Kmr~C)xwxj3uFF9WIOqWfJ>Z}R9Q1&L9&pg}PjH|}De9`ap91|> z+Vr*i_Fz9;0{&M*iYrCWmJR7o1e5?K1E!!wDU$R+k{(FX14()yNe?9Hfh7Ic>G7%{ z$v%uMeHdB#FtYSvWa-1m(ubb#dXn@&k{(FX14()yNe?9Hfh0YUqz97pK$0Fv(gR6) zAjy@Gb1{T^OSYwA^i(adz z{GaxM;mChFYOf#M_CxCZka|C)-VdqwL+bsIIz}qsyaUic4n2?q@#6tM9`TLms&AAY zCD=m$U)Tjb|3}^V|6vyxgg#z#G!1+LyRa5DhAVbS@~|0=cp>~TUXqwC$e1lm#4j{U z2*d1V8pa=*1;k?pFc%i;e7q7c2dKt;V=-m`NtglL0^5}A|5VujD=9(>?D=$dA1wO` z?7Mgsu!q<_BgFd%AwGBc=*D%34}a*W1@6ySzIyBU)BdY)tXPcD&c9A9 z8y)-j4$BPOOX?SyfC5P;_m^-y2FLb^HJi4ac(jg-5G8nwD2L-L{lhP;I%`e!JU!d)Xiza{<6p|r78h~3Dqc?#A7}1>7_&zu*;2!3Npxl(& z(yyU${7(u|6c6#Zut66Qb%{ZiL3nO1d3Hf%XElNXOAXHrb=bz=h(E9(e3YEyG;+_v z#=;Ve6hNhcdQem9ar6ti22F9cq7GR1@;zuV_aoGZe~6~27umIngHRWo+XKxkr?#UI z)rgK$t?<;XXfe45)(Kc|fz<}rq_keX7| z%6Sh>abJh+HCWG~R;ce3uMf3SAHn+Dx%aq-Q|I`*Q7g{?=RZOlId7)6+!&l2Kub7( zL2mAMk(oPAIDoRaaU|oSxsN&DMUB)u=oM0DY6dlvI?+!+`4PO2vm1@WyB+jLQ1AC( zjidF{WfbMKB0pD&9MnPNr^e_0!g&(*w<81pAS&j%Q8DKTd%c0&L%)b>=tt0E>UHFT zd;FY7k%0FnL~)KG5oZq)a5SigUIXvhij(Yi2fQOqd#KB!u#UlcJFFsd4YcJL)Xm2G zAv{}x;+*Uh-3aa3GN?Npg7yMEVcP?12VB3G^8uRXe1tlHKPP~%+o609?M>a!JBI@4 zwFCG$!P1@3{-%}x2=Enn!SaFdBE141npj?Zgc@MmKzKFJ2f~YmE7a?L_L%Tu;YxTx zc;*Ef5xRfQ%6k@#v%CO45MIo$zy~MGi-SlF+blx=>wF-*Shx~7BjbR#S0Ag}acv=LUaEvNp3#^BmLuYGuhRM zKwrS}MK~gRM(EpHV5^7zO(PMy4b9;K>H_r}>US2UMQ<@#ax5j5nz=c+#)6JrKc}#0 zEk-z3OwP^yaqb6m_s`DGzCZik#cyAnzIf{56BiF%yeIuGxb^cE%wrW1dkRBSu4||H zi=lorhs)y&gd%Z9rbH@}XDO5_wMMJc8;sc|v&EWYvpbxwTz8%)-|O=S3WA}+a3oq( zTvA$AUJ+v|tEyqdsE;=^HZ`}jE^2G<=Fw(u7+jnf8Xg%%ckbPH;DLvZJof1E z6JPuKH@^A!6W==Zbg~E^Gb9V&>5lSx3Cpl zeJeWo?Czy&$-$Z(Xvr7$Jc!VRmwxioAHDnxdI7zTUVRPDZ2j>o=#IN@zi0o!`|iK@ zONY=GANk6|KltH`>k&G?jeQJL+uzsS)!EVBwy3qGxv8-sUSC&RQ(aZb#45_mN=u51 zqLFYx!0+?s=enE@yDi6R)+*&PsU%Y@5(@Y{E{CQt%CEK6jaa6gBhwtGEgtuhW7{Yc zj4mh`nYKVt-KVdawvhWq;nb(DWZ=s2o33P1S2EYH#4<}6D)Z)BYHgP3S88mQb9kV= z5BBe=vGrS~|IY5Wu=^Y*dyokSRx8|Lsnt%@Sf=rarFOb*^Thtzks5D4J}nki+p3p| zy!q&~NDRAT*qhF^tvii#D=@o5<<^#*rjQ_$ymp#))Q*l#x3%}x))=hTes6xmw8REa zf>WrPedIK+dYaEZ(z0S2s*Vm=PUkDvAK_fE?_ z({5YMw0qmTTA<^y>3myF?X-tHwW;I!dzx;%5>Im-GMi=pzYsLX_V*8<9ScfE(|cnStOHK%-(P35)a@VHKYDI%*AkmWX4`){BV+%%TA(m$>zl?<{_Fw6blu(k)3T8X zT#{~VT}RWjqJ6M$nsU@xCPtz8@E@~TiwssdG=L>Y9o+x9_D^#h4P&-ipz(px z>0L`eo>mf8*ksd^j}2Da{w%qr*bjAtYb{XehOrfvX|8jcNA6m914tpcWk37?6C@v} zHh(w33!L&SOR)_eL!MJ>s~t)IZ=TS?8!g`a>9{Aw`mVldrUt0NjHbn+_H@7xcZ`kz zi&hX$w)ai@ZR@6$wyKoeKmn;%?TXGm_Lfv>?Xtuy3k_yb_f-s{u(HrR#$^uIcxX#jg3#6M+{@o)5a}*2J1A_4-D?N^)2fs zf(8_FUxe4e0?nGHs=NA{I&Dqu1AV|%Yd?F2oFI?mIBIWtjIGa*dJKr%w7?;-^ic-7 zA1;(Zfu#<1Y*l6OJI!|pV3h&E*-|2^Rb`ewY(Vo@Lp7$|mfB@C>FdbxrydFiw4*vc z|1=&sgy&Sp4OZyX?BdO*;It+EVz^yEh#Dv7$SK-kfztwz&uUVZqNSF|yrs{!%+_z4 zuuL;;eS}1WJS>&d#9(Qj;!0Cj-@>B>!~!xQE1YI2mnP)wz^T9MFu^Z?a%v9GYsj=6QtYj zw>6CIw{`ZFu~&lz*C@9G@rdqxIB?Ok1cPf?hv z9;xa-ZHIGx&sY#**iwp=l0tHcg&dG4b-;muz25K)gU~MaEQc*%kC&dqh%HN91Z5a4 zJx8U=Wb@ZiP{v7>F>F~sEWjo01PCN3_FBsr;m@u86Z=Q{iHsvPPz3(*G`3X$b!-)< zF~!T67TK0nO^a<+q&!B-W2tf;Dd*d&rm-4(^SAAn)!P20^&)7Sg8l@}nMY=D=M3gn z&*10`=AE1SJG0@Uw7&f!<}w#?;YG}QC-ipr??ZI=+nDbD9X)4$@x0Ew>uGGcw(AI`j~2c`)$ceGeXckP|qB7u|`cS{3F^u(~Frll7Cd z9&5XGia9f%GiT<(15Yi-=jNVg?j9Fq)|r?2mr;Q+X6)D)Jp#83!#V`3B9zt5g$i(> zB2s!MeTk--UX`{k(8Kh!_0X~IMcuDj)Q5QwW>qTaFJ?07OvC%MRR)I)yGFjtt>lYRtvw@O`JdIz67IbNo3N z0r+i$)A+7wM<@AZ+6Sh2cTJ=2fx*7h7~k8!=bn2|Rd&;Ku(NM^B)h+9dJJ|Lva<_z zWZ9?HsH%VC#*Ldi?1DEAZ}bequ?KCOFWKnXh{!%B8w}?*ZbTb5Vkm{5)ET%Vbsy{? zk9L@+L@L%A(tv$*mir2@biu-DL`np9`P>Jj@WyXaNvzQSe@n{#h3CD1UP3+SJ@&~x zXdF$U+u8kD^fvshhd;8sivEaRhU>=BT0qO+B}G_3P=pM3<)l@aSA0g5OKD9tOg8N=)e`gk) zdKPt~FVN)qhv9r`c@dCD4m_<1t%K5&Y~ec8i&AcY^hL1wK6(`GK&wy}DoYnua?f7- zB2vv=LQkQ`(YbVK2il$90~kw-*!`D*24v|)39{iSlULA6w1YZEj;=3_Xah$0$J7S8 zjb2Tkpnu0HC8SWc^&xq4=@Vr~INasXD11(`0Bi zXpU&kXx`Ndv?eX1eO6bZ`=UNWzgquu!+B%Sc%Sk8?ETq4Fs(HG+-x^LVF_67vudpa z*6-%TZCSS8+rMCc*HPmbah!K5;cv+KGuH;!Z*q6#KJLEH{YKus9-gP!v(~dYzbAin z{`)wt~aKs$gGmUGT2p zvEZ}8p9kL$Q6XdKj?g2aGohb`-VI$VR2PmF{=D%0FcsE^3&TC(A4k?j?us0VoQ=E| zc|XdFo{#=2`cVg|D_>cDvcghvZ$&Z|i7k%Z89N-ij41Srxqsp}!Dm4u z4XR_jy%^VFj7ufhEy0pQh{MroCv`h@r*xNeb2_d?*QTRr8VMg(DBzY@?C5^Z3OBxMZZbC%GQaG9E`#*#CQ@hoXOX?n9HYjambs4`d5P3pP14A zegT^&TFs1Ciz><&~)D{-Y3 zNu2t~;h_1bnL=in z*Jft*H8o7@SgLp=PpzI|T7_-F^np(4XcZZ{|QR=FTEWURnc;W2w z(8SU~XOCymnyQgK9gc#5-EGUCSNa;li^q~-RbF{+ZiQRL-AXyiI|5bJ-od6qUNR@Q zEwR4g@HZ8oTo$SivrqYv22PKdn$vuS@>H* zSG10(O)gqI_W|!!?oW^cxqvH+P$yc#lyr2qwO{JQo$a0NxuUW&!E1GAa=RzHvFQxD zraWU7VNoaDu4+2FD~h9)XT1vD*@MtsY-gn$6q|V?F_ZdUpu!0H$jchp*>i>EkIv{l|uj{t1zMUN|SI4gYt{t6uNv+IYl9yLv zlS*wxd3mJ{8TUKvHM`nBb4`v^nv=R_cK2TDw|8=Q%TI2ps@igL`SP#d!Z5ddeRrC8+v zwnec7I)RD8Ec#CRsJ zA!4pre`K_G_mW1lue+-+ShKdx<7-=4S~cF&lAE0J4G;D@+Ij@pQGeCpmY+zK8JwOW zU4FS8|4AR~oTzHrxG0wsch`kXEBjnE)p3u$q_zu85*Q0G@u}0u$VmNMG7^Ai62b|) z$S9zHg~)Sy%$Z87edt4QU-AldJBvYcPs_Og;GY&{#^5EJM71!w81`9#AQs zAn5@>BbAQ=LT6Rrs7gZPMg_BD#XUdTSyHm|NB6AQ!6>MG+dh2r3^P=8>}_m)<{51M z-O-}O%(vh8ki4@B-r2^!)5^%vKaPp9SR*?Iy-+RtH~2Q;U7)*yvbPd5@G_!$!X_$9 zrKEsy;R+gWS5)2#FT1U@^fq|et(EM{-uO1NxajEbk~7adlYHmxV?{&EnKwU#cXiP` z`WU=R4!WUnN`|L|cpD#YLl{%UM|#6WDr@79@YnHaDKaC9AAnmCrqWJS;zE^JGInK9 z=8VY#9hywccPMNMuFKIC$ED$?ig9^7c>)i_ zlRqqeDwKRFj{7*5AAJeeCcpRm(Pd*to=big*ZlCnO4s5+wpelSaJ{Ez7=mv-nkXtU!Hss#!CU996ysSd2aCOQp0mc?aCgGy<1n@cM+-fE)HF$&=sDo$+&ftCFy1q0kO z82M+gU-mP=N@1%iM5*x1;lrtGj{_b%0rgZME2H$QVk*ilDi%?qL&xAj+=r!V6#F}H z2e4K_AbJzXI({?2+Ho_s0_M*Ns8*00QWs1^JPugy$FlSOf`A4z_|~oXm$!Vv&w$EM zWE|pTr^lfjCd)L5+{#HZ(%7b?eBBgR$Er2b17SEJ{Rbo&6ctW&ARrU~sGCL+PIl>* zGh1&vJ5^LP_4Ljy-`-L>t2D-zH#UvO42IaU#-`0uKd&P?#On+ z?RsCiZLCLRE(vf71Fc2o@&bXz5q7M+>IsyXMZ{18woE`h{s?sPqbkOwS^FFmWj06{ zl{PLZusV4>HP6YTd9qAvrj=*h(zSz6bZZuB@b`pEi27 zTUTnU8Xd@Ky=`&jibnT@w_~cIY^W+{Ar107x3<=9TUsaQDD08eOuY*%Dfcd|6APW# znT4{Z)KaI}NjaTDlaj|1Z4{G$MKzlVKYq)5=l@2Kq1v zYeobnJe-x(vU0qB?gNnHGboIfGcjeuPQ^jRQ3b6~a3}3VnC(%c zL4FYMPXY2_pR~YSFj=s(fKyN)LPn`nG-Wo+(Uez;7s1LW4<|_)Ss3$}{ z0$QwfTap`H=BdG@-@L89dgr;R4PWZB$EwWbi7{LIp3(L#Z7xBkOdz4&O#Y-?ZB~hr z6=HQ{^<%3ip4eXPDr?9oX7Zb(mK0xifb7da_VZ8)iZMCPi#BX4TANu$2i77D*3em= zO#&zUh0!JxKRlI{(t&J8mO+0e$}k8r{zl>jP>4AcT|qBs3DJxdoKyj8pU?!inc$L0 zxX?*GaQKK=S03*U4n4H0q;&mbE5@JP8P6{1yXDY8&(1D)TZc+~~ zZrs70NWPwYQ{~FeDp~!=lGSH+$Ge}#<{ytfd*be8MfS2*cPSI>t#r(uR9QW$!@t?j zeDm2;$5>v2r--8gUW-sZqroCX^8^{(2E@ZW9uEnr&3qnFoUxf=;2f*re+F0+7`5isppEkCS8N6 zrevq`pz^4aR+<*ooDw}JdR0V=!e-Dq-w5I&aFS4YLHrFajyBXcEN`H58*qb;8{|lH zH`#QtP13YpnFrFWPDy}L0eTZ_M)ranDybm-<0ha??7);Of}7SkE(zPcQUF;3o(dKr z5Ba+`RF^ENa|Ks^WAn(N<&oU@ct!J$fr7eSXV-0fa;g;nwt7uVp0j7)($NjJ+6f%c zMf)p@`^(I5P*c*BpM@tICwuEG)|SQ4>O00O!b7`Ts>j z_*iLSf9E1k;fYPmM3bB2@DJ2`9F+s%XkR>L$u4i`1v*k_V(vZq8Y_?GD8Oh7=t)h? zX)B)0^aunI=Pop5(nY4SQe@Hp6qxk__RoNteQO4Eh$EP#xM4eh++l#5*Y#-BL@O%j zXc&524r?IbUp)S(NL|`A80r7gs?xIck1d~ga#y{fxPSYxrM(-gjZTfkUD|wSu#@pi zsNA~I(lxi3%K8T|fLTM(r74_vWMcA}Jxy&Vlh@9ydgbgxljY_hV{sM=ETvvO)qxG( zGAn2A4{s~`{(p9DX$B1n?K=T@=Om|#wRJs=-tUgNDN`EqC<*4VJ*<sBNNyP4@bXOl!RCx8?;ro`39^XbVMAKLtus|m$}XV z23lA8i#8GvGYT`~ZF$3QNw|`Uw@iA0UIKqi;hViQ^JWuiI}HBdUIM6hp7qm#yA~|% zw^F6x*#M^`S3wpl% z=B}|9o_Jto*^;lneQVdD+b8n_q1zt##_-pYAH1|KcFQ;3`1jpUV9t}hSO3&oTi9G^ z5w>PlI?9(eMQk$K_Qgvl2bT2Z)&z}tJ$DR5ckR4oFlyI%WwDKY?H+g{P+uZ zzH*?xXw6q%zI^vL|MBIz>_EAt(b-UJ8$5@V&)$#ue|UO#-T3K$Bnwur@WvPW@v&@6 zxMymt$7o3&-%Q8M>T& zlVSE1|8}9ET!~?G#;(Q-yU`0Oghqf_(u3sD;TnCyVcTl{%d}ldk%CSFZKs{E*^$q!< zReo9NPrzl{ClnnA!1R!wSX*)y?h6vas zRtpD!Xvzn=z(nz2&TdytB2u@h)0e!K{CM_=-d66@8+_$CdWd|BFlTn?rQR*gIi`j! z13$TUU`yPb)4a8JA17Wr(HhPYWRxU!wqJOW#pCn`-l$2~bNcG2rG7(4+vZm1xTSh! zW7Dz`bB{J;L|4E6TO*_IBs7 z_aDLqxaukxJD8QJ6Hq@F>ShX@PPxE%Wzv8R{3`;t9Sz9Ga$Q6Af7`L&j`?<@(axvE zwjpgoM~f3^NHkw@aOkqZ9N7#jRiNd;geSHR4D&ZE_>{jPEm3I;2V7NF{0=@)Q0vok zC95P?&+2o^eFoxg&~pT$l_HMDQ|U{d#2+TJ#))9{B@g!qjZrWCA#2Me5BHJlXWto1 zw`By{;y?|Iho+V0D<+rJ<#!FcXv`f@jyX9)emo38W{AT`4A1~0Es`WMNh^YEzaUY7 zR1;Do71SS-8m1j1H!&pD1gJgKjhLS`v$wOAXXQUtd9Al5z-^nI9!s{QOi#AzAG4wk zRVT)3O18NNLAHxg?2J`QN8{2LBUhoZj$_^+l#o zZLSfJ_!pkuR2bRzgS$&7J)}VbN-4-LbgGyCMtMWNZ|(?R{_xSRj7;3C6w*Nvu;E8}Y)u^6vdH4fm%WCsP1G=#q;n2VHus;vy zOIk}4T}`xBnmI&sfeDs&VEqr=NjK1XQ-f2E1p2Ijbrg)J+y+l9=tW(IoC>djI&AQk z+YD6KjWcXd!WWa48%~6@(qhjfm*68e&Rom#MvcO>Ukut#Jqm3%gN>=b&x(hw&sizP zinRm$F-w*tA*Hi1v^OP&z)*-w5x3^Nhc4Y?(hW*App~r`+fArcjoFr@di%Qz>S1K} z$?%Ei-b*UkdSoL9qkPVcAs(q2K)f*%^aOckLIQyV7z?2Te0%|FP!Iq_0qW*v0!l#r zXcSe;>l`UXpL%`#wr?)6C8r#{_pj#sg_Uo%E>~^)pI!q)Gph%m0va&rb;i06;|Yu# zFfPG(AHov|Hy~Vs@W*oeOZi{ql$>C2vs@XEoBB*tu?gpzu+XG4QF4PNrN_>;(kCIw2^nB5n*JHeo;p#9`yY{Lfb%XiOV<>0)XVP}sCFigJ~=O)M8z#6HfO!FG+>wN6nL%Zl0WFVy!|;_onDvDkeX@uJ1FZwF;G#uqB$)`k8Xo`BT-fs<8S-+f&&+7$#2;?GyHZ!d* zJ67AVR)o2BEEHiNrBmn-*|{0~0spchX_2{z%D8G6i@I|X0`XtPpNOe_;+MtLUmXAK zpzd^Ba8P20(g`^is)PtB2|q!9uvrL%OL91X_Pm#X{*?+jvK&mQk*FNo@aOYNn2sx| z(xH)IRMIn?_Nd{0gFl^LK(K4hZg@$_oFQ%?(#4!HpX8m{Iq^XaLp@-Z(qAZLy?Vbjq7YY`cY z+2)d5i(&%r-V4e;evkE_TK|Wp;hXw4=bl-VlDXs!y@zk1-X_9lpeVMG^T@UIU`E0L zX%%?&i}Zm7y&mR00ruGl@#gK2@kZkJd5qQs*vEa!jTtupH_>>mZCJ|D4RhJSj3^z@ zISbIw{~kZ#Ztpt&(Zi4Z^H^KkvCEG={NeGgtH1S*9o?|u=+gZBrC-^w;n*_or{gE8 z^Q%_9xG;Wl>3C1i@k^whpr1K=fZjF~KxK?QZ&0;7C=Ct=CxfSg9J>)ZNP%I zWMyg4^2n(OW+K=+s2L9jhK(HO5I0L98pB*Z&x%ub zNN@Qe<{y0=|BqZs^NHIGd?MCQFB5WSV7C}&`268Pw~TAyQd~$|z<&6b3}la$`5c*G z18GW!>mbQ+K4OXJNmq1+NpMVo%B);ad%LYo9Lz2>|N~&N$FW`f1jYbTXaZs_H3}_oOVu2X{E+1(+0c~Y!m|;kV&yrYIhuU;5G;LJ7NwB zIj~Wy724!OI+`m?2!Q1T+>^m9gxO($07;Ti1<_hI(CA2Y&UrXV8qIq4S$OZk)USy~ z^v~YzC!_FrZ@Ejs5rbW_n;0ibXNB*j_iiY4&U(W8K0KbbOH%DHgC0BravMe^jKgxZ zU|CceHAi?))+kI^0|_V!l5^lppMZ{ssqti; zSWi4ERLEaZE)>j|^X0PqoIeOe)ir+nUoMl!W|Ai%2g8!51w#a!J9f?N^1*L5Hl7%v z4(NRHu)n7#!&VWz8Y6O+1+z^_ZcP#TDzn^Q5-V9$a;k(Qh+Y)DgKks5B#))^sto#QOT+(K0$CE#emVVqq^J7tg%SQ4;UoSedJ+MK77 zI}@&=qAV9}G!sn(@Wf9tBU2fDKn2K(NdXh$6$JW#Pb!p1Q-_EySqQpJ5rtsR1w^q4 z0l|De{Wy<6CA|`<%Xo$s@VJCVmt7{W-6Tz(IG21X`O^22`$W1NAJDT9=qciTSMQTc z-GyGr-u#ObBTPrBXMZW)#+4XUKl!6DOD3wU;U%@1j;P;f#68I;9SNU-^6+dvJ%s%f z@@IaaF>)PQnoMp_j|36~lU=iqmKF5$)QHul{2W}DoX)h`VJ=;EPmeSwl8fJ`9Hnqt zC{t&Ml?J;Z`6hP3G!wA#J_fq;fbJFOD6__y9m%HnMwc;aqy@rUA!UvZIKtt}emv>N zAO!&Mm3}M$N1+DvsZe-Oid&>OD#ZpV=7VaL@pti$@uwk)gwMqM%p`M^ImNuna1nzA z5i^Yg`3h;mE2GP)Np++@ww>#0z)(Wd0PUH|sUrp{!Tg@19KM;rLI}O^v zwErmcSDDl^nK(DIC^MecDapwJ!vx|#Z?Wm97g)reA{Lk)V1cLeU##;3 z6Q}N4lH&L(oJtOiL03PdQL@@wo;sp`!d-He!wy2p!yTMtdN?9#8>3esFYgeWE0@hk z5eLIW}RllIn#%Kl)S>$gd1mT^2wi}jT4lWBLRN#kcG+QQ5FtIz~}II6qru2 zSJ(^;T&(l!UwH-aEz}K^CZ(yz)BBQVlF#giIUlR2U(bS)pZhrZHhp%k2X2G>FvP{r zQY2T6%@2e06Dxi88bd#yd>hgSz=gs2HLc-UQ6`d};UWGmNZlq0ndB8VAMFYQ#?sK5 zR`$lqgG-M!G=lYROYcTa6G}1+K+j0BlF%ODu|i;{^infQjiqP&tGyXa$Il z3bMTBDaw)b zOnc&m*{=5OU5_2%^R`D5)edO01KJFd0dssRQ7z*xkE7n|OVzlo8po=!I8>iquk5O_ ziMYNtx6IIDM3R4B_~feN>xzrl zeQouc$5yj3b&N=!(J|n;8sK^9;+GbC9`Bc=EtJ--7whrmU0fxhsPyK24UCtoz!k-~1}w zUU~+2BmgeO7`uZL*YvXNq1rr{hRnvEyquhD?IN1aMvLUK>^5OaJYnzy0}~u*&>30b zyZ~J?hsU=@``m$VB z--0Pc-_CQR0#wc9=H}N6v$dIwuub^9@HOE@Ay+62hGZd})1ts0acgddw194*NSZzi zs(@jsVLSwxG;AVGIt4E*hiN$1)d>lsrTGKxNrg*7kWa9eb+UiwJHeqlyV}-Pn{?iC zN2a;Zm0xO?Vr%jpVp#Q%I03kk(CGN$yGIIC&O(dPlPxuu`iwc%ODeaH&LX1Rp)HUq zkyLWRoP99UZZ+D5zQQaw*B6zQ1(($4Wwtb^^)X(}R6Y6#67!^a<~)BMop-DBR`ac~ zTNm9rc`J8KJ*tt_P&Iw^uLUm#KMK;)pgBkdMO#`MxSb8ri8lMXR#j_eOwUm@Fscz1 zWmnl%4YEY5-$3+DYK8~|x*%;~2C_EK13h5SPR#rc^6q87PrQ*hKf|6SE);MDu>pOS zC_Mi4NFxOyVxo6SuLmVlN|{a4iY!Rgf+-3_I!Gq|4KD*IEk!E2PrS`JJWe=M?>6$J zdX+v;Y4iF94bD%YZ9>hf#-y1>YNqmFoa zfmE6sEX^@{P10+}v}NP1YY%qi7{aZgmp$z<=PkWUgSGjJuCb-v9JAV$Ezi)ZGBYwg zQ+>_5hr$@sSfn*MH9C`=>uX2AEu-(3BUkmiOmn#o9+g{dX@Z6f3lu zGM7~?&vsqadRvPuj;g_kzuYE~<~7qJw{J65j8^ZzgCxvhh}|L1Z$ZD5fUTV4uD5oV z?JPT5_G%fe2-gd{N_GA=gG|;U2ah7%;wF+x5GNT6*tkiMs1{Hx*Tob#KmdDM`?E>w z^L|`5GISm0gsA4(U*D|wMT=kW-McuT%`1VC?-6adr-Dh8n~3^Ji|xF+uP~PDP1(=- zM;}^|O!;xCA68Gq9sb_!P02Rm+#$Ne4?k1THZ6E|OBkE2Q75f`9#Z=+!aOpr&pYSC z79Y;-G$Ez7MWf1S$&|7qT@doU(r|j_jlV<2&cdk7{7@by$$r;^exP6)=Ys}3yf)?2 zefC5aBo}D&%nF4$PpiwbWU;82+6T%{)N}193!-|sj6Gn=$S?)$u+7Xg1%NGxn)^#q z36m6*FaYJDBF1KI)ZqH(C9g>?N@$5B-*Yto)%>}9+SzGD$`-X$Kt3(Rj?qwc)(~K8 z4vtU~J^Iwhd~?0=k+Ria>bFXxJ*8$sY2JTinLRM^j?|jnW^o#?o*+@BQ4(yTx3RUy z&7Y}tN|vUf&SmI<|BRF!Dx=EI&3(k=Dz)+c0CxMa+t=@-w3)e?RB;9tWN0&TGiZSr zM^GI)1nP!d?1zi_2xmgPr#t6Y+a=wfYgq$MhKv^bHH3oO&{h&&RL zo)t(r=!3L#_)W0vS^whoppu8RG(V*lK3{Ix)b~_;iN^;!LmpmH%ggTH*j49w znJB>g; z`<;bQ>B^faxr6r=gE`OxV{I>5!PJ;4>NnTn`nuk_<#lvjoiJFR*WK^$kM$4tPxc?} zf3E-4{!9G=g`xx0LSIpvU1n0y&44*TIY?^)bW2^3)eiIO0iYs*AD92}0%W0G2INR| zHyEOyQ5BjrMx5V%zPcc(Kg1cgK!1$P{@P$G$5d+xr8p zxAyqbszej&Ao**lYm<+V!|K5z?E=k0?PTTpL~(-~&{=(mY(Jx33cA+9G-j55DSZ=J zyrpVh->~%Ld<66?LJ`K~syBC+>@2~G5D=_b=}nW$0eaN+|Ex#isfyj2C|B~Goe;fakUB^#e0I^F;nWh>NC z0iJ^zCRZ9)_BLN?#%;|w){Gght3J}zREgT^WaTXt(tx+cXE2G{bfm7tOPwCb05bw; zOq(<}*(&q%PhB=O%yP^o5P=Ber*x`yo=?=7o9q?5`?{qgpeUG^fp69ydOWVWVertu zz1eh0HqRsHuutK(XA90lwudm4?ZH{e3hgs#yNA$YJ<#Jtpa(>yATH%Du?y;b-SJCt z+!n{NIIfB7dg@&*4yjF|jJ26$;Wj`xR11VQ)6_`!TM`^(4O?Q_rWyqpLWJ!BQV)%008W_%FFQ zS6N@)TP>~jSHB8&J110c5^;N~lp(3FWs?Vwd$7@ixiD$UCXfMHdTDLPA2wH5F&7;+I zs~en<2<0rQUcNz_UuJg|2fW6ds@5e;+m?1PtT1xTeE_*Mb&%6zV-zv#t5!;vT`w`p z7HM@-)S5B^S-&2be=y2`9S-woS>*$!6C6QYBcx(&B{gMsR9G_e3L@Ipb#dDxj{Y2* zM>d2rl9#*t1iS%WhLCG*+}1}u(P6SVS1h_VHQTyk38{l0Z1F$A7i5S`S#!Y-5A6&c z4ZRwoP2e~Qiljb6OTZ|#fep@WAyzo?nZS5R;-1i-Qb;+iKCYYK^ARS3D?jBx;Y3+Y zk^Bw}Y)xH@gYCEVc-ay>sVeBKs2Po!h*u8K<~uCDI8hRJOMOcoT7mz@Duvl{0*C{> z+ZyqSKg*{~BEo3_C^&k{YI@)KWP$b%76HrKBQ7#Z1$TaGd z96nc*ZI(PB5?0qp@zXjs|2O%)?ur5gRgBmc5b8-rEYjV4C>0EN58ZOK=^NMI|ES9Uz%5PD)rP)>j zcUc207$TGU7Z8=DsfJA4ClpQ*8t8q4!dL-L(a`5b_iVK5b0S%3CeW|Gl3~y)xjbR6 zd0Zf_u9e`kdQ-j)LRp_2zwAi<{?X)Rme@Re#ZX=$=8cHd3K>L1-DvZIvmt0(%--f!8rsx ziKCa99kIqmjl+#}Bcss9oi*5P!nL(^5=o}CMj8qQ&1Q?K&?J#a&1RD&(^6Yo6ABdq zaZOUGqAoL&X90ThzNz?*f*M!csh|{%mSE6RQ&?C`P85IB^BoVh!n4mqd1@sgGbg{4 z&nar*7E9e~MShFQL+B0=VPW7akvQ*3N4&syo`8w`{}16WlG(m6h)AbW*U0!vyup6r zJBErU4SQvnLQdR@ zN5VxA_L8eJRBp?;FO!fL@I?R^V-N791RY^qFRSrM^*J@=Ru`)q)U+0+q6oZdZ^TP^ zO+h|?p=QVfTBEYbvggVuSsA|I!e4hi?V_Bnh^x*;Yh2i+(G;3$OkF10MEZadE;o7A zf>L>_)KF~6#w{j*qOl;$37Fau3N7dWpjOU%NZ{*+W&z~FhE@1j0;6J>IQ?$KzS05j zoB9N250AvMvyv~{nYzxE`vCHF}5R*#8?Kj2lA^M!{bW`ml;6T9^LgrItO zoJMvw!L{Q{53Q=plZ{raexQfmX>scz7M@Z-57;`}<9hGz#(DL_(h<^C>El304O;UI z(t!0_2Q7AKqMGHJTQpB=xB#m`3y6!v6XGr6b7HOzzFnZ^HSl|N@&<((W`&A+w1_9; zQ9K1tp;2cnQc6XdMZz?kAz5jVUkzhVF!9z5j6fI2$Ot0nA+w)v4sxk5b1=!YgZ717?@#Gbn2R5r4#hHAw z*zQ)VjrNbkav3)O2|^a}WogEujGY-rGfrhZm%+=(K-$YHPcwo;Kn4o}@ZIi=y**PC+-mzhe zjjoYS z(6qqB#ELbVd{4fntVFzprz;w6&Z%LFwdy=~o~k$^+0Hi>Cn%TB=~by*rmRg{nO))71EO|f2fX%t7?}O#K!en}880z#W z^xIFkXOR<7R5#-_WI7u1L{6*I%2lnMgXmEK%;tlShvXR+*^%9&Z_N~C+Tl;^P>CTb z8UqYYzS0GLEA|KI$!12e#Uz84L~4BVpNeAV2c^F$MKqWSKH37`;DWe4d`W_eCmvo` zQMKW4-+1Zfq0+&@EPIhNue-HI8~*a(_{B9F3p&cIXGHaTesb?aZ|toWeCbQv>`-H% zz9g@uJdb~EV}?Q_UT1{Qp;CW(`Zs2Jx3GB4H-MUBfOE?s@2wrJWGbrsu~=+TjE+H| zYY}Rs1Kx06UU*nJsoV*mrnAvD9L6Y&!^pR3k>4+^-&DdE#UNS7rj>5iv!9!I3#<(Df4YvTM1@JTZ8+CzI^02L)K2Kfgw1cpNRcorXWZHQNu4bh|#JcyVShofxLw+rGR zDcYobuj#xwb{eq;CWl{^>X&wK^BQv8OGf+6_VS2Vkrk}!4271AEsxf0t}-~BO=V7# z>fP^2jA}{A>W4>{?(cE+Hp#v1mA6dFw8jj)n0hL-vZ8NqRH&50r~Fho9?c$IB;S~w zlkGBRtk!5MyC=%aHWrOoTD$x6NM;?GmXXS=yK7fqad(qxBqh7Iv)`V12)rjz@Mo%g zBOn`D_Deuvx4{r<6HW^$A#^K9OM;OMK2QL=WDWZ>tfcc0THkbiq;k(E;PMj{j zE9%41d1E2%5qr^=v$toDe==4!>D%A4H^g|e2-`?K4a-7bb{r!7=a48)3?6o-U@F;Q|8LrREs~?8D>fP>oXi*A}O@iDv zqwP$cLtM@=pjme~%m--OYLqS=m@H?(mU^(M$@lOo$QZaclw20bfJF5LSgD zD6K6(JfQva;}Cpzh#iZzZ>MJH&?ks4Ov&4^ISu_!7|T>>DSGBI|Wz6rrr@`Op^~)q*G=gZU?y& z^TC%-DS%Yo?1K0odmXTx>S^2^R%aV)HuhC)DUhp`#mm>+cB{JS;Fk7{acfQ3=`0>Q z&<-Dtb1$k=`kSKT>)q{}TYGQoaH(?gwb?n|;V(@r+PyePJRa~}0@`4!$x{}&-IcK_ zk2&VimgLwfnA&UmCWpM$)$OIZor_nL|DWQ%1wP8^+IR2oo0&`|ugPoj&U|^lGn3ck zO(x_?2uXkt5JO->9t6od1d)1;Mby?>ZEssW@c~7Oiip%3k>ly9V4!NXm9`#ptgVX2 z(%VyPIj7cpt7dZkYkxDzBm`=EfA`)@*39?KtZ(nV_F8-IwfA0Y?KPuGS%VEtd)H?q zl%szrwIa?!kHfaA6kT-djXh;atEx)FQ@bkG-s!NJ%Qlsy7smP7x|^_Rg>jE3X#M5A z+K&-uD}hDXeWMQq1sM*oxPWhlAt+VeM`#@gWr95bipjFD4V9d<_?9OaqmxahZ*HuFn?g4>W0>R@<`-75_LZvOt*;c2 z*OM?MfpSVt=?EN=fz^?>Xl;tdMc8P9EE?+;_Hh^Zy|DF-i4usXs3v3|PC+c(wvSxHm&p-6$6%9VNtFEs$!IYdA6A)jRR^M%p`ReR|&GD7T z&+OQ7_VKTF+H9R)ef;c>9cLc@io-UPy?*!CAKP@pk+1JwpH0_CZrJn~UGx6%)Z7T~ zI8$_qHI^a;b{)OBDlDbIY)Xvqiz&>CvUc2k!}nk0154BFEGX!tywqgWRk|`iIy*Ap9#1W{VP;(92oX&baI#7pKp<}vc$Uby(=*-ZCp({h$_0z&T zH4lxdFeRG3niiX8@>gC>xB0#5ACP8FlQiie=@Rod`b%l){{HD{@`}x`GzRZ@WreGq zxm<-Qs42xP6)Gos5055i{1HqnXtqdJ;n2R&@(`+&w(%9=c!8B83j3M>Rg_jH1P1lS z8T_xcKmO||GLGQf7?l_jg-93Ml>DlMQ-Y zww6Ua9dIV$X)Q4aZIpEXU!l8Ox+%X@!RyRv9ky2vx8~rp(vHu4F?rP~snvNg_)JZ~ zr{*?~pRHD)C)eb~(wcgz`YGBObHzdofQLt+ub<{x0TBa@{!jaTk(h`ux>^(!F))ud zj64D(QiQ~X;D{7r#WO(S>^6$C(k3-XuVKECh8T&Fp&zg-u-eTq$Hyb|@sPjdA9*R| zUEOc}e=Wuh(uC0Pp*Xxn!vyAWFm1|3XGJmVk~|}uxXdq2(zDp3u)hrhge0B5RyX?% zuE|=FWb}*4j!Vi{{A-#M>vq=OcUbcWYisM~!WVMmGv-+P@6uW~w5G-vr-#MlR3@MY ztjLZ;sCJICqRPQv@(J2#FO2xW8f26GKe$rLODhp^&n^$iQiaTAThOKE;H|-fh-3Cl zuom);CC6Z&=t~*z`dmWTclYF&~y`WrSu_W^Hin7_O>HS(zJct4PT=`y~{ogeI-JskVBkB_qDLF+HuV zF1u>ygai+utRkf%*Svmf{f5?v?8>z2IwIC9BtDABjm}?f&8oAd_!_(-vR4(Y?ybO? zO*k{_Z8>D#_EtOLyI^~ZMf*HV*}M|?U12$v4C6b&4V$;7HEBMMXnHKXQsQVss`9iG!x#vderC2)>abBe2wtZ=mAy7mJS(C8qUDmfOMj8Z{K=@ zAuz?97U=7%317pTOe|5eCIvQj(CgJ0AqdR*7AC}`AVUafU{Uvj=GQ3}?Xx02cl%4u zGs5EUo2rZ3%^PJu;btVvkDO<;$Nw@cHXP-^%E526tb+lgxc&5<`FRM(xo1uM3AqdV z=L#a8FNymZ@DP;E`LLf$JE^NeT}f|at;EkyvCXfQaE1jlDFq%sVHi)1K|%U}J1nRv zeNbqy@4cY@q6L0(7DPnBB#)Z2j;KX^S`0E2nl7a<58Awxa?gHaYI=H5QbTm<%8gYS zj?k{{PG|qEvd&w(L$6;^P*$crxJkbqDIbs;rIXN|B3OjoH|PT|?@I>byWG|2-Xe7f zy{)@u#b=>A4(B(v2E~T?z1SO;Z%y{@@eeZxbx4ghTBA8qYO1Bh_1V}+vr$_E8I~C7 zXum-|KFA5yI=c6LqwH{!WA6vamjcdsUkY_;VaSjoqfoA7OGrdvJwr=`ie`?rj!$bh zwbiX^YpdnIKlZ&xPab<>%`I)&nw|sr+kgA*`%mI5u#-<^w0&9R>!~X>*wYzwC5_}o zx)Sp?dRuXhK@03muXuZTtNM}*3G~#LpfFK{c%d($E1kUvZ3%^gU4F2fhZ8=;hy0-P zM?G)6(Zfre_c~uD#fcY7dgsFky?4O*@Jjau={hi1(|tvI)|kxpJ;jVE>}N7U-v@fJ zpUbz;J_kFP1X)T6;_pZC3sL<3C_WLzw_-D%4Klu!@n)QI0iFfY+^|5rZz*6E1qH5j z`#sZ@;Aw+&$K=Da&$Cv0v6LAkUC88zGWkR%H^MQFGI=qI9}@WtiG1u)yfg~R$9#tF z++3M0AOLC~QXrDfS%2`RcUWldU#)oUb>M-%FNQvN8EkvV0#u zh(%}|10v#lDa>RvDJI!e>Q!%4xPnLy6z|LE8Se}FFGZz=WPz+kK=mJTPpvEno{iqOmMW ze;U!@7Vsr&>9Y7a^W`}|k6()PS?%)a*Usbb6!>9wKPUj&WSoR&ZB%n00w7uoG#KZf zImd6u=_^V0Fj*>irhwZExKhB41zeWo5*PIaA`Uj(_o&aopI0r`-}2y({g8b_>L9kv z^ucs4Uw&ywX{nWME>27s%;kZ(fw{4WC{%7KZ!VWY;$uT1gFA}yI;?-Oa*LH0S&OW( zr3sdf7hzID&f1Yav4)da#A6*X@Q`}{^(}d4$)pla4-^K5Hjzk_FnQn>>>;5uQ@_Lp z+(lTk-+Grnj*&R0J$Fvbz%Y0%i9u8t80SR`I_`Z$%lYA$ zMbV15VMZwlLbS}b##YTXLmRmVQ*ww~B&|96>W8~!;>T|2A&7AWek2PSyoHlZw9#(h ztcb5JvSw%@fM~UZOEC+M3VDS&3d!r-1tG6IRhx`xfJdjYQw@3#d0mP>&L&m)JuLFw;DopSkREE(%^ha zr9lxiOim>$%($3_Mfl@$ce~1zi3heQ$qU$mhE+)admiae&!wvA6Z+}7xhW-M;R)0! z;UD%Q8r1UaoJ$6N#3_keh=kK~pHJafM^Pdd6_SW+L-D<0vG-DCPs+@+B;FX%o0DPL z%%i)k*|8lNq+c*^(-uodXi$2Gev3EFwXos@`4y|EFiOQ1GBilsV^q#_Ti{@?Tn&mp z9|$bLZOn#<5)jkCrkBV7CsGoDzgmxecGMLP>?Ns+f`FCpeSYs0Z+9M%EgV53;Fd%I zz)mcL1>+ygK0?vJ9{l%%>mZ4d6hv_=~2J?|kOjdN; zboV0~dW$@P?v@#ZkN2=nG%QmONJ8*deFytU1F9B9F-{XgjB zl|L7;KT;Cz`urCUU2fGF)*&{_ga7c+`p-UYL9}~yyb^H~gsc_0WR3cy&?#;c?fIFh zGMg^~Le9(DQv7*Y<16vNu&rzXTgci{{AqSdl{JB%Y^z)rpJYcZ&rbFN@I{|jLmft% zZJqkWLZ7GlXA2r|(ir;fahy=Lj-}Wm`D&Eu{t7-(!G|jNwhC^o;I~!O1Z0CC(hJe= zgE0JwK1al>Nym(Jojo__#^~PSfa0yigT>DjYcj$U5U{2wz9XZsBisysLdg=&Gr}{% z)d)|i^SfLZJ;zevr+~3^nJ6~GW+jH_DZsnxPBx-v!UNFif3D zk%gs!rw&Vj`Q<&U9RZn5E9{+>acS#s+ZesVQL|#p3bXT8F-1Olw0h5XJ0_0xX7X?M z_k`rGD__%D6l%R;Vr~6+Yj${InlaR}rm4LnzQksWRaP`^t6b5uD%Ek%=JeE6J1ReG zSLe~pQ9eAmHGS2+7w%fW-kfK##3VGgZO(4Gxh2ihww3e+;a{wagRE9V?sTl`4o2Fo zJ&=0od#7scwp4e^5p7{9{y5e=NV{#s18w%&1?*+gp8imzO{k~mE>GE4FJLdEt$lC4 zEayLhZHqlnT8#&kHg0U=1#PvqI3f5#>fL#0Kc0VP=etbw(#?UQm;TL^y^p{==S z-tT(Gi=7ka9>&@YvQ$Hlu?CFkpG-BVv~Ph@ORBL<&*@rWt8K(w`bIWkuZyV+X{gWe z@xBp9bm>z<>o>02xaGDjyk!eFZ{fCLR-e+=ZfxbPt<4S1l~pm#At6=GRe?E8D||9+ z8MgQp#%8%CG9H%CBz{6!C3i|X*$BG@aNH(MfO=p!Z$q_3^gW>(kUA?iAXTToav9cm z3ofL|@Fi52Vq7~T!X#StC#0TQ__{51FJ0u{E$VMfPA9Cvs%$V-XeJBbBgEWrfZXghzc3P9)^5T$TQ7{AHelg^1Kv(920AjXB!?EPq!{$QyG?|Jq=lN<7(0iuErH|sg`5sFIBlLR^@VT zD!o?4_mE3y_wWOxw)m2uvC8=f`gM$B5rL$aJ~U;H2n%(W9_1mw!CO7>$LIQhj}q}D zJkS+kUceT0V_K5_wDZrvk9FbSAHgRggfbhEC>~UY7UUB|&k0)8a_w}|z)SjXDryOj z{ADVlK+VfVjmsxT7s2AOmvpCnV+6~p_t7E1jV4CJVl&IV|Yvqi}25FQkNAbOovQbQ)-jHNyFlsQ3!P1*t@4? zIkLXkB0TGaPskSICB)1@^jY$@qd6f~?XXRs6pG^{LOtAlOkvo@*A`%}J|)<_BJ1kf zd0xlVTCRVt{^ku9w+B%5SYGH&O>^vc-dLq(sUwgsENr!Ha(8dpLqB+DpYs*xg~~f# zzLO$+MMqRWQ2ou(&iLYx&)fPQy~$>~>CwI&kM!l|_mOT5|2EAP(eJGlGJ9U_Q+YMG z=-pf)sp74!FF*!0S%T*fRFd!S3i(bH@_l$JJyE|{?_G*Nj@=)USt}mclbF7Mt;+YJ zw5LB4X%i~xyNQ+sYW+e3&UzFRwDAKQP>ek zFA>7@zo!!IA|uG3yK%_a@BA(HgnouzI1KwQZFZY~{8O6naDIrLgyxfBy*q$AD>8=EM!Fa_(WyQhRuJG8R?q~ zN`~i7XtFd9)0#8v7O=pU937reFK@K`(ZYXf;dToTfB;M3^#N_!QAugBO+m)ACY|cP zHm{r0zyR@9+C%p-zk<(G{D1c zpdhXMy-16n{MgOIiXD1pQ^|mD{8~;TAX0AZ*744ef%4 zaqOy5&sv8}ZZ54vs9e{40@9a+^%=6w4a7+q$x;~9P*nDc8GKkpEKEwAHc+~1e;c8C0N9)~?djIS&N zXDj;ooM9nGqi;aH(Y2YFn*nRc$k)+p(1s%R_d*kdMHu!KFl3pIw2WN$h?@#MiJB z|21rIsT=VWSb}z-78?e8xu+wpF-&SmuG*ZJhj78}&%w~7oapGBq)_*#_DJFSqL`SX z^@X-p`fRnuSz`SCV=Qs5PpSiU5q0o__C5Hsng0=|A2GYZWV}xoHDO}+`JhPWB7c1j zn^mG3$RGno)ueoq&gnL{mOhP53iX!T<*59o!onNYRK=MSLk)Ca&@Aq?9YN-lP|L>Z z)YP2RpjceCiA&0V?i2nyjX~-}Z@H{ZgU0aLWlaeG9Y!^QtG^De-tfOJ>s`2PRNl>} zwWrbd7TOcZNlL<5hYxr^c#yVw>|hM@IQKC42{MFmoq7oG#MuwABtzSbWaf;C9t^w0 zhTv%8+KC(Ik3BROXGUmJu5<2Txjf46#TsE4%fe|P*FJM`A@2`o-OTs;t0yjMHOpuH z|MRRz#G{pW%k84xEv(00lN@df7d~pP>Sr+rQy++XFdWO<;DUTGoU?EvjwzSX0pPgs z_j3N2BTeLRoZ*pU_wldK2!0}lSd;f*u2>Dh%t>qmU>{)iLjqxndNrfS{BQ~HBwu1) zSBEJsCC=1XY%W2JxZW?y&y3}(8e#+<%XGFj&eg=4On%&hY2n3)R{8+w^yGM|G1YiA zc`@22GJ>xn&qz`r-qe0zi705%H7xmRnFEvfBpuP&wN)I^*;uR;XGC5@V6H=(^E`a= z#F?RV#^2vYTWpMusC&qY^F(t$Bs*$a&QclZN#Qc*LH*qnE`KJ}H3)=%0Y53-u946; zTkXoB&?}+R*3iLF2>~brLb*Y;mO8{V0q7TF0) zZ|E#4>8ekY-fkVKiH)rpX>A>@jg74xMk3fVmy(2iVWK@ySQnnrTtLiFJxmGV?nANM z$}M8^%F}Xi-ehpWP!MU|g|t#cTB&xE*nPK3cAO*ozH|kV_!cK9_Sfh4))CI&s;zW% z#f&@e!`l_evdjXWlMx;j>(k_Tgm`u^vCI42-8hpPze+4lYLxY`IS9vzG2u~9^PpbA0HwUIU%ZmeJ!~C7!;VvfJ{Yh>a78Vi0NMg8L z%Afu1CSIYeOAd_JJAXjLF+|^_0*b$Uw$pXZv6lb5>srETUB7T$%gn@KQ7*7G%!e1b zuC@4n#C5G>29D80;CQhnsor(1XCcyA*R_GyYUzX$`txDYy5G32eOb2GHrKTuu0L{J z`?GZY2FvEZ@I30Sds22*R?Ne_o5JrR31NE-{-paXRZ2ZtSI)eUceaO z7FcC>F$Lhjy#rU`6c_Y&EP{!Op~W9dHJb#x6XqVDEhp*hAu- zQt89h0HS`g>b~B-vA$cnyOb`+m_ykB{*pn~+^>yg2}E@gf9NFQ$2;rm{gSnNWPM{wKSyL*=d7nN)j z1au?&F7c#-37m4R6e~x!cMo)Rk0@EnqQt*Q0op|Jqb^z%?A>IG`cYUXiq(gLQSo!| z%4Mvrdt?-}DLL6ztJ1lXb@vKZwvGJ@olI#INb^pAyj)v=?|(3I%Cw7rY>0 z&BnbauNTC@UH(y|MR`(tRLh}KL!}u&T53tgkhaS2n}JPbruI!V?GT?1d^ZT5QZ2Y; zhNR$TaZe>21?|+R_PSDZmz88_7ha3YO>&?xwJnfrY!_IBLo!PBq{=KcN6L@tm1tM% zs9*f*<_gIfwH+!Cm6#}@K8jLs*C5p?@qxZ4iQWUc=$@W%;|>9vaw49%<(1lvyA0#N zruL&!1&C%VUxZbw(&K(B%xWOVyT zclSWHXMaWMkM5#w6=@)wuI_?Het5aHxBL3f4bLd5n$pb?zQR!h=fR z*r+I=qqA>U-`HMd&yGG6nZ6ww83eu5y44iMyGJM+l}sXVXjgZCH_AlFbn6%(Tvu1@ z5PbrP`xvUc1Zuhk?50;X7_hjPC&thKlnntS7GZH>$Jp3ViN&&K&z@|DtDE1BQ6?Mt z(64`IvhKdYQ))<>i071MKP2b6SrgA)d>$Fi-Z9n>{6+|qI%c_>F*Q)if;ts<)2$SO zx82o{7e7No^3nk*7e%rn@ji@kBoDjANJo-TIpo-m57#f5#BMP<+zn2u}>7jlNloO?7@*<%PzHOqn5^1RW(iPYqCTE zXo^pNb3N!Kmizk!zNC07GCX6nSc>sNtXFTu`tV`C&~^L~;=za&zaY#G$dl288D2Q{ z1tVc$5zS&?_hUw7#bISP0hWVFu)0Wr1ymZMBxXRf$wGN8s5Tn4^AH2801FU>uoftW z0G1*yVL9ToS6~8M$yS2SYS35>KPY_9pum@b~xZBlZ<&(tYeEA+G~i)*58P5HFHr>VL=4$o?H;!Y$}y z_pw{qm)L3cU3MG$Z)}3y&Mvb*uou`2`&T$3yv?3v|AU=^E`E+pvFF%%%x`|kUSvPu z8n4|0eO7B_wf7*}{V3XAw{Oqj?vc^mL+Jblp{mg;n;wxW=fFwgDE?k{o_vo!&rat5 zCw;yW)}sF6j~lE#;13q9c>g)xHR4YF-2lF3GQP`!vq$yf7h3NoOny`M2z{sG(NmNw zEXWx*Bnr%C_5@x(<&6JQDw4*fyX7F+D*s3-Vn3CNu(#2pnbMAHzopyk745ZIpQta< z*Xwucza*|o^gq&ntark4I)34WG~BNuq&WXVD&pm}St>#*i5@SyD_MAX8}%hf^K(P2 z_veu9#JP6XFn5A|8K3(BcK{9m?gZQgxO>h3*$=>bARuvW5}1>~oCM}1FeiaI3Cu}g zwzD4t=O+Lg)8ftm@S7WE@pA`Q^4ttd2jl|s0fqRk2%p8kDFIFypceOafO%?p zunBMj@Hfv*Blg%N`xfrM4fqb=0lS`LLJAu?^kopW#pF!#~=wBA6JcE>HTq#dq zC$&kWHVug@1~xrW1~>?aM=6I{HFBy2)B)-N#P4;0R=}6>`+mS3fCGR#0e1oJo-?z< z`28`!5y1BVM*)umo&Y=vI0kqMa2)V7;90;F;5oo4!1I99fENH>f-<$f7Rq?HtDNX7 zapfr=*OLWR4yLau2mj|hp9WW^(d%m=bq0VRq%;ac<^#&eGWjsU&~I0|?i z@C4vVz%js6fa8Ft0nY-a0M7wV0iFk(2D||HG0OZCfR|{K*J^V)pwA5Y%)n~DO5Unb z-daE%pdQcwSO;hYv_XEa**`izxekp7KqFT80N(=~1w0OT0`Mf@7~m)&YzHUXpj?DEBN&5ELjyem{qQt&ywlLojzAkb zf!3^YJ268Y1Il$NjoYw&oI5P>( z45Lf|c&Do$1AgNAM(tbNZT0_#hA{b8rRe{KhM*UcdChUvc@Y|78){0z%mFe0?a_c2 zM_v2jJDNAhv@eWbXujZ$*+LmcBAO4FFc(+_U3E2H5tt1$Vdk+Ga{;o7-2g3>W&&o+ z1llnN`7$*7c=lE3_-X8$cxAC~u?LYN+An4w&q9JKp=rN>`NfOuEK+?1d~AfK{~A(t P>%GxPbE)2o9~t{E6I-u` literal 0 HcmV?d00001 diff --git a/rdmo/core/assets/img/favicon.png b/rdmo/core/assets/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..042bcf2bbb2fdbc5100253d19cdda66fc2b434a2 GIT binary patch literal 1129 zcmV-v1eW`WP)mSr5qfB*Y=-jBWSX7g3I{6g2}Hir_rOl72{g@PG=pfMtZBIu-(CshAs4r{nb;dYS8eDabeT97PLq7;iyNK)u#}r~A@PQwVCw*h=9uTHj zzyze-*MX@+gpjbx*Txbi{8C`T6<~D84g@-62lRj50TcEV1QS!>oWt6`!$>KG$iJTh zOo~@ZkUO$u^4#-Od2cP&I+PMTrT)uTHRV{tS$@C?#~A8^9RDoY~dPOjY9h z3K5~Z=T8d7fOsrIV?!-U30KnB$rnn9lu4T#?**W{cMz=&O%1gyYN+MXVvO*t&r2o0m~4Y4*Rri}`a?WHO^X^VDiquc*gp!#jJov$m~~v9SUb z@d$6dzJ+a@myyerD3uILn&XXZrSliafPsc8BC4HS}%xBe#dOkYvE4>$o_~i4GtZc0#7V`#CEExiAQCb@&mo=7TBF5fVpWxtEr#XKi zgR|u(w9XM|gE1EC9L8D#V{s0S{c@4TjkDRYwUvX1P80Dxw6^7Et;1+L!C`R|?@n^w z77zsGbtOH_D;^p6SN~WkEfC8R{0yq-I7H z>HZO%b7*boAGm>aj*57MVo_5O_Yn~;UmeCyi12FWJ<_4IB{eIX@fF+{&6CX*xikEvvGuhn zxe7Vw?h32Bg6RLxakv7)zLJIB1I~rYk0NBK@cv0aDX~gK(xEAE{H8=?Uug93g;&?K vp);E+j)+JKWZqQRF33p{dAF*v;=R8B{JACOzfO+{00000NkvXXu0mjfoc$N7 literal 0 HcmV?d00001 diff --git a/rdmo/core/assets/img/rdmo-logo.svg b/rdmo/core/assets/img/rdmo-logo.svg new file mode 100644 index 0000000000..93fc2eae24 --- /dev/null +++ b/rdmo/core/assets/img/rdmo-logo.svg @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + RDMO + + From e7c57a3c5de00c65ecd4f61d5bffd92381efa1c8 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:35:32 +0200 Subject: [PATCH 003/160] Add actions/api/reducers for config settings, templates, pending and current user to core assets --- rdmo/core/assets/js/actions/actionTypes.js | 17 ++++++ rdmo/core/assets/js/actions/configActions.js | 9 +++ rdmo/core/assets/js/actions/pendingActions.js | 9 +++ .../core/assets/js/actions/settingsActions.js | 25 ++++++++ .../core/assets/js/actions/templateActions.js | 25 ++++++++ rdmo/core/assets/js/actions/userActions.js | 25 ++++++++ rdmo/core/assets/js/api/AccountsApi.js | 9 +++ rdmo/core/assets/js/api/CoreApi.js | 4 ++ rdmo/core/assets/js/reducers/configReducer.js | 22 +++++++ .../core/assets/js/reducers/pendingReducer.js | 16 +++++ .../assets/js/reducers/settingsReducer.js | 14 +++++ .../assets/js/reducers/templateReducer.js | 14 +++++ rdmo/core/assets/js/reducers/userReducer.js | 18 ++++++ rdmo/core/assets/js/utils/config.js | 58 +++++++++++++++++++ 14 files changed, 265 insertions(+) create mode 100644 rdmo/core/assets/js/actions/actionTypes.js create mode 100644 rdmo/core/assets/js/actions/configActions.js create mode 100644 rdmo/core/assets/js/actions/pendingActions.js create mode 100644 rdmo/core/assets/js/actions/settingsActions.js create mode 100644 rdmo/core/assets/js/actions/templateActions.js create mode 100644 rdmo/core/assets/js/actions/userActions.js create mode 100644 rdmo/core/assets/js/api/AccountsApi.js create mode 100644 rdmo/core/assets/js/reducers/configReducer.js create mode 100644 rdmo/core/assets/js/reducers/pendingReducer.js create mode 100644 rdmo/core/assets/js/reducers/settingsReducer.js create mode 100644 rdmo/core/assets/js/reducers/templateReducer.js create mode 100644 rdmo/core/assets/js/reducers/userReducer.js create mode 100644 rdmo/core/assets/js/utils/config.js diff --git a/rdmo/core/assets/js/actions/actionTypes.js b/rdmo/core/assets/js/actions/actionTypes.js new file mode 100644 index 0000000000..1f97c54f3d --- /dev/null +++ b/rdmo/core/assets/js/actions/actionTypes.js @@ -0,0 +1,17 @@ +export const UPDATE_CONFIG = 'UPDATE_CONFIG' +export const DELETE_CONFIG = 'DELETE_CONFIG' + +export const ADD_TO_PENDING = 'ADD_TO_PENDING' +export const REMOVE_FROM_PENDING = 'REMOVE_FROM_PENDING' + +export const FETCH_SETTINGS_ERROR = 'FETCH_SETTINGS_ERROR' +export const FETCH_SETTINGS_INIT = 'FETCH_SETTINGS_INIT' +export const FETCH_SETTINGS_SUCCESS = 'FETCH_SETTINGS_SUCCESS' + +export const FETCH_TEMPLATES_ERROR = 'FETCH_TEMPLATES_ERROR' +export const FETCH_TEMPLATES_INIT = 'FETCH_TEMPLATES_INIT' +export const FETCH_TEMPLATES_SUCCESS = 'FETCH_TEMPLATES_SUCCESS' + +export const FETCH_CURRENT_USER_ERROR = 'FETCH_CURRENT_USER_ERROR' +export const FETCH_CURRENT_USER_INIT = 'FETCH_CURRENT_USER_INIT' +export const FETCH_CURRENT_USER_SUCCESS = 'FETCH_CURRENT_USER_SUCCESS' diff --git a/rdmo/core/assets/js/actions/configActions.js b/rdmo/core/assets/js/actions/configActions.js new file mode 100644 index 0000000000..0aaebe47b9 --- /dev/null +++ b/rdmo/core/assets/js/actions/configActions.js @@ -0,0 +1,9 @@ +import { UPDATE_CONFIG, DELETE_CONFIG } from './actionTypes' + +export function updateConfig(path, value, ls = false) { + return {type: UPDATE_CONFIG, path, value, ls} +} + +export function deleteConfig(path, ls = false) { + return {type: DELETE_CONFIG, path, ls} +} diff --git a/rdmo/core/assets/js/actions/pendingActions.js b/rdmo/core/assets/js/actions/pendingActions.js new file mode 100644 index 0000000000..2ee4aaf514 --- /dev/null +++ b/rdmo/core/assets/js/actions/pendingActions.js @@ -0,0 +1,9 @@ +import { ADD_TO_PENDING, REMOVE_FROM_PENDING } from './actionTypes' + +export function addToPending(item) { + return {type: ADD_TO_PENDING, item} +} + +export function removeFromPending(item) { + return {type: REMOVE_FROM_PENDING, item} +} diff --git a/rdmo/core/assets/js/actions/settingsActions.js b/rdmo/core/assets/js/actions/settingsActions.js new file mode 100644 index 0000000000..d95f6be36a --- /dev/null +++ b/rdmo/core/assets/js/actions/settingsActions.js @@ -0,0 +1,25 @@ +import CoreApi from '../api/CoreApi' + +import { FETCH_SETTINGS_ERROR, FETCH_SETTINGS_INIT, FETCH_SETTINGS_SUCCESS } from './actionTypes' + +export function fetchSettings() { + return function(dispatch) { + dispatch(fetchSettingsInit()) + + return CoreApi.fetchSettings() + .then((settings) => dispatch(fetchSettingsSuccess(settings))) + .catch((errors) => dispatch(fetchSettingsError(errors))) + } +} + +export function fetchSettingsInit() { + return {type: FETCH_SETTINGS_INIT} +} + +export function fetchSettingsSuccess(settings) { + return {type: FETCH_SETTINGS_SUCCESS, settings} +} + +export function fetchSettingsError(errors) { + return {type: FETCH_SETTINGS_ERROR, errors} +} diff --git a/rdmo/core/assets/js/actions/templateActions.js b/rdmo/core/assets/js/actions/templateActions.js new file mode 100644 index 0000000000..90e598e342 --- /dev/null +++ b/rdmo/core/assets/js/actions/templateActions.js @@ -0,0 +1,25 @@ +import CoreApi from '../api/CoreApi' + +import { FETCH_TEMPLATES_ERROR, FETCH_TEMPLATES_INIT, FETCH_TEMPLATES_SUCCESS } from './actionTypes' + +export function fetchTemplates() { + return function(dispatch) { + dispatch(fetchTemplatesInit()) + + return CoreApi.fetchTemplates() + .then((templates) => dispatch(fetchTemplatesSuccess(templates))) + .catch((errors) => dispatch(fetchTemplatesError(errors))) + } +} + +export function fetchTemplatesInit() { + return {type: FETCH_TEMPLATES_INIT} +} + +export function fetchTemplatesSuccess(templates) { + return {type: FETCH_TEMPLATES_SUCCESS, templates} +} + +export function fetchTemplatesError(errors) { + return {type: FETCH_TEMPLATES_ERROR, errors} +} diff --git a/rdmo/core/assets/js/actions/userActions.js b/rdmo/core/assets/js/actions/userActions.js new file mode 100644 index 0000000000..2c2922428d --- /dev/null +++ b/rdmo/core/assets/js/actions/userActions.js @@ -0,0 +1,25 @@ +import AccountsApi from '../api/AccountsApi' + +import { FETCH_CURRENT_USER_ERROR, FETCH_CURRENT_USER_INIT, FETCH_CURRENT_USER_SUCCESS } from './actionTypes' + +export function fetchCurrentUser() { + return function(dispatch) { + dispatch(fetchCurrentUserInit()) + + return AccountsApi.fetchCurrentUser(true) + .then(currentUser => dispatch(fetchCurrentUserSuccess({ currentUser }))) + .catch(error => dispatch(fetchCurrentUserError(error))) + } +} + +export function fetchCurrentUserInit() { + return {type: FETCH_CURRENT_USER_INIT} +} + +export function fetchCurrentUserSuccess(currentUser) { + return {type: FETCH_CURRENT_USER_SUCCESS, currentUser} +} + +export function fetchCurrentUserError(error) { + return {type: FETCH_CURRENT_USER_ERROR, error} +} diff --git a/rdmo/core/assets/js/api/AccountsApi.js b/rdmo/core/assets/js/api/AccountsApi.js new file mode 100644 index 0000000000..94e42a94ad --- /dev/null +++ b/rdmo/core/assets/js/api/AccountsApi.js @@ -0,0 +1,9 @@ +import BaseApi from 'rdmo/core/assets/js/api/BaseApi' + +class AccountsApi extends BaseApi { + static fetchCurrentUser() { + return this.get('/api/v1/accounts/users/current/') + } +} + +export default AccountsApi diff --git a/rdmo/core/assets/js/api/CoreApi.js b/rdmo/core/assets/js/api/CoreApi.js index ef77eb4701..d97cfc2983 100644 --- a/rdmo/core/assets/js/api/CoreApi.js +++ b/rdmo/core/assets/js/api/CoreApi.js @@ -14,6 +14,10 @@ class CoreApi extends BaseApi { return this.get('/api/v1/core/groups/') } + static fetchTemplates() { + return this.get('/api/v1/core/templates/') + } + } export default CoreApi diff --git a/rdmo/core/assets/js/reducers/configReducer.js b/rdmo/core/assets/js/reducers/configReducer.js new file mode 100644 index 0000000000..9001d4e8c4 --- /dev/null +++ b/rdmo/core/assets/js/reducers/configReducer.js @@ -0,0 +1,22 @@ +import { updateConfig, deleteConfig, setConfigInLocalStorage, deleteConfigInLocalStorage } from '../utils/config' + +import { DELETE_CONFIG, UPDATE_CONFIG } from '../actions/actionTypes' + +const initialState = {} + +export default function configReducer(state = initialState, action) { + switch(action.type) { + case UPDATE_CONFIG: + if (action.ls) { + setConfigInLocalStorage(state.prefix, action.path, action.value) + } + return updateConfig(state, action.path, action.value) + case DELETE_CONFIG: + if (action.ls) { + deleteConfigInLocalStorage(state.prefix, action.path) + } + return deleteConfig(state, action.path) + default: + return state + } +} diff --git a/rdmo/core/assets/js/reducers/pendingReducer.js b/rdmo/core/assets/js/reducers/pendingReducer.js new file mode 100644 index 0000000000..7f5b9de1cc --- /dev/null +++ b/rdmo/core/assets/js/reducers/pendingReducer.js @@ -0,0 +1,16 @@ +import { ADD_TO_PENDING, REMOVE_FROM_PENDING } from '../actions/actionTypes' + +const initialState = { + items: [] +} + +export default function pendingReducer(state = initialState, action) { + switch(action.type) { + case ADD_TO_PENDING: + return { ...state, items: [...state.items, action.item] } + case REMOVE_FROM_PENDING: + return { ...state, items: state.items.filter((item) => (item != action.item)) } + default: + return state + } +} diff --git a/rdmo/core/assets/js/reducers/settingsReducer.js b/rdmo/core/assets/js/reducers/settingsReducer.js new file mode 100644 index 0000000000..379f1829de --- /dev/null +++ b/rdmo/core/assets/js/reducers/settingsReducer.js @@ -0,0 +1,14 @@ +import { FETCH_SETTINGS_ERROR, FETCH_SETTINGS_SUCCESS } from '../actions/actionTypes' + +const initialState = {} + +export default function settingsReducer(state = initialState, action) { + switch(action.type) { + case FETCH_SETTINGS_SUCCESS: + return { ...state, ...action.settings } + case FETCH_SETTINGS_ERROR: + return { ...state, errors: action.errors } + default: + return state + } +} diff --git a/rdmo/core/assets/js/reducers/templateReducer.js b/rdmo/core/assets/js/reducers/templateReducer.js new file mode 100644 index 0000000000..b7897f2eb8 --- /dev/null +++ b/rdmo/core/assets/js/reducers/templateReducer.js @@ -0,0 +1,14 @@ +import { FETCH_TEMPLATES_ERROR, FETCH_TEMPLATES_SUCCESS } from '../actions/actionTypes' + +const initialState = {} + +export default function templateReducer(state = initialState, action) { + switch(action.type) { + case FETCH_TEMPLATES_SUCCESS: + return { ...state, ...action.templates } + case FETCH_TEMPLATES_ERROR: + return { ...state, errors: action.errors } + default: + return state + } +} diff --git a/rdmo/core/assets/js/reducers/userReducer.js b/rdmo/core/assets/js/reducers/userReducer.js new file mode 100644 index 0000000000..8c76285f56 --- /dev/null +++ b/rdmo/core/assets/js/reducers/userReducer.js @@ -0,0 +1,18 @@ +import { FETCH_CURRENT_USER_ERROR, FETCH_CURRENT_USER_INIT, FETCH_CURRENT_USER_SUCCESS } from '../actions/actionTypes' + +const initialState = { + currentUser: {}, +} + +export default function userReducer(state = initialState, action) { + switch(action.type) { + case FETCH_CURRENT_USER_INIT: + return {...state, ...action.currentUser} + case FETCH_CURRENT_USER_SUCCESS: + return {...state, ...action.currentUser} + case FETCH_CURRENT_USER_ERROR: + return {...state, errors: action.error.errors} + default: + return state + } +} diff --git a/rdmo/core/assets/js/utils/config.js b/rdmo/core/assets/js/utils/config.js new file mode 100644 index 0000000000..22b1be6460 --- /dev/null +++ b/rdmo/core/assets/js/utils/config.js @@ -0,0 +1,58 @@ +import { set, unset, toNumber, isNaN } from 'lodash' + +const updateConfig = (config, path, value) => { + const newConfig = {...config} + set(newConfig, path, value) + return newConfig +} + +const deleteConfig = (config, path) => { + const newConfig = {...config} + unset(newConfig, path) + return newConfig +} + +const getConfigFromLocalStorage = (prefix) => { + const ls = {...localStorage} + + return Object.entries(ls) + .filter(([lsPath,]) => lsPath.startsWith(prefix)) + .map(([lsPath, lsValue]) => { + if (lsPath.startsWith(prefix)) { + const path = lsPath.replace(`${prefix}.`, '') + + // check if it is literal 'true' or 'false' + if (lsValue === 'true') { + return [path, true] + } else if (lsValue === 'false') { + return [path, false] + } + + // check if the value is number or a string + const numberValue = toNumber(lsValue) + if (isNaN(numberValue)) { + return [path, lsValue] + } else { + return [path, numberValue] + } + } else { + return null + } + }) +} + +const setConfigInLocalStorage = (prefix, path, value) => { + localStorage.setItem(`${prefix}.${path}`, value) +} + +const deleteConfigInLocalStorage = (prefix, path) => { + localStorage.removeItem(`${prefix}.${path}`) +} + +export { + updateConfig, + deleteConfig, + getConfigFromLocalStorage, + setConfigInLocalStorage, + deleteConfigInLocalStorage +} From 7b6c73f0574cc5a797ea978bf49e44c746dc63c8 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:36:11 +0200 Subject: [PATCH 004/160] Add HTML component to core assets --- rdmo/core/assets/js/components/Html.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 rdmo/core/assets/js/components/Html.js diff --git a/rdmo/core/assets/js/components/Html.js b/rdmo/core/assets/js/components/Html.js new file mode 100644 index 0000000000..d0f18d4fe0 --- /dev/null +++ b/rdmo/core/assets/js/components/Html.js @@ -0,0 +1,20 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { isEmpty } from 'lodash' + +const Html = ({ html }) => { + return !isEmpty(html) && ( +

+ ) +} + +Html.defaultProps = { + className: '' +} + +Html.propTypes = { + className: PropTypes.string, + html: PropTypes.string +} + +export default Html From d5d9d528e88b1aa748029e90792822db1fb3c2b0 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:36:25 +0200 Subject: [PATCH 005/160] Add Pending component to core assets --- rdmo/core/assets/js/containers/Pending.js | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 rdmo/core/assets/js/containers/Pending.js diff --git a/rdmo/core/assets/js/containers/Pending.js b/rdmo/core/assets/js/containers/Pending.js new file mode 100644 index 0000000000..07609f8a79 --- /dev/null +++ b/rdmo/core/assets/js/containers/Pending.js @@ -0,0 +1,24 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { connect } from 'react-redux' +import { isEmpty } from 'lodash' + +const Pending = ({ pending }) => { + return ( + !isEmpty(pending.items) && ( + + ) + ) +} + +Pending.propTypes = { + pending: PropTypes.object.isRequired, +} + +function mapStateToProps(state) { + return { + pending: state.pending, + } +} + +export default connect(mapStateToProps)(Pending) From f5a549caf112066f6ace1bc8e0bc7715f43b853f Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:37:07 +0200 Subject: [PATCH 006/160] Refactor meta.js in core assets --- rdmo/core/assets/js/api/BaseApi.js | 2 +- rdmo/core/assets/js/utils/baseUrl.js | 2 -- rdmo/core/assets/js/utils/index.js | 5 +---- rdmo/core/assets/js/utils/language.js | 2 -- rdmo/core/assets/js/utils/meta.js | 9 +++++++++ rdmo/core/assets/js/utils/siteId.js | 2 -- rdmo/core/assets/js/utils/staticUrl.js | 2 -- rdmo/management/assets/js/reducers/configReducer.js | 2 +- rdmo/projects/assets/js/projects/api/ProjectsApi.js | 2 +- rdmo/projects/assets/js/projects/utils/userIsManager.js | 2 +- 10 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 rdmo/core/assets/js/utils/baseUrl.js delete mode 100644 rdmo/core/assets/js/utils/language.js create mode 100644 rdmo/core/assets/js/utils/meta.js delete mode 100644 rdmo/core/assets/js/utils/siteId.js delete mode 100644 rdmo/core/assets/js/utils/staticUrl.js diff --git a/rdmo/core/assets/js/api/BaseApi.js b/rdmo/core/assets/js/api/BaseApi.js index b993faaf08..deb75e1a2e 100644 --- a/rdmo/core/assets/js/api/BaseApi.js +++ b/rdmo/core/assets/js/api/BaseApi.js @@ -1,7 +1,7 @@ import Cookies from 'js-cookie' import isUndefined from 'lodash/isUndefined' -import baseUrl from '../utils/baseUrl' +import { baseUrl } from '../utils/meta' function ApiError(statusText, status) { this.status = status diff --git a/rdmo/core/assets/js/utils/baseUrl.js b/rdmo/core/assets/js/utils/baseUrl.js deleted file mode 100644 index 22a17df960..0000000000 --- a/rdmo/core/assets/js/utils/baseUrl.js +++ /dev/null @@ -1,2 +0,0 @@ -// take the baseurl from the of the django template -export default document.querySelector('meta[name="baseurl"]').content.replace(/\/+$/, '') diff --git a/rdmo/core/assets/js/utils/index.js b/rdmo/core/assets/js/utils/index.js index c2d32da182..30d03229a7 100644 --- a/rdmo/core/assets/js/utils/index.js +++ b/rdmo/core/assets/js/utils/index.js @@ -1,5 +1,2 @@ export * from './api' -export { default as baseUrl } from './baseUrl' -export { default as language } from './language' -export { default as siteId } from './siteId' -export { default as staticUrl } from './staticUrl' +export { baseUrl, language, siteId, staticUrl } from './meta' diff --git a/rdmo/core/assets/js/utils/language.js b/rdmo/core/assets/js/utils/language.js deleted file mode 100644 index 58dc8a369e..0000000000 --- a/rdmo/core/assets/js/utils/language.js +++ /dev/null @@ -1,2 +0,0 @@ -// take the language from the of the django template -export default document.querySelector('meta[name="language"]').content diff --git a/rdmo/core/assets/js/utils/meta.js b/rdmo/core/assets/js/utils/meta.js new file mode 100644 index 0000000000..d8186e6c2f --- /dev/null +++ b/rdmo/core/assets/js/utils/meta.js @@ -0,0 +1,9 @@ +// take information from the of the django template + +export const baseUrl = document.querySelector('meta[name="baseurl"]').content.replace(/\/+$/, '') + +export const staticUrl = document.querySelector('meta[name="staticurl"]').content.replace(/\/+$/, '') + +export const siteId = Number(document.querySelector('meta[name="site_id"]').content) + +export const language = document.querySelector('meta[name="language"]').content diff --git a/rdmo/core/assets/js/utils/siteId.js b/rdmo/core/assets/js/utils/siteId.js deleted file mode 100644 index 7b413b672e..0000000000 --- a/rdmo/core/assets/js/utils/siteId.js +++ /dev/null @@ -1,2 +0,0 @@ -// take the site_id from the of the django template -export default Number(document.querySelector('meta[name="site_id"]').content) diff --git a/rdmo/core/assets/js/utils/staticUrl.js b/rdmo/core/assets/js/utils/staticUrl.js deleted file mode 100644 index 0a1323cb10..0000000000 --- a/rdmo/core/assets/js/utils/staticUrl.js +++ /dev/null @@ -1,2 +0,0 @@ -// take the staticurl from the of the django template -export default document.querySelector('meta[name="staticurl"]').content.replace(/\/+$/, '') diff --git a/rdmo/management/assets/js/reducers/configReducer.js b/rdmo/management/assets/js/reducers/configReducer.js index 31029c17f0..1476203c16 100644 --- a/rdmo/management/assets/js/reducers/configReducer.js +++ b/rdmo/management/assets/js/reducers/configReducer.js @@ -1,6 +1,6 @@ import set from 'lodash/set' -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' +import { baseUrl } from 'rdmo/core/assets/js/utils/meta' const initialState = { baseUrl: baseUrl + '/management/', diff --git a/rdmo/projects/assets/js/projects/api/ProjectsApi.js b/rdmo/projects/assets/js/projects/api/ProjectsApi.js index 359f2c81e2..efa0e16c40 100644 --- a/rdmo/projects/assets/js/projects/api/ProjectsApi.js +++ b/rdmo/projects/assets/js/projects/api/ProjectsApi.js @@ -1,7 +1,7 @@ import Cookies from 'js-cookie' import BaseApi from 'rdmo/core/assets/js/api/BaseApi' import { encodeParams } from 'rdmo/core/assets/js/utils/api' -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' +import { baseUrl } from 'rdmo/core/assets/js/utils/meta' class ProjectsApi extends BaseApi { diff --git a/rdmo/projects/assets/js/projects/utils/userIsManager.js b/rdmo/projects/assets/js/projects/utils/userIsManager.js index 435d866a33..9b4e77430d 100644 --- a/rdmo/projects/assets/js/projects/utils/userIsManager.js +++ b/rdmo/projects/assets/js/projects/utils/userIsManager.js @@ -1,4 +1,4 @@ -import siteId from 'rdmo/core/assets/js/utils/siteId' +import { siteId } from 'rdmo/core/assets/js/utils/meta' const userIsManager = (currentUser) => { if (currentUser.is_superuser || From 16b8bffc5b31fbf9bc74147e4ff24e0a7a540ca4 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:37:24 +0200 Subject: [PATCH 007/160] Add postFormData to BaseApi --- rdmo/core/assets/js/api/BaseApi.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/rdmo/core/assets/js/api/BaseApi.js b/rdmo/core/assets/js/api/BaseApi.js index deb75e1a2e..7db8e00011 100644 --- a/rdmo/core/assets/js/api/BaseApi.js +++ b/rdmo/core/assets/js/api/BaseApi.js @@ -61,6 +61,28 @@ class BaseApi { }) } + static postFormData(url, formData) { + return fetch(baseUrl + url, { + method: 'POST', + headers: { + 'X-CSRFToken': Cookies.get('csrftoken') + }, + body: formData + }).catch(error => { + throw new ApiError(error.message) + }).then(response => { + if (response.ok) { + return response.json() + } else if (response.status == 400) { + return response.json().then(errors => { + throw new ValidationError(errors) + }) + } else { + throw new ApiError(response.statusText, response.status) + } + }) + } + static put(url, data) { return fetch(baseUrl + url, { method: 'PUT', From c2a73724a793950b52ea111870929dab3511fc80 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:38:05 +0200 Subject: [PATCH 008/160] Add base.js to core assets --- rdmo/core/assets/js/base.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 rdmo/core/assets/js/base.js diff --git a/rdmo/core/assets/js/base.js b/rdmo/core/assets/js/base.js new file mode 100644 index 0000000000..3bab0caba5 --- /dev/null +++ b/rdmo/core/assets/js/base.js @@ -0,0 +1 @@ +import 'bootstrap-sass' From d64298726da61294d8acd9c11d20c860e5108cc4 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 10:43:14 +0200 Subject: [PATCH 009/160] Add templates api --- rdmo/core/settings.py | 2 ++ rdmo/core/tests/test_viewset_templates.py | 32 +++++++++++++++++++++++ rdmo/core/urls/v1.py | 3 ++- rdmo/core/viewsets.py | 14 ++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 rdmo/core/tests/test_viewset_templates.py diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py index 35fa8c667c..31d2860944 100644 --- a/rdmo/core/settings.py +++ b/rdmo/core/settings.py @@ -221,6 +221,8 @@ 'PROJECT_TABLE_PAGE_SIZE' ] +TEMPLATES_API = [] + EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' DEFAULT_FROM_EMAIL = 'info@example.com' diff --git a/rdmo/core/tests/test_viewset_templates.py b/rdmo/core/tests/test_viewset_templates.py new file mode 100644 index 0000000000..ea90ffc989 --- /dev/null +++ b/rdmo/core/tests/test_viewset_templates.py @@ -0,0 +1,32 @@ +import pytest + +from django.urls import reverse + +users = ( + ('owner', 'owner'), + ('manager', 'manager'), + ('author', 'author'), + ('guest', 'guest'), + ('api', 'api'), + ('user', 'user'), + ('anonymous', None), +) + +status_map = { + 'list': { + 'owner': 200, 'manager': 200, 'author': 200, 'guest': 200, 'api': 200, 'user': 200, 'anonymous': 401 + } +} + +urlnames = { + 'list': 'template-list', +} + + +@pytest.mark.parametrize('username,password', users) +def test_list(db, client, username, password): + client.login(username=username, password=password) + + url = reverse(urlnames['list']) + response = client.get(url) + assert response.status_code == status_map['list'][username], response.json() diff --git a/rdmo/core/urls/v1.py b/rdmo/core/urls/v1.py index 442d612de5..6e7139a9a4 100644 --- a/rdmo/core/urls/v1.py +++ b/rdmo/core/urls/v1.py @@ -2,12 +2,13 @@ from rest_framework import routers -from ..viewsets import GroupViewSet, SettingsViewSet, SitesViewSet +from ..viewsets import GroupViewSet, SettingsViewSet, SitesViewSet, TemplatesViewSet router = routers.DefaultRouter() router.register(r'settings', SettingsViewSet, basename='setting') router.register(r'sites', SitesViewSet, basename='site') router.register(r'groups', GroupViewSet, basename='group') +router.register(r'templates', TemplatesViewSet, basename='template') urlpatterns = [ path('accounts/', include('rdmo.accounts.urls.v1')), diff --git a/rdmo/core/viewsets.py b/rdmo/core/viewsets.py index eaa97a2072..ea4e41af1a 100644 --- a/rdmo/core/viewsets.py +++ b/rdmo/core/viewsets.py @@ -1,6 +1,9 @@ +from pathlib import Path + from django.conf import settings from django.contrib.auth.models import Group from django.contrib.sites.models import Site +from django.template.loader import get_template from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated @@ -31,3 +34,14 @@ class GroupViewSet(viewsets.ReadOnlyModelViewSet): permission_classes = (HasModelPermission, ) queryset = Group.objects.all() serializer_class = GroupSerializer + + +class TemplatesViewSet(viewsets.GenericViewSet): + + permission_classes = (IsAuthenticated, ) + + def list(self, request, *args, **kwargs): + return Response({ + Path(template_path).stem: get_template(template_path).render(request=request).strip() + for template_path in settings.TEMPLATES_API + }) From ac23e87059f4b74d191d5e719d1ddcf226a44bb5 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 12:23:21 +0200 Subject: [PATCH 010/160] Update gitignore --- .gitignore | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 2af3bf59da..b59c3bedef 100644 --- a/.gitignore +++ b/.gitignore @@ -36,8 +36,12 @@ dist rdmo/management/static -rdmo/projects/static/projects/js/projects.js +rdmo/core/static/core/js/*.js +rdmo/core/static/core/fonts +rdmo/core/static/core/css/*.css + +rdmo/projects/static/projects/js/*.js rdmo/projects/static/projects/fonts -rdmo/projects/static/projects/css/projects.css +rdmo/projects/static/projects/css/*.css screenshots From 59fd273cb07b03c91df89e5dd09ae5680b8b8fb5 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 12:32:47 +0200 Subject: [PATCH 011/160] Add scss files to core assets and update webpack.config.js accordingly --- rdmo/core/assets/scss/base.scss | 15 + rdmo/core/assets/scss/codemirror.scss | 9 + rdmo/core/assets/scss/fonts.scss | 44 +++ rdmo/core/assets/scss/footer.scss | 55 +++ rdmo/core/assets/scss/header.scss | 89 +++++ rdmo/core/assets/scss/style.scss | 497 ++++++++++++++++++++++++++ rdmo/core/assets/scss/swagger.scss | 28 ++ rdmo/core/assets/scss/utils.scss | 92 +++++ webpack.config.js | 17 +- 9 files changed, 844 insertions(+), 2 deletions(-) create mode 100644 rdmo/core/assets/scss/base.scss create mode 100644 rdmo/core/assets/scss/codemirror.scss create mode 100644 rdmo/core/assets/scss/fonts.scss create mode 100644 rdmo/core/assets/scss/footer.scss create mode 100644 rdmo/core/assets/scss/header.scss create mode 100644 rdmo/core/assets/scss/style.scss create mode 100644 rdmo/core/assets/scss/swagger.scss create mode 100644 rdmo/core/assets/scss/utils.scss diff --git a/rdmo/core/assets/scss/base.scss b/rdmo/core/assets/scss/base.scss new file mode 100644 index 0000000000..dadff686a5 --- /dev/null +++ b/rdmo/core/assets/scss/base.scss @@ -0,0 +1,15 @@ +$icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/"; +@import '~bootstrap-sass'; +@import '~font-awesome/css/font-awesome.css'; + +@import 'react-datepicker/dist/react-datepicker.css'; + +@import 'variables'; +@import 'style'; + +@import 'codemirror'; +@import 'fonts'; +@import 'footer'; +@import 'header'; +@import 'swagger'; +@import 'utils'; diff --git a/rdmo/core/assets/scss/codemirror.scss b/rdmo/core/assets/scss/codemirror.scss new file mode 100644 index 0000000000..be9f2c0bef --- /dev/null +++ b/rdmo/core/assets/scss/codemirror.scss @@ -0,0 +1,9 @@ +.CodeMirror { + font-family: DroidSans-Mono, mono; +} + +formgroup .CodeMirror { + border-radius: 4px; + border: 1px solid #ccc; + color: #555; +} diff --git a/rdmo/core/assets/scss/fonts.scss b/rdmo/core/assets/scss/fonts.scss new file mode 100644 index 0000000000..4d1f217320 --- /dev/null +++ b/rdmo/core/assets/scss/fonts.scss @@ -0,0 +1,44 @@ +@font-face { + font-family: "DroidSans"; + src: url('../fonts/DroidSans.ttf'); +} +@font-face { + font-family: "DroidSans"; + src: url('../fonts/DroidSans-Bold.ttf'); + font-weight: bold; +} +@font-face { + font-family: "DroidSans-Mono"; + src: url('../fonts/DroidSansMono.ttf'); +} +@font-face { + font-family: "DroidSerif"; + src: url('../fonts/DroidSerif.ttf'); +} +@font-face { + font-family: "DroidSerif"; + src: url('../fonts/DroidSerif-Bold.ttf'); + font-weight: bold; +} +@font-face { + font-family: "DroidSerif"; + src: url('../fonts/DroidSerif-Italic.ttf'); + font-style: italic; +} +@font-face { + font-family: "DroidSerif"; + src: url('../fonts/DroidSerif-BoldItalic.ttf'); + font-style: italic; + font-weight: bold; +} + +body { + font-family: DroidSans, sans; +} +h1, h2, h3, h4, h5, h6 { + font-family: DroidSerif, serif; +} + +a.fa { + text-decoration: none !important; +} diff --git a/rdmo/core/assets/scss/footer.scss b/rdmo/core/assets/scss/footer.scss new file mode 100644 index 0000000000..7b4838c053 --- /dev/null +++ b/rdmo/core/assets/scss/footer.scss @@ -0,0 +1,55 @@ +$footer-height: 280px; +$footer-height-md: 600px; +$footer-height-sm: 260px; + +/* footer layout */ + +.content { + min-height: 100%; + margin-bottom: -$footer-height; + padding-bottom: $footer-height; +} +footer { + height: $footer-height; +} +@media (max-width: $screen-sm-max) { + .content { + margin-bottom: -$footer-height-md; + padding-bottom: $footer-height-md; + } + footer { + height: $footer-height-md; + } +} +@media (max-width: $screen-xs-max) { + .content { + margin-bottom: -$footer-height-md; + padding-bottom: $footer-height-md; + } + footer { + height: $footer-height-md; + } +} + +/* footer style */ + +footer { + color: $footer-color; + background-color: $footer-background-color; + padding-top: 20px; + + a, + a:visited, + a:hover { + color: $footer-link-color; + } + h4 { + color: $footer-link-color; + } + p { + text-align: left; + } + img { + display: block; + } +} diff --git a/rdmo/core/assets/scss/header.scss b/rdmo/core/assets/scss/header.scss new file mode 100644 index 0000000000..769b65c0df --- /dev/null +++ b/rdmo/core/assets/scss/header.scss @@ -0,0 +1,89 @@ +$header-height: 400px; +$header-height-md: 300px; + +header { + position: relative; + + height: $header-height; + background-color: black; + + .header-image { + position: absolute; + left: 0; + right: 0; + + opacity: 0; + -webkit-transition: $image-transition; + -moz-transition: $image-transition; + -ms-transition: $image-transition; + -o-transition: $image-transition; + transition: $image-transition; + + &.visible { + opacity: 1; + } + img { + display: block; + width: 100%; + height: $header-height; + } + p { + position: absolute; + bottom: 0; + right: 0; + z-index: 10; + + padding-right: 5px; + margin-bottom: 5px; + font-size: 10px; + color: $footer-link-color; + + } + a, + a:visited, + a:hover { + color: $footer-link-color; + } + } + .header-text { + position: relative; + padding-top: 100px; + + h1 { + font-size: 60px; + color: white; + } + p { + font-size: 30px; + color: white; + } + } +} +@media (max-width: $screen-md-max) { + header { + height: $header-height-md; + } + header .header-image img { + height: $header-height-md; + } + header .header-text { + padding-top: 50px; + } +} +@media (max-width: $screen-xs-max) { + header { + background-color: inherit; + height: auto; + } + header .header-text { + padding-top: 0; + } + header .header-text h1 { + font-size: 40px; + color: $headline-color; + } + header .header-text p { + font-size: 20px; + color: $variant-color; + } +} diff --git a/rdmo/core/assets/scss/style.scss b/rdmo/core/assets/scss/style.scss new file mode 100644 index 0000000000..795a6f9228 --- /dev/null +++ b/rdmo/core/assets/scss/style.scss @@ -0,0 +1,497 @@ +html, body { + height: 100%; + background-color: $background-color; +} + +h1, h2, h3, h4 { + color: $headline-color; + background-color: $headline-background-color; + line-height: 40px; +} +h5, h6 { + color: $headline-color; + background-color: $headline-background-color; + font-size: medium; + line-height: 20px; +} +h1 { + font-size: 28px; +} +h2 { + font-size: 24px; +} +.sidebar h2, +.modal h2 { + font-size: 20px; +} +h3 { + font-size: 16px; +} +h4 { + font-size: 14px; +} +form { + margin-bottom: 20px; +} +.extend { + width: 100%; +} + +a { + color: $link-color; + + &:visited { + color: $link-color-visited; + } + &:hover { + color: $link-color-hover; + } + &:focus { + color: $link-color-focus; + } + + &.btn { + color: white; + + &:visited, + &:hover, + &:focus { + color: white; + } + } + &.text-warning { + &:visited, + &:hover, + &:focus { + color: #8a6d3b; + } + } + &.text-danger { + &:visited, + &:hover, + &:focus { + color: #a94442; + } + } + + &.disabled { + cursor: not-allowed; + } +} + +code { + word-wrap: break-word; + + &.code-questions { + color: rgb(16, 31, 112); + background-color: rgba(16, 31, 112, 0.1); + } + &.code-options { + color: rgb(255, 100, 0); + background-color: rgba(255, 100, 0, 0.1); + } + &.code-options-provider { + color: white; + background-color: rgba(255, 100, 0, 0.8); + } + &.code-conditions { + color: rgb(128, 0, 128); + background-color: rgba(128, 0, 128, 0.1); + } + &.code-tasks { + color: rgb(128, 0, 0); + background-color: rgba(128, 0, 0, 0.1); + } + &.code-views { + color: rgb(0, 128, 0); + background-color: rgba(0, 128, 0, 0.1); + } + &.code-order { + color: rgb(96, 96, 96); + background-color: rgba(96, 96, 96, 0.1); + } + &.code-import { + color: black; + background-color: rgba(96, 96, 96, 0.1); + } +} + +table { + p { + margin-bottom: 5px; + } + p:last-child { + margin-bottom: 0; + } +} + +.table-break-word { + td { + word-break: break-all; + } +} + +details { + margin-bottom: 10px; +} + +summary { + display: list-item; + cursor: pointer; + margin-bottom: 5px; +} + +metadata { + display: none; +} + +/* navbar */ + +.navbar-default { + background-color: $navigation-background-color; + border-bottom: none; + + .navbar-brand, + .navbar-nav > li > a, + .navbar-nav > li > a:focus { + color: $navigation-color; + background-color: transparent; + } + .navbar-brand:hover, + .navbar-nav > li > a:hover, + .navbar-nav > .open > a, + .navbar-nav > .open > a:focus, + .navbar-nav > .open > a:hover { + color: $navigation-hover-color; + background-color: $navigation-hover-background-color; + } + + .dropdown li.divider:first-child { + display: none; + } +} + +/* content */ + +.content { + padding-top: 50px; /* same height as the navbar */ +} +.sidebar { + /* make the sidebar sticky */ + position: -webkit-sticky; + position: sticky; + top: 0; +} +.page, .sidebar { + height: 100%; + margin-top: 10px; + margin-bottom: 60px; +} +.page h2:nth-child(2) { + margin-top: 0; +} +.sidebar h2:first-child, +.sidebar .import-buttons { + margin-top: 70px; +} + +/* questions overview */ + +.section-panel { + +} + +.subsection-panel { + margin-left: 40px; +} + +.group-panel { + margin-left: 80px; + + table th:first-child, + table td:first-child { + padding-left: 15px; + } + + table th:last-child, + table td:last-child { + padding-right: 15px; + } +} + +/* angular forms */ + +.input-collection { + margin-bottom: 15px; +} + +/* forms */ + +.form-label { + margin-bottom: 5px; + font-weight: 700; +} + +form .yesno label { + margin-right: 10px; +} + +.row { + .checkbox, + .radio { + margin-top: 10px; + margin-bottom: 10px; + } + + @media (min-width: $screen-xs-max) { + .checkbox-padding .checkbox, + .radio-padding .radio { + margin-top: 32px; + margin-bottom: 11px; + } + } +} + +.input-xs { + height: 24px; + padding: 5px 10px; + font-size: 11px; + line-height: 1; + border-radius: 2px; +} + +.help-block.info { + margin-top: 0; +} + +.sidebar-form { + display: flex; + gap: 5px; +} + +.upload-form { + .upload-form-field { + position: relative; + + cursor: pointer; + border-radius: 4px; + + flex-grow: 1; + overflow: hidden; + + p, + input { + height: 34px; + margin: 0px; + } + + p { + text-align: left; + cursor: pointer; + + color: $link-color; + border: 1px solid silver; + border-radius: 4px; + + width: calc(100% - 1px); + padding: 6px 14px; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + input { + position: absolute; + z-index: 1; + padding: 0; + opacity: 0; + } + + &:hover { + background-color: #e6e6e6; + } + } +} + +/* modals */ + +.modal-body { + > p:last-child, + formgroup:last-child .form-group { + margin-bottom: 0; + } + + .copy-block { + margin-bottom: 20px; + } + + .help-block { + font-size: small; + word-break: break-word; + } + + .nav.nav-tabs { + margin-bottom: 20px; + } +} + +/* options */ + +.options-dropdown { + display: inline-block; + + > a { + cursor: pointer; + } +} + +/* panels */ + +.panel-default { + min-height: 5px; +} + +.panel-body { + padding-top: 10px; + padding-bottom: 10px; +} + +.panel li > p:last-child { + margin-bottom: 0; +} + +/* lists */ + +ul.list-arrow li { + margin-left: 20px; + + &.active { + margin-left: 0; + } + + &.active a:before { + float: left; + width: 20px; + text-align: right; + content: '\2192\0000a0'; /* right-arrow followed by a space */ + } +} + +/* misc */ +.form-errors { + margin-bottom: 20px; +} +li > a.control-label > i { + display: none; +} +li.has-error > a.control-label > i, +li.has-warning > a.control-label > i { + display: inline; +} +.email-form label, +.connections-form label { + display: block; + margin: 0; + line-height: 40px; + border-bottom: 1px solid $modal-border-color; +} +.email-form label:first-child, +.connections-form label:first-child { + border-top: 1px solid $modal-border-color; +} +.email-form label input, +.connections-form label input { + margin-left: 5px; + margin-right: 5px; +} +.email-form .email-form-buttons, +.connections-form .connections-form-buttons { + margin-top: 10px; +} +.socialaccount_providers { + margin: 0; + padding: 0; + height: 42px; +} +.socialaccount_providers li { + float: left; + margin: 0 5px 10px 5px; + list-style: none; +} +.socialaccount_providers li.socialaccount_provider_break { + float: none; + margin-left: 0; + margin-right: 0; +} +.socialaccount_provider_name { + line-height: 29px; + font-weight: bold; +} +.logout-form { + margin: 0; +} +.logout-form .btn-link { + padding: 3px 20px; + color: $navigation-dropdown-color; + display: block; + width: 100%; + text-align: left; + border: none; + clear: both; + font-weight: 400; + line-height: 1.42857143; + white-space: nowrap; +} +.logout-form .btn-link:hover { + color: $navigation-dropdown-hover-color; + background-color: $navigation-dropdown-hover-background-color; + text-decoration: none; +} +.logout-form .btn-link:focus { + color: $navigation-dropdown-hover-color; + background-color: $navigation-dropdown-hover-background-color; + text-decoration: none; + outline: none; +} +.rdmo-logo { + width: 240px; + margin-top: 40px; +} + +// adjust background "hover" color in select2 to $link-color +.select2-results__option--highlighted{ + background-color: $link-color !important, +} + +.cc-myself { + .checkbox { + margin: 0; + } +} + +.ng-binding { + :last-child { + margin-bottom: 0; + } +} + +.inline_image { + max-width: 100%; +} + +[data-toggle="tooltip"] { + cursor: help; + text-decoration: underline; + text-decoration-style: dotted; +} + +.more, +.show-less { + display: none; +} +.show-more, +.show-less { + color: $link-color; + cursor: pointer; +} diff --git a/rdmo/core/assets/scss/swagger.scss b/rdmo/core/assets/scss/swagger.scss new file mode 100644 index 0000000000..0a0ecc6cac --- /dev/null +++ b/rdmo/core/assets/scss/swagger.scss @@ -0,0 +1,28 @@ +.topbar { + background-color: $headline-color !important; +} + +.swagger-ui .info { + margin: 30px; +} + +.swagger-ui .btn.authorize { + border-color: $footer-background-color; + color: $text-color; +} + +.swagger-ui .btn.authorize svg { + fill: $footer-background-color; +} + +.swagger-ui .btn.authorize { + color: $footer-background-color !important; +} + +.topbar img { + filter: hue-rotate(180deg) +} + +.download-url-wrapper .download-url-button { + background-color: $headline-color !important; +} diff --git a/rdmo/core/assets/scss/utils.scss b/rdmo/core/assets/scss/utils.scss new file mode 100644 index 0000000000..0e45f92470 --- /dev/null +++ b/rdmo/core/assets/scss/utils.scss @@ -0,0 +1,92 @@ +.flip { + transform: rotate(180deg) scaleX(-1); +} + +.w-100 { + width: 100%; +} +.mt-0 { + margin-top: 0; +} +.mt-5 { + margin-top: 5px; +} +.mt-10 { + margin-top: 10px; +} +.mt-20 { + margin-top: 20px; +} +.mr-0 { + margin-right: 0; +} +.mr-5 { + margin-right: 5px; +} +.mr-10 { + margin-right: 10px; +} +.mr-20 { + margin-right: 20px; +} +.mb-0 { + margin-bottom: 0; +} +.mb-5 { + margin-bottom: 5px; +} +.mb-10 { + margin-bottom: 10px; +} +.mb-20 { + margin-bottom: 20px; +} +.ml-0 { + margin-left: 0; +} +.ml-5 { + margin-left: 5px; +} +.ml-10 { + margin-left: 10px; +} +.ml-20 { + margin-left: 20px; +} + +.pt-0 { + padding-top: 0; +} +.pt-10 { + padding-top: 10px; +} +.pt-20 { + padding-top: 20px; +} +.pr-0 { + padding-right: 0; +} +.pr-10 { + padding-right: 10px; +} +.pr-20 { + padding-right: 20px; +} +.pb-0 { + padding-bottom: 0; +} +.pb-10 { + padding-bottom: 10px; +} +.pb-20 { + padding-bottom: 20px; +} +.pl-0 { + padding-left: 0; +} +.pl-10 { + padding-left: 10px; +} +.pl-20 { + padding-left: 20px; +} diff --git a/webpack.config.js b/webpack.config.js index cc71e803bb..d1d630dd32 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -6,6 +6,18 @@ const TerserPlugin = require('terser-webpack-plugin') // list of separate config objects for each django app and their corresponding java script applications const configList = [ + { + name: 'core', + entry: { + base: [ + './rdmo/core/assets/js/base.js', + './rdmo/core/assets/scss/base.scss' + ] + }, + output: { + path: path.resolve(__dirname, './rdmo/core/static/core/'), + } + }, { name: 'management', entry: { @@ -15,7 +27,6 @@ const configList = [ ] }, output: { - filename: 'js/management.js', path: path.resolve(__dirname, './rdmo/management/static/management/'), } }, @@ -28,7 +39,6 @@ const configList = [ ] }, output: { - filename: 'js/projects.js', path: path.resolve(__dirname, './rdmo/projects/static/projects/'), } } @@ -42,6 +52,9 @@ const baseConfig = { }, extensions: ['*', '.js', '.jsx'] }, + output: { + filename: 'js/[name].js' + }, plugins: [ new MiniCssExtractPlugin({ filename: 'css/[name].css', From fba7f34e04446eb87dbd24f88b7259ea57ffca2d Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 12:39:59 +0200 Subject: [PATCH 012/160] Remove fonts from core static --- rdmo/core/static/core/fonts/DroidSans-Bold.ttf | Bin 42480 -> 0 bytes rdmo/core/static/core/fonts/DroidSans.ttf | Bin 41028 -> 0 bytes rdmo/core/static/core/fonts/DroidSansMono.ttf | Bin 117072 -> 0 bytes .../core/static/core/fonts/DroidSerif-Bold.ttf | Bin 48880 -> 0 bytes .../core/fonts/DroidSerif-BoldItalic.ttf | Bin 45652 -> 0 bytes .../static/core/fonts/DroidSerif-Italic.ttf | Bin 40416 -> 0 bytes rdmo/core/static/core/fonts/DroidSerif.ttf | Bin 43648 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 rdmo/core/static/core/fonts/DroidSans-Bold.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSans.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSansMono.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSerif-Bold.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSerif-BoldItalic.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSerif-Italic.ttf delete mode 100755 rdmo/core/static/core/fonts/DroidSerif.ttf diff --git a/rdmo/core/static/core/fonts/DroidSans-Bold.ttf b/rdmo/core/static/core/fonts/DroidSans-Bold.ttf deleted file mode 100755 index 942bbf5ba3aa04288175d094bc9c11d109c5726c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42480 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 diff --git a/rdmo/core/static/core/fonts/DroidSans.ttf b/rdmo/core/static/core/fonts/DroidSans.ttf deleted file mode 100755 index efd1f8bbd882a6a434159fa1da7238babbaa2fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41028 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 diff --git a/rdmo/core/static/core/fonts/DroidSansMono.ttf b/rdmo/core/static/core/fonts/DroidSansMono.ttf deleted file mode 100755 index d604425b26f52cc6415ccaa028d4b420f8043447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117072 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

W 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%0Af{&4mIbob9fcW-0spL$F4Yt5hGq)a`$ zLT_r3`e0}W_AE~X})4LCN(5&Op=pGqz!K%_yBzb z10RT_g)1^4O_L51sL_=IJ<^Mzl{Eh!*cv0%CZ1-hjznxXS!$NlTCKJ9)s~xMHUJ8q zq#0-!7E5Vqv6TC%q?HFXR`ow0vl;>)kB+}irY5UXeAe*E$ zS^KhXCzGVL_Wkxdgf-F{?>_JCutqYf8`K+7GRn7F6cYlA>8WQ!}HTH#}9e zI8vvtX_x+Y)zcqMrz*$cB%<45)3%GFg)XVvP;a1R}O!dd=|#Ka7LR+irZ$SgnB z+fSnnKF~O^r^=yw7h&Z_o?)q|qkL@1 zzBzR=Rcf%05-_ehJ1mPwC@r5X6uocS43W_ zBfeA{GBTWc#e7B zvzcseTc1s3E3({|rO`M=8)AZ_R3Wt^(K8)4k~9ZjsL!(+m2B!yZ)V9w?OfQrsGXxd ze{a(dozWEY1OdET)WPmp9ZW=)2Lwd~u0RFM)5b#K3Bq2gLNRRzokqXQAN0$9|LHB( z2g3(Z?)!>}a!_tedg9bWMJFm+RP?i&P<_^&a}XDQIDc)7>a+8*(|a1$Z2bayJG1C< zDx~(u9?|k{L5D%?akK1PWj|Mm;|2B`*g^CXg+`4ft`aF;@Nb4dtfflP2^tfPPI6OG zcIrTITs*6k|J`z*o4ywpJJp_UjTM`-Nq$gzUgg9%v=uf?5QxGuRyZ5OGWO@fI#8m! zA=bxkVRyqoM9o;Y{xSVg{hRua^=iGvWeHj~T1G8$Q zMPQ^w^Z%GFrSO$F%{+FpaK&(>Zn!%b>>jR*46i7Z-d=xYm)qTS<@$@SSmt&wyMp*D z*|SK?gkEb59f034-ZSF#4iC&8@+S^WMDMut30}HYogg3Zw zWrZns*}Hd3?|cgpK$F?hGT8(hB^%Z)n<5SF)JUqeJ#{UXXldqYGhb`ohP~U;sd>iG zKq}Vl#g2HX=_#_CU;x~1eJ1&vW~RLdAAp3oVHNhH4hBd}M_V{xFogsT_~`)>;FD1Y znU)LtDk#w_IHFmg)u>G7TDeRbPqw+t1<`_PbCxwZdO5%SnY*F~)!3v#{ky1K+qPh8 z)wW71KlR%YzS#|vk8EA^IT~*m%jCUi9_6o`ZI7K}YgqPF>|8=AUW=W}%)#}sa}_i3 z_Sm@^^M`%0a}6`{AI8qLY`GNMZ37k|Y0|G__w~G0y+3vi!vifLI?-PuE7pEFcAmtF zb>`T4GV|*WqJ6M)31V$SP|mT_AG<4dPJ0a>i=6{Hl>IbzPEP*5*twb&!dXpuR>QLR zw_@j7_6`1e>|Dq4rSHYg_0m_Qzs1fCtV;7n>^zaJ*T&OK!ub=i`^l_F7lCwq2>av= zu_=Vh;2E`rxe@wt-H)@)u#g{P(`-V-+J?Js_8>wj_IL_mol}VOHpCf48pC+n&6;pN zfoJHOQW?V84(ticnui95riLyX*y7&OKh^KvJUTW#F*LYs%Kf0bG!&{VbhnL;4h|2v zn?@(bMko5GhDLYLQ%GhMiBPsy;{}wFt++igI<&>TdSGG*7fTUi7%|w=(P4ZyvPtB7 z0B_wQ9&ke&@BV^>+zSskPHrC9v1MSwUF2Srx?4%}+}T+4^x2Q}ikDBuD!>hud9kQ8 zHvolq;x6Tw?v{{pxp!b<5(Rdb6o*3YO*@B%x4276aDU;w3xzLQ$g_B>sD+}l^Erfi zaEn%)5^X`XF@oy}b}8f% zy%F{A5TzcOr|1dv1~#OT&i~>gF&RF)ZJF3J0WUs z6m_j!Q5|lI^&zU`eo=!v@D#Nb)iqHy{X&#ojOzv3I9L8Bkrus^`mB-5B9HLRGCxvFI?^0S+uT*xWjz+|<@m3)^qpn2xiI;@<7^M)eL8?<~ z2f9z~wj1T5YkDFccMP%VP1GiFdZqS{=V2FO6E9Orv$!=C{z$YzDUKj0^%PH;a!S8a zS_&ULv(@OAMSVkbWw+=dn@4v{4U7;coS1e`5~FiZO^*$1?cY4$-r7GhG(7FzGB7zb zxC4D;>*xgd=?D%}{hPo-CkFbr4DA?ngP}}ro){R|QG6OpL;91$#CnkiUbAIj$0QP& z8b$BhGc*Dg?Vj2;;O-w8-MM3m`sdWZo+9&M723>K>Y!6dCN_G&DRkHSONLZ3tPWyJHih zC@=MHC52rB6Z9ITm{h>A;en9>k*FB&paUApSBClQO^&8={Uv9h6={OeNlR8wKHQj&)3Hn}ZVd7A;?ar0;INXl$>6e%rk3TaTZ%*mXw^)Ab6deB&h_^*+@y_Q zfa#9~hz5?N*iQ&P#|F&clA!lC!W+~KZ-`WZ)SeDWf(P#gdmS3;|^n)N^f-^u+JNfLvZ;FS9q;tC%sr&VGm5`x%yKKVjd&sPQqomHiL)@9ZtK z@Bd^U!4_gW+U`<8uRE}m8)f4lFQQ}Ozq`=MevdKXGVs{T*_G@H_B8uvnAU%ZUB#|u zC)pp^v+OwgIeVAA%^qh@up^kS|A@`9C)o>ZANwIzUf<^`?am!Tp-^LU!YKOvB>LV! z;?~if6O%i~!2CuhsAXx^EJ3C$ix$P#i_ynU&=1caD*ud*FIl^j#VkA-7dE_|pnFO@dWzo4Dd=-V%oXebd|ro8?-x>) zv`gAAr^q4s$5Iu0U8;h7U9bX zGYHoq>_gZ;rw8pD@oh%PnLC7-hY<4+Vje=wLx_0@F%Kc;diFBnyoL~FYFz0NlIF&l zXKsf1=8iKzLMcKyLM851;aH70HHcG((2DCegm#2ZgjEPV2x}28Li}}e$6$kUh~0+k ze?mBja67^s2!{~vMEC~6Hxa&ta2L{i5XXlQzK!rO!XpTeBg`T^iEsqrDTJpHo<;Z` z!uJt=fbc_v=kUJg5&jKny^3H(iH@U0$59tl3M#>)D8VsSi}O01*Wc^4#aio46{N?nNk0a&dv6PRUC$&RJ?HDMo z8nNk#I)u9rJjmrZYsQ;e5!w*i5vaXaA@m?zgWs=3_%gx_!gUDy5cbcx*gg3DUWCI4 z|AKHI!u<#jAUufh5W=?+9!7Ws;cAUuWeG{Un8T2V5kz83PhKbBAMN}MgG zkMq%jLI=mbkPiOu+x!?>GXRUfzyg z-VT~MyT3Lg&#ee;2<-@+2&)i!5UxS|YZ1PTFoSR%!afAz2wzmbd+^-72!|2=1>rt~ z`w<>Mco5+sgl{7}jPMA;;|Q||Pa+&acnaZZgl7?6MxI|o(273!MSZRW<#VBYF2q`Y z7QHnizpV&u2<-@+2&)i!5PCtsU&tS$pPr|TGbrN>$~c2E&Y+AlDB}#uID<0Ipo}vp z;|$6;gEG#bj58?X49YlzGR~lkGbrN>$~c2Ex==iZ5)X^OoQcN^l4z zID`@$LJ1C`1cy+9L;sBuD6M2XtM0>~Z>3LvF>jCa;Zl@;Jz8wahmSY%Mj)4=NuO-LP zlH+K}akS((T5=pMIgXYbM@x>QCCAZ{<7mlowB$Hiay?pdJ?58c(3Kv6_&~fDl9lDc zl@75EV+L{pL4KmgZe*8k~g#@f~>M#<~ zdLSKZfey@7yYR7NHLx5jkCj*pIItGD5VKTT3AnHlSdTTxHJI6Z*bSKD7qGA5Q^am# wcOXUdUwGd=4hm|-O#4}^FP>x1Bh{DCj>|C9e+8+==e?Oo^UQfKeq`+b0Ne2S_5c6? diff --git a/rdmo/core/static/core/fonts/DroidSerif-BoldItalic.ttf b/rdmo/core/static/core/fonts/DroidSerif-BoldItalic.ttf deleted file mode 100755 index 045e8a625fabed3c93b990cf4f7cd9869936f077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45652 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 P>%GxPbE)2o9~t{E6I-u` From 9d6b5ca3327d39e687566764c85a02fd62b17bc5 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 12:40:08 +0200 Subject: [PATCH 013/160] Update .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b59c3bedef..3d2c0d88b1 100644 --- a/.gitignore +++ b/.gitignore @@ -36,9 +36,9 @@ dist rdmo/management/static -rdmo/core/static/core/js/*.js +rdmo/core/static/core/js/base.js rdmo/core/static/core/fonts -rdmo/core/static/core/css/*.css +rdmo/core/static/core/css/base.css rdmo/projects/static/projects/js/*.js rdmo/projects/static/projects/fonts From e4fe7757335acb6c86a7b9afdbb32f911e1facd1 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 13:13:41 +0200 Subject: [PATCH 014/160] Refactor Modal.js --- rdmo/core/assets/js/components/Modal.js | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/rdmo/core/assets/js/components/Modal.js b/rdmo/core/assets/js/components/Modal.js index a3f2cd70b8..22c07abeab 100644 --- a/rdmo/core/assets/js/components/Modal.js +++ b/rdmo/core/assets/js/components/Modal.js @@ -2,9 +2,9 @@ import React from 'react' import PropTypes from 'prop-types' import { Modal as BootstrapModal } from 'react-bootstrap' -const Modal = ({ bsSize, buttonLabel, buttonProps, title, show, onClose, onSave, children }) => { +const Modal = ({ title, show, modalProps, submitLabel, submitProps, onClose, onSubmit, children }) => { return ( - +

{title}

@@ -15,11 +15,12 @@ const Modal = ({ bsSize, buttonLabel, buttonProps, title, show, onClose, onSave, - { onSave ? - - : null + { + onSubmit && ( + + ) } @@ -27,14 +28,14 @@ const Modal = ({ bsSize, buttonLabel, buttonProps, title, show, onClose, onSave, } Modal.propTypes = { - bsSize: PropTypes.oneOf(['lg', 'large', 'sm', 'small']), - buttonLabel: PropTypes.string, - buttonProps: PropTypes.object, - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired, - onClose: PropTypes.func.isRequired, - onSave: PropTypes.func, - show: PropTypes.bool.isRequired, title: PropTypes.string.isRequired, + show: PropTypes.bool.isRequired, + modalProps: PropTypes.object, + submitLabel: PropTypes.string, + submitProps: PropTypes.object, + onClose: PropTypes.func.isRequired, + onSubmit: PropTypes.func, + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired, } export default Modal From 70f7a8af5fb5ca7ef2797914ac959134fdb8b4d0 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 13:24:24 +0200 Subject: [PATCH 015/160] Remove defaultProps from Html.js --- rdmo/core/assets/js/components/Html.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/rdmo/core/assets/js/components/Html.js b/rdmo/core/assets/js/components/Html.js index d0f18d4fe0..acd13bbd23 100644 --- a/rdmo/core/assets/js/components/Html.js +++ b/rdmo/core/assets/js/components/Html.js @@ -2,16 +2,12 @@ import React from 'react' import PropTypes from 'prop-types' import { isEmpty } from 'lodash' -const Html = ({ html }) => { +const Html = ({ html = '' }) => { return !isEmpty(html) && (
) } -Html.defaultProps = { - className: '' -} - Html.propTypes = { className: PropTypes.string, html: PropTypes.string From c009f3ca233e6a862de9a94a988e30320ecbeec2 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 15:53:55 +0200 Subject: [PATCH 016/160] Add store.js to core assets --- rdmo/core/assets/js/utils/store.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 rdmo/core/assets/js/utils/store.js diff --git a/rdmo/core/assets/js/utils/store.js b/rdmo/core/assets/js/utils/store.js new file mode 100644 index 0000000000..d30203fd59 --- /dev/null +++ b/rdmo/core/assets/js/utils/store.js @@ -0,0 +1,14 @@ +import Cookies from 'js-cookie' +import isEmpty from 'lodash/isEmpty' + +const checkStoreId = () => { + const currentStoreId = Cookies.get('storeid') + const localStoreId = localStorage.getItem('rdmo.storeid') + + if (isEmpty(localStoreId) || localStoreId !== currentStoreId) { + localStorage.clear() + localStorage.setItem('rdmo.storeid', currentStoreId) + } +} + +export { checkStoreId } From 886e8d590d8b679ce45dd1bdfd215ae30d29a384 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 14 Nov 2024 16:12:38 +0100 Subject: [PATCH 017/160] Fix projects assets --- .../assets/js/projects/components/helper/PendingInvitations.js | 2 +- rdmo/projects/assets/js/projects/components/main/Projects.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js b/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js index e2c13fcfff..6338e0eb7c 100644 --- a/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js +++ b/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' +import baseUrl from 'rdmo/core/assets/js/utils/meta' import { ROLE_LABELS } from '../../utils' diff --git a/rdmo/projects/assets/js/projects/components/main/Projects.js b/rdmo/projects/assets/js/projects/components/main/Projects.js index 585b9eb354..34c56d4fbc 100644 --- a/rdmo/projects/assets/js/projects/components/main/Projects.js +++ b/rdmo/projects/assets/js/projects/components/main/Projects.js @@ -5,7 +5,7 @@ import { get, isEmpty } from 'lodash' import { Link, Modal, SearchField } from 'rdmo/core/assets/js/components' import { useFormattedDateTime, useModal, useScrollToTop } from 'rdmo/core/assets/js/hooks' import { language } from 'rdmo/core/assets/js/utils' -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' +import baseUrl from 'rdmo/core/assets/js/utils/meta' import { PendingInvitations, ProjectFilters, ProjectImport, Table } from '../helper' import { getTitlePath, getUserRoles, userIsManager, HEADER_FORMATTERS, SORTABLE_COLUMNS } from '../../utils' From db3cf51a3e01041fba7f434b373f785526e64575 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 14 Nov 2024 12:50:47 +0100 Subject: [PATCH 018/160] Use uri in Attribute.__str__() --- rdmo/domain/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdmo/domain/models.py b/rdmo/domain/models.py index 165b866542..4a3bd408c1 100644 --- a/rdmo/domain/models.py +++ b/rdmo/domain/models.py @@ -58,7 +58,7 @@ class Meta: verbose_name_plural = _('Attributes') def __str__(self): - return self.path + return self.uri def save(self, *args, **kwargs): self.path = self.build_path(self.key, self.parent) From 85ebe0d4ce64589417c691306061381a76606b9c Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 7 Nov 2024 12:23:49 +0100 Subject: [PATCH 019/160] Add rdmo-admin script --- pyproject.toml | 3 +++ rdmo/__main__.py | 27 ++++++++++++++++++++++++++ rdmo/core/management/commands/build.py | 10 ++++++++++ rdmo/core/management/commands/npm.py | 22 +++++++++++++++++++++ rdmo/core/management/settings.py | 9 +++++++++ 5 files changed, 71 insertions(+) create mode 100644 rdmo/__main__.py create mode 100644 rdmo/core/management/commands/build.py create mode 100644 rdmo/core/management/commands/npm.py create mode 100644 rdmo/core/management/settings.py diff --git a/pyproject.toml b/pyproject.toml index 6103cd7faa..6f8cac418f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,6 +113,9 @@ issues = "https://github.com/rdmorganiser/rdmo/issues" repository = "https://github.com/rdmorganiser/rdmo.git" slack = "https://rdmo.slack.com" +[project.scripts] +rdmo-admin = "rdmo.__main__:main" + [tool.setuptools.packages.find] include = ["rdmo*"] exclude = ["*assets*", "*tests*"] diff --git a/rdmo/__main__.py b/rdmo/__main__.py new file mode 100644 index 0000000000..b19f323ed1 --- /dev/null +++ b/rdmo/__main__.py @@ -0,0 +1,27 @@ +''' +Runs rdmo-admin when the rdmo module is run as a script, much like django-admin +(see: https://github.com/django/django/blob/main/django/__main__.py): + + python -m rdmo check + +The main method is added as script in pyproject.toml so that + + rdmo-admin check + +works as well. Unlike django-admin, a set of generic settings is used for the +management scripts. +''' + +import os + +from django.core import management + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rdmo.core.management.settings") + + +def main(): + management.execute_from_command_line() + + +if __name__ == "__main__": + main() diff --git a/rdmo/core/management/commands/build.py b/rdmo/core/management/commands/build.py new file mode 100644 index 0000000000..90746fafce --- /dev/null +++ b/rdmo/core/management/commands/build.py @@ -0,0 +1,10 @@ +import subprocess +import sys + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + + def handle(self, *args, **options): + subprocess.call(['/bin/bash', '-c', f'{sys.executable} -m build']) diff --git a/rdmo/core/management/commands/npm.py b/rdmo/core/management/commands/npm.py new file mode 100644 index 0000000000..5e5929d931 --- /dev/null +++ b/rdmo/core/management/commands/npm.py @@ -0,0 +1,22 @@ +import os +import subprocess + +from django.core.management.base import BaseCommand, CommandError + + +class Command(BaseCommand): + + def add_arguments(self, parser): + parser.add_argument('command', nargs="*") + + def handle(self, *args, **options): + nvm_dir = os.getenv('NVM_DIR') + + if nvm_dir is None: + raise CommandError('NVM_DIR is not set, is nvm.sh installed?') + + if not os.path.exists(nvm_dir): + raise CommandError('NVM_DIR does not exist, is nvm.sh installed?') + + command = ' '.join(options['command']) + subprocess.call(['/bin/bash', '-c', f'source {nvm_dir}/nvm.sh; npm {command}']) diff --git a/rdmo/core/management/settings.py b/rdmo/core/management/settings.py new file mode 100644 index 0000000000..3f10d00114 --- /dev/null +++ b/rdmo/core/management/settings.py @@ -0,0 +1,9 @@ +''' +Generic settings to be used with rdmo-admin outside of an rdmo-app. +''' + +from rdmo.core.settings import * # noqa: F403 + +ROOT_URLCONF = '' + +DATABASES = {} From cba45dea5c65ae0646a600384f6721bd83332301 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Mon, 11 Nov 2024 17:10:22 +0100 Subject: [PATCH 020/160] Add clean and messages management script and update build script --- rdmo/core/management/commands/build.py | 3 ++ rdmo/core/management/commands/clean.py | 53 +++++++++++++++++++++++ rdmo/core/management/commands/messages.py | 17 ++++++++ rdmo/core/management/settings.py | 2 + 4 files changed, 75 insertions(+) create mode 100644 rdmo/core/management/commands/clean.py create mode 100644 rdmo/core/management/commands/messages.py diff --git a/rdmo/core/management/commands/build.py b/rdmo/core/management/commands/build.py index 90746fafce..9e67ff1905 100644 --- a/rdmo/core/management/commands/build.py +++ b/rdmo/core/management/commands/build.py @@ -1,10 +1,13 @@ import subprocess import sys +from django.core.management import call_command from django.core.management.base import BaseCommand class Command(BaseCommand): def handle(self, *args, **options): + call_command('npm', 'ci') + call_command('npm', 'run', 'build:prod') subprocess.call(['/bin/bash', '-c', f'{sys.executable} -m build']) diff --git a/rdmo/core/management/commands/clean.py b/rdmo/core/management/commands/clean.py new file mode 100644 index 0000000000..bd7a3de439 --- /dev/null +++ b/rdmo/core/management/commands/clean.py @@ -0,0 +1,53 @@ +import os +import shutil + +from django.conf import settings +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + + def add_arguments(self, parser): + parser.add_argument('command', choices=[ + 'all', + 'dist', + 'media', + 'npm', + 'python', + 'static', + ]) + + def handle(self, *args, **options): + if options['command'] in ['all', 'dist']: + self.clean_dir('dist') + self.clean_dir('rdmo.egg-info') + if options['command'] in ['all', 'media']: + self.clean_dir(settings.MEDIA_ROOT) + if options['command'] in ['all', 'npm']: + self.clean_dir('node_modules') + if options['command'] in ['all', 'static']: + self.clean_static() + if options['command'] in ['all', 'python']: + self.clean_python() + + def clean_python(self): + for root, dirs, files in os.walk('.'): + for dir_name in dirs: + if dir_name == '__pycache__': + self.clean_dir(os.path.join(root, dir_name), quiet=True) + + def clean_static(self): + self.clean_dir(settings.STATIC_ROOT) + + for path in [ + # 'rdmo/core/static', # TODO: enable after cleanup + 'rdmo/management/static', + # 'rdmo/projects/static' # TODO: enable after cleanup + ]: + self.clean_dir(path) + + def clean_dir(self, path, quiet=False): + if path and os.path.exists(path): + shutil.rmtree(path) + if not quiet: + print(f'Directory "{path}" has been removed!') diff --git a/rdmo/core/management/commands/messages.py b/rdmo/core/management/commands/messages.py new file mode 100644 index 0000000000..aa1703ca72 --- /dev/null +++ b/rdmo/core/management/commands/messages.py @@ -0,0 +1,17 @@ +import subprocess + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + + def add_arguments(self, parser): + parser.add_argument('command', choices=['make', 'compile']) + + def handle(self, *args, **options): + if options['command'] == 'make': + subprocess.check_call(['django-admin', 'makemessages', '--all'], cwd='rdmo') + subprocess.check_call(['django-admin', 'makemessages', '--all', '-d', 'djangojs'], cwd='rdmo') + + elif options['command'] == 'compile': + subprocess.check_call(['django-admin', 'compilemessages'], cwd='rdmo') diff --git a/rdmo/core/management/settings.py b/rdmo/core/management/settings.py index 3f10d00114..aebbda76e3 100644 --- a/rdmo/core/management/settings.py +++ b/rdmo/core/management/settings.py @@ -7,3 +7,5 @@ ROOT_URLCONF = '' DATABASES = {} + +STATIC_ROOT = 'static_root' From db31e9b6643a92d57033959821d8a089956eb3d1 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Mon, 16 Sep 2024 10:54:19 +0200 Subject: [PATCH 021/160] Use EXPORT_CONTENT_DISPOSITION for project xml export --- rdmo/projects/exports.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rdmo/projects/exports.py b/rdmo/projects/exports.py index 141d307050..f02450fd89 100644 --- a/rdmo/projects/exports.py +++ b/rdmo/projects/exports.py @@ -1,5 +1,6 @@ import re +from django.conf import settings from django.http import HttpResponse from rdmo.core.exports import prettify_xml @@ -157,5 +158,8 @@ def render(self): serializer = ExportSerializer(self.project) xmldata = XMLRenderer().render(serializer.data) response = HttpResponse(prettify_xml(xmldata), content_type="application/xml") - response['Content-Disposition'] = f'filename="{self.project.title}.xml"' + + if settings.EXPORT_CONTENT_DISPOSITION == 'attachment': + response['Content-Disposition'] = f'attachment; filename="{self.project.title}.xml"' + return response From ca57c58facbe9b3704b3df0308d43945fbd7f776 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 17 Oct 2024 14:02:10 +0200 Subject: [PATCH 022/160] Add snapshot exports and PROJECT_SNAPSHOT_EXPORTS to settings --- rdmo/core/settings.py | 3 ++ rdmo/core/static/core/css/base.scss | 3 ++ rdmo/projects/exports.py | 16 ++++++--- rdmo/projects/rules.py | 1 + rdmo/projects/serializers/export.py | 36 ++++++++++++++++++- .../projects/project_detail_snapshots.html | 18 ++++++++++ rdmo/projects/tests/test_view_snapshot.py | 30 ++++++++++++++++ rdmo/projects/urls/__init__.py | 3 ++ rdmo/projects/views/__init__.py | 2 +- rdmo/projects/views/snapshot.py | 33 ++++++++++++++++- testing/config/settings/base.py | 4 +++ 11 files changed, 141 insertions(+), 8 deletions(-) diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py index 31d2860944..0e6add4dc8 100644 --- a/rdmo/core/settings.py +++ b/rdmo/core/settings.py @@ -203,6 +203,7 @@ 'PROJECT_ISSUES', 'PROJECT_VIEWS', 'PROJECT_EXPORTS', + 'PROJECT_SNAPSHOT_EXPORTS', 'PROJECT_IMPORTS', 'PROJECT_IMPORTS_LIST', 'PROJECT_SEND_ISSUE', @@ -294,6 +295,8 @@ ('json', _('JSON'), 'rdmo.projects.exports.JSONExport'), ] +PROJECT_SNAPSHOT_EXPORTS = [] + PROJECT_IMPORTS = [ ('xml', _('RDMO XML'), 'rdmo.projects.imports.RDMOXMLImport'), ] diff --git a/rdmo/core/static/core/css/base.scss b/rdmo/core/static/core/css/base.scss index e3519e18fb..1fd9b39b7e 100644 --- a/rdmo/core/static/core/css/base.scss +++ b/rdmo/core/static/core/css/base.scss @@ -97,9 +97,12 @@ a { .btn-link { color: $link-color; + padding: 0; + text-decoration: none; &:hover { color: $link-color-hover; + text-decoration: none; } } diff --git a/rdmo/projects/exports.py b/rdmo/projects/exports.py index f02450fd89..5b7e8192ab 100644 --- a/rdmo/projects/exports.py +++ b/rdmo/projects/exports.py @@ -10,7 +10,8 @@ from rdmo.views.utils import ProjectWrapper from .renderers import XMLRenderer -from .serializers.export import ProjectSerializer as ExportSerializer +from .serializers.export import ProjectSerializer as ProjectExportSerializer +from .serializers.export import SnapshotSerializer as SnapshotExportSerializer class Export(Plugin): @@ -155,11 +156,16 @@ def render(self): class RDMOXMLExport(Export): def render(self): - serializer = ExportSerializer(self.project) + if self.project: + content_disposition = f'filename="{self.project.title}.xml"' + serializer = ProjectExportSerializer(self.project) + + else: + content_disposition = f'filename="{self.snapshot.title}.xml"' + serializer = SnapshotExportSerializer(self.snapshot) + xmldata = XMLRenderer().render(serializer.data) response = HttpResponse(prettify_xml(xmldata), content_type="application/xml") - if settings.EXPORT_CONTENT_DISPOSITION == 'attachment': - response['Content-Disposition'] = f'attachment; filename="{self.project.title}.xml"' - + response['Content-Disposition'] = content_disposition return response diff --git a/rdmo/projects/rules.py b/rdmo/projects/rules.py index fbab7c065f..c0b7901bab 100644 --- a/rdmo/projects/rules.py +++ b/rdmo/projects/rules.py @@ -99,6 +99,7 @@ def is_site_manager_for_current_site(user, request): rules.add_perm('projects.add_snapshot_object', is_project_manager | is_project_owner | is_site_manager) rules.add_perm('projects.change_snapshot_object', is_project_manager | is_project_owner | is_site_manager) rules.add_perm('projects.rollback_snapshot_object', is_project_manager | is_project_owner | is_site_manager) +rules.add_perm('projects.export_snapshot_object', is_project_owner | is_project_manager | is_site_manager) rules.add_perm('projects.view_value_object', is_project_member | is_site_manager) rules.add_perm('projects.add_value_object', is_project_author | is_project_manager | is_project_owner | is_site_manager) diff --git a/rdmo/projects/serializers/export.py b/rdmo/projects/serializers/export.py index 9c9dee649b..75ce053578 100644 --- a/rdmo/projects/serializers/export.py +++ b/rdmo/projects/serializers/export.py @@ -39,6 +39,40 @@ class SnapshotSerializer(serializers.ModelSerializer): values = serializers.SerializerMethodField() + catalog = serializers.CharField(source='catalog.uri', default=None, read_only=True) + tasks = serializers.SerializerMethodField() + views = serializers.SerializerMethodField() + + class Meta: + model = Snapshot + fields = ( + 'title', + 'description', + 'catalog', + 'tasks', + 'views', + 'values', + 'created', + 'updated' + ) + + def get_values(self, obj): + values = Value.objects.filter(project=obj.project, snapshot=obj) \ + .select_related('attribute', 'option') + serializer = ValueSerializer(instance=values, many=True) + return serializer.data + + def get_tasks(self, obj): + return [task.uri for task in obj.project.tasks.all()] + + def get_views(self, obj): + return [view.uri for view in obj.project.views.all()] + + +class ProjectSnapshotSerializer(serializers.ModelSerializer): + + values = serializers.SerializerMethodField() + class Meta: model = Snapshot fields = ( @@ -57,7 +91,7 @@ def get_values(self, obj): class ProjectSerializer(serializers.ModelSerializer): - snapshots = SnapshotSerializer(many=True) + snapshots = ProjectSnapshotSerializer(many=True) values = serializers.SerializerMethodField() catalog = serializers.CharField(source='catalog.uri', default=None, read_only=True) diff --git a/rdmo/projects/templates/projects/project_detail_snapshots.html b/rdmo/projects/templates/projects/project_detail_snapshots.html index d421592ce9..0d81d502de 100644 --- a/rdmo/projects/templates/projects/project_detail_snapshots.html +++ b/rdmo/projects/templates/projects/project_detail_snapshots.html @@ -54,6 +54,24 @@

{% trans 'Snapshots' %}

title="{% trans 'Rollback to snapshot' %}">
{% endif %} + + {% has_perm 'projects.export_project_object' request.user project as can_export_project %} + {% if settings.PROJECT_SNAPSHOT_EXPORTS and can_export_project %} + + + + + {% endfor %} diff --git a/rdmo/projects/tests/test_view_snapshot.py b/rdmo/projects/tests/test_view_snapshot.py index 4a378177a6..92a057bf73 100644 --- a/rdmo/projects/tests/test_view_snapshot.py +++ b/rdmo/projects/tests/test_view_snapshot.py @@ -35,6 +35,13 @@ 'site': [1, 2, 3, 4, 5] } +export_snapshot_permission_map = { + 'owner': [1, 2, 3, 4, 5], + 'manager': [1, 3, 5], + 'api': [1, 2, 3, 4, 5], + 'site': [1, 2, 3, 4, 5] +} + projects = [1, 2, 3, 4, 5] snapshots = [1, 3, 7, 4, 5, 6] @@ -206,3 +213,26 @@ def test_snapshot_rollback_post(db, client, files, username, password, project_i assert response.status_code == 302 else: assert response.status_code == 404 + + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +@pytest.mark.parametrize('snapshot_id', snapshots) +def test_snapshot_export_xml(db, client, files, username, password, project_id, snapshot_id): + client.login(username=username, password=password) + project = Project.objects.get(pk=project_id) + project_snapshots = list(project.snapshots.values_list('id', flat=True)) + + url = reverse('snapshot_export', args=[project_id, snapshot_id, 'xml']) + response = client.get(url) + + if snapshot_id in project_snapshots: + if project_id in export_snapshot_permission_map.get(username, []): + assert response.status_code == 200 + else: + if password: + assert response.status_code == 403 + else: + assert response.status_code == 302 + else: + assert response.status_code == 404 diff --git a/rdmo/projects/urls/__init__.py b/rdmo/projects/urls/__init__.py index 47472eeeaf..0be1bdbd97 100644 --- a/rdmo/projects/urls/__init__.py +++ b/rdmo/projects/urls/__init__.py @@ -35,6 +35,7 @@ ProjectViewExportView, ProjectViewView, SnapshotCreateView, + SnapshotExportView, SnapshotRollbackView, SnapshotUpdateView, ) @@ -109,6 +110,8 @@ SnapshotUpdateView.as_view(), name='snapshot_update'), re_path(r'^(?P[0-9]+)/snapshots/(?P[0-9]+)/rollback/$', SnapshotRollbackView.as_view(), name='snapshot_rollback'), + re_path(r'^(?P[0-9]+)/snapshots/(?P[0-9]+)/export/(?P[a-z-]+)/$', + SnapshotExportView.as_view(), name='snapshot_export'), re_path(r'^(?P[0-9]+)/answers/$', ProjectAnswersView.as_view(), name='project_answers'), diff --git a/rdmo/projects/views/__init__.py b/rdmo/projects/views/__init__.py index f42a45b5ab..543481bc22 100644 --- a/rdmo/projects/views/__init__.py +++ b/rdmo/projects/views/__init__.py @@ -25,4 +25,4 @@ ProjectUpdateViewsView, ) from .project_view import ProjectViewExportView, ProjectViewView -from .snapshot import SnapshotCreateView, SnapshotRollbackView, SnapshotUpdateView +from .snapshot import SnapshotCreateView, SnapshotExportView, SnapshotRollbackView, SnapshotUpdateView diff --git a/rdmo/projects/views/snapshot.py b/rdmo/projects/views/snapshot.py index ec378c5c99..437f8acd01 100644 --- a/rdmo/projects/views/snapshot.py +++ b/rdmo/projects/views/snapshot.py @@ -1,10 +1,11 @@ import logging -from django.http import HttpResponseRedirect +from django.http import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.urls import reverse from django.views.generic import CreateView, DetailView, UpdateView +from rdmo.core.plugins import get_plugin from rdmo.core.views import ObjectPermissionMixin, RedirectViewMixin from ..forms import SnapshotCreateForm @@ -63,3 +64,33 @@ def post(self, request, *args, **kwargs): snapshot.rollback() return HttpResponseRedirect(reverse('project', args=[snapshot.project.id])) + + +class SnapshotExportView(ObjectPermissionMixin, DetailView): + model = Snapshot + queryset = Snapshot.objects.all() + permission_required = 'projects.export_snapshot_object' + + def get_queryset(self): + return Snapshot.objects.filter(project_id=self.kwargs['project_id']) + + def get_permission_object(self): + return self.get_object().project + + def get_export_plugin(self): + export_plugin = get_plugin('PROJECT_SNAPSHOT_EXPORTS', self.kwargs.get('format')) + if export_plugin is None: + raise Http404 + + export_plugin.request = self.request + export_plugin.snapshot = self.object + + return export_plugin + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return self.get_export_plugin().render() + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + return self.get_export_plugin().submit() diff --git a/testing/config/settings/base.py b/testing/config/settings/base.py index 302104415e..3517e314a4 100644 --- a/testing/config/settings/base.py +++ b/testing/config/settings/base.py @@ -71,6 +71,10 @@ PROJECT_REMOVE_VIEWS = True +PROJECT_SNAPSHOT_EXPORTS = [ + ('xml', _('RDMO XML'), 'rdmo.projects.exports.RDMOXMLExport'), +] + EMAIL_RECIPIENTS_CHOICES = [ ('email@example.com', 'Emmi Email '), ] From 346c508fc7a658116807755e64517f7a28a9836d Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 19 Nov 2024 12:04:38 +0100 Subject: [PATCH 023/160] Fix Content-Disposition in RDMOXMLExport --- rdmo/projects/exports.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rdmo/projects/exports.py b/rdmo/projects/exports.py index 5b7e8192ab..e1e09df283 100644 --- a/rdmo/projects/exports.py +++ b/rdmo/projects/exports.py @@ -157,15 +157,17 @@ class RDMOXMLExport(Export): def render(self): if self.project: - content_disposition = f'filename="{self.project.title}.xml"' + content_disposition = f'attachment; filename="{self.project.title}.xml"' serializer = ProjectExportSerializer(self.project) else: - content_disposition = f'filename="{self.snapshot.title}.xml"' + content_disposition = f'attachment; filename="{self.snapshot.title}.xml"' serializer = SnapshotExportSerializer(self.snapshot) xmldata = XMLRenderer().render(serializer.data) response = HttpResponse(prettify_xml(xmldata), content_type="application/xml") + if settings.EXPORT_CONTENT_DISPOSITION == 'attachment': response['Content-Disposition'] = content_disposition + return response From cde2c42b4d6a24f8b4a3b1b1e40f2ee47d5e5565 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 19 Nov 2024 13:23:08 +0100 Subject: [PATCH 024/160] Fix baseUrl import --- .../assets/js/projects/components/helper/PendingInvitations.js | 2 +- rdmo/projects/assets/js/projects/components/main/Projects.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js b/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js index 6338e0eb7c..d7322fdee5 100644 --- a/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js +++ b/rdmo/projects/assets/js/projects/components/helper/PendingInvitations.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import baseUrl from 'rdmo/core/assets/js/utils/meta' +import { baseUrl } from 'rdmo/core/assets/js/utils/meta' import { ROLE_LABELS } from '../../utils' diff --git a/rdmo/projects/assets/js/projects/components/main/Projects.js b/rdmo/projects/assets/js/projects/components/main/Projects.js index 34c56d4fbc..93e38e65db 100644 --- a/rdmo/projects/assets/js/projects/components/main/Projects.js +++ b/rdmo/projects/assets/js/projects/components/main/Projects.js @@ -5,7 +5,7 @@ import { get, isEmpty } from 'lodash' import { Link, Modal, SearchField } from 'rdmo/core/assets/js/components' import { useFormattedDateTime, useModal, useScrollToTop } from 'rdmo/core/assets/js/hooks' import { language } from 'rdmo/core/assets/js/utils' -import baseUrl from 'rdmo/core/assets/js/utils/meta' +import { baseUrl } from 'rdmo/core/assets/js/utils/meta' import { PendingInvitations, ProjectFilters, ProjectImport, Table } from '../helper' import { getTitlePath, getUserRoles, userIsManager, HEADER_FORMATTERS, SORTABLE_COLUMNS } from '../../utils' From a80ab633aaa7de25592e6483183efec4593ac9c4 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 22 Aug 2024 18:29:42 +0200 Subject: [PATCH 025/160] Add copy project functionality and refactor project hierarchy validation --- rdmo/projects/admin.py | 24 ++ .../js/projects/components/main/Projects.js | 28 ++- rdmo/projects/assets/scss/projects.scss | 1 + rdmo/projects/forms.py | 12 + rdmo/projects/models/project.py | 10 +- rdmo/projects/serializers/v1/__init__.py | 13 +- .../projects/project_detail_sidebar.html | 5 +- rdmo/projects/tests/test_utils.py | 84 ++++++- rdmo/projects/tests/test_view_project.py | 34 ++- rdmo/projects/tests/test_view_project_copy.py | 207 ++++++++++++++++++ rdmo/projects/tests/test_viewset_project.py | 169 +++++++++++++- rdmo/projects/urls/__init__.py | 3 + rdmo/projects/utils.py | 81 +++++++ rdmo/projects/validators.py | 13 ++ rdmo/projects/views/__init__.py | 1 + rdmo/projects/views/project_copy.py | 42 ++++ rdmo/projects/viewsets.py | 24 +- 17 files changed, 716 insertions(+), 35 deletions(-) create mode 100644 rdmo/projects/tests/test_view_project_copy.py create mode 100644 rdmo/projects/views/project_copy.py diff --git a/rdmo/projects/admin.py b/rdmo/projects/admin.py index 1c82a6a5e8..926885e1c5 100644 --- a/rdmo/projects/admin.py +++ b/rdmo/projects/admin.py @@ -1,3 +1,4 @@ +from django import forms from django.contrib import admin from django.db.models import Prefetch from django.urls import reverse @@ -15,12 +16,35 @@ Snapshot, Value, ) +from .validators import ProjectParentValidator + + +class ProjectAdminForm(forms.ModelForm): + + class Meta: + model = Project + fields = [ + 'parent', + 'site', + 'title', + 'description', + 'catalog', + 'views' + ] + + + def clean(self): + super().clean() + ProjectParentValidator(self.instance)(self.cleaned_data) @admin.register(Project) class ProjectAdmin(admin.ModelAdmin): + form = ProjectAdminForm + search_fields = ('title', 'user__username') list_display = ('title', 'owners', 'updated', 'created') + readonly_fields = ('progress_count', 'progress_total') def get_queryset(self, request): return Project.objects.prefetch_related( diff --git a/rdmo/projects/assets/js/projects/components/main/Projects.js b/rdmo/projects/assets/js/projects/components/main/Projects.js index 93e38e65db..6f15f8e7b8 100644 --- a/rdmo/projects/assets/js/projects/components/main/Projects.js +++ b/rdmo/projects/assets/js/projects/components/main/Projects.js @@ -140,21 +140,27 @@ const Projects = ({ config, configActions, currentUserObject, projectsActions, p return (
- {(isProjectManager || isProjectOwner || isManager) && window.location.href = `${rowUrl}/update/${params}`} + href={`${rowUrl}/copy/`} + className="fa fa-copy" + title={gettext('Copy project')} + onClick={() => window.location.href = `${rowUrl}/copy/${params}`} /> + {(isProjectManager || isProjectOwner || isManager) && + window.location.href = `${rowUrl}/update/${params}`} + /> } {(isProjectOwner || isManager) && - window.location.href = `${rowUrl}/delete/${params}`} - /> + window.location.href = `${rowUrl}/delete/${params}`} + /> }
) diff --git a/rdmo/projects/assets/scss/projects.scss b/rdmo/projects/assets/scss/projects.scss index dbe1811707..f24a9fd12e 100644 --- a/rdmo/projects/assets/scss/projects.scss +++ b/rdmo/projects/assets/scss/projects.scss @@ -207,6 +207,7 @@ a.disabled { display: flex; gap: 5px; margin-bottom: 10px; + justify-content: flex-end; } .projects { diff --git a/rdmo/projects/forms.py b/rdmo/projects/forms.py index 4594fca7fa..11adc0f1b9 100644 --- a/rdmo/projects/forms.py +++ b/rdmo/projects/forms.py @@ -13,6 +13,7 @@ from .constants import ROLE_CHOICES from .models import Integration, IntegrationOption, Invite, Membership, Project, Snapshot +from .validators import ProjectParentValidator class CatalogChoiceField(forms.ModelChoiceField): @@ -53,6 +54,8 @@ class ProjectForm(forms.ModelForm): use_required_attribute = False def __init__(self, *args, **kwargs): + self.copy = kwargs.pop('copy', False) + catalogs = kwargs.pop('catalogs') projects = kwargs.pop('projects') super().__init__(*args, **kwargs) @@ -66,6 +69,11 @@ def __init__(self, *args, **kwargs): if settings.NESTED_PROJECTS: self.fields['parent'].queryset = projects + def clean(self): + if not self.copy: + ProjectParentValidator(self.instance)(self.cleaned_data) + super().clean() + class Meta: model = Project @@ -160,6 +168,10 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['parent'].queryset = projects + def clean(self): + ProjectParentValidator(self.instance)(self.cleaned_data) + super().clean() + class Meta: model = Project fields = ('parent', ) diff --git a/rdmo/projects/models/project.py b/rdmo/projects/models/project.py index 6425f37f48..b992c0dc9d 100644 --- a/rdmo/projects/models/project.py +++ b/rdmo/projects/models/project.py @@ -1,6 +1,5 @@ from django.conf import settings from django.contrib.sites.models import Site -from django.core.exceptions import ValidationError from django.db import models from django.db.models.signals import pre_delete from django.dispatch import receiver @@ -88,11 +87,12 @@ def __str__(self): def get_absolute_url(self): return reverse('project', kwargs={'pk': self.pk}) - def clean(self): + def save(self, *args, **kwargs): + # ensure that the project hierarchy is not disturbed if self.id and self.parent in self.get_descendants(include_self=True): - raise ValidationError({ - 'parent': [_('A project may not be moved to be a child of itself or one of its descendants.')] - }) + raise RuntimeError('A project may not be moved to be a child of itself or one of its descendants.') + + super().save(*args, **kwargs) @property def catalog_uri(self): diff --git a/rdmo/projects/serializers/v1/__init__.py b/rdmo/projects/serializers/v1/__init__.py index 8816dc9ca7..fe72127295 100644 --- a/rdmo/projects/serializers/v1/__init__.py +++ b/rdmo/projects/serializers/v1/__init__.py @@ -9,7 +9,7 @@ from rdmo.services.validators import ProviderValidator from ...models import Integration, IntegrationOption, Invite, Issue, IssueResource, Membership, Project, Snapshot, Value -from ...validators import ValueConflictValidator, ValueQuotaValidator, ValueTypeValidator +from ...validators import ProjectParentValidator, ValueConflictValidator, ValueQuotaValidator, ValueTypeValidator class UserSerializer(serializers.ModelSerializer): @@ -78,6 +78,17 @@ class Meta: read_only_fields = ( 'snapshots', ) + validators = [ + ProjectParentValidator() + ] + + +class ProjectCopySerializer(ProjectSerializer): + + class Meta: + model = Project + fields = ProjectSerializer.Meta.fields + read_only_fields = ProjectSerializer.Meta.read_only_fields class ProjectMembershipSerializer(serializers.ModelSerializer): diff --git a/rdmo/projects/templates/projects/project_detail_sidebar.html b/rdmo/projects/templates/projects/project_detail_sidebar.html index 4c4be91ff7..c1886388a9 100644 --- a/rdmo/projects/templates/projects/project_detail_sidebar.html +++ b/rdmo/projects/templates/projects/project_detail_sidebar.html @@ -38,7 +38,6 @@

{% trans 'Options' %}

{% endif %} -{% if can_change_project or can_delete_project %} -{% endif %} {% has_perm 'projects.add_membership_object' request.user project as can_add_membership %} {% if can_add_membership %} diff --git a/rdmo/projects/tests/test_utils.py b/rdmo/projects/tests/test_utils.py index edbc5a8d3b..9ce7c4dabe 100644 --- a/rdmo/projects/tests/test_utils.py +++ b/rdmo/projects/tests/test_utils.py @@ -1,9 +1,12 @@ import pytest +from django.contrib.auth.models import User +from django.contrib.sites.models import Site from django.http import QueryDict from ..filters import ProjectFilter -from ..utils import set_context_querystring_with_filter_and_page +from ..models import Project +from ..utils import copy_project, set_context_querystring_with_filter_and_page GET_queries = [ 'page=2&title=project', @@ -32,3 +35,82 @@ def test_set_context_querystring_with_filter_and_page(GET_query): assert context.get('querystring', 'not-in-context') == '' else: assert context.get('querystring', 'not-in-context') == 'not-in-context' + + +def test_copy_project(db): + project = Project.objects.get(id=1) + site = Site.objects.get(id=2) + user = User.objects.get(id=1) + project_copy = copy_project(project, site, [user]) + + # re fetch the original project + project = Project.objects.get(id=1) + + # check that site, owners, tasks, and views are correct + assert project_copy.site == site + assert list(project_copy.owners) == [user] + assert list(project_copy.user.values('id')) == [{'id': user.id}] + assert list(project_copy.tasks.values('id')) == list(project.tasks.values('id')) + assert list(project_copy.views.values('id')) == list(project.views.values('id')) + + # check that no ids are the same + assert project_copy.id != project.id + assert not set(project_copy.snapshots.values_list('id')).intersection(set(project.snapshots.values_list('id'))) + assert not set(project_copy.values.values_list('id')).intersection(set(project.values.values_list('id'))) + + # check the snapshots + snapshot_fields = ( + 'title', + 'description' + ) + for snapshot_copy, snapshot in zip( + project_copy.snapshots.values(*snapshot_fields), + project.snapshots.values(*snapshot_fields) + ): + assert snapshot_copy == snapshot + + # check the values + value_fields = ( + 'attribute', + 'set_prefix', + 'set_collection', + 'set_index', + 'collection_index', + 'text', + 'option', + 'value_type', + 'unit', + 'external_id' + ) + for value_copy, value in zip( + project_copy.values.filter(snapshot=None), + project.values.filter(snapshot=None) + ): + for field in value_fields: + assert getattr(value_copy, field) == getattr(value, field) + + if value_copy.file: + assert value_copy.file.path == value_copy.file.path.replace( + f'/projects/{project.id}/values/{value.id}/', + f'/projects/{project_copy.id}/values/{value_copy.id}/' + ) + assert value_copy.file.size == value_copy.file.size + else: + assert not value.file + + for snapshot_copy, snapshot in zip(project_copy.snapshots.all(), project.snapshots.all()): + for value_copy, value in zip( + project_copy.values.filter(snapshot=snapshot_copy), + project.values.filter(snapshot=snapshot) + ): + for field in value_fields: + assert getattr(value_copy, field) == getattr(value, field) + + if value_copy.file: + assert value_copy.file.path == value_copy.file.path.replace( + f'/projects/{project.id}/snapshot/{snapshot.id}/values/{value.id}/', + f'/projects/{project_copy.id}/snapshot/{snapshot.id}/values/{value_copy.id}/' + ) + assert value_copy.file.open('rb').read() == value_copy.file.open('rb').read() + else: + assert not value.file diff --git a/rdmo/projects/tests/test_view_project.py b/rdmo/projects/tests/test_view_project.py index b43660cf14..8a1465c765 100644 --- a/rdmo/projects/tests/test_view_project.py +++ b/rdmo/projects/tests/test_view_project.py @@ -58,7 +58,9 @@ export_formats = ('rtf', 'odt', 'docx', 'html', 'markdown', 'tex', 'pdf') site_id = 1 -parent_project_id = 1 +project_id = 1 +parent_id = 3 +parent_ancestors = [2, 3] catalog_id = 1 @@ -266,7 +268,7 @@ def test_project_create_parent_post(db, client, username, password): 'title': 'A new project', 'description': 'Some description', 'catalog': catalog_id, - 'parent': parent_project_id + 'parent': project_id } response = client.post(url, data) @@ -335,17 +337,21 @@ def test_project_update_post_parent(db, client, username, password, project_id): 'title': project.title, 'description': project.description, 'catalog': project.catalog.pk, - 'parent': parent_project_id + 'parent': parent_id } response = client.post(url, data) if project_id in change_project_permission_map.get(username, []): - if project_id == parent_project_id: + if parent_id in view_project_permission_map.get(username, []): + if project_id in parent_ancestors: + assert response.status_code == 200 + assert Project.objects.get(pk=project_id).parent == project.parent + else: + assert response.status_code == 302 + assert Project.objects.get(pk=project_id).parent_id == parent_id + else: assert response.status_code == 200 assert Project.objects.get(pk=project_id).parent == project.parent - else: - assert response.status_code == 302 - assert Project.objects.get(pk=project_id).parent_id == parent_project_id else: if password: assert response.status_code == 403 @@ -545,17 +551,21 @@ def test_project_update_parent_post(db, client, username, password, project_id): url = reverse('project_update_parent', args=[project_id]) data = { - 'parent': parent_project_id + 'parent': parent_id } response = client.post(url, data) if project_id in change_project_permission_map.get(username, []): - if project_id == parent_project_id: + if parent_id in view_project_permission_map.get(username, []): + if project_id in parent_ancestors: + assert response.status_code == 200 + assert Project.objects.get(pk=project_id).parent == project.parent + else: + assert response.status_code == 302 + assert Project.objects.get(pk=project_id).parent_id == parent_id + else: assert response.status_code == 200 assert Project.objects.get(pk=project_id).parent == project.parent - else: - assert response.status_code == 302 - assert Project.objects.get(pk=project_id).parent_id == parent_project_id else: if password: assert response.status_code == 403 diff --git a/rdmo/projects/tests/test_view_project_copy.py b/rdmo/projects/tests/test_view_project_copy.py new file mode 100644 index 0000000000..46de9d0718 --- /dev/null +++ b/rdmo/projects/tests/test_view_project_copy.py @@ -0,0 +1,207 @@ +import pytest + +from django.contrib.auth.models import Group, User +from django.urls import reverse + +from ..models import Project, Snapshot, Value + +users = ( + ('owner', 'owner'), + ('manager', 'manager'), + ('author', 'author'), + ('guest', 'guest'), + ('user', 'user'), + ('site', 'site'), + ('anonymous', None), + ('editor', 'editor'), + ('reviewer', 'reviewer'), + ('api', 'api'), +) + +view_project_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'manager': [1, 3, 5, 7], + 'author': [1, 3, 5, 8], + 'guest': [1, 3, 5, 9], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} + +change_project_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'manager': [1, 3, 5, 7], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} + +delete_project_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], +} + +export_project_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'manager': [1, 3, 5, 7], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], +} + +projects = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + +project_id = 1 +site_id = 1 +parent_id = 1 +catalog_id = 1 + + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_project_copy_get(db, client, username, password, project_id): + client.login(username=username, password=password) + + url = reverse('project_copy', args=[project_id]) + response = client.get(url) + + if project_id in view_project_permission_map.get(username, []): + assert response.status_code == 200 + else: + if password: + assert response.status_code == 403 + else: + assert response.status_code == 302 + + +def test_project_copy_restricted_get(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + guest = User.objects.get(username='guest') + guest.groups.add(group) + + client.login(username='guest', password='guest') + + url = reverse('project_copy', args=[project_id]) + response = client.get(url) + + assert response.status_code == 200 + + +def test_project_copy_forbidden_get(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='guest', password='guest') + + url = reverse('project_copy', args=[project_id]) + response = client.get(url) + + assert response.status_code == 403 + + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_project_copy_post(db, client, username, password, project_id): + client.login(username=username, password=password) + + project_count = Project.objects.count() + snapshot_count = Snapshot.objects.count() + value_count = Value.objects.count() + + project = Project.objects.get(id=project_id) + project_snapshots_count = project.snapshots.count() + project_values_count = project.values.count() + + url = reverse('project_copy', args=[project_id]) + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id + } + response = client.post(url, data) + + if project_id in view_project_permission_map.get(username, []): + assert response.status_code == 302 + assert Project.objects.count() == project_count + 1 + assert Snapshot.objects.count() == snapshot_count + project_snapshots_count + assert Value.objects.count() == value_count + project_values_count + else: + assert response.status_code == 403 if password else 302 + assert Project.objects.count() == project_count + assert Value.objects.count() == value_count + + +def test_project_copy_post_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + guest = User.objects.get(username='guest') + guest.groups.add(group) + + client.login(username='guest', password='guest') + + url = reverse('project_copy', args=[project_id]) + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 302 + + +def test_project_copy_post_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='guest', password='guest') + + url = reverse('project_copy', args=[project_id]) + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 403 + + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_project_copy_parent_post(db, client, username, password, project_id): + client.login(username=username, password=password) + project_count = Project.objects.count() + + project_count = Project.objects.count() + snapshot_count = Snapshot.objects.count() + value_count = Value.objects.count() + + project = Project.objects.get(id=project_id) + project_snapshots_count = project.snapshots.count() + project_values_count = project.values.count() + + url = reverse('project_copy', args=[project_id]) + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id, + 'parent': parent_id + } + response = client.post(url, data) + + if project_id in view_project_permission_map.get(username, []): + if parent_id in view_project_permission_map.get(username, []): + assert response.status_code == 302 + assert Project.objects.count() == project_count + 1 + assert Snapshot.objects.count() == snapshot_count + project_snapshots_count + assert Value.objects.count() == value_count + project_values_count + else: + assert response.status_code == 200 + assert Project.objects.count() == project_count + assert Value.objects.count() == value_count + else: + assert response.status_code == 403 if password else 302 + assert Project.objects.count() == project_count + assert Value.objects.count() == value_count diff --git a/rdmo/projects/tests/test_viewset_project.py b/rdmo/projects/tests/test_viewset_project.py index 0069d25777..9c0fd6070d 100644 --- a/rdmo/projects/tests/test_viewset_project.py +++ b/rdmo/projects/tests/test_viewset_project.py @@ -3,7 +3,7 @@ from django.contrib.auth.models import Group, User from django.urls import reverse -from ..models import Project +from ..models import Membership, Project, Snapshot, Value users = ( ('owner', 'owner'), @@ -41,6 +41,7 @@ urlnames = { 'list': 'v1-projects:project-list', 'detail': 'v1-projects:project-detail', + 'copy': 'v1-projects:project-copy', 'overview': 'v1-projects:project-overview', 'navigation': 'v1-projects:project-navigation', 'options': 'v1-projects:project-options', @@ -60,6 +61,8 @@ optionset_id = 4 project_id = 1 +parent_id = 3 +parent_ancestors = [2, 3] page_size = 5 @@ -216,6 +219,133 @@ def test_create_parent(db, client, username, password, project_id): assert response.status_code == 401 +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_copy(db, client, username, password, project_id): + client.login(username=username, password=password) + + project_count = Project.objects.count() + snapshot_count = Snapshot.objects.count() + value_count = Value.objects.count() + + project = Project.objects.get(id=project_id) + project_snapshots_count = project.snapshots.count() + project_values_count = project.values.count() + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'New title', + 'description': project.description, + 'catalog': project.catalog.id + } + response = client.post(url, data, content_type='application/json') + + if project_id in view_project_permission_map.get(username, []): + assert response.status_code == 201 + + for key, value in response.json().items(): + if key in data: + assert value == data[key] + + assert Project.objects.count() == project_count + 1 + assert Snapshot.objects.count() == snapshot_count + project_snapshots_count + assert Value.objects.count() == value_count + project_values_count + else: + if password: + assert response.status_code == 404 + else: + assert response.status_code == 401 + + assert Project.objects.count() == project_count + assert Value.objects.count() == value_count + + +def test_copy_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + Membership.objects.create(user=user, project_id=project_id, role='guest') + + client.login(username='user', password='user') + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.', + 'catalog': catalog_id + } + response = client.post(url, data, content_type='application/json') + + assert response.status_code == 201 + + +def test_copy_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + user = User.objects.get(username='user') + + Membership.objects.create(user=user, project_id=project_id, role='guest') + + client.login(username='user', password='user') + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 403 + + +def test_copy_catalog_missing(db, client): + client.login(username='guest', password='guest') + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.' + } + response = client.post(url, data) + + assert response.status_code == 400 + + +def test_copy_catalog_not_available(db, client): + client.login(username='guest', password='guest') + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.', + 'catalog': catalog_id_not_available + } + response = client.post(url, data) + + assert response.status_code == 400 + +@pytest.mark.parametrize('project_id', projects) +def test_copy_parent(db, client, project_id): + client.login(username='owner', password='owner') + project = Project.objects.get(pk=project_id) + + url = reverse(urlnames['copy'], args=[project_id]) + data = { + 'title': 'New title', + 'description': project.description, + 'catalog': project.catalog.id, + 'parent': parent_id + } + response = client.post(url, data, content_type='application/json') + + assert response.status_code == 201 + + @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) def test_update(db, client, username, password, project_id): @@ -246,6 +376,43 @@ def test_update(db, client, username, password, project_id): assert Project.objects.get(id=project_id).description == project.description +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_update_parent(db, client, username, password, project_id): + client.login(username=username, password=password) + project = Project.objects.get(pk=project_id) + + url = reverse(urlnames['detail'], args=[project_id]) + data = { + 'title': 'New title', + 'description': project.description, + 'catalog': project.catalog.id, + 'parent': parent_id + } + response = client.put(url, data, content_type='application/json') + + if project_id in change_project_permission_map.get(username, []): + if parent_id in view_project_permission_map.get(username, []): + if project_id in parent_ancestors: + assert response.status_code == 400 + assert Project.objects.get(pk=project_id).parent == project.parent + else: + assert response.status_code == 200 + assert Project.objects.get(pk=project_id).parent_id == parent_id + else: + assert response.status_code == 404 + assert Project.objects.get(pk=project_id).parent == project.parent + else: + if project_id in view_project_permission_map.get(username, []): + assert response.status_code == 403 + elif password: + assert response.status_code == 404 + else: + assert response.status_code == 401 + + assert Project.objects.get(pk=project_id).parent == project.parent + + @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) def test_delete(db, client, username, password, project_id): diff --git a/rdmo/projects/urls/__init__.py b/rdmo/projects/urls/__init__.py index 0be1bdbd97..b7cc6d81f9 100644 --- a/rdmo/projects/urls/__init__.py +++ b/rdmo/projects/urls/__init__.py @@ -15,6 +15,7 @@ ProjectAnswersExportView, ProjectAnswersView, ProjectCancelView, + ProjectCopyView, ProjectCreateImportView, ProjectCreateView, ProjectDeleteView, @@ -56,6 +57,8 @@ re_path(r'^(?P[0-9]+)/$', ProjectDetailView.as_view(), name='project'), + re_path(r'^(?P[0-9]+)/copy/$', + ProjectCopyView.as_view(), name='project_copy'), re_path(r'^(?P[0-9]+)/update/$', ProjectUpdateView.as_view(), name='project_update'), re_path(r'^(?P[0-9]+)/update/information/$', diff --git a/rdmo/projects/utils.py b/rdmo/projects/utils.py index c23b0137fa..b0edaf068a 100644 --- a/rdmo/projects/utils.py +++ b/rdmo/projects/utils.py @@ -5,6 +5,7 @@ from django.contrib.sites.models import Site from django.template.loader import render_to_string from django.urls import reverse +from django.utils.timezone import now from rdmo.core.mail import send_mail from rdmo.core.plugins import get_plugins @@ -38,6 +39,86 @@ def check_conditions(conditions, values, set_prefix=None, set_index=None): return True +def copy_project(project, site, owners): + from .models import Membership, Value # to prevent circular inclusion + + timestamp = now() + + tasks = project.tasks.all() + views = project.views.all() + + values = project.values.filter(snapshot=None) + snapshots = { + snapshot: project.values.filter(snapshot=snapshot) + for snapshot in project.snapshots.all() + } + + # create a temporary buffer for all values with files + file_values = [] + + # unset the id, set current site and update timestamps + project.id = None + project.site = site + project.created = timestamp + + # save the new project + project.save() + + # save project tasks + for task in tasks: + project.tasks.add(task) + + # save project views + for view in views: + project.views.add(view) + + # save current project values + project_values = [] + for value in values: + value.id = None + value.project = project + value.created = timestamp + + if value.file: + file_values.append((value, value.file_name, value.file)) + + project_values.append(value) + + # insert the new values using bulk_create + Value.objects.bulk_create(project_values) + + # save project snapshots + for snapshot, snapshot_values in snapshots.items(): + snapshot.id = None + snapshot.project = project + snapshot.created = timestamp + snapshot.save(copy_values=False) + + project_snapshot_values = [] + for value in snapshot_values: + value.id = None + value.project = project + value.snapshot = snapshot + value.created = timestamp + + if value.file: + file_values.append((value, value.file_name, value.file)) + + project_snapshot_values.append(value) + + # insert the new snapshot values using bulk_create + Value.objects.bulk_create(project_snapshot_values) + + for value, file_name, file_content in file_values: + value.copy_file(file_name, file_content) + + for owner in owners: + membership = Membership(project=project, user=owner, role='owner') + membership.save() + + return project + + def save_import_values(project, values, checked): for value in values: if value.attribute: diff --git a/rdmo/projects/validators.py b/rdmo/projects/validators.py index da0ace2423..e3bd382923 100644 --- a/rdmo/projects/validators.py +++ b/rdmo/projects/validators.py @@ -20,6 +20,19 @@ VALUE_TYPE_URL, ) from rdmo.core.utils import human2bytes +from rdmo.core.validators import InstanceValidator + + +class ProjectParentValidator(InstanceValidator): + + def __call__(self, data, serializer=None): + super().__call__(data, serializer) + + if self.instance and self.instance.id \ + and data.get('parent') in self.instance.get_descendants(include_self=True): + raise self.raise_validation_error({ + 'parent': [_('A project may not be moved to be a child of itself or one of its descendants.')] + }) class ValueConflictValidator: diff --git a/rdmo/projects/views/__init__.py b/rdmo/projects/views/__init__.py index 543481bc22..a6899c8671 100644 --- a/rdmo/projects/views/__init__.py +++ b/rdmo/projects/views/__init__.py @@ -14,6 +14,7 @@ ProjectsView, ) from .project_answers import ProjectAnswersExportView, ProjectAnswersView +from .project_copy import ProjectCopyView from .project_create import ProjectCreateImportView, ProjectCreateView from .project_update import ( ProjectUpdateCatalogView, diff --git a/rdmo/projects/views/project_copy.py b/rdmo/projects/views/project_copy.py new file mode 100644 index 0000000000..6d9df32c3e --- /dev/null +++ b/rdmo/projects/views/project_copy.py @@ -0,0 +1,42 @@ +import logging + +from django.contrib.sites.shortcuts import get_current_site +from django.http import HttpResponseRedirect +from django.views.generic import UpdateView + +from rdmo.core.views import ObjectPermissionMixin, RedirectViewMixin +from rdmo.questions.models import Catalog + +from ..forms import ProjectForm +from ..models import Project +from ..utils import copy_project + +logger = logging.getLogger(__name__) + + +class ProjectCopyView(ObjectPermissionMixin, RedirectViewMixin, UpdateView): + + model = Project + form_class = ProjectForm + permission_required = ('projects.add_project', 'projects.view_project_object') + + def get_form_kwargs(self): + catalogs = Catalog.objects.filter_current_site() \ + .filter_group(self.request.user) \ + .filter_availability(self.request.user) \ + .order_by('-available', 'order') + projects = Project.objects.filter_user(self.request.user) + + form_kwargs = super().get_form_kwargs() + form_kwargs.update({ + 'copy': True, + 'catalogs': catalogs, + 'projects': projects + }) + return form_kwargs + + def form_valid(self, form): + site = get_current_site(self.request) + owners = [self.request.user] + project = copy_project(form.instance, site, owners) + return HttpResponseRedirect(project.get_absolute_url()) diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index 8c5d367a5b..0a0fde16d6 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -6,7 +6,7 @@ from django.http import Http404, HttpResponseRedirect from django.utils.translation import gettext_lazy as _ -from rest_framework import serializers +from rest_framework import serializers, status from rest_framework.decorators import action from rest_framework.exceptions import NotFound from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin @@ -48,6 +48,7 @@ InviteSerializer, IssueSerializer, MembershipSerializer, + ProjectCopySerializer, ProjectIntegrationSerializer, ProjectInviteSerializer, ProjectInviteUpdateSerializer, @@ -63,7 +64,7 @@ ) from .serializers.v1.overview import CatalogSerializer, ProjectOverviewSerializer from .serializers.v1.page import PageSerializer -from .utils import check_conditions, get_upload_accept, send_invite_email +from .utils import check_conditions, copy_project, get_upload_accept, send_invite_email class ProjectPagination(PageNumberPagination): @@ -116,6 +117,25 @@ def get_queryset(self): return queryset + @action(detail=True, methods=['POST'], + permission_classes=(HasModelPermission | HasProjectPermission, )) + def copy(self, request, pk=None): + instance = self.get_object() + serializer = ProjectCopySerializer(instance, data=request.data, context=self.get_serializer_context()) + serializer.is_valid(raise_exception=True) + + # update instance + for key, value in serializer.validated_data.items(): + setattr(instance, key, value) + + site = get_current_site(self.request) + owners = [self.request.user] + project_copy = copy_project(instance, site, owners) + + serializer = self.get_serializer(project_copy) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + @action(detail=True, permission_classes=(HasModelPermission | HasProjectPermission, )) def overview(self, request, pk=None): project = self.get_object() From 97534baba402644bedf70afda912ad19b9764d7a Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sun, 25 Aug 2024 17:04:20 +0200 Subject: [PATCH 026/160] Fix tests --- rdmo/projects/tests/test_utils.py | 2 +- rdmo/projects/tests/test_view_project_copy.py | 8 ++++---- rdmo/projects/tests/test_viewset_project.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rdmo/projects/tests/test_utils.py b/rdmo/projects/tests/test_utils.py index 9ce7c4dabe..c2ccb1a49c 100644 --- a/rdmo/projects/tests/test_utils.py +++ b/rdmo/projects/tests/test_utils.py @@ -37,7 +37,7 @@ def test_set_context_querystring_with_filter_and_page(GET_query): assert context.get('querystring', 'not-in-context') == 'not-in-context' -def test_copy_project(db): +def test_copy_project(db, files): project = Project.objects.get(id=1) site = Site.objects.get(id=2) user = User.objects.get(id=1) diff --git a/rdmo/projects/tests/test_view_project_copy.py b/rdmo/projects/tests/test_view_project_copy.py index 46de9d0718..8ecec135da 100644 --- a/rdmo/projects/tests/test_view_project_copy.py +++ b/rdmo/projects/tests/test_view_project_copy.py @@ -101,7 +101,7 @@ def test_project_copy_forbidden_get(db, client, settings): @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) -def test_project_copy_post(db, client, username, password, project_id): +def test_project_copy_post(db, files, client, username, password, project_id): client.login(username=username, password=password) project_count = Project.objects.count() @@ -131,7 +131,7 @@ def test_project_copy_post(db, client, username, password, project_id): assert Value.objects.count() == value_count -def test_project_copy_post_restricted(db, client, settings): +def test_project_copy_post_restricted(db, files, client, settings): settings.PROJECT_CREATE_RESTRICTED = True settings.PROJECT_CREATE_GROUPS = ['projects'] @@ -152,7 +152,7 @@ def test_project_copy_post_restricted(db, client, settings): assert response.status_code == 302 -def test_project_copy_post_forbidden(db, client, settings): +def test_project_copy_post_forbidden(db, files, client, settings): settings.PROJECT_CREATE_RESTRICTED = True client.login(username='guest', password='guest') @@ -170,7 +170,7 @@ def test_project_copy_post_forbidden(db, client, settings): @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) -def test_project_copy_parent_post(db, client, username, password, project_id): +def test_project_copy_parent_post(db, files, client, username, password, project_id): client.login(username=username, password=password) project_count = Project.objects.count() diff --git a/rdmo/projects/tests/test_viewset_project.py b/rdmo/projects/tests/test_viewset_project.py index 9c0fd6070d..860860f691 100644 --- a/rdmo/projects/tests/test_viewset_project.py +++ b/rdmo/projects/tests/test_viewset_project.py @@ -221,7 +221,7 @@ def test_create_parent(db, client, username, password, project_id): @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) -def test_copy(db, client, username, password, project_id): +def test_copy(db, files, client, username, password, project_id): client.login(username=username, password=password) project_count = Project.objects.count() @@ -260,7 +260,7 @@ def test_copy(db, client, username, password, project_id): assert Value.objects.count() == value_count -def test_copy_restricted(db, client, settings): +def test_copy_restricted(db, files, client, settings): settings.PROJECT_CREATE_RESTRICTED = True settings.PROJECT_CREATE_GROUPS = ['projects'] From 16b4edb26e18764bd676d41c1c88cb1b68f09c8d Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Tue, 26 Nov 2024 16:23:16 +0100 Subject: [PATCH 027/160] * display also not available catalogs for managers in catalog filter --- .../assets/js/projects/components/helper/ProjectFilters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js b/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js index 0ce94c1a23..49c2702726 100644 --- a/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js +++ b/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js @@ -35,7 +35,7 @@ const ProjectFilters = ({ catalogs, config, configActions, isManager, projectsAc projectsActions.fetchProjects() } - const catalogOptions = catalogs?.filter(catalog => catalog.available) + const catalogOptions = catalogs?.filter(catalog => isManager || catalog.available) .map(catalog => ({ value: catalog.id.toString(), label: catalog.title })) const selectedCatalog = get(config, 'params.catalog', '') const updateCatalogFilter = (value) => { From 5fd60d9f81e3a07cf7d304fde5474f1c6698d96f Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Tue, 26 Nov 2024 16:34:02 +0100 Subject: [PATCH 028/160] * extend .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3d2c0d88b1..3cc8fffc25 100644 --- a/.gitignore +++ b/.gitignore @@ -36,7 +36,7 @@ dist rdmo/management/static -rdmo/core/static/core/js/base.js +rdmo/core/static/core/js/base*.js rdmo/core/static/core/fonts rdmo/core/static/core/css/base.css From 755e014fadaa83ff58b8e07c03c5de8c6981dd83 Mon Sep 17 00:00:00 2001 From: Claudia Malzer <42971992+CalamityC@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:51:55 +0100 Subject: [PATCH 029/160] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3cc8fffc25..612df3afe1 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,7 @@ rdmo/management/static rdmo/core/static/core/js/base*.js rdmo/core/static/core/fonts -rdmo/core/static/core/css/base.css +rdmo/core/static/core/css/base*.css rdmo/projects/static/projects/js/*.js rdmo/projects/static/projects/fonts From 6f8244e3c6662814be569454f9254c84c58bafb2 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 27 Nov 2024 17:19:46 +0100 Subject: [PATCH 030/160] feat(projects): add method to find next relevant page #1191 Signed-off-by: David Wallace --- rdmo/projects/progress.py | 57 ++++++++++++++++++++++++++++++--------- rdmo/projects/viewsets.py | 45 +++++++++++++++++++------------ 2 files changed, 72 insertions(+), 30 deletions(-) diff --git a/rdmo/projects/progress.py b/rdmo/projects/progress.py index efe7421369..372873ab07 100644 --- a/rdmo/projects/progress.py +++ b/rdmo/projects/progress.py @@ -47,6 +47,48 @@ def compute_sets(values): return sets +def compute_next_relevant_page(current_page, direction, catalog, resolved_conditions): + # compute the next relevant page based on resolved conditions. + max_iterations = len(catalog.pages) + iterations = 0 + + while iterations < max_iterations: + iterations += 1 + + # Determine the next page based on the specified direction + next_page = (catalog.get_prev_page(current_page) if direction == 'prev' + else catalog.get_next_page(current_page)) + + # If no further pages are available, return None + if not next_page: + return None + + # Use compute_show_page with precomputed resolved_conditions to check if the next page meets conditions + if compute_show_page(next_page, resolved_conditions): + return next_page # Found the next relevant page + + # Move to the next page in sequence if conditions are not met + current_page = next_page + return None + +def compute_show_page(page, conditions): + """Determine if a page should be shown based on resolved conditions.""" + # show only pages with resolved conditions, but show all pages without conditions + pages_conditions = {page.id for page in page.conditions.all()} + + if pages_conditions: + # check if any valuesets for set_prefix = '' resolved + # for non collection pages restrict further to set_index = 0 + + return any( + (set_prefix == '') and (page.is_collection or set_index == 0) + for page_condition in pages_conditions + for set_prefix, set_index in conditions[page_condition] + ) + else: + return True + + def compute_navigation(section, project, snapshot=None): # get all values for this project and snapshot values = project.values.filter(snapshot=snapshot).select_related('attribute', 'option') @@ -74,19 +116,8 @@ def compute_navigation(section, project, snapshot=None): navigation_section['pages'] = [] for page in catalog_section.elements: - pages_conditions = {page.id for page in page.conditions.all()} - - # show only pages with resolved conditions, but show all pages without conditions - if pages_conditions: - # check if any valuesets for set_prefix = '' resolved - # for non collection pages restrict further to set_index = 0 - show = any( - (set_prefix == '') and (page.is_collection or set_index == 0) - for page_condition in pages_conditions - for set_prefix, set_index in conditions[page_condition] - ) - else: - show = True + + show = compute_show_page(page, conditions) # count the total number of questions, taking sets and conditions into account counts = count_questions(page, sets, conditions) diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index 8c5d367a5b..b01a3b9926 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -42,7 +42,14 @@ HasProjectProgressObjectPermission, HasProjectsPermission, ) -from .progress import compute_navigation, compute_progress +from .progress import ( + compute_navigation, + compute_next_relevant_page, + compute_progress, + compute_sets, + compute_show_page, + resolve_conditions, +) from .serializers.v1 import ( IntegrationSerializer, InviteSerializer, @@ -521,29 +528,33 @@ def dispatch(self, *args, **kwargs): def retrieve(self, request, *args, **kwargs): page = self.get_object() - conditions = page.conditions.select_related('source', 'target_option') - + catalog = self.project.catalog values = self.project.values.filter(snapshot=None).select_related('attribute', 'option') - if check_conditions(conditions, values): + sets = compute_sets(values) + resolved_conditions = resolve_conditions(catalog, values, sets) + + # check if the current page meets conditions + if compute_show_page(page, resolved_conditions): serializer = self.get_serializer(page) return Response(serializer.data) else: - if request.GET.get('back') == 'true': - prev_page = self.project.catalog.get_prev_page(page) - if prev_page is not None: - url = reverse('v1-projects:project-page-detail', - args=[self.project.id, prev_page.id]) + '?back=true' - return HttpResponseRedirect(url, status=303) - else: - next_page = self.project.catalog.get_next_page(page) - if next_page is not None: - url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id]) - return HttpResponseRedirect(url, status=303) - - # indicate end of catalog + # determine the direction of navigation (previous or next) + direction = 'prev' if request.GET.get('back') == 'true' else 'next' + + # find the next relevant page with from pages and resolved conditions + next_page = compute_next_relevant_page(page, direction, catalog, resolved_conditions) + + if next_page is not None: + url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id]) + if direction == 'prev': + url += '?back=true' + return HttpResponseRedirect(url, status=303) + + # end of catalog, if no next relevant page is found return Response(status=204) + @action(detail=False, url_path='continue', permission_classes=(HasModelPermission | HasProjectPagePermission, )) def get_continue(self, request, pk=None, parent_lookup_project=None): try: From 471df6ed513e56648c51c4c75f8a2da2fbd89ea5 Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Thu, 28 Nov 2024 12:31:11 +0100 Subject: [PATCH 031/160] use text-muted className for unavailable catalogs in dropdown select --- .../js/projects/components/helper/ProjectFilters.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js b/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js index 49c2702726..bbd730456e 100644 --- a/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js +++ b/rdmo/projects/assets/js/projects/components/helper/ProjectFilters.js @@ -36,7 +36,14 @@ const ProjectFilters = ({ catalogs, config, configActions, isManager, projectsAc } const catalogOptions = catalogs?.filter(catalog => isManager || catalog.available) - .map(catalog => ({ value: catalog.id.toString(), label: catalog.title })) + .map(catalog => ({ + value: catalog.id.toString(), + label: ( + + {catalog.title} + + ), + })) const selectedCatalog = get(config, 'params.catalog', '') const updateCatalogFilter = (value) => { value ? configActions.updateConfig('params.catalog', value) : configActions.deleteConfig('params.catalog') From 911ecea650ab246fe2d164acd9eaa58ae08ba978 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 28 Nov 2024 16:05:06 +0100 Subject: [PATCH 032/160] Fix test --- rdmo/projects/tests/test_viewset_project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdmo/projects/tests/test_viewset_project.py b/rdmo/projects/tests/test_viewset_project.py index 860860f691..7427781f8d 100644 --- a/rdmo/projects/tests/test_viewset_project.py +++ b/rdmo/projects/tests/test_viewset_project.py @@ -330,7 +330,7 @@ def test_copy_catalog_not_available(db, client): assert response.status_code == 400 @pytest.mark.parametrize('project_id', projects) -def test_copy_parent(db, client, project_id): +def test_copy_parent(db, files, client, project_id): client.login(username='owner', password='owner') project = Project.objects.get(pk=project_id) From 4ad68c5fea776eb0a696d0d57ccaa13697cf9679 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 28 Nov 2024 16:50:37 +0100 Subject: [PATCH 033/160] Fix test_copy_project --- rdmo/projects/tests/test_utils.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/rdmo/projects/tests/test_utils.py b/rdmo/projects/tests/test_utils.py index c2ccb1a49c..cbb2f4af04 100644 --- a/rdmo/projects/tests/test_utils.py +++ b/rdmo/projects/tests/test_utils.py @@ -82,12 +82,18 @@ def test_copy_project(db, files): 'unit', 'external_id' ) + ordering = ( + 'attribute', + 'set_prefix', + 'set_index', + 'collection_index' + ) for value_copy, value in zip( - project_copy.values.filter(snapshot=None), - project.values.filter(snapshot=None) + project_copy.values.filter(snapshot=None).order_by(*ordering), + project.values.filter(snapshot=None).order_by(*ordering) ): for field in value_fields: - assert getattr(value_copy, field) == getattr(value, field) + assert getattr(value_copy, field) == getattr(value, field), field if value_copy.file: assert value_copy.file.path == value_copy.file.path.replace( @@ -100,8 +106,8 @@ def test_copy_project(db, files): for snapshot_copy, snapshot in zip(project_copy.snapshots.all(), project.snapshots.all()): for value_copy, value in zip( - project_copy.values.filter(snapshot=snapshot_copy), - project.values.filter(snapshot=snapshot) + project_copy.values.filter(snapshot=snapshot_copy).order_by(*ordering), + project.values.filter(snapshot=snapshot).order_by(*ordering) ): for field in value_fields: assert getattr(value_copy, field) == getattr(value, field) From 520add8eb687bf2bdce8a3584b533401eee8de42 Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Thu, 28 Nov 2024 19:15:16 +0100 Subject: [PATCH 034/160] add css class for muted text in select dropdown --- rdmo/projects/assets/scss/projects.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rdmo/projects/assets/scss/projects.scss b/rdmo/projects/assets/scss/projects.scss index dbe1811707..5134309d95 100644 --- a/rdmo/projects/assets/scss/projects.scss +++ b/rdmo/projects/assets/scss/projects.scss @@ -374,3 +374,8 @@ a.disabled { .dropzone.disabled { opacity: 0.6; } + +/* Selected style for muted select options */ +.react-select__menu .react-select__option--is-selected .text-muted { + color: white; /* White when selected */ +} From be95d7edbf9ead5c658d226af80e90669956e7b3 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 29 Nov 2024 16:25:31 +0100 Subject: [PATCH 035/160] Fix copy_project --- rdmo/projects/utils.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/rdmo/projects/utils.py b/rdmo/projects/utils.py index b0edaf068a..f9a4ec2c08 100644 --- a/rdmo/projects/utils.py +++ b/rdmo/projects/utils.py @@ -3,6 +3,7 @@ from django.conf import settings from django.contrib.sites.models import Site +from django.db import connection from django.template.loader import render_to_string from django.urls import reverse from django.utils.timezone import now @@ -110,7 +111,23 @@ def copy_project(project, site, owners): Value.objects.bulk_create(project_snapshot_values) for value, file_name, file_content in file_values: - value.copy_file(file_name, file_content) + if connection.vendor == 'postgres': + # bulk_create will only set the primary key on cool databases + # https://docs.djangoproject.com/en/4.2/ref/models/querysets/#bulk-create + value.copy_file(file_name, file_content) + else: + # refetch the value from the database, we use filter and first here to be more + # stable against weird cases, where collection_index is not unique + db_value = Value.objects.filter( + project=value.project, + snapshot=value.snapshot, + attribute=value.attribute, + set_prefix=value.set_prefix, + set_index=value.set_index, + collection_index=value.collection_index + ).first() + if db_value and db_value.file_name == file_name: + db_value.copy_file(file_name, file_content) for owner in owners: membership = Membership(project=project, user=owner, role='owner') From db39d47879799e09a6f73701edf2115eb2f8d6a5 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Fri, 29 Nov 2024 17:04:22 +0100 Subject: [PATCH 036/160] refactor(projects,progress): compute next relevant page recursively Signed-off-by: David Wallace --- rdmo/projects/progress.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/rdmo/projects/progress.py b/rdmo/projects/progress.py index 372873ab07..01036caceb 100644 --- a/rdmo/projects/progress.py +++ b/rdmo/projects/progress.py @@ -49,27 +49,23 @@ def compute_sets(values): def compute_next_relevant_page(current_page, direction, catalog, resolved_conditions): # compute the next relevant page based on resolved conditions. - max_iterations = len(catalog.pages) - iterations = 0 + # If no current_page, return None + if not current_page: + return None - while iterations < max_iterations: - iterations += 1 + # Check if the current page meets the conditions + if compute_show_page(current_page, resolved_conditions): + return current_page - # Determine the next page based on the specified direction - next_page = (catalog.get_prev_page(current_page) if direction == 'prev' - else catalog.get_next_page(current_page)) + # Determine the next page based on the specified direction + next_page = ( + catalog.get_prev_page(current_page) if direction == 'prev' + else catalog.get_next_page(current_page) + ) - # If no further pages are available, return None - if not next_page: - return None + # Recursive step: Check the next page + return compute_next_relevant_page(next_page, direction, catalog, resolved_conditions) - # Use compute_show_page with precomputed resolved_conditions to check if the next page meets conditions - if compute_show_page(next_page, resolved_conditions): - return next_page # Found the next relevant page - - # Move to the next page in sequence if conditions are not met - current_page = next_page - return None def compute_show_page(page, conditions): """Determine if a page should be shown based on resolved conditions.""" From 94bc9cacf4284eb6d0c8829da26765f2b9566ff6 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 29 Nov 2024 17:58:03 +0100 Subject: [PATCH 037/160] Simplify copy_project and fix tests --- rdmo/core/tests/utils.py | 6 +++++ rdmo/projects/tests/test_utils.py | 12 ++++++++-- rdmo/projects/utils.py | 39 ++++++++----------------------- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/rdmo/core/tests/utils.py b/rdmo/core/tests/utils.py index 3bf4db8c4a..1fce8f674b 100644 --- a/rdmo/core/tests/utils.py +++ b/rdmo/core/tests/utils.py @@ -1,3 +1,5 @@ +import hashlib + from rdmo.core.models import Model from rdmo.core.tests.constants import multisite_status_map, status_map_object_permissions @@ -30,3 +32,7 @@ def get_obj_perms_status_code(instance, username, method): except KeyError: # not all users are defined in the method_instance_perms_map return multisite_status_map[method][username] + + +def compute_checksum(string): + return hashlib.sha1(string).hexdigest() diff --git a/rdmo/projects/tests/test_utils.py b/rdmo/projects/tests/test_utils.py index cbb2f4af04..db2bfe2c51 100644 --- a/rdmo/projects/tests/test_utils.py +++ b/rdmo/projects/tests/test_utils.py @@ -4,6 +4,8 @@ from django.contrib.sites.models import Site from django.http import QueryDict +from rdmo.core.tests.utils import compute_checksum + from ..filters import ProjectFilter from ..models import Project from ..utils import copy_project, set_context_querystring_with_filter_and_page @@ -96,11 +98,14 @@ def test_copy_project(db, files): assert getattr(value_copy, field) == getattr(value, field), field if value_copy.file: + assert value_copy.file.path != value.file.path assert value_copy.file.path == value_copy.file.path.replace( f'/projects/{project.id}/values/{value.id}/', f'/projects/{project_copy.id}/values/{value_copy.id}/' ) - assert value_copy.file.size == value_copy.file.size + assert value_copy.file.size == value.file.size + assert compute_checksum(value_copy.file.open('rb').read()) == \ + compute_checksum(value.file.open('rb').read()) else: assert not value.file @@ -113,10 +118,13 @@ def test_copy_project(db, files): assert getattr(value_copy, field) == getattr(value, field) if value_copy.file: + assert value_copy.file.path != value.file.path assert value_copy.file.path == value_copy.file.path.replace( f'/projects/{project.id}/snapshot/{snapshot.id}/values/{value.id}/', f'/projects/{project_copy.id}/snapshot/{snapshot.id}/values/{value_copy.id}/' ) - assert value_copy.file.open('rb').read() == value_copy.file.open('rb').read() + assert value_copy.file.size == value.file.size + assert compute_checksum(value_copy.file.open('rb').read()) == \ + compute_checksum(value.file.open('rb').read()) else: assert not value.file diff --git a/rdmo/projects/utils.py b/rdmo/projects/utils.py index f9a4ec2c08..ab619b54b4 100644 --- a/rdmo/projects/utils.py +++ b/rdmo/projects/utils.py @@ -3,7 +3,6 @@ from django.conf import settings from django.contrib.sites.models import Site -from django.db import connection from django.template.loader import render_to_string from django.urls import reverse from django.utils.timezone import now @@ -54,9 +53,6 @@ def copy_project(project, site, owners): for snapshot in project.snapshots.all() } - # create a temporary buffer for all values with files - file_values = [] - # unset the id, set current site and update timestamps project.id = None project.site = site @@ -81,9 +77,12 @@ def copy_project(project, site, owners): value.created = timestamp if value.file: - file_values.append((value, value.file_name, value.file)) - - project_values.append(value) + # file values cannot be bulk created since we need their id and only postgres provides that (reliably) + # https://docs.djangoproject.com/en/4.2/ref/models/querysets/#bulk-create + value.save() + value.copy_file(value.file_name, value.file) + else: + project_values.append(value) # insert the new values using bulk_create Value.objects.bulk_create(project_values) @@ -103,32 +102,14 @@ def copy_project(project, site, owners): value.created = timestamp if value.file: - file_values.append((value, value.file_name, value.file)) - - project_snapshot_values.append(value) + value.save() + value.copy_file(value.file_name, value.file) + else: + project_snapshot_values.append(value) # insert the new snapshot values using bulk_create Value.objects.bulk_create(project_snapshot_values) - for value, file_name, file_content in file_values: - if connection.vendor == 'postgres': - # bulk_create will only set the primary key on cool databases - # https://docs.djangoproject.com/en/4.2/ref/models/querysets/#bulk-create - value.copy_file(file_name, file_content) - else: - # refetch the value from the database, we use filter and first here to be more - # stable against weird cases, where collection_index is not unique - db_value = Value.objects.filter( - project=value.project, - snapshot=value.snapshot, - attribute=value.attribute, - set_prefix=value.set_prefix, - set_index=value.set_index, - collection_index=value.collection_index - ).first() - if db_value and db_value.file_name == file_name: - db_value.copy_file(file_name, file_content) - for owner in owners: membership = Membership(project=project, user=owner, role='owner') membership.save() From f0572f7b9fe42db0100251e6b2079af9257cc026 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Mon, 2 Dec 2024 15:00:29 +0100 Subject: [PATCH 038/160] build(webpack): add build:dist, fails on warnings #1197 Signed-off-by: David Wallace --- .github/workflows/ci.yml | 2 +- package.json | 1 + webpack.config.js | 34 +++++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 255aff784f..0f72bb6def 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: with: node-version: 18 cache: npm - - run: npm ci && npm run build:prod + - run: npm ci && npm run build:dist # build the wheel - uses: actions/setup-python@v5 with: diff --git a/package.json b/package.json index d2e79d2b81..066ec6aa30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "rdmo", "scripts": { + "build:dist": "webpack --config webpack.config.js --mode production --env ignore-perf --fail-on-warnings", "build:prod": "webpack --config webpack.config.js --mode production", "build": "webpack --config webpack.config.js --mode development", "watch": "webpack --config webpack.config.js --mode development --watch" diff --git a/webpack.config.js b/webpack.config.js index d1d630dd32..7ae8bf9371 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -108,6 +108,7 @@ const developmentConfig = { // special config for production const productionConfig = { + bail: true, // Stop the build on errors plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') @@ -116,16 +117,39 @@ const productionConfig = { optimization: { minimize: true, minimizer: [new TerserPlugin()] - } + }, +} + +const ignorePerformanceWarnings = { + performance: { + hints: false // Suppress performance warnings in prod + }, + ignoreWarnings: [ // ignore performance issues + { message: /performance recommendations/ }, + { message: /asset size limit/ }, + { message: /entrypoint size limit/ } + ] } // combine config depending on the provided --mode command line option module.exports = (env, argv) => { return configList.map(config => { - if (argv.mode === 'development') { - return merge(config, baseConfig, developmentConfig) - } else { - return merge(config, baseConfig, productionConfig) + switch (argv.mode) { + + case 'development': + // used for build and watch + return merge(config, baseConfig, developmentConfig) + + case 'production': + if (env && env['ignore-perf']) { + // build:dist will ignore performance warnings but fails on other warnings + return merge(config, baseConfig, productionConfig, ignorePerformanceWarnings) + } + // build:prod + return merge(config, baseConfig, productionConfig) + + default: + throw new Error('Invalid mode') } }) } From 5c492e366805e913b0dcd21ee3b0ba7b6df3889e Mon Sep 17 00:00:00 2001 From: David Wallace Date: Mon, 2 Dec 2024 18:56:21 +0100 Subject: [PATCH 039/160] tests(project, page): add specific test for next relevant page Signed-off-by: David Wallace --- .../tests/test_viewset_project_page.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/rdmo/projects/tests/test_viewset_project_page.py b/rdmo/projects/tests/test_viewset_project_page.py index c9d0510a50..8a6b326f4f 100644 --- a/rdmo/projects/tests/test_viewset_project_page.py +++ b/rdmo/projects/tests/test_viewset_project_page.py @@ -88,3 +88,37 @@ def test_detail_page_with_nested_questionsets(db, client): assert questionsets_ids == nested_questionsets_id element_ids = [i['id'] for qs in questionsets for i in qs['elements']] assert element_ids == nested_element_ids + + +@pytest.mark.parametrize('direction', ['next', 'prev']) +def test_detail_page_resolve_next_relevant_page(db, client, direction): + project_id = 1 + username = 'owner' + start_page_id = 64 + end_page_id = 69 + + client.login(username=username, password=username) + + if direction == 'next': + next_page_id = start_page_id + 1 + add_url = '' + else: # direction == 'prev': + start_page_id, end_page_id = end_page_id, start_page_id + next_page_id = start_page_id - 1 + add_url = '?back=true' + + # get the starting page + url = reverse(urlnames['detail'], args=[project_id, start_page_id]) + response = client.get(f'{url}{add_url}') + assert response.status_code == 200 + assert response.json().get(f'{direction}_page') == next_page_id + # get the following page, depending on direction + url_next = reverse(urlnames['detail'], args=[project_id, next_page_id]) + response_next = client.get(f'{url_next}{add_url}') + assert response_next.status_code == 303 + # this should show the redirect to the next relevant page + assert response_next.url.endswith(f'{end_page_id}/{add_url}') + + # a get on the redirected url as a double check + response_next_relevant = client.get(response_next.url) + assert response_next_relevant.status_code == 200 From e413d301fb6376ebe76d3af3c3466bcd70ab6efa Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 3 Dec 2024 17:30:57 +0100 Subject: [PATCH 040/160] refactor(projects,pages): update style Signed-off-by: David Wallace --- rdmo/projects/progress.py | 13 +++++++------ rdmo/projects/tests/test_viewset_project_page.py | 4 +++- rdmo/projects/viewsets.py | 12 +++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/rdmo/projects/progress.py b/rdmo/projects/progress.py index 01036caceb..ce03d340b4 100644 --- a/rdmo/projects/progress.py +++ b/rdmo/projects/progress.py @@ -49,6 +49,13 @@ def compute_sets(values): def compute_next_relevant_page(current_page, direction, catalog, resolved_conditions): # compute the next relevant page based on resolved conditions. + + # Determine the next page based on the specified direction + next_page = ( + catalog.get_prev_page(current_page) if direction == 'prev' + else catalog.get_next_page(current_page) + ) + # If no current_page, return None if not current_page: return None @@ -57,12 +64,6 @@ def compute_next_relevant_page(current_page, direction, catalog, resolved_condit if compute_show_page(current_page, resolved_conditions): return current_page - # Determine the next page based on the specified direction - next_page = ( - catalog.get_prev_page(current_page) if direction == 'prev' - else catalog.get_next_page(current_page) - ) - # Recursive step: Check the next page return compute_next_relevant_page(next_page, direction, catalog, resolved_conditions) diff --git a/rdmo/projects/tests/test_viewset_project_page.py b/rdmo/projects/tests/test_viewset_project_page.py index 8a6b326f4f..228ee2e3d3 100644 --- a/rdmo/projects/tests/test_viewset_project_page.py +++ b/rdmo/projects/tests/test_viewset_project_page.py @@ -112,12 +112,14 @@ def test_detail_page_resolve_next_relevant_page(db, client, direction): response = client.get(f'{url}{add_url}') assert response.status_code == 200 assert response.json().get(f'{direction}_page') == next_page_id + # get the following page, depending on direction url_next = reverse(urlnames['detail'], args=[project_id, next_page_id]) response_next = client.get(f'{url_next}{add_url}') assert response_next.status_code == 303 + # this should show the redirect to the next relevant page - assert response_next.url.endswith(f'{end_page_id}/{add_url}') + assert response_next.url.endswith(f'{end_page_id}/') # a get on the redirected url as a double check response_next_relevant = client.get(response_next.url) diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index b01a3b9926..4d52e3bb6e 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -21,7 +21,7 @@ from rdmo.conditions.models import Condition from rdmo.core.permissions import HasModelPermission -from rdmo.core.utils import human2bytes, return_file_response +from rdmo.core.utils import human2bytes, is_truthy, return_file_response from rdmo.options.models import OptionSet from rdmo.questions.models import Catalog, Page, Question, QuestionSet from rdmo.tasks.models import Task @@ -540,15 +540,13 @@ def retrieve(self, request, *args, **kwargs): return Response(serializer.data) else: # determine the direction of navigation (previous or next) - direction = 'prev' if request.GET.get('back') == 'true' else 'next' + direction = 'prev' if is_truthy(request.GET.get('back')) else 'next' # find the next relevant page with from pages and resolved conditions - next_page = compute_next_relevant_page(page, direction, catalog, resolved_conditions) + next_relevant_page = compute_next_relevant_page(page, direction, catalog, resolved_conditions) - if next_page is not None: - url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id]) - if direction == 'prev': - url += '?back=true' + if next_relevant_page is not None: + url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_relevant_page.id]) return HttpResponseRedirect(url, status=303) # end of catalog, if no next relevant page is found From 365b892eeffcaed18e8f3dd87f38d371c7a0d8ce Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 4 Dec 2024 09:45:31 +0100 Subject: [PATCH 041/160] refactor(projects,pages): rename variables, update comments Signed-off-by: David Wallace --- rdmo/projects/progress.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rdmo/projects/progress.py b/rdmo/projects/progress.py index ce03d340b4..755203800d 100644 --- a/rdmo/projects/progress.py +++ b/rdmo/projects/progress.py @@ -48,28 +48,27 @@ def compute_sets(values): def compute_next_relevant_page(current_page, direction, catalog, resolved_conditions): - # compute the next relevant page based on resolved conditions. - - # Determine the next page based on the specified direction + # recursively compute the next relevant page based on resolved conditions. + # first, get the next page from the catalog based on the specified direction next_page = ( catalog.get_prev_page(current_page) if direction == 'prev' else catalog.get_next_page(current_page) ) - # If no current_page, return None - if not current_page: + # if there is no next page, return None + if not next_page: return None - # Check if the current page meets the conditions - if compute_show_page(current_page, resolved_conditions): - return current_page + # check if the next page meets the conditions + if compute_show_page(next_page, resolved_conditions): + return next_page - # Recursive step: Check the next page + # recursive step: check the next page return compute_next_relevant_page(next_page, direction, catalog, resolved_conditions) def compute_show_page(page, conditions): - """Determine if a page should be shown based on resolved conditions.""" + # determine if a page should be shown based on resolved conditions # show only pages with resolved conditions, but show all pages without conditions pages_conditions = {page.id for page in page.conditions.all()} @@ -114,6 +113,7 @@ def compute_navigation(section, project, snapshot=None): for page in catalog_section.elements: + # determine if a page should be shown or not show = compute_show_page(page, conditions) # count the total number of questions, taking sets and conditions into account From eec363fa3a07b675afe6eae7ebffb11dda1b0ed2 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 12 Mar 2024 18:11:11 +0100 Subject: [PATCH 042/160] Add project_interview view and refactor webpack config --- rdmo/projects/assets/js/interview.js | 1 + rdmo/projects/assets/scss/interview.scss | 3 ++ .../templates/projects/project_interview.html | 32 +++++++++++++++++++ rdmo/projects/urls/__init__.py | 3 ++ rdmo/projects/views/__init__.py | 1 + rdmo/projects/views/project.py | 16 ++++++++++ 6 files changed, 56 insertions(+) create mode 100644 rdmo/projects/assets/js/interview.js create mode 100644 rdmo/projects/assets/scss/interview.scss create mode 100644 rdmo/projects/templates/projects/project_interview.html diff --git a/rdmo/projects/assets/js/interview.js b/rdmo/projects/assets/js/interview.js new file mode 100644 index 0000000000..f30bda44bb --- /dev/null +++ b/rdmo/projects/assets/js/interview.js @@ -0,0 +1 @@ +console.log('interview') diff --git a/rdmo/projects/assets/scss/interview.scss b/rdmo/projects/assets/scss/interview.scss new file mode 100644 index 0000000000..0ae12b5d5c --- /dev/null +++ b/rdmo/projects/assets/scss/interview.scss @@ -0,0 +1,3 @@ +.interview { + +} diff --git a/rdmo/projects/templates/projects/project_interview.html b/rdmo/projects/templates/projects/project_interview.html new file mode 100644 index 0000000000..761136204d --- /dev/null +++ b/rdmo/projects/templates/projects/project_interview.html @@ -0,0 +1,32 @@ +{% extends 'core/page.html' %} +{% load static %} +{% load i18n %} +{% load core_tags %} + +{% block vendor %} +{% endblock %} + +{% block css %} + + +{% endblock %} + +{% block js %} + + + +{% endblock %} + +{% block sidebar %} + + + +{% endblock %} + +{% block page %} + +
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. +
+ +{% endblock %} diff --git a/rdmo/projects/urls/__init__.py b/rdmo/projects/urls/__init__.py index b7cc6d81f9..7fa4a27705 100644 --- a/rdmo/projects/urls/__init__.py +++ b/rdmo/projects/urls/__init__.py @@ -22,6 +22,7 @@ ProjectDetailView, ProjectErrorView, ProjectExportView, + ProjectInterviewView, ProjectJoinView, ProjectLeaveView, ProjectQuestionsView, @@ -138,6 +139,8 @@ re_path(r'^(?P[0-9]+)/questions/', ProjectQuestionsView.as_view(), name='project_questions'), + re_path(r'^(?P[0-9]+)/interview/', + ProjectInterviewView.as_view(), name='project_interview'), re_path(r'^(?P[0-9]+)/error/', ProjectErrorView.as_view(), name='project_error'), ] diff --git a/rdmo/projects/views/__init__.py b/rdmo/projects/views/__init__.py index a6899c8671..7cee69be9f 100644 --- a/rdmo/projects/views/__init__.py +++ b/rdmo/projects/views/__init__.py @@ -8,6 +8,7 @@ ProjectDetailView, ProjectErrorView, ProjectExportView, + ProjectInterviewView, ProjectJoinView, ProjectLeaveView, ProjectQuestionsView, diff --git a/rdmo/projects/views/project.py b/rdmo/projects/views/project.py index 88fc5fc99a..9760fbd3b6 100644 --- a/rdmo/projects/views/project.py +++ b/rdmo/projects/views/project.py @@ -203,6 +203,22 @@ def get(self, request, *args, **kwargs): return self.render_to_response(context) +class ProjectInterviewView(ObjectPermissionMixin, DetailView): + model = Project + queryset = Project.objects.all() + permission_required = 'projects.view_project_object' + template_name = 'projects/project_interview.html' + + @method_decorator(ensure_csrf_cookie) + def get(self, request, *args, **kwargs): + self.object = self.get_object() + + if self.object.catalog is None: + return redirect('project_error', pk=self.object.pk) + else: + return super().get(request, *args, **kwargs) + + class ProjectErrorView(ObjectPermissionMixin, DetailView): model = Project queryset = Project.objects.all() From 1c6489caaf4bcc8be076485557e5b2a0d145e050 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 14 Mar 2024 12:48:46 +0100 Subject: [PATCH 043/160] Add lint script to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 066ec6aa30..27606a11b2 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "build:dist": "webpack --config webpack.config.js --mode production --env ignore-perf --fail-on-warnings", "build:prod": "webpack --config webpack.config.js --mode production", "build": "webpack --config webpack.config.js --mode development", - "watch": "webpack --config webpack.config.js --mode development --watch" + "watch": "webpack --config webpack.config.js --mode development --watch", + "lint": "eslint --ext .js rdmo/" }, "author": "RDMO Arbeitsgemeinschaft ", "license": "Apache-2.0", From 4a25cfbf0712b752155f293c11ea2df7859d1188 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 14 Mar 2024 12:49:25 +0100 Subject: [PATCH 044/160] Move Pending container to core/assets --- .../assets/js/containers/Pending.js | 23 ------------------- rdmo/management/assets/js/management.js | 3 ++- 2 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 rdmo/management/assets/js/containers/Pending.js diff --git a/rdmo/management/assets/js/containers/Pending.js b/rdmo/management/assets/js/containers/Pending.js deleted file mode 100644 index 7b421c49df..0000000000 --- a/rdmo/management/assets/js/containers/Pending.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { connect } from 'react-redux' - -const Pending = ({ config }) => { - if (config.pending) { - return - } else { - return null - } -} - -Pending.propTypes = { - config: PropTypes.object.isRequired, -} - -function mapStateToProps(state) { - return { - config: state.config, - } -} - -export default connect(mapStateToProps)(Pending) diff --git a/rdmo/management/assets/js/management.js b/rdmo/management/assets/js/management.js index 55b37879ed..122f043cd2 100644 --- a/rdmo/management/assets/js/management.js +++ b/rdmo/management/assets/js/management.js @@ -7,9 +7,10 @@ import configureStore from './store/configureStore' import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' +import Pending from '../../../core/assets/js/containers/Pending' + import Main from './containers/Main' import Sidebar from './containers/Sidebar' -import Pending from './containers/Pending' const store = configureStore() From 40cd8d80e02c9188829a1d3e4fe81e0e64403187 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 14 Mar 2024 12:50:29 +0100 Subject: [PATCH 045/160] Add react/redux setup for interview --- rdmo/projects/assets/js/interview.js | 36 +++++++++++++++- .../js/interview/actions/configActions.js | 23 ++++++++++ .../assets/js/interview/actions/types.js | 3 ++ .../assets/js/interview/api/ProjectsApi.js | 0 .../assets/js/interview/containers/Main.js | 38 ++++++++++++++++ .../assets/js/interview/containers/Sidebar.js | 38 ++++++++++++++++ .../js/interview/reducers/configReducer.js | 29 +++++++++++++ .../js/interview/reducers/rootReducer.js | 9 ++++ .../js/interview/store/configureStore.js | 43 +++++++++++++++++++ .../templates/projects/project_interview.html | 4 +- 10 files changed, 219 insertions(+), 4 deletions(-) create mode 100644 rdmo/projects/assets/js/interview/actions/configActions.js create mode 100644 rdmo/projects/assets/js/interview/actions/types.js create mode 100644 rdmo/projects/assets/js/interview/api/ProjectsApi.js create mode 100644 rdmo/projects/assets/js/interview/containers/Main.js create mode 100644 rdmo/projects/assets/js/interview/containers/Sidebar.js create mode 100644 rdmo/projects/assets/js/interview/reducers/configReducer.js create mode 100644 rdmo/projects/assets/js/interview/reducers/rootReducer.js create mode 100644 rdmo/projects/assets/js/interview/store/configureStore.js diff --git a/rdmo/projects/assets/js/interview.js b/rdmo/projects/assets/js/interview.js index f30bda44bb..97435a43f5 100644 --- a/rdmo/projects/assets/js/interview.js +++ b/rdmo/projects/assets/js/interview.js @@ -1 +1,35 @@ -console.log('interview') +import React from 'react' +import { createRoot } from 'react-dom/client' +import { Provider } from 'react-redux' + +import configureStore from './interview/store/configureStore' + +import { DndProvider } from 'react-dnd' +import { HTML5Backend } from 'react-dnd-html5-backend' + +import Pending from '../../../core/assets/js/containers/Pending' + +import Main from './interview/containers/Main' +import Sidebar from './interview/containers/Sidebar' + +const store = configureStore() + +createRoot(document.getElementById('main')).render( + + +
+ + +) + +createRoot(document.getElementById('sidebar')).render( + + + +) + +createRoot(document.getElementById('pending')).render( + + + +) diff --git a/rdmo/projects/assets/js/interview/actions/configActions.js b/rdmo/projects/assets/js/interview/actions/configActions.js new file mode 100644 index 0000000000..1e19b0f9c3 --- /dev/null +++ b/rdmo/projects/assets/js/interview/actions/configActions.js @@ -0,0 +1,23 @@ +import CoreApi from 'rdmo/core/assets/js/api/CoreApi' + +import { FETCH_CONFIG_SUCCESS, FETCH_CONFIG_ERROR, UPDATE_CONFIG } from './types' + +export function fetchConfig() { + return (dispatch) => Promise.all([ + CoreApi.fetchSettings(), + ]).then(([settings]) => dispatch(fetchConfigSuccess({ + settings + }))) +} + +export function fetchConfigSuccess(config) { + return {type: FETCH_CONFIG_SUCCESS, config} +} + +export function fetchConfigError(errors) { + return {type: FETCH_CONFIG_ERROR, errors} +} + +export function updateConfig(path, value) { + return {type: UPDATE_CONFIG, path, value} +} diff --git a/rdmo/projects/assets/js/interview/actions/types.js b/rdmo/projects/assets/js/interview/actions/types.js new file mode 100644 index 0000000000..8a94536096 --- /dev/null +++ b/rdmo/projects/assets/js/interview/actions/types.js @@ -0,0 +1,3 @@ +export const FETCH_CONFIG_SUCCESS = 'config/fetchConfigSuccess' +export const FETCH_CONFIG_ERROR = 'config/fetchConfigError' +export const UPDATE_CONFIG = 'config/updateConfig' diff --git a/rdmo/projects/assets/js/interview/api/ProjectsApi.js b/rdmo/projects/assets/js/interview/api/ProjectsApi.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rdmo/projects/assets/js/interview/containers/Main.js b/rdmo/projects/assets/js/interview/containers/Main.js new file mode 100644 index 0000000000..f7b4aedf22 --- /dev/null +++ b/rdmo/projects/assets/js/interview/containers/Main.js @@ -0,0 +1,38 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' + +import * as configActions from '../actions/configActions' + +const Main = ({ config, configActions }) => { + + console.log(config) + console.log(configActions) + + // fetching the data is not complete yet, or no action was invoked yet + return ( +
+ Main +
+ ) +} + +Main.propTypes = { + config: PropTypes.object.isRequired, + configActions: PropTypes.object.isRequired +} + +function mapStateToProps(state) { + return { + config: state.config + } +} + +function mapDispatchToProps(dispatch) { + return { + configActions: bindActionCreators(configActions, dispatch) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(Main) diff --git a/rdmo/projects/assets/js/interview/containers/Sidebar.js b/rdmo/projects/assets/js/interview/containers/Sidebar.js new file mode 100644 index 0000000000..156049720f --- /dev/null +++ b/rdmo/projects/assets/js/interview/containers/Sidebar.js @@ -0,0 +1,38 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' + +import * as configActions from '../actions/configActions' + +const Sidebar = ({ config, configActions }) => { + + console.log(config) + console.log(configActions) + + // fetching the data is not complete yet, or no action was invoked yet + return ( +
+ Sidebar +
+ ) +} + +Sidebar.propTypes = { + config: PropTypes.object.isRequired, + configActions: PropTypes.object.isRequired +} + +function mapStateToProps(state) { + return { + config: state.config + } +} + +function mapDispatchToProps(dispatch) { + return { + configActions: bindActionCreators(configActions, dispatch) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(Sidebar) diff --git a/rdmo/projects/assets/js/interview/reducers/configReducer.js b/rdmo/projects/assets/js/interview/reducers/configReducer.js new file mode 100644 index 0000000000..c4b81b02e0 --- /dev/null +++ b/rdmo/projects/assets/js/interview/reducers/configReducer.js @@ -0,0 +1,29 @@ +import set from 'lodash/set' + +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' + +import { FETCH_CONFIG_SUCCESS, FETCH_CONFIG_ERROR, UPDATE_CONFIG } from '../actions/types' + +const initialState = { + baseUrl: baseUrl + '/interview/', + settings: {} +} + +export default function configReducer(state = initialState, action) { + let newState + switch(action.type) { + case UPDATE_CONFIG: + newState = {...state} + + set(newState, action.path, action.value) + localStorage.setItem(`rdmo.management.config.${action.path}`, action.value) + + return newState + case FETCH_CONFIG_SUCCESS: + return {...state, ...action.config} + case FETCH_CONFIG_ERROR: + return {...state, pending: false } + default: + return state + } +} diff --git a/rdmo/projects/assets/js/interview/reducers/rootReducer.js b/rdmo/projects/assets/js/interview/reducers/rootReducer.js new file mode 100644 index 0000000000..26ef719cbe --- /dev/null +++ b/rdmo/projects/assets/js/interview/reducers/rootReducer.js @@ -0,0 +1,9 @@ +import { combineReducers } from 'redux' + +import configReducer from './configReducer' + +const rootReducer = combineReducers({ + config: configReducer +}) + +export default rootReducer diff --git a/rdmo/projects/assets/js/interview/store/configureStore.js b/rdmo/projects/assets/js/interview/store/configureStore.js new file mode 100644 index 0000000000..6b33e43f0b --- /dev/null +++ b/rdmo/projects/assets/js/interview/store/configureStore.js @@ -0,0 +1,43 @@ +import { applyMiddleware, createStore } from 'redux' +import Cookies from 'js-cookie' +import thunk from 'redux-thunk' +import isEmpty from 'lodash/isEmpty' + +import rootReducer from '../reducers/rootReducer' + +import * as configActions from '../actions/configActions' + +export default function configureStore() { + const middlewares = [thunk] + + // empty localStorage in new session + const currentStoreId = Cookies.get('storeid') + const localStoreId = localStorage.getItem('rdmo.storeid') + + if (isEmpty(localStoreId) || localStoreId !== currentStoreId) { + localStorage.clear() + localStorage.setItem('rdmo.storeid', currentStoreId) + } + + if (process.env.NODE_ENV === 'development') { + const { logger } = require('redux-logger') + middlewares.push(logger) + } + + const store = createStore( + rootReducer, + applyMiddleware(...middlewares) + ) + + // this event is triggered when the page first loads + window.addEventListener('load', () => { + store.dispatch(configActions.fetchConfig()) + }) + + // this event is triggered when when the forward/back buttons are used + window.addEventListener('popstate', () => { + + }) + + return store +} diff --git a/rdmo/projects/templates/projects/project_interview.html b/rdmo/projects/templates/projects/project_interview.html index 761136204d..8c894b557d 100644 --- a/rdmo/projects/templates/projects/project_interview.html +++ b/rdmo/projects/templates/projects/project_interview.html @@ -25,8 +25,6 @@ {% block page %} -
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. -
+
{% endblock %} From 97b3a44aef41e55cddcc05756e2ee55d3f2b1375 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 15 Mar 2024 15:10:13 +0100 Subject: [PATCH 046/160] Add breadcrumb, overview, progress, buttons and navigation to interview --- .../js/interview/actions/pageActions.js | 51 +++++++++++++ .../assets/js/interview/actions/types.js | 10 +++ .../assets/js/interview/api/PagesApi.js | 15 ++++ .../assets/js/interview/api/ProjectsApi.js | 23 ++++++ .../assets/js/interview/api/ValuesApi.js | 39 ++++++++++ .../js/interview/components/Breadcrump.js | 30 ++++++++ .../assets/js/interview/components/Buttons.js | 34 +++++++++ .../js/interview/components/Navigation.js | 71 +++++++++++++++++++ .../js/interview/components/Overview.js | 43 +++++++++++ .../js/interview/components/Progress.js | 30 ++++++++ .../assets/js/interview/containers/Main.js | 37 ++++++---- .../assets/js/interview/containers/Sidebar.js | 41 +++++++---- .../js/interview/reducers/pageReducer.js | 16 +++++ .../js/interview/reducers/rootReducer.js | 4 +- .../js/interview/store/configureStore.js | 7 +- rdmo/projects/assets/scss/interview.scss | 50 ++++++++++++- 16 files changed, 472 insertions(+), 29 deletions(-) create mode 100644 rdmo/projects/assets/js/interview/actions/pageActions.js create mode 100644 rdmo/projects/assets/js/interview/api/PagesApi.js create mode 100644 rdmo/projects/assets/js/interview/api/ValuesApi.js create mode 100644 rdmo/projects/assets/js/interview/components/Breadcrump.js create mode 100644 rdmo/projects/assets/js/interview/components/Buttons.js create mode 100644 rdmo/projects/assets/js/interview/components/Navigation.js create mode 100644 rdmo/projects/assets/js/interview/components/Overview.js create mode 100644 rdmo/projects/assets/js/interview/components/Progress.js create mode 100644 rdmo/projects/assets/js/interview/reducers/pageReducer.js diff --git a/rdmo/projects/assets/js/interview/actions/pageActions.js b/rdmo/projects/assets/js/interview/actions/pageActions.js new file mode 100644 index 0000000000..84fbea6751 --- /dev/null +++ b/rdmo/projects/assets/js/interview/actions/pageActions.js @@ -0,0 +1,51 @@ +import PagesApi from '../api/PagesApi' +import ProjectsApi from '../api/ProjectsApi' +import ValuesApi from '../api/ValuesApi' + +import { FETCH_PAGE_SUCCESS, FETCH_PAGE_ERROR, UPLOAD_FILE_SUCCESS, UPLOAD_FILE_ERROR, JUMP, PREV, NEXT } from './types' + +export function fetchPage() { + return (dispatch) => Promise.all([ + PagesApi.fetchContinue(12), + ProjectsApi.fetchProject(12), + ProjectsApi.fetchOverview(12), + ProjectsApi.fetchProgress(12), + ProjectsApi.fetchNavigation(12, 1) + ]).then(([page, project, overview, progress, navigation]) => dispatch(fetchPageSuccess({ + page, project, overview, progress, navigation + }))) +} + +export function fetchPageSuccess(page) { + return {type: FETCH_PAGE_SUCCESS, page} +} + +export function fetchPageError(errors) { + return {type: FETCH_PAGE_ERROR, errors} +} + +export function uploadFile(projectId, valueId, file) { + return (dispatch) => ValuesApi.uploadFile(projectId, valueId, file).then((value) => { + dispatch(uploadFileSuccess(value)) + }) +} + +export function uploadFileSuccess(value) { + return {type: UPLOAD_FILE_SUCCESS, value} +} + +export function uploadFileError(value) { + return {type: UPLOAD_FILE_ERROR, value} +} + +export function jump(section, page = null) { + return {type: JUMP, section, page} +} + +export function prev() { + return {type: PREV} +} + +export function next() { + return {type: NEXT} +} diff --git a/rdmo/projects/assets/js/interview/actions/types.js b/rdmo/projects/assets/js/interview/actions/types.js index 8a94536096..f04a109c02 100644 --- a/rdmo/projects/assets/js/interview/actions/types.js +++ b/rdmo/projects/assets/js/interview/actions/types.js @@ -1,3 +1,13 @@ export const FETCH_CONFIG_SUCCESS = 'config/fetchConfigSuccess' export const FETCH_CONFIG_ERROR = 'config/fetchConfigError' export const UPDATE_CONFIG = 'config/updateConfig' + +export const FETCH_PAGE_SUCCESS = 'page/fetchPageSuccess' +export const FETCH_PAGE_ERROR = 'page/fetchPageError' + +export const UPLOAD_FILE_SUCCESS = 'page/uploadFileSuccess' +export const UPLOAD_FILE_ERROR = 'page/uploadFileError' + +export const JUMP = 'page/jump' +export const NEXT = 'page/next' +export const PREV = 'page/prev' diff --git a/rdmo/projects/assets/js/interview/api/PagesApi.js b/rdmo/projects/assets/js/interview/api/PagesApi.js new file mode 100644 index 0000000000..f71993fbca --- /dev/null +++ b/rdmo/projects/assets/js/interview/api/PagesApi.js @@ -0,0 +1,15 @@ +import BaseApi from 'rdmo/core/assets/js/api/BaseApi' + +class ProjectsApi extends BaseApi { + + static fetchPage(projectId, page_id) { + return this.get(`/api/v1/projects/projects/${projectId}/pages/${page_id}`) + } + + static fetchContinue(projectId) { + return this.get(`/api/v1/projects/projects/${projectId}/pages/continue/`) + } + +} + +export default ProjectsApi diff --git a/rdmo/projects/assets/js/interview/api/ProjectsApi.js b/rdmo/projects/assets/js/interview/api/ProjectsApi.js index e69de29bb2..38117ff0d5 100644 --- a/rdmo/projects/assets/js/interview/api/ProjectsApi.js +++ b/rdmo/projects/assets/js/interview/api/ProjectsApi.js @@ -0,0 +1,23 @@ +import BaseApi from 'rdmo/core/assets/js/api/BaseApi' + +class ProjectsApi extends BaseApi { + + static fetchProject(projectId) { + return this.get(`/api/v1/projects/projects/${projectId}/`) + } + + static fetchOverview(projectId) { + return this.get(`/api/v1/projects/projects/${projectId}/overview/`) + } + + static fetchNavigation(projectId, page_id) { + return this.get(`/api/v1/projects/projects/${projectId}/navigation/${page_id}`) + } + + static fetchProgress(projectId) { + return this.get(`/api/v1/projects/projects/${projectId}/progress/`) + } + +} + +export default ProjectsApi diff --git a/rdmo/projects/assets/js/interview/api/ValuesApi.js b/rdmo/projects/assets/js/interview/api/ValuesApi.js new file mode 100644 index 0000000000..2add6f4716 --- /dev/null +++ b/rdmo/projects/assets/js/interview/api/ValuesApi.js @@ -0,0 +1,39 @@ +import Cookies from 'js-cookie' + +import BaseApi from 'rdmo/core/assets/js/api/BaseApi' + +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' + +class ValuesApi extends BaseApi { + + static uploadFile(projectId, valueId, file) { + const url = `/api/v1/projects/projects/${projectId}/values/${valueId}/file/` + + var formData = new FormData() + formData.append('method', 'upload_file') + formData.append('file', file) + + return fetch(baseUrl + url, { + method: 'POST', + headers: { + 'X-CSRFToken': Cookies.get('csrftoken') + }, + body: formData + }).catch(error => { + throw new Error(`API error: ${error.message}`) + }).then(response => { + if (response.ok) { + return response.json() + } else if (response.status == 400) { + // return response.json().then(errors => { + // throw new ValidationError(errors) + // }) + } else { + // throw new ApiError(response.statusText, response.status) + } + }) + } + +} + +export default ValuesApi diff --git a/rdmo/projects/assets/js/interview/components/Breadcrump.js b/rdmo/projects/assets/js/interview/components/Breadcrump.js new file mode 100644 index 0000000000..624e49c53b --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Breadcrump.js @@ -0,0 +1,30 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Breadcrump = ({ project, page, onJump }) => { + return ( + + ) +} + +Breadcrump.propTypes = { + project: PropTypes.object.isRequired, + page: PropTypes.object.isRequired, + onJump: PropTypes.func.isRequired +} + +export default Breadcrump diff --git a/rdmo/projects/assets/js/interview/components/Buttons.js b/rdmo/projects/assets/js/interview/components/Buttons.js new file mode 100644 index 0000000000..603d2adc08 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Buttons.js @@ -0,0 +1,34 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Buttons = ({ currentPage, onPrev, onNext }) => { + return ( + <> +
+
+ +
+ +
+ +
+
+ + ) +} + +Buttons.propTypes = { + currentPage: PropTypes.object.isRequired, + onPrev: PropTypes.func.isRequired, + onNext: PropTypes.func.isRequired +} + +export default Buttons diff --git a/rdmo/projects/assets/js/interview/components/Navigation.js b/rdmo/projects/assets/js/interview/components/Navigation.js new file mode 100644 index 0000000000..096e547810 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Navigation.js @@ -0,0 +1,71 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classNames from 'classnames' + +const Navigation = ({ currentPage, navigation, onJump }) => { + + const handleJump = (event, section, page) => { + event.preventDefault() + onJump(section, page) + } + + return ( + <> +

{gettext('Navigation')}

+ + + + ) +} + +Navigation.propTypes = { + currentPage: PropTypes.object.isRequired, + navigation: PropTypes.array.isRequired, + onJump: PropTypes.func.isRequired +} + +export default Navigation diff --git a/rdmo/projects/assets/js/interview/components/Overview.js b/rdmo/projects/assets/js/interview/components/Overview.js new file mode 100644 index 0000000000..7f37f4aaf3 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Overview.js @@ -0,0 +1,43 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' + +const Overview = ({ project }) => { + + const projectsUrl = `${baseUrl}/projects/` + const projectUrl = `${baseUrl}/projects/${project.id}` + + return ( + <> +

{gettext('Overview')}

+ +
+
    +
  • + {gettext('Project')}: {project.title} +
  • +
  • + {/* TODO: get catalog title from catalog api */} + {gettext('Catalog')}: {project.catalog} +
  • +
+ + +
+ + ) +} + +Overview.propTypes = { + project: PropTypes.object.isRequired +} + +export default Overview diff --git a/rdmo/projects/assets/js/interview/components/Progress.js b/rdmo/projects/assets/js/interview/components/Progress.js new file mode 100644 index 0000000000..59de5e33d2 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Progress.js @@ -0,0 +1,30 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Progress = ({ progress }) => { + const low = progress.ratio <= 0.25 + const width = progress.ratio * 100 + const label = interpolate(gettext('%s of %s'), [progress.count, progress.total]) + + return ( + <> +

{gettext('Progress')}

+ +
+ {low &&
} + +
+
+ {!low && } +
+
+
+ + ) +} + +Progress.propTypes = { + progress: PropTypes.object.isRequired +} + +export default Progress diff --git a/rdmo/projects/assets/js/interview/containers/Main.js b/rdmo/projects/assets/js/interview/containers/Main.js index f7b4aedf22..9fd81b6531 100644 --- a/rdmo/projects/assets/js/interview/containers/Main.js +++ b/rdmo/projects/assets/js/interview/containers/Main.js @@ -3,35 +3,46 @@ import PropTypes from 'prop-types' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' -import * as configActions from '../actions/configActions' - -const Main = ({ config, configActions }) => { +import Breadcrump from '../components/Breadcrump' - console.log(config) - console.log(configActions) +import * as configActions from '../actions/configActions' +import * as pageActions from '../actions/pageActions' + +// eslint-disable-next-line no-unused-vars +const Main = ({ config, page, configActions, pageActions }) => { + if (page.display) { + return ( +
+ pageActions.jump(pageId)} /> +

+ {page.page.title} +

+
+ ) + } // fetching the data is not complete yet, or no action was invoked yet - return ( -
- Main -
- ) + return null } Main.propTypes = { config: PropTypes.object.isRequired, - configActions: PropTypes.object.isRequired + page: PropTypes.object.isRequired, + configActions: PropTypes.object.isRequired, + pageActions: PropTypes.object.isRequired } function mapStateToProps(state) { return { - config: state.config + config: state.config, + page: state.page } } function mapDispatchToProps(dispatch) { return { - configActions: bindActionCreators(configActions, dispatch) + configActions: bindActionCreators(configActions, dispatch), + pageActions: bindActionCreators(pageActions, dispatch) } } diff --git a/rdmo/projects/assets/js/interview/containers/Sidebar.js b/rdmo/projects/assets/js/interview/containers/Sidebar.js index 156049720f..4eb0c6535c 100644 --- a/rdmo/projects/assets/js/interview/containers/Sidebar.js +++ b/rdmo/projects/assets/js/interview/containers/Sidebar.js @@ -3,35 +3,50 @@ import PropTypes from 'prop-types' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' -import * as configActions from '../actions/configActions' - -const Sidebar = ({ config, configActions }) => { +import Buttons from '../components/Buttons' +import Navigation from '../components/Navigation' +import Overview from '../components/Overview' +import Progress from '../components/Progress' - console.log(config) - console.log(configActions) +import * as configActions from '../actions/configActions' +import * as pageActions from '../actions/pageActions' + +// eslint-disable-next-line no-unused-vars +const Sidebar = ({ config, page, configActions, pageActions }) => { + if (page.display) { + return ( +
+ + + pageActions.prev()} onNext={() => pageActions.next()} /> + pageActions.jump(sectionId, pageId)} /> +
+ ) + } // fetching the data is not complete yet, or no action was invoked yet - return ( -
- Sidebar -
- ) + return null } Sidebar.propTypes = { config: PropTypes.object.isRequired, - configActions: PropTypes.object.isRequired + page: PropTypes.object.isRequired, + configActions: PropTypes.object.isRequired, + pageActions: PropTypes.object.isRequired } function mapStateToProps(state) { return { - config: state.config + config: state.config, + page: state.page } } function mapDispatchToProps(dispatch) { return { - configActions: bindActionCreators(configActions, dispatch) + configActions: bindActionCreators(configActions, dispatch), + pageActions: bindActionCreators(pageActions, dispatch) } } diff --git a/rdmo/projects/assets/js/interview/reducers/pageReducer.js b/rdmo/projects/assets/js/interview/reducers/pageReducer.js new file mode 100644 index 0000000000..72bb0f110f --- /dev/null +++ b/rdmo/projects/assets/js/interview/reducers/pageReducer.js @@ -0,0 +1,16 @@ +import { FETCH_PAGE_SUCCESS, FETCH_PAGE_ERROR } from '../actions/types' + +const initialState = { + display: false +} + +export default function configReducer(state = initialState, action) { + switch(action.type) { + case FETCH_PAGE_SUCCESS: + return {...state, ...action.page, display: true} + case FETCH_PAGE_ERROR: + return {...state } + default: + return state + } +} diff --git a/rdmo/projects/assets/js/interview/reducers/rootReducer.js b/rdmo/projects/assets/js/interview/reducers/rootReducer.js index 26ef719cbe..b4866f767f 100644 --- a/rdmo/projects/assets/js/interview/reducers/rootReducer.js +++ b/rdmo/projects/assets/js/interview/reducers/rootReducer.js @@ -1,9 +1,11 @@ import { combineReducers } from 'redux' import configReducer from './configReducer' +import pageReducer from './pageReducer' const rootReducer = combineReducers({ - config: configReducer + config: configReducer, + page: pageReducer }) export default rootReducer diff --git a/rdmo/projects/assets/js/interview/store/configureStore.js b/rdmo/projects/assets/js/interview/store/configureStore.js index 6b33e43f0b..f530eae6d3 100644 --- a/rdmo/projects/assets/js/interview/store/configureStore.js +++ b/rdmo/projects/assets/js/interview/store/configureStore.js @@ -6,6 +6,7 @@ import isEmpty from 'lodash/isEmpty' import rootReducer from '../reducers/rootReducer' import * as configActions from '../actions/configActions' +import * as pageActions from '../actions/pageActions' export default function configureStore() { const middlewares = [thunk] @@ -29,9 +30,13 @@ export default function configureStore() { applyMiddleware(...middlewares) ) + const fetchConfig = () => store.dispatch(configActions.fetchConfig()) + + const fetchPage = () => store.dispatch(pageActions.fetchPage()) + // this event is triggered when the page first loads window.addEventListener('load', () => { - store.dispatch(configActions.fetchConfig()) + fetchConfig().then(() => fetchPage()) }) // this event is triggered when when the forward/back buttons are used diff --git a/rdmo/projects/assets/scss/interview.scss b/rdmo/projects/assets/scss/interview.scss index 0ae12b5d5c..c1658500bf 100644 --- a/rdmo/projects/assets/scss/interview.scss +++ b/rdmo/projects/assets/scss/interview.scss @@ -1,3 +1,51 @@ -.interview { +.interview-breadcrumb { + margin-top: 20px; + margin-bottom: 12px; + background-color: transparent; + border: 1px solid #ccc; +} + +.interview-navigation { + line-height: 24px; + + h4 { + line-height: 20px; + margin-top: 20px; + margin-bottom: 10px; + } + a { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + ul { + margin-left: 0; + } + li ul li { + margin-left: 20px; + } + li.active { + margin-left: 0; + } + li.active a:before { + float: left; + width: 20px; + text-align: right; + content: '\2192\0000a0'; /* right-arrow followed by a space */ + } +} + +.interview-progress { + .progress { + margin-bottom: 10px; + } + + .interview-progress-count { + position: absolute; + left: 0; + right: 0; + text-align: center; + } } From 6cbd09a2e6eb5c98773587ce317086455f4dc946 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Mon, 25 Mar 2024 19:34:44 +0100 Subject: [PATCH 047/160] Add location handling and refactor --- .../js/interview/actions/interviewActions.js | 80 +++++++++++++++++++ .../js/interview/actions/pageActions.js | 51 ------------ .../assets/js/interview/actions/types.js | 17 ++-- .../interview/api/{PagesApi.js => PageApi.js} | 4 +- .../api/{ProjectsApi.js => ProjectApi.js} | 4 - .../assets/js/interview/api/ValuesApi.js | 39 --------- .../js/interview/components/Breadcrump.js | 24 ++++-- .../assets/js/interview/components/Buttons.js | 11 ++- .../js/interview/components/Navigation.js | 38 ++++----- .../js/interview/components/Overview.js | 10 +-- .../assets/js/interview/containers/Main.js | 18 ++--- .../assets/js/interview/containers/Sidebar.js | 23 +++--- .../js/interview/reducers/configReducer.js | 3 - .../js/interview/reducers/interviewReducer.js | 34 ++++++++ .../js/interview/reducers/pageReducer.js | 16 ---- .../js/interview/reducers/rootReducer.js | 11 --- .../js/interview/store/configureStore.js | 29 +++++-- .../assets/js/interview/utils/location.js | 26 ++++++ .../assets/js/interview/utils/projectId.js | 2 + .../templates/projects/project_interview.html | 4 + 20 files changed, 243 insertions(+), 201 deletions(-) create mode 100644 rdmo/projects/assets/js/interview/actions/interviewActions.js delete mode 100644 rdmo/projects/assets/js/interview/actions/pageActions.js rename rdmo/projects/assets/js/interview/api/{PagesApi.js => PageApi.js} (84%) rename rdmo/projects/assets/js/interview/api/{ProjectsApi.js => ProjectApi.js} (82%) delete mode 100644 rdmo/projects/assets/js/interview/api/ValuesApi.js create mode 100644 rdmo/projects/assets/js/interview/reducers/interviewReducer.js delete mode 100644 rdmo/projects/assets/js/interview/reducers/pageReducer.js delete mode 100644 rdmo/projects/assets/js/interview/reducers/rootReducer.js create mode 100644 rdmo/projects/assets/js/interview/utils/location.js create mode 100644 rdmo/projects/assets/js/interview/utils/projectId.js diff --git a/rdmo/projects/assets/js/interview/actions/interviewActions.js b/rdmo/projects/assets/js/interview/actions/interviewActions.js new file mode 100644 index 0000000000..d00acc3d00 --- /dev/null +++ b/rdmo/projects/assets/js/interview/actions/interviewActions.js @@ -0,0 +1,80 @@ +import isNil from 'lodash/isNil' + +import PageApi from '../api/PageApi' +import ProjectApi from '../api/ProjectApi' + +import { updateLocation } from '../utils/location' +import projectId from '../utils/projectId' + +import { + FETCH_NAVIGATION_ERROR, + FETCH_NAVIGATION_SUCCESS, + FETCH_OVERVIEW_ERROR, + FETCH_OVERVIEW_SUCCESS, + FETCH_PAGE_ERROR, + FETCH_PAGE_SUCCESS, + FETCH_PROGRESS_ERROR, + FETCH_PROGRESS_SUCCESS, +} from './types' + +export function fetchOverview() { + return (dispatch) => ProjectApi.fetchOverview(projectId) + .then((overview) => dispatch(fetchOverviewSuccess(overview))) + .catch((errors) => dispatch(fetchOverviewError(errors))) +} + +export function fetchOverviewSuccess(overview) { + return {type: FETCH_OVERVIEW_SUCCESS, overview} +} + +export function fetchOverviewError(errors) { + return {type: FETCH_OVERVIEW_ERROR, errors} +} + +export function fetchProgress() { + return (dispatch) => ProjectApi.fetchProgress(projectId) + .then((progress) => dispatch(fetchProgressSuccess(progress))) + .catch((errors) => dispatch(fetchProgressError(errors))) +} + +export function fetchProgressSuccess(progress) { + return {type: FETCH_PROGRESS_SUCCESS, progress} +} + +export function fetchProgressError(errors) { + return {type: FETCH_PROGRESS_ERROR, errors} +} + +export function fetchNavigation(sectionId) { + return (dispatch) => ProjectApi.fetchNavigation(projectId, sectionId) + .then((navigation) => dispatch(fetchNavigationSuccess(navigation))) + .catch((errors) => dispatch(fetchNavigationError(errors))) +} + +export function fetchNavigationSuccess(navigation) { + return {type: FETCH_NAVIGATION_SUCCESS, navigation} +} + +export function fetchNavigationError(errors) { + return {type: FETCH_NAVIGATION_ERROR, errors} +} + +export function fetchPage(pageId) { + return (dispatch) => { + const promise = isNil(pageId) ? PageApi.fetchContinue(projectId) + : PageApi.fetchPage(projectId, pageId) + return promise.then((page) => { + updateLocation(page.id) + dispatch(fetchNavigation(page.section.id)) + dispatch(fetchPageSuccess(page)) + }) + } +} + +export function fetchPageSuccess(page) { + return {type: FETCH_PAGE_SUCCESS, page} +} + +export function fetchPageError(errors) { + return {type: FETCH_PAGE_ERROR, errors} +} diff --git a/rdmo/projects/assets/js/interview/actions/pageActions.js b/rdmo/projects/assets/js/interview/actions/pageActions.js deleted file mode 100644 index 84fbea6751..0000000000 --- a/rdmo/projects/assets/js/interview/actions/pageActions.js +++ /dev/null @@ -1,51 +0,0 @@ -import PagesApi from '../api/PagesApi' -import ProjectsApi from '../api/ProjectsApi' -import ValuesApi from '../api/ValuesApi' - -import { FETCH_PAGE_SUCCESS, FETCH_PAGE_ERROR, UPLOAD_FILE_SUCCESS, UPLOAD_FILE_ERROR, JUMP, PREV, NEXT } from './types' - -export function fetchPage() { - return (dispatch) => Promise.all([ - PagesApi.fetchContinue(12), - ProjectsApi.fetchProject(12), - ProjectsApi.fetchOverview(12), - ProjectsApi.fetchProgress(12), - ProjectsApi.fetchNavigation(12, 1) - ]).then(([page, project, overview, progress, navigation]) => dispatch(fetchPageSuccess({ - page, project, overview, progress, navigation - }))) -} - -export function fetchPageSuccess(page) { - return {type: FETCH_PAGE_SUCCESS, page} -} - -export function fetchPageError(errors) { - return {type: FETCH_PAGE_ERROR, errors} -} - -export function uploadFile(projectId, valueId, file) { - return (dispatch) => ValuesApi.uploadFile(projectId, valueId, file).then((value) => { - dispatch(uploadFileSuccess(value)) - }) -} - -export function uploadFileSuccess(value) { - return {type: UPLOAD_FILE_SUCCESS, value} -} - -export function uploadFileError(value) { - return {type: UPLOAD_FILE_ERROR, value} -} - -export function jump(section, page = null) { - return {type: JUMP, section, page} -} - -export function prev() { - return {type: PREV} -} - -export function next() { - return {type: NEXT} -} diff --git a/rdmo/projects/assets/js/interview/actions/types.js b/rdmo/projects/assets/js/interview/actions/types.js index f04a109c02..e07c2acb8b 100644 --- a/rdmo/projects/assets/js/interview/actions/types.js +++ b/rdmo/projects/assets/js/interview/actions/types.js @@ -2,12 +2,11 @@ export const FETCH_CONFIG_SUCCESS = 'config/fetchConfigSuccess' export const FETCH_CONFIG_ERROR = 'config/fetchConfigError' export const UPDATE_CONFIG = 'config/updateConfig' -export const FETCH_PAGE_SUCCESS = 'page/fetchPageSuccess' -export const FETCH_PAGE_ERROR = 'page/fetchPageError' - -export const UPLOAD_FILE_SUCCESS = 'page/uploadFileSuccess' -export const UPLOAD_FILE_ERROR = 'page/uploadFileError' - -export const JUMP = 'page/jump' -export const NEXT = 'page/next' -export const PREV = 'page/prev' +export const FETCH_NAVIGATION_ERROR = 'interview/fetchNavigationSuccess' +export const FETCH_NAVIGATION_SUCCESS = 'interview/fetchNavigationSuccess' +export const FETCH_OVERVIEW_ERROR = 'interview/fetchOverviewSuccess' +export const FETCH_OVERVIEW_SUCCESS = 'interview/fetchOverviewSuccess' +export const FETCH_PAGE_ERROR = 'interview/fetchPageError' +export const FETCH_PAGE_SUCCESS = 'interview/fetchPageSuccess' +export const FETCH_PROGRESS_ERROR = 'interview/fetchProgressSuccess' +export const FETCH_PROGRESS_SUCCESS = 'interview/fetchProgressSuccess' diff --git a/rdmo/projects/assets/js/interview/api/PagesApi.js b/rdmo/projects/assets/js/interview/api/PageApi.js similarity index 84% rename from rdmo/projects/assets/js/interview/api/PagesApi.js rename to rdmo/projects/assets/js/interview/api/PageApi.js index f71993fbca..49f3d45027 100644 --- a/rdmo/projects/assets/js/interview/api/PagesApi.js +++ b/rdmo/projects/assets/js/interview/api/PageApi.js @@ -2,8 +2,8 @@ import BaseApi from 'rdmo/core/assets/js/api/BaseApi' class ProjectsApi extends BaseApi { - static fetchPage(projectId, page_id) { - return this.get(`/api/v1/projects/projects/${projectId}/pages/${page_id}`) + static fetchPage(projectId, pageId) { + return this.get(`/api/v1/projects/projects/${projectId}/pages/${pageId}`) } static fetchContinue(projectId) { diff --git a/rdmo/projects/assets/js/interview/api/ProjectsApi.js b/rdmo/projects/assets/js/interview/api/ProjectApi.js similarity index 82% rename from rdmo/projects/assets/js/interview/api/ProjectsApi.js rename to rdmo/projects/assets/js/interview/api/ProjectApi.js index 38117ff0d5..216efc85be 100644 --- a/rdmo/projects/assets/js/interview/api/ProjectsApi.js +++ b/rdmo/projects/assets/js/interview/api/ProjectApi.js @@ -2,10 +2,6 @@ import BaseApi from 'rdmo/core/assets/js/api/BaseApi' class ProjectsApi extends BaseApi { - static fetchProject(projectId) { - return this.get(`/api/v1/projects/projects/${projectId}/`) - } - static fetchOverview(projectId) { return this.get(`/api/v1/projects/projects/${projectId}/overview/`) } diff --git a/rdmo/projects/assets/js/interview/api/ValuesApi.js b/rdmo/projects/assets/js/interview/api/ValuesApi.js deleted file mode 100644 index 2add6f4716..0000000000 --- a/rdmo/projects/assets/js/interview/api/ValuesApi.js +++ /dev/null @@ -1,39 +0,0 @@ -import Cookies from 'js-cookie' - -import BaseApi from 'rdmo/core/assets/js/api/BaseApi' - -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' - -class ValuesApi extends BaseApi { - - static uploadFile(projectId, valueId, file) { - const url = `/api/v1/projects/projects/${projectId}/values/${valueId}/file/` - - var formData = new FormData() - formData.append('method', 'upload_file') - formData.append('file', file) - - return fetch(baseUrl + url, { - method: 'POST', - headers: { - 'X-CSRFToken': Cookies.get('csrftoken') - }, - body: formData - }).catch(error => { - throw new Error(`API error: ${error.message}`) - }).then(response => { - if (response.ok) { - return response.json() - } else if (response.status == 400) { - // return response.json().then(errors => { - // throw new ValidationError(errors) - // }) - } else { - // throw new ApiError(response.statusText, response.status) - } - }) - } - -} - -export default ValuesApi diff --git a/rdmo/projects/assets/js/interview/components/Breadcrump.js b/rdmo/projects/assets/js/interview/components/Breadcrump.js index 624e49c53b..a7b5f4842d 100644 --- a/rdmo/projects/assets/js/interview/components/Breadcrump.js +++ b/rdmo/projects/assets/js/interview/components/Breadcrump.js @@ -1,19 +1,29 @@ import React from 'react' import PropTypes from 'prop-types' -const Breadcrump = ({ project, page, onJump }) => { +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' + +const Breadcrump = ({ overview, page, onClick }) => { + + const handleClick = (event) => { + event.preventDefault() + onClick(page.section.first) + } + return (
  • - {gettext('My Projects')} + + {gettext('My Projects')} +
  • - - {project.title} + + {overview.title}
  • - onJump(page.section.id)}> + {page.section.title}
  • @@ -22,9 +32,9 @@ const Breadcrump = ({ project, page, onJump }) => { } Breadcrump.propTypes = { - project: PropTypes.object.isRequired, + overview: PropTypes.object.isRequired, page: PropTypes.object.isRequired, - onJump: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired } export default Breadcrump diff --git a/rdmo/projects/assets/js/interview/components/Buttons.js b/rdmo/projects/assets/js/interview/components/Buttons.js index 603d2adc08..b2581adfb7 100644 --- a/rdmo/projects/assets/js/interview/components/Buttons.js +++ b/rdmo/projects/assets/js/interview/components/Buttons.js @@ -1,12 +1,12 @@ import React from 'react' import PropTypes from 'prop-types' -const Buttons = ({ currentPage, onPrev, onNext }) => { +const Buttons = ({ page, onClick }) => { return ( <>
    -
    - @@ -26,9 +26,8 @@ const Buttons = ({ currentPage, onPrev, onNext }) => { } Buttons.propTypes = { - currentPage: PropTypes.object.isRequired, - onPrev: PropTypes.func.isRequired, - onNext: PropTypes.func.isRequired + page: PropTypes.object.isRequired, + onClick: PropTypes.func.isRequired } export default Buttons diff --git a/rdmo/projects/assets/js/interview/components/Navigation.js b/rdmo/projects/assets/js/interview/components/Navigation.js index 096e547810..6fba977089 100644 --- a/rdmo/projects/assets/js/interview/components/Navigation.js +++ b/rdmo/projects/assets/js/interview/components/Navigation.js @@ -2,11 +2,11 @@ import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' -const Navigation = ({ currentPage, navigation, onJump }) => { +const Navigation = ({ page, navigation, onClick }) => { - const handleJump = (event, section, page) => { + const handleClick = (event, pageId) => { event.preventDefault() - onJump(section, page) + onClick(pageId) } return ( @@ -15,37 +15,37 @@ const Navigation = ({ currentPage, navigation, onJump }) => {
      { - navigation.map((section, sectionIndex) => ( -
    • - handleJump(event, section)}> - {section.title} + navigation.map((s, sIndex) => ( +
    • + handleClick(event, s.first)}> + {s.title} { - section.pages && ( + s.pages && (
        { - section.pages.map((page, pageIndex) => ( -
      • + s.pages.map((p, pIndex) => ( +
      • { - page.show ? ( - handleJump(event, section, page)}> - {page.title} + p.show ? ( + handleClick(event, p.id)}> + {p.title} { - page.count > 0 && page.count == page.total && ( + p.count > 0 && p.count == p.total && ( ) } { - page.count > 0 && page.count != page.total && ( + p.count > 0 && p.count != p.total && ( + __html: interpolate(gettext('(%s of %s)'), [p.count, p.total])}} /> ) } ) : ( - {page.title} + {p.title} ) }
      • @@ -63,9 +63,9 @@ const Navigation = ({ currentPage, navigation, onJump }) => { } Navigation.propTypes = { - currentPage: PropTypes.object.isRequired, + page: PropTypes.object.isRequired, navigation: PropTypes.array.isRequired, - onJump: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired } export default Navigation diff --git a/rdmo/projects/assets/js/interview/components/Overview.js b/rdmo/projects/assets/js/interview/components/Overview.js index 7f37f4aaf3..6b4b3d3bcd 100644 --- a/rdmo/projects/assets/js/interview/components/Overview.js +++ b/rdmo/projects/assets/js/interview/components/Overview.js @@ -3,10 +3,10 @@ import PropTypes from 'prop-types' import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' -const Overview = ({ project }) => { +const Overview = ({ overview }) => { const projectsUrl = `${baseUrl}/projects/` - const projectUrl = `${baseUrl}/projects/${project.id}` + const projectUrl = `${baseUrl}/projects/${overview.id}` return ( <> @@ -15,11 +15,11 @@ const Overview = ({ project }) => {
        • - {gettext('Project')}: {project.title} + {gettext('Project')}: {overview.title}
        • {/* TODO: get catalog title from catalog api */} - {gettext('Catalog')}: {project.catalog} + {gettext('Catalog')}: {overview.catalog.title}
        @@ -37,7 +37,7 @@ const Overview = ({ project }) => { } Overview.propTypes = { - project: PropTypes.object.isRequired + overview: PropTypes.object.isRequired } export default Overview diff --git a/rdmo/projects/assets/js/interview/containers/Main.js b/rdmo/projects/assets/js/interview/containers/Main.js index 9fd81b6531..42b19c39ec 100644 --- a/rdmo/projects/assets/js/interview/containers/Main.js +++ b/rdmo/projects/assets/js/interview/containers/Main.js @@ -6,16 +6,16 @@ import { connect } from 'react-redux' import Breadcrump from '../components/Breadcrump' import * as configActions from '../actions/configActions' -import * as pageActions from '../actions/pageActions' +import * as interviewActions from '../actions/interviewActions' // eslint-disable-next-line no-unused-vars -const Main = ({ config, page, configActions, pageActions }) => { - if (page.display) { +const Main = ({ config, interview, configActions, interviewActions }) => { + if (interview.show) { return (
        - pageActions.jump(pageId)} /> +

        - {page.page.title} + {interview.page.title}

        ) @@ -27,22 +27,22 @@ const Main = ({ config, page, configActions, pageActions }) => { Main.propTypes = { config: PropTypes.object.isRequired, - page: PropTypes.object.isRequired, + interview: PropTypes.object.isRequired, configActions: PropTypes.object.isRequired, - pageActions: PropTypes.object.isRequired + interviewActions: PropTypes.object.isRequired } function mapStateToProps(state) { return { config: state.config, - page: state.page + interview: state.interview } } function mapDispatchToProps(dispatch) { return { configActions: bindActionCreators(configActions, dispatch), - pageActions: bindActionCreators(pageActions, dispatch) + interviewActions: bindActionCreators(interviewActions, dispatch), } } diff --git a/rdmo/projects/assets/js/interview/containers/Sidebar.js b/rdmo/projects/assets/js/interview/containers/Sidebar.js index 4eb0c6535c..17b5538c3e 100644 --- a/rdmo/projects/assets/js/interview/containers/Sidebar.js +++ b/rdmo/projects/assets/js/interview/containers/Sidebar.js @@ -9,18 +9,17 @@ import Overview from '../components/Overview' import Progress from '../components/Progress' import * as configActions from '../actions/configActions' -import * as pageActions from '../actions/pageActions' +import * as interviewActions from '../actions/interviewActions' // eslint-disable-next-line no-unused-vars -const Sidebar = ({ config, page, configActions, pageActions }) => { - if (page.display) { +const Sidebar = ({ config, interview, configActions, interviewActions }) => { + if (interview.show) { return (
        - - - pageActions.prev()} onNext={() => pageActions.next()} /> - pageActions.jump(sectionId, pageId)} /> + + + +
        ) } @@ -31,22 +30,22 @@ const Sidebar = ({ config, page, configActions, pageActions }) => { Sidebar.propTypes = { config: PropTypes.object.isRequired, - page: PropTypes.object.isRequired, + interview: PropTypes.object.isRequired, configActions: PropTypes.object.isRequired, - pageActions: PropTypes.object.isRequired + interviewActions: PropTypes.object.isRequired } function mapStateToProps(state) { return { config: state.config, - page: state.page + interview: state.interview } } function mapDispatchToProps(dispatch) { return { configActions: bindActionCreators(configActions, dispatch), - pageActions: bindActionCreators(pageActions, dispatch) + interviewActions: bindActionCreators(interviewActions, dispatch), } } diff --git a/rdmo/projects/assets/js/interview/reducers/configReducer.js b/rdmo/projects/assets/js/interview/reducers/configReducer.js index c4b81b02e0..b598e95ac1 100644 --- a/rdmo/projects/assets/js/interview/reducers/configReducer.js +++ b/rdmo/projects/assets/js/interview/reducers/configReducer.js @@ -1,11 +1,8 @@ import set from 'lodash/set' -import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' - import { FETCH_CONFIG_SUCCESS, FETCH_CONFIG_ERROR, UPDATE_CONFIG } from '../actions/types' const initialState = { - baseUrl: baseUrl + '/interview/', settings: {} } diff --git a/rdmo/projects/assets/js/interview/reducers/interviewReducer.js b/rdmo/projects/assets/js/interview/reducers/interviewReducer.js new file mode 100644 index 0000000000..f4b8387f76 --- /dev/null +++ b/rdmo/projects/assets/js/interview/reducers/interviewReducer.js @@ -0,0 +1,34 @@ +import { + FETCH_NAVIGATION_ERROR, + FETCH_NAVIGATION_SUCCESS, + FETCH_OVERVIEW_ERROR, + FETCH_OVERVIEW_SUCCESS, + FETCH_PAGE_ERROR, + FETCH_PAGE_SUCCESS, + FETCH_PROGRESS_ERROR, + FETCH_PROGRESS_SUCCESS, +} from '../actions/types' + +const initialState = { + show: false +} + +export default function configReducer(state = initialState, action) { + switch(action.type) { + case FETCH_OVERVIEW_SUCCESS: + return { ...state, overview: action.overview } + case FETCH_PROGRESS_SUCCESS: + return { ...state, progress: action.progress } + case FETCH_NAVIGATION_SUCCESS: + return { ...state, navigation: action.navigation, show: true } + case FETCH_PAGE_SUCCESS: + return { ...state, page: action.page } + case FETCH_OVERVIEW_ERROR: + case FETCH_PROGRESS_ERROR: + case FETCH_NAVIGATION_ERROR: + case FETCH_PAGE_ERROR: + return { errors: action.errors } + default: + return state + } +} diff --git a/rdmo/projects/assets/js/interview/reducers/pageReducer.js b/rdmo/projects/assets/js/interview/reducers/pageReducer.js deleted file mode 100644 index 72bb0f110f..0000000000 --- a/rdmo/projects/assets/js/interview/reducers/pageReducer.js +++ /dev/null @@ -1,16 +0,0 @@ -import { FETCH_PAGE_SUCCESS, FETCH_PAGE_ERROR } from '../actions/types' - -const initialState = { - display: false -} - -export default function configReducer(state = initialState, action) { - switch(action.type) { - case FETCH_PAGE_SUCCESS: - return {...state, ...action.page, display: true} - case FETCH_PAGE_ERROR: - return {...state } - default: - return state - } -} diff --git a/rdmo/projects/assets/js/interview/reducers/rootReducer.js b/rdmo/projects/assets/js/interview/reducers/rootReducer.js deleted file mode 100644 index b4866f767f..0000000000 --- a/rdmo/projects/assets/js/interview/reducers/rootReducer.js +++ /dev/null @@ -1,11 +0,0 @@ -import { combineReducers } from 'redux' - -import configReducer from './configReducer' -import pageReducer from './pageReducer' - -const rootReducer = combineReducers({ - config: configReducer, - page: pageReducer -}) - -export default rootReducer diff --git a/rdmo/projects/assets/js/interview/store/configureStore.js b/rdmo/projects/assets/js/interview/store/configureStore.js index f530eae6d3..e917b0c252 100644 --- a/rdmo/projects/assets/js/interview/store/configureStore.js +++ b/rdmo/projects/assets/js/interview/store/configureStore.js @@ -1,12 +1,15 @@ -import { applyMiddleware, createStore } from 'redux' +import { applyMiddleware, createStore, combineReducers } from 'redux' import Cookies from 'js-cookie' import thunk from 'redux-thunk' import isEmpty from 'lodash/isEmpty' -import rootReducer from '../reducers/rootReducer' +import configReducer from '../reducers/configReducer' +import interviewReducer from '../reducers/interviewReducer' import * as configActions from '../actions/configActions' -import * as pageActions from '../actions/pageActions' +import * as interviewActions from '../actions/interviewActions' + +import { parseLocation } from '../utils/location' export default function configureStore() { const middlewares = [thunk] @@ -25,23 +28,33 @@ export default function configureStore() { middlewares.push(logger) } + const rootReducer = combineReducers({ + config: configReducer, + interview: interviewReducer + }) + const store = createStore( rootReducer, applyMiddleware(...middlewares) ) - const fetchConfig = () => store.dispatch(configActions.fetchConfig()) - - const fetchPage = () => store.dispatch(pageActions.fetchPage()) + const fetchPageFromLocation = () => { + const { pageId } = parseLocation() + store.dispatch(interviewActions.fetchPage(pageId)) + } // this event is triggered when the page first loads window.addEventListener('load', () => { - fetchConfig().then(() => fetchPage()) + Promise.all([ + store.dispatch(configActions.fetchConfig()), + store.dispatch(interviewActions.fetchOverview()), + store.dispatch(interviewActions.fetchProgress()) + ]).then(() => fetchPageFromLocation()) }) // this event is triggered when when the forward/back buttons are used window.addEventListener('popstate', () => { - + fetchPageFromLocation() }) return store diff --git a/rdmo/projects/assets/js/interview/utils/location.js b/rdmo/projects/assets/js/interview/utils/location.js new file mode 100644 index 0000000000..d8556ec235 --- /dev/null +++ b/rdmo/projects/assets/js/interview/utils/location.js @@ -0,0 +1,26 @@ +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' +import projectId from '../utils/projectId' + +const parseLocation = () => { + const pathname = window.location.pathname + + const m1 = pathname.match(/\/interview\/(?\d+)[/]*$/) + if (m1) { + return m1.groups + } + + return {} +} + +const updateLocation = (pageId) => { + const pathname = buildPath(pageId) + if (pathname != window.location.pathname) { + history.pushState(null, null, pathname) + } +} + +const buildPath = (pageId) => { + return `${baseUrl}/projects/${projectId}/interview/${pageId}/` +} + +export { parseLocation, updateLocation, buildPath } diff --git a/rdmo/projects/assets/js/interview/utils/projectId.js b/rdmo/projects/assets/js/interview/utils/projectId.js new file mode 100644 index 0000000000..4b642d4b1f --- /dev/null +++ b/rdmo/projects/assets/js/interview/utils/projectId.js @@ -0,0 +1,2 @@ +// take the baseurl from the of the django template +export default document.querySelector('meta[name="project"]').content.replace(/\/+$/, '') diff --git a/rdmo/projects/templates/projects/project_interview.html b/rdmo/projects/templates/projects/project_interview.html index 8c894b557d..c306464373 100644 --- a/rdmo/projects/templates/projects/project_interview.html +++ b/rdmo/projects/templates/projects/project_interview.html @@ -6,6 +6,10 @@ {% block vendor %} {% endblock %} +{% block head %} + +{% endblock %} + {% block css %} From c33032ff8c9fc37921a2b824a65e755edd100eb2 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 2 Apr 2024 16:10:26 +0200 Subject: [PATCH 048/160] Add TemplateAPI and help to sidebar in interview --- rdmo/core/settings.py | 7 ++++++- .../js/interview/actions/configActions.js | 5 +++-- .../assets/js/interview/components/Buttons.js | 9 +++++++-- .../js/interview/components/Navigation.js | 9 +++++++-- .../js/interview/components/Overview.js | 9 +++++++-- .../js/interview/components/Progress.js | 9 +++++++-- .../assets/js/interview/containers/Sidebar.js | 19 +++++++++++++++---- .../project_interview_buttons_help.html | 0 .../project_interview_navigation_help.html | 17 +++++++++++++++++ .../project_interview_overview_help.html | 0 .../project_interview_progress_help.html | 0 11 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 rdmo/projects/templates/projects/project_interview_buttons_help.html create mode 100644 rdmo/projects/templates/projects/project_interview_navigation_help.html create mode 100644 rdmo/projects/templates/projects/project_interview_overview_help.html create mode 100644 rdmo/projects/templates/projects/project_interview_progress_help.html diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py index 0e6add4dc8..ab08639c1c 100644 --- a/rdmo/core/settings.py +++ b/rdmo/core/settings.py @@ -222,7 +222,12 @@ 'PROJECT_TABLE_PAGE_SIZE' ] -TEMPLATES_API = [] +TEMPLATES_API = [ + 'projects/project_interview_buttons_help.html', + 'projects/project_interview_navigation_help.html', + 'projects/project_interview_overview_help.html', + 'projects/project_interview_progress_help.html', +] EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' DEFAULT_FROM_EMAIL = 'info@example.com' diff --git a/rdmo/projects/assets/js/interview/actions/configActions.js b/rdmo/projects/assets/js/interview/actions/configActions.js index 1e19b0f9c3..d2b12ca0af 100644 --- a/rdmo/projects/assets/js/interview/actions/configActions.js +++ b/rdmo/projects/assets/js/interview/actions/configActions.js @@ -5,8 +5,9 @@ import { FETCH_CONFIG_SUCCESS, FETCH_CONFIG_ERROR, UPDATE_CONFIG } from './types export function fetchConfig() { return (dispatch) => Promise.all([ CoreApi.fetchSettings(), - ]).then(([settings]) => dispatch(fetchConfigSuccess({ - settings + CoreApi.fetchTemplates(), + ]).then(([settings, templates]) => dispatch(fetchConfigSuccess({ + settings, templates }))) } diff --git a/rdmo/projects/assets/js/interview/components/Buttons.js b/rdmo/projects/assets/js/interview/components/Buttons.js index b2581adfb7..382c0114a8 100644 --- a/rdmo/projects/assets/js/interview/components/Buttons.js +++ b/rdmo/projects/assets/js/interview/components/Buttons.js @@ -1,9 +1,13 @@ import React from 'react' import PropTypes from 'prop-types' -const Buttons = ({ page, onClick }) => { +const Buttons = ({ page, help, onClick }) => { return ( <> +
        +
        @@ -27,6 +31,7 @@ const Buttons = ({ page, onClick }) => { Buttons.propTypes = { page: PropTypes.object.isRequired, + help: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired } diff --git a/rdmo/projects/assets/js/interview/components/Navigation.js b/rdmo/projects/assets/js/interview/components/Navigation.js index 6fba977089..43b6a5f8d0 100644 --- a/rdmo/projects/assets/js/interview/components/Navigation.js +++ b/rdmo/projects/assets/js/interview/components/Navigation.js @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' -const Navigation = ({ page, navigation, onClick }) => { +const Navigation = ({ page, navigation, help, onClick }) => { const handleClick = (event, pageId) => { event.preventDefault() @@ -13,6 +13,10 @@ const Navigation = ({ page, navigation, onClick }) => { <>

        {gettext('Navigation')}

        +
        +
          { navigation.map((s, sIndex) => ( @@ -33,7 +37,7 @@ const Navigation = ({ page, navigation, onClick }) => { { p.count > 0 && p.count == p.total && ( - + {' '} ) } @@ -65,6 +69,7 @@ const Navigation = ({ page, navigation, onClick }) => { Navigation.propTypes = { page: PropTypes.object.isRequired, navigation: PropTypes.array.isRequired, + help: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired } diff --git a/rdmo/projects/assets/js/interview/components/Overview.js b/rdmo/projects/assets/js/interview/components/Overview.js index 6b4b3d3bcd..c269095a66 100644 --- a/rdmo/projects/assets/js/interview/components/Overview.js +++ b/rdmo/projects/assets/js/interview/components/Overview.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' -const Overview = ({ overview }) => { +const Overview = ({ overview, help }) => { const projectsUrl = `${baseUrl}/projects/` const projectUrl = `${baseUrl}/projects/${overview.id}` @@ -12,6 +12,10 @@ const Overview = ({ overview }) => { <>

          {gettext('Overview')}

          +
          +
          • @@ -37,7 +41,8 @@ const Overview = ({ overview }) => { } Overview.propTypes = { - overview: PropTypes.object.isRequired + overview: PropTypes.object.isRequired, + help: PropTypes.string.isRequired } export default Overview diff --git a/rdmo/projects/assets/js/interview/components/Progress.js b/rdmo/projects/assets/js/interview/components/Progress.js index 59de5e33d2..d445d214fc 100644 --- a/rdmo/projects/assets/js/interview/components/Progress.js +++ b/rdmo/projects/assets/js/interview/components/Progress.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -const Progress = ({ progress }) => { +const Progress = ({ progress, help }) => { const low = progress.ratio <= 0.25 const width = progress.ratio * 100 const label = interpolate(gettext('%s of %s'), [progress.count, progress.total]) @@ -10,6 +10,10 @@ const Progress = ({ progress }) => { <>

            {gettext('Progress')}

            +
            +
            {low &&
            } @@ -24,7 +28,8 @@ const Progress = ({ progress }) => { } Progress.propTypes = { - progress: PropTypes.object.isRequired + progress: PropTypes.object.isRequired, + help: PropTypes.string.isRequired } export default Progress diff --git a/rdmo/projects/assets/js/interview/containers/Sidebar.js b/rdmo/projects/assets/js/interview/containers/Sidebar.js index 17b5538c3e..fc18172bdb 100644 --- a/rdmo/projects/assets/js/interview/containers/Sidebar.js +++ b/rdmo/projects/assets/js/interview/containers/Sidebar.js @@ -16,10 +16,21 @@ const Sidebar = ({ config, interview, configActions, interviewActions }) => { if (interview.show) { return (
            - - - - + + + +
            ) } diff --git a/rdmo/projects/templates/projects/project_interview_buttons_help.html b/rdmo/projects/templates/projects/project_interview_buttons_help.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rdmo/projects/templates/projects/project_interview_navigation_help.html b/rdmo/projects/templates/projects/project_interview_navigation_help.html new file mode 100644 index 0000000000..60abef29bf --- /dev/null +++ b/rdmo/projects/templates/projects/project_interview_navigation_help.html @@ -0,0 +1,17 @@ +{% load i18n %} + +{% if settings.PROJECT_QUESTIONS_AUTOSAVE %} +

            + {% trans 'Using the navigation will save your input.' %} +

            +{% else %} +

            + {% trans 'Please note that using the navigation will discard any unsaved input.' %} +

            +{% endif %} + +

            +{% blocktrans trimmed %} +Grey entries will be conditionally skipped based on your input. +{% endblocktrans %} +

            diff --git a/rdmo/projects/templates/projects/project_interview_overview_help.html b/rdmo/projects/templates/projects/project_interview_overview_help.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rdmo/projects/templates/projects/project_interview_progress_help.html b/rdmo/projects/templates/projects/project_interview_progress_help.html new file mode 100644 index 0000000000..e69de29bb2 From 3ebb76876b4fa1ec896dd2e653c80b209873ab7e Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 2 Apr 2024 16:55:03 +0200 Subject: [PATCH 049/160] Add Page, Question, QuestionSet and widgets components --- .../assets/js/interview/components/Page.js | 32 ++++++++++++++ .../js/interview/components/Question.js | 18 ++++++++ .../js/interview/components/QuestionSet.js | 18 ++++++++ .../assets/js/interview/components/Widget.js | 44 +++++++++++++++++++ .../components/widgets/Autocomplete.js | 18 ++++++++ .../interview/components/widgets/Checkbox.js | 18 ++++++++ .../js/interview/components/widgets/Date.js | 18 ++++++++ .../js/interview/components/widgets/File.js | 18 ++++++++ .../js/interview/components/widgets/Radio.js | 18 ++++++++ .../js/interview/components/widgets/Range.js | 18 ++++++++ .../js/interview/components/widgets/Select.js | 18 ++++++++ .../js/interview/components/widgets/Text.js | 18 ++++++++ .../interview/components/widgets/Textarea.js | 18 ++++++++ .../js/interview/components/widgets/YesNo.js | 18 ++++++++ .../assets/js/interview/containers/Main.js | 6 +-- 15 files changed, 295 insertions(+), 3 deletions(-) create mode 100644 rdmo/projects/assets/js/interview/components/Page.js create mode 100644 rdmo/projects/assets/js/interview/components/Question.js create mode 100644 rdmo/projects/assets/js/interview/components/QuestionSet.js create mode 100644 rdmo/projects/assets/js/interview/components/Widget.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Autocomplete.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Checkbox.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Date.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/File.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Radio.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Range.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Select.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Text.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/Textarea.js create mode 100644 rdmo/projects/assets/js/interview/components/widgets/YesNo.js diff --git a/rdmo/projects/assets/js/interview/components/Page.js b/rdmo/projects/assets/js/interview/components/Page.js new file mode 100644 index 0000000000..ea5f619dd1 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Page.js @@ -0,0 +1,32 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Question from '../components/Question' +import QuestionSet from '../components/Question' + +const Page = ({ page }) => { + return ( +
            +

            + {page.title} +

            + { + page.elements.map((element, elementIndex) => { + if (element.model == 'questions.questionset') { + return + } else { + return + } + }) + } +
            + ) +} + +Page.propTypes = { + page: PropTypes.object.isRequired +} + +export default Page diff --git a/rdmo/projects/assets/js/interview/components/Question.js b/rdmo/projects/assets/js/interview/components/Question.js new file mode 100644 index 0000000000..b9211de072 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Question.js @@ -0,0 +1,18 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Widget from './Widget' + +const Question = ({ question }) => { + return ( +
            + +
            + ) +} + +Question.propTypes = { + question: PropTypes.object.isRequired +} + +export default Question diff --git a/rdmo/projects/assets/js/interview/components/QuestionSet.js b/rdmo/projects/assets/js/interview/components/QuestionSet.js new file mode 100644 index 0000000000..132c9a9d84 --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/QuestionSet.js @@ -0,0 +1,18 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const QuestionSet = ({ questionset }) => { + console.log(questionset) + + return ( +
            + +
            + ) +} + +QuestionSet.propTypes = { + questionset: PropTypes.object.isRequired +} + +export default QuestionSet diff --git a/rdmo/projects/assets/js/interview/components/Widget.js b/rdmo/projects/assets/js/interview/components/Widget.js new file mode 100644 index 0000000000..bcc9f15cac --- /dev/null +++ b/rdmo/projects/assets/js/interview/components/Widget.js @@ -0,0 +1,44 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Autocomplete from './widgets/Autocomplete' +import Checkbox from './widgets/Checkbox' +import Date from './widgets/Date' +import File from './widgets/File' +import Radio from './widgets/Radio' +import Range from './widgets/Range' +import Select from './widgets/Select' +import Text from './widgets/Text' +import Textarea from './widgets/Textarea' +import YesNo from './widgets/YesNo' + +const Widget = ({ question }) => { + switch (question.widget_type) { + case 'autocomplete': + return + case 'checkbox': + return + case 'date': + return + case 'file': + return + case 'radio': + return + case 'range': + return + case 'select': + return

Up~WYpX2pC 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