From cd81063674a77ff5612e59ec79c310bb26f313e3 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 17 Aug 2022 11:42:44 -0500 Subject: [PATCH] Clean old document --- .gitignore | 1 + CHANGELOG.md | 4 + README.md | 2 +- VERSION | 1 + doc/content/es/application/_index.md | 38 +- docs/Makefile | 20 - docs/make.bat | 35 - docs/source/_static/images/install_01.png | Bin 52339 -> 0 bytes docs/source/_static/images/path_01.png | Bin 38339 -> 0 bytes docs/source/_static/images/path_02.png | Bin 18983 -> 0 bytes docs/source/_static/images/path_03.png | Bin 25667 -> 0 bytes docs/source/_static/images/tools_01.png | Bin 6575 -> 0 bytes docs/source/_static/images/tools_02.png | Bin 7093 -> 0 bytes docs/source/_static/images/tools_03.png | Bin 7041 -> 0 bytes docs/source/_static/images/tools_04.png | Bin 6524 -> 0 bytes docs/source/_static/images/tools_05.png | Bin 6832 -> 0 bytes docs/source/_static/images/tools_06.png | Bin 7456 -> 0 bytes docs/source/_static/images/tools_07.png | Bin 6590 -> 0 bytes docs/source/_static/images/tools_08.png | Bin 6318 -> 0 bytes docs/source/_static/images/tools_09.png | Bin 6930 -> 0 bytes docs/source/_static/images/tools_10.png | Bin 7762 -> 0 bytes docs/source/_static/images/tools_11.png | Bin 8078 -> 0 bytes docs/source/_static/images/tools_12.png | Bin 9571 -> 0 bytes docs/source/_static/images/tools_13.png | Bin 8752 -> 0 bytes docs/source/_static/images/tools_14.png | Bin 7191 -> 0 bytes docs/source/_static/images/tools_15.png | Bin 9114 -> 0 bytes docs/source/_static/images/tools_16.png | Bin 8098 -> 0 bytes docs/source/_static/images/tools_17.png | Bin 7467 -> 0 bytes docs/source/_static/images/tools_18.png | Bin 25404 -> 0 bytes docs/source/_static/images/tools_19.png | Bin 7623 -> 0 bytes docs/source/_static/images/tools_20.png | Bin 8617 -> 0 bytes docs/source/_static/images/tools_21.png | Bin 7607 -> 0 bytes docs/source/_static/images/tools_22.png | Bin 7366 -> 0 bytes docs/source/_static/images/tools_23.png | Bin 49069 -> 0 bytes docs/source/_static/images/tools_24.png | Bin 54237 -> 0 bytes docs/source/_static/images/toolsdebug_01.png | Bin 18454 -> 0 bytes docs/source/_static/images/toolsdebug_02.png | Bin 19985 -> 0 bytes docs/source/_static/images/toolsdebug_03.png | Bin 18498 -> 0 bytes docs/source/_static/images/toolsdebug_04.png | Bin 19375 -> 0 bytes docs/source/_static/images/toolsdebug_05.png | Bin 8107 -> 0 bytes docs/source/_static/images/toolsdebug_06.png | Bin 66504 -> 0 bytes docs/source/_static/images/toolsdebug_07.png | Bin 83119 -> 0 bytes docs/source/application.rst | 368 - docs/source/calc.rst | 18 - docs/source/calc_cells.rst | 151 - docs/source/calc_doc.rst | 122 - docs/source/calc_ranges.rst | 123 - docs/source/calc_sheets.rst | 438 - docs/source/conf.py | 58 - docs/source/documents.rst | 486 -- docs/source/email.rst | 109 - docs/source/index.rst | 42 - docs/source/install.rst | 48 - docs/source/paths.rst | 548 -- docs/source/tools.rst | 757 -- docs/source/tools_debug.rst | 216 - source/easymacro.py | 54 - source/easymacro/__init__.py | 3 + source/easymacro/easydoc.py | 5 + source/easymacro/easymain.py | 57 +- source/{ => easymacro}/zazplus/easyplus.py | 0 source/zazplus/__init__.py | 1 - source/zazplus/peewee.py | 7902 ------------------ 63 files changed, 107 insertions(+), 11500 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 VERSION delete mode 100644 docs/Makefile delete mode 100644 docs/make.bat delete mode 100644 docs/source/_static/images/install_01.png delete mode 100644 docs/source/_static/images/path_01.png delete mode 100644 docs/source/_static/images/path_02.png delete mode 100644 docs/source/_static/images/path_03.png delete mode 100644 docs/source/_static/images/tools_01.png delete mode 100644 docs/source/_static/images/tools_02.png delete mode 100644 docs/source/_static/images/tools_03.png delete mode 100644 docs/source/_static/images/tools_04.png delete mode 100644 docs/source/_static/images/tools_05.png delete mode 100644 docs/source/_static/images/tools_06.png delete mode 100644 docs/source/_static/images/tools_07.png delete mode 100644 docs/source/_static/images/tools_08.png delete mode 100644 docs/source/_static/images/tools_09.png delete mode 100644 docs/source/_static/images/tools_10.png delete mode 100644 docs/source/_static/images/tools_11.png delete mode 100644 docs/source/_static/images/tools_12.png delete mode 100644 docs/source/_static/images/tools_13.png delete mode 100644 docs/source/_static/images/tools_14.png delete mode 100644 docs/source/_static/images/tools_15.png delete mode 100644 docs/source/_static/images/tools_16.png delete mode 100644 docs/source/_static/images/tools_17.png delete mode 100644 docs/source/_static/images/tools_18.png delete mode 100644 docs/source/_static/images/tools_19.png delete mode 100644 docs/source/_static/images/tools_20.png delete mode 100644 docs/source/_static/images/tools_21.png delete mode 100644 docs/source/_static/images/tools_22.png delete mode 100644 docs/source/_static/images/tools_23.png delete mode 100644 docs/source/_static/images/tools_24.png delete mode 100644 docs/source/_static/images/toolsdebug_01.png delete mode 100644 docs/source/_static/images/toolsdebug_02.png delete mode 100644 docs/source/_static/images/toolsdebug_03.png delete mode 100644 docs/source/_static/images/toolsdebug_04.png delete mode 100644 docs/source/_static/images/toolsdebug_05.png delete mode 100644 docs/source/_static/images/toolsdebug_06.png delete mode 100644 docs/source/_static/images/toolsdebug_07.png delete mode 100644 docs/source/application.rst delete mode 100644 docs/source/calc.rst delete mode 100644 docs/source/calc_cells.rst delete mode 100644 docs/source/calc_doc.rst delete mode 100644 docs/source/calc_ranges.rst delete mode 100644 docs/source/calc_sheets.rst delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/documents.rst delete mode 100644 docs/source/email.rst delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/install.rst delete mode 100644 docs/source/paths.rst delete mode 100644 docs/source/tools.rst delete mode 100644 docs/source/tools_debug.rst rename source/{ => easymacro}/zazplus/easyplus.py (100%) delete mode 100644 source/zazplus/__init__.py delete mode 100644 source/zazplus/peewee.py diff --git a/.gitignore b/.gitignore index 090f9f8..b345227 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__ build/ *.bk *.lock +bk/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b391097 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +v 0.1.0 [17-Ago-2022] +--------------------- + - Tools refactorize and documented. + diff --git a/README.md b/README.md index d0f7507..f43dd6e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Rapid develop macros in LibreOffice with Python. #### but, don't make the mistake of many of *thinking only in gratis software* that so much damage has done to **Free Software**. -This library have a cost of maintenance of 1 euros every year. +This library have a cost of maintenance of 1 euro every year. In order of preferred. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.1.0 diff --git a/doc/content/es/application/_index.md b/doc/content/es/application/_index.md index fc08acb..7d9f2be 100644 --- a/doc/content/es/application/_index.md +++ b/doc/content/es/application/_index.md @@ -3,8 +3,44 @@ title = "LibreOffice" weight = 4 +++ -### create_instance +### fonts +Devolver todas las fuentes visibles en LibreOffice. Mire [FontDescriptor][1] ```python +fonts = app.fonts() +for f in fonts: + app.debug(f'Nombre: {f.Name} - Estilo: {f.StyleName}') ``` + + +### filters + +Devolver todos los filtros soportados en LibreOffice. Mire la [ayuda][2] y en [API FilterFactory][3] para más detalles. + +```python +filtros = app.filters() +for f in filtros: + info = f"Nombre UI: {f['UIName']} - Nombre: {f['Name']} - Tipo: {f['Type']}" + app.debug(info) +``` + + +### dispatch + +Ejecutar cualquier comando `UNO` de LibreOffice, mire la [lista de comandos][4] y [API dispatch][5]. + +Este método automáticamente agrega el prefijo necesario: `.uno:` + +```python +doc = app.active +comando = 'Gallery' +app.dispatch(doc, comando) +``` + + +[1]: https://api.libreoffice.org/docs/idl/ref/structcom_1_1sun_1_1star_1_1awt_1_1FontDescriptor.html +[2]: https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html +[3]: https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1FilterFactory.html +[4]: https://wiki.documentfoundation.org/Development/DispatchCommands +[5]: https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XDispatch.html#a42beb1ea2ddae35c076b6e65867025ea diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d0c3cbf..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 6fcf05b..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/source/_static/images/install_01.png b/docs/source/_static/images/install_01.png deleted file mode 100644 index 6395bb46356997dcdc324d976fcadfeee9b6fdb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52339 zcmdqJRan(g_ce+lAOa$xG>Aw^cY}nWbR%5?($XCQ(jna-B3%-jl#uS)bl0Z4*~I=9 zzW?`oo^x@&b1u%+@y5;Omusy#=a^%RMTnxj6xI{sCrC(0SRdX?C?g>~v_nFAkp37I zeB-rBtpomhX_?gJ@-A6|iTT@3DLwge>GaFlL6D9{^dlM5IhtIZ- z2guFB;2@^^gT(Dk3?0pFZCibo?G5A-zQUAR(&inzlRd@)5ra(Q(b#_fx4aB6>*ia6>-=-;OD+%W|_6MKB5AAi@`3|;(~Q3`8TeTfo` z^7Cs_VqbjO9fz2ZZza+n0jKS;<)DM69lg1R+OUvC;2Ihs-47NPh3s^6 zha>GD7E2Z@O#0McK7Q{RFZrN08mDD?YHCVVz~}t5tV6I-2Ny3RHYQHOVjE)=3gwu- zzd2<3WDpH5 zY3Y2-iX6U%s`~FFm&~sZsapDxSe0{gdi3)k5ESE{b5au1PZ z9BjMaHF^3&rJThYJWwYZ8k(CXM-&s8#Fa2MDva85v0%hw|L~XcM&P{9V|J?p)Y} z_W+${tF~nZna6p#>y`BQMi5T)>%2d{r~Q*;0&anuT~T~?a5iL*i}vYhw#5s%$48lF zhua&Xdk|x&Ocmf zNsEbvIW}56UyI_4>SW3BLqP!-7thYgzSlneTOFUv{zA5Ffii9jI^{w_cwYhgGunXR zcj{j6iq@N|EcR2)>uaWm`tNSB2h*C7K0VUG+8OWY>x7%x$at%q1VWaoSL_-Nt}aY(F<)Z^&nQ`x%` zTO!-M%sS5j{pT%C2XkMWgz5_?)abMWCC_$P4UZKhBm|Ad;c{Ra&;+zekYZx+)XWE% z`p34@#`(cYm(5#1rqihA)c4|lLXsNZM8hqdp>H~{43E&Z(rgsWd&jV5U-;~mLciwk z0ROH?m5Kl!MCx(+Onv(=i5D#TJzJFGV)_MOy%g92;e!9Tt zG3dzOj0+EEGq~-^`}gmcF1Mgnw)3Iid>GA!zKRz*W=5tye#_?K@+N^Lb*sLPBe%k0 zo@T;&Aru1PVt6s2mLnr0V|;S1t5fTke4S-Tm`bQJ2lc;e^vGXd+p16y3vTVp{-|WL zP~X;04^0v@Bz^MD&o=KyZ20zBXkEib?q;HB+KniE!0kVa1KaA=sEX)x)kignnS3Mzk_umEbQA!$`gmS!QsyA>pkUc&orQ#5JX0|L{ z3x>P44?nm?dW?>N{6lM8I*E|Tvc%zb2Exk5MoCTm?f37X?@v3m){l~tQ;aMu(qQ}% z$NJv#^76|?2R^S^FPkjXjFfRT$`;>7mkwKI20Z&V>9X2&JP@T)M}gbfPLY?TNcZ?D zdPhf3$cI&tp@APwKMl+%FevXhgb}WfOl0C$3Y$g363Slk@qH7~C>IBDGYg6@`R)%i1X@&?sEuT3TA3lk&E==JZWBB3_csR&{pHgmx)pJXCBS z=YrPL;Xj$v(S3}LMRocY8A*6^F>!*)^J??t2&o_L#=ek&Xj0}ca+)b#tcU=wPe??> zmT${qp;0C;>&bZW(Eo^ezu-i;j#psIF7Dg217ayOH1C`BqVTuOoU2i?X0%e?m!_o5 z@^#nVBo9Izi9+$jKCPVHQ5H3cd9CZz&#-$42oO({A^X}wB_)Ks`%@ycYf13iE0aE2 zS(l6-BUlYdU#zbe4w?6I%BS;TzrE&W`dv}|D&0|w%eJ!@vJ>Ky@z&rAE37YGDPk$- zk88Avmt1%R$DOUwv6h$q;$;7Y(2f%kV!`8(6^ZFKWi(gK0Vyqw?C^-WbW*ryzElj~ zJ1|f(i7+)^n1qDL*vcx+gdzty8ILxg+b5$Vw9ux8d4kUNP>3-g4p=NBdDeMuy(UuGOz8EeqdkVk^?nmp~xtfnjYrP$vvLZS* zRi)CcvwO#(KRhC0;bR`(Q2*HJVzWV5ZT;vkL!pS3zJxdETZ;Yj5vet+wUD$Vp4KqD`2&`zrG|tjiD%;)ZbUxjx zj$gpoz`$3zU=3cP%~`0=qw(({{QM49K>-NS_YQ2d?#!RXUJN%rt|EFgkKIG#lAt#~ z_0ne>j0XYycyMSkIXQWGcP;qb#meMHgoY+E{rah5gS(noEBSBdK6Ru*wZhnHK>p*VXZvNXHwz&CIYUEA5R0Wf5_`<#AuzJNh(SpOK5+oIC;gyA}jmG;f!DOLOj^#j+7`Y<2bUG`(=-$PKIzD!j4cK@3vl;|t}fmr_^ez2!x zW^VdXbpJlV2)gW=@@RZ&L9dKn$f4^Udc>-d4sLmfdF^b9k)ee|ypj4PZ?ekVU(B|L zPZ@^v>)Z1cx{mwedN^&SUP2u!*ZWOwbD8>6gd_O5ERlXYw@I1~BzKiEkpL9uqpgOz zw6vUUwNM@5+i>w-P6l9|m^cQNz&kGwV@u1TXklUD47ad^FDq;GNLrUy?Cxua{fV@% z4Gc{Kzl#3tx|O-p8H_RMtCZz{HP{|mPDt$35C8tcZ9Cfu3KA~yi@@k;O5uft(}UR{ zeu%}oRJ;SMfx>5{eT##1s!nbP{$t6&9hQVZ+aNm4?R+&ixjrJ(gbLb^3^2Uo5C-yUZg{ z^?j~|R%v8E&G*7;c?FP(62A_m33PQ)1&%aYnyJD26GXh=n6$J~bMp{1d0TCI3JU3~ z%g>Ao@*fP(|DaTzp0#z(Xj$rk)Uk5qaCAzSTYYo8(0FOk-o^Ow&l=+0GalH6KHWa7 zBL>BRjf;(ba~lL&H<}x9yO8U--(6psoiK0UHnq-Y)ht5igxu+M4o=pVkr~V`_ILT( zxsRiaV|g8!;ugZn6on07|KNc{D?o9sivmJxNm0ssvN^@yCtg)OwlOBA&3#$NYwHmDJ5mJ@EgU+ z3+7jBY&Z@MCpU$rO<^GsFz?TFx7X*2JDwV%I;mp^F@o%`>L4FG`X*e6qBr&84aP5PBUy45`d#3bE4NPfdHPwq8?HZ$T)^Qu)1T&QiH( zX=o&kbrF3fl47QP|zcFaMx%3r)47>BzcL{e8za1VM zR*z0ch$BvPG$w^m;LmrVqjkm}RwdR*@1>=U4u_Y2#mYyO>Xuhk86dLS?%%&Z`AP(Y zDeBw9+iO>RhCnColVgkV{J|b*9y%6Awo}*(UOwK#lW@&TZfn`DYU>BT%OT6>djiCL z5Z&s4@H&%BFTM*JF1epM@`^sywnQA2_ zpJ(KQ>ApztGq|Ls7buwfddxEUVk-RPkVvCr|G z%>Ws}FM8+Y{&l)&KkqZyNqA1d_Ffu+ld|z=gSXI7@+r-fqn)e8)juO4NK z!A#_q+hIk}mt|Ue>FEk%Hc?1pG@B9<5kFL{akkzbE6tHMv$f1~s^j*+CS98Q7RH#u zlPdlE&1bpn9q&J-(y&la@K+B5Id-PadGkI<)UlPYQt~9Boome+Oc+y ze!PhOTDUOiSgaC**u!?;U@mDYFhV(Nv3T1o{83BG{$|WPqDmYMYwV-*Y5Rxm$)fBh zxO(Ovn}r`->=!UcH@Zek+uKW5pRsYXp|-Tn$xiBaPgIjN^M?gZ*btfM5c`+9jctzH1JalAKIL9ZEp^no-p_Ju5n^vtsx+>;6JR*PVY5*8~wEVLo%1n>+rh z=%v3^4aGUT!QtuYXw7zVJq2+B%;EIy#jUGKQNqCe(&|#k%yl|hmynROUtO0A^kRK) z2?s?i`gjE;UEq_Kcw4HT56zr!lh?-@L%i5L`L>Y-VQ6%B+CG#aLHz}ig~RKEM~|N2 z5#%Kd_O^;y+vv;tGt){*NqX`IU#Cq?@SZ$i8L`Q@=D^%%E_@RZgL-*8yd<_ zv*#r7djILHpEQ2Nf{pFG_~)I(r`I;6rO62{0|?Yy8X7lv@OQv0S|MZTUaZP>2no?^ z=W+%`k>-K7Bo%fiMf32mm>BjvPgO4XbTY9wR;Z`Dqniic94W!LhexH2*X&p;_Vo&y z$qfcL8_asD+UlT6CG=-v_@<{bp`)XN>}yVD9v(JCSnk-nvfLPmiaJ)L67&St2d#GC zkx%1i5>0z1hHuaJWaWI`Q)~+Qy0dD?TR4H6I3dZpK&O3d6kPNU$6B!ZEBj348yS-v6O#oh-XGZ_Dv+W z>DZxN&SFJTOM^?-d=H1&nDD_|L*nLUSJmO!I6cCHN$VL7P7hp8yFyk2B2Dd?%5Bd~6dhPD+ zR`d(NHns#GV|2A;6Y|*38$l=bs?5jP`<9lR_GTd_7k9Te{4V5QMMc3PLZhNWF4a5f zf({S(*GDv9?Qf42cJ%W(933D2&`D+| zHYX1Va#){p3&h;b+{&L~;V`p1JX8`U9L~)0N3*AW=_^VR`Qw)YdZ9*!&O+?Mo> z?c7p#Ii6~%>emcij^_TPRIgroz#R!waD>uBbDho5`)` z?QQ~E&k|2xHE+jIg|LkNX7#F(MEgey9H;7urseq)DXcD*xG+n0yjC1&tN&5-k2*L~ z2WO5SS5R}weOQBTOw)Q}yvn5ho|5}3JXJ^jIe6lBpD=KGm|CYv-}g1Q=Q7LXlbY*k*+EBYs_`>qg66$_{ zL>CTOY7)iS$aLjK&m+msL+`zxC|cP6X2b7?%QKBWC@K#LUgWh%cNBbc_i$V>bUIb3 zF5l$qg!uive!g5=68pq2bFHzmeVhM~BqA(QZcW+XHTdG;D8{d+_XGS4g3cr!d3fp9@YZ_*W~KQ}*M(EP7D>6|TNC+t%#GIh?mxvUxy)$q?6xP66Q1UWXMg*X zBYJ;Zgl=7EfcyBDbxE*v$)7y>VfsNM{kS7%Q^e1ik1jMKZ=bb5_X9X!LZJDcs%b~i z){zgwv%JueyoK=Jdn!MXV{reJYIesrPw^rxA$M&m0*$nuxb>GaHPK=PuRYN}A_(E+ zW-oUfbWWYGG#3b(&u7o>;`Xt64b03_cI+v-Xv)vmtjUE#%(i@cS)`U;|3}|E8m?^8PB=ZQ5H^jFv-t2gF|}IU{pu+cdqmpCW;<;+@qpu=>%`I~VXP zP8C=G*Ab_12>67QlIZZMqh)67^tWVIH=V-2rIz0p6wNDVF8w%4Zdv*xDWyV8aHtHW zAPo_TgZLjZCb}&vQ9c)$xe~cG6Ck{SNty1>11AKcE*YBn1*NafP66a{KlC2#`_y0+ z0DA7jztH=C{Ln7&^1me5&+pMLnvKghIWpmJ$Kn}wAf0(i#~BP?dll#u7-d*n?gd8l zr*K5+YICm`*k+o+)*=4~5^7s#aN1!bx$@A3baxk^l=@CMsOA7BB*-L|fmTa8qHvt( zY8h>6X2w+8SymR)r}QS(@{Z^66U^3$!N_g3LRPD8gS7PYih*XMGh!oSqpQ!CLHq{_ zddXa7%sV{Rh7+geV+ER2i#0p|2;Av4L>gaT7#JDF9L##CnC>mfzeNHh05qj*Tsqv@rT^m5m*xAl>?tl0@F}MlSUZIN zyAvC~WUU>qnsn+tzeO7ht9g~`W(N+!!seo1GUEZzo&_{jx_D_Z@wO>Y(Ay*<3~#0s zwx&wc2VnpWAGM8TnnMezv34ehx`;QTPEQ>J!wEyuOPJ1f# zXcSW3gI-iK!R}ff$${Wz@Jc4pH=N}%^{&o7zI?U0bACQOW4<2uIoZIVu1Br=-Wvzg zftDV&6EjTIpa9n0?2)P2X{8!@rW78_&XU=hX^1Ta0O_C3j&lH%GfffUW{!k0XpA&E z(2_+-FWB4J{aqM*N@7{`aQbdGMpxjytSl;6inoVv_6w>9$39*QB%KLe)K_!p_6=Ci zLN5qA+S`X+4xfcbgqttsa!Gb}rU`nb9C)Wmf8In6d`g~Vas?+{y}Wd7x;ytMy;}Ss z+E`y@2~Ao1^}1B&WTRzSJQ>xlo;;Q&f>^nIK+ci~g8(5aYlR81Q12QYjhU)-U1!m2 z?a%b-wMXb(8NBs*qfzV|QUDjGkC&dXnQCvP_5mKTcP;c+-rP*)<|#0gLg^bHBfCJ2VS75}qzU_D*l`mBb?66tquB zNa)O>>dODvJ4m2uZ)4wa!ny7XT>nxwf>(AntbW?~_ z@_u{9uj_Y6=fw1=HL|gJ`gRo+>vAp3?xxO&+E|1rc8eP2{- zJ)_evO_PUhJM5pCo7E?z&Q|9gu%%pF8^xJR-@zSlCRqIMyc^w*Z{rFWwaa5Jv>?Ae zDqYCdWDT)p2=DMb+@CkTv*n=I$PJ&Vud1q&J=t=X1>`8e%u-Z7_R>!(H<*6plu>X` zOuUs;JRkpMTL;jgNnhMx#RAejwI;u(Mcg-OJ=dRxf)=xd-%;pC^8WY@>;<3F*#=0&&|{i=;bJctbDKIoGnT&fLRx6h@fd;EE%% zm|KYS6hO?kTv!ITxpJB|;*-Xt;GWmmWTuzj{}MkS{cfTdGiz+WG;9dq@zzY8zlG*% z;8{7~aIZ_}HP;7vv-9a*Aj;!P(*;JGZ7E6~kbXL~E(;3{H9e{@aon29_wMj@Ijvyr4{w{nS zB%3(`Sre&0qxt*v34xKJO=p%+!`SFzty?Tv!-YLy29VAy#*N0h4T&8bl~q)(96A7){US2(TjFtt6x#OmKx zQ!XYZHeacPIMb6;dGEM8r%z+5-V2S#W`0FUl{50`)3FkjFhhT|f^=kS2dXo^AUDy> z`t@IW^;P~F4+4`5H1}QJ_tg!>I_HX~jxx+!RtQLLZEZ{=UdB}y_#cw$o$I)nUCw-RktB%2H=JioJS=_i7<4)cg3aC=E{Z4#aL>9ssIo1GmJ z&=P;D8pT1!6DXpqG6P8E*G%#)p~ z3Gzo9F8)B}e6Tol8L}9Ykx?ogo2$xh)Sp+ZSCiomu{=3CT;}EHzmGW@&x=OMWZ-Qe z1O$9(DYNJ0-xk@v+l^k6pV<@+x1Dn7k)j~J!2y?Uos7U+@pfom*Qqx#zFR5^NIAJ@ zEE6kwzj$SXNx`1v?zHpU zWY&4cd28@@l%%nVc?amvMoXP6BQphi@>ZK($rY%=79nOV^eoDs7pt+1B_n@;?6Erq zNiC!C%5#3op1s4@j{zU!YTk}NwU^)#eB}o<8?p!b4j?f2-pI_>4TU-9%A}6crVHag zK_P!PU*~#N(OGXclz{`{4<{Nip+D=Q4WbeEMQC0k!TS38uiRXFz)|;Ul;T`hV0)&Q zdId9gt*!6P&i!!;v(Z}5Q!mj;o~q^D4+=D`OYfh=4CVOs%_F>|BtmGdl6WyAW4=Zn zH_K2!Kba(t3p0Xpb{E%?(!8c z)+SdHFk8$`*8=Vs;>I%5dwUF3IJ6v%1H=2N0RiyFdhhto+fM4V=(fPo8jT^V6BF7u zZ=Mhk5R~lbMaT-dAxv$oOO9fr#?o8fw7kz(&wF7MvSvLT*?Gy z(Q3Ln-CX4E$2mcMY%E^$V0stC@(yr9=)Sg{J_Sm8N*AyCbq@s$vB_7I7*FbC$~Ntv zp7=F64Me#&5>vy0=BL^RCW7hKlZeZRP+q=%ajRf&ZsVN*G)HbLR$gD1-}w`GDcRI3 zhFee;1_u*%cx(a1bP)GOGv+rMwyHVgU$o&wEAjI2e_5a7^Uh!k3l4t&a@Auo+tN&! zTo{vzDqFTDJA%3E(`s(XM@`Ln-IR-|zz~;0=m6n?|pvkewb)IoXON7mzm! zg$veJAxNKVaC7;z7 zA_{l%PBoe*rgBq&w(Oy&Pipd1Z5vso1q2wg`imF*wtWq?i8C8BT$aC2%bJ1BNagnB z{`X*X?i-Dcaxk`;l|S4t=r8Sy3)u=R`LcMh;O*VyFi*~=8BZp;}%9)XRGy16^Ly1L`S zlZATeOtaO-Ho4w>h3XO8NCCo+RZ#3^RK59DE?x@C=Dn0pbV$;#D75q*D^l_gR4vg# z*U-=?W@JK-3jVYKs6?%r3}A_QF_2yYz4_Tc=w&mTTxu;n>Bu(%agciTib}K58#%Sc z2ASPk@jesd<;fS==pgMaTI)uEWzI=Y-*dxlOQ|1DBo|+(791633>p`Za~^njc%c6I zVX(7TZ$1$nG zm&|OG(HlqgL${+mw+(MZ;3m-*YnY!_hNF#v=75Qej2v1|kR`h{TCBsZzQ@u6(sA+p z?+^?E=FuPCLPkbLwVr3hv9xmiFMJV=rpg_1&bgm8E4HpbV`vYlv$SeY!tteq>$G zj-JE7G`h_l0OKeCVD|r3DjbLF@5Vp7>39y3hwts}b=*E1@V1`~gcSM&2|do!&h)m} z2_v|8y?N)AUXy(v8+sRguY9`GYGrTOP1wyM$ydgfk&6)?C?ehhO2&_y#jfn}8MX&U zV)KxAosaQNb7?q>%NDU7*1vZ<@*|+9*P0|s1+s4+SM%BC1d1gCgY({eVv)U0S{kTp zuQmJbgdSrLyDm#NFX!_1(gwF9 zQ%6D=9F!o?<8-vn<_x+WAnHGFX)HC3*anq;@VN9;!%>I^)Lfuzsua09mAJGazit$? z<@0*$WLLH#A?z+;p!i+y>Q7@R9_YFD1RhM&4vOB7&w1Y~#QSH7GEAOce0In9;1X0_ z^24>F;t|?oCt~G4-__;hsJI@jpkTMQ9v+`|pIC3V_V?ifVUS^1$=tZji2^)507K9Q4<5+~ zQh8wTpi^#_+*T)uyCcI<6?=X5lGJNJ9Zd;p2 zv4U>!IDiE==n$!0wK`j)?VTMsxWu{9-1Kbd3=Bn96e>T5*!Udw1+iP(wq`zD(~-8E zBvO5ua2FK3a!Q|pyvtH#wLBMWJa)3mWFv51Pvg6axzml;xUJ~c$8Cox_pLYG-{ORT z#cp}!T?E=9F$oFq#QlJ9j7ep~&+e57AdwX@EdmWbq^GCq^khJ(?mtRI+OI^sjK#QI zReRdE*ZOfl(cMr|jhi9;z1s`T%_(DXcCKdBJEtAW6wzR6#(UP1mEE;DRa&BDP;5#= zF(956ool_ZUc>`=Fj1b2m7Cl2?q`R^$!#Y?8`p5c!!UfjF%|0&=Iz((wb_{VG3G^pKLt+?d<{fCVjsVOO$^Eh3o*cVKYDT zar@}43TUg`%YomgQ|>0AG@W0u;urQEkIg-Wzi=?mFzfQfbUiV-lGpW;jskPD>?~f$ z<>ABoCRZ9B_ro1hh;Qd4o?P0F=){U76%d6)=^! zQj{s$^Z2>L=Ir>z;Bpu{iNlAoP0B}XH4uxHmDQkYaK62>^Qfnb!laJOt0@Wu%6+_u zqn-~Pcg71maCtzdt$woHRuA87%c6tES!(gRQxL4O-~KQ@X%x@xiD};55+p3I!1STlCPoj<%sh$u`EF}2%YS=+I_=lL`Q_-#R%m8? z68MlX`cTl@TU6s0tANYVt89^LziE!Vof{*=qkTetdwkTuC*GMH4L^!vsDSONbF^9g zw{4fYo70ql?4ZivJx7=8zyr(*bbT%(lJDL@o3ydLli4-*<|kM7h%N?ROi?sDEi*Q$fcHZ{8d#{7q<9$}4FZk=S)){M12je`y78oS6vUvY?c);uSzQx^ z%>i8+Y|8q%=TU-D|3>VO3gFCgs;W4jk_wB(N@AV4kCeN*fb^a%yQRzsUmfx*m5u~P zMD08tn_xfc4SF-+B-d=T5%TglAG=cCPQ;^8t_fjD_t-vX6o?i8*03xaJpFC%BN%9* zP;}D~`1c9WY$$zWx{`3*AwgmpRFxJW{!;S6-id0wvn?nn;LO)gtS;fCc*L|oW}jg{ z*gEQ`L>08dc`-RL5xAJEpyI_H-9Wn-sw^yQ(KX+Bz9($7(JZ^(4jcW|BVxbZ&v$M$ z|LZLGKPK8griSKR%0DA@;9#Ai=%U<9J~wDRY5&=6B=#QcG6LTO|Nrkptxj-Q7|Z4x zAT-;3tIMS8cOqD6Zpr__a9GOcvxS>2OxDMuLIbTe^p}MWq;MpjrB<_A!a0HE`{;#b z5(g+GnlxqT1h~kfsl*VgpT+pAtc(ERL z$}F1qbPu>~Ur)jo(H|SYQXqh5N8#X50ZVbP8(XAhVuE|N0;3gp4}m5@-cW7T{&zty zPjH&d|7I{V9T+0-Ll!U!A6z9~4-Q6-m8gY@-Yx<`LX-+LH38gwOeec_C*fB{q~fSp z2HhYA%2z4M)tdRUi3o5d0F9(LGcz;b-wlne)rQqZ zJ{TFXBl#~J1ZmhQK%8r407bWPVFVO52KcEPF>v_FPj+&Q+q8_F|k)F z2p*2E>kO3{c*w6`uf3Dt9M*se2Cfg=M)~^Q17T*~*8zqU5uFQzk@Zd%BY!kG?yVK2 zUe~-JClw{Kbc~KFTQ2;+kTVKT>$boUCEgDa2>BnjL*yvBSn1T%)DMUAMTPGDa1Kp; zCj?-JlzVRi^FVlk%Eu;)_z6d-*{x(tqX)1K(!hG-l(Z88`(AV$FHL>#w1T$zUo{W3 z-n8SEa^-rcXWJO0-w*3kznWxn3Ae$WOeHOnB3DttONJOSshkomp6dDY(xZLEGLSzutZ;^_qtILH@&+ zx@x5#zanl=srp_p{Sdu%2Y!eMPT<0>KnxoOViOe~wLQsq8s?)%tZhL9L_E8LC@@uv ze1K^6S+R_~;e3}`m{PRt);)349`l%^xzz6<=!YU5o!Y3BwOeDolOi3yp!=zjuY-u7c)g zczD?f2%qMGT({Y$#4u*i-8!XS#^kC#{B7#h=?t7-ISDogU;Xbd^Hn^^sqmmkzQ2D= zw(Qnwv=#?zd$Nyx0C=C-c(`(MGBfo|cC_xw@$!I6@R##I3h~ZO3O6Ms8#-W(`E5@| zVGN!EZcpZ~n-pRb4n}e`^u3eMiaPnU8Vsp`3z!CeWZaa=9$%f_z-F-7d}1*gC!K(3 z3>9sY9Ia9#;Xm6Ph%<+NaCa-#ud_R$S*7)snPr}bRHNxeimKbE>Q8d7Z)wJXl^sbc zl9jLzk4XKMm!|?Wn(>Ocs*wJ*U;S}$__?yFgTCHghji+y2iA87lZ*Ml86DjH9s*-f zFS{>b>Lt2))q+5AgAb%sn%+vjt<2r2aNxR^PO*S&J}Ise>8`2@9h(G zB^(4g)RvI+C}7r}lJm8)aQI|vK`cI|q~hU`^Z^^D`Se`kdecA!%cJ-1R~qK75|92; zUX)i?bON_lH8;2W!D^~ltJu-$aqHY%8sJ*?g92~~2oyqaJMP(kr>p2FawVYi?Yx(< zW5HG<*4>+_OpGI-ud+<--;3mn9a)G2J`PdO;fOJv)-Sqrf$FXa z{#DnUyu6d?#ML_cJ$^tP{*cK#2SRNC*j~WKp@PUFydLLq+?k8UM#JuQ^618{uPz6! zRHarAED^a>;B)G7+#1gC_4s;o2py`jJt0>sx*=(YNu_pwNcOq8A^jy{JO62pyT)Y6%!BS7KR>?@($YU2=`&@af9Uz{w_2hVFaG%^g!Yux@$fC=>}nc; zuJj#XEHoK{L6uY&!~ctS*gf6^pdp^s=3j`VEXI#jN#(|pCp&3wgd{{K9kiL7I)g>c z5+d+5j&b&HVxlr4`jQcZfw3wRE`BD|uh^f^N}&ycoe@JErZ_k_1%)0_rRi6$m#pF8 z_6uV_fByVpXE##6KTc*}rr+B)2<|fWQGKlOG0>*vr~HFl@f|d@H5#SWn(pk2XDS-e zo_^VHefMG@RW9er^NP8JKl*0M*;;Dj8*^1bH$N;%fT_}WIZa=)b`5*IU%xx;3gf}0 z=P6yi)7CF_Q|~HtuRhFLkHqH5QseXREwD3SV{=NiO!=Nbf&g;0((H2a&j-LV?25Q1 z0g5hvzh4M+Uw}~qWK=0c(8EIjj{O|*UoXJ+cmdYid45Q~N<+egquYq-gzbVDu+86; zf63TBc9@hW1H(Q+=rlgL<8t7#KlODnkBe%^lEMnn!!@eRqJ~( zO^X^BK|BE3w6EdStoBoi@bm401R9ZR5y~eqkL<2m1_tEz9QIPUfCE)OARrL7DK*>I z=1=L5R$(xLyK7}NU5P+yzB?c&KC87X{y$T)>Dg}5NFyU7pe~=x{`uy~X3D8ns7@)& z90{z#74Gw>yL)>?-+LaJ=>B;xH{du5FQTxfTAky9^|JVU0-i6 z(qKmO+npB!XETA^V9=kE@{5%ab8)U?J0HxkO^VJHk!b4?4VPi>a9gim7C;MM%7Y+a zKHK-dnr35VzHU=Q%gWyty;(zjgt zU1yN!`rSyBmIA05FKG29Z*PGia^onL774Wb#IvlNqq}nlL4hV$q<@RoehF<>DAWyP z>XOV>nUDZAWhiPGB z8Sx9r>*@oTn{E{w2S>KV(MmwTx59+2YqAi}(_r*PZw0VGPwN@Z&&*n}fa~6ggqzK6 zo0D{JPmL=5zXQwg8vGT3-&MUyo0g`gKg+%M{obWDxGGs|c07S;visO1z~G>f1!L`S zvCv5BVgz8XAkdiLhF-b@#N+o_6v*^^O&t9lJ;|vx2jA0T{0c(gO(Orp`D!K1mw&9V z;_Fi{{-seO|jS^dk)a5UeT^x=jYTE&MmHXDAIu34mzbD7(3bW%}Xz4mUr zu^Vz5Jn_tQ$T;4s8{#t~8_-StvNv<^1_m~T@;a?Ef(p>mGW`8sgLAhb=H)l|{JA^% zH>(wc#>#0jtEv3;L*Mn%Qbz4%aZgV{5HcNeb2`=u+qylB`)g~TVsP;ss9zw7izA;t zxoK!(VGyAz(`z&u9or%#BxbejbUZy>xXWm;(G^&|KH+ zG{T}991!pbroowv{uG_^7?^i=cgn3dY=oU%@@Aye;;$Faw{BSUbD1xhG9rRt>SbE- z!?Ah6p^-`rdkD1~2H>2ibh2#r&lW;Me)w3(EoHq_PW7A&1G96kKU|CJPS-zar0%^s z-BgtcgOJExZ$1uU!90aK`$DU0BQd_bVr6h%Ky&lm`KOCLjC#_{5keVxc^c+@N@s{= z5t)XfLKGO7-&b(wySr2Z2K#C9li)u**15UK796W7QU48e) z+BkP3_seoCFW=b4=`?Gh+I8@!Z(?qFjwiVhnzf(k^M(TLw)-`8(nvlrJm?ASUt!kH z#cb9`P-z$`(c#a9gtkKLjA7imK9VspF-h!RG#3YpU1nQReD;-JqoZ+H^g7M7m}$Kc z=tsgmRFVs^fIE!=+stzMaNf*Dp`jGT-!3BVR%Wj-HaCyZ!#0Mp{p8%5k_Dnb3QnJe zp1S%0$j5Cn?f3Po@Y(jnhyTUhTL5L5rGj#67Wsy@C{S10A>=1xk|%$Ti9UO5EM(N`82^p9_(G;)L7CGrgJ1P!U`r@d?xDz~ z<0HkysgnRgg4UZiZ(ts7CAN(BlwVw6KCB6jWP9G>?y(*2NqUw>6Yx~2P_KB^*3!B` zcV9v@mj3GmcZH^rR{ikq;_>Xl^P>F8j?0gHH|}l^ZzW<;%6RL?OK5a?OJ=EF-i2+g ztuR~5<5S!@cV2$}uf#awRAI%PwaprK2QF_y*R!8<=9%bAcSX;tcjH9w-POiHY? zI2-#aE6_Rpeh}txO6Sz35XEBiQbHog`4nwyZFth3ct0|KZM4r6_Oy`Ovym6=MxKEL z{Dg;cl}_7VR8J2iyBj@us;pd{UQPe<$dIm}P_|v08}8NZ%T|t7E-@|87a5p{Wz%}$ z3Y2-^V0|;t;eM2%RB#Q*K<(7-Xu~gKA^a+Bg|9g)5G1_5nUGj$IO++RvaOkUk*k43 zvnK((N7JLjEhqU56ju8*D}A!P0s#@H=T{HbMmy!D)4#1*T3XLH%}*>XFLx)rY*e3o zxnh^2w*Cl}l-*bCct;_O+NYr4YYSDY1>d9^H=EfK-Pd&I*WrOAkVNqLojEvEU|ORz zT$uX}L1ji8_KMcrkJ}x0+GwcPFjfr&F(gm(P;I2xM*d9D5@2@G2l;IO}$ ze{d?{eJ1dQ?K${`vdtamv0E)4`%uYcJr%*dsJ*|5ouycT3Kb|Tqoeeu2dqv!>r~oh z+^6SI5u$xjQV?QmD4Q!65EpNwJ)TRbKQi=s-cVL-?+(_~YHqdGrVDQ%GV<<&4YG#k z)IYLSe4b%8O6~^aK3pC6-rlg)Dw7*#9=p81F%i&{nl)5pOS|ea>|GX#Z)0u1sIl}e z^f0R0_`E%e<^A@Vz0pX1fI5pwBQz9*nY4pn%`EJ4_f+SE38-}ODId)1KrF$orZ`&= zllL`E%VmpKIE?yduA!4+zQzq$(59CQbQKhpdg@a#K+5FkL|M2|9!QUT>X4;e^~Jj8 zLRe_&na$>~Ah0tT2a?!4@pR(GL@OK=`7^408Ge05CjDhr>{r7*J19@1Dp;oB7WaKu zR9(zt+ilHos(FWzIgr(m|LS&22utF^iqj_V^Cj4yh()Z!iNC zkJ!=XoV&zc;rG&2>L_}nxzK(=f&1`;?p0HLLT+xZgef z1wUM6%L~h}-NEW^H9scb9MT(THJIUTDf@^CNw>Pq1YVtm1q4laY^ht*8~wr^y-d)= z2x0AZ|E=pUCMwvH^v5sm?IiT&FQ)hZf4?Zb{7`f0auII?!BThhkvI3lKi-zEPMMr~ zZ%^SlS!~=i+#m4d@-*J!GAXrHZ@oLX_x)nXC{t*wq49heaITD|(;7U>JpmHsR+>H~ z5{;wk)vprYR_>PW{2GGPMsN+b!{n7YS%BDEt>MQh#?f5FZmFr{4Zb)HS>F29`c$l9 zrw%M7n`4RUxp7c_q^b4po3-QG`Ki@vFDV4Ea5^tHVjDtm8^eHTKa+rU1gel4p!+JX zBr`f)b7{Pa5Q2TJ^6+io-_eo5sEY@Nqj;O;kmZBR^G#aekf-92404-HIhAz9K-SN> zeyP_7S(x8 zKZX>1vFMY1v!APS+E1;`T~Em&M*x6os<6BNz}tFb6kT!t-^v)fM29`eLtXUbvX*u;4S zkxDld-{FU_xs9GV=UlZvDT1%iljjA&v14i}4NC$ai8YP<2aZ;Ytv8@KQ!TTKJka);A3K9uy7eKDc8FrJX)Zd zMbc5@->KD8H)$X#R2s4Kb0NQzEPR??*MX1!$Yv7)${RS?I#xGoT11_|Ykv+~O2@R=-@r8zd8F{zCEvpefd1Yg) ztaYd1?z6WEAMyji^TpU>NQB@D-z0mglsN>bIv!ZmUZUSTIbpK3)_yTLQC~l%*&0YZ z7T~KByD2=Efs)RfRXAPAlKf>X1NPR^TLyhDlh|1E;kK-}lK) zKYDEMp-zZgLF{1|!Saf;vtmU-->-I+B_rPrqt;$Mh>bzz6ujnjg4j9uE+6xBh>J6s zS;!R2wpD&>T#q_JzHUabMwA&wn}{HjTbBqpwVZNrJ1@oArSEP@Vk<8^S82PrhPVJ%O*e~SszVIPjAZMc8p{_B?NHzv=uRVH?)RX9$Q?uu{JdH7raHrW3}@n z=jQbE^srKa%+NQwMH-cot*H2HQ?d0(P`Pq1wDbIQ?-y7-rnObIpIg}3U!g@dEa{XVc#n3m%+k1GfZrxamOb={QU`d{MmP_ z({*dEAm&2HyR01cc6wR4?-D-|82olYi2~V7GK23%l19>`vT{OMXE#0l8IbR=BTJ8_ z!+&Q=G?3;gCM}Vpl1}k{27=GRhU)%7{;Y|WzlEnHp{k}=R_y902M3uS&m^owvrc&K zEz(gfQgBdsN{l$i=%Yjy-9~rV!D{;Ssq8++&w`rx-J@nqB&_C0UenILdb|&V&CQgf zV*b)4PikCZQ}H~|XZRn!iMfeOqn4DaTu{O@k*z2VRWK_k#z4Q;TUX_;X5Q7lJK)&L1g$*%$IvD!r9%DPK`f_# zJOlHnH6#pwM?5xP9`g&BpH3DuFbvzfi~SHLAP>GooA7vw#zv3jp1f3`!w;lDV9?fUBZo`nAnk}3`JtL6|ohK?4F8s!hP)vEK zp<&jc6`(BlHt;S^>#&xR`qHupPaCWbgqqt3Lek|mHOQnWiAh2m71Qhk}q zUW=Dp@oUDKLc2;$xenDhjmj9N-MK|-)A5Q z+*6bdOMuvbw1$~!qOxQ8cjXdP+&WrI@`qA}_^O(nYbvH9wrAa%AGy5!>Z)Y##%i>; zlqb#X*97JTW9W9qF9t=I$h5%9+|^`BXKgT;rX;KE8xe&8N(Hp?^li|!8KB5r zQs0@ZwB|I)5$iXh5Hjts-7Uk#^eeJv&rz#rgcynb=!ojPNzIrM)uZ@A)25GgUW%~U zl$cDWy?46_TYD3b5Fxat?N5xQ2Tk`k`rY7dK5{xiDYx3I9Vmv3)8J5*Eh#9cwZ#_X zu_L|xpRb&=Tdc9EVLs{2m7x7DlOsA-=Y_Bfu`}u>z^i1rHqv1obuXF)@df}@>|IXS zzF<6RW;h^IcEro5$j%CVBva5DBpP>st;*r>woHl~_9@NI>T{0x=wBXprPFQ1z?0Nm z08s?x5*GNXI=x}W9D^__&aA_%*a2umZ=^JM4u?sun`*A$CGL(8(@%8Tv={3$N3G7kfwiuSsf#=rIc`d$Q!1}aGpdOZ`@H0@= z(e7joUoI?+$z1;xybcgB;b_WPS4ofLGNI-?+?dsShdwahGCf>F3Ufvu`#@FJfe`-uQq)tIl=kGWl`t zhB+GPOm`9IZcXfK%y9orp)=b0&$uV2iNBXrboVIy#}-J<-0=$*ei*h=%o}CF3|!eX zRBx4%<>OfAv2}PU-a6(_M!R>&AFSSCZ6%6wa&iI`z;QJ{;IH7@Z)PT-%I3LKRrtcv zZqJSdihW`YsqdLt4(9#)Tby>@LCO`YR>;NhsfQv1^;JK=%VZp0U`v@a{`D377EcQD zW-}CidJ^hXufQLye43*CQGkNn@_Dd{A;?Z5xf?|^#MK=-~S97+(VcR!V3)tQbK z&#tYcIsIg-{a-MMfpXch@of8>Zu&gx?SuDIKY|O57GFlA#v%qX@%Vea4sFYfy34cd z5%jZ9^v7J!8}9+15q+S_lM3Fuw%D4_=@Rh^3T;t2Rd5Z^ydIk?fdCJKSDH)J;h~wF zss`dgR_IQO(B3`P+$^s_aI-7^k+AzaKiSt66c)bYCg}h8@!n%#6zH9{9+cax{B|p4 ztE3QL*b3I9oOi8paqFI?m| zL3f|2l+q!IsjA>{E?c@xY~96da?s}7h$%ZU z=7M}~f3Y*qx$1|w)NXAE6eh)197;u{{&lY|NQBMq>4y*JjxsIB7nP`!MXR^iabEm% zRg(?Ldiz6r)#l*z6qArpB>16@OkPo{;S)4)PJZaKeivPARA<}35O$h1BRa$mXs@HZ zpQ@-a;f(;T1n+-@P`xGlqs8lM6N^oQz3DR*Hr(3=r=d}*xir;~I2CNd@l#+z$``{zioG3oA=`Vbsqm;88l*+5uEvUZ+2RpbnCz@aITuZNq2SAWrkr%9ju=HCp-7NKg@#-`7C--^PzzTcyV@;! zHLl}Hb*q)F+v}r+&3Sl8IJC-vhM2gO0;uVg*0APH)*f}%bScP5Dn$C?C%CJriC;03J<-y^J5PP6*bvTG zBbT`gW>OT=+1D9TVJO5*FAS?pg@r`t;D=5n?=V2WSh~>1U4NqJhHP#gQkSk#-9|y#(;rEpPit&sGWx9KWqD1IfQ{Y2-}ZRMqc2xC{me+mpfPHH zwaj@DHI!2B`n$ons#mYnv;%@z`+2_Kd9fHsLamS=l09l`!Ldekk7y;cucA?xo%y?b z=Z^`dI)Na#;n+w(Z9v!9ttv;WK^tFYhodbr@JkUKrnW~kG;sGhRF*|Xwy+BWJlx*F z23k1y<+YP#EPkCqG3c_pc*1B-;O^z6Yv`=-KKWM+)bxznCNn(e)SCKWd;i*t?5OXo z7<-$&cVQRoWjCI{r843DEzPuvU+P7JDu^PXp19Le+O3X2mXyxTrLEfybtKGB<7 z^Uui3>)4jddY8O2yd1AZP01lpwmvnD6hlN5a$6+|dU=v^b0vPi>94*5SuSlQQ-V&H z^CN>5ECCc^QSdSiRcaGncwMvFxb~uFbx=vSvZuO*CMEZDQlgqS_X!ODk?JlVtE;QU zo3w2Hy01X=nDKD!7U{o6Yx{>6Ko1|E*$Gb~?kp(o{3c?STXh}(wx5`F<8FrQd>AIZ zo`#mzEAT9M`}(-77T;M}mi(E<1=~xD@dh+8k&;Rb@pe)AxBFrw92zTg(*CfH%(Dnp!;ef93yV6+;7CL74 zA`3X0j1}`A2gU2TEU1nYYzgZ}W{A+jO5!qHh~IhPoS|WuX^FC|Uv7d}j#=N#FqN9o zI~sP6MKNn{9%PFWEP7;Q+~%n^+&U`c1QDtX$BhM=V({?4<+QgNDBsw>qhWMrO3Z91 zlMWE|x@QW{HJYc7u^#bXBVe`Yh)kIL91-%Whmg_5w1<_h{`YU8+3J%1Y(rfbY-bi- zg%&lbMMCB}A&jR((L3fRCYD4k64q82S6}~1r#-ewQ1*LQjVovV#SsL`6s@Eeja9hD=T@Kb z&5GT}@7^zmZkFFQkN=>R{rCR`tqi`mX>a+C1p?pnu^;ZRFIhlZ?iJ?S?5Pe-OD?Xi zB-{>JJIuN|#>S(0BJ;cd!W^ON8_%WHqpc6d?0i+O>E7El zc8aqnbgc67PI8y^efW&a;{}|J0s>%oP+Kn&dG_qt-ZqgaBziLB`okWk>AZq^yQSY4 zv72}LaNJ}wq>zjz%86MA(+pT?Qdk!&j-kK0VWgZ$K37$fDSlhf!Xp+uBs9)^TnnFQ1N= z@X%mEveh#xtY>#1pNL>7q4KGxN<=qyl@Y=jE$-W*mpUx`f&qyEj#QvWG=o?58;BqA zYTPm{t~F*Df`K;}zPa*x+Mzy}j?b06OGqFE$fqNYH&?1!yge$i!(zqZ&l;lsr9Rbi zx`#Z9#U!P;3i7|ysz=vED&>FZtaBi8?53tomBW);$A!5e^B_0tK^Ep`;uCfftol}5 z+Pp&QH#HMgR%(MO&prR4#vH6o^Bs}9DCLP75(B8w8!WyDHqLnnl*$z5y>I)CVYT@^ z${%r2LBAX>vn3V0=Jta|9<}r0d}%N3-40%kMk^*KZA($m3MG8I;$paAK1SHd}?R4 z-f?EC+g;x<&r8ZLV644IamyHCJ&V}>s*rES1CxTT%ZK0Qrj~zh0dFHk+9PeTF+v*m zn#)741sxRjak;l!x7*s=zM1NV+rNilhfmAzvAO9tr7?eL~ zHkljuu(jGs0rEnBxT*yolqDQ0HNmw-R{!~{aV(EzSj~lluW~^eyHq?v`eC48G=C^a zgmSC4uMZ2k>{Jq=24P!hx*>k^70)A9mOq-%ob(syuSd)e{9o$Nk-A3lEllFaNM?F^+1{F3KL;E8bp6S&C4A zX_C%tNJy!8H$lux9HC-?%|SaOu2;9C2R13qMv0!%OIQM&m8G4X~cR{m?(r`qWfaT-$LnjvJ3j1B*)TwCDS4%j_oF z{e$=5ru_`_sYpojss0Y%G2$%zqyO;TK`qxi#g7HjkOYbl+__I0$PM600% z#IOx*$HNU&QYno^mp^u`iYv(u9w$BZWDcQbLLhdV5tY0uv5LdEw~zSo#}py#^B)6cxWn@ zb@Sc^ryLnx`HB=**8nfBCijXBfYhJz_O7V)w%w>bsDDXUoGkUD_J)V$=e=yf#^Hehe?yn);+RzMN3 zy*3%n=g~*&cv6heiTj{a;kCFvZ>p=5O9a|mDh06+IN6-7j#9$+4 zem)+B2%YZjU7T0U{hvS=@@?VHBK@zTtG78Ye0_Xwi=(0%oGLL{lGCw8K!%@y?fWJ! zyeUiwI|zsp4y*g`VWG-*>Nhax&uXqW*IeG#mv8fp(9qLMk=lR>1dpfD4^&7$abliC zNc^(nT&tbYZZ$Wa`84=@8lZ1e)IK5J*#6C%BQj|UlQGJ>SZ5_!4M2+K6(>}dgk2=q;cN$r1QtCOD|Q3QnRy|s^yD61r+7` z!^)9J1%Mlv|ECuxtIGh}IPI3`)_G0pz=^`}+)#ZmFyrf!1v?a^$4TZu4+YM0ec zVdCK}^%lO-6b%T_A9_%Px_C1XWRgC-O_)zJ)H}tGhuix6nO6rbPdkVyWwUP80u2ZI zaSH*d>33%t><{2{Quv|u47yO}tcKVL*!tu%Yy&zi3}kZS-dE{+29WR{rBWe*M}^*E z2;JduDQ6vPb#1!N3(BVq#==?L2yhSSM%NK9lo`BGe`z12a{sONk+vds{a@M#M~Q5a zFm`AsNqk{C$c5>3QlwQNu?V&<4XUs{OdMx{7HbRb+}JCnpy<5Zzdy&RZSD;eo-AES+mY%wjt1c{z;~ zdzv5yc%x;wb+4y-f+mI5RT`H4uGq)s1TkoxPS2GD1n!YGetmM841xztQ*9^etOm{x zOn>sNsOQeV`Y&=vdG^0l3yWw+KO9(zFb_HlR^oV^TN*^d_2(DDvhBn~r7>#LGr?_qOpia%Ll$Mtcg`cdM52r`L?HW6al-x`ueVuPBPm$jl|X_ zOsV+2Bm^6xKZ?xY0&Gp69B$CFT$BVxF@KlNF~YyfFBN|U7wf)naN?B!LiR<`E>j^< z;fKos_%*D{gm{3OQp_huR|bk0UyF)u@A8IZJNy$oQ2hZ9-p>I%$PvP8&qIxvs%Tll zKwZhmM(h2{!iaUpLwp~P5I0Sv3H6BjIG8xvr6EayzEb{JhstwJ>Mv{GNkEgn)_~l< zi4&Tta{IwV;74P_xbMrCI0a^ysB)&pt}Z&kS!8JBp&rbc?7~~Dioi2!QC_r*77!4q zw97chcvNm?RtOAM9JnF-|K)f5ZpbDDk7bwWmr|<^Lq$@#93w>->`JZJ`Ls{XiFF3E zvV4>Yb3(m&t(K{h{`}MQ*cU%9B!^6ey1`yn9OrG-OZNJzG{*UmRxL{gHV4?MAjzm)V;zD=u|ak8{3pfX2=<+h*aF zzcdY=w*OAkkauj50tVBW3mIsBYcfVMhBg1)GiWrtaDYV5_PtaOFMO zU&+YJa%{!PQkeIHHJpI-DcAqz1bYo_U4_NjK5wRfWgV(EGsMff$8a>jb}o~bUEiiJ z4cYwH3)p&ZVaddC=Ec3_7i1%}i9<%acr{szzG|TzImJv6WMkYtI4B>MtDMOKavFr; z`%w&J2eb4sVT@}^dp>%kJ*z`aO|1t$l4<^%y6lmNI@f<0y_)ZWb)!Dn(00L<(~p9N z=JFVi!GJ26^`#yZCbKvC$Jc-H*fsyI&bxaJX2e_Da(|3fQKhUZw_Gnb(ZGFUQJ$SJ zg$cuo6M|$G@ef@31EHlx~V?De$?wD1kLhek&QX5W!p1!B`!UEoJUzq-9)>ayi{iZjw0uH%ZERuuZ z0v12^>E%m&i|%sFu)kVWgM7Ji{~wMj>gY}f$H8;w{S|C!-L|<`dP@j}0EQMkE{(@z ziBIw}rTwPekh{U>LsH)`&1}v9s(Wi;;AHOPJK&MQgRQdeT&|DsiPT4!k5yy7KFm=C z?oPC}I~j#^y&<_Nh?(STwB`#0QTVVE3dkG!uui;MSa=*+XiN6gFEZzAv)E%3Ju9)9*y z*eYds{Ax>^ry)EauR#tj#X1uQ#(4=Rr^*4%)xPh|Xp))|UnGA$JUcJ%R;vU2G z2JiraN{+0(!ZtKmm-?Rn4E1F9Y+j^jmS=Ajlwm&3KPpJ785sKIs=uswk%pUXy+yim zdiX75_uQVi+HerVg8IWJhYWV}e7>Jy*`vdon-WGw)L?d(Y#4yz4K6bqi>p$DC!m+# zo5XHa*eLL2e82cqGKpw+r`^jNig?gU=xc$k(~ZO3Vq!9snoa6C)yH| z1E7BuIL4EzOT_zbj_j-Wcq2-zVXXDPFuG20`S{^vhk7kf%{8K-s%w^vjG-K-X!xG5 z>F;vb7wYbW_g+z$S+9ek-~TS5`CdZ2@bT|V`C;4I_*RTyBql2>t-asxBch`-Lmbaf zn0ZZ)LZ`akCM73BoF^?+*%FYOXWT@MYxr5QF{k6fDZT!h0+`?Vz>fuh$*?MF>}(cC z=e6&*$7;(6wL+i!KdBY{=Wx3i?*CUum`vWo1MAgqA>G>4)F&<`fhxGFO||g2uT4}0 z{Wcu*c0BS1Qkjj_OeI4oC5EIW!hlFfvgn`hlu z5knf~UVu!?`SH}1x+c5rIak;2jJhXM=5oc%blMZZ_1xUEqUv*(^PAa9OzGesYKsew zs%P)d?F`yo+#ZinG@utf(;y)CRi^7J;6>y_rncUviN?Pa7WT~-g@@x-t~tUq;VCW- zCYhL-2EPJu0jhVLDP?yc%vMhRxL{#tu8geCTEyJm ze#wQQp^b+vazFCq!rsubHhp06@$o?+VfQ^hMVkU?Az2V5SyZ3OW%w*wm|eAzFRG-B zMn9k7COp?)BSL;ZSs$5Uwzz&ThG=-v_5*EoR7Ou=jx!eM%CEq~Q|ip>3v|fIz-k>T z35V!u&?ueuuTs(0k-;L(l{p`Fl54exmO9;qd3TXwIqVQ_EQERG-P<26Ymx%S&*Ls* zEe_D9k|~SZluIMdkx^&5tBDV6te>e>vcZD^Gpnj14c!r#1y7iad+?++H3?XRvg^t| zK7#MV+*kp_?8;z)vTQ-Q)x(cRIU=u@kS-yh=tgAl}i~9t3xglo*hvUCgkT_65WQOCS zH6J_zcjLlAY{l7JLCgxN^Ys_ufy8$ElrQH6uvHs>Mdw?nPK1Qg(;2sD70tGWJ!{X$ zrt$$w4tCD`K0(-}M6@Wx-L|&2jI#MDjbtLAUd8OxL?%t!3(jK@*FgFvE4@$g>B89o zntJ$PR)`%1-p#i~H%MYcdhFMy-uD?n6J5Q%$=a6kAXYyjqnG@1bpm2y>6uvu*e86k zjbwN@&v!}9Wx)D0`m^o|oayuQa#x(uYU;(_{{C(Dj1g8OXlxQ)6`LK-B~=%T{pFqL zmLXq)8eL*kcWL&a!?}xMdEan;P1`|V-594w{ydtJwdsWbDk*26=J`p>97TJ2EXOye zjunO9E!OtEqy8UR`!f_VKRD)H7AG5$dZ0g~4Sp={wmTh}%ir?*+jO1X&YbJs8tVtx z!4xl71+vjJpDPHRuNK94zr=*2Zz*NJy^s;zQ!bH(=+7ONd7nTZSrbds?oZGK{OiJA ze7HAVqReiY0S5Mb>|7uH71xto^%^-7XgE#NcuiQ856h-hj;KCZ_T@&?MXL0{Gza1t zCzJ$gfJTP0)Ef;Pkoig5aLM{jq%d-k9Z2Nq#-?&#%a$pREFUAdhS*Wpj&~_9!E}>0 zMoLU9mMV;G^_`bflPr04CoL=RBTW1ejHW!?r}q+6({oUWnQtP!&gWC4p!)L~@O@#s zN2Ag=@vMu#dux`{kPwiVctzmmcf;NM5xJLDpYRAT zl?5Rj@JzlKvd5K zX=zyVwKGY8xjo+fc`X$GJJX?tG^Pe1IN9RG0X&6b4eaD5F`46%cg+m*7vNh{>a=$# zqsM{Q8Em(jJ>k9dR8sD5W}Bv0tNcACoilAzsm_I^(z_zNq2s(ICn+{q&c&dfje z>BV0N%}eHgMrc|G*3wZ3gm(L%2+dggKOnSzq5l=3g)cj#xBUyD^%niZfc9?)?GDoa zWrP+hoCH(U14K0k5N{8d##Ph7oW>N^X+&KazO<;iqKI8ydDhKV&FJwiwr2fnG`+dHvCO@l;;Os0Vd zhBPBWCb62k1)_mA)y+()RHUK5eQG$_>HqhIo&QgwI+>P5n4v}gV+g8oCo;eztE*34 zwduuw2y?X-8yy1uzjHMbG{Rrx?W>=Cv8h^mJb2%NC~P>8quF{8tAIt-2olh@kiRW% z2rDZnvPTXbCD%RNy8shb3IzU^LkUnN=uXoXu~{Fk`$XQ#aAr^f`I}?`lt)uT^b52n z!QQ_O{qfm9Evq}_NGt181QE8vfwxERyYItsD}K6{E^Tq!p$PFudeWq;GBUH#tGVOM zf|B{WtY&{yQPzq6JxSY517mr@ufIGLH!Hpzkd~0m^*zI(-Cux!Cc^v{T<57(#v@d9 z&9?i{GA~=fr{MjfVwKK45WruJ)d_;|)4uci?mwX*1ggHNWgFZq`ffN-_$LQhD68)> zTpBqGYCb?gZC;xCEFp~0e8gC%X<*O-j=Msm34ai3kIW-k(Pl{UZBk1Hn7tzdZm8<7 zn94QQvi7D=_jE<>~798AY zyR^X(Q&G9trPu0{6EMBfwa`{(>5tFrLwf0r^(I&M&q$8vMKP2_{fA85k1z zH?YiT``>|OW+h$F_Z#c~@B*L~h%|y?Q|b7nzADjVUFpbyw!M4NVtyXaB0n4aELQ`G zn;@SQkQ;Wty!GxZ9j6vG;GT`ogoG3CWWR@4knMY+^NSZ-pR_3gWBUwy~ z)B=9Q2hX8K`e3pnIN!9iG`5rqLs=)ge|`i43zO~Om*xFA_2XeYBJhMjw50G0Z?2`y zn)sSc^j9R0G~tzx`J7_VeWp(}U-{zo{oGt(+PB$P3Ji^p+Wv9IX(9 zZ0u^^g0t#kr5SgUriLQS|Fv*1;&6u>3o*y`@X$6erD3TK;_>Vvq@6$EdcK*xfD;I} z`m=@$H+Pp7qx}~a5o{wr9|_#Q?{L3@qX>`34qcVgdJgz+ z@U2=N{mv6zJvu+RClD0vJ($wjKM@?W01ByqKYr6Xr=->9h=)K&$8{p^maT3zE{8LP zS$b1T#CNK6y6`|Rf8;d?GHTd%JoBkxcF~c)JSF!B49Fk#g#_z)m2Dn26sR5dT(NqBek)= zItbrV{u4jHPheo<$Ve2#8C+po+|^zFZ}b<4gIwqZ^=4O z^ur|#1iZzt50$^2`%OKUM3a~BP4gFWnGr_}(oSF5%-eT4JL{T)GBlKZ664|sE=MFL zOJcmI&l=2ZHpd0$iVWdJegzSO7(zCNHp_&Tvg3aXPSO9H(eEX9f6enk)w`-o4#Y^H zuYdt25>}E@utB|sHtj6a&g;3|Fgh)dHTf^~ghMV(x4UQlXniE`b)E+0De4WPhR#cL z=ur-NrW&OqMld^EL+f!T@6nM8I@o;DT z?8e$IXYI#vPC8ab>5PKQ&+iqm3KG5wI#Rf@6MrC|-~nUl&(a?lf@mihA+GYgv|k$o zwP(Yg12gGy^+w@9W^+5Q$$PmJZ{eBHIKy6w$N@~Nhge{a0$)?#L6P2qFr40wff3AP zCNmy?QH~gFhRb8mFD{@zQYyt8U)IQYd8GLo^n+^GOcG%NN@C!?R6LGN2*}aAX?02b zd0^4sWq|4SZSLk2+H}SQ2~)6DMx-9h%+4xKpJM8ExNqyK5QS37))$zPrnxfukyb}% zT8LY*o0h9El3BQcr4^yvHf?106-xj*g;($0H(ghgvC4*yamO-SUK|ippIs_R$UViI zW)1{{->&|mxRu^uAk=suQfk5SxeSNVxw0#j_Ny$9su~gJ=0-6Y{D%G$L<$G_4DEeF zu7st$JTxeaiMDaW0op&uzv&Ge=g3fS0#W_T^0%3kP@-};4b-bzLdcYdkTWjzu50bj zYPB@yRudF3hQ1LMp8INJ45(+iF0w;BKWYdQj>+ONf< zk!+prgWPU?=Pz||S@hHa2b>AL6@sjHuw>$g5RU?aU(gR1FJ&@HD4Jj;e@p>o4nf(R zw&rvXK9I#-n^@S(v_r=g)Tg2f*!0SNr8TokZ_xtTDC(89W2y;3yB$xH45RhYC`7@HZ7exX*yYoHF1bcUxvnO zBp60SfXNv+vXfp<{*Gj|vGns3xyW$2^AkwEb=M|V3s)J+I{+ihjKnok!VfulNPsaw zN}JNPIsCumn6CZ!S6+)!SDeSjwBbj$rowW?P2|l~j{WDH^rDEMRCT_#aDh>Sum(`w zI=L@j;xJ3qH)V zh|qjsCsfI@ z3ag)w+M+`xb*EZuhDzQ;#Hn`R3uDXn;|p1M&h1R`O6N1PIfuKa=Zb296bN|%@vAlG z7G>C&nG?m6o$)8utKVxre{tr~x`l&-1IKZw7}hjMac@;lj4q0gq@1)Ds>QO7YMRt! z($dX6HMvKqcfOpN7fm>5GWOuvvp15X4ENn=m?vCbOjdujDJx9D&LwNytD~8$>a)m5 zToNHC*BprmE`FRTCu@munsDKqS5WZiC}JT(I5Q`RQl{%@I9Xco4lZSVGoz_V)q6M+ zxHTx+d}j}TW@fg39&HiU+j0RG=c+?U;oEM}9IxqOan~8QqI}Je!l>E7nf=3LQ*E|1twtw`r|P z`?6^&N8KOEp?c2XP;aKw87mn7(aqe3QeqWn!)kx)cNd%FNu=5S2y@)oZcyW@y^(Rh z?%aMiv(Ag*?ZiEWYZ2S$L?#XOJDG>VaE@o8n!J>{s1bE6N1?P#d{3peK>Y1s5(b~% z=`#;HrE*q@!_!&J`$9tIHy@GT6``tH<>_gKVpd@J=!|!?vInJT(OUFI_qO4Dv7%Mi zWZR$(C+_!L4Sv{<7$|*je@)lYtHJjfjBv3#*~|D@fQfIcsWU&((sI8*C4=TBeLjsP zqotAYJ&GRgvInH7?L~Ph0r4FQ!T(_LBiz}k!UTFDjYV~(r>6V3i+H;VnRQ|o7HSq z&(;-u;as%0V~G(RuLqh%yIEB4%TmIbGkoz94s;H46%}1i;sb>2DLNn8nn0oM+YA{c zd9NrAHO-SmceiVj-I5N6+Ml zX7A{ZcjuFpLTy(MdRB0il?lsjmqib0V#^#4N!0!0y%#Artt4)RxKL0lesg~5PvhC> zPv7K~sQEm#(c~UJ{hG8~){ai(pm1X#fxeY9xk$)VXXYSwe>#)tyAvMFhum6XDwK<& zKTI-wl=*2q1kITGImqMJIqmUr1>ph3zbDOKA(veWf0=Uex==yPvyn6rClw-Ewdz-) zDAH)H$kc(~aMVVHpR zY~^bEweIDDMK;TWtbum(=hW1Q*S!q29WT7M94uTdK!i9 zjMVKaGy1yKu#^4ub{AgP>PQy14OI}PY#wsW+~Kr6Wq`RdCblJ-PGhMr@7n3v86pMG z`sk7VP{Nfm%V-Q6`k0>$Z7Rl&ukes8iSM*wbxUlWQoTo%{ zb81P!7Y^_F0gT*8iGDUc8GT>pDyz|4_iR&Nj_OzCZhE7=?VnZl()%9N&A?LnNgrFZ zss31Mulgw!i%|f%E{jy(BjP&=aEQnd?sMNvL+1cTuV=ydO|AWggLpf~LU2K(E9As{ zaV=kjraXirhaSBo>-(k_sy1Gc(Yi_??TI)Q*?#7Fn)4xdd=Lr$=s>pJ_Sp?iCucD0 zpq!r`3_Q)vR0sFS67L=(TrTm{pqS?9C#2ID7(`rFLeBlVO8cv=H9eizQ&9r&H3QN3 zo1$_U_j)NL9-hddSS~zIFj{7i`F<2Ua{{wd zwNpCX>6j5K2@kb@TEI9%AsQzkq07EnGefQ{5x4o(NoVA5Qz~(h(&=4k+IQAt`Y z5(oK7mpXx~Zb37+W_X5%R52}~$zdY*tl8lP$8V;IX#>K#?&*&1bjAj)?K%O27LCr? zWyLA)eqIF^G^PmG9~U&FN)bIsmNl1wrfK4XPcv!N!VUV%;5}*yoltEbDh(zyRxZ|R z%2AC$yEnUt-Ri&MmGs(g>y*G05x@kejNQ)OGt`3vCjB`9KEA8q#qu5fMup>S+$}2? zk2nz_(OKDMZKNFz6F^*6O@V+E`5+U5d6fO#le28IwGW6yLN%5WKBBCR3hE9I z{BcOLk`Qw)RVHq=nWod3{(LBxt?1_*{4nIHTH938Q6Iys-SIcR8_-Z$_tDJ@tW!jX z8{-YXdhRqykw>x}h;VTf4wm*v4n{~N+5fRYhu@2KK3We7K-5r$ZICi*4CyL;Ra8Cy z^7-?N=&+`bDS<#nV)+wx`@YAw-55ipt82 zt_RdN(MX$FrPFs?DQO$_hlhvrOp0**!tE^{KfOL#b($er#erE()cz~Am5$ZXc0l~i z1jC3fUxXCRyEzC2auslXKKyx(jJCDZ?RU)Emh|S4w!FkV7JIfa`}2uHEp6qV?^M}O zUM^X#tSL5%9z_9NCS4;=TxW{TG2gcx6G#75nrMr+-e0j`IM3eg#J?1s-6vZ$PBNc@ z#$z{;bc6AprP8Q{Ql)-#OL0VbPQn!W&SI-zY!vf7TpR~yq1j`83`{~l4-bz4?0UYr z#|%CqKT{o;E4jm6J|CVm>l?S~Z>Nz{jcT-%LkZ6|uai37a}iIjDIf=<#;rKM~K z8@xglEZO(e$Z6|OMF;9rr`~1_Av-E@rx!g>Z-@@dGV*)2$^nIhu9xT64;RG5@@rfR z(Db<$U#a^?zbMPs{w7t%0OSc26?wtOd7`exk0;&^CS&ly?>Hj{6T zDd*nGtnCsVY@rX-FV0G3G8@m>C#6%&rq@u#yitPh68@p$Ebz*H{6)oiefir5g8KMt zDOxS>C0FYPdcC7SBm6n1Bdz=4o<3h|w5N3I?%}p2;jtVWH55fwoRD=QA*>()g1A7~ zW=^DK#^hORr|vZx3e)G=D$Fc5e4b9$8~*8599yx|PZlFb-~Z8+2)>W zUF`xhR$AvtT;MowqF~KMTV&1WClYZfWfGdFuLmQJK3Ad5LRmz<u?22mMrxrL!3PaYBT6& zTJyM^_JkH4dwTzm&b~UV%CvhI6N69z2?-IT1?d!&lul7v*n~()H>i}7N;iW@mvpmH zO1itGr5l7zoV9i4oB7U}ncq3bf4txV_TKONyw9`Nz3yNsZ>U4Xx&vIfKvhE2HQmq_ z1JT?5!<+>c*HWpyAycwD_i+bPIwKX_|BF1=M2i@Vg}&Y6pJ@*B>x*xpTX`adK)n>K z+P9f`rkb^z^2je}r`kO|mCzlEn&cosz0a{jS*U5;Y&M24Up4DFrQxot9Vd6{=2omZ zW4NBzmF6NRBX*D*eWiKoYtr(_?<9C@)_?{Ie+-I!+cSOWwd^hWB)^TIKR#AfYo??!r#vY7aS4PE;UG_P4d7llwxJ1At`Zy?1=D>~w zLt3B;7Nl2p04K0mo`(jNx)8$&QA$L9>VB=$&JU~J7n}1Pxr#r5!~A3W*Fj`dG&JWW zBqY?!-DQy4_c+ND3!01=(Xy2#%jqA8EyFKV%py6OPJ5Xx0ZZIX5!|^Ab&N%ZvN1%X z@(N#Bp)G*0w48nuNTa0!2Kf5=1(Mz#mwUEIIx-FVMp1>YiXQv!$D6kqRkP<>qpSrS zw%=T8pWS!)u8`D@!9d22G0*IoZ(YK2^>NONlg}d1FM67IIAKxniDv3RDeN}#={+3H zqT*tTH{IR9?YFHiPe;$pESo(%sWEVCr=*8y6iJcb&R3Uqpk3|KbZISt*LD%h9(*Cw zU3k55zIPO^8E*6hS#wx@ptg`YkhwtFEkc97&Dcp=OR5V_Yizk;Xw)unWu&X*G4xoD z%|%NCdHLOkU&@@<$f+9qll3=(ZB|C#9y)T;J|KR3>gh)QEY=OaNa1srUTn6i^&ghU zOJBXpq;^*)Gb^XuTwI*(>G!)(DYt&2^eBa7di1qa5H-C95mC!97%M z&0TU*?lFIIJ-x&Hc7}>SDSvznH`V?}jmLcU-|v5Yi^sI5E><_&(z?HjBtcbLvIm1G zeN%ET2W=>`=BDiH7evdo%LO4lPmxHWT5lXV`2$Y0c5Vs>hcDrQda-{}xy)n(}B5iZz3*Cj~=U97;*u|I9U-ysxrFt%4{ zKG{B>fWw+m4O9X_GTvxs`?c;QjmOI?epZ4U{%=qARWr$x9i`(Iu?ow7C4phHH1!j4%eUpH z?TAf&FvdrM(wZ)c1a$PDAZ ze%CnPf^&n7M;Z7q|Ahh#TGrdTswBQ{=pc{dQz})Ul#6$?Ucv@zaCNs)e+WOlLP(Lz zOh`of8phlJI}kK#{ElD6`H%U&ePl7RHZOlvZrg`fs-J*M{MyUwoJ5dGF?P-8&!4}! zg9NSjsi2#9gz`8JkoeNPfL%a$bYMc^ru(V6ws@$8yt;P4 z?l4h1j&JdzWMsk@^=XJF1twNX_)| zX+MgZ??2v(rq}DN{{!mbq8YP|0!}PMh3V<7rIi$!cfFPs9O1E^V+t50*_>&@WA@b2 zhg5cA-vNN6E`9^WPTz?6m~WzM1(&+P)?AxN`n7r(`E)tSHo1i)YlfgZMlO^oqCd6_ zpZSTx8nNi@WxwmQU5K$gR_SV_TAqs0qRoyUD?&Owa_~vcL}}udDg)#bE(&pKSJ{CJ z;9=5+6S;;4q;-YP9oq&F|2>GM6oDrFB*=2Q@t4iS4QVTQnK@w4RQjyHO-{~#KdQhALq_~o2~K&49I9Mw8{7S=a^gP zU9+;7SX+`EPxlX&gZeKI5<=rs{|)F7q^t?RR9>)i**OZTiOW3cm#n_pX@VbJKx7mJ}k5^r7KlK*`Ug$i`>ws5jsC0GsNm zUbVIx7anJ-pR?#NIKTApo?#`>a8?c`zK&O$yZ|K#(@%PpHGDA56>~}Xf{oq+v+7GAy(Fb)K`qy^!f)@ezMj~BaMy3N?5&@lNV1Z# z=BaeRKCuDPO>vHBAFXl@Vrh`CvkoiyfNSQ;svjzqd~31)PBf=^R%s5HKnEm1{J@*Q zw~8l{Y-)`5_I3xW4>&CaBwhiAan8YJH z-TkiKUhL0o1G!otnNU+>8%JZ!WX)4_;a|kC*1wY6$3jf3Q66f?R1cv&bgK$7^In8a z;Y_{NH^m7>5HyO(dbM+Rw)a0`CP`E~UlZFTZW^FJUe^5b`BmC?I?&J9S5Hvo($bt4c5O1Sdn=B z8hf?pb0SfZ=JR!+c45`OlNm@jWy|X{<=N2Tj6?cuvR0zd%KoutL`N|hi4Z0!&dm4` zs?fYo7~#AWZb9yBbFj?Y9(ym-)>`xO<;$?0+T@6^i!XnnZvTS|fLG$Jc`4}IvkY5T z!4dmSHs(M$gm)^Hkx<2D4iwUQV}QhJ)P4PBG;?3yNc?}mBPC6VzkoOb^*p6cD@bsOk)5nUl#mm4)drGC6)S8gV$=c$RicuX}9}Sj|Za$|$mdpW9*3_c9&h)sh)b`Ry%#qu% z3%l9*u?mN8%gdq;bp&>+y9W0Y#(DU|xSzYP8{Xoa*?JFOq}pXi5 zr1EGaRpz)geI1lyJc;A8dzz3y;TLgd-cX+!`v%8Ndvo?L%-+i7g;a6Fj2cwot(}p1 zd3lNAI~nL0v^Nnp3X+QpDb zZISXr0LUP&&{;O`f4U2f)IG!6pPrrqL&>+d;~Ae6*pcn-?)Ii@g_KRWHv(#q*>anj z8ja*YWj_B9?6l&MHRIKEXHYu^3dm|=-$Y9)?%`t7ra-L<9tx6%4#w?VF$RE6$c9S{ z8gs^=i;DzY<*s4xL#LhZDT)xr+ypyA}oKgSjgdkr_G5DMlWL9o` zAAB&6?PcV~@8x*;dfxLk^<_W&M9~es^Mv)OhDL~5*x}XYihKbm{Z_GtK@i)*ZoP;P zj$XPBn0ziOiKqSM+9qp0i-7VW(0OlFPuJKBksd5Vin>isHf*A~@LegJk5HIJsjOSV zc=?gWR*LKs0e9vbT&VRCiW~GQX;L{csC_lKJgpk%bZfk2@*Q|WAbA#&| zkqbWZW$hCUjY*XpQrIGh`otBu469?f!oW@ykLa54`o=UQS4VMbw-E0Y%^l?b3;guD zU1&(-{}ZB-*>Jq+dF5c{w0O0{aVvYp8Al4(FffA1t0GTonW8zA?8G$X0x7f0yPd9i z3Z}Nl8$jEy1~kZ>rC!#<^NBsEyEr{m_YgFxJm1{k5EmF0Ahyo$5L*JzSgzR4Q5>W$ z`0YN1C)NxFZ0D5+2=GaTp}k8}E=ZaDBAmOYOL|Ebj#rTBKht`^3;))f9yJMU>l2~9O_YsVac{6gdHamnm zcq|w3L2^AGvZ{q`eu6wf#oQ9Rr2N5CB&A_T&_6p?W)pnUEWT391wks>Ntc8gaV@G- zTiF@dP8j=}bB_wE0F7N9ETrt2KDc5X7e?(4L^y9ihwr7s492auYU*;JoxhplIFoxF7O`5g{&8QiC4#wK`5UR5LD<2Y&xaQ&>yTkTZxD%i zMSphp&bWa#;}A4}WFwHcoeS8)W~j+PE)3tY6<1fQoc)Q|!-MOkyNj%8H|N`o@_(9h zwSP+VpjY_~1DZyIw%nyM{HvdX&utYo8$QxH7(N7}2XCAk53WgWFOQS)^J^TQ#@PbM z5e?eIGCe&mlO`TW*3lO8-laR6F^=En=1kqiaOdn>Q=0~JE_*r{!^O|V-V1yEu>5>$ zG=@9b+6M*_Wgak9$!Nra4%bP!rx!Nrc>8utvgCr0Zr^=V_O%!Ft%j z3P^&8R!1_%@?cR66n9x0n;(_xgD}4L*L$3k4$lWKJ3xq~J<4q%3HWT;gq#bsJgE@< zw^)8@j^#J&3T7}9;e}usv`H}_K71{70c73nJ5&2Y86CZ+RkFUdj(YhG6<7$tfP<(t zv3nH5^l$s}t5(aA?RJY9){8Te>a$YebnR&QO4SizV6xP+%3`}@T40Txu1P{*LP0#3 zXTpu1;hf)D%xEE?SMo%A6mRJ9aB5{RHpAX{IP&$5xXlG@?6%J68#hdD0MT4tfBTMy zfe$uuEIlg*7BhLH>0xr=9imaKH_~c}~H! z@+a+tmcB`lg6%96D6<%KJx zITqZTE1naSVO2%@{8AcC+3*lX=W%j_Ov(scnzo5~h>TJ<0bG)MjEftGV(&1^LEsVx zJs^a(s5#{bS}2`bV~wjyS{^WOUqJ zOyaP+%RDe=Xb7gc(UF7v!?_Dz6IsjNz70rL_OUyUxT`{2lQ&JvLyF%D2yXoGmOs?h zXMU67a6wiH*cD?`%E|N&nj4`Eou`%tNJiKZS(hk9uC8&icB&x*(9rsLLQ?#?2S5MN zjERXtm}F+jHq6ifU%^5R;gGA<2g@k=|{N4Dedf%(W1ofUx%50SuT5Kji-y2Lz zRLm#JYCU{#i~2{O%(Me_o0K6;YKcKe%hb#ajTWKFNvmVdF05|1;xj7=WT&?4-zfsd z58krR`b#Z~d&9!J1CvYP(XS`-H3qBV?BCl}6K5C=qB~a3PvAs!o0Jp+jHC+uy9cpn z`6wwLOwWTL8>r4{Cw62plnpZ}`fsltI_{KzI9d!zQ_9obx_;o&?a@Uwaqk}G{sLKg zM~(puG#^1>k^Ylku$@5$^k72&CcH8AK#O*i;Wkc`wxQxz+vhPd&vx7A9>;?XIeGqBGIW`jilekLp0tT@bXa*~ukXUGC3`1pP2 zu22v*`bDrPCi5v1lUowsch!BHPW1cp7*(nw%%a&_HrG(4#$Ks<(i#f>UIVFw#r^%U zg7$&1SfBqCC7g72K-0t*CTK-t5%1zDA^KvylQNqTDATd+4a$vgfMVqL;odadF2aw`*A6N>{S+^D0&eZyg_ za{G;%p`o|yZy1+HS6X1w1AL-f=<>a>$?FnpB_OVm`uy&i^f_AERUwC(rk+$tp*{}} zl`mo-VoCq+r}$IuBK}QnFRQDD>^p-bl~a4F{4nKaTktIRFIBkg(X|Hz1Ym;?qCrdX zih%1TK4HY-D4ar2!PKMfdMExocLQXmlz1twi}y5`tB+j1&Qt?Zj=VbSb0FoY9UqSe z6EU_u)Y=cjMH|~Pz*C@sc>r4(>BURvUUG1R(BLVu8f$TYTZEOvd`5gE{0^j663&a% z{&1{kt3uKJQ;QXDW}93;+KSat@Am|$OZDor#KvVF|DqxSx!Gn|VczAjaRJy!r(FH0 z0fxYMo>yztXH;G=cYxvevmT`(Vnzi19d*x%0fz$p`b)(tgY}TTYWb-oRg#JuC@r7z z^OZ;|sx@h2z&?D$9(C;sktZTu2{g^`Ub&*^0{bFI2mf`xtZa9ErNUTQt^HB)z}{j=;KB!Jzp&9HF}d$AyI?F?}y;1o^$%pG)UcoARrJD1&Q5I@Ir z@GGe^d^B9w;Sc~QvTap?V8=8WBTA=j12wv&Lr`r<{-3o@Z+^#y?%Ka^M*oygO+eu-HfWc zxbX_zn+$>fm-u^DM$v|^)Xdm;wC*i69peIn&VRHft8qQarW$hV)s3j-A@(_DO&RD# z7J92_VIVhd>b`M0Oe$>h=mv@3UkAy%)j?`iye%`DBzn)X;sk6-1`JmnPV$+@P!0(n z1377SaiCg$D|p7Ivr^W1*mj|z^Qz7#r#2RlN(}1nERqxq-L5!Ta^)AljjPtEViqnL zOAZ@urypUu@=|R@*)us44Y@b=i|$C^bm0Mi!slwOVDj^1snPuHMy2xwCBx0#==N`q--b&+mw<_yd!Kj{S z&<$>jO}IYK2V72s-UNj84DZ4P`|n<GZbP2FB>qJG4N zFJZVBkv`RG8jRV~;>*?Yv+WWbZ9JSQEUsGH5Co%xmoAQ5&rMmLe8S-8GW)uIJh8W% z>QfzSV8@It$vB`3rhm>If^Hhqvbm=`x{HGLWSgI$nP%Y34e(6c_Qg>YHSNx0!(f3K z85mJbyF8(TgbMYb{kQ+`Ls;X&Uqe`fsXMmN57Q8DmD%x@)%*dD8fm7Ar!nH=>}04(nI zR5JlwH+1cVo@z~s_&l4LOFg-xd-A~ja1Zn$O{fT4bXCw*dmNeSG!s%?{qT-r@>B`- z4c=?`!ul%s=Qih4wd01-C{KTX|H5KKZezf7P+QE!pi-{{0t_Ln?>GE)flq==+=odxjVnL) z%iHnVOdH!@`WvFb5j&tcDd$*;q!xFJ@LPpF1qp3NAbhu&1$>I6^uBy-0@jOYNjtgCQukYki@>v^*E}+a zk9Q+xHDpS#S(8fg#VorE+Wk||p0z~l3|Q0OdJXCklhBI)ea1iGa+8rv zM`{aJ&i>~7bcawbLwj2G8q?xHx(IUoUX#J` zYKw*>x$SICBoPc4jUv{_f!y){#g)xDjGFH=kx5`1dK%lrw&YyjIUh0efE`zA_;Pdg zn#|B#AwW$&FtP}wiba|9!14M5BA9Ji9N$TK`T zyztUoOW>y+T(S8)pl%##8WIR3C`Xj`SH74B1(E?176HI>>(MbkNpEH*^W%>XuY$#R zd%fReuT45m&4Cct=6V-ZvDtyhQH%nhB1FftM5<1?i8=F1VrDH5vCtFi;s0%7U9~SK zt-g_BQ!|kOPjvqC{c9PIvoi{0oDK|tst8#aS;xG#?h!x&AGN?W9XQxARzPY;TbloE zue_jnm{E9S9L4Q?UG@g|>EBF@aN+fJVX_B|U9=G@iGfK)uYU8#T#jOT^sSFkZU4Pn zmpT~5Z)^ZQ$i8cjVK`G{ke8QOG^;@&@=wx%wgoX__-r{!MJKE0WDEPGB_RRWdsf>& zEJ;ayyHdn150{vT5KBk|>@hYW6N$Ff1WqIZ*bNC7dDsE8gyhE{iAEd75sAPDLhX zK*O{jgQ()OC~h2ed#v-TzwhJ=8yjp3fDPrDree72ACizye@H?sq@X}oYDpH4)}dKg zAjHIM^V%*y7$N%aPTn^B@$hk>N@hk`nw`Q)H59E^U1Tb%YQ3@ghf{1^l4+5|i61-I zolL1|XxNq-_Y2MXl%_AsO+1PwUSatYkq9ZgXtS4I{bXf%IdXGHwAk#>1DKe>@7AMj zktYulUWq&@w25k{4x5=!z&e20#9!$Lyh-1Wq&6=Y??ogM0VeWn-;y2Z$0C|8mF1dG zUt9np956i|;WO%w@A-Cjur$^3FOWGe991iK!zGP^&fJSZ!{gl3i1{`Q*Q0|Xrx5^z z3M~f2Gfl@U9qAr@;OXjOJ--*zxVqwohsU|(?0la(C5`1Tz=9jRDu-MXNe>r74}-_< z@T`vq1YnT2_qfNWuhAz<$(&SGg*MzkYePmp2GJjgJ$AoA1-~yxHcZcKA>&SOU}h$} zpKnk`kU6HkH9Dt05*o;&JTpKfbs&(`*kEyk+Y)$x;monQJ8oKR!#aNpf&?59_t12X zrF!e#Q7XMlC3NE7A#|fTy(d+zT#o>bT*Z8ci!ez)PuBu#HIxkuwoRkD>*~f8RkS6^ zKbIbN6NvniD8*3ojB-=f8i8wqPB7-tc0g6@k7{->7iv#&ZVzU^*ag%{OyCaM3)vmZ)TK`msJUw98uT2lLtlgEU<)26ii$bn9dQuAM-u6LKGW5e}mo+|{l?Pw*rWYk+gAZeX zWzAb$+}!XkSm5=>Q5c_h#v=yh4E>9zgUFNKYlyrKB(EKA4sI~d@!d;TF(lUs_9;v@ zw=i^_NcMq76&(S9OD@>jN%9ef;Z}g5X0HH1F&Y?9-&dnffe8C^5?{5hLQO30 zk3ZBQ&40N{h>^fJYHI2iokA~xmZ-i43-a?|E;6yyvP4R>^XH83Q{#KO`s#G!%xmJ;N6S_TK zqt~1dWk*S@=mlOUrT3HWn@%*fl=8rN*YPZpWVq;gJ-m^@d^3sYS+rtiYI@3HV-rdo zWSEbH=6MAcJs)n&rvNGeg2CBLei8LL(G>&ZvZtiz1C>jvq-)S)U;OE?Zm&c4A6*Db zPycQ7MQgy;DkCCq2l$SonBo#vH-kwUGBn;?$Vs>$=ReR8qe*V}Mp)neqwaZPUakgr z-e|m6r}$1zxp3)Up*?+OuzCTv3WYJ<;PM;?ryk8vGO}1pFp`P!H)Hv(;{)~M>%kHG zG_|U7rE%IoUxkcqFUDDNtWjCPCts_e3J4khM9|t3oVPdGg7>@-K4CknSlm~fG%IyT+VIc zJ+PP%#fG3cI)Hk1IJ#%P-SVhGHaq`dD(=q#K2RlzUjEx${Z&+yS~xt;XAX7^CmsmV z$i~U-F_ZIzvB=j!5xO~+RC9|De!#L`t`Yi$GMlP179txQUmsC8s~iq`B=& zNL%7)o&)~apI?fETH5HZ|8{C|Q))9o`|qKvdQ}WCNPwh`t4NVkpin0P@tvh@c2IUv z(FXyNMeEzF7ywgTPu-l2ta#cLgYr%0!~4k69=b=Se5)XkrOCr`g>w$ou3{$V_a}ly zJnZw&uu;C(BpFfDKVVMj1B)+>hf_N2ds5Kt(`gam3xaO3usIbpnD9n8p-pcl~0&@Y9SvYZVtP~Qv-vr*`p7B zadBizs?K>1QMAC}SRboM0O>9JWJ?#5W;vF1fjzQ*!Nh%9+`Q0iC>W+VmO$uCc+AwJ zp;N|Y0FI`2AYXZIGO00?QQ4a{NxXY$rJUw=Xkczudv35`M>9fXLNGLN|6d@x$69j6 zG5!HXFt0weIMzJGA*10~zJ-Z%fB?xUI2!x_?UCR@KS2z>jv)FzhBO2rQ06+PPkX#z zdgKc}&TOA7D6*~Ck#S!t&-pzmGQ6`Z=Bx0*ffcA6k3%IyTyr?k4TomrrdvAXp82M+w1!>B)0i(3r$=g^(9bdAvx&;BxSbHAzBkuu-Lo%W}Ai@+4{&Ml@2h-Y(oIU^H$<;#q=fP45DWhFN?q41m5 zTSkANioEa%?^b>MxEu&(n}QBjG{5X&FoW6QbB2U$y#O?FAN?2LQ;UL91ujEVvdeQ3 z!=n+fY9!;c`)CuDA4;d@Tf8#7wNj$&_+vd$b*R=S=pC(vpo^<(kv6~WBL41f{rAzb z%b=u*x|Rts3g-dLq_hepWYNBB)k}y)%JHU7lpw)%mmbmRPiZk;nYF(8;gyNVX&egG z!dxJn_DqMwtK?`#2_63+yL{PCCQutbuS7rm5g8V|4nf(d%{wvN7KZhkv)gME^3z2< zsq*Ykzui38Uac*&HlkPiAZm4g?Rbl;7-&IVWzvr?5i+-`Cfpeu9{l>KNcasYoL2Cs znCU}~2`%^8kXagy-&w@Fa@}>Z2bTIXTgq*b>r=DRDY6MU8|uxa$Bw(WFkSkxG;ncw zusTfG>#~7*YZE$0GrbA!*?WY8vopfj_;aZxVkbOZ2T5)=QvA8mh!HIcak@uI`3kHZ zuedH9Q7 z{LA)2&kI|#cl4|<-cx-K%A+qcY)i$rHZESQblLBI$}8Q%{WxlPXsEiZz7b{?e74JI z@6sQRZ6wD4fwD-Od)+D_x+<)H{pX#-0w0lENw=`WE5L>dgW^%zZ+TV1=ZyMuQC?|j z&knGOAn-vrrH&p*J`d0jOh`*sra&Ac4<1Ap$(YJS&%(3jRTM^$+!ESfE?6kpLvzUC zP7bN-{$xUeJ$kbHz-#%6g-i_fRg>yY9G7aL;Eo!9;Nbb{*v{VNF^0)dxQd6zNDEIcuQ>D5I#B4T>f7H0N9o$xPu8I)X;OAR z8`@=#oUfZXXP6SMe6cZI+4OG>$U^Tiu`XHg{L)AV{~<$*r~dimLx$QbcpmxCU!XU- zGfj8IJ+GwDqW6beTTM~0CMCnN6{6CX+zsuC)&k&vrDEaPWgL+U8RMZ6 z*4Q<{_>szr3jJy{q5SsdR`YIKC|wVlJNdjMVA}r_#-_h^o^~peKXxo&wfvfhkfWF4 z&y6=j^FGV?C`&umU3b)kCjBu|&DX5yMD{3%;~3ThP?apgLmS+cPn45?SZpHe@JFtN bl$;28hqjx_or|)=fPa!=a-uoHPhbBp_rg0= diff --git a/docs/source/_static/images/path_01.png b/docs/source/_static/images/path_01.png deleted file mode 100644 index bfdb76f0e61aca9495bfa0d7bd3b160ecec04448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38339 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 V?$p6H3NZOe&e0xYS7z%I_ZN*56wUwu diff --git a/docs/source/_static/images/path_03.png b/docs/source/_static/images/path_03.png deleted file mode 100644 index 8667d23b2c8db5b231d18257f2bc1df06ef1499a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25667 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 diff --git a/docs/source/_static/images/tools_02.png b/docs/source/_static/images/tools_02.png deleted file mode 100644 index 05b2209f940547646032b9faf62515f3b0c2ae5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7093 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 diff --git a/docs/source/_static/images/tools_03.png b/docs/source/_static/images/tools_03.png deleted file mode 100644 index 2d3bc187e8470c66b13711abdedc5637d6998482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7041 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 RQNPE~l;t(#s$?v~{s#?&^i=== diff --git a/docs/source/_static/images/tools_04.png b/docs/source/_static/images/tools_04.png deleted file mode 100644 index b8339d2f556ce5c4851872c544359e5fb52647db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6524 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 diff --git a/docs/source/_static/images/tools_05.png b/docs/source/_static/images/tools_05.png deleted file mode 100644 index c14e7c98d74738572782277e4794ddc41c385af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6832 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 diff --git a/docs/source/_static/images/tools_06.png b/docs/source/_static/images/tools_06.png deleted file mode 100644 index d6d79ec36a977179ec20216ffaec8b66fe898827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7456 zcma)hbx>SS5atF*a9u2Tf&~c#cXti$E{j8u#WhGEf#B}$?jGEA7k77ezy00SUELq| z$Gv**O}%>G^wf0Ebbs9wrlcr^jzWY2007Wsq{UTWZ4vB=LizxErNIF?juyRmHnwwCteq&{&_{PNxyII&NloTk$RMqG)flUAaiHD51h?;xa zNxGXB?%e8tP%C2<TJo}FGeCQNN}Iq&pP}V%P7E((cpB<34S)O@np76@~0IDXqN=r2sL!X?(@GA zcD;8=fSBp?UtDC1iKJJP)&3i~p8HxiN=+rd%L%_Aum-46xyQT(_rXbmmG zM%^7FKH5FqH8QcL$4AxyS_0JQsr&l+hWGc2TAg>tmuj5%#`T5SqcjsF5!fZZDh7*Y z?>oI7C!3E~jFDbCIe!_QC~Rs%ikDR%qeehDjMQS3WaR9Ij-s)#eUy=Li)nQ^c~t~~ zc7=-M)bo*kAef;9=U70?2Pxufdf93DN*%uvxF2GLi6;$>icm3~Ut2$@z|h(h-x0Xs z?I^n|UqQu6>~xHS4rZ$FGeGkBAY5F0n&xIN`S+iD{ci@NDW&EY7Ev~FEnQG9ucBo0 z6$%y8SxKsJ-uYC7yk4aSH#ggu64O!u4i8^%)AO{1-V6e8py|1w;h4?-2038>AYL{& z)|5?3_|v;QfARey)P0}{HjXg;2dd#19OEoi;YuYs_0PheKZtj87y5T(tI@v`&v%Q- z;13|F%IxxSdx3*Sg*^0}SuB!Y}dqcGU)Z#qa$G&ipxN zEx0BlTaZhV|i1+b%W$0e+bo2#O@%?G4Bj zj*qRwW0R8|DKGKM+uG2y)08y&j+Ec&1f(1j@n?|-B3_qru54XfJzxp}on9S;zZL)t z$#GFo?Ik5^P4CE9Sy>nAd}y7T-}i)|O{XQgGN+Fo+X6C(`LPhaycG1T(H#W^TDBm$ zeCJf0<8?V@2s5-?h@#r!4V z1mWJ()Vvr#(J6d2i2-7@dY@|Z8^R^2fRv|jl;C|mp85sXdX2TV_F?k~PY=Dbe;mE* zW=!Y0SL1>~qkQ+=koMemV?6QCu6pRm$i!CRdVLy?S4MZYD8EhjX@<-7IhQ?? z*$|nMag+B-@DcN5sjedGcJ79FXn1&*U&YeY4xN5*aB%yD=So^eL5vZfk}Vbo4=AT5 z&*&C&dMUeZ2H3>G0qjpV!_(kw(c9e~Ex-eTKonF|8R;f?`fn9ED~uc*eNbpqf0OJ( zqA$~zFWb2fnb>&1(y-x?3EFFG?$7bk44HN2tG~{!hAiHwIhg`@GQUbv;a~#^A_LP& zorS#5lu`VYw{Dq;qV87RBW4W@fP*5JgC;hVdb|4Tw+1F)4-Yg+{JeR{s z41dE}2MTHqbS_Oz{P9;nv)(vNxA%fylG+h5*_`&VaGg-6PxIj?%Vc7$?Xbhd+3hxk z^}OLO8Xe%zFQGDMALk?I)}FBZE8iNi+~yD?#h|#Fc)G5yim-X(ga!F2ct&UFx5h-L z50w`YF0bev9mfW?r{lkwb2M;rdfyI7Sx5Jm`c>V!HZb0s;bXWi?rD-CQ>Yv$W9zIY zq#T#btEj6Z)i%_8{x?DF@9X0g9h1=CZ^suF{&&|`k|rVH5@nA$NdPrDIeFJPtR@KZ zY407OpbG`Q6RKJfA^-ZvS^Gs%S4Ade7M40Yh^*=*K0e-zWo1}(wWouL%J}MKhsK%L znB(Er%dbedZ$*BFAsA!;|MYfrvQvAV2emcjca)UKH2pLw6a6@*;Smuw&zaBw+D3F8 zV8ys1o}ioU+TVzLG0rd<87-Y*4#zS5G=@+h#e+S4u!IDl?Eck4!~4xS-^R>*kD{?k zm?<$fK3+ma#VLYwMMh(wm0Lh1wM>?kwPuk1DvPn$t(MtO%{+ z0pb83T&4*A)6T3$!p$&2yKUfXA<%GyTlIl6y}EikyJ`4@R~3RtEmBLPun%0bH{Y3a~EwbAn9qr1P2GG-Q-SZ=+hzmBtJt4LM8%|Yi?Xcq&Bh-{N<>_ z8>yF-_y1H)G`C;t>Ce?)bDnm0ibNf4cSJHx3axU_Wr}ksXS6!`Ix+QWW?=weDHa7Fc z2l{86TqEMZG1tXNKEmEsn9cku#kgL4x+NWz#j6%(X4QNDK6$#H$m@06ah@!{7f!@D zi5?m);V!Is^MUt%xcX+E`VN{vYbUEwgf zxICYpl+?7Odn2S<+zx`Y7%OVOFV>i@FvlM^G^m}=>|K?fOYl)ex_b7oI?vL^cek~= zna}b$Xdsmizs_{oXzQN}HptUZ{+^d`qGJNWlC<%z{k$75!NR-k)5Bw743HhISr%@Zam<>n*$=;)~B&dkq$ zVOtE#Ol9cF$sY}U1vArI@0>QK&FyJvqSIsl)aFvAFE-{^Rbi>BssfH}?X}5`t!fXVCh&dC`E~m7z+MZLSaDXkpB)5GPvQUFk3#8PyCl|svXIn-E3pyiv*wWC@Fr~#0#N=BEK*oQ!}TN#fh=r* z)ln=PXWIF9b4=2h(1rH$*f1?yC4!Wks#yUJFOTlJu|-H~1a7Y6>rh&!do>je#bvIJEwYnULF|S$Q@X?csg4SZ`yn{bVlURP$bi8`m{?bk5DNE(k8*8` zpMb*6&24079xQ4MfM?6b%iF>&ZYRSv)Nfv8uN?lu5+qHokwYTcW_tvX z(f*&<0s=qkV7n=RAAFq2P>X{y3+hb8z4+R35A!azlGuIq zOjElq)rG3wCXGRU_v9f$Pqx8LrN$fH&j;S1v5cPG`mU5>znYpFWFEJ_Tn1k8)uxg* z)0zYs8NTFve7Yp0se)vM!`Z3ZwBmXzPne)aKBq@v>C~HaP~0o zPc3_XmD-(1MlYHJ!zm5!;K4?=x3lXTS0EGYStVMH-w+Tu zq#7@&QkVXCbk?`j(;A&to;Q;Qv~7#ZVNeBk7nCoZA3!3#4i4fsF-Um3p?;mRYh7Z= z+$ZL~&kqE@|NLP{7qVVPP=QP*b?$fab3ML?GxSggX2vECB(5>;_0d80g62BNYo4>sT7zcRs;wa&fXh=gRjCE620W*0aNjxB?{pBt~UsR>qTaWXIyTyk=P9 zpGD>vN@->stmph;d{?hjcxy8fcD~exOCsx@!-pEuSoG2>30i1m@Yu<>n%B~Hygfrj zcxebJ-Pm9>Y{?UC$=fz7nD9m|1Sy7-@sP-Q96ZWAJhWX8yTC#=7YJ>4mlcDIXZXmW zbL4krN1oRl6QH-Ze{=IVye+}?N2I+z4|o^t0vQ?YBR3WwG4X5Twaw$r$=Kjt2E4Fw z@%rNpaeQ|>KYz)nYQDp|@2D&A1T*|ME`L)v{vt7dSW zJ|B2@3v;y+s{!;P2{X@phm}A=KB}nzpCv_Q2Tv@y2IAC9D;}V?e*n^9x1@982zLBH zLBp95@RBKFVus-VeImpC?l@b@K8#DUj^@N zB$*1Pag)5pLXFKhS#kGyLQ{LayVdU&ZeEg}UY9#vmhGjdi;a*!M}P8`Su8QnQ7T3SzApjz&EkCpwsqhJ`G$+UpZ;cjGd6{ z%0{z=AnGo}vb{DN;xIm{dcE_KIO>5>#%~Z&;xLs1W+S5g@fn8ct za?*Iz4gvRDHs<%?I$%KoO{fI8w91T?O{ekFWc(Mo#&3qVbWS%%V~1Xjn3z~Aot{lB z&F*d%4wk8dZ^|GLsGQnJ|D`C*Q~d(*^J#Qc#)Kt#1MEoiV2?7E!r8SjRNcL+W`8nbJRvA2BZDl` zSzgXr*>sO^OU^qwzbB=sgYvBW!*($)X+DVv0-cFWnOro9M_HXGRGhr zdrXgOIQFzuo12^Rz4bP>Yd45uh?qIfg&5$L+jHZI>brH31fSNJqJ2y6_V#G$-XH_y zo|&284KZ@G;R(+>(#uPfd)FCElD8wOl~&iT{{9e~xk~5fZ93cXa_!e00xh-bfAhKL z!*#+KnL%@s6^L2Y!6pM*Wi>bEn*nj$9`;=4%)n&#Ixz5r=yHdoRHW*v+ z@^>P?TdVMqH-K?W!D^~E=IrkP_Imac`N%A3YYEz&R(*|RKns_{xU<-=s;fI8X@%Bb zURS%LX%|FWhVC8XbDTJT9_$z9$`-1kw`dg|&j*$BR8;wwR}Q9&O@r$a5)!=Y@10#= zs#8@zSuE5#2qkN4v)e4jRp&}!b9>}~^i&dIwSsCUOO6rEa+9a=wV}b$yy8Ik_UD%` z^z_|Os2YP%i5Nm#LTapjp}L?N{Wrg(Z0T@Fg4^%S3T7YT99j7T zUfz10{Ivb#gAftXF_N46(8@bzi@XkXwZ4*)pXHj(Y|O~pNqH(dex-Y#p;m`u*_%#6 zC27KV&sHOd8nDM8JymYRvZ>If~?IuqAJ`ushB0xJg+<3SxuU$-7Q0k0v(hN zUmgt_#69^{ijaW@lVUHz0_u-H^Jb@UDrT9o`YDW#SB~I$WzVDnd}(R_!V&#r&-dgm z_kD&u49vy=94r0!DC%p>Vt~;?x&@phufr*7Ee|hy&Izf>H`vCDr(m0@RM8i9v!qti zB&Iu9c&MlK4$m{&p6-({@DdH6#VJQv%x$Lbqn3?$%l}mSI$~lI`Xeb2JuPRN+ zW?|qTmasFa3-yz3sX*PbNp`wX!6Cmj;PApICg+k%tBcXiBQ^9Q6n1Vb^oV_G5CcNQ zjw)}d{iHTkYNf|UZIHYUM_wRb@-N;n(r0xXwr~MU(^Fbwk<9B z$7fY|dDR6z2KgH+MGh-VOhPe&`U}`~=u%RW2l|T4eipc{%XsXFW%)u&Z}8WRWlCvS zU4xdP^#WiMsX>KB9v!T8We*j`cRe{7E2wy_hG&v`viOM11BbIYI`dwiLYm?jZ^w>9 zlst(9Z%*GhqveoLjt37y#b5u*&*m%4IMMM2L+0#(xbqib9y?m=Q|@^V4}JExLA0C} z3(;QyEnXULhc+HHDD}(_OcI4vC)en^7+2eU_AQxR;=)26+a^V}L@DM{IfLWOc@9sD zYq4*qdMk*JatH6-{<^1&A_fH^K z;9}bMPpr;=KJwxf5#6ATIM^c5($!*V^6{h#q^w)h4rmzM998aEXm#Mkit1S>fI@bn zNrP0btRz78EV=J~Q{x5d=sNpk2>A_IV7t&quS2-}5uKsLe6ArHK%WwUHKDDE-(@vEg?)VgWiNR58XmGaoh zG!;@*XFG=+EuFWJ;esZaHCJf>msR?`QnI1Iv6;{b&R^q%4;5~PAWoJ#3*W+^!gus_ zS&y5V5H zKDyk?1x+*y(9E*{NaH6J_0Pn7?GTKxo!Sz~SBXC*CrNx^Mhl?r#J~bj{G0gZ7ZpOO z1jZKiuWa1Cw^~xn5WHHi4KU({`?|B89M#V$BK(U`o>)!Y-hq4Pm+Sr0BVpRv2hE=! z_^H!#OTP6k_81}PxY8bMAF$z_G9EZBb@(7opc9AKICGJtr+vIURsv1D20@`vS*u7g zfskOmuG5uPhQ4$@Hw?sIG~pyXzhU*i^aZI0Q}`|;gvF@s-QCN@@VR6nLTQ<>7{9kC z^VJj{Agsbva@IMpG>}Ls6*)^+IXEb7K*;x(({8cK_k|b6UBRHjPZ;GN<%#Rc_72as z%C8KL2goNtSG!|nI?XXdv9#);e15O|ss$flBo|q)&HWv%)BtNB*|F@2jG`iFyJ%{D zak0kk2;U3@;;p}dCSwHxi@V~oN~SwwEkxM|TJBLJL)YiljaJ=#KE%>|FT-7HmvZ|V z=ts@P9LeLnrxD8FpsC@CZ)!j&=je#d=Vsf}KPy@2nxJ3(T#x=P5Zh9$+VjR*UOwF8 z>7=nl0a9y$8G`n4bhdnHaHO=YNn2SNJC;V_6DQN(lck1@O_eA9*PE`jxmJ-&J9#vz zto$vxLwd4wySd7>e~=y^gIp;Qlqv@8fJ$Syl3@! zEG^S*%&1KKYJ;T<*7w?nH$lsv&|Eydx;rg~NX>iucoXuNAlS@Rm_A(M#c!JCm?jZ% zqubapyk4!g;%$vA1k3j21fvpi8v#)9z56TlTU}n8R*Kmy&`%us;y0FM=y%ixd7gbd z57{Rw6PP}6aV0iqj+@?{3S6JApdun7zBapr3B4`<32YZwYP6SNN}NlIjE=?@5qj(W z*EMl@c>R%^j}KCQ6#J$lDQ5Cby{%w<(k?ql_B|(OgY9Bd08D7#>}mzx$!59tw*qyRuY?WH`V4A&;?YO>GmC-L3jq$Lt$cU z$Y5qZgdYVvo4{(S#?CZ#YCjEw=a-??2{xGWIn2*W5oCXnvQZ}@=a3EiQOe`n!WAe? z-R0jl#WCA(d&A2t@Ks_U0g5g}+Sq;r=)tyJSOFTIk@2?1Ix*jzQZ8IJ@%Y@5_^y7S zR*8S7eu2sDa|=t#DYA&sERu@7i}O{Af2C&7JhyqRFR8lK|LQQpQg2JuBsQ^^T;E+l zQS#IN&c+fw=XhlenFsB|#SLM_6QG@yOWM&rkrQ_J8v9REl(jiQ2`UIJt!6vZnRn>KRs-J$UCQ3t10T-JL8wm*sSMj5)7NRXeT=AGM5O;^H@?J!P z<{_=9gNZl-Fl{0ceNs<315a&NTTgFGcL0(d(A5RN?qTf?002GgT|JLcJ0uW7?Ei#h z+yR!J4z56I9S0WxlDxYEH4i_vJiv;Yhl_`YnoCdwadHb#Yp7DoXzSRsyy-(2CsCCB zpyQJT&-ONXWA`+$+QL?yY$}y8g@#OIOh7(6KSB@feQS+6VZt$4KeENaU>7w>cg_2l z*b+?=lc3Dk4^$(xjw9k1U}K`DL_G=r}yqrwj%zwg=w7q9!US ziK9gkDZno@;YgKqzuSzO2zY4r(_tFc)YH?_){Zf%1a1+apftZHj>eC!tZu0586W?# zyiD#JcR_Vyq^LL~%(tRVkJ5_d|I0)|Xv^=6tf34BZLOGT0>2c)i8`!} zvPy2KDavau#|ARjDh{(?6O@n0QNO#0xdg2638YwF(3LG3SyF3t?w05};#1?J(pXYx zb-vLk)j`T{CZ#+l*jho2FlcmOjgt@M^}g~%l6ZC}x(^cXmI=JCc3vZwhidp=QHqR? z=UgWy`G=@+aExXMgq56B>-9K0JKs!Xxb7{8r**W8tPaA+(Q4$A8S;nVqCwl4pI1?< zH}0RIWUklksBeh=*zO#O%S!SRMafPDKrbac9%ft*7lPuGFFaXTSx+yo7&<#xH{@S2 zmKaM#J9r(f^pwpXlS!-&juj{w;_kzGUQtCCvM{f@KC`1%-365|!MQSngj_+U{>gsbunyveq;yW>G<% zF{pW*xwv_M=9QFmPLEZNaruji5+qek(+bTKpkrOmHbw~zGt>j7=QU~HiaN@cpB~xy zN<2@@^=3ce{>Eft5ySbloKU!_1BEZkxw&CUI{%4P*&e)cvnHD&T4BjAtiTB#7>Mof z`P25kA~&YG`U5H!IUgQZqkJlC#$QRBdF79{^k=@fd+i_RB%Fen?)!v<>9-fj;ngeR z{#i*wyJAq?U9cSGh2FAwc=PQAQKkd$L<~2t%uHGPFhkgB=33WepM-g=0-k2@o zr45%qolnz@JSbbE@`k_Yob3xMRabGgEp}ogu~p9;j(ENyK`7BOs&QE^8|Z;3M~(t9 z$kyAS7Tib@W@ZH5Zi~Q;danNli|3uDSK~6>G3oL>T9Wudfq4)%q~s zqK8HHSslU)3k!>q62ap!%b8*%yf1^lSFjfj8V2L6(y(L5$+G z(S64dDLR4#a6(i>Cb{xTz@u4K%V1L*8tUnt^7$?)h04R$NC442JHi+Y)R>p9&(6$D zU!5r#7ef|hg!}puj@v1C(81V|ix(s*3FZtyO;_nh%&x&N25`>xk=>N_M*Ii`bE__z z6p8wTo(lphJg+XOX?deZ51o;I#QYd)nxyqPy%a>gxp)Q>{`KC0g+RNFtfsH16cv>f zXcA8D(A2E>M^18o`i=jjh&h%$QL4Eklk_2h~cyhY0(%qmnp4AeZZ}O$BEwHXBl>nk;20`kaTWYy2(7ha} zOlhm^LgPM zcCptHYPqJ`G}7YnzoN>|{Y#7hq_wTR4@UCDOI}Aby!S7VJnY0nbR3sPSHSS!E4oT_ zdKYk_?l9%lg`i!`FHcWmWTf&9T8h$EJg8K@m^B6!pAoBcso6DS;b5I^C+T|CArGhd z{jbK&@QoDo=#1=_l=C_0Rc*_gCd$yN*vHt}nC%!i93GXw z2yg6#ECnYeWpx|N2?-AwKK3z^#W4|_-i@5!45XU739pgaarSy#Ne3jgI=i?;rE{l5 zR%=uOie=!q_I~HCY@mqYGM4rSKX%r+UIEYU72`8OX+Jb4a|XiB{P0j&8hqEMTL5Um zJ2KQMYJOp1lD3H)v4ioampQ#g>|PRn&y>*PhjiW@&iL#kWy4=6RGgge_NQMKX+>35 zvLgW@*#^*0$o{V%hJW2CBd}9L&rD6<-1VX5jvI9Nw%PNFOD6&Oi%d?Icm&jlwDUFGhb5*D+^U2@*rO@Kw&cIF^ zQ4y5a92xt@8b!fa@9UY-RbJ((GF!M~=D*<*4vmcs9@3nf#J6F#5W$>n3?6!qJUIT5 zA4-XWg8LCkI^sLue;)tet4OWRO+4BEuZyOMoksDM31RO;G73WkwGwiY3|unZliF_^NBRK9Okz)k&!w(uW*gjxDVsIU zWO)lYI8 zF|Xg|CmE8i!y4~TS*}Q$-{w6oiR)m!+IogEscNw}*k`>Hs^P`aGSSSAx-7s{R>fgv zn)h|_$*ootMFe_dM`OJbz-!YiZ|x!-9=G9XoTx~PN#n{6Ar@NRmy+f=KOM@;e7sha znciSSfd+Q=+GFqhF$Qk^D%5G{V)t|kEAwr0Ab6#D3cw$iH z!?$nWun&)n3UzaZ{hYesO$JgYi9I%{Gbj6@PbzOIN>ZqeyLCALjy7CD8C=1wJVfHe zRF*yI0fFgdyqS&gT!m{3X}>FHN%xl~>S`Z2lCZwc5VZLWdwUhtuBX0{zc{z{F*gsi z!Lsiq70)M8fY|T~3jAOdMrOy7B8WKEpX_}a|Ce1Q1z|AZEYynx7aTA2?F#@9$5)t9? z3%$xt-Z2M-y*y1t!i(-34SEu`mEaxIU@)S%rWRB?lg_)ThaQp>TOxTx3t5oN})1#n(x%G4O!&elw?57x9a>0%5 z{b6hCf%+VS+>LxTotcyM>r~Ro33a>I!j*BT*_3@Ysbx1u(uVg~`#wUQ*-Kj~qcJgd zo`V`Da9q*RyA4Q=hMxX;Z!c6-$a~sHg~xUqM*z4oeAZF*kG}ox3b}Ck**Do08yk5- z#CYnF`nd#m&!T{IBVlP@0>(?%OD^e6x*;JM@_zMwu2$(hbR!67f3>5}tbs%9aVBYy zg7S7RRot(3yml|1>6&htro1GPvHPp2=OlY7Q7=HZW~)|ur(RFb>Icrj_*NFr72Wdw z@5_ewM>7t!9`0#8hJu_6WLl-k?s9VX_~@P_MMk)sE=|(Uz#mORq5{1M`eq|l4!WBu zb6!ks;{9l$|JB?sjX9t=U)Pv%ST#F)*yLVvk-Opud;(IyfnW{f}7o&2<&2Ec*U6 zMy<=hGlI#gP(1sTyCHx&^_+x*U`qRZ|JPAhSHNA@>MdXbr1tCuZf!NGaB)UZ;O$F& zbKCWeI7`#(Sotr|Nrxlj$`=v(*Sv0@s6)Pr9t6}dNgC5UW_9M9t!S4+?eOPCg~sRh%+uYKr$PHiTUK}>p7c%8{jvFHWVFUKx$2$-fbJM~Iz6i_ z5uxI2P)oQqDP=jtxLXw%F(cm{R-x6l#cUDaNeF5*_7id} z8~Tni{gz~OaBlR4@6h*ajr8Crgc=QgZ|MCe=C)3RR&UV-iW$X`-3&So+C|*>^Z2g> zGn+TbS{hc%{;000`U#2pqlaB9@(nUl&%12HA3*LRBQ8Sj!b^Bp_G4W)Dgh>i7w16V zFQ~}pMW{qM8T^xhQR)+d8I5dArGK53-Z|yp)3h2+o$YEkv9bJ)diUeXIojz~%}J(? zog-?+ELIj>gmmi;CA=ua6pdfhoI*+-#O%*mcrcgmb#tpiMtWOx2m&B|O|4fES$4fl zRx}`-j@!TzegJ0`t7jT*1vp9!RN2-s{LJa1sv_cgcYTo)Xd5i5@7{d2@Z}BCix<9* zDG;5~mI%?Dj0x~Y6dNg(r#UeV9zyaExSy(VdnknsNKp#Eba)m%3CfuQowPyq`qo$% zC?Y2;hHj`=C^q6WT#N<$N>Ni)cl(iogs1gQshNu-OB2LJTGx%Nv6WeF*XH?w%PiKa zDjg!PnK7rPCJ*vUeT(=<4G62w?~=W>J0t)Bi>iM9!nOA)$kOCz$X&Utx9t~?MDEJT zH@}8_gf!|BtI8|3NVNjs@4sRPobjv9Tq9tLF_Px3Jzzsy9nGh=Vg2y79y(}-^Srlqhv+>^-Qd@-BUvO z`rRjdBK%kO!{kKxYGL`UAJX1G-jOdf`}b7HVdXM$qW;}I70RdSj>LJ*TPt^s(O_iS z*x_OFY?>yz4c|eJ{8rscm3JGhwZRgJ{n|wc^cz|*puT+TjGWfNbRgtMGd|CNxru7m_?Qo`4+sDU;$6?AQS*d8{u;8=?-Qp^r zj}B2v@I5!D6JZEnG$IPR>8WeI8)ikMX6+`w5`R~JdPN~tqH8uZG$h7<=^!mFZO{Rt zgu!5bb<+7qM@qh+_K%5s^u@JPnZPD*gHcJj``cS;6`RI5zswvz$@WE8^ zqlJqz8)utPPI{d!-%BbXd+M4RCrurlYM-G*2Fn;Y3p*=dSX;ZawAA(<%I@h7FVq)3 zsG7f7+>Tv{p3zw2e>6hckZSZO-B58fw+cm=&ng903+KPWQsluQ8vV@K4uw^*Y*Lw6B7#y&-|wpqe=!E=V~rGn{TrF3*_kNFAz!MBCz#z^ql4u!oh;TG)6d zDhcd)kg@n+=eaLL?EP)9y323uJSk36Hcz8^6JB(<{3}|4it=kj1jf#I&Q5U-2vHf# zuFMpqO&VGp9T*<|#&2F_buqts`tb7n^z_tHD(D70)14SI)o)kDc-J2)mrEIT?(->0T&*bEny=l9| z^zJpS}tziaJEX zVfW-R++6y7!;O(Vmg;cqP*b@&K5>_jWG=RCv%Q4Nd;)B*5c*?jO1>WvP?FL3??gVj z@{%=T16PvRuQN9o)$#Eixx00Yr7i;_5Ixc*v@iYx4-uhc{)`PqynGkb`1m4`CtY{t z^eV`8koLzAnUBg!osuOOxwjbNgN5|wJ(5Db^R~;Zj@-FCP$J4A(EH*WUhpNKxkAbF ztIFkHo>pn3y!^x{q`jtGc`K z3Gz^RDfJSzvTJq={50=Otxg(EEJRw${~!2f!RNvqV|TXdECX^nda?mMA)ugZd2)Z` t5xGD8Pe-b=_U0Y40wVgxK~K-fztETok_KO;ApWf&DaxtILZmIe{uir{#lZjo diff --git a/docs/source/_static/images/tools_08.png b/docs/source/_static/images/tools_08.png deleted file mode 100644 index c024be8b1853e7af92492d4519274cc261be550c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6318 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 a!2k~UX19fo^CJFN0U+{fa+NaX!T$rq9)RWm diff --git a/docs/source/_static/images/tools_10.png b/docs/source/_static/images/tools_10.png deleted file mode 100644 index 574e876c8c350a5ce564e2ed94cb98d25ff11b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7762 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 diff --git a/docs/source/_static/images/tools_11.png b/docs/source/_static/images/tools_11.png deleted file mode 100644 index 2216842dab4de83b5655fa000b6098b102883ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8078 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 MP}Nl_SF#KLKVH=5bpQYW diff --git a/docs/source/_static/images/tools_12.png b/docs/source/_static/images/tools_12.png deleted file mode 100644 index 766538832a55deae9089316738092a0e062cfb58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9571 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 A%m4rY diff --git a/docs/source/_static/images/tools_14.png b/docs/source/_static/images/tools_14.png deleted file mode 100644 index 984dcd04af079e6eac399d16faf2aa88a274e7e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7191 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

Q>3qsgdtk? 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 diff --git a/docs/source/_static/images/tools_16.png b/docs/source/_static/images/tools_16.png deleted file mode 100644 index 1e076eee7ae599ec21a5e47b11210183d8883e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8098 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

RX5jg+UTMl9AMZ^2y#$XpfLXPCqG*EHxOm6IR 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 z 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 KMNUMnLSTXs23#Hh diff --git a/docs/source/_static/images/toolsdebug_02.png b/docs/source/_static/images/toolsdebug_02.png deleted file mode 100644 index d2e96024b6df755147ccfb90306e589104969504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19985 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 D!IW|F diff --git a/docs/source/_static/images/toolsdebug_04.png b/docs/source/_static/images/toolsdebug_04.png deleted file mode 100644 index 578eef9282b7c4ce257bde1e4c70c94f1aab7d74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19375 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 Pz|Si=71?r`H^Ki8_Dh4r diff --git a/docs/source/_static/images/toolsdebug_07.png b/docs/source/_static/images/toolsdebug_07.png deleted file mode 100644 index b86c23a9f215c1eabc26685304b8412bf578eefd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83119 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 C_koiD diff --git a/docs/source/application.rst b/docs/source/application.rst deleted file mode 100644 index 8d4388a..0000000 --- a/docs/source/application.rst +++ /dev/null @@ -1,368 +0,0 @@ - -Application -=========== - -Remember, always import library. - -.. code-block:: python - - import easymacro as app - - -Create instances ----------------- - -* Instances without context - -.. code-block:: python - - toolkit = app.create_instance('com.sun.star.awt.Toolkit') - -* Instances with context - -.. code-block:: python - - service = 'com.sun.star.awt.DialogProvider2' - dialog = app.create_instance(service, True) - - -* Get desktop - -.. code-block:: python - - desktop = app.create_instance('com.sun.star.frame.Desktop', True) - -Or - -.. code-block:: python - - desktop = app.lo.desktop - - -Fonst ------ - -* Get all fonts - -.. code-block:: python - - fonts = app.lo.fonts() - for f in fonts: - print(f'Name: {f.Name} - StyleName: {f.StyleName}') - - -Filters -------- - -* Get all `support filters`_ - -.. code-block:: python - - filters = app.lo.filters() - ds = [] - for f in filters: - data = f"UI Name: {f['UIName']} - Name: {f['Name']} - Type: {f['Type']}" - app.debug(data) - - -Call dispatch -------------- - -You can call any `dispatch command`_ used only if property or method no exists in original object or in `easymacro.py` - -.. code-block:: python - - doc = app.docs.active - command = 'Gallery' - app.lo.dispatch(doc, command) - -Method automatically add `.uno:` - - -ClipBoard ---------- - -* Set text in clipboard - -.. code-block:: python - - app.clipboard.set('My Text') - - -* Get content of clipboard - -.. code-block:: python - - content = app.clipboard.content - app.debug(content) - - -Disable or enabled commands ---------------------------- - -You can disable any command. - -.. code-block:: python - - cmd = 'OpenFromCalc' - result = app.command.disable(cmd) - app.debug(result) - -And enabled. - -.. code-block:: python - - result = app.command.enabled(cmd) - app.debug(result) - -`OpenFromCalc` is options for open documents in calc, disable or enabled menu entry and icon toolbar. - - -LibreOffice configuration -------------------------- - -Get value -^^^^^^^^^ - -Some values are read only. - -.. code-block:: python - - node_name = '/org.openoffice.Office.Common/Help' - key = 'System' - value = app.get_app_config(node_name, key) - app.debug(value) - - node_name = '/org.openoffice.Office.Common/Misc/' - key = 'FirstRun' - value = app.get_app_config(node_name, key) - app.debug(value) - - key = 'UseSystemFileDialog' - value = app.get_app_config(node_name, key) - app.debug(value) - - -Set value -^^^^^^^^^ - -.. code-block:: python - - node_name = '/org.openoffice.Office.UI/ColorScheme' - key = 'CurrentColorScheme' - new_value = 'LibreOffice Dark' - result = app.set_app_config(node_name, key, new_value) - app.debug(result) - -.. warning:: - - Caution with modify registry, not all nodes we can change. - -Some nodes and keys: - -* `/org.openoffice.Office.Common/Save/Document` - * AutoSave - * AutoSaveTimeIntervall - - -Shortcuts ---------- - -Global -^^^^^^ - -Iter in all shortcuts. Shortcuts for all applications. - -.. code-block:: python - - for shortcut, command in app.shortcuts: - app.debug(shortcut, command) - - -If you want all info. - -.. code-block:: python - - sc = app.shortcuts - data = sc.get_all() - app.debug(data) - - -Verify if exists shortcut. - -.. code-block:: python - - sc = app.shortcuts - shortcut = 'Shift+Ctrl+Alt+T' - app.debug(shortcut in sc) - - -Add new shortcut for execute uno command. - -.. code-block:: python - - sc = app.shortcuts - shortcut = 'Shift+Ctrl+Alt+T' - command = 'MacroDialog' - sc.set(shortcut, command) - - -Add new shortcut for execute macro. - -.. code-block:: python - - sc = app.shortcuts - shortcut = 'Shift+Ctrl+Alt+M' - macro = {'library': 'test', 'name': 'main'} - sc.set(shortcut, macro) - - -Get `command` by `shortcut`. - -.. code-block:: python - - sc = app.shortcuts - shortcut = 'Shift+Ctrl+Alt+M' - command = sc.get_by_shortcut(shortcut) - app.debug(command) - - -Get `shortcut` by `command`. Could be more than one. - -.. code-block:: python - - sc = app.shortcuts - command = 'MacroDialog' - shortcuts = sc.get_by_command(command) - app.debug(shortcuts) - - -Remove by shortcut. - -.. code-block:: python - - sc = app.shortcuts - shortcut = 'Shift+Ctrl+Alt+M' - sc.remove_by_shortcut(shortcut) - - -Remove by command. - -.. code-block:: python - - sc = app.shortcuts - macro = {'library': 'test', 'name': 'main'} - sc.remove_by_command(macro) - - -Reset all editions. - -.. code-block:: python - - app.shortcuts.reset() - - -For applications -^^^^^^^^^^^^^^^^ - -Get shortcuts for application. For Calc. - -.. code-block:: python - - sc = app.shortcuts['calc'] - -All methods some the same. - -For other applications: `writer`, `draw`, `impress`, `math` - - -Menus ------ - -Add new -^^^^^^^ - -Insert new menu in Calc. - -.. code-block:: python - - menu_name = 'zaz.my.menu' - menu = { - 'Label': 'My menu', - 'CommandURL': menu_name, - 'Submenu': [ - { - 'Label': 'Open Macros Dialog...', - 'CommandURL': 'MacroDialog', - }, - { - 'Label': '-', - }, - { - 'Label': 'My macro', - 'CommandURL': {'library': 'test', 'name': 'hello'}, - }, - { - 'Label': 'Execute macro...', - 'CommandURL': 'RunMacro', - 'ShortCut': 'Shift+Ctrl+Alt+E', - }, - ] - } - - menu_bar = app.menus['calc'] - menu_bar.insert(menu) - - -Remove -^^^^^^ - -.. code-block:: python - - menu_name = 'zaz.my.menu' - menu_bar = app.menus['calc'] - menu_bar.remove(menu_name) - - -Insert in exists menu -^^^^^^^^^^^^^^^^^^^^^ - -Insert if not exists in menu Tools, after submenu Macros. - -.. code-block:: python - - menu = app.menus['calc']['tools'] - - menu_name = 'zaz.my.menu' - menu_new = { - 'Label': 'My menu', - 'CommandURL': menu_name, - 'Submenu': [ - { - 'Label': 'Open Macros Dialog...', - 'CommandURL': 'MacroDialog', - }, - { - 'Label': '-', - }, - { - 'Label': 'My macro', - 'CommandURL': {'library': 'test', 'name': 'hello'}, - }, - { - 'Label': 'Execute macro...', - 'CommandURL': 'RunMacro', - 'ShortCut': 'Shift+Ctrl+Alt+E', - }, - ] - } - - if menu_name in menu: - menu.remove(menu_name) - else: - menu.insert(menu_new, '.uno:MacrosMenu') - - - -.. _dispatch command: https://wiki.documentfoundation.org/Development/DispatchCommands -.. _support filters: https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html diff --git a/docs/source/calc.rst b/docs/source/calc.rst deleted file mode 100644 index 92c9bbf..0000000 --- a/docs/source/calc.rst +++ /dev/null @@ -1,18 +0,0 @@ -Calc -==== - -Remember, always import library. - -.. code-block:: python - - import easymacro as app - - -.. toctree:: - :maxdepth: 2 - - calc_doc.rst - calc_sheets.rst - calc_ranges.rst - calc_cells.rst - calc_data.rst diff --git a/docs/source/calc_cells.rst b/docs/source/calc_cells.rst deleted file mode 100644 index cc55e7e..0000000 --- a/docs/source/calc_cells.rst +++ /dev/null @@ -1,151 +0,0 @@ -Cells and Ranges ----------------- - -By selection -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - selection = doc.selection - app.debug(selection) - - -By name -^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc.active - cell = sheet['A1'] - rango = sheet['C10:D15'] - - app.debug(cell) - app.debug(rango) - - -By position -^^^^^^^^^^^ - -For cells: `sheet[row,column]` - -For ranges: `sheet[start_row:end_row, start_column:end_column]` - -.. code-block:: python - - sheet = app.active.active - - 'Cell A10 - cell = sheet[9,0] - - 'Range A1:C10 - rango = sheet[0:10,0:3] - - -Iteration cells -^^^^^^^^^^^^^^^ - -.. code-block:: python - - rango = sheet['B10:C15'] - for cell in rango: - app.debug(cell) - - -Properties -^^^^^^^^^^ - -is_cell -~~~~~~~ - -.. code-block:: python - - cell = sheet['A1'] - app.debug(cell.is_cell) - - rango = sheet['A1:C5'] - app.debug(rango.is_cell) - -name -~~~~ - -Return `AbsoluteName` - -.. code-block:: python - - cell = sheet['A1'] - app.debug(cell.name) - - rango = sheet['A1:C5'] - app.debug(rango.name) - -address -~~~~~~~ - -Return struct `com.sun.star.table.CellAddress` - -.. code-block:: python - - cell = sheet['A1'] - if cell.is_cell: - app.debug(cell.address) - -range_address -~~~~~~~~~~~~~ - -Return struct `com.sun.star.table.CellRangeAddress` - -.. code-block:: python - - rango = sheet['A1:C5'] - if not rango.is_cell: - app.debug(rango.range_address) - -sheet -~~~~~ - -Get parent sheet, return LOCalcSheet class - -.. code-block:: python - - rango = sheet['A1:C5'] - sheet = rango.sheet - app.debug(sheet) - -doc -~~~ - -Get parent document, return LODocCalc class - -.. code-block:: python - - rango = sheet['A1:C5'] - doc = rango.doc - app.debug(doc) - -cursor -~~~~~~ - -Get cursor by self range, return ScCellCursorObj instance. - -.. code-block:: python - - rango = sheet['A1:C5'] - cursor = rango.cursor - app.debug(cursor.ImplementationName) - -style -~~~~~ - -Get or set cell style. Style must exists. - -.. code-block:: python - - rango = sheet['A1:C5'] - app.debug(rango.style) - rango.style = 'Good' - - -Methods -^^^^^^^ diff --git a/docs/source/calc_doc.rst b/docs/source/calc_doc.rst deleted file mode 100644 index eb46a0d..0000000 --- a/docs/source/calc_doc.rst +++ /dev/null @@ -1,122 +0,0 @@ -Active document ---------------- - -.. code-block:: python - - doc = app.active - app.debug(doc.type) - -| - -Headers -------- - -Hide or show columns and rows headers. - -.. code-block:: python - - doc = app.active - app.msgbox(doc.headers) - doc.headers = not doc.headers - app.msgbox(doc.headers) - doc.headers = not doc.headers - -| - -Tabs ----- - -Hide or show tab sheets. - -.. code-block:: python - - doc = app.active - app.msgbox(doc.tabs) - doc.tabs = not doc.tabs - app.msgbox(doc.tabs) - doc.tabs = not doc.tabs - -| - -Events ------- - -See all the events that can be used. - -.. code-block:: python - - doc = app.active - event_names = doc.events.names - app.debug(event_names) - -Assing some macro to event. - -.. code-block:: python - - doc = app.active - events = doc.events - if 'OnViewClosed' in events: - macro = {'library': 'test', 'name': 'on_view_closed'} - events['OnViewClosed'] = macro - -Remove - -.. code-block:: python - - events['OnViewClosed'] = {} - -Or - -.. code-block:: python - - events.remove('OnViewClosed') - -| - -Select range by user --------------------- - -.. code-block:: python - - class Controllers(): - - def __init__(self, doc): - self.doc = doc - - def range_selection_done(self, range_selection): - if range_selection: - app.debug(range_selection) - self.doc.remove_range_selection_listener() - return - - def range_selection_aborted(self): - self.doc.remove_range_selection_listener() - return - - - def main(): - doc = app.active - doc.start_range_selection(Controllers) - return - -| - -Selection ---------- - -.. code-block:: python - - doc = app.active - selection = doc.selection - app.debug(selection.is_cell) - -| - -Select ------- - -.. code-block:: python - - doc = app.active - cell = doc[0]['A1'] - doc.select(cell) diff --git a/docs/source/calc_ranges.rst b/docs/source/calc_ranges.rst deleted file mode 100644 index 583e1aa..0000000 --- a/docs/source/calc_ranges.rst +++ /dev/null @@ -1,123 +0,0 @@ -Ranges ------- - -By selection -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - selection = doc.selection - app.debug(selection) - -Count -^^^^^ - -.. code-block:: python - - selection = doc.selection - count = len(selection) - app.debug(count) - -Iter -^^^^ - -.. code-block:: python - - selection = doc.selection - for rango in selection: - app.debug(rango) - -Get -^^^ - -* By index - -.. code-block:: python - - selection = doc.selection - rango = selection[1] - app.debug(rango) - -* By name - -.. code-block:: python - - selection = doc.selection - rango = selection['Sheet1.D9:E11'] - app.debug(rango) - - -New ranges container -^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - ranges = doc.ranges - -Add -^^^ - -.. code-block:: python - - doc = app.active - sheet = doc.active - rangos = doc.ranges - rangos.add(sheet['A1:B2']) - rangos.add(sheet['D5:F10']) - app.debug(rangos) - -Remove -^^^^^^ - -.. code-block:: python - - rangos.remove(sheet['A1:B2']) - -If contains -^^^^^^^^^^^ - -.. code-block:: python - - result = sheet['D5:F10'] in rangos - app.debug(result) - -Get same range in all sheets -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - rangos = doc.get_ranges('A1:C5') - app.debug(rangos) - -Names -^^^^^ - -.. code-block:: python - - app.debug(rangos.names) - -Get and set data -^^^^^^^^^^^^^^^^ - -.. note:: - - Each range of data must be the exact size of each range. - -.. code-block:: python - - rangos = doc.get_ranges('A1:C5') - data = rangos.data - app.debug(data) - rangos.data = data - -Style -^^^^^ - -Apply the same style to all ranges. - -.. code-block:: python - - rangos = doc.get_ranges('A1:C5') - rangos.style = 'Good' - diff --git a/docs/source/calc_sheets.rst b/docs/source/calc_sheets.rst deleted file mode 100644 index 63af043..0000000 --- a/docs/source/calc_sheets.rst +++ /dev/null @@ -1,438 +0,0 @@ -Sheets ------- - -Active sheet -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc.active - app.debug(sheet.name) - -| - -Get by index -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc[0] - app.debug(sheet.name) - -| - -Get by name -^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc['Sheet1'] - app.debug(sheet.name) - -| - -Contains -^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.debug('Sheet1' in doc) - -| - -Get tuple with all names -^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.debug(doc.names) - -| - -Count -^^^^^ - -.. code-block:: python - - doc = app.active - app.debug(len(doc)) - -| - -Iter -^^^^ - -.. code-block:: python - - doc = app.active - for sheet in doc: - app.debug(sheet) - -| - -New -^^^ - -Always validate if new name not exists. - -.. warning:: - - If 'NewSheet' exists, reset it to clean sheet. - -.. code-block:: python - - doc = app.active - - doc['NewSheet'] = doc.new_sheet - - # ~ or - - sheet = doc.insert('NewSheet2') - -| - -Insert multiple, get last insert. - -.. code-block:: python - - names = ('One', 'Two', 'Three') - sheet = doc.insert(names) - app.debug(sheet.name) - -| - -Move -^^^^ - -Move by object to last position. - -.. code-block:: python - - sheet = doc[0] - doc.move(sheet) - -Move by name to last position. - -.. code-block:: python - - doc.move('Sheet1') - -Move to position. - -.. code-block:: python - - sheet = doc[0] - doc.move(sheet, 2) - -Move from sheet - -.. code-block:: python - - sheet = doc.active - sheet.move() - -Move to position. - -.. code-block:: python - - sheet = doc.active - sheet.move(2) - -| - -Remove -^^^^^^ - -Remove by object. - -.. note:: - - Always should be exists at least one sheet. - -.. code-block:: python - - sheet = doc[0] - doc.remove(sheet) - -Remove by name. - -.. code-block:: python - - doc.remove('One') - -Remove from sheet. - -.. code-block:: python - - sheet = doc.active - sheet.remove() - -| - -Copy -^^^^ - -Copy inside the same spreadsheet. Always validate if new name not exists. - -* By object - -.. code-block:: python - - sheet = doc[0] - doc.copy_sheet(sheet, 'OtherSheet') - -* By name - -.. code-block:: python - - doc.copy_sheet('Sheet1', 'Sheet2') - -* From sheet - -.. code-block:: python - - sheet = doc.active - sheet.copy(f'{sheet.name}_2') - -* If not set new name, automatically get next name free with `name + index` - -.. code-block:: python - - sheet = doc.active - sheet.copy() - -| - -Copy from -^^^^^^^^^ - -* Copy sheet from one spreadsheet to other. - -.. code-block:: python - - doc = app.active - doc_source = app.docs['Contacts.ods'] - name_source = 'Names' - name_target = 'Names' - position = 0 - doc.copy_from(doc_source, name_source, name_target, position) - -* If not set `name_source` and `name_target`, copy all sheet in doc source. - -.. code-block:: python - - doc_source = app.docs['Contacts.ods'] - doc.copy_from(doc_source) - -| - -Copy to -^^^^^^^ - -* Copy from sheet with the same name - -.. code-block:: python - - doc = app.active - sheet = doc.active - doc = app.docs.new() - sheet.copy_to(doc) - -* Used new name - -.. code-block:: python - - doc = app.active - sheet = doc.active - doc = app.docs.new() - sheet.copy_to(doc, 'NewName') - -| - - -Sort -^^^^ - -* Sort sheets by names. - -.. code-block:: python - - doc = app.active - doc.sort() - -* Sort in reverse. - -.. code-block:: python - - doc = app.active - doc.sort(True) - -| - -Name -^^^^ - -Name visible by the user. - -.. code-block:: python - - sheet = doc.active - app.msgbox(sheet.name) - sheet.name = 'NewName' - app.msgbox(sheet.name) - - -Code name -^^^^^^^^^ - -Only accessible by code. - -.. code-block:: python - - sheet = doc.active - app.msgbox(sheet.code_name) - sheet.code_name = 'my_name' - app.msgbox(sheet.code_name) - - -Visible -^^^^^^^ - -Apply only with spreadsheet with two or more sheets. - -.. code-block:: python - - sheet = doc.active - app.msgbox(sheet.visible) - sheet.visible = not sheet.visible - app.msgbox(sheet.visible) - sheet.visible = not sheet.visible - - -Is protected -^^^^^^^^^^^^ - -If sheet is protected with password. - -.. code-block:: python - - sheet = doc.active - app.msgbox(sheet.is_protected) - - -Set password -^^^^^^^^^^^^ - -.. code-block:: python - - sheet = doc.active - sheet.password = 'letmein' - app.msgbox(sheet.is_protected) - - -Remove password -^^^^^^^^^^^^^^^ - -.. code-block:: python - - sheet = doc.active - sheet.password = 'letmein' - app.msgbox(sheet.is_protected) - - sheet.unprotect('letmein') - app.msgbox(sheet.is_protected) - - -Tab color -^^^^^^^^^ - -.. code-block:: python - - sheet = doc.active - app.msgbox(sheet.color) - - sheet.color = 'red' - app.msgbox(sheet.color) - - # RGB - sheet.color = (125, 200, 10) - app.msgbox(sheet.color) - - -Document parent -^^^^^^^^^^^^^^^ - -.. code-block:: python - - doc = sheet.doc - app.msgbox(doc.title) - - -Activate -^^^^^^^^ - -.. code-block:: python - - doc = app.active - - # Get last sheet - sheet = doc[-1] - - # Activate from sheet - sheet.activate() - - # Activate from doc - doc.activate(doc[1]) - - # Activate by name - doc.activate('Sheet3') - -| - -Events -^^^^^^ - -* See all the events that can be used. - -.. code-block:: python - - sheet = doc.active - event_names = sheet.events.names - app.debug(event_names) - -* Assing some macro to event. - -.. code-block:: python - - def on_select(source): - app.debug(source.AbsoluteName) - return - - def main(): - doc = app.active - sheet = doc.active - - events = sheet.events - if 'OnSelect' in events: - macro = {'library': 'test', 'name': 'on_select'} - events['OnSelect'] = macro - - return - -* Remove - -.. code-block:: python - - events['OnSelect'] = {} - -* Or - -.. code-block:: python - - events.remove('OnSelect') - diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 3219587..0000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,58 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -sys.path.insert(0, os.path.abspath('../../source')) - - -# -- Project information ----------------------------------------------------- - -project = 'easymacro' -copyright = '2022, El Mau' -author = 'El Mau' -release = '0.1.0' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -# ~ html_theme = 'alabaster' -html_theme = 'sphinx_book_theme' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -autosummary_generate = True diff --git a/docs/source/documents.rst b/docs/source/documents.rst deleted file mode 100644 index 559e774..0000000 --- a/docs/source/documents.rst +++ /dev/null @@ -1,486 +0,0 @@ - -Documents -========= - -Remember, always import library. - -.. code-block:: python - - import easymacro as app - - -Current doc ------------ - -.. code-block:: python - - doc = app.docs.active - app.msgbox(doc.title) - - -Iter docs ---------- - -.. code-block:: python - - for doc in app.docs: - app.debug(doc.type, doc.title) - - -Count ------ - -.. code-block:: python - - count = len(app.docs) - app.debug(count) - - -Get by index ------------- - -.. code-block:: python - - doc = app.docs[1] - app.debug(doc.type, doc.title) - - -Get by name ------------ - -.. code-block:: python - - name = 'MyDoc.ods' - if name in app.docs: - doc = app.docs[name] - app.debug(doc.type, doc.title) - - -If contain ----------- - -.. code-block:: python - - result = 'myfile.ods' in app.docs - app.debug(result) - - -New ---- - -For default create new Calc document. - -.. code-block:: python - - doc = app.docs.new() - app.debug(doc.type) - - -For new Writer document. - -.. code-block:: python - - doc = app.docs.new('writer') - app.debug(doc.type) - - -With arguments. - -.. code-block:: python - - args= {'Hidden': True} - doc = app.docs.new('writer', args) - msg = f'{doc.type} - {doc.title}' - app.msgbox(msg) - doc.visible = True - - -Other documents. - -.. code-block:: python - - doc = app.docs.new('draw') - app.debug(doc.type) - - doc = app.docs.new('impress') - app.debug(doc.type) - - doc = app.docs.new('math') - app.debug(doc.type) - - -Open ----- - -.. code-block:: python - - path = '/home/mau/ask_example.ods' - doc = app.docs.open(path) - - -While LibreOffice support format, you can open arbitrary file. - -.. code-block:: python - - path = '/home/mau/example.xlsx' - doc = app.docs.open(path) - - -With arguments. - -.. code-block:: python - - path = '/home/mau/example.ods' - args = {'Password': 'letmein'} - doc = app.docs.open(path, args) - - -Save ----- - -* Save new documents - -.. code-block:: python - - path = '/home/mau/myfile.ods' - doc = app.docs.new() - doc.save(path) - -* If previously open and modify then. - -.. code-block:: python - - doc.save() - -* Open exists file and save with other name. - -.. code-block:: python - - path = '/home/mau/myfile.ods' - doc = app.docs.open(path) - new_path = '/home/mau/other_name.ods' - doc.save(new_path) - - -Close ------ - -.. code-block:: python - - doc = app.docs.new() - app.msgbox(doc.title) - doc.close() - - -To PDF ------- - -* Save in path - -.. code-block:: python - - doc = app.active - path = '/home/mau/test.pdf' - doc.to_pdf(path) - -* Save in memory - -.. code-block:: python - - doc = app.active - pdf = doc.to_pdf() - - -Export ------- - -* Export common formats - -.. code-block:: python - - doc = app.docs.new() - path = '/home/mau/myfile.xlsx' - filter_name = 'xlsx' - doc.export(path, filter_name) - - path = '/home/mau/myfile.xls' - filter_name = 'xls' - doc.export(path, filter_name) - - doc = app.docs.new('writer') - path = '/home/mau/myfile.docx' - filter_name = 'docx' - doc.export(path, filter_name) - - path = '/home/mau/myfile.doc' - filter_name = 'doc' - doc.export(path, filter_name) - - path = '/home/mau/myfile.rtf' - filter_name = 'rtf' - doc.export(path, filter_name) - - -* Export in memory. - -.. code-block:: python - - doc = app.docs.new() - filter_name = 'xlsx' - excel_doc = doc.export(filter_name=filter_name) - - -Properties ----------- - -Common properties for documents - -obj -^^^ - -* Get original object pyUNO (read only) - -.. code-block:: python - - doc = app.active - app.debug(type(doc)) - app.debug(type(doc.obj)) - - -title -^^^^^ - -.. code-block:: python - - doc = app.active - app.debug(doc.title) - doc.title = 'New title' - app.debug(doc.title) - - -type -^^^^ - -* Get type document: calc, writer, etc. (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.type) - - -uid -^^^ - -* Get internal RuntimeUID form document. (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.uid) - - -is_saved -^^^^^^^^ - -* If document is saved or not (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.is_saved) - - -is_modified -^^^^^^^^^^^ - -* If document has been modified (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.is_modified) - - -is_read_only -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.debug(doc.is_read_only) - - -path -^^^^ - -* Get path of document. (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.path) - - -dir -^^^ - -* Get only directory from path saved (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.dir) - - -file_name -^^^^^^^^^ - -* Get only file name from path saved (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.file_name) - - -name -^^^^ - -* Get only name without extension (read only) - -.. code-block:: python - - doc = app.active - app.debug(doc.name) - - -visible -^^^^^^^ - -* Hide or show document. - -.. code-block:: python - - doc = app.active - doc.visible = False - app.msgbox(doc.visible) - doc.visible = True - - -zoom -^^^^ - -* Get or set zoom value. - -.. code-block:: python - - doc = app.active - zoom = doc.zoom - app.msgbox(zoom) - doc.zoom = zoom * 2 - app.msgbox(doc.zoom) - doc.zoom = zoom - - -status_bar -^^^^^^^^^^ - -* Get status bar, always control in other thread. - -.. code-block:: python - - @app.run_in_thread - def update_status_bar(sb, text, limit): - sb.start(text, limit) - for i in range(limit): - sb.setValue(i) - app.sleep(1) - # ~ Is important free status bar - sb.end() - return - - def main(): - doc = app.active - update_status_bar(doc.status_bar, 'Line', 10) - return - - -selection -^^^^^^^^^ - -* **CAUTION**: Selection can be many things. - -.. code-block:: python - - doc = app.active - selection = doc.selection - app.debug(selection) - - -Methods -------- - -set_focus -^^^^^^^^^ - -.. code-block:: python - - for doc in app.docs: - app.debug(doc.title) - doc.set_focus() - app.sleep(1) - -copy -^^^^ - -* Copy current selection - -.. code-block:: python - - doc = app.active - doc.copy() - - -paste -^^^^^ - -* Paste any content in clipboard - -.. code-block:: python - - doc = app.active - doc.paste() - - -paste_special -^^^^^^^^^^^^^ - -* Show dialog box Paste Special - -.. code-block:: python - - doc = app.active - doc.paste_special() - -paste_values -^^^^^^^^^^^^ - -* Paste only values - -.. code-block:: python - - doc = app.active - doc.paste_values() - - -clear_undo -^^^^^^^^^^ - -* Clear history undo - -.. code-block:: python - - doc = app.active - doc.clear_undo() - diff --git a/docs/source/email.rst b/docs/source/email.rst deleted file mode 100644 index 91a4144..0000000 --- a/docs/source/email.rst +++ /dev/null @@ -1,109 +0,0 @@ - -Email -===== - -Remember, always import library. - -.. code-block:: python - - import easymacro as app - - -**IMPORTANT:** Always save your config the more security way possible. - - -Send email ----------- - -.. code-block:: python - - from conf import PASSWORD - - SERVER = dict( - server = 'mail.server.net' , - port = 495, - ssl = True, - user = 'no-responder@noexiste.mx', - password = PASSWORD, - ) - - body = "Hello Ingrid\n\nWho are you?\n\nBest regards" - - message = dict( - to = 'ingrid.bergman@love.you', - subject = 'I love you', - body = body, - ) - - app.email.send(SERVER, message) - -* We can use fields `cc`, `bcc` too and send to more than one address emails. - -.. code-block:: python - - to = 'mail1@correo.com,mail2@correo.com,mail3@correo.com' - cc = 'other@correo.com' - bcc = 'hidden@correo.com' - -* We can send too more than one message. - -.. code-block:: python - - message1 = dict( - to = 'ingrid.bergman@email.net', - subject = 'I love you', - body = "Hello Ingrid\n\nWho are you?\n\nBest regards", - ) - message2 = dict( - to = 'sophia.loren@email.net', - subject = 'I love you', - body = "Hello Sophia\n\nWho are you?\n\nBest regards", - ) - messages = (message1, message2) - - app.email.send(SERVER, messages) - -.. code-block:: bash - - 30/06/2021 13:43:23 - DEBUG - Connect to: mail.gandi.net - 30/06/2021 13:43:24 - DEBUG - Email sent... - 30/06/2021 13:43:26 - DEBUG - Email sent... - 30/06/2021 13:43:26 - DEBUG - Close connection... - -* Send with attachment - -.. code-block:: python - - files = '/home/mau/file.epub' - message = dict( - to = 'ingrid.bergman@email.net', - subject = 'I love you', - body = "Hello Ingrid\n\nWho are you?\n\nBest regards", - files = files, - ) - -* Send more than one file. - -.. code-block:: python - - files = ( - '/home/mau/file1.epub', - '/home/mau/file2.epub', - ) - -* If your client email used `mbox` format, we can save in any path into your email client configuration. - -.. code-block:: python - - path_save = '/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice' - message = dict( - to = 'ingrid.bergman@email.net', - subject = 'I love you', - body = "Hello Ingrid\n\nWho are you?\n\nBest regards", - path = path_save - ) - app.email.send(SERVER, message) - - -* All emails always send in other thread. - diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index 556d70e..0000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,42 +0,0 @@ -.. easymacro documentation master file, created by - sphinx-quickstart on Tue Feb 22 16:10:57 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to easymacro's documentation! -===================================== - -**easymacro** it's a library for easily develop macros en LibreOffice con Python. It is an abstraction layer between the extensive and complex LibreOffice API UNO and your code. - -Probably, you will be more happy if used it. :) - -You can used **easymacro** with any extension or directly in your macros. - -.. note:: - - This project is under active development. - - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - install - tools_debug - tools - paths - email - application - documents - calc - -.. ~ .. automodule:: easymacro -.. ~ :members: - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/install.rst b/docs/source/install.rst deleted file mode 100644 index 740c210..0000000 --- a/docs/source/install.rst +++ /dev/null @@ -1,48 +0,0 @@ -Installation -============ - -Clone repository ----------------- - -Clone repository in your favorite folder projects. - -.. code-block:: console - - git clone https://git.cuates.net/elmau/easymacro - -and copy library into `pythonpath` in your macros. - -.. code-block:: console - - /home/USER/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro.py - - -Test ----- - -In your favorite macros file, for example: - -.. code-block:: console - - vim /home/USER/.config/libreoffice/4/user/Scripts/python/mymacros.py - -copy this code: - -.. code-block:: python - - import easymacro as app - - def main(): - app.msgbox(app.INFO_DEBUG) - return - -and execute from LibreOffice, if you see similar next info, great! - -.. image:: _static/images/install_01.png - -| - -you are ready for develop with **easymacro**. - - -Happy develop! diff --git a/docs/source/paths.rst b/docs/source/paths.rst deleted file mode 100644 index 8d3cf8c..0000000 --- a/docs/source/paths.rst +++ /dev/null @@ -1,548 +0,0 @@ -Paths and files -=============== - -Remember, always import library first. - -.. code-block:: python - - import easymacro as app - - -Get info path -------------- - -.. code-block:: python - - path = '/home/mau/myfile.ods' - p = app.path(path) - - app.debug(p.path) - app.debug(p.file_name) - app.debug(p.name) - app.debug(p.ext) - app.debug(p.size) - app.debug(p.url) - -.. image:: _static/images/path_01.png - -| - -Get info like tuple - -.. code-block:: python - - app.debug(p.info) - -.. image:: _static/images/path_02.png - -| - -Or like dict - -.. code-block:: python - - app.debug(p.dict) - -.. image:: _static/images/path_03.png - - -Get home path -------------- - -.. code-block:: python - - p = app.path - app.debug(p.home) - - -Get document path ------------------- - -.. code-block:: python - - p = app.path - app.debug(p.documents) - - -Get path user profile ---------------------- - -.. code-block:: python - - p = app.path - app.debug(p.user_profile) - - -Get path user config --------------------- - -.. code-block:: python - - p = app.path - app.debug(p.user_config) - - -Get python executable path --------------------------- - -.. code-block:: python - - p = app.path - app.debug(p.python) - - -Path URL to system ------------------- - -.. code-block:: python - - path = 'file:///home/mau/myfile.ods' - app.debug(app.path.to_system(path)) - - -Path system to URL ------------------- - -.. code-block:: python - - path = 'file:///home/mau/myfile.ods' - path = app.path.to_system(path) - - app.debug(app.path.to_url(path)) - - -Get path from user config -------------------------- - -Default get path documents. `See Api XPathSettings `_ - -.. code-block:: python - - path = app.path.config() - app.debug(path) - - path = app.path.config('UserConfig') - app.debug(path) - -.. note:: - - Some paths can be more than one path separated by a semicolon, in this case, you get a `list` of paths. - - -Path join ---------- - -.. code-block:: python - - path = app.path.join('/home/mau', 'test', 'file.ods') - app.debug(path) - - -Exists path ------------ - -.. code-block:: python - - exists = app.path.exists('/home/mau/test/file.ods') - app.debug(exists) - - -Verify if application exists ----------------------------- - -.. code-block:: python - - app_name = 'nosoffice' - app.debug(app.path.exists_app(app_name)) - - app_name = 'soffice' - app.debug(app.path.exists_app(app_name)) - - -Path is file ------------- - -.. code-block:: python - - path = '/home/mau/myfile.ott' - app.msgbox(app.path.is_file(path)) - - -Path is dir ------------ - -.. code-block:: python - - path = '/home/mau' - app.msgbox(app.path.is_dir(path)) - - -Make temporary file -------------------- - -It will be destroyed as soon as it is closed. - -.. code-block:: python - - f = app.path.temp_file() - f.write(app.NAME) - f.close() - -If used in context, It will be destroyed too. - -.. code-block:: python - - with app.path.temp_file() as f: - app.debug(f.name) - f.write('test') - - -Make temporary directory ------------------------- - -On completion of the context or destruction of the temporary directory object, the newly created temporary directory and all its contents are removed from the filesystem. - -.. code-block:: python - - with app.path.temp_dir() as d: - app.debug(app.path.exists(d)) - app.debug(d) - - -Get path for save ------------------ - -Default open in user documents -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = app.path.get() - app.msgbox(path) - - -Open in other path -^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path_tmp = app.path.config('Temp') - path = app.path.get(path_tmp) - app.msgbox(path) - - -Add one filter -^^^^^^^^^^^^^^ - -.. code-block:: python - - path = app.path.get(filters='xml') - app.msgbox(path) - - -Add multiple filters -^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = app.path.get(filters='xml,txt') - - -Select directory ----------------- - -Default open in user documents -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = app.path.get_dir() - app.debug(path) - - -Open in other path -^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path_tmp = app.path.config('Temp') - path_dir = app.paths.get_dir(path_tmp) - app.debug(path_dir) - - -Get path exists file --------------------- - -Default open in user documents -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path_file = app.path.get_file() - app.msgbox(path_file) - - -Change init dir -^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = '/home/mau' - path_file = app.path.get_file(path) - app.msgbox(path_file) - - -Add filter or filters -^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path_file = app.path.get_file(filters='ods') - - # or - - path_file = app.path.get_file(filters='ods,odt') - - -Can select multiple files -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path_files = app.path.get_file(multiple=True) - - -Get files ---------- - -Get files not recursively -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = '/home/mau/Documents' - files = app.path.files(path) - for f in files: - app.debug(f) - - -Add filter -^^^^^^^^^^ - -.. code-block:: python - - files = app.path.files(path, '*.pdf') - - -Get content files, recursively -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - files = app.path.files(path, '**/*.pdf') - - -Get content files recursively -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This method use `os.walk` - -.. code-block:: python - - path = '/home/mau/Documents' - files = app.path.walk(path) - for f in files: - app.debug(f) - - -Add filter -^^^^^^^^^^ - -.. code-block:: python - - files = app.path.walk(path, 'ods') - - # or filters - - files = app.path.walk(path, 'ods|odt') - - -Get directories ---------------- - -Get directories not recursively -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This method use library `pathlib` - -.. code-block:: python - - path = '/home/mau/Documents' - folders = app.path.dirs(path) - for f in folders: - app.debug(f) - - -Get directories recursively -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This method use `os.walk` - -.. code-block:: python - - path = '/home/mau/Documents' - folders = app.path.walk_dirs(path) - for f in folders: - app.debug(f) - - -Get info in a tuple -^^^^^^^^^^^^^^^^^^^ - -Like (ID_FOLDER, ID_PARENT, NAME) - -.. code-block:: python - - path = '/home/mau/Documents' - folders = app.path.walk_dirs(path, True) - for f in folders: - app.debug(f) - - -Get install path extension from id ----------------------------------- - -.. code-block:: python - - id_ext = 'net.elmau.zaz.EasyMacro' - path = app.path.extension(id_ext) - app.debug(path) - -.. code-block:: bash - - 24/06/2021 21:47:29 - DEBUG - /home/mau/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu20665x29msz.tmp_/ZAZEasyMacro_v0.1.0.oxt - - -Replace extension ------------------ - -.. code-block:: python - - path = '/home/mau/myFile.ods' - path_new = app.path.replace_ext(path, 'pdf') - app.debug(path_new) - - -Open any type file ------------------- - -Open with default application in OS. - -.. code-block:: python - - path = '/home/mau/file.pdf' - app.path.open(path) - - path = '/home/mau/index.html' - app.path.open(path) - - -Save and read text data ------------------------ - -Default encoding is UTF8 - -.. code-block:: python - - data = """Do you want to know who you are? Don't ask. Act! - Action will delineate and define you. - - Thomas Jefferson - """ - - path = '/home/mau/temp.txt' - app.path.save(path, data) - - data = app.path.read(path) - app.msgbox(data) - -Change encoding - -.. code-block:: python - - app.path.save(path, data, 'iso-8859-1') - - -Save and read binary data -------------------------- - -.. code-block:: python - - data = b'Binary data' - path = '/home/mau/temp.bin' - app.path.save_bin(path, data) - - data = app.path.read_bin(path) - app.msgbox(data) - - -Save and read json ------------------- - -.. code-block:: python - - path = '/home/mau/data.json' - data = { - 'type': 'calc', - 'name': 'myfile.ods', - } - app.path.to_json(path, data) - - data = app.path.from_json(path) - - app.msgbox(data) - - -Save and read csv ------------------ - -You can used the same way that `python csv`_ - -.. code-block:: python - - path = '/home/mau/data.csv' - data = ( - (1, 'one', app.now()), - (2, 'two', app.now()), - (3, 'three', app.now()), - ) - app.path.to_csv(path, data) - - data = app.path.from_csv(path) - - app.msgbox(data) - - -Delete files and directories ----------------------------- - -**CAUTION**: This method delete files and directories without confirmation, always ask to user first. - -.. code-block:: python - - path = '/home/mau/temp.bin' - result = app.path.kill(path) - app.msgbox(result) - - -Delete directory and all content -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - path = '/home/mau/safe_for_delete' - result = app.path.kill(path) - app.msgbox(result) - - -.. _python csv: https://docs.python.org/3.7/library/csv.html diff --git a/docs/source/tools.rst b/docs/source/tools.rst deleted file mode 100644 index 46acba5..0000000 --- a/docs/source/tools.rst +++ /dev/null @@ -1,757 +0,0 @@ -Tools -===== - -Remember, always import library first. - -.. code-block:: python - - import easymacro as app - - -Info from PC ------------- - -Operate system -^^^^^^^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.OS) - -.. image:: _static/images/tools_01.png - - -Desktop -^^^^^^^ - -Name desktop, only GNU/Linux - -.. code-block:: python - - app.msgbox(app.DESKTOP) - -.. image:: _static/images/tools_02.png - - -Name PC -^^^^^^^ - -.. code-block:: python - - app.msgbox(app.PC) - -.. image:: _static/images/tools_03.png - - -Current user -^^^^^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.USER) - -.. image:: _static/images/tools_04.png - - -Is Windows -^^^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.IS_WIN) - -.. image:: _static/images/tools_05.png - - -Is Mac -^^^^^^ - -.. code-block:: python - - app.msgbox(app.IS_MAC) - -.. image:: _static/images/tools_05.png - - -Info from LibO --------------- - -Application name -^^^^^^^^^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.NAME) - -.. image:: _static/images/tools_06.png - - -Version -^^^^^^^ - -.. code-block:: python - - app.msgbox(app.VERSION) - -.. image:: _static/images/tools_07.png - - -Language -^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.LANG) - -.. image:: _static/images/tools_08.png - - -Language with variant -^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - app.msgbox(app.LANGUAGE) - -.. image:: _static/images/tools_09.png - - -Message Box ------------ - -.. code-block:: python - - app.msgbox('Damed World', 'My Macro') - -.. image:: _static/images/tools_10.png - - -Show warning box ----------------- - -.. code-block:: python - - message = 'Caution, this action is dangerous' - title = 'My App' - app.warning(message, title) - -.. image:: _static/images/tools_11.png - - -Show error box --------------- - -.. code-block:: python - - message = 'ERROR: Contact technical support' - title = 'My App' - app.errorbox(message, title) - -.. image:: _static/images/tools_12.png - - -Make question -------------- - -.. code-block:: python - - message = 'Is easy Python?' - title = 'My App' - result = app.question(message, title) - app.msgbox(result) - -.. image:: _static/images/tools_13.png - - -InputBox -^^^^^^^^ - -* Normal data - -.. code-block:: python - - message = 'Type your name' - default = '' - title = 'My App' - - result = app.inputbox(message, default, title) - app.msgbox(result) - -* Private data - -.. code-block:: python - - message = 'Type your password' - default = '' - title = 'My App' - echochar = "*" - - result = app.inputbox(message, default, title, echochar) - app.msgbox(result) - - -Date and times --------------- - -Get today -^^^^^^^^^ - -.. code-block:: python - - d = app.dates - app.msgbox(d.today) - -.. image:: _static/images/tools_14.png - - -Get now -^^^^^^^ - -.. code-block:: python - - d = app.dates - app.msgbox(d.now) - -.. image:: _static/images/tools_15.png - - -Get `Unix Time`_ -^^^^^^^^^^^^^^^^ - -.. code-block:: python - - d = app.dates - app.msgbox(app.d.epoch) - -.. image:: _static/images/tools_16.png - - -Simple measure time -^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - d = app.dates - d.start() - app.sleep(5) - seconds = d.end() - app.msgbox(seconds) - -.. image:: _static/images/tools_17.png - -.. image:: _static/images/tools_18.png - - -Make date -^^^^^^^^^ - -.. code-block:: python - - d = app.dates - date = d.date(1974, 1, 15) - app.msgbox(date) - -.. image:: _static/images/tools_19.png - -.. note:: - - Start date in Python and Calc is diferent. - - -String to date -^^^^^^^^^^^^^^ - -See `Python strftime cheatsheet `_ - -.. code-block:: python - - d = app.dates - str_date = '1974-01-15' - template = '%Y-%m-%d' - date = d.str_to_date(str_date, template) - app.msgbox(type(date)) - -.. image:: _static/images/tools_20.png - -| - -For correct date for Calc. - -.. code-block:: python - - d = app.dates - str_date = '1974-01-15' - template = '%Y-%m-%d' - date = d.str_to_date(str_date, template, True) - app.msgbox(type(date)) - -.. image:: _static/images/tools_21.png - - -Calc to date -^^^^^^^^^^^^ - -Get star date in Calc configuration. - -.. code-block:: python - - d = app.dates - cell_value = 1 - date = d.calc_to_date(cell_value) - app.msgbox(date) - -.. image:: _static/images/tools_22.png - - -Thread ------- - -You can execute any macro in thread - -Normal execution -^^^^^^^^^^^^^^^^ - -.. code-block:: python - - def show_time(seconds): - app.sleep(seconds) - app.msgbox(app.NAME) - return - - def main(args=None): - show_time(5) - app.msgbox('Finish...') - return - -Run in thread -^^^^^^^^^^^^^ - -.. code-block:: python - - @app.run_in_thread - def show_time(seconds): - app.sleep(seconds) - app.msgbox(app.NAME) - return - - def main(args=None): - show_time(5) - app.msgbox('Finish...') - return - - -Dictionary to/from Properties ------------------------------ - -.. code-block:: python - - args = { - 'Hidden': True, - 'Password': 'letmein', - } - properties = app.dict_to_property(args) - - app.msgbox(properties) - - data = app.data_to_dict(properties) - - app.msgbox(data) - - -Tuples or lists to dictionary ------------------------------ - -.. code-block:: python - - tuple_of_tuples = ( - ('Hidden', True), - ('Password', 'letmein'), - ) - data = app.data_to_dict(tuple_of_tuples) - app.msgbox(data) - - list_of_lists = [ - ['Hidden', True], - ['Password', 'letmein'], - ] - data = app.data_to_dict(list_of_lists) - app.msgbox(data) - - -Json ----- - -Dumps data -^^^^^^^^^^ - -.. code-block:: python - - data = { - 'Hidden': True, - 'Password': 'letmein', - } - - json = app.json.dumps(data) - - app.msgbox(json) - - -Loads data -^^^^^^^^^^ - -.. code-block:: python - - data = app.json.loads(json) - - app.msgbox(data) - - -Call Macros ------------ - -You can execute any macro, for default call macros Python. - -.. code-block:: python - - def show_message(): - app.msgbox(app.INFO_DEBUG) - return - - def main(args=None): - args = { - 'library': 'test', - 'name': 'show_message', - } - app.macro.call(args) - return - -Of course is better call directly if both macros are the same languaje, but, you can call macro in Basic too. - -.. code-block:: vbnet - - Sub show_message() - MsgBox "Basic from Python" - End Sub - -Call from Python with. - -.. code-block:: python - - args = { - 'language': 'Basic', - 'library': 'Standard', - 'module': 'Module1', - 'name': 'show_message', - } - app.call_macro(args) - -Execute macro in other thread - -.. code-block:: python - - app.call_macro(args, True) - - -Call external program ---------------------- - -.. code-block:: python - - app_name = 'gnome-calculator' - app.shell.run(app_name) - app.debug(app_name) - -Call command line and capture output - -.. code-block:: python - - args = 'ls -lh ~' - result = app.shell.run(args, True) - app.debug(result) - -.. code-block:: bash - - 21/06/2021 22:27:22 - DEBUG - total 1.3M - drwxr-xr-x 5 mau mau 4.0K Jun 17 13:09 Desktop - drwxr-xr-x 6 mau mau 4.0K Jun 15 12:35 Documents - drwxr-xr-x 2 mau mau 4.0K Jun 21 20:26 Downloads - drwxr-xr-x 2 mau mau 4.0K Jun 21 16:18 Pictures - drwxr-xr-x 13 mau mau 4.0K Jun 21 15:34 Projects - drwxr-xr-x 2 mau mau 4.0K May 11 18:48 Templates - drwxr-xr-x 2 mau mau 4.0K Jun 20 23:27 Videos - -Call command line and capture output line by line. - -.. code-block:: python - - args = 'ls -lh /home/mau' - for line in app.popen(args): - app.debug(line) - -.. code-block:: bash - - 21/06/2021 22:34:42 - DEBUG - total 1.3M - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 5 mau mau 4.0K Jun 17 13:09 Desktop - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 6 mau mau 4.0K Jun 15 12:35 Documents - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 21 20:26 Downloads - 21/06/2021 22:34:42 - DEBUG - -rw-r----- 1 mau mau 1.3M Jun 14 11:53 out.png - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 21 16:18 Pictures - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 13 mau mau 4.0K Jun 21 15:34 Projects - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K May 11 18:48 Templates - 21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 20 23:27 Videos - - -Timer ------ - -Only once -^^^^^^^^^ - -Execute any macro only once in N seconds. - -.. code-block:: python - - TIMER_NAME = 'clock' - - def show_time(): - app.debug(app.dates.time) - return - - def start_clock(): - seconds = 5 - macro = { - 'library': 'test', - 'name': 'show_time', - } - app.timer.once(TIMER_NAME, seconds, macro) - return - - - def main(args=None): - start_clock() - return - - -Cancel execution, before start. - -.. code-block:: python - - TIMER_NAME = 'clock' - - def show_time(): - app.debug(app.dates.time) - return - - def start_clock(): - seconds = 60 - macro = { - 'library': 'test', - 'name': 'show_time', - } - app.timer.once(TIMER_NAME, seconds, macro) - return - - def stop_clock(): - app.timer.cancel(TIMER_NAME) - return - - -.. code-block:: bash - - 26/02/2022 12:23:09 - INFO - Event: "clock", started... execute in 60 seconds - 26/02/2022 12:23:16 - INFO - Cancel event: "clock", ok... - - -Every seconds -^^^^^^^^^^^^^ - -Execute any macro every seconds. - -.. code-block:: python - - TIMER_NAME = 'clock' - - def show_time(): - app.debug(app.dates.time) - return - - def start_clock(): - seconds = 1 - macro = { - 'library': 'test', - 'name': 'show_time', - } - app.timer.start(TIMER_NAME, seconds, macro) - return - - def stop_clock(): - app.timer.stop(TIMER_NAME) - return - - def main(args=None): - start_clock() - return - -Execute **stop_clock** for stop timer. - -.. code-block:: bash - - 26/02/2022 11:28:01 - INFO - Timer 'clock' started, execute macro: 'show_time' - 26/02/2022 11:28:02 - DEBUG - 11:28:02 - 26/02/2022 11:28:03 - DEBUG - 11:28:03 - ... - 26/02/2022 11:28:08 - DEBUG - 11:28:08 - 26/02/2022 11:28:09 - DEBUG - 11:28:09 - 26/02/2022 11:28:10 - INFO - Timer stopped... - -.. note:: - - Be sure to use a unique name for each timer. - -.. warning:: - - Be sure to macro for execute not block UI LibO - - -Get digest ----------- - -For default get digest in hex - -.. code-block:: python - - data = 'LibreOffice with Python' - - digest = app.hash.digest('md5', data) - app.debug('MD5 = ', digest) - - digest = app.hash.digest('sha1', data) - app.debug('SHA1 = ', digest) - - digest = app.hash.digest('sha256', data) - app.debug('SHA256 = ', digest) - - digest = app.hash.digest('sha512', data) - app.debug('SHA512 = ', digest) - - # Get bytes - digest = app.hash.digest('md5', data, False) - app.debug('MD5 = ', digest) - -.. code-block:: bash - - 26/02/2022 15:57:53 - DEBUG - MD5 = e0cb96d2c04b26db79dbd30c4d56b555 - 26/02/2022 15:57:53 - DEBUG - SHA1 = 7006fb17b7a235245cfc986710a11f10543ae10d - 26/02/2022 15:57:53 - DEBUG - SHA256 = 3fe4586d51fa3e352ec28c05b7e71eaee2e41d5ee78f372c44eeb2f433f7e002 - 26/02/2022 15:57:53 - DEBUG - SHA512 = b6eaea6bc11956eae7f990034ff950eba4b0fe51a577d301272cc8b4c1c603abd36ce852311766e5af2f603d1d96741797b62d4b405459348bacae7ec54e2982 - 26/02/2022 15:57:53 - DEBUG - MD5 = b'\xe0\xcb\x96\xd2\xc0K&\xdby\xdb\xd3\x0cMV\xb5U' - - -Save and get configurations ---------------------------- - -You can save any data. - -.. code-block:: python - - my_app = 'my_extension' - data = { - 'path': '/home/mau/work', - 'save_data': True, - } - - if app.config.set(my_app, data): - app.msgbox('Save config') - - path = app.config.get(my_app) - - app.msgbox(data) - - -You can get any key - -.. code-block:: python - - path = app.config.get(my_app, 'path') - app.msgbox(path) - - -Render string -------------- - -.. code-block:: python - - template = """Hello $name - - I send you this $file_name - - Best regards - """ - - data = {'name': 'Ingrid Bergman', 'file_name': 'letter_love.odt'} - - render = app.render(template, data) - - app.msgbox(render) - - -Simple url open ---------------- - -Get text data -^^^^^^^^^^^^^ - -.. code-block:: python - - url = 'https://api.ipify.org' - result, headers, err = app.url.get(url) - if err: - app.error(err) - else: - app.debug(type(result), result) - app.debug(headers) - -.. image:: _static/images/tools_23.png - -| - -Get json data -^^^^^^^^^^^^^ - -.. code-block:: python - - url = 'https://api.ipify.org?format=json' - result, headers, err = app.url.get(url, json=True) - if err: - app.error(err) - else: - app.debug(type(result), result) - app.debug(headers) - -.. image:: _static/images/tools_24.png - -| - - -Color ------ - -Look colors that you can used in `web colors`_ - -.. code-block:: python - - color_name = 'darkblue' - color = app.color(color_name) - app.debug(color) - - color_rgb = (125, 200, 10) - color = app.color(color_rgb) - app.debug(color) - - color_html = '#008080' - color = app.color(color_html) - app.debug(color) - - -.. _Unix Time: https://en.wikipedia.org/wiki/Unix_time -.. _web colors: https://en.wikipedia.org/wiki/Web_colors diff --git a/docs/source/tools_debug.rst b/docs/source/tools_debug.rst deleted file mode 100644 index 353cc98..0000000 --- a/docs/source/tools_debug.rst +++ /dev/null @@ -1,216 +0,0 @@ -Tools for debug -=============== - -INFO_DEBUG ----------- - -Show info debug, show in message box. - -If you have any problem in your code, you can `open issue`_ in this project, -always copy the information of **INFO_DEBUG** in your ticket. - -.. code-block:: python - - import easymacro as app - - def info(): - app.msgbox(app.INFO_DEBUG) - return - -.. image:: _static/images/install_01.png - -| - -Show in shell. - -.. code-block:: python - - import easymacro as app - - def info(): - app.debug(app.INFO_DEBUG) - return - -.. code-block:: console - - mau@oficina ~> soffice --calc - - 25/02/2022 16:44:24 - DEBUG - LibreOffice v7.3 en-US - - Python: 3.10.2 (main, Jan 15 2022, 19:56:27) [GCC 11.1.0] - - Linux-5.16.11-arch1-1-x86_64-with-glibc2.35 - - /usr/lib/libreoffice/program - /usr/lib/python310.zip - /usr/lib/python3.10 - /usr/lib/python3.10/lib-dynload - /home/mau/.local/lib/python3.10/site-packages - /usr/lib/python3.10/site-packages - /usr/lib/libreoffice/program/ - /home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath - - -Log error ---------- - -Show message error in shell. - -.. code-block:: python - - import easymacro as app - - def test_error(): - msg = 'My error 500' - app.error(msg) - return - -.. image:: _static/images/toolsdebug_01.png - - -Log debug ---------- - -Show message debug in shell. - -.. code-block:: python - - import easymacro as app - - def test_debug(): - msg = 'Verify this data...' - app.debug(msg) - return - -.. image:: _static/images/toolsdebug_02.png - - -Log info --------- - -Show message info in shell. - -.. code-block:: python - - import easymacro as app - - def test_info(): - msg = 'Start process...' - app.info(msg) - return - -.. image:: _static/images/toolsdebug_03.png - - -Log to file ------------ - -Save log to file, automatic add date and time. - -.. code-block:: python - - import easymacro as app - - def log(): - app.save_log('/home/mau/log.txt', 'PyUNO') - app.save_log('/home/mau/log.txt', 'Damed World') - return - -.. image:: _static/images/toolsdebug_04.png - - -Message Box ------------ - -Show any data in message box - -.. code-block:: python - - import easymacro as app - - def message(): - - msg = 'Please, save the planet' - app.msgbox(msg) - - msg = ('one', 2, 'three') - app.msgbox(msg) - - msg = {'name': 'Teresa'} - app.msgbox(msg) - - app.msgbox(app) - - return - -.. image:: _static/images/toolsdebug_05.png - - -Catch exceptions ----------------- - -Sometimes, for difficult errors, you can catch exceptions. - -.. code-block:: python - - import easymacro as app - - @app.catch_exception - def test(): - r = 1 / 0 - return - -.. image:: _static/images/toolsdebug_06.png - -.. warning:: - - Not, not used you this function in production. - - -Call MRI --------- - -`MRI`_ is the best extension for debug any object in LibreOffice, you need -install before call it. - -.. code-block:: python - - import easymacro as app - - def error(): - obj = app.active - app.mri(obj) - return - -.. image:: _static/images/toolsdebug_07.png - - -Inspect -------- - -Show info in shell debug - -.. code-block:: python - - import easymacro as app - - def inspect(): - obj = app.active - data = app.inspect(doc) - for p in data.properties: - app.debug(p) - for m in data.methods: - app.debug(m) - return - - -Or show in new Calc document. - -.. code-block:: python - - obj = app.active - app.inspect(doc, True) - - -.. _MRI: https://github.com/hanya/MRI -.. _open issue: https://git.cuates.net/elmau/easymacro/issues diff --git a/source/easymacro.py b/source/easymacro.py index 51bae80..132e28a 100644 --- a/source/easymacro.py +++ b/source/easymacro.py @@ -932,55 +932,6 @@ class LOMain(): obj = create_instance('com.sun.star.frame.Desktop', True) return obj - @classmethod - def dispatch(cls, frame: Any, command: str, args: dict={}) -> None: - """Call dispatch, used only if not exists directly in API - - :param frame: doc or frame instance - :type frame: pyUno - :param command: Command to execute - :type command: str - :param args: Extra argument for command - :type args: dict - - `See DispatchCommands <`See DispatchCommands `_>`_ - """ - dispatch = create_instance('com.sun.star.frame.DispatchHelper') - if hasattr(frame, 'frame'): - frame = frame.frame - url = command - if not command.startswith('.uno:'): - url = f'.uno:{command}' - opt = dict_to_property(args) - dispatch.executeDispatch(frame, url, '', 0, opt) - return - - @classmethod - def fonts(cls): - """Get all font visibles in LibreOffice - - :return: tuple of FontDescriptors - :rtype: tuple - - `See API FontDescriptor `_ - """ - toolkit = create_instance('com.sun.star.awt.Toolkit') - device = toolkit.createScreenCompatibleDevice(0, 0) - return device.FontDescriptors - - @classmethod - def filters(cls): - """Get all support filters - - `See Help ConvertFilters `_ - `See API FilterFactory `_ - """ - factory = create_instance('com.sun.star.document.FilterFactory') - rows = [data_to_dict(factory[name]) for name in factory] - for row in rows: - row['UINames'] = data_to_dict(row['UINames']) - return rows - class LODocument(): @@ -1005,11 +956,6 @@ class LODocument(): """Get type document""" return self._type - @property - def frame(self): - """Get frame document""" - return self._cc.getFrame() - @property def title(self): """Get title document""" diff --git a/source/easymacro/__init__.py b/source/easymacro/__init__.py index 778b003..9be64dc 100644 --- a/source/easymacro/__init__.py +++ b/source/easymacro/__init__.py @@ -13,7 +13,10 @@ def __getattr__(name): 'config': Config, 'dates': Dates, 'dialog': LODialog, + 'dispatch': LOMain.dispatch, 'email': Email, + 'filters': LOMain.filters, + 'fonts': LOMain.fonts, 'hash': Hash, 'inspect': LOInspect, 'macro': Macro, diff --git a/source/easymacro/easydoc.py b/source/easymacro/easydoc.py index a6b5b44..638c5c2 100644 --- a/source/easymacro/easydoc.py +++ b/source/easymacro/easydoc.py @@ -18,6 +18,11 @@ class LODocument(BaseObject): """Get type document""" return self._type + @property + def frame(self): + """Get frame document""" + return self._cc.getFrame() + def _create_instance(self, name): obj = self.obj.createInstance(name) return obj diff --git a/source/easymacro/easymain.py b/source/easymacro/easymain.py index fbe682d..bde4e65 100644 --- a/source/easymacro/easymain.py +++ b/source/easymacro/easymain.py @@ -25,10 +25,11 @@ __all__ = [ 'PC', 'USER', 'VERSION', - 'create_instance', + 'LOMain', + # ~ 'create_instance', 'data_to_dict', 'dict_to_property', - 'get_app_config', + # ~ 'get_app_config', ] @@ -176,3 +177,55 @@ class BaseObject(): """Return original pyUno object""" return self._obj + +class LOMain(): + """Classe for LibreOffice""" + + @classmethod + def fonts(cls): + """Get all font visibles in LibreOffice + + :return: tuple of FontDescriptors + :rtype: tuple + + `See API FontDescriptor `_ + """ + toolkit = create_instance('com.sun.star.awt.Toolkit') + device = toolkit.createScreenCompatibleDevice(0, 0) + return device.FontDescriptors + + @classmethod + def filters(cls): + """Get all support filters + + `See Help ConvertFilters `_ + `See API FilterFactory `_ + """ + factory = create_instance('com.sun.star.document.FilterFactory') + rows = [data_to_dict(factory[name]) for name in factory] + for row in rows: + row['UINames'] = data_to_dict(row['UINames']) + return rows + + @classmethod + def dispatch(cls, frame: Any, command: str, args: dict={}) -> None: + """Call dispatch, used only if not exists directly in API + + :param frame: doc or frame instance + :type frame: pyUno + :param command: Command to execute + :type command: str + :param args: Extra argument for command + :type args: dict + + `See DispatchCommands <`See DispatchCommands `_>`_ + """ + dispatch = create_instance('com.sun.star.frame.DispatchHelper') + if hasattr(frame, 'frame'): + frame = frame.frame + url = command + if not command.startswith('.uno:'): + url = f'.uno:{command}' + opt = dict_to_property(args) + dispatch.executeDispatch(frame, url, '', 0, opt) + return diff --git a/source/zazplus/easyplus.py b/source/easymacro/zazplus/easyplus.py similarity index 100% rename from source/zazplus/easyplus.py rename to source/easymacro/zazplus/easyplus.py diff --git a/source/zazplus/__init__.py b/source/zazplus/__init__.py deleted file mode 100644 index e5a0d9b..0000000 --- a/source/zazplus/__init__.py +++ /dev/null @@ -1 +0,0 @@ -#!/usr/bin/env python3 diff --git a/source/zazplus/peewee.py b/source/zazplus/peewee.py deleted file mode 100644 index 996159c..0000000 --- a/source/zazplus/peewee.py +++ /dev/null @@ -1,7902 +0,0 @@ -from bisect import bisect_left -from bisect import bisect_right -from contextlib import contextmanager -from copy import deepcopy -from functools import wraps -from inspect import isclass -import calendar -import collections -import datetime -import decimal -import hashlib -import itertools -import logging -import operator -import re -import socket -import struct -import sys -import threading -import time -import uuid -import warnings -try: - from collections.abc import Mapping -except ImportError: - from collections import Mapping - -try: - from pysqlite3 import dbapi2 as pysq3 -except ImportError: - try: - from pysqlite2 import dbapi2 as pysq3 - except ImportError: - pysq3 = None -try: - import sqlite3 -except ImportError: - sqlite3 = pysq3 -else: - if pysq3 and pysq3.sqlite_version_info >= sqlite3.sqlite_version_info: - sqlite3 = pysq3 -try: - from psycopg2cffi import compat - compat.register() -except ImportError: - pass -try: - import psycopg2 - from psycopg2 import extensions as pg_extensions - try: - from psycopg2 import errors as pg_errors - except ImportError: - pg_errors = None -except ImportError: - psycopg2 = pg_errors = None -try: - from psycopg2.extras import register_uuid as pg_register_uuid - pg_register_uuid() -except Exception: - pass - -mysql_passwd = False -try: - import pymysql as mysql -except ImportError: - try: - import MySQLdb as mysql - mysql_passwd = True - except ImportError: - mysql = None - - -__version__ = '3.14.10' -__all__ = [ - 'AnyField', - 'AsIs', - 'AutoField', - 'BareField', - 'BigAutoField', - 'BigBitField', - 'BigIntegerField', - 'BinaryUUIDField', - 'BitField', - 'BlobField', - 'BooleanField', - 'Case', - 'Cast', - 'CharField', - 'Check', - 'chunked', - 'Column', - 'CompositeKey', - 'Context', - 'Database', - 'DatabaseError', - 'DatabaseProxy', - 'DataError', - 'DateField', - 'DateTimeField', - 'DecimalField', - 'DeferredForeignKey', - 'DeferredThroughModel', - 'DJANGO_MAP', - 'DoesNotExist', - 'DoubleField', - 'DQ', - 'EXCLUDED', - 'Field', - 'FixedCharField', - 'FloatField', - 'fn', - 'ForeignKeyField', - 'IdentityField', - 'ImproperlyConfigured', - 'Index', - 'IntegerField', - 'IntegrityError', - 'InterfaceError', - 'InternalError', - 'IPField', - 'JOIN', - 'ManyToManyField', - 'Model', - 'ModelIndex', - 'MySQLDatabase', - 'NotSupportedError', - 'OP', - 'OperationalError', - 'PostgresqlDatabase', - 'PrimaryKeyField', # XXX: Deprecated, change to AutoField. - 'prefetch', - 'ProgrammingError', - 'Proxy', - 'QualifiedNames', - 'SchemaManager', - 'SmallIntegerField', - 'Select', - 'SQL', - 'SqliteDatabase', - 'Table', - 'TextField', - 'TimeField', - 'TimestampField', - 'Tuple', - 'UUIDField', - 'Value', - 'ValuesList', - 'Window', -] - -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -logger = logging.getLogger('peewee') -logger.addHandler(NullHandler()) - - -if sys.version_info[0] == 2: - text_type = unicode - bytes_type = str - buffer_type = buffer - izip_longest = itertools.izip_longest - callable_ = callable - multi_types = (list, tuple, frozenset, set) - exec('def reraise(tp, value, tb=None): raise tp, value, tb') - def print_(s): - sys.stdout.write(s) - sys.stdout.write('\n') -else: - import builtins - try: - from collections.abc import Callable - except ImportError: - from collections import Callable - from functools import reduce - callable_ = lambda c: isinstance(c, Callable) - text_type = str - bytes_type = bytes - buffer_type = memoryview - basestring = str - long = int - multi_types = (list, tuple, frozenset, set, range) - print_ = getattr(builtins, 'print') - izip_longest = itertools.zip_longest - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - -if sqlite3: - sqlite3.register_adapter(decimal.Decimal, str) - sqlite3.register_adapter(datetime.date, str) - sqlite3.register_adapter(datetime.time, str) - __sqlite_version__ = sqlite3.sqlite_version_info -else: - __sqlite_version__ = (0, 0, 0) - - -__date_parts__ = set(('year', 'month', 'day', 'hour', 'minute', 'second')) - -# Sqlite does not support the `date_part` SQL function, so we will define an -# implementation in python. -__sqlite_datetime_formats__ = ( - '%Y-%m-%d %H:%M:%S', - '%Y-%m-%d %H:%M:%S.%f', - '%Y-%m-%d', - '%H:%M:%S', - '%H:%M:%S.%f', - '%H:%M') - -__sqlite_date_trunc__ = { - 'year': '%Y-01-01 00:00:00', - 'month': '%Y-%m-01 00:00:00', - 'day': '%Y-%m-%d 00:00:00', - 'hour': '%Y-%m-%d %H:00:00', - 'minute': '%Y-%m-%d %H:%M:00', - 'second': '%Y-%m-%d %H:%M:%S'} - -__mysql_date_trunc__ = __sqlite_date_trunc__.copy() -__mysql_date_trunc__['minute'] = '%Y-%m-%d %H:%i:00' -__mysql_date_trunc__['second'] = '%Y-%m-%d %H:%i:%S' - -def _sqlite_date_part(lookup_type, datetime_string): - assert lookup_type in __date_parts__ - if not datetime_string: - return - dt = format_date_time(datetime_string, __sqlite_datetime_formats__) - return getattr(dt, lookup_type) - -def _sqlite_date_trunc(lookup_type, datetime_string): - assert lookup_type in __sqlite_date_trunc__ - if not datetime_string: - return - dt = format_date_time(datetime_string, __sqlite_datetime_formats__) - return dt.strftime(__sqlite_date_trunc__[lookup_type]) - - -def __deprecated__(s): - warnings.warn(s, DeprecationWarning) - - -class attrdict(dict): - def __getattr__(self, attr): - try: - return self[attr] - except KeyError: - raise AttributeError(attr) - def __setattr__(self, attr, value): self[attr] = value - def __iadd__(self, rhs): self.update(rhs); return self - def __add__(self, rhs): d = attrdict(self); d.update(rhs); return d - -SENTINEL = object() - -#: Operations for use in SQL expressions. -OP = attrdict( - AND='AND', - OR='OR', - ADD='+', - SUB='-', - MUL='*', - DIV='/', - BIN_AND='&', - BIN_OR='|', - XOR='#', - MOD='%', - EQ='=', - LT='<', - LTE='<=', - GT='>', - GTE='>=', - NE='!=', - IN='IN', - NOT_IN='NOT IN', - IS='IS', - IS_NOT='IS NOT', - LIKE='LIKE', - ILIKE='ILIKE', - BETWEEN='BETWEEN', - REGEXP='REGEXP', - IREGEXP='IREGEXP', - CONCAT='||', - BITWISE_NEGATION='~') - -# To support "django-style" double-underscore filters, create a mapping between -# operation name and operation code, e.g. "__eq" == OP.EQ. -DJANGO_MAP = attrdict({ - 'eq': operator.eq, - 'lt': operator.lt, - 'lte': operator.le, - 'gt': operator.gt, - 'gte': operator.ge, - 'ne': operator.ne, - 'in': operator.lshift, - 'is': lambda l, r: Expression(l, OP.IS, r), - 'like': lambda l, r: Expression(l, OP.LIKE, r), - 'ilike': lambda l, r: Expression(l, OP.ILIKE, r), - 'regexp': lambda l, r: Expression(l, OP.REGEXP, r), -}) - -#: Mapping of field type to the data-type supported by the database. Databases -#: may override or add to this list. -FIELD = attrdict( - AUTO='INTEGER', - BIGAUTO='BIGINT', - BIGINT='BIGINT', - BLOB='BLOB', - BOOL='SMALLINT', - CHAR='CHAR', - DATE='DATE', - DATETIME='DATETIME', - DECIMAL='DECIMAL', - DEFAULT='', - DOUBLE='REAL', - FLOAT='REAL', - INT='INTEGER', - SMALLINT='SMALLINT', - TEXT='TEXT', - TIME='TIME', - UUID='TEXT', - UUIDB='BLOB', - VARCHAR='VARCHAR') - -#: Join helpers (for convenience) -- all join types are supported, this object -#: is just to help avoid introducing errors by using strings everywhere. -JOIN = attrdict( - INNER='INNER JOIN', - LEFT_OUTER='LEFT OUTER JOIN', - RIGHT_OUTER='RIGHT OUTER JOIN', - FULL='FULL JOIN', - FULL_OUTER='FULL OUTER JOIN', - CROSS='CROSS JOIN', - NATURAL='NATURAL JOIN', - LATERAL='LATERAL', - LEFT_LATERAL='LEFT JOIN LATERAL') - -# Row representations. -ROW = attrdict( - TUPLE=1, - DICT=2, - NAMED_TUPLE=3, - CONSTRUCTOR=4, - MODEL=5) - -SCOPE_NORMAL = 1 -SCOPE_SOURCE = 2 -SCOPE_VALUES = 4 -SCOPE_CTE = 8 -SCOPE_COLUMN = 16 - -# Rules for parentheses around subqueries in compound select. -CSQ_PARENTHESES_NEVER = 0 -CSQ_PARENTHESES_ALWAYS = 1 -CSQ_PARENTHESES_UNNESTED = 2 - -# Regular expressions used to convert class names to snake-case table names. -# First regex handles acronym followed by word or initial lower-word followed -# by a capitalized word. e.g. APIResponse -> API_Response / fooBar -> foo_Bar. -# Second regex handles the normal case of two title-cased words. -SNAKE_CASE_STEP1 = re.compile('(.)_*([A-Z][a-z]+)') -SNAKE_CASE_STEP2 = re.compile('([a-z0-9])_*([A-Z])') - -# Helper functions that are used in various parts of the codebase. -MODEL_BASE = '_metaclass_helper_' - -def with_metaclass(meta, base=object): - return meta(MODEL_BASE, (base,), {}) - -def merge_dict(source, overrides): - merged = source.copy() - if overrides: - merged.update(overrides) - return merged - -def quote(path, quote_chars): - if len(path) == 1: - return path[0].join(quote_chars) - return '.'.join([part.join(quote_chars) for part in path]) - -is_model = lambda o: isclass(o) and issubclass(o, Model) - -def ensure_tuple(value): - if value is not None: - return value if isinstance(value, (list, tuple)) else (value,) - -def ensure_entity(value): - if value is not None: - return value if isinstance(value, Node) else Entity(value) - -def make_snake_case(s): - first = SNAKE_CASE_STEP1.sub(r'\1_\2', s) - return SNAKE_CASE_STEP2.sub(r'\1_\2', first).lower() - -def chunked(it, n): - marker = object() - for group in (list(g) for g in izip_longest(*[iter(it)] * n, - fillvalue=marker)): - if group[-1] is marker: - del group[group.index(marker):] - yield group - - -class _callable_context_manager(object): - def __call__(self, fn): - @wraps(fn) - def inner(*args, **kwargs): - with self: - return fn(*args, **kwargs) - return inner - - -class Proxy(object): - """ - Create a proxy or placeholder for another object. - """ - __slots__ = ('obj', '_callbacks') - - def __init__(self): - self._callbacks = [] - self.initialize(None) - - def initialize(self, obj): - self.obj = obj - for callback in self._callbacks: - callback(obj) - - def attach_callback(self, callback): - self._callbacks.append(callback) - return callback - - def passthrough(method): - def inner(self, *args, **kwargs): - if self.obj is None: - raise AttributeError('Cannot use uninitialized Proxy.') - return getattr(self.obj, method)(*args, **kwargs) - return inner - - # Allow proxy to be used as a context-manager. - __enter__ = passthrough('__enter__') - __exit__ = passthrough('__exit__') - - def __getattr__(self, attr): - if self.obj is None: - raise AttributeError('Cannot use uninitialized Proxy.') - return getattr(self.obj, attr) - - def __setattr__(self, attr, value): - if attr not in self.__slots__: - raise AttributeError('Cannot set attribute on proxy.') - return super(Proxy, self).__setattr__(attr, value) - - -class DatabaseProxy(Proxy): - """ - Proxy implementation specifically for proxying `Database` objects. - """ - def connection_context(self): - return ConnectionContext(self) - def atomic(self, *args, **kwargs): - return _atomic(self, *args, **kwargs) - def manual_commit(self): - return _manual(self) - def transaction(self, *args, **kwargs): - return _transaction(self, *args, **kwargs) - def savepoint(self): - return _savepoint(self) - - -class ModelDescriptor(object): pass - - -# SQL Generation. - - -class AliasManager(object): - __slots__ = ('_counter', '_current_index', '_mapping') - - def __init__(self): - # A list of dictionaries containing mappings at various depths. - self._counter = 0 - self._current_index = 0 - self._mapping = [] - self.push() - - @property - def mapping(self): - return self._mapping[self._current_index - 1] - - def add(self, source): - if source not in self.mapping: - self._counter += 1 - self[source] = 't%d' % self._counter - return self.mapping[source] - - def get(self, source, any_depth=False): - if any_depth: - for idx in reversed(range(self._current_index)): - if source in self._mapping[idx]: - return self._mapping[idx][source] - return self.add(source) - - def __getitem__(self, source): - return self.get(source) - - def __setitem__(self, source, alias): - self.mapping[source] = alias - - def push(self): - self._current_index += 1 - if self._current_index > len(self._mapping): - self._mapping.append({}) - - def pop(self): - if self._current_index == 1: - raise ValueError('Cannot pop() from empty alias manager.') - self._current_index -= 1 - - -class State(collections.namedtuple('_State', ('scope', 'parentheses', - 'settings'))): - def __new__(cls, scope=SCOPE_NORMAL, parentheses=False, **kwargs): - return super(State, cls).__new__(cls, scope, parentheses, kwargs) - - def __call__(self, scope=None, parentheses=None, **kwargs): - # Scope and settings are "inherited" (parentheses is not, however). - scope = self.scope if scope is None else scope - - # Try to avoid unnecessary dict copying. - if kwargs and self.settings: - settings = self.settings.copy() # Copy original settings dict. - settings.update(kwargs) # Update copy with overrides. - elif kwargs: - settings = kwargs - else: - settings = self.settings - return State(scope, parentheses, **settings) - - def __getattr__(self, attr_name): - return self.settings.get(attr_name) - - -def __scope_context__(scope): - @contextmanager - def inner(self, **kwargs): - with self(scope=scope, **kwargs): - yield self - return inner - - -class Context(object): - __slots__ = ('stack', '_sql', '_values', 'alias_manager', 'state') - - def __init__(self, **settings): - self.stack = [] - self._sql = [] - self._values = [] - self.alias_manager = AliasManager() - self.state = State(**settings) - - def as_new(self): - return Context(**self.state.settings) - - def column_sort_key(self, item): - return item[0].get_sort_key(self) - - @property - def scope(self): - return self.state.scope - - @property - def parentheses(self): - return self.state.parentheses - - @property - def subquery(self): - return self.state.subquery - - def __call__(self, **overrides): - if overrides and overrides.get('scope') == self.scope: - del overrides['scope'] - - self.stack.append(self.state) - self.state = self.state(**overrides) - return self - - scope_normal = __scope_context__(SCOPE_NORMAL) - scope_source = __scope_context__(SCOPE_SOURCE) - scope_values = __scope_context__(SCOPE_VALUES) - scope_cte = __scope_context__(SCOPE_CTE) - scope_column = __scope_context__(SCOPE_COLUMN) - - def __enter__(self): - if self.parentheses: - self.literal('(') - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - if self.parentheses: - self.literal(')') - self.state = self.stack.pop() - - @contextmanager - def push_alias(self): - self.alias_manager.push() - yield - self.alias_manager.pop() - - def sql(self, obj): - if isinstance(obj, (Node, Context)): - return obj.__sql__(self) - elif is_model(obj): - return obj._meta.table.__sql__(self) - else: - return self.sql(Value(obj)) - - def literal(self, keyword): - self._sql.append(keyword) - return self - - def value(self, value, converter=None, add_param=True): - if converter: - value = converter(value) - elif converter is None and self.state.converter: - # Explicitly check for None so that "False" can be used to signify - # that no conversion should be applied. - value = self.state.converter(value) - - if isinstance(value, Node): - with self(converter=None): - return self.sql(value) - elif is_model(value): - # Under certain circumstances, we could end-up treating a model- - # class itself as a value. This check ensures that we drop the - # table alias into the query instead of trying to parameterize a - # model (for instance, passing a model as a function argument). - with self.scope_column(): - return self.sql(value) - - if self.state.value_literals: - return self.literal(_query_val_transform(value)) - - self._values.append(value) - return self.literal(self.state.param or '?') if add_param else self - - def __sql__(self, ctx): - ctx._sql.extend(self._sql) - ctx._values.extend(self._values) - return ctx - - def parse(self, node): - return self.sql(node).query() - - def query(self): - return ''.join(self._sql), self._values - - -def query_to_string(query): - # NOTE: this function is not exported by default as it might be misused -- - # and this misuse could lead to sql injection vulnerabilities. This - # function is intended for debugging or logging purposes ONLY. - db = getattr(query, '_database', None) - if db is not None: - ctx = db.get_sql_context() - else: - ctx = Context() - - sql, params = ctx.sql(query).query() - if not params: - return sql - - param = ctx.state.param or '?' - if param == '?': - sql = sql.replace('?', '%s') - - return sql % tuple(map(_query_val_transform, params)) - -def _query_val_transform(v): - # Interpolate parameters. - if isinstance(v, (text_type, datetime.datetime, datetime.date, - datetime.time)): - v = "'%s'" % v - elif isinstance(v, bytes_type): - try: - v = v.decode('utf8') - except UnicodeDecodeError: - v = v.decode('raw_unicode_escape') - v = "'%s'" % v - elif isinstance(v, int): - v = '%s' % int(v) # Also handles booleans -> 1 or 0. - elif v is None: - v = 'NULL' - else: - v = str(v) - return v - - -# AST. - - -class Node(object): - _coerce = True - - def clone(self): - obj = self.__class__.__new__(self.__class__) - obj.__dict__ = self.__dict__.copy() - return obj - - def __sql__(self, ctx): - raise NotImplementedError - - @staticmethod - def copy(method): - def inner(self, *args, **kwargs): - clone = self.clone() - method(clone, *args, **kwargs) - return clone - return inner - - def coerce(self, _coerce=True): - if _coerce != self._coerce: - clone = self.clone() - clone._coerce = _coerce - return clone - return self - - def is_alias(self): - return False - - def unwrap(self): - return self - - -class ColumnFactory(object): - __slots__ = ('node',) - - def __init__(self, node): - self.node = node - - def __getattr__(self, attr): - return Column(self.node, attr) - - -class _DynamicColumn(object): - __slots__ = () - - def __get__(self, instance, instance_type=None): - if instance is not None: - return ColumnFactory(instance) # Implements __getattr__(). - return self - - -class _ExplicitColumn(object): - __slots__ = () - - def __get__(self, instance, instance_type=None): - if instance is not None: - raise AttributeError( - '%s specifies columns explicitly, and does not support ' - 'dynamic column lookups.' % instance) - return self - - -class Source(Node): - c = _DynamicColumn() - - def __init__(self, alias=None): - super(Source, self).__init__() - self._alias = alias - - @Node.copy - def alias(self, name): - self._alias = name - - def select(self, *columns): - if not columns: - columns = (SQL('*'),) - return Select((self,), columns) - - def join(self, dest, join_type=JOIN.INNER, on=None): - return Join(self, dest, join_type, on) - - def left_outer_join(self, dest, on=None): - return Join(self, dest, JOIN.LEFT_OUTER, on) - - def cte(self, name, recursive=False, columns=None, materialized=None): - return CTE(name, self, recursive=recursive, columns=columns, - materialized=materialized) - - def get_sort_key(self, ctx): - if self._alias: - return (self._alias,) - return (ctx.alias_manager[self],) - - def apply_alias(self, ctx): - # If we are defining the source, include the "AS alias" declaration. An - # alias is created for the source if one is not already defined. - if ctx.scope == SCOPE_SOURCE: - if self._alias: - ctx.alias_manager[self] = self._alias - ctx.literal(' AS ').sql(Entity(ctx.alias_manager[self])) - return ctx - - def apply_column(self, ctx): - if self._alias: - ctx.alias_manager[self] = self._alias - return ctx.sql(Entity(ctx.alias_manager[self])) - - -class _HashableSource(object): - def __init__(self, *args, **kwargs): - super(_HashableSource, self).__init__(*args, **kwargs) - self._update_hash() - - @Node.copy - def alias(self, name): - self._alias = name - self._update_hash() - - def _update_hash(self): - self._hash = self._get_hash() - - def _get_hash(self): - return hash((self.__class__, self._path, self._alias)) - - def __hash__(self): - return self._hash - - def __eq__(self, other): - if isinstance(other, _HashableSource): - return self._hash == other._hash - return Expression(self, OP.EQ, other) - - def __ne__(self, other): - if isinstance(other, _HashableSource): - return self._hash != other._hash - return Expression(self, OP.NE, other) - - def _e(op): - def inner(self, rhs): - return Expression(self, op, rhs) - return inner - __lt__ = _e(OP.LT) - __le__ = _e(OP.LTE) - __gt__ = _e(OP.GT) - __ge__ = _e(OP.GTE) - - -def __bind_database__(meth): - @wraps(meth) - def inner(self, *args, **kwargs): - result = meth(self, *args, **kwargs) - if self._database: - return result.bind(self._database) - return result - return inner - - -def __join__(join_type=JOIN.INNER, inverted=False): - def method(self, other): - if inverted: - self, other = other, self - return Join(self, other, join_type=join_type) - return method - - -class BaseTable(Source): - __and__ = __join__(JOIN.INNER) - __add__ = __join__(JOIN.LEFT_OUTER) - __sub__ = __join__(JOIN.RIGHT_OUTER) - __or__ = __join__(JOIN.FULL_OUTER) - __mul__ = __join__(JOIN.CROSS) - __rand__ = __join__(JOIN.INNER, inverted=True) - __radd__ = __join__(JOIN.LEFT_OUTER, inverted=True) - __rsub__ = __join__(JOIN.RIGHT_OUTER, inverted=True) - __ror__ = __join__(JOIN.FULL_OUTER, inverted=True) - __rmul__ = __join__(JOIN.CROSS, inverted=True) - - -class _BoundTableContext(_callable_context_manager): - def __init__(self, table, database): - self.table = table - self.database = database - - def __enter__(self): - self._orig_database = self.table._database - self.table.bind(self.database) - if self.table._model is not None: - self.table._model.bind(self.database) - return self.table - - def __exit__(self, exc_type, exc_val, exc_tb): - self.table.bind(self._orig_database) - if self.table._model is not None: - self.table._model.bind(self._orig_database) - - -class Table(_HashableSource, BaseTable): - def __init__(self, name, columns=None, primary_key=None, schema=None, - alias=None, _model=None, _database=None): - self.__name__ = name - self._columns = columns - self._primary_key = primary_key - self._schema = schema - self._path = (schema, name) if schema else (name,) - self._model = _model - self._database = _database - super(Table, self).__init__(alias=alias) - - # Allow tables to restrict what columns are available. - if columns is not None: - self.c = _ExplicitColumn() - for column in columns: - setattr(self, column, Column(self, column)) - - if primary_key: - col_src = self if self._columns else self.c - self.primary_key = getattr(col_src, primary_key) - else: - self.primary_key = None - - def clone(self): - # Ensure a deep copy of the column instances. - return Table( - self.__name__, - columns=self._columns, - primary_key=self._primary_key, - schema=self._schema, - alias=self._alias, - _model=self._model, - _database=self._database) - - def bind(self, database=None): - self._database = database - return self - - def bind_ctx(self, database=None): - return _BoundTableContext(self, database) - - def _get_hash(self): - return hash((self.__class__, self._path, self._alias, self._model)) - - @__bind_database__ - def select(self, *columns): - if not columns and self._columns: - columns = [Column(self, column) for column in self._columns] - return Select((self,), columns) - - @__bind_database__ - def insert(self, insert=None, columns=None, **kwargs): - if kwargs: - insert = {} if insert is None else insert - src = self if self._columns else self.c - for key, value in kwargs.items(): - insert[getattr(src, key)] = value - return Insert(self, insert=insert, columns=columns) - - @__bind_database__ - def replace(self, insert=None, columns=None, **kwargs): - return (self - .insert(insert=insert, columns=columns) - .on_conflict('REPLACE')) - - @__bind_database__ - def update(self, update=None, **kwargs): - if kwargs: - update = {} if update is None else update - for key, value in kwargs.items(): - src = self if self._columns else self.c - update[getattr(src, key)] = value - return Update(self, update=update) - - @__bind_database__ - def delete(self): - return Delete(self) - - def __sql__(self, ctx): - if ctx.scope == SCOPE_VALUES: - # Return the quoted table name. - return ctx.sql(Entity(*self._path)) - - if self._alias: - ctx.alias_manager[self] = self._alias - - if ctx.scope == SCOPE_SOURCE: - # Define the table and its alias. - return self.apply_alias(ctx.sql(Entity(*self._path))) - else: - # Refer to the table using the alias. - return self.apply_column(ctx) - - -class Join(BaseTable): - def __init__(self, lhs, rhs, join_type=JOIN.INNER, on=None, alias=None): - super(Join, self).__init__(alias=alias) - self.lhs = lhs - self.rhs = rhs - self.join_type = join_type - self._on = on - - def on(self, predicate): - self._on = predicate - return self - - def __sql__(self, ctx): - (ctx - .sql(self.lhs) - .literal(' %s ' % self.join_type) - .sql(self.rhs)) - if self._on is not None: - ctx.literal(' ON ').sql(self._on) - return ctx - - -class ValuesList(_HashableSource, BaseTable): - def __init__(self, values, columns=None, alias=None): - self._values = values - self._columns = columns - super(ValuesList, self).__init__(alias=alias) - - def _get_hash(self): - return hash((self.__class__, id(self._values), self._alias)) - - @Node.copy - def columns(self, *names): - self._columns = names - - def __sql__(self, ctx): - if self._alias: - ctx.alias_manager[self] = self._alias - - if ctx.scope == SCOPE_SOURCE or ctx.scope == SCOPE_NORMAL: - with ctx(parentheses=not ctx.parentheses): - ctx = (ctx - .literal('VALUES ') - .sql(CommaNodeList([ - EnclosedNodeList(row) for row in self._values]))) - - if ctx.scope == SCOPE_SOURCE: - ctx.literal(' AS ').sql(Entity(ctx.alias_manager[self])) - if self._columns: - entities = [Entity(c) for c in self._columns] - ctx.sql(EnclosedNodeList(entities)) - else: - ctx.sql(Entity(ctx.alias_manager[self])) - - return ctx - - -class CTE(_HashableSource, Source): - def __init__(self, name, query, recursive=False, columns=None, - materialized=None): - self._alias = name - self._query = query - self._recursive = recursive - self._materialized = materialized - if columns is not None: - columns = [Entity(c) if isinstance(c, basestring) else c - for c in columns] - self._columns = columns - query._cte_list = () - super(CTE, self).__init__(alias=name) - - def select_from(self, *columns): - if not columns: - raise ValueError('select_from() must specify one or more columns ' - 'from the CTE to select.') - - query = (Select((self,), columns) - .with_cte(self) - .bind(self._query._database)) - try: - query = query.objects(self._query.model) - except AttributeError: - pass - return query - - def _get_hash(self): - return hash((self.__class__, self._alias, id(self._query))) - - def union_all(self, rhs): - clone = self._query.clone() - return CTE(self._alias, clone + rhs, self._recursive, self._columns) - __add__ = union_all - - def union(self, rhs): - clone = self._query.clone() - return CTE(self._alias, clone | rhs, self._recursive, self._columns) - __or__ = union - - def __sql__(self, ctx): - if ctx.scope != SCOPE_CTE: - return ctx.sql(Entity(self._alias)) - - with ctx.push_alias(): - ctx.alias_manager[self] = self._alias - ctx.sql(Entity(self._alias)) - - if self._columns: - ctx.literal(' ').sql(EnclosedNodeList(self._columns)) - ctx.literal(' AS ') - - if self._materialized: - ctx.literal('MATERIALIZED ') - elif self._materialized is False: - ctx.literal('NOT MATERIALIZED ') - - with ctx.scope_normal(parentheses=True): - ctx.sql(self._query) - return ctx - - -class ColumnBase(Node): - _converter = None - - @Node.copy - def converter(self, converter=None): - self._converter = converter - - def alias(self, alias): - if alias: - return Alias(self, alias) - return self - - def unalias(self): - return self - - def cast(self, as_type): - return Cast(self, as_type) - - def asc(self, collation=None, nulls=None): - return Asc(self, collation=collation, nulls=nulls) - __pos__ = asc - - def desc(self, collation=None, nulls=None): - return Desc(self, collation=collation, nulls=nulls) - __neg__ = desc - - def __invert__(self): - return Negated(self) - - def _e(op, inv=False): - """ - Lightweight factory which returns a method that builds an Expression - consisting of the left-hand and right-hand operands, using `op`. - """ - def inner(self, rhs): - if inv: - return Expression(rhs, op, self) - return Expression(self, op, rhs) - return inner - __and__ = _e(OP.AND) - __or__ = _e(OP.OR) - - __add__ = _e(OP.ADD) - __sub__ = _e(OP.SUB) - __mul__ = _e(OP.MUL) - __div__ = __truediv__ = _e(OP.DIV) - __xor__ = _e(OP.XOR) - __radd__ = _e(OP.ADD, inv=True) - __rsub__ = _e(OP.SUB, inv=True) - __rmul__ = _e(OP.MUL, inv=True) - __rdiv__ = __rtruediv__ = _e(OP.DIV, inv=True) - __rand__ = _e(OP.AND, inv=True) - __ror__ = _e(OP.OR, inv=True) - __rxor__ = _e(OP.XOR, inv=True) - - def __eq__(self, rhs): - op = OP.IS if rhs is None else OP.EQ - return Expression(self, op, rhs) - def __ne__(self, rhs): - op = OP.IS_NOT if rhs is None else OP.NE - return Expression(self, op, rhs) - - __lt__ = _e(OP.LT) - __le__ = _e(OP.LTE) - __gt__ = _e(OP.GT) - __ge__ = _e(OP.GTE) - __lshift__ = _e(OP.IN) - __rshift__ = _e(OP.IS) - __mod__ = _e(OP.LIKE) - __pow__ = _e(OP.ILIKE) - - like = _e(OP.LIKE) - ilike = _e(OP.ILIKE) - - bin_and = _e(OP.BIN_AND) - bin_or = _e(OP.BIN_OR) - in_ = _e(OP.IN) - not_in = _e(OP.NOT_IN) - regexp = _e(OP.REGEXP) - - # Special expressions. - def is_null(self, is_null=True): - op = OP.IS if is_null else OP.IS_NOT - return Expression(self, op, None) - - def _escape_like_expr(self, s, template): - if s.find('_') >= 0 or s.find('%') >= 0 or s.find('\\') >= 0: - s = s.replace('\\', '\\\\').replace('_', '\\_').replace('%', '\\%') - return NodeList((template % s, SQL('ESCAPE'), '\\')) - return template % s - def contains(self, rhs): - if isinstance(rhs, Node): - rhs = Expression('%', OP.CONCAT, - Expression(rhs, OP.CONCAT, '%')) - else: - rhs = self._escape_like_expr(rhs, '%%%s%%') - return Expression(self, OP.ILIKE, rhs) - def startswith(self, rhs): - if isinstance(rhs, Node): - rhs = Expression(rhs, OP.CONCAT, '%') - else: - rhs = self._escape_like_expr(rhs, '%s%%') - return Expression(self, OP.ILIKE, rhs) - def endswith(self, rhs): - if isinstance(rhs, Node): - rhs = Expression('%', OP.CONCAT, rhs) - else: - rhs = self._escape_like_expr(rhs, '%%%s') - return Expression(self, OP.ILIKE, rhs) - def between(self, lo, hi): - return Expression(self, OP.BETWEEN, NodeList((lo, SQL('AND'), hi))) - def concat(self, rhs): - return StringExpression(self, OP.CONCAT, rhs) - def regexp(self, rhs): - return Expression(self, OP.REGEXP, rhs) - def iregexp(self, rhs): - return Expression(self, OP.IREGEXP, rhs) - def __getitem__(self, item): - if isinstance(item, slice): - if item.start is None or item.stop is None: - raise ValueError('BETWEEN range must have both a start- and ' - 'end-point.') - return self.between(item.start, item.stop) - return self == item - - def distinct(self): - return NodeList((SQL('DISTINCT'), self)) - - def collate(self, collation): - return NodeList((self, SQL('COLLATE %s' % collation))) - - def get_sort_key(self, ctx): - return () - - -class Column(ColumnBase): - def __init__(self, source, name): - self.source = source - self.name = name - - def get_sort_key(self, ctx): - if ctx.scope == SCOPE_VALUES: - return (self.name,) - else: - return self.source.get_sort_key(ctx) + (self.name,) - - def __hash__(self): - return hash((self.source, self.name)) - - def __sql__(self, ctx): - if ctx.scope == SCOPE_VALUES: - return ctx.sql(Entity(self.name)) - else: - with ctx.scope_column(): - return ctx.sql(self.source).literal('.').sql(Entity(self.name)) - - -class WrappedNode(ColumnBase): - def __init__(self, node): - self.node = node - self._coerce = getattr(node, '_coerce', True) - self._converter = getattr(node, '_converter', None) - - def is_alias(self): - return self.node.is_alias() - - def unwrap(self): - return self.node.unwrap() - - -class EntityFactory(object): - __slots__ = ('node',) - def __init__(self, node): - self.node = node - def __getattr__(self, attr): - return Entity(self.node, attr) - - -class _DynamicEntity(object): - __slots__ = () - def __get__(self, instance, instance_type=None): - if instance is not None: - return EntityFactory(instance._alias) # Implements __getattr__(). - return self - - -class Alias(WrappedNode): - c = _DynamicEntity() - - def __init__(self, node, alias): - super(Alias, self).__init__(node) - self._alias = alias - - def __hash__(self): - return hash(self._alias) - - @property - def name(self): - return self._alias - @name.setter - def name(self, value): - self._alias = value - - def alias(self, alias=None): - if alias is None: - return self.node - else: - return Alias(self.node, alias) - - def unalias(self): - return self.node - - def is_alias(self): - return True - - def __sql__(self, ctx): - if ctx.scope == SCOPE_SOURCE: - return (ctx - .sql(self.node) - .literal(' AS ') - .sql(Entity(self._alias))) - else: - return ctx.sql(Entity(self._alias)) - - -class Negated(WrappedNode): - def __invert__(self): - return self.node - - def __sql__(self, ctx): - return ctx.literal('NOT ').sql(self.node) - - -class BitwiseMixin(object): - def __and__(self, other): - return self.bin_and(other) - - def __or__(self, other): - return self.bin_or(other) - - def __sub__(self, other): - return self.bin_and(other.bin_negated()) - - def __invert__(self): - return BitwiseNegated(self) - - -class BitwiseNegated(BitwiseMixin, WrappedNode): - def __invert__(self): - return self.node - - def __sql__(self, ctx): - if ctx.state.operations: - op_sql = ctx.state.operations.get(self.op, self.op) - else: - op_sql = self.op - return ctx.literal(op_sql).sql(self.node) - - -class Value(ColumnBase): - def __init__(self, value, converter=None, unpack=True): - self.value = value - self.converter = converter - self.multi = unpack and isinstance(self.value, multi_types) - if self.multi: - self.values = [] - for item in self.value: - if isinstance(item, Node): - self.values.append(item) - else: - self.values.append(Value(item, self.converter)) - - def __sql__(self, ctx): - if self.multi: - # For multi-part values (e.g. lists of IDs). - return ctx.sql(EnclosedNodeList(self.values)) - - return ctx.value(self.value, self.converter) - - -class ValueLiterals(WrappedNode): - def __sql__(self, ctx): - with ctx(value_literals=True): - return ctx.sql(self.node) - - -def AsIs(value): - return Value(value, unpack=False) - - -class Cast(WrappedNode): - def __init__(self, node, cast): - super(Cast, self).__init__(node) - self._cast = cast - self._coerce = False - - def __sql__(self, ctx): - return (ctx - .literal('CAST(') - .sql(self.node) - .literal(' AS %s)' % self._cast)) - - -class Ordering(WrappedNode): - def __init__(self, node, direction, collation=None, nulls=None): - super(Ordering, self).__init__(node) - self.direction = direction - self.collation = collation - self.nulls = nulls - if nulls and nulls.lower() not in ('first', 'last'): - raise ValueError('Ordering nulls= parameter must be "first" or ' - '"last", got: %s' % nulls) - - def collate(self, collation=None): - return Ordering(self.node, self.direction, collation) - - def _null_ordering_case(self, nulls): - if nulls.lower() == 'last': - ifnull, notnull = 1, 0 - elif nulls.lower() == 'first': - ifnull, notnull = 0, 1 - else: - raise ValueError('unsupported value for nulls= ordering.') - return Case(None, ((self.node.is_null(), ifnull),), notnull) - - def __sql__(self, ctx): - if self.nulls and not ctx.state.nulls_ordering: - ctx.sql(self._null_ordering_case(self.nulls)).literal(', ') - - ctx.sql(self.node).literal(' %s' % self.direction) - if self.collation: - ctx.literal(' COLLATE %s' % self.collation) - if self.nulls and ctx.state.nulls_ordering: - ctx.literal(' NULLS %s' % self.nulls) - return ctx - - -def Asc(node, collation=None, nulls=None): - return Ordering(node, 'ASC', collation, nulls) - - -def Desc(node, collation=None, nulls=None): - return Ordering(node, 'DESC', collation, nulls) - - -class Expression(ColumnBase): - def __init__(self, lhs, op, rhs, flat=False): - self.lhs = lhs - self.op = op - self.rhs = rhs - self.flat = flat - - def __sql__(self, ctx): - overrides = {'parentheses': not self.flat, 'in_expr': True} - - # First attempt to unwrap the node on the left-hand-side, so that we - # can get at the underlying Field if one is present. - node = raw_node = self.lhs - if isinstance(raw_node, WrappedNode): - node = raw_node.unwrap() - - # Set up the appropriate converter if we have a field on the left side. - if isinstance(node, Field) and raw_node._coerce: - overrides['converter'] = node.db_value - overrides['is_fk_expr'] = isinstance(node, ForeignKeyField) - else: - overrides['converter'] = None - - if ctx.state.operations: - op_sql = ctx.state.operations.get(self.op, self.op) - else: - op_sql = self.op - - with ctx(**overrides): - # Postgresql reports an error for IN/NOT IN (), so convert to - # the equivalent boolean expression. - op_in = self.op == OP.IN or self.op == OP.NOT_IN - if op_in and ctx.as_new().parse(self.rhs)[0] == '()': - return ctx.literal('0 = 1' if self.op == OP.IN else '1 = 1') - - return (ctx - .sql(self.lhs) - .literal(' %s ' % op_sql) - .sql(self.rhs)) - - -class StringExpression(Expression): - def __add__(self, rhs): - return self.concat(rhs) - def __radd__(self, lhs): - return StringExpression(lhs, OP.CONCAT, self) - - -class Entity(ColumnBase): - def __init__(self, *path): - self._path = [part.replace('"', '""') for part in path if part] - - def __getattr__(self, attr): - return Entity(*self._path + [attr]) - - def get_sort_key(self, ctx): - return tuple(self._path) - - def __hash__(self): - return hash((self.__class__.__name__, tuple(self._path))) - - def __sql__(self, ctx): - return ctx.literal(quote(self._path, ctx.state.quote or '""')) - - -class SQL(ColumnBase): - def __init__(self, sql, params=None): - self.sql = sql - self.params = params - - def __sql__(self, ctx): - ctx.literal(self.sql) - if self.params: - for param in self.params: - ctx.value(param, False, add_param=False) - return ctx - - -def Check(constraint, name=None): - check = SQL('CHECK (%s)' % constraint) - if not name: - return check - return NodeList((SQL('CONSTRAINT'), Entity(name), check)) - - -class Function(ColumnBase): - def __init__(self, name, arguments, coerce=True, python_value=None): - self.name = name - self.arguments = arguments - self._filter = None - self._order_by = None - self._python_value = python_value - if name and name.lower() in ('sum', 'count', 'cast', 'array_agg'): - self._coerce = False - else: - self._coerce = coerce - - def __getattr__(self, attr): - def decorator(*args, **kwargs): - return Function(attr, args, **kwargs) - return decorator - - @Node.copy - def filter(self, where=None): - self._filter = where - - @Node.copy - def order_by(self, *ordering): - self._order_by = ordering - - @Node.copy - def python_value(self, func=None): - self._python_value = func - - def over(self, partition_by=None, order_by=None, start=None, end=None, - frame_type=None, window=None, exclude=None): - if isinstance(partition_by, Window) and window is None: - window = partition_by - - if window is not None: - node = WindowAlias(window) - else: - node = Window(partition_by=partition_by, order_by=order_by, - start=start, end=end, frame_type=frame_type, - exclude=exclude, _inline=True) - return NodeList((self, SQL('OVER'), node)) - - def __sql__(self, ctx): - ctx.literal(self.name) - if not len(self.arguments): - ctx.literal('()') - else: - args = self.arguments - - # If this is an ordered aggregate, then we will modify the last - # argument to append the ORDER BY ... clause. We do this to avoid - # double-wrapping any expression args in parentheses, as NodeList - # has a special check (hack) in place to work around this. - if self._order_by: - args = list(args) - args[-1] = NodeList((args[-1], SQL('ORDER BY'), - CommaNodeList(self._order_by))) - - with ctx(in_function=True, function_arg_count=len(self.arguments)): - ctx.sql(EnclosedNodeList([ - (arg if isinstance(arg, Node) else Value(arg, False)) - for arg in args])) - - if self._filter: - ctx.literal(' FILTER (WHERE ').sql(self._filter).literal(')') - return ctx - - -fn = Function(None, None) - - -class Window(Node): - # Frame start/end and frame exclusion. - CURRENT_ROW = SQL('CURRENT ROW') - GROUP = SQL('GROUP') - TIES = SQL('TIES') - NO_OTHERS = SQL('NO OTHERS') - - # Frame types. - GROUPS = 'GROUPS' - RANGE = 'RANGE' - ROWS = 'ROWS' - - def __init__(self, partition_by=None, order_by=None, start=None, end=None, - frame_type=None, extends=None, exclude=None, alias=None, - _inline=False): - super(Window, self).__init__() - if start is not None and not isinstance(start, SQL): - start = SQL(start) - if end is not None and not isinstance(end, SQL): - end = SQL(end) - - self.partition_by = ensure_tuple(partition_by) - self.order_by = ensure_tuple(order_by) - self.start = start - self.end = end - if self.start is None and self.end is not None: - raise ValueError('Cannot specify WINDOW end without start.') - self._alias = alias or 'w' - self._inline = _inline - self.frame_type = frame_type - self._extends = extends - self._exclude = exclude - - def alias(self, alias=None): - self._alias = alias or 'w' - return self - - @Node.copy - def as_range(self): - self.frame_type = Window.RANGE - - @Node.copy - def as_rows(self): - self.frame_type = Window.ROWS - - @Node.copy - def as_groups(self): - self.frame_type = Window.GROUPS - - @Node.copy - def extends(self, window=None): - self._extends = window - - @Node.copy - def exclude(self, frame_exclusion=None): - if isinstance(frame_exclusion, basestring): - frame_exclusion = SQL(frame_exclusion) - self._exclude = frame_exclusion - - @staticmethod - def following(value=None): - if value is None: - return SQL('UNBOUNDED FOLLOWING') - return SQL('%d FOLLOWING' % value) - - @staticmethod - def preceding(value=None): - if value is None: - return SQL('UNBOUNDED PRECEDING') - return SQL('%d PRECEDING' % value) - - def __sql__(self, ctx): - if ctx.scope != SCOPE_SOURCE and not self._inline: - ctx.literal(self._alias) - ctx.literal(' AS ') - - with ctx(parentheses=True): - parts = [] - if self._extends is not None: - ext = self._extends - if isinstance(ext, Window): - ext = SQL(ext._alias) - elif isinstance(ext, basestring): - ext = SQL(ext) - parts.append(ext) - if self.partition_by: - parts.extend(( - SQL('PARTITION BY'), - CommaNodeList(self.partition_by))) - if self.order_by: - parts.extend(( - SQL('ORDER BY'), - CommaNodeList(self.order_by))) - if self.start is not None and self.end is not None: - frame = self.frame_type or 'ROWS' - parts.extend(( - SQL('%s BETWEEN' % frame), - self.start, - SQL('AND'), - self.end)) - elif self.start is not None: - parts.extend((SQL(self.frame_type or 'ROWS'), self.start)) - elif self.frame_type is not None: - parts.append(SQL('%s UNBOUNDED PRECEDING' % self.frame_type)) - if self._exclude is not None: - parts.extend((SQL('EXCLUDE'), self._exclude)) - ctx.sql(NodeList(parts)) - return ctx - - -class WindowAlias(Node): - def __init__(self, window): - self.window = window - - def alias(self, window_alias): - self.window._alias = window_alias - return self - - def __sql__(self, ctx): - return ctx.literal(self.window._alias or 'w') - - -class ForUpdate(Node): - def __init__(self, expr, of=None, nowait=None): - expr = 'FOR UPDATE' if expr is True else expr - if expr.lower().endswith('nowait'): - expr = expr[:-7] # Strip off the "nowait" bit. - nowait = True - - self._expr = expr - if of is not None and not isinstance(of, (list, set, tuple)): - of = (of,) - self._of = of - self._nowait = nowait - - def __sql__(self, ctx): - ctx.literal(self._expr) - if self._of is not None: - ctx.literal(' OF ').sql(CommaNodeList(self._of)) - if self._nowait: - ctx.literal(' NOWAIT') - return ctx - - -def Case(predicate, expression_tuples, default=None): - clauses = [SQL('CASE')] - if predicate is not None: - clauses.append(predicate) - for expr, value in expression_tuples: - clauses.extend((SQL('WHEN'), expr, SQL('THEN'), value)) - if default is not None: - clauses.extend((SQL('ELSE'), default)) - clauses.append(SQL('END')) - return NodeList(clauses) - - -class NodeList(ColumnBase): - def __init__(self, nodes, glue=' ', parens=False): - self.nodes = nodes - self.glue = glue - self.parens = parens - if parens and len(self.nodes) == 1 and \ - isinstance(self.nodes[0], Expression) and \ - not self.nodes[0].flat: - # Hack to avoid double-parentheses. - self.nodes = (self.nodes[0].clone(),) - self.nodes[0].flat = True - - def __sql__(self, ctx): - n_nodes = len(self.nodes) - if n_nodes == 0: - return ctx.literal('()') if self.parens else ctx - with ctx(parentheses=self.parens): - for i in range(n_nodes - 1): - ctx.sql(self.nodes[i]) - ctx.literal(self.glue) - ctx.sql(self.nodes[n_nodes - 1]) - return ctx - - -def CommaNodeList(nodes): - return NodeList(nodes, ', ') - - -def EnclosedNodeList(nodes): - return NodeList(nodes, ', ', True) - - -class _Namespace(Node): - __slots__ = ('_name',) - def __init__(self, name): - self._name = name - def __getattr__(self, attr): - return NamespaceAttribute(self, attr) - __getitem__ = __getattr__ - -class NamespaceAttribute(ColumnBase): - def __init__(self, namespace, attribute): - self._namespace = namespace - self._attribute = attribute - - def __sql__(self, ctx): - return (ctx - .literal(self._namespace._name + '.') - .sql(Entity(self._attribute))) - -EXCLUDED = _Namespace('EXCLUDED') - - -class DQ(ColumnBase): - def __init__(self, **query): - super(DQ, self).__init__() - self.query = query - self._negated = False - - @Node.copy - def __invert__(self): - self._negated = not self._negated - - def clone(self): - node = DQ(**self.query) - node._negated = self._negated - return node - -#: Represent a row tuple. -Tuple = lambda *a: EnclosedNodeList(a) - - -class QualifiedNames(WrappedNode): - def __sql__(self, ctx): - with ctx.scope_column(): - return ctx.sql(self.node) - - -def qualify_names(node): - # Search a node heirarchy to ensure that any column-like objects are - # referenced using fully-qualified names. - if isinstance(node, Expression): - return node.__class__(qualify_names(node.lhs), node.op, - qualify_names(node.rhs), node.flat) - elif isinstance(node, ColumnBase): - return QualifiedNames(node) - return node - - -class OnConflict(Node): - def __init__(self, action=None, update=None, preserve=None, where=None, - conflict_target=None, conflict_where=None, - conflict_constraint=None): - self._action = action - self._update = update - self._preserve = ensure_tuple(preserve) - self._where = where - if conflict_target is not None and conflict_constraint is not None: - raise ValueError('only one of "conflict_target" and ' - '"conflict_constraint" may be specified.') - self._conflict_target = ensure_tuple(conflict_target) - self._conflict_where = conflict_where - self._conflict_constraint = conflict_constraint - - def get_conflict_statement(self, ctx, query): - return ctx.state.conflict_statement(self, query) - - def get_conflict_update(self, ctx, query): - return ctx.state.conflict_update(self, query) - - @Node.copy - def preserve(self, *columns): - self._preserve = columns - - @Node.copy - def update(self, _data=None, **kwargs): - if _data and kwargs and not isinstance(_data, dict): - raise ValueError('Cannot mix data with keyword arguments in the ' - 'OnConflict update method.') - _data = _data or {} - if kwargs: - _data.update(kwargs) - self._update = _data - - @Node.copy - def where(self, *expressions): - if self._where is not None: - expressions = (self._where,) + expressions - self._where = reduce(operator.and_, expressions) - - @Node.copy - def conflict_target(self, *constraints): - self._conflict_constraint = None - self._conflict_target = constraints - - @Node.copy - def conflict_where(self, *expressions): - if self._conflict_where is not None: - expressions = (self._conflict_where,) + expressions - self._conflict_where = reduce(operator.and_, expressions) - - @Node.copy - def conflict_constraint(self, constraint): - self._conflict_constraint = constraint - self._conflict_target = None - - -def database_required(method): - @wraps(method) - def inner(self, database=None, *args, **kwargs): - database = self._database if database is None else database - if not database: - raise InterfaceError('Query must be bound to a database in order ' - 'to call "%s".' % method.__name__) - return method(self, database, *args, **kwargs) - return inner - -# BASE QUERY INTERFACE. - -class BaseQuery(Node): - default_row_type = ROW.DICT - - def __init__(self, _database=None, **kwargs): - self._database = _database - self._cursor_wrapper = None - self._row_type = None - self._constructor = None - super(BaseQuery, self).__init__(**kwargs) - - def bind(self, database=None): - self._database = database - return self - - def clone(self): - query = super(BaseQuery, self).clone() - query._cursor_wrapper = None - return query - - @Node.copy - def dicts(self, as_dict=True): - self._row_type = ROW.DICT if as_dict else None - return self - - @Node.copy - def tuples(self, as_tuple=True): - self._row_type = ROW.TUPLE if as_tuple else None - return self - - @Node.copy - def namedtuples(self, as_namedtuple=True): - self._row_type = ROW.NAMED_TUPLE if as_namedtuple else None - return self - - @Node.copy - def objects(self, constructor=None): - self._row_type = ROW.CONSTRUCTOR if constructor else None - self._constructor = constructor - return self - - def _get_cursor_wrapper(self, cursor): - row_type = self._row_type or self.default_row_type - - if row_type == ROW.DICT: - return DictCursorWrapper(cursor) - elif row_type == ROW.TUPLE: - return CursorWrapper(cursor) - elif row_type == ROW.NAMED_TUPLE: - return NamedTupleCursorWrapper(cursor) - elif row_type == ROW.CONSTRUCTOR: - return ObjectCursorWrapper(cursor, self._constructor) - else: - raise ValueError('Unrecognized row type: "%s".' % row_type) - - def __sql__(self, ctx): - raise NotImplementedError - - def sql(self): - if self._database: - context = self._database.get_sql_context() - else: - context = Context() - return context.parse(self) - - @database_required - def execute(self, database): - return self._execute(database) - - def _execute(self, database): - raise NotImplementedError - - def iterator(self, database=None): - return iter(self.execute(database).iterator()) - - def _ensure_execution(self): - if not self._cursor_wrapper: - if not self._database: - raise ValueError('Query has not been executed.') - self.execute() - - def __iter__(self): - self._ensure_execution() - return iter(self._cursor_wrapper) - - def __getitem__(self, value): - self._ensure_execution() - if isinstance(value, slice): - index = value.stop - else: - index = value - if index is not None: - index = index + 1 if index >= 0 else 0 - self._cursor_wrapper.fill_cache(index) - return self._cursor_wrapper.row_cache[value] - - def __len__(self): - self._ensure_execution() - return len(self._cursor_wrapper) - - def __str__(self): - return query_to_string(self) - - -class RawQuery(BaseQuery): - def __init__(self, sql=None, params=None, **kwargs): - super(RawQuery, self).__init__(**kwargs) - self._sql = sql - self._params = params - - def __sql__(self, ctx): - ctx.literal(self._sql) - if self._params: - for param in self._params: - ctx.value(param, add_param=False) - return ctx - - def _execute(self, database): - if self._cursor_wrapper is None: - cursor = database.execute(self) - self._cursor_wrapper = self._get_cursor_wrapper(cursor) - return self._cursor_wrapper - - -class Query(BaseQuery): - def __init__(self, where=None, order_by=None, limit=None, offset=None, - **kwargs): - super(Query, self).__init__(**kwargs) - self._where = where - self._order_by = order_by - self._limit = limit - self._offset = offset - - self._cte_list = None - - @Node.copy - def with_cte(self, *cte_list): - self._cte_list = cte_list - - @Node.copy - def where(self, *expressions): - if self._where is not None: - expressions = (self._where,) + expressions - self._where = reduce(operator.and_, expressions) - - @Node.copy - def orwhere(self, *expressions): - if self._where is not None: - expressions = (self._where,) + expressions - self._where = reduce(operator.or_, expressions) - - @Node.copy - def order_by(self, *values): - self._order_by = values - - @Node.copy - def order_by_extend(self, *values): - self._order_by = ((self._order_by or ()) + values) or None - - @Node.copy - def limit(self, value=None): - self._limit = value - - @Node.copy - def offset(self, value=None): - self._offset = value - - @Node.copy - def paginate(self, page, paginate_by=20): - if page > 0: - page -= 1 - self._limit = paginate_by - self._offset = page * paginate_by - - def _apply_ordering(self, ctx): - if self._order_by: - (ctx - .literal(' ORDER BY ') - .sql(CommaNodeList(self._order_by))) - if self._limit is not None or (self._offset is not None and - ctx.state.limit_max): - limit = ctx.state.limit_max if self._limit is None else self._limit - ctx.literal(' LIMIT ').sql(limit) - if self._offset is not None: - ctx.literal(' OFFSET ').sql(self._offset) - return ctx - - def __sql__(self, ctx): - if self._cte_list: - # The CTE scope is only used at the very beginning of the query, - # when we are describing the various CTEs we will be using. - recursive = any(cte._recursive for cte in self._cte_list) - - # Explicitly disable the "subquery" flag here, so as to avoid - # unnecessary parentheses around subsequent selects. - with ctx.scope_cte(subquery=False): - (ctx - .literal('WITH RECURSIVE ' if recursive else 'WITH ') - .sql(CommaNodeList(self._cte_list)) - .literal(' ')) - return ctx - - -def __compound_select__(operation, inverted=False): - @__bind_database__ - def method(self, other): - if inverted: - self, other = other, self - return CompoundSelectQuery(self, operation, other) - return method - - -class SelectQuery(Query): - union_all = __add__ = __compound_select__('UNION ALL') - union = __or__ = __compound_select__('UNION') - intersect = __and__ = __compound_select__('INTERSECT') - except_ = __sub__ = __compound_select__('EXCEPT') - __radd__ = __compound_select__('UNION ALL', inverted=True) - __ror__ = __compound_select__('UNION', inverted=True) - __rand__ = __compound_select__('INTERSECT', inverted=True) - __rsub__ = __compound_select__('EXCEPT', inverted=True) - - def select_from(self, *columns): - if not columns: - raise ValueError('select_from() must specify one or more columns.') - - query = (Select((self,), columns) - .bind(self._database)) - if getattr(self, 'model', None) is not None: - # Bind to the sub-select's model type, if defined. - query = query.objects(self.model) - return query - - -class SelectBase(_HashableSource, Source, SelectQuery): - def _get_hash(self): - return hash((self.__class__, self._alias or id(self))) - - def _execute(self, database): - if self._cursor_wrapper is None: - cursor = database.execute(self) - self._cursor_wrapper = self._get_cursor_wrapper(cursor) - return self._cursor_wrapper - - @database_required - def peek(self, database, n=1): - rows = self.execute(database)[:n] - if rows: - return rows[0] if n == 1 else rows - - @database_required - def first(self, database, n=1): - if self._limit != n: - self._limit = n - self._cursor_wrapper = None - return self.peek(database, n=n) - - @database_required - def scalar(self, database, as_tuple=False): - row = self.tuples().peek(database) - return row[0] if row and not as_tuple else row - - @database_required - def count(self, database, clear_limit=False): - clone = self.order_by().alias('_wrapped') - if clear_limit: - clone._limit = clone._offset = None - try: - if clone._having is None and clone._group_by is None and \ - clone._windows is None and clone._distinct is None and \ - clone._simple_distinct is not True: - clone = clone.select(SQL('1')) - except AttributeError: - pass - return Select([clone], [fn.COUNT(SQL('1'))]).scalar(database) - - @database_required - def exists(self, database): - clone = self.columns(SQL('1')) - clone._limit = 1 - clone._offset = None - return bool(clone.scalar()) - - @database_required - def get(self, database): - self._cursor_wrapper = None - try: - return self.execute(database)[0] - except IndexError: - pass - - -# QUERY IMPLEMENTATIONS. - - -class CompoundSelectQuery(SelectBase): - def __init__(self, lhs, op, rhs): - super(CompoundSelectQuery, self).__init__() - self.lhs = lhs - self.op = op - self.rhs = rhs - - @property - def _returning(self): - return self.lhs._returning - - @database_required - def exists(self, database): - query = Select((self.limit(1),), (SQL('1'),)).bind(database) - return bool(query.scalar()) - - def _get_query_key(self): - return (self.lhs.get_query_key(), self.rhs.get_query_key()) - - def _wrap_parens(self, ctx, subq): - csq_setting = ctx.state.compound_select_parentheses - - if not csq_setting or csq_setting == CSQ_PARENTHESES_NEVER: - return False - elif csq_setting == CSQ_PARENTHESES_ALWAYS: - return True - elif csq_setting == CSQ_PARENTHESES_UNNESTED: - if ctx.state.in_expr or ctx.state.in_function: - # If this compound select query is being used inside an - # expression, e.g., an IN or EXISTS(). - return False - - # If the query on the left or right is itself a compound select - # query, then we do not apply parentheses. However, if it is a - # regular SELECT query, we will apply parentheses. - return not isinstance(subq, CompoundSelectQuery) - - def __sql__(self, ctx): - if ctx.scope == SCOPE_COLUMN: - return self.apply_column(ctx) - - # Call parent method to handle any CTEs. - super(CompoundSelectQuery, self).__sql__(ctx) - - outer_parens = ctx.subquery or (ctx.scope == SCOPE_SOURCE) - with ctx(parentheses=outer_parens): - # Should the left-hand query be wrapped in parentheses? - lhs_parens = self._wrap_parens(ctx, self.lhs) - with ctx.scope_normal(parentheses=lhs_parens, subquery=False): - ctx.sql(self.lhs) - ctx.literal(' %s ' % self.op) - with ctx.push_alias(): - # Should the right-hand query be wrapped in parentheses? - rhs_parens = self._wrap_parens(ctx, self.rhs) - with ctx.scope_normal(parentheses=rhs_parens, subquery=False): - ctx.sql(self.rhs) - - # Apply ORDER BY, LIMIT, OFFSET. We use the "values" scope so that - # entity names are not fully-qualified. This is a bit of a hack, as - # we're relying on the logic in Column.__sql__() to not fully - # qualify column names. - with ctx.scope_values(): - self._apply_ordering(ctx) - - return self.apply_alias(ctx) - - -class Select(SelectBase): - def __init__(self, from_list=None, columns=None, group_by=None, - having=None, distinct=None, windows=None, for_update=None, - for_update_of=None, nowait=None, lateral=None, **kwargs): - super(Select, self).__init__(**kwargs) - self._from_list = (list(from_list) if isinstance(from_list, tuple) - else from_list) or [] - self._returning = columns - self._group_by = group_by - self._having = having - self._windows = None - self._for_update = for_update # XXX: consider reorganizing. - self._for_update_of = for_update_of - self._for_update_nowait = nowait - self._lateral = lateral - - self._distinct = self._simple_distinct = None - if distinct: - if isinstance(distinct, bool): - self._simple_distinct = distinct - else: - self._distinct = distinct - - self._cursor_wrapper = None - - def clone(self): - clone = super(Select, self).clone() - if clone._from_list: - clone._from_list = list(clone._from_list) - return clone - - @Node.copy - def columns(self, *columns, **kwargs): - self._returning = columns - select = columns - - @Node.copy - def select_extend(self, *columns): - self._returning = tuple(self._returning) + columns - - @property - def selected_columns(self): - return self._returning - @selected_columns.setter - def selected_columns(self, value): - self._returning = value - - @Node.copy - def from_(self, *sources): - self._from_list = list(sources) - - @Node.copy - def join(self, dest, join_type=JOIN.INNER, on=None): - if not self._from_list: - raise ValueError('No sources to join on.') - item = self._from_list.pop() - self._from_list.append(Join(item, dest, join_type, on)) - - def left_outer_join(self, dest, on=None): - return self.join(dest, JOIN.LEFT_OUTER, on) - - @Node.copy - def group_by(self, *columns): - grouping = [] - for column in columns: - if isinstance(column, Table): - if not column._columns: - raise ValueError('Cannot pass a table to group_by() that ' - 'does not have columns explicitly ' - 'declared.') - grouping.extend([getattr(column, col_name) - for col_name in column._columns]) - else: - grouping.append(column) - self._group_by = grouping - - def group_by_extend(self, *values): - """@Node.copy used from group_by() call""" - group_by = tuple(self._group_by or ()) + values - return self.group_by(*group_by) - - @Node.copy - def having(self, *expressions): - if self._having is not None: - expressions = (self._having,) + expressions - self._having = reduce(operator.and_, expressions) - - @Node.copy - def distinct(self, *columns): - if len(columns) == 1 and (columns[0] is True or columns[0] is False): - self._simple_distinct = columns[0] - else: - self._simple_distinct = False - self._distinct = columns - - @Node.copy - def window(self, *windows): - self._windows = windows if windows else None - - @Node.copy - def for_update(self, for_update=True, of=None, nowait=None): - if not for_update and (of is not None or nowait): - for_update = True - self._for_update = for_update - self._for_update_of = of - self._for_update_nowait = nowait - - @Node.copy - def lateral(self, lateral=True): - self._lateral = lateral - - def _get_query_key(self): - return self._alias - - def __sql_selection__(self, ctx, is_subquery=False): - return ctx.sql(CommaNodeList(self._returning)) - - def __sql__(self, ctx): - if ctx.scope == SCOPE_COLUMN: - return self.apply_column(ctx) - - if self._lateral and ctx.scope == SCOPE_SOURCE: - ctx.literal('LATERAL ') - - is_subquery = ctx.subquery - state = { - 'converter': None, - 'in_function': False, - 'parentheses': is_subquery or (ctx.scope == SCOPE_SOURCE), - 'subquery': True, - } - if ctx.state.in_function and ctx.state.function_arg_count == 1: - state['parentheses'] = False - - with ctx.scope_normal(**state): - # Defer calling parent SQL until here. This ensures that any CTEs - # for this query will be properly nested if this query is a - # sub-select or is used in an expression. See GH#1809 for example. - super(Select, self).__sql__(ctx) - - ctx.literal('SELECT ') - if self._simple_distinct or self._distinct is not None: - ctx.literal('DISTINCT ') - if self._distinct: - (ctx - .literal('ON ') - .sql(EnclosedNodeList(self._distinct)) - .literal(' ')) - - with ctx.scope_source(): - ctx = self.__sql_selection__(ctx, is_subquery) - - if self._from_list: - with ctx.scope_source(parentheses=False): - ctx.literal(' FROM ').sql(CommaNodeList(self._from_list)) - - if self._where is not None: - ctx.literal(' WHERE ').sql(self._where) - - if self._group_by: - ctx.literal(' GROUP BY ').sql(CommaNodeList(self._group_by)) - - if self._having is not None: - ctx.literal(' HAVING ').sql(self._having) - - if self._windows is not None: - ctx.literal(' WINDOW ') - ctx.sql(CommaNodeList(self._windows)) - - # Apply ORDER BY, LIMIT, OFFSET. - self._apply_ordering(ctx) - - if self._for_update: - if not ctx.state.for_update: - raise ValueError('FOR UPDATE specified but not supported ' - 'by database.') - ctx.literal(' ') - ctx.sql(ForUpdate(self._for_update, self._for_update_of, - self._for_update_nowait)) - - # If the subquery is inside a function -or- we are evaluating a - # subquery on either side of an expression w/o an explicit alias, do - # not generate an alias + AS clause. - if ctx.state.in_function or (ctx.state.in_expr and - self._alias is None): - return ctx - - return self.apply_alias(ctx) - - -class _WriteQuery(Query): - def __init__(self, table, returning=None, **kwargs): - self.table = table - self._returning = returning - self._return_cursor = True if returning else False - super(_WriteQuery, self).__init__(**kwargs) - - @Node.copy - def returning(self, *returning): - self._returning = returning - self._return_cursor = True if returning else False - - def apply_returning(self, ctx): - if self._returning: - with ctx.scope_source(): - ctx.literal(' RETURNING ').sql(CommaNodeList(self._returning)) - return ctx - - def _execute(self, database): - if self._returning: - cursor = self.execute_returning(database) - else: - cursor = database.execute(self) - return self.handle_result(database, cursor) - - def execute_returning(self, database): - if self._cursor_wrapper is None: - cursor = database.execute(self) - self._cursor_wrapper = self._get_cursor_wrapper(cursor) - return self._cursor_wrapper - - def handle_result(self, database, cursor): - if self._return_cursor: - return cursor - return database.rows_affected(cursor) - - def _set_table_alias(self, ctx): - ctx.alias_manager[self.table] = self.table.__name__ - - def __sql__(self, ctx): - super(_WriteQuery, self).__sql__(ctx) - # We explicitly set the table alias to the table's name, which ensures - # that if a sub-select references a column on the outer table, we won't - # assign it a new alias (e.g. t2) but will refer to it as table.column. - self._set_table_alias(ctx) - return ctx - - -class Update(_WriteQuery): - def __init__(self, table, update=None, **kwargs): - super(Update, self).__init__(table, **kwargs) - self._update = update - self._from = None - - @Node.copy - def from_(self, *sources): - self._from = sources - - def __sql__(self, ctx): - super(Update, self).__sql__(ctx) - - with ctx.scope_values(subquery=True): - ctx.literal('UPDATE ') - - expressions = [] - for k, v in sorted(self._update.items(), key=ctx.column_sort_key): - if not isinstance(v, Node): - if isinstance(k, Field): - v = k.to_value(v) - else: - v = Value(v, unpack=False) - elif isinstance(v, Model) and isinstance(k, ForeignKeyField): - # NB: we want to ensure that when passed a model instance - # in the context of a foreign-key, we apply the fk-specific - # adaptation of the model. - v = k.to_value(v) - - if not isinstance(v, Value): - v = qualify_names(v) - - expressions.append(NodeList((k, SQL('='), v))) - - (ctx - .sql(self.table) - .literal(' SET ') - .sql(CommaNodeList(expressions))) - - if self._from: - with ctx.scope_source(parentheses=False): - ctx.literal(' FROM ').sql(CommaNodeList(self._from)) - - if self._where: - with ctx.scope_normal(): - ctx.literal(' WHERE ').sql(self._where) - self._apply_ordering(ctx) - return self.apply_returning(ctx) - - -class Insert(_WriteQuery): - SIMPLE = 0 - QUERY = 1 - MULTI = 2 - class DefaultValuesException(Exception): pass - - def __init__(self, table, insert=None, columns=None, on_conflict=None, - **kwargs): - super(Insert, self).__init__(table, **kwargs) - self._insert = insert - self._columns = columns - self._on_conflict = on_conflict - self._query_type = None - self._as_rowcount = False - - def where(self, *expressions): - raise NotImplementedError('INSERT queries cannot have a WHERE clause.') - - @Node.copy - def as_rowcount(self, _as_rowcount=True): - self._as_rowcount = _as_rowcount - - @Node.copy - def on_conflict_ignore(self, ignore=True): - self._on_conflict = OnConflict('IGNORE') if ignore else None - - @Node.copy - def on_conflict_replace(self, replace=True): - self._on_conflict = OnConflict('REPLACE') if replace else None - - @Node.copy - def on_conflict(self, *args, **kwargs): - self._on_conflict = (OnConflict(*args, **kwargs) if (args or kwargs) - else None) - - def _simple_insert(self, ctx): - if not self._insert: - raise self.DefaultValuesException('Error: no data to insert.') - return self._generate_insert((self._insert,), ctx) - - def get_default_data(self): - return {} - - def get_default_columns(self): - if self.table._columns: - return [getattr(self.table, col) for col in self.table._columns - if col != self.table._primary_key] - - def _generate_insert(self, insert, ctx): - rows_iter = iter(insert) - columns = self._columns - - # Load and organize column defaults (if provided). - defaults = self.get_default_data() - - # First figure out what columns are being inserted (if they weren't - # specified explicitly). Resulting columns are normalized and ordered. - if not columns: - try: - row = next(rows_iter) - except StopIteration: - raise self.DefaultValuesException('Error: no rows to insert.') - - if not isinstance(row, Mapping): - columns = self.get_default_columns() - if columns is None: - raise ValueError('Bulk insert must specify columns.') - else: - # Infer column names from the dict of data being inserted. - accum = [] - for column in row: - if isinstance(column, basestring): - column = getattr(self.table, column) - accum.append(column) - - # Add any columns present in the default data that are not - # accounted for by the dictionary of row data. - column_set = set(accum) - for col in (set(defaults) - column_set): - accum.append(col) - - columns = sorted(accum, key=lambda obj: obj.get_sort_key(ctx)) - rows_iter = itertools.chain(iter((row,)), rows_iter) - else: - clean_columns = [] - seen = set() - for column in columns: - if isinstance(column, basestring): - column_obj = getattr(self.table, column) - else: - column_obj = column - clean_columns.append(column_obj) - seen.add(column_obj) - - columns = clean_columns - for col in sorted(defaults, key=lambda obj: obj.get_sort_key(ctx)): - if col not in seen: - columns.append(col) - - fk_fields = set() - nullable_columns = set() - value_lookups = {} - for column in columns: - lookups = [column, column.name] - if isinstance(column, Field): - if column.name != column.column_name: - lookups.append(column.column_name) - if column.null: - nullable_columns.add(column) - if isinstance(column, ForeignKeyField): - fk_fields.add(column) - value_lookups[column] = lookups - - ctx.sql(EnclosedNodeList(columns)).literal(' VALUES ') - columns_converters = [ - (column, column.db_value if isinstance(column, Field) else None) - for column in columns] - - all_values = [] - for row in rows_iter: - values = [] - is_dict = isinstance(row, Mapping) - for i, (column, converter) in enumerate(columns_converters): - try: - if is_dict: - # The logic is a bit convoluted, but in order to be - # flexible in what we accept (dict keyed by - # column/field, field name, or underlying column name), - # we try accessing the row data dict using each - # possible key. If no match is found, throw an error. - for lookup in value_lookups[column]: - try: - val = row[lookup] - except KeyError: pass - else: break - else: - raise KeyError - else: - val = row[i] - except (KeyError, IndexError): - if column in defaults: - val = defaults[column] - if callable_(val): - val = val() - elif column in nullable_columns: - val = None - else: - raise ValueError('Missing value for %s.' % column.name) - - if not isinstance(val, Node) or (isinstance(val, Model) and - column in fk_fields): - val = Value(val, converter=converter, unpack=False) - values.append(val) - - all_values.append(EnclosedNodeList(values)) - - if not all_values: - raise self.DefaultValuesException('Error: no data to insert.') - - with ctx.scope_values(subquery=True): - return ctx.sql(CommaNodeList(all_values)) - - def _query_insert(self, ctx): - return (ctx - .sql(EnclosedNodeList(self._columns)) - .literal(' ') - .sql(self._insert)) - - def _default_values(self, ctx): - if not self._database: - return ctx.literal('DEFAULT VALUES') - return self._database.default_values_insert(ctx) - - def __sql__(self, ctx): - super(Insert, self).__sql__(ctx) - with ctx.scope_values(): - stmt = None - if self._on_conflict is not None: - stmt = self._on_conflict.get_conflict_statement(ctx, self) - - (ctx - .sql(stmt or SQL('INSERT')) - .literal(' INTO ') - .sql(self.table) - .literal(' ')) - - if isinstance(self._insert, Mapping) and not self._columns: - try: - self._simple_insert(ctx) - except self.DefaultValuesException: - self._default_values(ctx) - self._query_type = Insert.SIMPLE - elif isinstance(self._insert, (SelectQuery, SQL)): - self._query_insert(ctx) - self._query_type = Insert.QUERY - else: - self._generate_insert(self._insert, ctx) - self._query_type = Insert.MULTI - - if self._on_conflict is not None: - update = self._on_conflict.get_conflict_update(ctx, self) - if update is not None: - ctx.literal(' ').sql(update) - - return self.apply_returning(ctx) - - def _execute(self, database): - if self._returning is None and database.returning_clause \ - and self.table._primary_key: - self._returning = (self.table._primary_key,) - try: - return super(Insert, self)._execute(database) - except self.DefaultValuesException: - pass - - def handle_result(self, database, cursor): - if self._return_cursor: - return cursor - if self._as_rowcount: - return database.rows_affected(cursor) - return database.last_insert_id(cursor, self._query_type) - - -class Delete(_WriteQuery): - def __sql__(self, ctx): - super(Delete, self).__sql__(ctx) - - with ctx.scope_values(subquery=True): - ctx.literal('DELETE FROM ').sql(self.table) - if self._where is not None: - with ctx.scope_normal(): - ctx.literal(' WHERE ').sql(self._where) - - self._apply_ordering(ctx) - return self.apply_returning(ctx) - - -class Index(Node): - def __init__(self, name, table, expressions, unique=False, safe=False, - where=None, using=None): - self._name = name - self._table = Entity(table) if not isinstance(table, Table) else table - self._expressions = expressions - self._where = where - self._unique = unique - self._safe = safe - self._using = using - - @Node.copy - def safe(self, _safe=True): - self._safe = _safe - - @Node.copy - def where(self, *expressions): - if self._where is not None: - expressions = (self._where,) + expressions - self._where = reduce(operator.and_, expressions) - - @Node.copy - def using(self, _using=None): - self._using = _using - - def __sql__(self, ctx): - statement = 'CREATE UNIQUE INDEX ' if self._unique else 'CREATE INDEX ' - with ctx.scope_values(subquery=True): - ctx.literal(statement) - if self._safe: - ctx.literal('IF NOT EXISTS ') - - # Sqlite uses CREATE INDEX . ON , whereas most - # others use: CREATE INDEX ON .
. - if ctx.state.index_schema_prefix and \ - isinstance(self._table, Table) and self._table._schema: - index_name = Entity(self._table._schema, self._name) - table_name = Entity(self._table.__name__) - else: - index_name = Entity(self._name) - table_name = self._table - - ctx.sql(index_name) - if self._using is not None and \ - ctx.state.index_using_precedes_table: - ctx.literal(' USING %s' % self._using) # MySQL style. - - (ctx - .literal(' ON ') - .sql(table_name) - .literal(' ')) - - if self._using is not None and not \ - ctx.state.index_using_precedes_table: - ctx.literal('USING %s ' % self._using) # Postgres/default. - - ctx.sql(EnclosedNodeList([ - SQL(expr) if isinstance(expr, basestring) else expr - for expr in self._expressions])) - if self._where is not None: - ctx.literal(' WHERE ').sql(self._where) - - return ctx - - -class ModelIndex(Index): - def __init__(self, model, fields, unique=False, safe=True, where=None, - using=None, name=None): - self._model = model - if name is None: - name = self._generate_name_from_fields(model, fields) - if using is None: - for field in fields: - if isinstance(field, Field) and hasattr(field, 'index_type'): - using = field.index_type - super(ModelIndex, self).__init__( - name=name, - table=model._meta.table, - expressions=fields, - unique=unique, - safe=safe, - where=where, - using=using) - - def _generate_name_from_fields(self, model, fields): - accum = [] - for field in fields: - if isinstance(field, basestring): - accum.append(field.split()[0]) - else: - if isinstance(field, Node) and not isinstance(field, Field): - field = field.unwrap() - if isinstance(field, Field): - accum.append(field.column_name) - - if not accum: - raise ValueError('Unable to generate a name for the index, please ' - 'explicitly specify a name.') - - clean_field_names = re.sub(r'[^\w]+', '', '_'.join(accum)) - meta = model._meta - prefix = meta.name if meta.legacy_table_names else meta.table_name - return _truncate_constraint_name('_'.join((prefix, clean_field_names))) - - -def _truncate_constraint_name(constraint, maxlen=64): - if len(constraint) > maxlen: - name_hash = hashlib.md5(constraint.encode('utf-8')).hexdigest() - constraint = '%s_%s' % (constraint[:(maxlen - 8)], name_hash[:7]) - return constraint - - -# DB-API 2.0 EXCEPTIONS. - - -class PeeweeException(Exception): - def __init__(self, *args): - if args and isinstance(args[0], Exception): - self.orig, args = args[0], args[1:] - super(PeeweeException, self).__init__(*args) -class ImproperlyConfigured(PeeweeException): pass -class DatabaseError(PeeweeException): pass -class DataError(DatabaseError): pass -class IntegrityError(DatabaseError): pass -class InterfaceError(PeeweeException): pass -class InternalError(DatabaseError): pass -class NotSupportedError(DatabaseError): pass -class OperationalError(DatabaseError): pass -class ProgrammingError(DatabaseError): pass - - -class ExceptionWrapper(object): - __slots__ = ('exceptions',) - def __init__(self, exceptions): - self.exceptions = exceptions - def __enter__(self): pass - def __exit__(self, exc_type, exc_value, traceback): - if exc_type is None: - return - # psycopg2.8 shits out a million cute error types. Try to catch em all. - if pg_errors is not None and exc_type.__name__ not in self.exceptions \ - and issubclass(exc_type, pg_errors.Error): - exc_type = exc_type.__bases__[0] - if exc_type.__name__ in self.exceptions: - new_type = self.exceptions[exc_type.__name__] - exc_args = exc_value.args - reraise(new_type, new_type(exc_value, *exc_args), traceback) - - -EXCEPTIONS = { - 'ConstraintError': IntegrityError, - 'DatabaseError': DatabaseError, - 'DataError': DataError, - 'IntegrityError': IntegrityError, - 'InterfaceError': InterfaceError, - 'InternalError': InternalError, - 'NotSupportedError': NotSupportedError, - 'OperationalError': OperationalError, - 'ProgrammingError': ProgrammingError, - 'TransactionRollbackError': OperationalError} - -__exception_wrapper__ = ExceptionWrapper(EXCEPTIONS) - - -# DATABASE INTERFACE AND CONNECTION MANAGEMENT. - - -IndexMetadata = collections.namedtuple( - 'IndexMetadata', - ('name', 'sql', 'columns', 'unique', 'table')) -ColumnMetadata = collections.namedtuple( - 'ColumnMetadata', - ('name', 'data_type', 'null', 'primary_key', 'table', 'default')) -ForeignKeyMetadata = collections.namedtuple( - 'ForeignKeyMetadata', - ('column', 'dest_table', 'dest_column', 'table')) -ViewMetadata = collections.namedtuple('ViewMetadata', ('name', 'sql')) - - -class _ConnectionState(object): - def __init__(self, **kwargs): - super(_ConnectionState, self).__init__(**kwargs) - self.reset() - - def reset(self): - self.closed = True - self.conn = None - self.ctx = [] - self.transactions = [] - - def set_connection(self, conn): - self.conn = conn - self.closed = False - self.ctx = [] - self.transactions = [] - - -class _ConnectionLocal(_ConnectionState, threading.local): pass -class _NoopLock(object): - __slots__ = () - def __enter__(self): return self - def __exit__(self, exc_type, exc_val, exc_tb): pass - - -class ConnectionContext(_callable_context_manager): - __slots__ = ('db',) - def __init__(self, db): self.db = db - def __enter__(self): - if self.db.is_closed(): - self.db.connect() - def __exit__(self, exc_type, exc_val, exc_tb): self.db.close() - - -class Database(_callable_context_manager): - context_class = Context - field_types = {} - operations = {} - param = '?' - quote = '""' - server_version = None - - # Feature toggles. - commit_select = False - compound_select_parentheses = CSQ_PARENTHESES_NEVER - for_update = False - index_schema_prefix = False - index_using_precedes_table = False - limit_max = None - nulls_ordering = False - returning_clause = False - safe_create_index = True - safe_drop_index = True - sequences = False - truncate_table = True - - def __init__(self, database, thread_safe=True, autorollback=False, - field_types=None, operations=None, autocommit=None, - autoconnect=True, **kwargs): - self._field_types = merge_dict(FIELD, self.field_types) - self._operations = merge_dict(OP, self.operations) - if field_types: - self._field_types.update(field_types) - if operations: - self._operations.update(operations) - - self.autoconnect = autoconnect - self.autorollback = autorollback - self.thread_safe = thread_safe - if thread_safe: - self._state = _ConnectionLocal() - self._lock = threading.RLock() - else: - self._state = _ConnectionState() - self._lock = _NoopLock() - - if autocommit is not None: - __deprecated__('Peewee no longer uses the "autocommit" option, as ' - 'the semantics now require it to always be True. ' - 'Because some database-drivers also use the ' - '"autocommit" parameter, you are receiving a ' - 'warning so you may update your code and remove ' - 'the parameter, as in the future, specifying ' - 'autocommit could impact the behavior of the ' - 'database driver you are using.') - - self.connect_params = {} - self.init(database, **kwargs) - - def init(self, database, **kwargs): - if not self.is_closed(): - self.close() - self.database = database - self.connect_params.update(kwargs) - self.deferred = not bool(database) - - def __enter__(self): - if self.is_closed(): - self.connect() - ctx = self.atomic() - self._state.ctx.append(ctx) - ctx.__enter__() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - ctx = self._state.ctx.pop() - try: - ctx.__exit__(exc_type, exc_val, exc_tb) - finally: - if not self._state.ctx: - self.close() - - def connection_context(self): - return ConnectionContext(self) - - def _connect(self): - raise NotImplementedError - - def connect(self, reuse_if_open=False): - with self._lock: - if self.deferred: - raise InterfaceError('Error, database must be initialized ' - 'before opening a connection.') - if not self._state.closed: - if reuse_if_open: - return False - raise OperationalError('Connection already opened.') - - self._state.reset() - with __exception_wrapper__: - self._state.set_connection(self._connect()) - if self.server_version is None: - self._set_server_version(self._state.conn) - self._initialize_connection(self._state.conn) - return True - - def _initialize_connection(self, conn): - pass - - def _set_server_version(self, conn): - self.server_version = 0 - - def close(self): - with self._lock: - if self.deferred: - raise InterfaceError('Error, database must be initialized ' - 'before opening a connection.') - if self.in_transaction(): - raise OperationalError('Attempting to close database while ' - 'transaction is open.') - is_open = not self._state.closed - try: - if is_open: - with __exception_wrapper__: - self._close(self._state.conn) - finally: - self._state.reset() - return is_open - - def _close(self, conn): - conn.close() - - def is_closed(self): - return self._state.closed - - def is_connection_usable(self): - return not self._state.closed - - def connection(self): - if self.is_closed(): - self.connect() - return self._state.conn - - def cursor(self, commit=None): - if self.is_closed(): - if self.autoconnect: - self.connect() - else: - raise InterfaceError('Error, database connection not opened.') - return self._state.conn.cursor() - - def execute_sql(self, sql, params=None, commit=SENTINEL): - logger.debug((sql, params)) - if commit is SENTINEL: - if self.in_transaction(): - commit = False - elif self.commit_select: - commit = True - else: - commit = not sql[:6].lower().startswith('select') - - with __exception_wrapper__: - cursor = self.cursor(commit) - try: - cursor.execute(sql, params or ()) - except Exception: - if self.autorollback and not self.in_transaction(): - self.rollback() - raise - else: - if commit and not self.in_transaction(): - self.commit() - return cursor - - def execute(self, query, commit=SENTINEL, **context_options): - ctx = self.get_sql_context(**context_options) - sql, params = ctx.sql(query).query() - return self.execute_sql(sql, params, commit=commit) - - def get_context_options(self): - return { - 'field_types': self._field_types, - 'operations': self._operations, - 'param': self.param, - 'quote': self.quote, - 'compound_select_parentheses': self.compound_select_parentheses, - 'conflict_statement': self.conflict_statement, - 'conflict_update': self.conflict_update, - 'for_update': self.for_update, - 'index_schema_prefix': self.index_schema_prefix, - 'index_using_precedes_table': self.index_using_precedes_table, - 'limit_max': self.limit_max, - 'nulls_ordering': self.nulls_ordering, - } - - def get_sql_context(self, **context_options): - context = self.get_context_options() - if context_options: - context.update(context_options) - return self.context_class(**context) - - def conflict_statement(self, on_conflict, query): - raise NotImplementedError - - def conflict_update(self, on_conflict, query): - raise NotImplementedError - - def _build_on_conflict_update(self, on_conflict, query): - if on_conflict._conflict_target: - stmt = SQL('ON CONFLICT') - target = EnclosedNodeList([ - Entity(col) if isinstance(col, basestring) else col - for col in on_conflict._conflict_target]) - if on_conflict._conflict_where is not None: - target = NodeList([target, SQL('WHERE'), - on_conflict._conflict_where]) - else: - stmt = SQL('ON CONFLICT ON CONSTRAINT') - target = on_conflict._conflict_constraint - if isinstance(target, basestring): - target = Entity(target) - - updates = [] - if on_conflict._preserve: - for column in on_conflict._preserve: - excluded = NodeList((SQL('EXCLUDED'), ensure_entity(column)), - glue='.') - expression = NodeList((ensure_entity(column), SQL('='), - excluded)) - updates.append(expression) - - if on_conflict._update: - for k, v in on_conflict._update.items(): - if not isinstance(v, Node): - # Attempt to resolve string field-names to their respective - # field object, to apply data-type conversions. - if isinstance(k, basestring): - k = getattr(query.table, k) - if isinstance(k, Field): - v = k.to_value(v) - else: - v = Value(v, unpack=False) - else: - v = QualifiedNames(v) - updates.append(NodeList((ensure_entity(k), SQL('='), v))) - - parts = [stmt, target, SQL('DO UPDATE SET'), CommaNodeList(updates)] - if on_conflict._where: - parts.extend((SQL('WHERE'), QualifiedNames(on_conflict._where))) - - return NodeList(parts) - - def last_insert_id(self, cursor, query_type=None): - return cursor.lastrowid - - def rows_affected(self, cursor): - return cursor.rowcount - - def default_values_insert(self, ctx): - return ctx.literal('DEFAULT VALUES') - - def session_start(self): - with self._lock: - return self.transaction().__enter__() - - def session_commit(self): - with self._lock: - try: - txn = self.pop_transaction() - except IndexError: - return False - txn.commit(begin=self.in_transaction()) - return True - - def session_rollback(self): - with self._lock: - try: - txn = self.pop_transaction() - except IndexError: - return False - txn.rollback(begin=self.in_transaction()) - return True - - def in_transaction(self): - return bool(self._state.transactions) - - def push_transaction(self, transaction): - self._state.transactions.append(transaction) - - def pop_transaction(self): - return self._state.transactions.pop() - - def transaction_depth(self): - return len(self._state.transactions) - - def top_transaction(self): - if self._state.transactions: - return self._state.transactions[-1] - - def atomic(self, *args, **kwargs): - return _atomic(self, *args, **kwargs) - - def manual_commit(self): - return _manual(self) - - def transaction(self, *args, **kwargs): - return _transaction(self, *args, **kwargs) - - def savepoint(self): - return _savepoint(self) - - def begin(self): - if self.is_closed(): - self.connect() - - def commit(self): - with __exception_wrapper__: - return self._state.conn.commit() - - def rollback(self): - with __exception_wrapper__: - return self._state.conn.rollback() - - def batch_commit(self, it, n): - for group in chunked(it, n): - with self.atomic(): - for obj in group: - yield obj - - def table_exists(self, table_name, schema=None): - if is_model(table_name): - model = table_name - table_name = model._meta.table_name - schema = model._meta.schema - return table_name in self.get_tables(schema=schema) - - def get_tables(self, schema=None): - raise NotImplementedError - - def get_indexes(self, table, schema=None): - raise NotImplementedError - - def get_columns(self, table, schema=None): - raise NotImplementedError - - def get_primary_keys(self, table, schema=None): - raise NotImplementedError - - def get_foreign_keys(self, table, schema=None): - raise NotImplementedError - - def sequence_exists(self, seq): - raise NotImplementedError - - def create_tables(self, models, **options): - for model in sort_models(models): - model.create_table(**options) - - def drop_tables(self, models, **kwargs): - for model in reversed(sort_models(models)): - model.drop_table(**kwargs) - - def extract_date(self, date_part, date_field): - raise NotImplementedError - - def truncate_date(self, date_part, date_field): - raise NotImplementedError - - def to_timestamp(self, date_field): - raise NotImplementedError - - def from_timestamp(self, date_field): - raise NotImplementedError - - def random(self): - return fn.random() - - def bind(self, models, bind_refs=True, bind_backrefs=True): - for model in models: - model.bind(self, bind_refs=bind_refs, bind_backrefs=bind_backrefs) - - def bind_ctx(self, models, bind_refs=True, bind_backrefs=True): - return _BoundModelsContext(models, self, bind_refs, bind_backrefs) - - def get_noop_select(self, ctx): - return ctx.sql(Select().columns(SQL('0')).where(SQL('0'))) - - -def __pragma__(name): - def __get__(self): - return self.pragma(name) - def __set__(self, value): - return self.pragma(name, value) - return property(__get__, __set__) - - -class SqliteDatabase(Database): - field_types = { - 'BIGAUTO': FIELD.AUTO, - 'BIGINT': FIELD.INT, - 'BOOL': FIELD.INT, - 'DOUBLE': FIELD.FLOAT, - 'SMALLINT': FIELD.INT, - 'UUID': FIELD.TEXT} - operations = { - 'LIKE': 'GLOB', - 'ILIKE': 'LIKE'} - index_schema_prefix = True - limit_max = -1 - server_version = __sqlite_version__ - truncate_table = False - - def __init__(self, database, *args, **kwargs): - self._pragmas = kwargs.pop('pragmas', ()) - super(SqliteDatabase, self).__init__(database, *args, **kwargs) - self._aggregates = {} - self._collations = {} - self._functions = {} - self._window_functions = {} - self._table_functions = [] - self._extensions = set() - self._attached = {} - self.register_function(_sqlite_date_part, 'date_part', 2) - self.register_function(_sqlite_date_trunc, 'date_trunc', 2) - self.nulls_ordering = self.server_version >= (3, 30, 0) - - def init(self, database, pragmas=None, timeout=5, returning_clause=None, - **kwargs): - if pragmas is not None: - self._pragmas = pragmas - if isinstance(self._pragmas, dict): - self._pragmas = list(self._pragmas.items()) - if returning_clause is not None: - if __sqlite_version__ < (3, 35, 0): - warnings.warn('RETURNING clause requires Sqlite 3.35 or newer') - self.returning_clause = returning_clause - self._timeout = timeout - super(SqliteDatabase, self).init(database, **kwargs) - - def _set_server_version(self, conn): - pass - - def _connect(self): - if sqlite3 is None: - raise ImproperlyConfigured('SQLite driver not installed!') - conn = sqlite3.connect(self.database, timeout=self._timeout, - isolation_level=None, **self.connect_params) - try: - self._add_conn_hooks(conn) - except: - conn.close() - raise - return conn - - def _add_conn_hooks(self, conn): - if self._attached: - self._attach_databases(conn) - if self._pragmas: - self._set_pragmas(conn) - self._load_aggregates(conn) - self._load_collations(conn) - self._load_functions(conn) - if self.server_version >= (3, 25, 0): - self._load_window_functions(conn) - if self._table_functions: - for table_function in self._table_functions: - table_function.register(conn) - if self._extensions: - self._load_extensions(conn) - - def _set_pragmas(self, conn): - cursor = conn.cursor() - for pragma, value in self._pragmas: - cursor.execute('PRAGMA %s = %s;' % (pragma, value)) - cursor.close() - - def _attach_databases(self, conn): - cursor = conn.cursor() - for name, db in self._attached.items(): - cursor.execute('ATTACH DATABASE "%s" AS "%s"' % (db, name)) - cursor.close() - - def pragma(self, key, value=SENTINEL, permanent=False, schema=None): - if schema is not None: - key = '"%s".%s' % (schema, key) - sql = 'PRAGMA %s' % key - if value is not SENTINEL: - sql += ' = %s' % (value or 0) - if permanent: - pragmas = dict(self._pragmas or ()) - pragmas[key] = value - self._pragmas = list(pragmas.items()) - elif permanent: - raise ValueError('Cannot specify a permanent pragma without value') - row = self.execute_sql(sql).fetchone() - if row: - return row[0] - - cache_size = __pragma__('cache_size') - foreign_keys = __pragma__('foreign_keys') - journal_mode = __pragma__('journal_mode') - journal_size_limit = __pragma__('journal_size_limit') - mmap_size = __pragma__('mmap_size') - page_size = __pragma__('page_size') - read_uncommitted = __pragma__('read_uncommitted') - synchronous = __pragma__('synchronous') - wal_autocheckpoint = __pragma__('wal_autocheckpoint') - application_id = __pragma__('application_id') - user_version = __pragma__('user_version') - data_version = __pragma__('data_version') - - @property - def timeout(self): - return self._timeout - - @timeout.setter - def timeout(self, seconds): - if self._timeout == seconds: - return - - self._timeout = seconds - if not self.is_closed(): - # PySQLite multiplies user timeout by 1000, but the unit of the - # timeout PRAGMA is actually milliseconds. - self.execute_sql('PRAGMA busy_timeout=%d;' % (seconds * 1000)) - - def _load_aggregates(self, conn): - for name, (klass, num_params) in self._aggregates.items(): - conn.create_aggregate(name, num_params, klass) - - def _load_collations(self, conn): - for name, fn in self._collations.items(): - conn.create_collation(name, fn) - - def _load_functions(self, conn): - for name, (fn, num_params) in self._functions.items(): - conn.create_function(name, num_params, fn) - - def _load_window_functions(self, conn): - for name, (klass, num_params) in self._window_functions.items(): - conn.create_window_function(name, num_params, klass) - - def register_aggregate(self, klass, name=None, num_params=-1): - self._aggregates[name or klass.__name__.lower()] = (klass, num_params) - if not self.is_closed(): - self._load_aggregates(self.connection()) - - def aggregate(self, name=None, num_params=-1): - def decorator(klass): - self.register_aggregate(klass, name, num_params) - return klass - return decorator - - def register_collation(self, fn, name=None): - name = name or fn.__name__ - def _collation(*args): - expressions = args + (SQL('collate %s' % name),) - return NodeList(expressions) - fn.collation = _collation - self._collations[name] = fn - if not self.is_closed(): - self._load_collations(self.connection()) - - def collation(self, name=None): - def decorator(fn): - self.register_collation(fn, name) - return fn - return decorator - - def register_function(self, fn, name=None, num_params=-1): - self._functions[name or fn.__name__] = (fn, num_params) - if not self.is_closed(): - self._load_functions(self.connection()) - - def func(self, name=None, num_params=-1): - def decorator(fn): - self.register_function(fn, name, num_params) - return fn - return decorator - - def register_window_function(self, klass, name=None, num_params=-1): - name = name or klass.__name__.lower() - self._window_functions[name] = (klass, num_params) - if not self.is_closed(): - self._load_window_functions(self.connection()) - - def window_function(self, name=None, num_params=-1): - def decorator(klass): - self.register_window_function(klass, name, num_params) - return klass - return decorator - - def register_table_function(self, klass, name=None): - if name is not None: - klass.name = name - self._table_functions.append(klass) - if not self.is_closed(): - klass.register(self.connection()) - - def table_function(self, name=None): - def decorator(klass): - self.register_table_function(klass, name) - return klass - return decorator - - def unregister_aggregate(self, name): - del(self._aggregates[name]) - - def unregister_collation(self, name): - del(self._collations[name]) - - def unregister_function(self, name): - del(self._functions[name]) - - def unregister_window_function(self, name): - del(self._window_functions[name]) - - def unregister_table_function(self, name): - for idx, klass in enumerate(self._table_functions): - if klass.name == name: - break - else: - return False - self._table_functions.pop(idx) - return True - - def _load_extensions(self, conn): - conn.enable_load_extension(True) - for extension in self._extensions: - conn.load_extension(extension) - - def load_extension(self, extension): - self._extensions.add(extension) - if not self.is_closed(): - conn = self.connection() - conn.enable_load_extension(True) - conn.load_extension(extension) - - def unload_extension(self, extension): - self._extensions.remove(extension) - - def attach(self, filename, name): - if name in self._attached: - if self._attached[name] == filename: - return False - raise OperationalError('schema "%s" already attached.' % name) - - self._attached[name] = filename - if not self.is_closed(): - self.execute_sql('ATTACH DATABASE "%s" AS "%s"' % (filename, name)) - return True - - def detach(self, name): - if name not in self._attached: - return False - - del self._attached[name] - if not self.is_closed(): - self.execute_sql('DETACH DATABASE "%s"' % name) - return True - - def last_insert_id(self, cursor, query_type=None): - if not self.returning_clause: - return cursor.lastrowid - elif query_type == Insert.SIMPLE: - try: - return cursor[0][0] - except (IndexError, KeyError, TypeError): - pass - return cursor - - def rows_affected(self, cursor): - try: - return cursor.rowcount - except AttributeError: - return cursor.cursor.rowcount # This was a RETURNING query. - - def begin(self, lock_type=None): - statement = 'BEGIN %s' % lock_type if lock_type else 'BEGIN' - self.execute_sql(statement, commit=False) - - def get_tables(self, schema=None): - schema = schema or 'main' - cursor = self.execute_sql('SELECT name FROM "%s".sqlite_master WHERE ' - 'type=? ORDER BY name' % schema, ('table',)) - return [row for row, in cursor.fetchall()] - - def get_views(self, schema=None): - sql = ('SELECT name, sql FROM "%s".sqlite_master WHERE type=? ' - 'ORDER BY name') % (schema or 'main') - return [ViewMetadata(*row) for row in self.execute_sql(sql, ('view',))] - - def get_indexes(self, table, schema=None): - schema = schema or 'main' - query = ('SELECT name, sql FROM "%s".sqlite_master ' - 'WHERE tbl_name = ? AND type = ? ORDER BY name') % schema - cursor = self.execute_sql(query, (table, 'index')) - index_to_sql = dict(cursor.fetchall()) - - # Determine which indexes have a unique constraint. - unique_indexes = set() - cursor = self.execute_sql('PRAGMA "%s".index_list("%s")' % - (schema, table)) - for row in cursor.fetchall(): - name = row[1] - is_unique = int(row[2]) == 1 - if is_unique: - unique_indexes.add(name) - - # Retrieve the indexed columns. - index_columns = {} - for index_name in sorted(index_to_sql): - cursor = self.execute_sql('PRAGMA "%s".index_info("%s")' % - (schema, index_name)) - index_columns[index_name] = [row[2] for row in cursor.fetchall()] - - return [ - IndexMetadata( - name, - index_to_sql[name], - index_columns[name], - name in unique_indexes, - table) - for name in sorted(index_to_sql)] - - def get_columns(self, table, schema=None): - cursor = self.execute_sql('PRAGMA "%s".table_info("%s")' % - (schema or 'main', table)) - return [ColumnMetadata(r[1], r[2], not r[3], bool(r[5]), table, r[4]) - for r in cursor.fetchall()] - - def get_primary_keys(self, table, schema=None): - cursor = self.execute_sql('PRAGMA "%s".table_info("%s")' % - (schema or 'main', table)) - return [row[1] for row in filter(lambda r: r[-1], cursor.fetchall())] - - def get_foreign_keys(self, table, schema=None): - cursor = self.execute_sql('PRAGMA "%s".foreign_key_list("%s")' % - (schema or 'main', table)) - return [ForeignKeyMetadata(row[3], row[2], row[4], table) - for row in cursor.fetchall()] - - def get_binary_type(self): - return sqlite3.Binary - - def conflict_statement(self, on_conflict, query): - action = on_conflict._action.lower() if on_conflict._action else '' - if action and action not in ('nothing', 'update'): - return SQL('INSERT OR %s' % on_conflict._action.upper()) - - def conflict_update(self, oc, query): - # Sqlite prior to 3.24.0 does not support Postgres-style upsert. - if self.server_version < (3, 24, 0) and \ - any((oc._preserve, oc._update, oc._where, oc._conflict_target, - oc._conflict_constraint)): - raise ValueError('SQLite does not support specifying which values ' - 'to preserve or update.') - - action = oc._action.lower() if oc._action else '' - if action and action not in ('nothing', 'update', ''): - return - - if action == 'nothing': - return SQL('ON CONFLICT DO NOTHING') - elif not oc._update and not oc._preserve: - raise ValueError('If you are not performing any updates (or ' - 'preserving any INSERTed values), then the ' - 'conflict resolution action should be set to ' - '"NOTHING".') - elif oc._conflict_constraint: - raise ValueError('SQLite does not support specifying named ' - 'constraints for conflict resolution.') - elif not oc._conflict_target: - raise ValueError('SQLite requires that a conflict target be ' - 'specified when doing an upsert.') - - return self._build_on_conflict_update(oc, query) - - def extract_date(self, date_part, date_field): - return fn.date_part(date_part, date_field, python_value=int) - - def truncate_date(self, date_part, date_field): - return fn.date_trunc(date_part, date_field, - python_value=simple_date_time) - - def to_timestamp(self, date_field): - return fn.strftime('%s', date_field).cast('integer') - - def from_timestamp(self, date_field): - return fn.datetime(date_field, 'unixepoch') - - -class PostgresqlDatabase(Database): - field_types = { - 'AUTO': 'SERIAL', - 'BIGAUTO': 'BIGSERIAL', - 'BLOB': 'BYTEA', - 'BOOL': 'BOOLEAN', - 'DATETIME': 'TIMESTAMP', - 'DECIMAL': 'NUMERIC', - 'DOUBLE': 'DOUBLE PRECISION', - 'UUID': 'UUID', - 'UUIDB': 'BYTEA'} - operations = {'REGEXP': '~', 'IREGEXP': '~*'} - param = '%s' - - commit_select = True - compound_select_parentheses = CSQ_PARENTHESES_ALWAYS - for_update = True - nulls_ordering = True - returning_clause = True - safe_create_index = False - sequences = True - - def init(self, database, register_unicode=True, encoding=None, - isolation_level=None, **kwargs): - self._register_unicode = register_unicode - self._encoding = encoding - self._isolation_level = isolation_level - super(PostgresqlDatabase, self).init(database, **kwargs) - - def _connect(self): - if psycopg2 is None: - raise ImproperlyConfigured('Postgres driver not installed!') - - # Handle connection-strings nicely, since psycopg2 will accept them, - # and they may be easier when lots of parameters are specified. - params = self.connect_params.copy() - if self.database.startswith('postgresql://'): - params.setdefault('dsn', self.database) - else: - params.setdefault('dbname', self.database) - - conn = psycopg2.connect(**params) - if self._register_unicode: - pg_extensions.register_type(pg_extensions.UNICODE, conn) - pg_extensions.register_type(pg_extensions.UNICODEARRAY, conn) - if self._encoding: - conn.set_client_encoding(self._encoding) - if self._isolation_level: - conn.set_isolation_level(self._isolation_level) - return conn - - def _set_server_version(self, conn): - self.server_version = conn.server_version - if self.server_version >= 90600: - self.safe_create_index = True - - def is_connection_usable(self): - if self._state.closed: - return False - - # Returns True if we are idle, running a command, or in an active - # connection. If the connection is in an error state or the connection - # is otherwise unusable, return False. - txn_status = self._state.conn.get_transaction_status() - return txn_status < pg_extensions.TRANSACTION_STATUS_INERROR - - def last_insert_id(self, cursor, query_type=None): - try: - return cursor if query_type != Insert.SIMPLE else cursor[0][0] - except (IndexError, KeyError, TypeError): - pass - - def rows_affected(self, cursor): - try: - return cursor.rowcount - except AttributeError: - return cursor.cursor.rowcount - - def get_tables(self, schema=None): - query = ('SELECT tablename FROM pg_catalog.pg_tables ' - 'WHERE schemaname = %s ORDER BY tablename') - cursor = self.execute_sql(query, (schema or 'public',)) - return [table for table, in cursor.fetchall()] - - def get_views(self, schema=None): - query = ('SELECT viewname, definition FROM pg_catalog.pg_views ' - 'WHERE schemaname = %s ORDER BY viewname') - cursor = self.execute_sql(query, (schema or 'public',)) - return [ViewMetadata(view_name, sql.strip(' \t;')) - for (view_name, sql) in cursor.fetchall()] - - def get_indexes(self, table, schema=None): - query = """ - SELECT - i.relname, idxs.indexdef, idx.indisunique, - array_to_string(ARRAY( - SELECT pg_get_indexdef(idx.indexrelid, k + 1, TRUE) - FROM generate_subscripts(idx.indkey, 1) AS k - ORDER BY k), ',') - FROM pg_catalog.pg_class AS t - INNER JOIN pg_catalog.pg_index AS idx ON t.oid = idx.indrelid - INNER JOIN pg_catalog.pg_class AS i ON idx.indexrelid = i.oid - INNER JOIN pg_catalog.pg_indexes AS idxs ON - (idxs.tablename = t.relname AND idxs.indexname = i.relname) - WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s - ORDER BY idx.indisunique DESC, i.relname;""" - cursor = self.execute_sql(query, (table, 'r', schema or 'public')) - return [IndexMetadata(name, sql.rstrip(' ;'), columns.split(','), - is_unique, table) - for name, sql, is_unique, columns in cursor.fetchall()] - - def get_columns(self, table, schema=None): - query = """ - SELECT column_name, is_nullable, data_type, column_default - FROM information_schema.columns - WHERE table_name = %s AND table_schema = %s - ORDER BY ordinal_position""" - cursor = self.execute_sql(query, (table, schema or 'public')) - pks = set(self.get_primary_keys(table, schema)) - return [ColumnMetadata(name, dt, null == 'YES', name in pks, table, df) - for name, null, dt, df in cursor.fetchall()] - - def get_primary_keys(self, table, schema=None): - query = """ - SELECT kc.column_name - FROM information_schema.table_constraints AS tc - INNER JOIN information_schema.key_column_usage AS kc ON ( - tc.table_name = kc.table_name AND - tc.table_schema = kc.table_schema AND - tc.constraint_name = kc.constraint_name) - WHERE - tc.constraint_type = %s AND - tc.table_name = %s AND - tc.table_schema = %s""" - ctype = 'PRIMARY KEY' - cursor = self.execute_sql(query, (ctype, table, schema or 'public')) - return [pk for pk, in cursor.fetchall()] - - def get_foreign_keys(self, table, schema=None): - sql = """ - SELECT DISTINCT - kcu.column_name, ccu.table_name, ccu.column_name - FROM information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu - ON (tc.constraint_name = kcu.constraint_name AND - tc.constraint_schema = kcu.constraint_schema AND - tc.table_name = kcu.table_name AND - tc.table_schema = kcu.table_schema) - JOIN information_schema.constraint_column_usage AS ccu - ON (ccu.constraint_name = tc.constraint_name AND - ccu.constraint_schema = tc.constraint_schema) - WHERE - tc.constraint_type = 'FOREIGN KEY' AND - tc.table_name = %s AND - tc.table_schema = %s""" - cursor = self.execute_sql(sql, (table, schema or 'public')) - return [ForeignKeyMetadata(row[0], row[1], row[2], table) - for row in cursor.fetchall()] - - def sequence_exists(self, sequence): - res = self.execute_sql(""" - SELECT COUNT(*) FROM pg_class, pg_namespace - WHERE relkind='S' - AND pg_class.relnamespace = pg_namespace.oid - AND relname=%s""", (sequence,)) - return bool(res.fetchone()[0]) - - def get_binary_type(self): - return psycopg2.Binary - - def conflict_statement(self, on_conflict, query): - return - - def conflict_update(self, oc, query): - action = oc._action.lower() if oc._action else '' - if action in ('ignore', 'nothing'): - parts = [SQL('ON CONFLICT')] - if oc._conflict_target: - parts.append(EnclosedNodeList([ - Entity(col) if isinstance(col, basestring) else col - for col in oc._conflict_target])) - parts.append(SQL('DO NOTHING')) - return NodeList(parts) - elif action and action != 'update': - raise ValueError('The only supported actions for conflict ' - 'resolution with Postgresql are "ignore" or ' - '"update".') - elif not oc._update and not oc._preserve: - raise ValueError('If you are not performing any updates (or ' - 'preserving any INSERTed values), then the ' - 'conflict resolution action should be set to ' - '"IGNORE".') - elif not (oc._conflict_target or oc._conflict_constraint): - raise ValueError('Postgres requires that a conflict target be ' - 'specified when doing an upsert.') - - return self._build_on_conflict_update(oc, query) - - def extract_date(self, date_part, date_field): - return fn.EXTRACT(NodeList((date_part, SQL('FROM'), date_field))) - - def truncate_date(self, date_part, date_field): - return fn.DATE_TRUNC(date_part, date_field) - - def to_timestamp(self, date_field): - return self.extract_date('EPOCH', date_field) - - def from_timestamp(self, date_field): - # Ironically, here, Postgres means "to the Postgresql timestamp type". - return fn.to_timestamp(date_field) - - def get_noop_select(self, ctx): - return ctx.sql(Select().columns(SQL('0')).where(SQL('false'))) - - def set_time_zone(self, timezone): - self.execute_sql('set time zone "%s";' % timezone) - - -class MySQLDatabase(Database): - field_types = { - 'AUTO': 'INTEGER AUTO_INCREMENT', - 'BIGAUTO': 'BIGINT AUTO_INCREMENT', - 'BOOL': 'BOOL', - 'DECIMAL': 'NUMERIC', - 'DOUBLE': 'DOUBLE PRECISION', - 'FLOAT': 'FLOAT', - 'UUID': 'VARCHAR(40)', - 'UUIDB': 'VARBINARY(16)'} - operations = { - 'LIKE': 'LIKE BINARY', - 'ILIKE': 'LIKE', - 'REGEXP': 'REGEXP BINARY', - 'IREGEXP': 'REGEXP', - 'XOR': 'XOR'} - param = '%s' - quote = '``' - - commit_select = True - compound_select_parentheses = CSQ_PARENTHESES_UNNESTED - for_update = True - index_using_precedes_table = True - limit_max = 2 ** 64 - 1 - safe_create_index = False - safe_drop_index = False - sql_mode = 'PIPES_AS_CONCAT' - - def init(self, database, **kwargs): - params = { - 'charset': 'utf8', - 'sql_mode': self.sql_mode, - 'use_unicode': True} - params.update(kwargs) - if 'password' in params and mysql_passwd: - params['passwd'] = params.pop('password') - super(MySQLDatabase, self).init(database, **params) - - def _connect(self): - if mysql is None: - raise ImproperlyConfigured('MySQL driver not installed!') - conn = mysql.connect(db=self.database, **self.connect_params) - return conn - - def _set_server_version(self, conn): - try: - version_raw = conn.server_version - except AttributeError: - version_raw = conn.get_server_info() - self.server_version = self._extract_server_version(version_raw) - - def _extract_server_version(self, version): - version = version.lower() - if 'maria' in version: - match_obj = re.search(r'(1\d\.\d+\.\d+)', version) - else: - match_obj = re.search(r'(\d\.\d+\.\d+)', version) - if match_obj is not None: - return tuple(int(num) for num in match_obj.groups()[0].split('.')) - - warnings.warn('Unable to determine MySQL version: "%s"' % version) - return (0, 0, 0) # Unable to determine version! - - def is_connection_usable(self): - if self._state.closed: - return False - - conn = self._state.conn - if hasattr(conn, 'ping'): - try: - conn.ping(False) - except Exception: - return False - return True - - def default_values_insert(self, ctx): - return ctx.literal('() VALUES ()') - - def get_tables(self, schema=None): - query = ('SELECT table_name FROM information_schema.tables ' - 'WHERE table_schema = DATABASE() AND table_type != %s ' - 'ORDER BY table_name') - return [table for table, in self.execute_sql(query, ('VIEW',))] - - def get_views(self, schema=None): - query = ('SELECT table_name, view_definition ' - 'FROM information_schema.views ' - 'WHERE table_schema = DATABASE() ORDER BY table_name') - cursor = self.execute_sql(query) - return [ViewMetadata(*row) for row in cursor.fetchall()] - - def get_indexes(self, table, schema=None): - cursor = self.execute_sql('SHOW INDEX FROM `%s`' % table) - unique = set() - indexes = {} - for row in cursor.fetchall(): - if not row[1]: - unique.add(row[2]) - indexes.setdefault(row[2], []) - indexes[row[2]].append(row[4]) - return [IndexMetadata(name, None, indexes[name], name in unique, table) - for name in indexes] - - def get_columns(self, table, schema=None): - sql = """ - SELECT column_name, is_nullable, data_type, column_default - FROM information_schema.columns - WHERE table_name = %s AND table_schema = DATABASE()""" - cursor = self.execute_sql(sql, (table,)) - pks = set(self.get_primary_keys(table)) - return [ColumnMetadata(name, dt, null == 'YES', name in pks, table, df) - for name, null, dt, df in cursor.fetchall()] - - def get_primary_keys(self, table, schema=None): - cursor = self.execute_sql('SHOW INDEX FROM `%s`' % table) - return [row[4] for row in - filter(lambda row: row[2] == 'PRIMARY', cursor.fetchall())] - - def get_foreign_keys(self, table, schema=None): - query = """ - SELECT column_name, referenced_table_name, referenced_column_name - FROM information_schema.key_column_usage - WHERE table_name = %s - AND table_schema = DATABASE() - AND referenced_table_name IS NOT NULL - AND referenced_column_name IS NOT NULL""" - cursor = self.execute_sql(query, (table,)) - return [ - ForeignKeyMetadata(column, dest_table, dest_column, table) - for column, dest_table, dest_column in cursor.fetchall()] - - def get_binary_type(self): - return mysql.Binary - - def conflict_statement(self, on_conflict, query): - if not on_conflict._action: return - - action = on_conflict._action.lower() - if action == 'replace': - return SQL('REPLACE') - elif action == 'ignore': - return SQL('INSERT IGNORE') - elif action != 'update': - raise ValueError('Un-supported action for conflict resolution. ' - 'MySQL supports REPLACE, IGNORE and UPDATE.') - - def conflict_update(self, on_conflict, query): - if on_conflict._where or on_conflict._conflict_target or \ - on_conflict._conflict_constraint: - raise ValueError('MySQL does not support the specification of ' - 'where clauses or conflict targets for conflict ' - 'resolution.') - - updates = [] - if on_conflict._preserve: - # Here we need to determine which function to use, which varies - # depending on the MySQL server version. MySQL and MariaDB prior to - # 10.3.3 use "VALUES", while MariaDB 10.3.3+ use "VALUE". - version = self.server_version or (0,) - if version[0] == 10 and version >= (10, 3, 3): - VALUE_FN = fn.VALUE - else: - VALUE_FN = fn.VALUES - - for column in on_conflict._preserve: - entity = ensure_entity(column) - expression = NodeList(( - ensure_entity(column), - SQL('='), - VALUE_FN(entity))) - updates.append(expression) - - if on_conflict._update: - for k, v in on_conflict._update.items(): - if not isinstance(v, Node): - # Attempt to resolve string field-names to their respective - # field object, to apply data-type conversions. - if isinstance(k, basestring): - k = getattr(query.table, k) - if isinstance(k, Field): - v = k.to_value(v) - else: - v = Value(v, unpack=False) - updates.append(NodeList((ensure_entity(k), SQL('='), v))) - - if updates: - return NodeList((SQL('ON DUPLICATE KEY UPDATE'), - CommaNodeList(updates))) - - def extract_date(self, date_part, date_field): - return fn.EXTRACT(NodeList((SQL(date_part), SQL('FROM'), date_field))) - - def truncate_date(self, date_part, date_field): - return fn.DATE_FORMAT(date_field, __mysql_date_trunc__[date_part], - python_value=simple_date_time) - - def to_timestamp(self, date_field): - return fn.UNIX_TIMESTAMP(date_field) - - def from_timestamp(self, date_field): - return fn.FROM_UNIXTIME(date_field) - - def random(self): - return fn.rand() - - def get_noop_select(self, ctx): - return ctx.literal('DO 0') - - -# TRANSACTION CONTROL. - - -class _manual(_callable_context_manager): - def __init__(self, db): - self.db = db - - def __enter__(self): - top = self.db.top_transaction() - if top is not None and not isinstance(top, _manual): - raise ValueError('Cannot enter manual commit block while a ' - 'transaction is active.') - self.db.push_transaction(self) - - def __exit__(self, exc_type, exc_val, exc_tb): - if self.db.pop_transaction() is not self: - raise ValueError('Transaction stack corrupted while exiting ' - 'manual commit block.') - - -class _atomic(_callable_context_manager): - def __init__(self, db, *args, **kwargs): - self.db = db - self._transaction_args = (args, kwargs) - - def __enter__(self): - if self.db.transaction_depth() == 0: - args, kwargs = self._transaction_args - self._helper = self.db.transaction(*args, **kwargs) - elif isinstance(self.db.top_transaction(), _manual): - raise ValueError('Cannot enter atomic commit block while in ' - 'manual commit mode.') - else: - self._helper = self.db.savepoint() - return self._helper.__enter__() - - def __exit__(self, exc_type, exc_val, exc_tb): - return self._helper.__exit__(exc_type, exc_val, exc_tb) - - -class _transaction(_callable_context_manager): - def __init__(self, db, *args, **kwargs): - self.db = db - self._begin_args = (args, kwargs) - - def _begin(self): - args, kwargs = self._begin_args - self.db.begin(*args, **kwargs) - - def commit(self, begin=True): - self.db.commit() - if begin: - self._begin() - - def rollback(self, begin=True): - self.db.rollback() - if begin: - self._begin() - - def __enter__(self): - if self.db.transaction_depth() == 0: - self._begin() - self.db.push_transaction(self) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - try: - if exc_type: - self.rollback(False) - elif self.db.transaction_depth() == 1: - try: - self.commit(False) - except: - self.rollback(False) - raise - finally: - self.db.pop_transaction() - - -class _savepoint(_callable_context_manager): - def __init__(self, db, sid=None): - self.db = db - self.sid = sid or 's' + uuid.uuid4().hex - self.quoted_sid = self.sid.join(self.db.quote) - - def _begin(self): - self.db.execute_sql('SAVEPOINT %s;' % self.quoted_sid) - - def commit(self, begin=True): - self.db.execute_sql('RELEASE SAVEPOINT %s;' % self.quoted_sid) - if begin: self._begin() - - def rollback(self): - self.db.execute_sql('ROLLBACK TO SAVEPOINT %s;' % self.quoted_sid) - - def __enter__(self): - self._begin() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - if exc_type: - self.rollback() - else: - try: - self.commit(begin=False) - except: - self.rollback() - raise - - -# CURSOR REPRESENTATIONS. - - -class CursorWrapper(object): - def __init__(self, cursor): - self.cursor = cursor - self.count = 0 - self.index = 0 - self.initialized = False - self.populated = False - self.row_cache = [] - - def __iter__(self): - if self.populated: - return iter(self.row_cache) - return ResultIterator(self) - - def __getitem__(self, item): - if isinstance(item, slice): - stop = item.stop - if stop is None or stop < 0: - self.fill_cache() - else: - self.fill_cache(stop) - return self.row_cache[item] - elif isinstance(item, int): - self.fill_cache(item if item > 0 else 0) - return self.row_cache[item] - else: - raise ValueError('CursorWrapper only supports integer and slice ' - 'indexes.') - - def __len__(self): - self.fill_cache() - return self.count - - def initialize(self): - pass - - def iterate(self, cache=True): - row = self.cursor.fetchone() - if row is None: - self.populated = True - self.cursor.close() - raise StopIteration - elif not self.initialized: - self.initialize() # Lazy initialization. - self.initialized = True - self.count += 1 - result = self.process_row(row) - if cache: - self.row_cache.append(result) - return result - - def process_row(self, row): - return row - - def iterator(self): - """Efficient one-pass iteration over the result set.""" - while True: - try: - yield self.iterate(False) - except StopIteration: - return - - def fill_cache(self, n=0): - n = n or float('Inf') - if n < 0: - raise ValueError('Negative values are not supported.') - - iterator = ResultIterator(self) - iterator.index = self.count - while not self.populated and (n > self.count): - try: - iterator.next() - except StopIteration: - break - - -class DictCursorWrapper(CursorWrapper): - def _initialize_columns(self): - description = self.cursor.description - self.columns = [t[0][t[0].rfind('.') + 1:].strip('()"`') - for t in description] - self.ncols = len(description) - - initialize = _initialize_columns - - def _row_to_dict(self, row): - result = {} - for i in range(self.ncols): - result.setdefault(self.columns[i], row[i]) # Do not overwrite. - return result - - process_row = _row_to_dict - - -class NamedTupleCursorWrapper(CursorWrapper): - def initialize(self): - description = self.cursor.description - self.tuple_class = collections.namedtuple('Row', [ - t[0][t[0].rfind('.') + 1:].strip('()"`') for t in description]) - - def process_row(self, row): - return self.tuple_class(*row) - - -class ObjectCursorWrapper(DictCursorWrapper): - def __init__(self, cursor, constructor): - super(ObjectCursorWrapper, self).__init__(cursor) - self.constructor = constructor - - def process_row(self, row): - row_dict = self._row_to_dict(row) - return self.constructor(**row_dict) - - -class ResultIterator(object): - def __init__(self, cursor_wrapper): - self.cursor_wrapper = cursor_wrapper - self.index = 0 - - def __iter__(self): - return self - - def next(self): - if self.index < self.cursor_wrapper.count: - obj = self.cursor_wrapper.row_cache[self.index] - elif not self.cursor_wrapper.populated: - self.cursor_wrapper.iterate() - obj = self.cursor_wrapper.row_cache[self.index] - else: - raise StopIteration - self.index += 1 - return obj - - __next__ = next - -# FIELDS - -class FieldAccessor(object): - def __init__(self, model, field, name): - self.model = model - self.field = field - self.name = name - - def __get__(self, instance, instance_type=None): - if instance is not None: - return instance.__data__.get(self.name) - return self.field - - def __set__(self, instance, value): - instance.__data__[self.name] = value - instance._dirty.add(self.name) - - -class ForeignKeyAccessor(FieldAccessor): - def __init__(self, model, field, name): - super(ForeignKeyAccessor, self).__init__(model, field, name) - self.rel_model = field.rel_model - - def get_rel_instance(self, instance): - value = instance.__data__.get(self.name) - if value is not None or self.name in instance.__rel__: - if self.name not in instance.__rel__ and self.field.lazy_load: - obj = self.rel_model.get(self.field.rel_field == value) - instance.__rel__[self.name] = obj - return instance.__rel__.get(self.name, value) - elif not self.field.null and self.field.lazy_load: - raise self.rel_model.DoesNotExist - return value - - def __get__(self, instance, instance_type=None): - if instance is not None: - return self.get_rel_instance(instance) - return self.field - - def __set__(self, instance, obj): - if isinstance(obj, self.rel_model): - instance.__data__[self.name] = getattr(obj, self.field.rel_field.name) - instance.__rel__[self.name] = obj - else: - fk_value = instance.__data__.get(self.name) - instance.__data__[self.name] = obj - if (obj != fk_value or obj is None) and \ - self.name in instance.__rel__: - del instance.__rel__[self.name] - instance._dirty.add(self.name) - - -class BackrefAccessor(object): - def __init__(self, field): - self.field = field - self.model = field.rel_model - self.rel_model = field.model - - def __get__(self, instance, instance_type=None): - if instance is not None: - dest = self.field.rel_field.name - return (self.rel_model - .select() - .where(self.field == getattr(instance, dest))) - return self - - -class ObjectIdAccessor(object): - """Gives direct access to the underlying id""" - def __init__(self, field): - self.field = field - - def __get__(self, instance, instance_type=None): - if instance is not None: - value = instance.__data__.get(self.field.name) - # Pull the object-id from the related object if it is not set. - if value is None and self.field.name in instance.__rel__: - rel_obj = instance.__rel__[self.field.name] - value = getattr(rel_obj, self.field.rel_field.name) - return value - return self.field - - def __set__(self, instance, value): - setattr(instance, self.field.name, value) - - -class Field(ColumnBase): - _field_counter = 0 - _order = 0 - accessor_class = FieldAccessor - auto_increment = False - default_index_type = None - field_type = 'DEFAULT' - unpack = True - - def __init__(self, null=False, index=False, unique=False, column_name=None, - default=None, primary_key=False, constraints=None, - sequence=None, collation=None, unindexed=False, choices=None, - help_text=None, verbose_name=None, index_type=None, - db_column=None, _hidden=False): - if db_column is not None: - __deprecated__('"db_column" has been deprecated in favor of ' - '"column_name" for Field objects.') - column_name = db_column - - self.null = null - self.index = index - self.unique = unique - self.column_name = column_name - self.default = default - self.primary_key = primary_key - self.constraints = constraints # List of column constraints. - self.sequence = sequence # Name of sequence, e.g. foo_id_seq. - self.collation = collation - self.unindexed = unindexed - self.choices = choices - self.help_text = help_text - self.verbose_name = verbose_name - self.index_type = index_type or self.default_index_type - self._hidden = _hidden - - # Used internally for recovering the order in which Fields were defined - # on the Model class. - Field._field_counter += 1 - self._order = Field._field_counter - self._sort_key = (self.primary_key and 1 or 2), self._order - - def __hash__(self): - return hash(self.name + '.' + self.model.__name__) - - def __repr__(self): - if hasattr(self, 'model') and getattr(self, 'name', None): - return '<%s: %s.%s>' % (type(self).__name__, - self.model.__name__, - self.name) - return '<%s: (unbound)>' % type(self).__name__ - - def bind(self, model, name, set_attribute=True): - self.model = model - self.name = self.safe_name = name - self.column_name = self.column_name or name - if set_attribute: - setattr(model, name, self.accessor_class(model, self, name)) - - @property - def column(self): - return Column(self.model._meta.table, self.column_name) - - def adapt(self, value): - return value - - def db_value(self, value): - return value if value is None else self.adapt(value) - - def python_value(self, value): - return value if value is None else self.adapt(value) - - def to_value(self, value): - return Value(value, self.db_value, unpack=False) - - def get_sort_key(self, ctx): - return self._sort_key - - def __sql__(self, ctx): - return ctx.sql(self.column) - - def get_modifiers(self): - pass - - def ddl_datatype(self, ctx): - if ctx and ctx.state.field_types: - column_type = ctx.state.field_types.get(self.field_type, - self.field_type) - else: - column_type = self.field_type - - modifiers = self.get_modifiers() - if column_type and modifiers: - modifier_literal = ', '.join([str(m) for m in modifiers]) - return SQL('%s(%s)' % (column_type, modifier_literal)) - else: - return SQL(column_type) - - def ddl(self, ctx): - accum = [Entity(self.column_name)] - data_type = self.ddl_datatype(ctx) - if data_type: - accum.append(data_type) - if self.unindexed: - accum.append(SQL('UNINDEXED')) - if not self.null: - accum.append(SQL('NOT NULL')) - if self.primary_key: - accum.append(SQL('PRIMARY KEY')) - if self.sequence: - accum.append(SQL("DEFAULT NEXTVAL('%s')" % self.sequence)) - if self.constraints: - accum.extend(self.constraints) - if self.collation: - accum.append(SQL('COLLATE %s' % self.collation)) - return NodeList(accum) - - -class AnyField(Field): - field_type = 'ANY' - - -class IntegerField(Field): - field_type = 'INT' - - def adapt(self, value): - try: - return int(value) - except ValueError: - return value - - -class BigIntegerField(IntegerField): - field_type = 'BIGINT' - - -class SmallIntegerField(IntegerField): - field_type = 'SMALLINT' - - -class AutoField(IntegerField): - auto_increment = True - field_type = 'AUTO' - - def __init__(self, *args, **kwargs): - if kwargs.get('primary_key') is False: - raise ValueError('%s must always be a primary key.' % type(self)) - kwargs['primary_key'] = True - super(AutoField, self).__init__(*args, **kwargs) - - -class BigAutoField(AutoField): - field_type = 'BIGAUTO' - - -class IdentityField(AutoField): - field_type = 'INT GENERATED BY DEFAULT AS IDENTITY' - - def __init__(self, generate_always=False, **kwargs): - if generate_always: - self.field_type = 'INT GENERATED ALWAYS AS IDENTITY' - super(IdentityField, self).__init__(**kwargs) - - -class PrimaryKeyField(AutoField): - def __init__(self, *args, **kwargs): - __deprecated__('"PrimaryKeyField" has been renamed to "AutoField". ' - 'Please update your code accordingly as this will be ' - 'completely removed in a subsequent release.') - super(PrimaryKeyField, self).__init__(*args, **kwargs) - - -class FloatField(Field): - field_type = 'FLOAT' - - def adapt(self, value): - try: - return float(value) - except ValueError: - return value - - -class DoubleField(FloatField): - field_type = 'DOUBLE' - - -class DecimalField(Field): - field_type = 'DECIMAL' - - def __init__(self, max_digits=10, decimal_places=5, auto_round=False, - rounding=None, *args, **kwargs): - self.max_digits = max_digits - self.decimal_places = decimal_places - self.auto_round = auto_round - self.rounding = rounding or decimal.DefaultContext.rounding - self._exp = decimal.Decimal(10) ** (-self.decimal_places) - super(DecimalField, self).__init__(*args, **kwargs) - - def get_modifiers(self): - return [self.max_digits, self.decimal_places] - - def db_value(self, value): - D = decimal.Decimal - if not value: - return value if value is None else D(0) - if self.auto_round: - decimal_value = D(text_type(value)) - return decimal_value.quantize(self._exp, rounding=self.rounding) - return value - - def python_value(self, value): - if value is not None: - if isinstance(value, decimal.Decimal): - return value - return decimal.Decimal(text_type(value)) - - -class _StringField(Field): - def adapt(self, value): - if isinstance(value, text_type): - return value - elif isinstance(value, bytes_type): - return value.decode('utf-8') - return text_type(value) - - def __add__(self, other): return StringExpression(self, OP.CONCAT, other) - def __radd__(self, other): return StringExpression(other, OP.CONCAT, self) - - -class CharField(_StringField): - field_type = 'VARCHAR' - - def __init__(self, max_length=255, *args, **kwargs): - self.max_length = max_length - super(CharField, self).__init__(*args, **kwargs) - - def get_modifiers(self): - return self.max_length and [self.max_length] or None - - -class FixedCharField(CharField): - field_type = 'CHAR' - - def python_value(self, value): - value = super(FixedCharField, self).python_value(value) - if value: - value = value.strip() - return value - - -class TextField(_StringField): - field_type = 'TEXT' - - -class BlobField(Field): - field_type = 'BLOB' - - def _db_hook(self, database): - if database is None: - self._constructor = bytearray - else: - self._constructor = database.get_binary_type() - - def bind(self, model, name, set_attribute=True): - self._constructor = bytearray - if model._meta.database: - if isinstance(model._meta.database, Proxy): - model._meta.database.attach_callback(self._db_hook) - else: - self._db_hook(model._meta.database) - - # Attach a hook to the model metadata; in the event the database is - # changed or set at run-time, we will be sure to apply our callback and - # use the proper data-type for our database driver. - model._meta._db_hooks.append(self._db_hook) - return super(BlobField, self).bind(model, name, set_attribute) - - def db_value(self, value): - if isinstance(value, text_type): - value = value.encode('raw_unicode_escape') - if isinstance(value, bytes_type): - return self._constructor(value) - return value - - -class BitField(BitwiseMixin, BigIntegerField): - def __init__(self, *args, **kwargs): - kwargs.setdefault('default', 0) - super(BitField, self).__init__(*args, **kwargs) - self.__current_flag = 1 - - def flag(self, value=None): - if value is None: - value = self.__current_flag - self.__current_flag <<= 1 - else: - self.__current_flag = value << 1 - - class FlagDescriptor(ColumnBase): - def __init__(self, field, value): - self._field = field - self._value = value - super(FlagDescriptor, self).__init__() - def clear(self): - return self._field.bin_and(~self._value) - def set(self): - return self._field.bin_or(self._value) - def __get__(self, instance, instance_type=None): - if instance is None: - return self - value = getattr(instance, self._field.name) or 0 - return (value & self._value) != 0 - def __set__(self, instance, is_set): - if is_set not in (True, False): - raise ValueError('Value must be either True or False') - value = getattr(instance, self._field.name) or 0 - if is_set: - value |= self._value - else: - value &= ~self._value - setattr(instance, self._field.name, value) - def __sql__(self, ctx): - return ctx.sql(self._field.bin_and(self._value) != 0) - return FlagDescriptor(self, value) - - -class BigBitFieldData(object): - def __init__(self, instance, name): - self.instance = instance - self.name = name - value = self.instance.__data__.get(self.name) - if not value: - value = bytearray() - elif not isinstance(value, bytearray): - value = bytearray(value) - self._buffer = self.instance.__data__[self.name] = value - - def _ensure_length(self, idx): - byte_num, byte_offset = divmod(idx, 8) - cur_size = len(self._buffer) - if cur_size <= byte_num: - self._buffer.extend(b'\x00' * ((byte_num + 1) - cur_size)) - return byte_num, byte_offset - - def set_bit(self, idx): - byte_num, byte_offset = self._ensure_length(idx) - self._buffer[byte_num] |= (1 << byte_offset) - - def clear_bit(self, idx): - byte_num, byte_offset = self._ensure_length(idx) - self._buffer[byte_num] &= ~(1 << byte_offset) - - def toggle_bit(self, idx): - byte_num, byte_offset = self._ensure_length(idx) - self._buffer[byte_num] ^= (1 << byte_offset) - return bool(self._buffer[byte_num] & (1 << byte_offset)) - - def is_set(self, idx): - byte_num, byte_offset = self._ensure_length(idx) - return bool(self._buffer[byte_num] & (1 << byte_offset)) - - def __repr__(self): - return repr(self._buffer) - - -class BigBitFieldAccessor(FieldAccessor): - def __get__(self, instance, instance_type=None): - if instance is None: - return self.field - return BigBitFieldData(instance, self.name) - def __set__(self, instance, value): - if isinstance(value, memoryview): - value = value.tobytes() - elif isinstance(value, buffer_type): - value = bytes(value) - elif isinstance(value, bytearray): - value = bytes_type(value) - elif isinstance(value, BigBitFieldData): - value = bytes_type(value._buffer) - elif isinstance(value, text_type): - value = value.encode('utf-8') - elif not isinstance(value, bytes_type): - raise ValueError('Value must be either a bytes, memoryview or ' - 'BigBitFieldData instance.') - super(BigBitFieldAccessor, self).__set__(instance, value) - - -class BigBitField(BlobField): - accessor_class = BigBitFieldAccessor - - def __init__(self, *args, **kwargs): - kwargs.setdefault('default', bytes_type) - super(BigBitField, self).__init__(*args, **kwargs) - - def db_value(self, value): - return bytes_type(value) if value is not None else value - - -class UUIDField(Field): - field_type = 'UUID' - - def db_value(self, value): - if isinstance(value, basestring) and len(value) == 32: - # Hex string. No transformation is necessary. - return value - elif isinstance(value, bytes) and len(value) == 16: - # Allow raw binary representation. - value = uuid.UUID(bytes=value) - if isinstance(value, uuid.UUID): - return value.hex - try: - return uuid.UUID(value).hex - except: - return value - - def python_value(self, value): - if isinstance(value, uuid.UUID): - return value - return uuid.UUID(value) if value is not None else None - - -class BinaryUUIDField(BlobField): - field_type = 'UUIDB' - - def db_value(self, value): - if isinstance(value, bytes) and len(value) == 16: - # Raw binary value. No transformation is necessary. - return self._constructor(value) - elif isinstance(value, basestring) and len(value) == 32: - # Allow hex string representation. - value = uuid.UUID(hex=value) - if isinstance(value, uuid.UUID): - return self._constructor(value.bytes) - elif value is not None: - raise ValueError('value for binary UUID field must be UUID(), ' - 'a hexadecimal string, or a bytes object.') - - def python_value(self, value): - if isinstance(value, uuid.UUID): - return value - elif isinstance(value, memoryview): - value = value.tobytes() - elif value and not isinstance(value, bytes): - value = bytes(value) - return uuid.UUID(bytes=value) if value is not None else None - - -def _date_part(date_part): - def dec(self): - return self.model._meta.database.extract_date(date_part, self) - return dec - -def format_date_time(value, formats, post_process=None): - post_process = post_process or (lambda x: x) - for fmt in formats: - try: - return post_process(datetime.datetime.strptime(value, fmt)) - except ValueError: - pass - return value - -def simple_date_time(value): - try: - return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S') - except (TypeError, ValueError): - return value - - -class _BaseFormattedField(Field): - formats = None - - def __init__(self, formats=None, *args, **kwargs): - if formats is not None: - self.formats = formats - super(_BaseFormattedField, self).__init__(*args, **kwargs) - - -class DateTimeField(_BaseFormattedField): - field_type = 'DATETIME' - formats = [ - '%Y-%m-%d %H:%M:%S.%f', - '%Y-%m-%d %H:%M:%S', - '%Y-%m-%d', - ] - - def adapt(self, value): - if value and isinstance(value, basestring): - return format_date_time(value, self.formats) - return value - - def to_timestamp(self): - return self.model._meta.database.to_timestamp(self) - - def truncate(self, part): - return self.model._meta.database.truncate_date(part, self) - - year = property(_date_part('year')) - month = property(_date_part('month')) - day = property(_date_part('day')) - hour = property(_date_part('hour')) - minute = property(_date_part('minute')) - second = property(_date_part('second')) - - -class DateField(_BaseFormattedField): - field_type = 'DATE' - formats = [ - '%Y-%m-%d', - '%Y-%m-%d %H:%M:%S', - '%Y-%m-%d %H:%M:%S.%f', - ] - - def adapt(self, value): - if value and isinstance(value, basestring): - pp = lambda x: x.date() - return format_date_time(value, self.formats, pp) - elif value and isinstance(value, datetime.datetime): - return value.date() - return value - - def to_timestamp(self): - return self.model._meta.database.to_timestamp(self) - - def truncate(self, part): - return self.model._meta.database.truncate_date(part, self) - - year = property(_date_part('year')) - month = property(_date_part('month')) - day = property(_date_part('day')) - - -class TimeField(_BaseFormattedField): - field_type = 'TIME' - formats = [ - '%H:%M:%S.%f', - '%H:%M:%S', - '%H:%M', - '%Y-%m-%d %H:%M:%S.%f', - '%Y-%m-%d %H:%M:%S', - ] - - def adapt(self, value): - if value: - if isinstance(value, basestring): - pp = lambda x: x.time() - return format_date_time(value, self.formats, pp) - elif isinstance(value, datetime.datetime): - return value.time() - if value is not None and isinstance(value, datetime.timedelta): - return (datetime.datetime.min + value).time() - return value - - hour = property(_date_part('hour')) - minute = property(_date_part('minute')) - second = property(_date_part('second')) - - -def _timestamp_date_part(date_part): - def dec(self): - db = self.model._meta.database - expr = ((self / Value(self.resolution, converter=False)) - if self.resolution > 1 else self) - return db.extract_date(date_part, db.from_timestamp(expr)) - return dec - - -class TimestampField(BigIntegerField): - # Support second -> microsecond resolution. - valid_resolutions = [10**i for i in range(7)] - - def __init__(self, *args, **kwargs): - self.resolution = kwargs.pop('resolution', None) - - if not self.resolution: - self.resolution = 1 - elif self.resolution in range(2, 7): - self.resolution = 10 ** self.resolution - elif self.resolution not in self.valid_resolutions: - raise ValueError('TimestampField resolution must be one of: %s' % - ', '.join(str(i) for i in self.valid_resolutions)) - self.ticks_to_microsecond = 1000000 // self.resolution - - self.utc = kwargs.pop('utc', False) or False - dflt = datetime.datetime.utcnow if self.utc else datetime.datetime.now - kwargs.setdefault('default', dflt) - super(TimestampField, self).__init__(*args, **kwargs) - - def local_to_utc(self, dt): - # Convert naive local datetime into naive UTC, e.g.: - # 2019-03-01T12:00:00 (local=US/Central) -> 2019-03-01T18:00:00. - # 2019-05-01T12:00:00 (local=US/Central) -> 2019-05-01T17:00:00. - # 2019-03-01T12:00:00 (local=UTC) -> 2019-03-01T12:00:00. - return datetime.datetime(*time.gmtime(time.mktime(dt.timetuple()))[:6]) - - def utc_to_local(self, dt): - # Convert a naive UTC datetime into local time, e.g.: - # 2019-03-01T18:00:00 (local=US/Central) -> 2019-03-01T12:00:00. - # 2019-05-01T17:00:00 (local=US/Central) -> 2019-05-01T12:00:00. - # 2019-03-01T12:00:00 (local=UTC) -> 2019-03-01T12:00:00. - ts = calendar.timegm(dt.utctimetuple()) - return datetime.datetime.fromtimestamp(ts) - - def get_timestamp(self, value): - if self.utc: - # If utc-mode is on, then we assume all naive datetimes are in UTC. - return calendar.timegm(value.utctimetuple()) - else: - return time.mktime(value.timetuple()) - - def db_value(self, value): - if value is None: - return - - if isinstance(value, datetime.datetime): - pass - elif isinstance(value, datetime.date): - value = datetime.datetime(value.year, value.month, value.day) - else: - return int(round(value * self.resolution)) - - timestamp = self.get_timestamp(value) - if self.resolution > 1: - timestamp += (value.microsecond * .000001) - timestamp *= self.resolution - return int(round(timestamp)) - - def python_value(self, value): - if value is not None and isinstance(value, (int, float, long)): - if self.resolution > 1: - value, ticks = divmod(value, self.resolution) - microseconds = int(ticks * self.ticks_to_microsecond) - else: - microseconds = 0 - - if self.utc: - value = datetime.datetime.utcfromtimestamp(value) - else: - value = datetime.datetime.fromtimestamp(value) - - if microseconds: - value = value.replace(microsecond=microseconds) - - return value - - def from_timestamp(self): - expr = ((self / Value(self.resolution, converter=False)) - if self.resolution > 1 else self) - return self.model._meta.database.from_timestamp(expr) - - year = property(_timestamp_date_part('year')) - month = property(_timestamp_date_part('month')) - day = property(_timestamp_date_part('day')) - hour = property(_timestamp_date_part('hour')) - minute = property(_timestamp_date_part('minute')) - second = property(_timestamp_date_part('second')) - - -class IPField(BigIntegerField): - def db_value(self, val): - if val is not None: - return struct.unpack('!I', socket.inet_aton(val))[0] - - def python_value(self, val): - if val is not None: - return socket.inet_ntoa(struct.pack('!I', val)) - - -class BooleanField(Field): - field_type = 'BOOL' - adapt = bool - - -class BareField(Field): - def __init__(self, adapt=None, *args, **kwargs): - super(BareField, self).__init__(*args, **kwargs) - if adapt is not None: - self.adapt = adapt - - def ddl_datatype(self, ctx): - return - - -class ForeignKeyField(Field): - accessor_class = ForeignKeyAccessor - backref_accessor_class = BackrefAccessor - - def __init__(self, model, field=None, backref=None, on_delete=None, - on_update=None, deferrable=None, _deferred=None, - rel_model=None, to_field=None, object_id_name=None, - lazy_load=True, constraint_name=None, related_name=None, - *args, **kwargs): - kwargs.setdefault('index', True) - - super(ForeignKeyField, self).__init__(*args, **kwargs) - - if rel_model is not None: - __deprecated__('"rel_model" has been deprecated in favor of ' - '"model" for ForeignKeyField objects.') - model = rel_model - if to_field is not None: - __deprecated__('"to_field" has been deprecated in favor of ' - '"field" for ForeignKeyField objects.') - field = to_field - if related_name is not None: - __deprecated__('"related_name" has been deprecated in favor of ' - '"backref" for Field objects.') - backref = related_name - - self._is_self_reference = model == 'self' - self.rel_model = model - self.rel_field = field - self.declared_backref = backref - self.backref = None - self.on_delete = on_delete - self.on_update = on_update - self.deferrable = deferrable - self.deferred = _deferred - self.object_id_name = object_id_name - self.lazy_load = lazy_load - self.constraint_name = constraint_name - - @property - def field_type(self): - if not isinstance(self.rel_field, AutoField): - return self.rel_field.field_type - elif isinstance(self.rel_field, BigAutoField): - return BigIntegerField.field_type - return IntegerField.field_type - - def get_modifiers(self): - if not isinstance(self.rel_field, AutoField): - return self.rel_field.get_modifiers() - return super(ForeignKeyField, self).get_modifiers() - - def adapt(self, value): - return self.rel_field.adapt(value) - - def db_value(self, value): - if isinstance(value, self.rel_model): - value = getattr(value, self.rel_field.name) - return self.rel_field.db_value(value) - - def python_value(self, value): - if isinstance(value, self.rel_model): - return value - return self.rel_field.python_value(value) - - def bind(self, model, name, set_attribute=True): - if not self.column_name: - self.column_name = name if name.endswith('_id') else name + '_id' - if not self.object_id_name: - self.object_id_name = self.column_name - if self.object_id_name == name: - self.object_id_name += '_id' - elif self.object_id_name == name: - raise ValueError('ForeignKeyField "%s"."%s" specifies an ' - 'object_id_name that conflicts with its field ' - 'name.' % (model._meta.name, name)) - if self._is_self_reference: - self.rel_model = model - if isinstance(self.rel_field, basestring): - self.rel_field = getattr(self.rel_model, self.rel_field) - elif self.rel_field is None: - self.rel_field = self.rel_model._meta.primary_key - - # Bind field before assigning backref, so field is bound when - # calling declared_backref() (if callable). - super(ForeignKeyField, self).bind(model, name, set_attribute) - self.safe_name = self.object_id_name - - if callable_(self.declared_backref): - self.backref = self.declared_backref(self) - else: - self.backref, self.declared_backref = self.declared_backref, None - if not self.backref: - self.backref = '%s_set' % model._meta.name - - if set_attribute: - setattr(model, self.object_id_name, ObjectIdAccessor(self)) - if self.backref not in '!+': - setattr(self.rel_model, self.backref, - self.backref_accessor_class(self)) - - def foreign_key_constraint(self): - parts = [] - if self.constraint_name: - parts.extend((SQL('CONSTRAINT'), Entity(self.constraint_name))) - parts.extend([ - SQL('FOREIGN KEY'), - EnclosedNodeList((self,)), - SQL('REFERENCES'), - self.rel_model, - EnclosedNodeList((self.rel_field,))]) - if self.on_delete: - parts.append(SQL('ON DELETE %s' % self.on_delete)) - if self.on_update: - parts.append(SQL('ON UPDATE %s' % self.on_update)) - if self.deferrable: - parts.append(SQL('DEFERRABLE %s' % self.deferrable)) - return NodeList(parts) - - def __getattr__(self, attr): - if attr.startswith('__'): - # Prevent recursion error when deep-copying. - raise AttributeError('Cannot look-up non-existant "__" methods.') - if attr in self.rel_model._meta.fields: - return self.rel_model._meta.fields[attr] - raise AttributeError('Foreign-key has no attribute %s, nor is it a ' - 'valid field on the related model.' % attr) - - -class DeferredForeignKey(Field): - _unresolved = set() - - def __init__(self, rel_model_name, **kwargs): - self.field_kwargs = kwargs - self.rel_model_name = rel_model_name.lower() - DeferredForeignKey._unresolved.add(self) - super(DeferredForeignKey, self).__init__( - column_name=kwargs.get('column_name'), - null=kwargs.get('null'), - primary_key=kwargs.get('primary_key')) - - __hash__ = object.__hash__ - - def __deepcopy__(self, memo=None): - return DeferredForeignKey(self.rel_model_name, **self.field_kwargs) - - def set_model(self, rel_model): - field = ForeignKeyField(rel_model, _deferred=True, **self.field_kwargs) - if field.primary_key: - # NOTE: this calls add_field() under-the-hood. - self.model._meta.set_primary_key(self.name, field) - else: - self.model._meta.add_field(self.name, field) - - @staticmethod - def resolve(model_cls): - unresolved = sorted(DeferredForeignKey._unresolved, - key=operator.attrgetter('_order')) - for dr in unresolved: - if dr.rel_model_name == model_cls.__name__.lower(): - dr.set_model(model_cls) - DeferredForeignKey._unresolved.discard(dr) - - -class DeferredThroughModel(object): - def __init__(self): - self._refs = [] - - def set_field(self, model, field, name): - self._refs.append((model, field, name)) - - def set_model(self, through_model): - for src_model, m2mfield, name in self._refs: - m2mfield.through_model = through_model - src_model._meta.add_field(name, m2mfield) - - -class MetaField(Field): - column_name = default = model = name = None - primary_key = False - - -class ManyToManyFieldAccessor(FieldAccessor): - def __init__(self, model, field, name): - super(ManyToManyFieldAccessor, self).__init__(model, field, name) - self.model = field.model - self.rel_model = field.rel_model - self.through_model = field.through_model - src_fks = self.through_model._meta.model_refs[self.model] - dest_fks = self.through_model._meta.model_refs[self.rel_model] - if not src_fks: - raise ValueError('Cannot find foreign-key to "%s" on "%s" model.' % - (self.model, self.through_model)) - elif not dest_fks: - raise ValueError('Cannot find foreign-key to "%s" on "%s" model.' % - (self.rel_model, self.through_model)) - self.src_fk = src_fks[0] - self.dest_fk = dest_fks[0] - - def __get__(self, instance, instance_type=None, force_query=False): - if instance is not None: - if not force_query and self.src_fk.backref != '+': - backref = getattr(instance, self.src_fk.backref) - if isinstance(backref, list): - return [getattr(obj, self.dest_fk.name) for obj in backref] - - src_id = getattr(instance, self.src_fk.rel_field.name) - return (ManyToManyQuery(instance, self, self.rel_model) - .join(self.through_model) - .join(self.model) - .where(self.src_fk == src_id)) - - return self.field - - def __set__(self, instance, value): - query = self.__get__(instance, force_query=True) - query.add(value, clear_existing=True) - - -class ManyToManyField(MetaField): - accessor_class = ManyToManyFieldAccessor - - def __init__(self, model, backref=None, through_model=None, on_delete=None, - on_update=None, _is_backref=False): - if through_model is not None: - if not (isinstance(through_model, DeferredThroughModel) or - is_model(through_model)): - raise TypeError('Unexpected value for through_model. Expected ' - 'Model or DeferredThroughModel.') - if not _is_backref and (on_delete is not None or on_update is not None): - raise ValueError('Cannot specify on_delete or on_update when ' - 'through_model is specified.') - self.rel_model = model - self.backref = backref - self._through_model = through_model - self._on_delete = on_delete - self._on_update = on_update - self._is_backref = _is_backref - - def _get_descriptor(self): - return ManyToManyFieldAccessor(self) - - def bind(self, model, name, set_attribute=True): - if isinstance(self._through_model, DeferredThroughModel): - self._through_model.set_field(model, self, name) - return - - super(ManyToManyField, self).bind(model, name, set_attribute) - - if not self._is_backref: - many_to_many_field = ManyToManyField( - self.model, - backref=name, - through_model=self.through_model, - on_delete=self._on_delete, - on_update=self._on_update, - _is_backref=True) - self.backref = self.backref or model._meta.name + 's' - self.rel_model._meta.add_field(self.backref, many_to_many_field) - - def get_models(self): - return [model for _, model in sorted(( - (self._is_backref, self.model), - (not self._is_backref, self.rel_model)))] - - @property - def through_model(self): - if self._through_model is None: - self._through_model = self._create_through_model() - return self._through_model - - @through_model.setter - def through_model(self, value): - self._through_model = value - - def _create_through_model(self): - lhs, rhs = self.get_models() - tables = [model._meta.table_name for model in (lhs, rhs)] - - class Meta: - database = self.model._meta.database - schema = self.model._meta.schema - table_name = '%s_%s_through' % tuple(tables) - indexes = ( - ((lhs._meta.name, rhs._meta.name), - True),) - - params = {'on_delete': self._on_delete, 'on_update': self._on_update} - attrs = { - lhs._meta.name: ForeignKeyField(lhs, **params), - rhs._meta.name: ForeignKeyField(rhs, **params), - 'Meta': Meta} - - klass_name = '%s%sThrough' % (lhs.__name__, rhs.__name__) - return type(klass_name, (Model,), attrs) - - def get_through_model(self): - # XXX: Deprecated. Just use the "through_model" property. - return self.through_model - - -class VirtualField(MetaField): - field_class = None - - def __init__(self, field_class=None, *args, **kwargs): - Field = field_class if field_class is not None else self.field_class - self.field_instance = Field() if Field is not None else None - super(VirtualField, self).__init__(*args, **kwargs) - - def db_value(self, value): - if self.field_instance is not None: - return self.field_instance.db_value(value) - return value - - def python_value(self, value): - if self.field_instance is not None: - return self.field_instance.python_value(value) - return value - - def bind(self, model, name, set_attribute=True): - self.model = model - self.column_name = self.name = self.safe_name = name - setattr(model, name, self.accessor_class(model, self, name)) - - -class CompositeKey(MetaField): - sequence = None - - def __init__(self, *field_names): - self.field_names = field_names - self._safe_field_names = None - - @property - def safe_field_names(self): - if self._safe_field_names is None: - if self.model is None: - return self.field_names - - self._safe_field_names = [self.model._meta.fields[f].safe_name - for f in self.field_names] - return self._safe_field_names - - def __get__(self, instance, instance_type=None): - if instance is not None: - return tuple([getattr(instance, f) for f in self.safe_field_names]) - return self - - def __set__(self, instance, value): - if not isinstance(value, (list, tuple)): - raise TypeError('A list or tuple must be used to set the value of ' - 'a composite primary key.') - if len(value) != len(self.field_names): - raise ValueError('The length of the value must equal the number ' - 'of columns of the composite primary key.') - for idx, field_value in enumerate(value): - setattr(instance, self.field_names[idx], field_value) - - def __eq__(self, other): - expressions = [(self.model._meta.fields[field] == value) - for field, value in zip(self.field_names, other)] - return reduce(operator.and_, expressions) - - def __ne__(self, other): - return ~(self == other) - - def __hash__(self): - return hash((self.model.__name__, self.field_names)) - - def __sql__(self, ctx): - # If the composite PK is being selected, do not use parens. Elsewhere, - # such as in an expression, we want to use parentheses and treat it as - # a row value. - parens = ctx.scope != SCOPE_SOURCE - return ctx.sql(NodeList([self.model._meta.fields[field] - for field in self.field_names], ', ', parens)) - - def bind(self, model, name, set_attribute=True): - self.model = model - self.column_name = self.name = self.safe_name = name - setattr(model, self.name, self) - - -class _SortedFieldList(object): - __slots__ = ('_keys', '_items') - - def __init__(self): - self._keys = [] - self._items = [] - - def __getitem__(self, i): - return self._items[i] - - def __iter__(self): - return iter(self._items) - - def __contains__(self, item): - k = item._sort_key - i = bisect_left(self._keys, k) - j = bisect_right(self._keys, k) - return item in self._items[i:j] - - def index(self, field): - return self._keys.index(field._sort_key) - - def insert(self, item): - k = item._sort_key - i = bisect_left(self._keys, k) - self._keys.insert(i, k) - self._items.insert(i, item) - - def remove(self, item): - idx = self.index(item) - del self._items[idx] - del self._keys[idx] - - -# MODELS - - -class SchemaManager(object): - def __init__(self, model, database=None, **context_options): - self.model = model - self._database = database - context_options.setdefault('scope', SCOPE_VALUES) - self.context_options = context_options - - @property - def database(self): - db = self._database or self.model._meta.database - if db is None: - raise ImproperlyConfigured('database attribute does not appear to ' - 'be set on the model: %s' % self.model) - return db - - @database.setter - def database(self, value): - self._database = value - - def _create_context(self): - return self.database.get_sql_context(**self.context_options) - - def _create_table(self, safe=True, **options): - is_temp = options.pop('temporary', False) - ctx = self._create_context() - ctx.literal('CREATE TEMPORARY TABLE ' if is_temp else 'CREATE TABLE ') - if safe: - ctx.literal('IF NOT EXISTS ') - ctx.sql(self.model).literal(' ') - - columns = [] - constraints = [] - meta = self.model._meta - if meta.composite_key: - pk_columns = [meta.fields[field_name].column - for field_name in meta.primary_key.field_names] - constraints.append(NodeList((SQL('PRIMARY KEY'), - EnclosedNodeList(pk_columns)))) - - for field in meta.sorted_fields: - columns.append(field.ddl(ctx)) - if isinstance(field, ForeignKeyField) and not field.deferred: - constraints.append(field.foreign_key_constraint()) - - if meta.constraints: - constraints.extend(meta.constraints) - - constraints.extend(self._create_table_option_sql(options)) - ctx.sql(EnclosedNodeList(columns + constraints)) - - if meta.table_settings is not None: - table_settings = ensure_tuple(meta.table_settings) - for setting in table_settings: - if not isinstance(setting, basestring): - raise ValueError('table_settings must be strings') - ctx.literal(' ').literal(setting) - - extra_opts = [] - if meta.strict_tables: extra_opts.append('STRICT') - if meta.without_rowid: extra_opts.append('WITHOUT ROWID') - if extra_opts: - ctx.literal(' %s' % ', '.join(extra_opts)) - return ctx - - def _create_table_option_sql(self, options): - accum = [] - options = merge_dict(self.model._meta.options or {}, options) - if not options: - return accum - - for key, value in sorted(options.items()): - if not isinstance(value, Node): - if is_model(value): - value = value._meta.table - else: - value = SQL(str(value)) - accum.append(NodeList((SQL(key), value), glue='=')) - return accum - - def create_table(self, safe=True, **options): - self.database.execute(self._create_table(safe=safe, **options)) - - def _create_table_as(self, table_name, query, safe=True, **meta): - ctx = (self._create_context() - .literal('CREATE TEMPORARY TABLE ' - if meta.get('temporary') else 'CREATE TABLE ')) - if safe: - ctx.literal('IF NOT EXISTS ') - return (ctx - .sql(Entity(*ensure_tuple(table_name))) - .literal(' AS ') - .sql(query)) - - def create_table_as(self, table_name, query, safe=True, **meta): - ctx = self._create_table_as(table_name, query, safe=safe, **meta) - self.database.execute(ctx) - - def _drop_table(self, safe=True, **options): - ctx = (self._create_context() - .literal('DROP TABLE IF EXISTS ' if safe else 'DROP TABLE ') - .sql(self.model)) - if options.get('cascade'): - ctx = ctx.literal(' CASCADE') - elif options.get('restrict'): - ctx = ctx.literal(' RESTRICT') - return ctx - - def drop_table(self, safe=True, **options): - self.database.execute(self._drop_table(safe=safe, **options)) - - def _truncate_table(self, restart_identity=False, cascade=False): - db = self.database - if not db.truncate_table: - return (self._create_context() - .literal('DELETE FROM ').sql(self.model)) - - ctx = self._create_context().literal('TRUNCATE TABLE ').sql(self.model) - if restart_identity: - ctx = ctx.literal(' RESTART IDENTITY') - if cascade: - ctx = ctx.literal(' CASCADE') - return ctx - - def truncate_table(self, restart_identity=False, cascade=False): - self.database.execute(self._truncate_table(restart_identity, cascade)) - - def _create_indexes(self, safe=True): - return [self._create_index(index, safe) - for index in self.model._meta.fields_to_index()] - - def _create_index(self, index, safe=True): - if isinstance(index, Index): - if not self.database.safe_create_index: - index = index.safe(False) - elif index._safe != safe: - index = index.safe(safe) - if isinstance(self._database, SqliteDatabase): - # Ensure we do not use value placeholders with Sqlite, as they - # are not supported. - index = ValueLiterals(index) - return self._create_context().sql(index) - - def create_indexes(self, safe=True): - for query in self._create_indexes(safe=safe): - self.database.execute(query) - - def _drop_indexes(self, safe=True): - return [self._drop_index(index, safe) - for index in self.model._meta.fields_to_index() - if isinstance(index, Index)] - - def _drop_index(self, index, safe): - statement = 'DROP INDEX ' - if safe and self.database.safe_drop_index: - statement += 'IF EXISTS ' - if isinstance(index._table, Table) and index._table._schema: - index_name = Entity(index._table._schema, index._name) - else: - index_name = Entity(index._name) - return (self - ._create_context() - .literal(statement) - .sql(index_name)) - - def drop_indexes(self, safe=True): - for query in self._drop_indexes(safe=safe): - self.database.execute(query) - - def _check_sequences(self, field): - if not field.sequence or not self.database.sequences: - raise ValueError('Sequences are either not supported, or are not ' - 'defined for "%s".' % field.name) - - def _sequence_for_field(self, field): - if field.model._meta.schema: - return Entity(field.model._meta.schema, field.sequence) - else: - return Entity(field.sequence) - - def _create_sequence(self, field): - self._check_sequences(field) - if not self.database.sequence_exists(field.sequence): - return (self - ._create_context() - .literal('CREATE SEQUENCE ') - .sql(self._sequence_for_field(field))) - - def create_sequence(self, field): - seq_ctx = self._create_sequence(field) - if seq_ctx is not None: - self.database.execute(seq_ctx) - - def _drop_sequence(self, field): - self._check_sequences(field) - if self.database.sequence_exists(field.sequence): - return (self - ._create_context() - .literal('DROP SEQUENCE ') - .sql(self._sequence_for_field(field))) - - def drop_sequence(self, field): - seq_ctx = self._drop_sequence(field) - if seq_ctx is not None: - self.database.execute(seq_ctx) - - def _create_foreign_key(self, field): - name = 'fk_%s_%s_refs_%s' % (field.model._meta.table_name, - field.column_name, - field.rel_model._meta.table_name) - return (self - ._create_context() - .literal('ALTER TABLE ') - .sql(field.model) - .literal(' ADD CONSTRAINT ') - .sql(Entity(_truncate_constraint_name(name))) - .literal(' ') - .sql(field.foreign_key_constraint())) - - def create_foreign_key(self, field): - self.database.execute(self._create_foreign_key(field)) - - def create_sequences(self): - if self.database.sequences: - for field in self.model._meta.sorted_fields: - if field.sequence: - self.create_sequence(field) - - def create_all(self, safe=True, **table_options): - self.create_sequences() - self.create_table(safe, **table_options) - self.create_indexes(safe=safe) - - def drop_sequences(self): - if self.database.sequences: - for field in self.model._meta.sorted_fields: - if field.sequence: - self.drop_sequence(field) - - def drop_all(self, safe=True, drop_sequences=True, **options): - self.drop_table(safe, **options) - if drop_sequences: - self.drop_sequences() - - -class Metadata(object): - def __init__(self, model, database=None, table_name=None, indexes=None, - primary_key=None, constraints=None, schema=None, - only_save_dirty=False, depends_on=None, options=None, - db_table=None, table_function=None, table_settings=None, - without_rowid=False, temporary=False, strict_tables=None, - legacy_table_names=True, **kwargs): - if db_table is not None: - __deprecated__('"db_table" has been deprecated in favor of ' - '"table_name" for Models.') - table_name = db_table - self.model = model - self.database = database - - self.fields = {} - self.columns = {} - self.combined = {} - - self._sorted_field_list = _SortedFieldList() - self.sorted_fields = [] - self.sorted_field_names = [] - - self.defaults = {} - self._default_by_name = {} - self._default_dict = {} - self._default_callables = {} - self._default_callable_list = [] - - self.name = model.__name__.lower() - self.table_function = table_function - self.legacy_table_names = legacy_table_names - if not table_name: - table_name = (self.table_function(model) - if self.table_function - else self.make_table_name()) - self.table_name = table_name - self._table = None - - self.indexes = list(indexes) if indexes else [] - self.constraints = constraints - self._schema = schema - self.primary_key = primary_key - self.composite_key = self.auto_increment = None - self.only_save_dirty = only_save_dirty - self.depends_on = depends_on - self.table_settings = table_settings - self.without_rowid = without_rowid - self.strict_tables = strict_tables - self.temporary = temporary - - self.refs = {} - self.backrefs = {} - self.model_refs = collections.defaultdict(list) - self.model_backrefs = collections.defaultdict(list) - self.manytomany = {} - - self.options = options or {} - for key, value in kwargs.items(): - setattr(self, key, value) - self._additional_keys = set(kwargs.keys()) - - # Allow objects to register hooks that are called if the model is bound - # to a different database. For example, BlobField uses a different - # Python data-type depending on the db driver / python version. When - # the database changes, we need to update any BlobField so they can use - # the appropriate data-type. - self._db_hooks = [] - - def make_table_name(self): - if self.legacy_table_names: - return re.sub(r'[^\w]+', '_', self.name) - return make_snake_case(self.model.__name__) - - def model_graph(self, refs=True, backrefs=True, depth_first=True): - if not refs and not backrefs: - raise ValueError('One of `refs` or `backrefs` must be True.') - - accum = [(None, self.model, None)] - seen = set() - queue = collections.deque((self,)) - method = queue.pop if depth_first else queue.popleft - - while queue: - curr = method() - if curr in seen: continue - seen.add(curr) - - if refs: - for fk, model in curr.refs.items(): - accum.append((fk, model, False)) - queue.append(model._meta) - if backrefs: - for fk, model in curr.backrefs.items(): - accum.append((fk, model, True)) - queue.append(model._meta) - - return accum - - def add_ref(self, field): - rel = field.rel_model - self.refs[field] = rel - self.model_refs[rel].append(field) - rel._meta.backrefs[field] = self.model - rel._meta.model_backrefs[self.model].append(field) - - def remove_ref(self, field): - rel = field.rel_model - del self.refs[field] - self.model_refs[rel].remove(field) - del rel._meta.backrefs[field] - rel._meta.model_backrefs[self.model].remove(field) - - def add_manytomany(self, field): - self.manytomany[field.name] = field - - def remove_manytomany(self, field): - del self.manytomany[field.name] - - @property - def table(self): - if self._table is None: - self._table = Table( - self.table_name, - [field.column_name for field in self.sorted_fields], - schema=self.schema, - _model=self.model, - _database=self.database) - return self._table - - @table.setter - def table(self, value): - raise AttributeError('Cannot set the "table".') - - @table.deleter - def table(self): - self._table = None - - @property - def schema(self): - return self._schema - - @schema.setter - def schema(self, value): - self._schema = value - del self.table - - @property - def entity(self): - if self._schema: - return Entity(self._schema, self.table_name) - else: - return Entity(self.table_name) - - def _update_sorted_fields(self): - self.sorted_fields = list(self._sorted_field_list) - self.sorted_field_names = [f.name for f in self.sorted_fields] - - def get_rel_for_model(self, model): - if isinstance(model, ModelAlias): - model = model.model - forwardrefs = self.model_refs.get(model, []) - backrefs = self.model_backrefs.get(model, []) - return (forwardrefs, backrefs) - - def add_field(self, field_name, field, set_attribute=True): - if field_name in self.fields: - self.remove_field(field_name) - elif field_name in self.manytomany: - self.remove_manytomany(self.manytomany[field_name]) - - if not isinstance(field, MetaField): - del self.table - field.bind(self.model, field_name, set_attribute) - self.fields[field.name] = field - self.columns[field.column_name] = field - self.combined[field.name] = field - self.combined[field.column_name] = field - - self._sorted_field_list.insert(field) - self._update_sorted_fields() - - if field.default is not None: - # This optimization helps speed up model instance construction. - self.defaults[field] = field.default - if callable_(field.default): - self._default_callables[field] = field.default - self._default_callable_list.append((field.name, - field.default)) - else: - self._default_dict[field] = field.default - self._default_by_name[field.name] = field.default - else: - field.bind(self.model, field_name, set_attribute) - - if isinstance(field, ForeignKeyField): - self.add_ref(field) - elif isinstance(field, ManyToManyField) and field.name: - self.add_manytomany(field) - - def remove_field(self, field_name): - if field_name not in self.fields: - return - - del self.table - original = self.fields.pop(field_name) - del self.columns[original.column_name] - del self.combined[field_name] - try: - del self.combined[original.column_name] - except KeyError: - pass - self._sorted_field_list.remove(original) - self._update_sorted_fields() - - if original.default is not None: - del self.defaults[original] - if self._default_callables.pop(original, None): - for i, (name, _) in enumerate(self._default_callable_list): - if name == field_name: - self._default_callable_list.pop(i) - break - else: - self._default_dict.pop(original, None) - self._default_by_name.pop(original.name, None) - - if isinstance(original, ForeignKeyField): - self.remove_ref(original) - - def set_primary_key(self, name, field): - self.composite_key = isinstance(field, CompositeKey) - self.add_field(name, field) - self.primary_key = field - self.auto_increment = ( - field.auto_increment or - bool(field.sequence)) - - def get_primary_keys(self): - if self.composite_key: - return tuple([self.fields[field_name] - for field_name in self.primary_key.field_names]) - else: - return (self.primary_key,) if self.primary_key is not False else () - - def get_default_dict(self): - dd = self._default_by_name.copy() - for field_name, default in self._default_callable_list: - dd[field_name] = default() - return dd - - def fields_to_index(self): - indexes = [] - for f in self.sorted_fields: - if f.primary_key: - continue - if f.index or f.unique: - indexes.append(ModelIndex(self.model, (f,), unique=f.unique, - using=f.index_type)) - - for index_obj in self.indexes: - if isinstance(index_obj, Node): - indexes.append(index_obj) - elif isinstance(index_obj, (list, tuple)): - index_parts, unique = index_obj - fields = [] - for part in index_parts: - if isinstance(part, basestring): - fields.append(self.combined[part]) - elif isinstance(part, Node): - fields.append(part) - else: - raise ValueError('Expected either a field name or a ' - 'subclass of Node. Got: %s' % part) - indexes.append(ModelIndex(self.model, fields, unique=unique)) - - return indexes - - def set_database(self, database): - self.database = database - self.model._schema._database = database - del self.table - - # Apply any hooks that have been registered. If we have an - # uninitialized proxy object, we will treat that as `None`. - if isinstance(database, Proxy) and database.obj is None: - database = None - - for hook in self._db_hooks: - hook(database) - - def set_table_name(self, table_name): - self.table_name = table_name - del self.table - - -class SubclassAwareMetadata(Metadata): - models = [] - - def __init__(self, model, *args, **kwargs): - super(SubclassAwareMetadata, self).__init__(model, *args, **kwargs) - self.models.append(model) - - def map_models(self, fn): - for model in self.models: - fn(model) - - -class DoesNotExist(Exception): pass - - -class ModelBase(type): - inheritable = set(['constraints', 'database', 'indexes', 'primary_key', - 'options', 'schema', 'table_function', 'temporary', - 'only_save_dirty', 'legacy_table_names', - 'table_settings', 'strict_tables']) - - def __new__(cls, name, bases, attrs): - if name == MODEL_BASE or bases[0].__name__ == MODEL_BASE: - return super(ModelBase, cls).__new__(cls, name, bases, attrs) - - meta_options = {} - meta = attrs.pop('Meta', None) - if meta: - for k, v in meta.__dict__.items(): - if not k.startswith('_'): - meta_options[k] = v - - pk = getattr(meta, 'primary_key', None) - pk_name = parent_pk = None - - # Inherit any field descriptors by deep copying the underlying field - # into the attrs of the new model, additionally see if the bases define - # inheritable model options and swipe them. - for b in bases: - if not hasattr(b, '_meta'): - continue - - base_meta = b._meta - if parent_pk is None: - parent_pk = deepcopy(base_meta.primary_key) - all_inheritable = cls.inheritable | base_meta._additional_keys - for k in base_meta.__dict__: - if k in all_inheritable and k not in meta_options: - meta_options[k] = base_meta.__dict__[k] - meta_options.setdefault('database', base_meta.database) - meta_options.setdefault('schema', base_meta.schema) - - for (k, v) in b.__dict__.items(): - if k in attrs: continue - - if isinstance(v, FieldAccessor) and not v.field.primary_key: - attrs[k] = deepcopy(v.field) - - sopts = meta_options.pop('schema_options', None) or {} - Meta = meta_options.get('model_metadata_class', Metadata) - Schema = meta_options.get('schema_manager_class', SchemaManager) - - # Construct the new class. - cls = super(ModelBase, cls).__new__(cls, name, bases, attrs) - cls.__data__ = cls.__rel__ = None - - cls._meta = Meta(cls, **meta_options) - cls._schema = Schema(cls, **sopts) - - fields = [] - for key, value in cls.__dict__.items(): - if isinstance(value, Field): - if value.primary_key and pk: - raise ValueError('over-determined primary key %s.' % name) - elif value.primary_key: - pk, pk_name = value, key - else: - fields.append((key, value)) - - if pk is None: - if parent_pk is not False: - pk, pk_name = ((parent_pk, parent_pk.name) - if parent_pk is not None else - (AutoField(), 'id')) - else: - pk = False - elif isinstance(pk, CompositeKey): - pk_name = '__composite_key__' - cls._meta.composite_key = True - - if pk is not False: - cls._meta.set_primary_key(pk_name, pk) - - for name, field in fields: - cls._meta.add_field(name, field) - - # Create a repr and error class before finalizing. - if hasattr(cls, '__str__') and '__repr__' not in attrs: - setattr(cls, '__repr__', lambda self: '<%s: %s>' % ( - cls.__name__, self.__str__())) - - exc_name = '%sDoesNotExist' % cls.__name__ - exc_attrs = {'__module__': cls.__module__} - exception_class = type(exc_name, (DoesNotExist,), exc_attrs) - cls.DoesNotExist = exception_class - - # Call validation hook, allowing additional model validation. - cls.validate_model() - DeferredForeignKey.resolve(cls) - return cls - - def __repr__(self): - return '' % self.__name__ - - def __iter__(self): - return iter(self.select()) - - def __getitem__(self, key): - return self.get_by_id(key) - - def __setitem__(self, key, value): - self.set_by_id(key, value) - - def __delitem__(self, key): - self.delete_by_id(key) - - def __contains__(self, key): - try: - self.get_by_id(key) - except self.DoesNotExist: - return False - else: - return True - - def __len__(self): - return self.select().count() - def __bool__(self): return True - __nonzero__ = __bool__ # Python 2. - - def __sql__(self, ctx): - return ctx.sql(self._meta.table) - - -class _BoundModelsContext(_callable_context_manager): - def __init__(self, models, database, bind_refs, bind_backrefs): - self.models = models - self.database = database - self.bind_refs = bind_refs - self.bind_backrefs = bind_backrefs - - def __enter__(self): - self._orig_database = [] - for model in self.models: - self._orig_database.append(model._meta.database) - model.bind(self.database, self.bind_refs, self.bind_backrefs, - _exclude=set(self.models)) - return self.models - - def __exit__(self, exc_type, exc_val, exc_tb): - for model, db in zip(self.models, self._orig_database): - model.bind(db, self.bind_refs, self.bind_backrefs, - _exclude=set(self.models)) - - -class Model(with_metaclass(ModelBase, Node)): - def __init__(self, *args, **kwargs): - if kwargs.pop('__no_default__', None): - self.__data__ = {} - else: - self.__data__ = self._meta.get_default_dict() - self._dirty = set(self.__data__) - self.__rel__ = {} - - for k in kwargs: - setattr(self, k, kwargs[k]) - - def __str__(self): - return str(self._pk) if self._meta.primary_key is not False else 'n/a' - - @classmethod - def validate_model(cls): - pass - - @classmethod - def alias(cls, alias=None): - return ModelAlias(cls, alias) - - @classmethod - def select(cls, *fields): - is_default = not fields - if not fields: - fields = cls._meta.sorted_fields - return ModelSelect(cls, fields, is_default=is_default) - - @classmethod - def _normalize_data(cls, data, kwargs): - normalized = {} - if data: - if not isinstance(data, dict): - if kwargs: - raise ValueError('Data cannot be mixed with keyword ' - 'arguments: %s' % data) - return data - for key in data: - try: - field = (key if isinstance(key, Field) - else cls._meta.combined[key]) - except KeyError: - if not isinstance(key, Node): - raise ValueError('Unrecognized field name: "%s" in %s.' - % (key, data)) - field = key - normalized[field] = data[key] - if kwargs: - for key in kwargs: - try: - normalized[cls._meta.combined[key]] = kwargs[key] - except KeyError: - normalized[getattr(cls, key)] = kwargs[key] - return normalized - - @classmethod - def update(cls, __data=None, **update): - return ModelUpdate(cls, cls._normalize_data(__data, update)) - - @classmethod - def insert(cls, __data=None, **insert): - return ModelInsert(cls, cls._normalize_data(__data, insert)) - - @classmethod - def insert_many(cls, rows, fields=None): - return ModelInsert(cls, insert=rows, columns=fields) - - @classmethod - def insert_from(cls, query, fields): - columns = [getattr(cls, field) if isinstance(field, basestring) - else field for field in fields] - return ModelInsert(cls, insert=query, columns=columns) - - @classmethod - def replace(cls, __data=None, **insert): - return cls.insert(__data, **insert).on_conflict('REPLACE') - - @classmethod - def replace_many(cls, rows, fields=None): - return (cls - .insert_many(rows=rows, fields=fields) - .on_conflict('REPLACE')) - - @classmethod - def raw(cls, sql, *params): - return ModelRaw(cls, sql, params) - - @classmethod - def delete(cls): - return ModelDelete(cls) - - @classmethod - def create(cls, **query): - inst = cls(**query) - inst.save(force_insert=True) - return inst - - @classmethod - def bulk_create(cls, model_list, batch_size=None): - if batch_size is not None: - batches = chunked(model_list, batch_size) - else: - batches = [model_list] - - field_names = list(cls._meta.sorted_field_names) - if cls._meta.auto_increment: - pk_name = cls._meta.primary_key.name - field_names.remove(pk_name) - - if cls._meta.database.returning_clause and \ - cls._meta.primary_key is not False: - pk_fields = cls._meta.get_primary_keys() - else: - pk_fields = None - - fields = [cls._meta.fields[field_name] for field_name in field_names] - attrs = [] - for field in fields: - if isinstance(field, ForeignKeyField): - attrs.append(field.object_id_name) - else: - attrs.append(field.name) - - for batch in batches: - accum = ([getattr(model, f) for f in attrs] - for model in batch) - res = cls.insert_many(accum, fields=fields).execute() - if pk_fields and res is not None: - for row, model in zip(res, batch): - for (pk_field, obj_id) in zip(pk_fields, row): - setattr(model, pk_field.name, obj_id) - - @classmethod - def bulk_update(cls, model_list, fields, batch_size=None): - if isinstance(cls._meta.primary_key, CompositeKey): - raise ValueError('bulk_update() is not supported for models with ' - 'a composite primary key.') - - # First normalize list of fields so all are field instances. - fields = [cls._meta.fields[f] if isinstance(f, basestring) else f - for f in fields] - # Now collect list of attribute names to use for values. - attrs = [field.object_id_name if isinstance(field, ForeignKeyField) - else field.name for field in fields] - - if batch_size is not None: - batches = chunked(model_list, batch_size) - else: - batches = [model_list] - - n = 0 - pk = cls._meta.primary_key - - for batch in batches: - id_list = [model._pk for model in batch] - update = {} - for field, attr in zip(fields, attrs): - accum = [] - for model in batch: - value = getattr(model, attr) - if not isinstance(value, Node): - value = field.to_value(value) - accum.append((pk.to_value(model._pk), value)) - case = Case(pk, accum) - update[field] = case - - n += (cls.update(update) - .where(cls._meta.primary_key.in_(id_list)) - .execute()) - return n - - @classmethod - def noop(cls): - return NoopModelSelect(cls, ()) - - @classmethod - def get(cls, *query, **filters): - sq = cls.select() - if query: - # Handle simple lookup using just the primary key. - if len(query) == 1 and isinstance(query[0], int): - sq = sq.where(cls._meta.primary_key == query[0]) - else: - sq = sq.where(*query) - if filters: - sq = sq.filter(**filters) - return sq.get() - - @classmethod - def get_or_none(cls, *query, **filters): - try: - return cls.get(*query, **filters) - except DoesNotExist: - pass - - @classmethod - def get_by_id(cls, pk): - return cls.get(cls._meta.primary_key == pk) - - @classmethod - def set_by_id(cls, key, value): - if key is None: - return cls.insert(value).execute() - else: - return (cls.update(value) - .where(cls._meta.primary_key == key).execute()) - - @classmethod - def delete_by_id(cls, pk): - return cls.delete().where(cls._meta.primary_key == pk).execute() - - @classmethod - def get_or_create(cls, **kwargs): - defaults = kwargs.pop('defaults', {}) - query = cls.select() - for field, value in kwargs.items(): - query = query.where(getattr(cls, field) == value) - - try: - return query.get(), False - except cls.DoesNotExist: - try: - if defaults: - kwargs.update(defaults) - with cls._meta.database.atomic(): - return cls.create(**kwargs), True - except IntegrityError as exc: - try: - return query.get(), False - except cls.DoesNotExist: - raise exc - - @classmethod - def filter(cls, *dq_nodes, **filters): - return cls.select().filter(*dq_nodes, **filters) - - def get_id(self): - # Using getattr(self, pk-name) could accidentally trigger a query if - # the primary-key is a foreign-key. So we use the safe_name attribute, - # which defaults to the field-name, but will be the object_id_name for - # foreign-key fields. - if self._meta.primary_key is not False: - return getattr(self, self._meta.primary_key.safe_name) - - _pk = property(get_id) - - @_pk.setter - def _pk(self, value): - setattr(self, self._meta.primary_key.name, value) - - def _pk_expr(self): - return self._meta.primary_key == self._pk - - def _prune_fields(self, field_dict, only): - new_data = {} - for field in only: - if isinstance(field, basestring): - field = self._meta.combined[field] - if field.name in field_dict: - new_data[field.name] = field_dict[field.name] - return new_data - - def _populate_unsaved_relations(self, field_dict): - for foreign_key_field in self._meta.refs: - foreign_key = foreign_key_field.name - conditions = ( - foreign_key in field_dict and - field_dict[foreign_key] is None and - self.__rel__.get(foreign_key) is not None) - if conditions: - setattr(self, foreign_key, getattr(self, foreign_key)) - field_dict[foreign_key] = self.__data__[foreign_key] - - def save(self, force_insert=False, only=None): - field_dict = self.__data__.copy() - if self._meta.primary_key is not False: - pk_field = self._meta.primary_key - pk_value = self._pk - else: - pk_field = pk_value = None - if only is not None: - field_dict = self._prune_fields(field_dict, only) - elif self._meta.only_save_dirty and not force_insert: - field_dict = self._prune_fields(field_dict, self.dirty_fields) - if not field_dict: - self._dirty.clear() - return False - - self._populate_unsaved_relations(field_dict) - rows = 1 - - if self._meta.auto_increment and pk_value is None: - field_dict.pop(pk_field.name, None) - - if pk_value is not None and not force_insert: - if self._meta.composite_key: - for pk_part_name in pk_field.field_names: - field_dict.pop(pk_part_name, None) - else: - field_dict.pop(pk_field.name, None) - if not field_dict: - raise ValueError('no data to save!') - rows = self.update(**field_dict).where(self._pk_expr()).execute() - elif pk_field is not None: - pk = self.insert(**field_dict).execute() - if pk is not None and (self._meta.auto_increment or - pk_value is None): - self._pk = pk - # Although we set the primary-key, do not mark it as dirty. - self._dirty.discard(pk_field.name) - else: - self.insert(**field_dict).execute() - - self._dirty -= set(field_dict) # Remove any fields we saved. - return rows - - def is_dirty(self): - return bool(self._dirty) - - @property - def dirty_fields(self): - return [f for f in self._meta.sorted_fields if f.name in self._dirty] - - def dependencies(self, search_nullable=False): - model_class = type(self) - stack = [(type(self), None)] - seen = set() - - while stack: - klass, query = stack.pop() - if klass in seen: - continue - seen.add(klass) - for fk, rel_model in klass._meta.backrefs.items(): - if rel_model is model_class or query is None: - node = (fk == self.__data__[fk.rel_field.name]) - else: - node = fk << query - subquery = (rel_model.select(rel_model._meta.primary_key) - .where(node)) - if not fk.null or search_nullable: - stack.append((rel_model, subquery)) - yield (node, fk) - - def delete_instance(self, recursive=False, delete_nullable=False): - if recursive: - dependencies = self.dependencies(delete_nullable) - for query, fk in reversed(list(dependencies)): - model = fk.model - if fk.null and not delete_nullable: - model.update(**{fk.name: None}).where(query).execute() - else: - model.delete().where(query).execute() - return type(self).delete().where(self._pk_expr()).execute() - - def __hash__(self): - return hash((self.__class__, self._pk)) - - def __eq__(self, other): - return ( - other.__class__ == self.__class__ and - self._pk is not None and - self._pk == other._pk) - - def __ne__(self, other): - return not self == other - - def __sql__(self, ctx): - # NOTE: when comparing a foreign-key field whose related-field is not a - # primary-key, then doing an equality test for the foreign-key with a - # model instance will return the wrong value; since we would return - # the primary key for a given model instance. - # - # This checks to see if we have a converter in the scope, and that we - # are converting a foreign-key expression. If so, we hand the model - # instance to the converter rather than blindly grabbing the primary- - # key. In the event the provided converter fails to handle the model - # instance, then we will return the primary-key. - if ctx.state.converter is not None and ctx.state.is_fk_expr: - try: - return ctx.sql(Value(self, converter=ctx.state.converter)) - except (TypeError, ValueError): - pass - - return ctx.sql(Value(getattr(self, self._meta.primary_key.name), - converter=self._meta.primary_key.db_value)) - - @classmethod - def bind(cls, database, bind_refs=True, bind_backrefs=True, _exclude=None): - is_different = cls._meta.database is not database - cls._meta.set_database(database) - if bind_refs or bind_backrefs: - if _exclude is None: - _exclude = set() - G = cls._meta.model_graph(refs=bind_refs, backrefs=bind_backrefs) - for _, model, is_backref in G: - if model not in _exclude: - model._meta.set_database(database) - _exclude.add(model) - return is_different - - @classmethod - def bind_ctx(cls, database, bind_refs=True, bind_backrefs=True): - return _BoundModelsContext((cls,), database, bind_refs, bind_backrefs) - - @classmethod - def table_exists(cls): - M = cls._meta - return cls._schema.database.table_exists(M.table.__name__, M.schema) - - @classmethod - def create_table(cls, safe=True, **options): - if 'fail_silently' in options: - __deprecated__('"fail_silently" has been deprecated in favor of ' - '"safe" for the create_table() method.') - safe = options.pop('fail_silently') - - if safe and not cls._schema.database.safe_create_index \ - and cls.table_exists(): - return - if cls._meta.temporary: - options.setdefault('temporary', cls._meta.temporary) - cls._schema.create_all(safe, **options) - - @classmethod - def drop_table(cls, safe=True, drop_sequences=True, **options): - if safe and not cls._schema.database.safe_drop_index \ - and not cls.table_exists(): - return - if cls._meta.temporary: - options.setdefault('temporary', cls._meta.temporary) - cls._schema.drop_all(safe, drop_sequences, **options) - - @classmethod - def truncate_table(cls, **options): - cls._schema.truncate_table(**options) - - @classmethod - def index(cls, *fields, **kwargs): - return ModelIndex(cls, fields, **kwargs) - - @classmethod - def add_index(cls, *fields, **kwargs): - if len(fields) == 1 and isinstance(fields[0], (SQL, Index)): - cls._meta.indexes.append(fields[0]) - else: - cls._meta.indexes.append(ModelIndex(cls, fields, **kwargs)) - - -class ModelAlias(Node): - """Provide a separate reference to a model in a query.""" - def __init__(self, model, alias=None): - self.__dict__['model'] = model - self.__dict__['alias'] = alias - - def __getattr__(self, attr): - # Hack to work-around the fact that properties or other objects - # implementing the descriptor protocol (on the model being aliased), - # will not work correctly when we use getattr(). So we explicitly pass - # the model alias to the descriptor's getter. - try: - obj = self.model.__dict__[attr] - except KeyError: - pass - else: - if isinstance(obj, ModelDescriptor): - return obj.__get__(None, self) - - model_attr = getattr(self.model, attr) - if isinstance(model_attr, Field): - self.__dict__[attr] = FieldAlias.create(self, model_attr) - return self.__dict__[attr] - return model_attr - - def __setattr__(self, attr, value): - raise AttributeError('Cannot set attributes on model aliases.') - - def get_field_aliases(self): - return [getattr(self, n) for n in self.model._meta.sorted_field_names] - - def select(self, *selection): - if not selection: - selection = self.get_field_aliases() - return ModelSelect(self, selection) - - def __call__(self, **kwargs): - return self.model(**kwargs) - - def __sql__(self, ctx): - if ctx.scope == SCOPE_VALUES: - # Return the quoted table name. - return ctx.sql(self.model) - - if self.alias: - ctx.alias_manager[self] = self.alias - - if ctx.scope == SCOPE_SOURCE: - # Define the table and its alias. - return (ctx - .sql(self.model._meta.entity) - .literal(' AS ') - .sql(Entity(ctx.alias_manager[self]))) - else: - # Refer to the table using the alias. - return ctx.sql(Entity(ctx.alias_manager[self])) - - -class FieldAlias(Field): - def __init__(self, source, field): - self.source = source - self.model = source.model - self.field = field - - @classmethod - def create(cls, source, field): - class _FieldAlias(cls, type(field)): - pass - return _FieldAlias(source, field) - - def clone(self): - return FieldAlias(self.source, self.field) - - def adapt(self, value): return self.field.adapt(value) - def python_value(self, value): return self.field.python_value(value) - def db_value(self, value): return self.field.db_value(value) - def __getattr__(self, attr): - return self.source if attr == 'model' else getattr(self.field, attr) - - def __sql__(self, ctx): - return ctx.sql(Column(self.source, self.field.column_name)) - - -def sort_models(models): - models = set(models) - seen = set() - ordering = [] - def dfs(model): - if model in models and model not in seen: - seen.add(model) - for foreign_key, rel_model in model._meta.refs.items(): - # Do not depth-first search deferred foreign-keys as this can - # cause tables to be created in the incorrect order. - if not foreign_key.deferred: - dfs(rel_model) - if model._meta.depends_on: - for dependency in model._meta.depends_on: - dfs(dependency) - ordering.append(model) - - names = lambda m: (m._meta.name, m._meta.table_name) - for m in sorted(models, key=names): - dfs(m) - return ordering - - -class _ModelQueryHelper(object): - default_row_type = ROW.MODEL - - def __init__(self, *args, **kwargs): - super(_ModelQueryHelper, self).__init__(*args, **kwargs) - if not self._database: - self._database = self.model._meta.database - - @Node.copy - def objects(self, constructor=None): - self._row_type = ROW.CONSTRUCTOR - self._constructor = self.model if constructor is None else constructor - - def _get_cursor_wrapper(self, cursor): - row_type = self._row_type or self.default_row_type - if row_type == ROW.MODEL: - return self._get_model_cursor_wrapper(cursor) - elif row_type == ROW.DICT: - return ModelDictCursorWrapper(cursor, self.model, self._returning) - elif row_type == ROW.TUPLE: - return ModelTupleCursorWrapper(cursor, self.model, self._returning) - elif row_type == ROW.NAMED_TUPLE: - return ModelNamedTupleCursorWrapper(cursor, self.model, - self._returning) - elif row_type == ROW.CONSTRUCTOR: - return ModelObjectCursorWrapper(cursor, self.model, - self._returning, self._constructor) - else: - raise ValueError('Unrecognized row type: "%s".' % row_type) - - def _get_model_cursor_wrapper(self, cursor): - return ModelObjectCursorWrapper(cursor, self.model, [], self.model) - - -class ModelRaw(_ModelQueryHelper, RawQuery): - def __init__(self, model, sql, params, **kwargs): - self.model = model - self._returning = () - super(ModelRaw, self).__init__(sql=sql, params=params, **kwargs) - - def get(self): - try: - return self.execute()[0] - except IndexError: - sql, params = self.sql() - raise self.model.DoesNotExist('%s instance matching query does ' - 'not exist:\nSQL: %s\nParams: %s' % - (self.model, sql, params)) - - -class BaseModelSelect(_ModelQueryHelper): - def union_all(self, rhs): - return ModelCompoundSelectQuery(self.model, self, 'UNION ALL', rhs) - __add__ = union_all - - def union(self, rhs): - return ModelCompoundSelectQuery(self.model, self, 'UNION', rhs) - __or__ = union - - def intersect(self, rhs): - return ModelCompoundSelectQuery(self.model, self, 'INTERSECT', rhs) - __and__ = intersect - - def except_(self, rhs): - return ModelCompoundSelectQuery(self.model, self, 'EXCEPT', rhs) - __sub__ = except_ - - def __iter__(self): - if not self._cursor_wrapper: - self.execute() - return iter(self._cursor_wrapper) - - def prefetch(self, *subqueries): - return prefetch(self, *subqueries) - - def get(self, database=None): - clone = self.paginate(1, 1) - clone._cursor_wrapper = None - try: - return clone.execute(database)[0] - except IndexError: - sql, params = clone.sql() - raise self.model.DoesNotExist('%s instance matching query does ' - 'not exist:\nSQL: %s\nParams: %s' % - (clone.model, sql, params)) - - def get_or_none(self, database=None): - try: - return self.get(database=database) - except self.model.DoesNotExist: - pass - - @Node.copy - def group_by(self, *columns): - grouping = [] - for column in columns: - if is_model(column): - grouping.extend(column._meta.sorted_fields) - elif isinstance(column, Table): - if not column._columns: - raise ValueError('Cannot pass a table to group_by() that ' - 'does not have columns explicitly ' - 'declared.') - grouping.extend([getattr(column, col_name) - for col_name in column._columns]) - else: - grouping.append(column) - self._group_by = grouping - - -class ModelCompoundSelectQuery(BaseModelSelect, CompoundSelectQuery): - def __init__(self, model, *args, **kwargs): - self.model = model - super(ModelCompoundSelectQuery, self).__init__(*args, **kwargs) - - def _get_model_cursor_wrapper(self, cursor): - return self.lhs._get_model_cursor_wrapper(cursor) - - -def _normalize_model_select(fields_or_models): - fields = [] - for fm in fields_or_models: - if is_model(fm): - fields.extend(fm._meta.sorted_fields) - elif isinstance(fm, ModelAlias): - fields.extend(fm.get_field_aliases()) - elif isinstance(fm, Table) and fm._columns: - fields.extend([getattr(fm, col) for col in fm._columns]) - else: - fields.append(fm) - return fields - - -class ModelSelect(BaseModelSelect, Select): - def __init__(self, model, fields_or_models, is_default=False): - self.model = self._join_ctx = model - self._joins = {} - self._is_default = is_default - fields = _normalize_model_select(fields_or_models) - super(ModelSelect, self).__init__([model], fields) - - def clone(self): - clone = super(ModelSelect, self).clone() - if clone._joins: - clone._joins = dict(clone._joins) - return clone - - def select(self, *fields_or_models): - if fields_or_models or not self._is_default: - self._is_default = False - fields = _normalize_model_select(fields_or_models) - return super(ModelSelect, self).select(*fields) - return self - - def switch(self, ctx=None): - self._join_ctx = self.model if ctx is None else ctx - return self - - def _get_model(self, src): - if is_model(src): - return src, True - elif isinstance(src, Table) and src._model: - return src._model, False - elif isinstance(src, ModelAlias): - return src.model, False - elif isinstance(src, ModelSelect): - return src.model, False - return None, False - - def _normalize_join(self, src, dest, on, attr): - # Allow "on" expression to have an alias that determines the - # destination attribute for the joined data. - on_alias = isinstance(on, Alias) - if on_alias: - attr = attr or on._alias - on = on.alias() - - # Obtain references to the source and destination models being joined. - src_model, src_is_model = self._get_model(src) - dest_model, dest_is_model = self._get_model(dest) - - if src_model and dest_model: - self._join_ctx = dest - constructor = dest_model - - # In the case where the "on" clause is a Column or Field, we will - # convert that field into the appropriate predicate expression. - if not (src_is_model and dest_is_model) and isinstance(on, Column): - if on.source is src: - to_field = src_model._meta.columns[on.name] - elif on.source is dest: - to_field = dest_model._meta.columns[on.name] - else: - raise AttributeError('"on" clause Column %s does not ' - 'belong to %s or %s.' % - (on, src_model, dest_model)) - on = None - elif isinstance(on, Field): - to_field = on - on = None - else: - to_field = None - - fk_field, is_backref = self._generate_on_clause( - src_model, dest_model, to_field, on) - - if on is None: - src_attr = 'name' if src_is_model else 'column_name' - dest_attr = 'name' if dest_is_model else 'column_name' - if is_backref: - lhs = getattr(dest, getattr(fk_field, dest_attr)) - rhs = getattr(src, getattr(fk_field.rel_field, src_attr)) - else: - lhs = getattr(src, getattr(fk_field, src_attr)) - rhs = getattr(dest, getattr(fk_field.rel_field, dest_attr)) - on = (lhs == rhs) - - if not attr: - if fk_field is not None and not is_backref: - attr = fk_field.name - else: - attr = dest_model._meta.name - elif on_alias and fk_field is not None and \ - attr == fk_field.object_id_name and not is_backref: - raise ValueError('Cannot assign join alias to "%s", as this ' - 'attribute is the object_id_name for the ' - 'foreign-key field "%s"' % (attr, fk_field)) - - elif isinstance(dest, Source): - constructor = dict - attr = attr or dest._alias - if not attr and isinstance(dest, Table): - attr = attr or dest.__name__ - - return (on, attr, constructor) - - def _generate_on_clause(self, src, dest, to_field=None, on=None): - meta = src._meta - is_backref = fk_fields = False - - # Get all the foreign keys between source and dest, and determine if - # the join is via a back-reference. - if dest in meta.model_refs: - fk_fields = meta.model_refs[dest] - elif dest in meta.model_backrefs: - fk_fields = meta.model_backrefs[dest] - is_backref = True - - if not fk_fields: - if on is not None: - return None, False - raise ValueError('Unable to find foreign key between %s and %s. ' - 'Please specify an explicit join condition.' % - (src, dest)) - elif to_field is not None: - # If the foreign-key field was specified explicitly, remove all - # other foreign-key fields from the list. - target = (to_field.field if isinstance(to_field, FieldAlias) - else to_field) - fk_fields = [f for f in fk_fields if ( - (f is target) or - (is_backref and f.rel_field is to_field))] - - if len(fk_fields) == 1: - return fk_fields[0], is_backref - - if on is None: - # If multiple foreign-keys exist, try using the FK whose name - # matches that of the related model. If not, raise an error as this - # is ambiguous. - for fk in fk_fields: - if fk.name == dest._meta.name: - return fk, is_backref - - raise ValueError('More than one foreign key between %s and %s.' - ' Please specify which you are joining on.' % - (src, dest)) - - # If there are multiple foreign-keys to choose from and the join - # predicate is an expression, we'll try to figure out which - # foreign-key field we're joining on so that we can assign to the - # correct attribute when resolving the model graph. - to_field = None - if isinstance(on, Expression): - lhs, rhs = on.lhs, on.rhs - # Coerce to set() so that we force Python to compare using the - # object's hash rather than equality test, which returns a - # false-positive due to overriding __eq__. - fk_set = set(fk_fields) - - if isinstance(lhs, Field): - lhs_f = lhs.field if isinstance(lhs, FieldAlias) else lhs - if lhs_f in fk_set: - to_field = lhs_f - elif isinstance(rhs, Field): - rhs_f = rhs.field if isinstance(rhs, FieldAlias) else rhs - if rhs_f in fk_set: - to_field = rhs_f - - return to_field, False - - @Node.copy - def join(self, dest, join_type=JOIN.INNER, on=None, src=None, attr=None): - src = self._join_ctx if src is None else src - - if join_type == JOIN.LATERAL or join_type == JOIN.LEFT_LATERAL: - on = True - elif join_type != JOIN.CROSS: - on, attr, constructor = self._normalize_join(src, dest, on, attr) - if attr: - self._joins.setdefault(src, []) - self._joins[src].append((dest, attr, constructor, join_type)) - elif on is not None: - raise ValueError('Cannot specify on clause with cross join.') - - if not self._from_list: - raise ValueError('No sources to join on.') - - item = self._from_list.pop() - self._from_list.append(Join(item, dest, join_type, on)) - - def left_outer_join(self, dest, on=None, src=None, attr=None): - return self.join(dest, JOIN.LEFT_OUTER, on, src, attr) - - def join_from(self, src, dest, join_type=JOIN.INNER, on=None, attr=None): - return self.join(dest, join_type, on, src, attr) - - def _get_model_cursor_wrapper(self, cursor): - if len(self._from_list) == 1 and not self._joins: - return ModelObjectCursorWrapper(cursor, self.model, - self._returning, self.model) - return ModelCursorWrapper(cursor, self.model, self._returning, - self._from_list, self._joins) - - def ensure_join(self, lm, rm, on=None, **join_kwargs): - join_ctx = self._join_ctx - for dest, _, constructor, _ in self._joins.get(lm, []): - if dest == rm: - return self - return self.switch(lm).join(rm, on=on, **join_kwargs).switch(join_ctx) - - def convert_dict_to_node(self, qdict): - accum = [] - joins = [] - fks = (ForeignKeyField, BackrefAccessor) - for key, value in sorted(qdict.items()): - curr = self.model - if '__' in key and key.rsplit('__', 1)[1] in DJANGO_MAP: - key, op = key.rsplit('__', 1) - op = DJANGO_MAP[op] - elif value is None: - op = DJANGO_MAP['is'] - else: - op = DJANGO_MAP['eq'] - - if '__' not in key: - # Handle simplest case. This avoids joining over-eagerly when a - # direct FK lookup is all that is required. - model_attr = getattr(curr, key) - else: - for piece in key.split('__'): - for dest, attr, _, _ in self._joins.get(curr, ()): - if attr == piece or (isinstance(dest, ModelAlias) and - dest.alias == piece): - curr = dest - break - else: - model_attr = getattr(curr, piece) - if value is not None and isinstance(model_attr, fks): - curr = model_attr.rel_model - joins.append(model_attr) - accum.append(op(model_attr, value)) - return accum, joins - - def filter(self, *args, **kwargs): - # normalize args and kwargs into a new expression - if args and kwargs: - dq_node = (reduce(operator.and_, [a.clone() for a in args]) & - DQ(**kwargs)) - elif args: - dq_node = (reduce(operator.and_, [a.clone() for a in args]) & - ColumnBase()) - elif kwargs: - dq_node = DQ(**kwargs) & ColumnBase() - else: - return self.clone() - - # dq_node should now be an Expression, lhs = Node(), rhs = ... - q = collections.deque([dq_node]) - dq_joins = [] - seen_joins = set() - while q: - curr = q.popleft() - if not isinstance(curr, Expression): - continue - for side, piece in (('lhs', curr.lhs), ('rhs', curr.rhs)): - if isinstance(piece, DQ): - query, joins = self.convert_dict_to_node(piece.query) - for join in joins: - if join not in seen_joins: - dq_joins.append(join) - seen_joins.add(join) - expression = reduce(operator.and_, query) - # Apply values from the DQ object. - if piece._negated: - expression = Negated(expression) - #expression._alias = piece._alias - setattr(curr, side, expression) - else: - q.append(piece) - - if not args or not kwargs: - dq_node = dq_node.lhs - - query = self.clone() - for field in dq_joins: - if isinstance(field, ForeignKeyField): - lm, rm = field.model, field.rel_model - field_obj = field - elif isinstance(field, BackrefAccessor): - lm, rm = field.model, field.rel_model - field_obj = field.field - query = query.ensure_join(lm, rm, field_obj) - return query.where(dq_node) - - def create_table(self, name, safe=True, **meta): - return self.model._schema.create_table_as(name, self, safe, **meta) - - def __sql_selection__(self, ctx, is_subquery=False): - if self._is_default and is_subquery and len(self._returning) > 1 and \ - self.model._meta.primary_key is not False: - return ctx.sql(self.model._meta.primary_key) - - return ctx.sql(CommaNodeList(self._returning)) - - -class NoopModelSelect(ModelSelect): - def __sql__(self, ctx): - return self.model._meta.database.get_noop_select(ctx) - - def _get_cursor_wrapper(self, cursor): - return CursorWrapper(cursor) - - -class _ModelWriteQueryHelper(_ModelQueryHelper): - def __init__(self, model, *args, **kwargs): - self.model = model - super(_ModelWriteQueryHelper, self).__init__(model, *args, **kwargs) - - def returning(self, *returning): - accum = [] - for item in returning: - if is_model(item): - accum.extend(item._meta.sorted_fields) - else: - accum.append(item) - return super(_ModelWriteQueryHelper, self).returning(*accum) - - def _set_table_alias(self, ctx): - table = self.model._meta.table - ctx.alias_manager[table] = table.__name__ - - -class ModelUpdate(_ModelWriteQueryHelper, Update): - pass - - -class ModelInsert(_ModelWriteQueryHelper, Insert): - default_row_type = ROW.TUPLE - - def __init__(self, *args, **kwargs): - super(ModelInsert, self).__init__(*args, **kwargs) - if self._returning is None and self.model._meta.database is not None: - if self.model._meta.database.returning_clause: - self._returning = self.model._meta.get_primary_keys() - - def returning(self, *returning): - # By default ModelInsert will yield a `tuple` containing the - # primary-key of the newly inserted row. But if we are explicitly - # specifying a returning clause and have not set a row type, we will - # default to returning model instances instead. - if returning and self._row_type is None: - self._row_type = ROW.MODEL - return super(ModelInsert, self).returning(*returning) - - def get_default_data(self): - return self.model._meta.defaults - - def get_default_columns(self): - fields = self.model._meta.sorted_fields - return fields[1:] if self.model._meta.auto_increment else fields - - -class ModelDelete(_ModelWriteQueryHelper, Delete): - pass - - -class ManyToManyQuery(ModelSelect): - def __init__(self, instance, accessor, rel, *args, **kwargs): - self._instance = instance - self._accessor = accessor - self._src_attr = accessor.src_fk.rel_field.name - self._dest_attr = accessor.dest_fk.rel_field.name - super(ManyToManyQuery, self).__init__(rel, (rel,), *args, **kwargs) - - def _id_list(self, model_or_id_list): - if isinstance(model_or_id_list[0], Model): - return [getattr(obj, self._dest_attr) for obj in model_or_id_list] - return model_or_id_list - - def add(self, value, clear_existing=False): - if clear_existing: - self.clear() - - accessor = self._accessor - src_id = getattr(self._instance, self._src_attr) - if isinstance(value, SelectQuery): - query = value.columns( - Value(src_id), - accessor.dest_fk.rel_field) - accessor.through_model.insert_from( - fields=[accessor.src_fk, accessor.dest_fk], - query=query).execute() - else: - value = ensure_tuple(value) - if not value: return - - inserts = [{ - accessor.src_fk.name: src_id, - accessor.dest_fk.name: rel_id} - for rel_id in self._id_list(value)] - accessor.through_model.insert_many(inserts).execute() - - def remove(self, value): - src_id = getattr(self._instance, self._src_attr) - if isinstance(value, SelectQuery): - column = getattr(value.model, self._dest_attr) - subquery = value.columns(column) - return (self._accessor.through_model - .delete() - .where( - (self._accessor.dest_fk << subquery) & - (self._accessor.src_fk == src_id)) - .execute()) - else: - value = ensure_tuple(value) - if not value: - return - return (self._accessor.through_model - .delete() - .where( - (self._accessor.dest_fk << self._id_list(value)) & - (self._accessor.src_fk == src_id)) - .execute()) - - def clear(self): - src_id = getattr(self._instance, self._src_attr) - return (self._accessor.through_model - .delete() - .where(self._accessor.src_fk == src_id) - .execute()) - - -def safe_python_value(conv_func): - def validate(value): - try: - return conv_func(value) - except (TypeError, ValueError): - return value - return validate - - -class BaseModelCursorWrapper(DictCursorWrapper): - def __init__(self, cursor, model, columns): - super(BaseModelCursorWrapper, self).__init__(cursor) - self.model = model - self.select = columns or [] - - def _initialize_columns(self): - combined = self.model._meta.combined - table = self.model._meta.table - description = self.cursor.description - - self.ncols = len(self.cursor.description) - self.columns = [] - self.converters = converters = [None] * self.ncols - self.fields = fields = [None] * self.ncols - - for idx, description_item in enumerate(description): - column = orig_column = description_item[0] - - # Try to clean-up messy column descriptions when people do not - # provide an alias. The idea is that we take something like: - # SUM("t1"."price") -> "price") -> price - dot_index = column.rfind('.') - if dot_index != -1: - column = column[dot_index + 1:] - column = column.strip('()"`') - self.columns.append(column) - - # Now we'll see what they selected and see if we can improve the - # column-name being returned - e.g. by mapping it to the selected - # field's name. - try: - raw_node = self.select[idx] - except IndexError: - if column in combined: - raw_node = node = combined[column] - else: - continue - else: - node = raw_node.unwrap() - - # If this column was given an alias, then we will use whatever - # alias was returned by the cursor. - is_alias = raw_node.is_alias() - if is_alias: - self.columns[idx] = orig_column - - # Heuristics used to attempt to get the field associated with a - # given SELECT column, so that we can accurately convert the value - # returned by the database-cursor into a Python object. - if isinstance(node, Field): - if raw_node._coerce: - converters[idx] = node.python_value - fields[idx] = node - if not is_alias: - self.columns[idx] = node.name - elif isinstance(node, ColumnBase) and raw_node._converter: - converters[idx] = raw_node._converter - elif isinstance(node, Function) and node._coerce: - if node._python_value is not None: - converters[idx] = node._python_value - elif node.arguments and isinstance(node.arguments[0], Node): - # If the first argument is a field or references a column - # on a Model, try using that field's conversion function. - # This usually works, but we use "safe_python_value()" so - # that if a TypeError or ValueError occurs during - # conversion we can just fall-back to the raw cursor value. - first = node.arguments[0].unwrap() - if isinstance(first, Entity): - path = first._path[-1] # Try to look-up by name. - first = combined.get(path) - if isinstance(first, Field): - converters[idx] = safe_python_value(first.python_value) - elif column in combined: - if node._coerce: - converters[idx] = combined[column].python_value - if isinstance(node, Column) and node.source == table: - fields[idx] = combined[column] - - initialize = _initialize_columns - - def process_row(self, row): - raise NotImplementedError - - -class ModelDictCursorWrapper(BaseModelCursorWrapper): - def process_row(self, row): - result = {} - columns, converters = self.columns, self.converters - fields = self.fields - - for i in range(self.ncols): - attr = columns[i] - if attr in result: continue # Don't overwrite if we have dupes. - if converters[i] is not None: - result[attr] = converters[i](row[i]) - else: - result[attr] = row[i] - - return result - - -class ModelTupleCursorWrapper(ModelDictCursorWrapper): - constructor = tuple - - def process_row(self, row): - columns, converters = self.columns, self.converters - return self.constructor([ - (converters[i](row[i]) if converters[i] is not None else row[i]) - for i in range(self.ncols)]) - - -class ModelNamedTupleCursorWrapper(ModelTupleCursorWrapper): - def initialize(self): - self._initialize_columns() - attributes = [] - for i in range(self.ncols): - attributes.append(self.columns[i]) - self.tuple_class = collections.namedtuple('Row', attributes) - self.constructor = lambda row: self.tuple_class(*row) - - -class ModelObjectCursorWrapper(ModelDictCursorWrapper): - def __init__(self, cursor, model, select, constructor): - self.constructor = constructor - self.is_model = is_model(constructor) - super(ModelObjectCursorWrapper, self).__init__(cursor, model, select) - - def process_row(self, row): - data = super(ModelObjectCursorWrapper, self).process_row(row) - if self.is_model: - # Clear out any dirty fields before returning to the user. - obj = self.constructor(__no_default__=1, **data) - obj._dirty.clear() - return obj - else: - return self.constructor(**data) - - -class ModelCursorWrapper(BaseModelCursorWrapper): - def __init__(self, cursor, model, select, from_list, joins): - super(ModelCursorWrapper, self).__init__(cursor, model, select) - self.from_list = from_list - self.joins = joins - - def initialize(self): - self._initialize_columns() - selected_src = set([field.model for field in self.fields - if field is not None]) - select, columns = self.select, self.columns - - self.key_to_constructor = {self.model: self.model} - self.src_is_dest = {} - self.src_to_dest = [] - accum = collections.deque(self.from_list) - dests = set() - - while accum: - curr = accum.popleft() - if isinstance(curr, Join): - accum.append(curr.lhs) - accum.append(curr.rhs) - continue - - if curr not in self.joins: - continue - - is_dict = isinstance(curr, dict) - for key, attr, constructor, join_type in self.joins[curr]: - if key not in self.key_to_constructor: - self.key_to_constructor[key] = constructor - - # (src, attr, dest, is_dict, join_type). - self.src_to_dest.append((curr, attr, key, is_dict, - join_type)) - dests.add(key) - accum.append(key) - - # Ensure that we accommodate everything selected. - for src in selected_src: - if src not in self.key_to_constructor: - if is_model(src): - self.key_to_constructor[src] = src - elif isinstance(src, ModelAlias): - self.key_to_constructor[src] = src.model - - # Indicate which sources are also dests. - for src, _, dest, _, _ in self.src_to_dest: - self.src_is_dest[src] = src in dests and (dest in selected_src - or src in selected_src) - - self.column_keys = [] - for idx, node in enumerate(select): - key = self.model - field = self.fields[idx] - if field is not None: - if isinstance(field, FieldAlias): - key = field.source - else: - key = field.model - else: - if isinstance(node, Node): - node = node.unwrap() - if isinstance(node, Column): - key = node.source - - self.column_keys.append(key) - - def process_row(self, row): - objects = {} - object_list = [] - for key, constructor in self.key_to_constructor.items(): - objects[key] = constructor(__no_default__=True) - object_list.append(objects[key]) - - default_instance = objects[self.model] - - set_keys = set() - for idx, key in enumerate(self.column_keys): - # Get the instance corresponding to the selected column/value, - # falling back to the "root" model instance. - instance = objects.get(key, default_instance) - column = self.columns[idx] - value = row[idx] - if value is not None: - set_keys.add(key) - if self.converters[idx]: - value = self.converters[idx](value) - - if isinstance(instance, dict): - instance[column] = value - else: - setattr(instance, column, value) - - # Need to do some analysis on the joins before this. - for (src, attr, dest, is_dict, join_type) in self.src_to_dest: - instance = objects[src] - try: - joined_instance = objects[dest] - except KeyError: - continue - - # If no fields were set on the destination instance then do not - # assign an "empty" instance. - if instance is None or dest is None or \ - (dest not in set_keys and not self.src_is_dest.get(dest)): - continue - - # If no fields were set on either the source or the destination, - # then we have nothing to do here. - if instance not in set_keys and dest not in set_keys \ - and join_type.endswith('OUTER JOIN'): - continue - - if is_dict: - instance[attr] = joined_instance - else: - setattr(instance, attr, joined_instance) - - # When instantiating models from a cursor, we clear the dirty fields. - for instance in object_list: - if isinstance(instance, Model): - instance._dirty.clear() - - return objects[self.model] - - -class PrefetchQuery(collections.namedtuple('_PrefetchQuery', ( - 'query', 'fields', 'is_backref', 'rel_models', 'field_to_name', 'model'))): - def __new__(cls, query, fields=None, is_backref=None, rel_models=None, - field_to_name=None, model=None): - if fields: - if is_backref: - if rel_models is None: - rel_models = [field.model for field in fields] - foreign_key_attrs = [field.rel_field.name for field in fields] - else: - if rel_models is None: - rel_models = [field.rel_model for field in fields] - foreign_key_attrs = [field.name for field in fields] - field_to_name = list(zip(fields, foreign_key_attrs)) - model = query.model - return super(PrefetchQuery, cls).__new__( - cls, query, fields, is_backref, rel_models, field_to_name, model) - - def populate_instance(self, instance, id_map): - if self.is_backref: - for field in self.fields: - identifier = instance.__data__[field.name] - key = (field, identifier) - if key in id_map: - setattr(instance, field.name, id_map[key]) - else: - for field, attname in self.field_to_name: - identifier = instance.__data__[field.rel_field.name] - key = (field, identifier) - rel_instances = id_map.get(key, []) - for inst in rel_instances: - setattr(inst, attname, instance) - inst._dirty.clear() - setattr(instance, field.backref, rel_instances) - - def store_instance(self, instance, id_map): - for field, attname in self.field_to_name: - identity = field.rel_field.python_value(instance.__data__[attname]) - key = (field, identity) - if self.is_backref: - id_map[key] = instance - else: - id_map.setdefault(key, []) - id_map[key].append(instance) - - -def prefetch_add_subquery(sq, subqueries): - fixed_queries = [PrefetchQuery(sq)] - for i, subquery in enumerate(subqueries): - if isinstance(subquery, tuple): - subquery, target_model = subquery - else: - target_model = None - if not isinstance(subquery, Query) and is_model(subquery) or \ - isinstance(subquery, ModelAlias): - subquery = subquery.select() - subquery_model = subquery.model - fks = backrefs = None - for j in reversed(range(i + 1)): - fixed = fixed_queries[j] - last_query = fixed.query - last_model = last_obj = fixed.model - if isinstance(last_model, ModelAlias): - last_model = last_model.model - rels = subquery_model._meta.model_refs.get(last_model, []) - if rels: - fks = [getattr(subquery_model, fk.name) for fk in rels] - pks = [getattr(last_obj, fk.rel_field.name) for fk in rels] - else: - backrefs = subquery_model._meta.model_backrefs.get(last_model) - if (fks or backrefs) and ((target_model is last_obj) or - (target_model is None)): - break - - if not fks and not backrefs: - tgt_err = ' using %s' % target_model if target_model else '' - raise AttributeError('Error: unable to find foreign key for ' - 'query: %s%s' % (subquery, tgt_err)) - - dest = (target_model,) if target_model else None - - if fks: - expr = reduce(operator.or_, [ - (fk << last_query.select(pk)) - for (fk, pk) in zip(fks, pks)]) - subquery = subquery.where(expr) - fixed_queries.append(PrefetchQuery(subquery, fks, False, dest)) - elif backrefs: - expressions = [] - for backref in backrefs: - rel_field = getattr(subquery_model, backref.rel_field.name) - fk_field = getattr(last_obj, backref.name) - expressions.append(rel_field << last_query.select(fk_field)) - subquery = subquery.where(reduce(operator.or_, expressions)) - fixed_queries.append(PrefetchQuery(subquery, backrefs, True, dest)) - - return fixed_queries - - -def prefetch(sq, *subqueries): - if not subqueries: - return sq - - fixed_queries = prefetch_add_subquery(sq, subqueries) - deps = {} - rel_map = {} - for pq in reversed(fixed_queries): - query_model = pq.model - if pq.fields: - for rel_model in pq.rel_models: - rel_map.setdefault(rel_model, []) - rel_map[rel_model].append(pq) - - deps.setdefault(query_model, {}) - id_map = deps[query_model] - has_relations = bool(rel_map.get(query_model)) - - for instance in pq.query: - if pq.fields: - pq.store_instance(instance, id_map) - if has_relations: - for rel in rel_map[query_model]: - rel.populate_instance(instance, deps[rel.model]) - - return list(pq.query)

{q!`hPL05_LNnX?A}TI?S1bHajjY;J%{#pgYS$GD`ZQN;|#e~dS^ z79J)){HSxnNYcW!;}4=F2($5)?p9{&6&0$ktOWM<7TMJ5-mYTWMzouVPFQ-v%ZlV( zr5xy-{CNM>2$BA`MktPmA$`qQK*YwV8^&lG#&pDFsHtCI#zLu#Z^m+16!xd{pZDj| git-xo*Vi{|zUha@XYTg!{d0iqS0%|Z@$dfs1EEF diff --git a/docs/source/_static/images/tools_17.png b/docs/source/_static/images/tools_17.png deleted file mode 100644 index 3813002290aa1d71452e8e7c6106a0c4ef9254da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7467 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