From d2dcbfd008f6e7d88ee44d3484a3267f81140951 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 13:51:00 +0200 Subject: [PATCH 01/50] Import bugfix --- plugins/webui/interface/controllers/admin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index b57c238..39577e6 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -1,3 +1,7 @@ +from .base import get_response + +def index_admin(request): + return get_response('admin/admin.html') def admin(request): return get_response('admin/admin.html') From ae8d8c05a694fa4b30a91e791e2e709972206519 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 14:35:12 +0200 Subject: [PATCH 02/50] Bugfix on EM groups handling (now we have to set actives groups in settings) --- examples/em_test.pickle | Bin 11573 -> 11510 bytes install/conf.d/lodel2.ini | 2 +- lodel/editorial_model/components.py | 2 ++ lodel/editorial_model/model.py | 9 ++++++++- lodel/leapi/lefactory.py | 2 ++ tests/editorial_model.pickle | Bin 11663 -> 11510 bytes 6 files changed, 13 insertions(+), 2 deletions(-) diff --git a/examples/em_test.pickle b/examples/em_test.pickle index 32c40f77b5e45b041b150c53752dee8b0f308dc2..723e987f9f61d487259f7bb1511a8881e9ced2d9 100644 GIT binary patch literal 11510 zcmb7KcYqtk)i)i9VtOxYFd$(T2<>UKjXLjbjx3ABenLTfVQmt8zYt!O# zrPY*5u~w+-yFRnC($Tpb%-RW4&bRA1yM8Xe*@Oub%5hSX%5baFY}k}eyH%+r)9SUP zC6&hF?A+RX-?1A4bt7jt&TkCNCB<4hPV6SmZkpc!?{Q%+}P+-N1)S@jc0 zA#1k;mlK`cDyM9ZZHWuTLD&^KxBHLgH^QLm-A*-B+X2oVm@`}Fvlt&NCc!9nnt`?s z%5Q_wj#;~O4p!7doIMn%=3v4emNQ$JiTSO@APmQnz{?I-@FSc(lHi9E{3zp9|0ZYO zOw}KqgYIVld3K{E&2qaGL-}!3YBoyoa4TvK^>~-38s&=ZmT5|IKm_3$Nv()Th~idh zihYZ^!4PcUmp>CUXEYnF3X~Yt;>24PZ4%3pBF5I<7}bi=VmL4YB0_LPo_+(pj_8Sg zEpCUefxi}BrcIkR#lE$j44Rz{jQln=z%kAqs|GkuU#B}eLtkf_$wjmOsF`XGfVyc} za8v~E@y?z=U7QG2?1uS)c(_)CBAT^wq_88N`PRsAY-iI2scpER`c0uQREcZl z#Gd5r$@xt&(=q#;Rr$^FUalk{I8ta7>#?1yp5O26Dg5L-lQFY;oH|e}7hA=o*_Kjl zPgR!7@ldf{YuSPJU=ZdA2*a$xa4H0Q&kq7EaQ5w_ej1HC6+n>4hf-9GYL&*>(O}$K z8pn+&Y1U%|byRGWF{Pn-y6MXw8gSOGVf@8Wy8$$S<3;!ucWed2bC#H~&C?`M!#i@C zwgOjYypa$*o;u9hcOo**bar7bzcm#HH53eZtHt8AcUFEwj8g<#fJLDMbA~2_F`!LN zvWZ>fY%xC(2*p~hxfIDrvkUUb;6htcFDW}4tCtM*dWktBC~~p0hKj7bif4pqP?G8y zRoIczpPf@L7;4vQYVn$(RCQ+?IdhgO260g;wrtb;q^TJ&I-Ju~puSY7Rg#vq3$5fd zZw^%?X(_ElNh4kP*H*0am3qD1Dh}3=b62(V+mF{A5@M@}c(zM|C2DbTxH63@3(8IO zCCPfmvUVvLUgqpbF25y+6^5EpFSZJPk+Sd7T((aV?UUGdoAxSYsRB2VMzLm>D@RBX zO`udt)~S~cOQl|vk;2*Wh&^Xijo5BftUY%$zazge6TF-l3|%P7;&vUbme}*0JwJy} znB~T`RX_FOvO*2(U(47FPCiy?`}p%ZyU>WT(}40-A@5n$9yHta>tG?StF`P3Q#L*h zS33J%8h8~Wg|T~lYPC^>0pqK`Sw}Xk57*+By$JrTu|LM!O0~qUHcRoHL@j->vzO4) zOf^f2QZhxcmzt^l@YRHtzRdhzb|`Q`$e!kLv-WaW;|gc5%$ajXO?%WVA2sKU8tCRK z109$kqUlO?wX^S|RPU!$TzHS~IM4?m78#o-Yu7ZIb^Aev>}qp)dr+-ftW}DMy+-Bu zkh34A9IQC7p4w}@4A)SG>v9G$biFAT@p&`Q-+n!rBp!;fmX_iqJD=@aUGEvmG?{OBv|aY^!a4e&7`b%e8T1O2$cHTJ3t+^Pi0A^+_oR1sk%n~xU-+2 z2%p3fat%|@YI6hRYpLx%?47a=aQ0|NvC4HfH^8ZywAx(-FpQz12V-J^_s+1anqsc5P>adWU5ms<1Ng9AAEwNY zz&GZB&*SKibdHk5MXZLYAz2-V>HL(2Gn~Yt82-xI{O&E_c(RT0%T5niYg{bf@Y#hS2a&S?^6JjYKzX&<51BM&A^eAiha_X z`3en!ovH*oOwpY`H{0fruU~(JVPmdk~8ac^_}O7;}^_REA5Nq@TdRpG&Tq8 zbJo5Dulkv@KTo|%^VBaiPyKSh{;Hd&emyo%ncK{Zx+=j3o(l`nZ=C%t<^COgfMLai z6qiGGNbK)nbyl68dDh6a%Gxz3W&Yre`x1=H^$Q+@;udlEvTEXw&i*On0Rw%Tm#K+A z=Q>GS6T)Ad{c9?NUt0$HxxD-hV9B_=kn;O?Xa7Nd|C#0m1hN0{zrZOsHS?S8rI%@%j18*qpXKP{k-NZSs$-XHc-g1i=b?nLUyCLzpGf; zNHI4i&?ZhcQ3@Gd>lRQ?vMFc!(gBGjgMlu;Tr0!wQ?dj_Ehn3y<79I@gO_1#uj(u~ z-$IAisWoPEUybd6Y>7erhDM!C#Oq4g3Qzc-Y|VC3cO^A&EZGKwPPWA}H4WWMw)3zn zWP5Z5WCy;c>!IwZ(7j8dxvk2tjPo|x31d!nCNh+=i=t(;E>Mo+M0Vv|UzJVA!P;id zD(|kc8^)dNP9PB2gKfq<%{V;O=pF?;X;q-I?5WTZo?~R0M6~CMD`YQp24ru(c4V2X z&|_sW&!&Qe`c3u$l#_jl2|o5yoQ!6<5I($oq_{v5`s7@2Lc}!ou)(&!gGuk4kmTfHgX6$19B)|J6br5Z_7s$ z7C63qp>H1(*gPDwPL3c9*gO&~qmjoCW3q=FMF_uIr}@LD4|x-2Q~^~oi5$X&EKS74 zn~6hbKN=k;Z^1JSQtY~_I=#qAAHjT#zEuI=rhwyO^cX^ojn7nuV-@Q-0zii8ik;EQ z+p`)eH#0cjm){oL4S>6_;00pe?H&s8bgISup_ECfFMm=X@QSl0Ppra# zhp*IQY=co*_ntZhTJ31)&Z-d&GyFO_WW-6ELs)8?a zGOTdx)W%S0`X!5Df7+twl_GdwDGBl6;VrggzKxEPC3vz5lcnfXDNqmpbe6 z7$I8kN8ZIbitui9oGj-&>MaHtS=MQ=><9)f&Oz(H))Q*yD(ZQP+7oK$cVJh@1?UgR zg?M(O?LB-OA8l2N7hHD*x=vPd06z9!wi#ddc?GS)2s8QWkn)UfOk`BiF2a+N^z1)m zHA(0e#9$vG7c1Z;3K-H{*iFc#DP%X*aYG@ODaz%X1xr`3%^1H4=;i!M1-mMMU5yse zVNmazZUv7NkSKz}%Xm{D77T@?@{lwsmS-A#OAjXH#IQcN1 zVFA;#1)j*1aaL^PTFmqtO_r3wKky=Y2#lLB*kAQjItzbQ zN5M8q8G3c70Mwm=#c#&2lUwkldT(XxYk+>FLYz1Iko*Y7z1=Ae$auSd6faJ0!*jgd zZ^u}V-Pb7K9SS(k?suk; z&DPg$^MjlAYwRm<) zriJnlUb~+3FyCI04=8ZZ?jz_rd6WY%!dKb)FqzSn=P``FN=|rOQJ=tbyl*^7GTof; zlmdQD0mu2q*Hg%GzVQu3`6g$<);hKw-{|4~X$5;GfIW-$b$#Po3jSOG|2ErDO!Zjz zI~eZz$8$afaglglvA>I_y2iiKYbk+1@1^kHu zj#JYMDdadcy{ITZ!>OzMj!<1TQIJ=AIQhLI{(&%H_+_@4>ZWMazj)AErK@Z7{1F`| zf5Mag#nTF|o;r=_`7^=RX{p!~De@N#R~bVq<*#@mT6B-~H}swS9nYRn`3GLRq4H0@ zrJ+(Ka+*wg`2QD%o&1}i;Qv2teKMWb^`J!li*YXy4jy{eqzUU2dp$gfy*}GaHH|K< zHsckt0fq-;Lr(f?b0c(}Y|H^*ZNkNL7IU6^iyc6cV&J@`K zbSSLWgInSyXQrF|aEHK{nTU5MTj?kYtF6)Ly-LzeKd;S3WE)QD@w05JNZWA$d~VM+ zqsQRgt4CbC606IH>;N#bftqqhVstj+JK+txd5(eFE^Pe?$1MHst{5Pms^3h80d~X4 zfb32{Z-70}b+RW1Kp|r5b7WU`ek*(#hyL*@pw5 zyf52~ZsU%}r7`Mq+}1CSa9KXwgnjqJbdWGd$c}_l@aANHj)BTlwi&(W>KqU1Zy8be z{s92!NE|9$UjFi5iU4vTX?PZ=q3h%z4uJTPEBQuFi4bDOb8+kmbL2i>c->TGOIe{=|(Og<+Hd2bS zF@?LLH+K6r6W>^XZ)D{ppn;8((Kwl-MA+u)l~S#eBx143(&!#0G`lPwMRJ$0p*;=sVaHG zl`2)CB!PLlV&)ZdoN({JAcga2DvI8@@mjSbKrRqNxhMv@VBNs=*UVDNFY0?WJ^kRoLFTJYIYuCmX{ds z_%O6m4c(ql8B#in2?F5^+f05Rc;azUf?r`;dJ*B{#sB3s=zpUL$)*B?v2jwx2#y9w z2n1_vGkW%RB7TvQdVpVDr5w7zrU$PL3^-{L0f@tF{qFV@y)hDt5q>Hh!|H!86OsBD zHhPYYj447ip9B(gowPUrdTqA;myu3p)rF8(;C1|_gG;cuSTd0w6Z_nV!{Q}C<43VF zEk)O>RexHOWu!<8kD%k^U7Uu6{k>#WXBRnnH=%stwOrwx!i_7u&LPy8!plqwdFNck zI*$Ml<9x-=c=COkbioaN9Fhw#(>W;g2l57WfLusSviTl#oUBj+9X53qY_24fXY;)Z zw@Ts0u{lbpS7-Ag#ac}Ouz4}tOqJ9%B(yl3$cl@cT%xd-;z@;}IOHXR&VrN6bQnh~ zm!rc|sCDLPy@6OMS6~E@twrIL=sUSefjyVHJHOf^t&sPjGa&EhYv(xg1AOaLiApVm zdaCRX0>a5Pgo6|xLW^QsS4;*U{@V-J{pDzI1VK>=|L@6%iP5KZjvhybvp1f}mEx9O ztm3*vt_7I45ihlPAkF(@xsKRW%=PFvxdG1}PtsW^=0-w!6Wye6H!IvY6Wv0nS2xkE ziuDl!K)8=8cBZQ2`}9``{52uBVYuT)J*Tp_EApCvdY}Hc_rOLt9umu%K`i= z9$YUxDJ1_G!u2}6;9i3C>2F{@*|f~sH3YEjSnk6l^?z#BE6q$oReL`M2jl_b`KtCo zba8sX0kHoN+l=05LG@t|@h}Jd88sXHBY6b36m9=kQfK?2|MM2Yf3xxkkv7lo3G=+x zAGVq_kr^KaC=MO)%vIHXyXz*}Zy2A)?e7_;T-^rK)rllJA6GlG%=GHseA%yBMJ~{T zuBvA2N!0^6KDoM#<83~8P*de`LEF11Pa7Wtkdwy=3bCJH>z4?Y+i_i<#0WHy-|5x( PPZ@s-KvnYH9-Q_+`}0Kt literal 11573 zcma)CXP_I!5vCW>dGvZTBLgtGu0)Y(HQ_^RxYE22Ah0 z_uiZ7B_ts|kWP9+5&|TFl<%9}Q?Y4(_V#vXW@l!n?cSZXY`$D8gyoT8p;)g;F;~u3 z^j+IjcQQJWgDJDr@YBuG)-03GY_QZ)OJzH!v)Oz(7sp|2mbGTNbS4Fme63s#^Yvn_ zYL@?kmGZSpf2|r;>v5{PGMW@pW(BOXqBSd}Gb@8g6qft5^>B9GtUM{RA_n?%LU@y! zW>$#^yQ(#-rK6So3XOWP9FMG&S7uX?nV2h99b(W|lOR_v2i=vR)?0!?VzaTQvx(B#)SAr_I-6S)kj@sM(*-(X zfm{#cI%Em@8`58kL$jsF-YT;uAhKR@*=%1iEEi(4wKdzQP>o{249lzmm|QQ^k;~V! zjsdf6W}ObqLav^RYYoYVCap>?gnhY2xo(DMRs$dw4zmdjv)xc;c??dMTBF}=|8+L@ z5Q3)64$#vGYeuG%)pZ<}(=-CJW4^ahEJNBj6^Hed*=d^DdC=_AV|Mj=-p!ibsh>Td zpHblA;9MLA%1Tg=a`m8C=`V*B8c5K~sqTqEUzn>yfH+8(i!;L3ZVoqlQjx>dRtcPS zBJGt~1%xFujiQ8wZ0~^C+nRkcYh$qGC{1nb8&RxL*6f##c8tL9{)6U#9&@1Q_aJKy zCcmT8V0d?s7+tH@VHrn)nSdMZWC1ZBwO zJP%2?PM}S-~o%U0!1_cPO1RKGk+Y{$DV;fXLv~L6{4@s-+#cCm(?X@vZ z*>SreVLueFyP-7Ua!07nqj6lWM{Uh( z+Dx%#D%cnmXI2HFLNSIT4rHsjN@$K$A3MsLqq$ZFYcUdxCz~L73`jP5)ft+q%R&P& z0?)C^{&ChE@7bR=Xin%cS*a9BZr%U+qPq=$1sBK`c!w3Q`K~9BFa^SSPT-~$#&B+sF#xJtU<&X(O%Jr z*dvy$sSvRW#ML_x=^>`3Xfe_HJ%+JHh!F#WQNQJprtUUoC5$H4ZW{AF-b`y|5pOo| z)&;~tK1KzalYFQ&14<$nA*h|y3i3?_`GnPqAV?!)83t44WVq!i*4QMne#4qmx!!45 zZyT-`#Mr(%qU&rlj2(qA&P%b^ZM~0_r(=B$R}7I^@1faRKOHJIXIOJ)hT;|Br&7(8 z&7AqMD!c9%+IV34zpvh=U8)Y znm~-{eVXOY%Pfb!=G+Ah?Ki4LW6mGa;LtC{N=^o{Gr|FL!BBKwv;e+G9c06by1uzE zS}(H}20EBmKVBFuh_;VLcni45nv1z3mtaS@;y9#wbE&f#hG5`_*}Ncphvu?~`+2!F zS71LUMNs^eY0XX5+N^A?nt)w3AEGp(ucvHiB%E5Tgeh}16nD}Ko|y0**4#-NcY#J4G>*i!1mnl}%vV61E%prr;mlA5 zI=$#_kf+Y>p%`DOofPSgACofoLM^vKE%!n#_gQm)I?;(*86s1y0vYn=0jlW1baVl< zA3e}emCSFdg!L8;2qHbyrjUoNd4$3|3Sk(cCa}s3icX4RDCV)nEWxY%aaGF`);yV5 z!c*z!dcW@xck*$+lTTao40duT;d(yVd{$Ke_>O&x+PCUCYn~@(FMu=J;e=dV5B%zj zl&J=)28!i_#EVfn8Xj#oq|!A5+)LKHOfs*441o{V;?KOQ6f~l}1~N=!+&E+k^ZMt~ zdBd7FN$0JoD|)?!{LQqwEHL5tZ>v(iWzDw}rF`crx7kIUqjHjua*{IdKyzmE(8a?y|(!sG;%UJr(1p*8D6n`JY?!3nKp#$ddtkP`O;26`)vhaUn=zB2zRo z_Vik<;46?>QCLOsSI(MEATsL4p3w4+5NoH=%@eb%kdX291xj61NU|bITJI{7(vejN z0QOepvn#Vbs5UDrxA7>JDmV?mhr(Pw3bcxLHW9|M8qnwwscEu0DXhmpC2OGT!%c+K zm8{7rBxG3&9V=^d+NEXb;?!V-Xi`!r4JfjX!mX=tKCf~EWj#W7_(X|Ka$-rGfj3!t9H5vI#%{1xI1&nUOKWj0l?8de0F8FTGCFnCU2e~wN8&^Ux0i2 z97W7k)jsz_H;wE?UiU}e$^km!cs-DSXR+|1StdzN4pP8_6|h~cqZ9B>)lv{=mq})m zF-oDE6Od#qo`}rRy9m5K&q*kUVAScAH8KLVCTtl;B(ggm9V>?_u4DHw?GK*>mQl&7 zCn>Zuh6xHkQDNG-o`ew<5?lipmAOwcrO#pfa3wOCC}8{uCDx^Z26@df*u%+g4d7F1 zjd%n`AIRS9qCbC3vG3!Kh-SMao$0H38InI*7UUaPF3E{(5 zLHlRVSAq2+Ez969A;zakA7{1b?JG)LS7OsKrYgg&r5lMb5`OjJBZYebq}G%a0go`L zT+J)-4Xl;$urdQ}T9a%R*N3RGv+h1q%9v2=+9nRRiKT*9EpN5*W<;$LGdjDi5?4#m z-0W@$onSSHX#+a7fT6&Y8Wse zExMg|T6(({29-s3U;$ij6=xO;4Y61P;-aLKZ;*L!^rxb)TF%is)w93&LZGb*nu1$U zIgM-&E2-AzmG}nLosNfv#To_X*7sk$0 zxCIK=9>&fmbZ6jow%J|~T%gDo5){lVR3gq8c~n#Hyoi(C>OnL{l(~Jm3M*c@7&B^* zsMTqLm*CyXrAkEa^5rrexg0IYU%_Wru)ZUShmahHp^F8x_K3jGH*+RIE@=#WyS5EehAJ;#&#* zx$LynT(>Fm?F0oocPNoAjeujD5%5mVcI&xsGJJyd&RrOC&dyVW&kwGcxSP;a_&w-Y zxfg9>BKNWH9p!%XHD%=(*FMxToVQ}~04JDY=E{R;X|<3U=Yx_`)+2&Egc&Ojqit@3 z)|rnaBXfqFQw`zb1M$YW9awD<7k&~jELue<9r4G1R$(DNjRwIDLfetDKn!~ zSn$=#(*)?&ams+J-EtAZL!QC7swufha5+t$C4Bo`LULkw4ii?M=QP%Pflqg-Fj=p2 zWf4Zy6P?ydd{@29l@|%zQWiDn&QtOdx>jCB+o`Nql98sel!hwnRm>$($q6w37M@fV3ka_)Cw(m6BuKa3206KS8BUGiVDdKRoMrKz!GBGV zZxMq=^=)*ld%l^!?}wVV^xT7MY55)}cS18)zK_-gXEiLP?hNY( zn6dIhw4J*8k&d)Q+mg~yUHuqyZq-5g3Hm+qF51u4RdUpM4**tvN-(JEXLz!rJO)wV zn8aRih1#?boGJZvy8K)*f8jBI$!AxIKI6^eLwzYxq`C4dw2Ajna&Hj7M%T*wXgh`c z4ME&VJNmRlWS3HYi(cY6zeB%Ae$P2~9hw~E;5LbLf55DjKN1Gg{RvMR0za41JCIua zRYD=?9l&i)F=ko~XUm_7(XA(VbtC^7iwQU%*6W&m0rnSwC0Z)2NSw4*G=)Z`GO&w$ zz!ANq8{bmfUomLqZ=3>4f9KPgX7kXjb|N2QMm4G7E_R=_iV|3r;8=7uCDfkLR2}YXzN}6t`tcfyw59^POQh!NMS=dL6OoEW>Woz};gTX;}5K)**eB$PLFC%V5ds?Ly&IM=-Y zl#TIfWfKlU51aDoW4HdvAe&)CO^eBZw?H@~CI+@Sq1)X(NeBTZtZcz)5Z#hb_xTM6 zxCD7CjJ73(#c6Mi>GnO?2Jdra7)fcm_*(VpINa3p&Nn675^-2b4SQaRZ%}d?4=cmb zwv?=V@DAC#!giRQ#9C>4f@zJx*#bViMzVuWYJ4pzpike*rbgKjfGBYba)UAw{T|s7 zt&6fHMc3+Eg##O7{+jdv1JbYn2&gx)sVR5wr~^HjYJ>?S;e)L3+^9D+89g5%Kl zi5F3DJON$ReW-#S=0H_z6Le%EK_I{+K3iHloUco2ZL;DVfwog?JqdWH*2rIHjGCeZ zrg9vM9*HOOZL8{zp*0mRUFt|5i5niJ_(yyEjKkN`hN|JmF`vSYAxO7=7S)7;^tR}B z0+>c9$6`_wSM(x2A}-LhQKIXsUF&fl=S>-q<4A>?J{}!hkf2SB?gSml5&)8%$Y+;k z%+?Q0_=$m3+?iQ#PI3Ulw(_>Oml*EmB+u@!k}lS?mJzL-S-`xNkWg5vk5Bhyr(2nv zjsdlm63baF7WGn~4lnX|MG_H-f)vrQQbL;uGDAno1OWAl&bWJQNaFq`338|kaT(AX z)@Ow{#>cfvh`-1JeBH(r*O4mmyED5WoD$8Q*h8N6%lIWj6~VW*gMEl^e7F?{aws)m zV?(HyeiCxGjE20ZP@1X)ueb`~pwHZO^nI#ouzL)n5>l0>9B5R_`(^@~sra)Lzx{kR z8zYM+pn)d2K{*Ni9yys%J^@jQ(ZZ6?JINX46pUK2oP#32fhVgietYgHyX90uxTA7X zb-SWlPQ#4arRFxN;q-huftje!K*!3NXcOt@aLS!R70R7L2NiCv!nI2|kIBQhc zzj@A@uh>I`g$!pY757oru^K2-XLG(=|Cj3llm6z$ohquKoP%lSUJI1<*p*Uh*^ z0dGwJacy=R0Y8jBiawYtx1-;3Abd`1?!z65ccrTqm9ZY->yjDkQN?)-ZD+=M zJOS@?3CC}Ho_|6KJV|gY`jirC&sf}g-G%1Xw|#hgT9Kde$j|cWy{YvDQ=Y@H3f{F$TAYa=bNII|4(893%5s^_z64bNtBmCZKw4RZHqBqo@DJel=vcTq{`qUT zf0UZPsp&7rS@#QKEH473L_D=O_nVgffh8|tP^*WR(XsLhU!j&)`RvmFwx;6e$JP&Z of&SVouVEe{y03No@bJ2#zv0o}bm+Vd=fAgMMc#4(T2<>UKjXLjbjx3ABenLTfVQmt8zYt!O# zrPY*5u~w+-yFRnC($Tpb%-RW4&bRA1yM8Xe*@Oub%5hSX%5baFY}k}eyH%+r)9SUP zC6&hF?A+RX-?1A4bt7jt&TkCNCB<4hPV6SmZkpc!?{Q%+}P+-N1)S@jc0 zA#1k;mlK`cDyM9ZZHWuTLD&^KxBHLgH^QLm-A*-B+X2oVm@`}Fvlt&NCc!9nnt`?s z%5Q_wj#;~O4p!7doIMn%=3v4emNQ$JiTSO@APmQnz{?I-@FSc(lHi9E{3zp9|0ZYO zOw}KqgYIVld3K{E&2qaGL-}!3YBoyoa4TvK^>~-38s&=ZmT5|IKm_3$Nv()Th~idh zihYZ^!4PcUmp>CUXEYnF3X~Yt;>24PZ4%3pBF5I<7}bi=VmL4YB0_LPo_+(pj_8Sg zEpCUefxi}BrcIkR#lE$j44Rz{jQln=z%kAqs|GkuU#B}eLtkf_$wjmOsF`XGfVyc} za8v~E@y?z=U7QG2?1uS)c(_)CBAT^wq_88N`PRsAY-iI2scpER`c0uQREcZl z#Gd5r$@xt&(=q#;Rr$^FUalk{I8ta7>#?1yp5O26Dg5L-lQFY;oH|e}7hA=o*_Kjl zPgR!7@ldf{YuSPJU=ZdA2*a$xa4H0Q&kq7EaQ5w_ej1HC6+n>4hf-9GYL&*>(O}$K z8pn+&Y1U%|byRGWF{Pn-y6MXw8gSOGVf@8Wy8$$S<3;!ucWed2bC#H~&C?`M!#i@C zwgOjYypa$*o;u9hcOo**bar7bzcm#HH53eZtHt8AcUFEwj8g<#fJLDMbA~2_F`!LN zvWZ>fY%xC(2*p~hxfIDrvkUUb;6htcFDW}4tCtM*dWktBC~~p0hKj7bif4pqP?G8y zRoIczpPf@L7;4vQYVn$(RCQ+?IdhgO260g;wrtb;q^TJ&I-Ju~puSY7Rg#vq3$5fd zZw^%?X(_ElNh4kP*H*0am3qD1Dh}3=b62(V+mF{A5@M@}c(zM|C2DbTxH63@3(8IO zCCPfmvUVvLUgqpbF25y+6^5EpFSZJPk+Sd7T((aV?UUGdoAxSYsRB2VMzLm>D@RBX zO`udt)~S~cOQl|vk;2*Wh&^Xijo5BftUY%$zazge6TF-l3|%P7;&vUbme}*0JwJy} znB~T`RX_FOvO*2(U(47FPCiy?`}p%ZyU>WT(}40-A@5n$9yHta>tG?StF`P3Q#L*h zS33J%8h8~Wg|T~lYPC^>0pqK`Sw}Xk57*+By$JrTu|LM!O0~qUHcRoHL@j->vzO4) zOf^f2QZhxcmzt^l@YRHtzRdhzb|`Q`$e!kLv-WaW;|gc5%$ajXO?%WVA2sKU8tCRK z109$kqUlO?wX^S|RPU!$TzHS~IM4?m78#o-Yu7ZIb^Aev>}qp)dr+-ftW}DMy+-Bu zkh34A9IQC7p4w}@4A)SG>v9G$biFAT@p&`Q-+n!rBp!;fmX_iqJD=@aUGEvmG?{OBv|aY^!a4e&7`b%e8T1O2$cHTJ3t+^Pi0A^+_oR1sk%n~xU-+2 z2%p3fat%|@YI6hRYpLx%?47a=aQ0|NvC4HfH^8ZywAx(-FpQz12V-J^_s+1anqsc5P>adWU5ms<1Ng9AAEwNY zz&GZB&*SKibdHk5MXZLYAz2-V>HL(2Gn~Yt82-xI{O&E_c(RT0%T5niYg{bf@Y#hS2a&S?^6JjYKzX&<51BM&A^eAiha_X z`3en!ovH*oOwpY`H{0fruU~(JVPmdk~8ac^_}O7;}^_REA5Nq@TdRpG&Tq8 zbJo5Dulkv@KTo|%^VBaiPyKSh{;Hd&emyo%ncK{Zx+=j3o(l`nZ=C%t<^COgfMLai z6qiGGNbK)nbyl68dDh6a%Gxz3W&Yre`x1=H^$Q+@;udlEvTEXw&i*On0Rw%Tm#K+A z=Q>GS6T)Ad{c9?NUt0$HxxD-hV9B_=kn;O?Xa7Nd|C#0m1hN0{zrZOsHS?S8rI%@%j18*qpXKP{k-NZSs$-XHc-g1i=b?nLUyCLzpGf; zNHI4i&?ZhcQ3@Gd>lRQ?vMFc!(gBGjgMlu;Tr0!wQ?dj_Ehn3y<79I@gO_1#uj(u~ z-$IAisWoPEUybd6Y>7erhDM!C#Oq4g3Qzc-Y|VC3cO^A&EZGKwPPWA}H4WWMw)3zn zWP5Z5WCy;c>!IwZ(7j8dxvk2tjPo|x31d!nCNh+=i=t(;E>Mo+M0Vv|UzJVA!P;id zD(|kc8^)dNP9PB2gKfq<%{V;O=pF?;X;q-I?5WTZo?~R0M6~CMD`YQp24ru(c4V2X z&|_sW&!&Qe`c3u$l#_jl2|o5yoQ!6<5I($oq_{v5`s7@2Lc}!ou)(&!gGuk4kmTfHgX6$19B)|J6br5Z_7s$ z7C63qp>H1(*gPDwPL3c9*gO&~qmjoCW3q=FMF_uIr}@LD4|x-2Q~^~oi5$X&EKS74 zn~6hbKN=k;Z^1JSQtY~_I=#qAAHjT#zEuI=rhwyO^cX^ojn7nuV-@Q-0zii8ik;EQ z+p`)eH#0cjm){oL4S>6_;00pe?H&s8bgISup_ECfFMm=X@QSl0Ppra# zhp*IQY=co*_ntZhTJ31)&Z-d&GyFO_WW-6ELs)8?a zGOTdx)W%S0`X!5Df7+twl_GdwDGBl6;VrggzKxEPC3vz5lcnfXDNqmpbe6 z7$I8kN8ZIbitui9oGj-&>MaHtS=MQ=><9)f&Oz(H))Q*yD(ZQP+7oK$cVJh@1?UgR zg?M(O?LB-OA8l2N7hHD*x=vPd06z9!wi#ddc?GS)2s8QWkn)UfOk`BiF2a+N^z1)m zHA(0e#9$vG7c1Z;3K-H{*iFc#DP%X*aYG@ODaz%X1xr`3%^1H4=;i!M1-mMMU5yse zVNmazZUv7NkSKz}%Xm{D77T@?@{lwsmS-A#OAjXH#IQcN1 zVFA;#1)j*1aaL^PTFmqtO_r3wKky=Y2#lLB*kAQjItzbQ zN5M8q8G3c70Mwm=#c#&2lUwkldT(XxYk+>FLYz1Iko*Y7z1=Ae$auSd6faJ0!*jgd zZ^u}V-Pb7K9SS(k?suk; z&DPg$^MjlAYwRm<) zriJnlUb~+3FyCI04=8ZZ?jz_rd6WY%!dKb)FqzSn=P``FN=|rOQJ=tbyl*^7GTof; zlmdQD0mu2q*Hg%GzVQu3`6g$<);hKw-{|4~X$5;GfIW-$b$#Po3jSOG|2ErDO!Zjz zI~eZz$8$afaglglvA>I_y2iiKYbk+1@1^kHu zj#JYMDdadcy{ITZ!>OzMj!<1TQIJ=AIQhLI{(&%H_+_@4>ZWMazj)AErK@Z7{1F`| zf5Mag#nTF|o;r=_`7^=RX{p!~De@N#R~bVq<*#@mT6B-~H}swS9nYRn`3GLRq4H0@ zrJ+(Ka+*wg`2QD%o&1}i;Qv2teKMWb^`J!li*YXy4jy{eqzUU2dp$gfy*}GaHH|K< zHsckt0fq-;Lr(f?b0c(}Y|H^*ZNkNL7IU6^iyc6cV&J@`K zbSSLWgInSyXQrF|aEHK{nTU5MTj?kYtF6)Ly-LzeKd;S3WE)QD@w05JNZWA$d~VM+ zqsQRgt4CbC606IH>;N#bftqqhVstj+JK+txd5(eFE^Pe?$1MHst{5Pms^3h80d~X4 zfb32{Z-70}b+RW1Kp|r5b7WU`ek*(#hyL*@pw5 zyf52~ZsU%}r7`Mq+}1CSa9KXwgnjqJbdWGd$c}_l@aANHj)BTlwi&(W>KqU1Zy8be z{s92!NE|9$UjFi5iU4vTX?PZ=q3h%z4uJTPEBQuFi4bDOb8+kmbL2i>c->TGOIe{=|(Og<+Hd2bS zF@?LLH+K6r6W>^XZ)D{ppn;8((Kwl-MA+u)l~S#eBx143(&!#0G`lPwMRJ$0p*;=sVaHG zl`2)CB!PLlV&)ZdoN({JAcga2DvI8@@mjSbKrRqNxhMv@VBNs=*UVDNFY0?WJ^kRoLFTJYIYuCmX{ds z_%O6m4c(ql8B#in2?F5^+f05Rc;azUf?r`;dJ*B{#sB3s=zpUL$)*B?v2jwx2#y9w z2n1_vGkW%RB7TvQdVpVDr5w7zrU$PL3^-{L0f@tF{qFV@y)hDt5q>Hh!|H!86OsBD zHhPYYj447ip9B(gowPUrdTqA;myu3p)rF8(;C1|_gG;cuSTd0w6Z_nV!{Q}C<43VF zEk)O>RexHOWu!<8kD%k^U7Uu6{k>#WXBRnnH=%stwOrwx!i_7u&LPy8!plqwdFNck zI*$Ml<9x-=c=COkbioaN9Fhw#(>W;g2l57WfLusSviTl#oUBj+9X53qY_24fXY;)Z zw@Ts0u{lbpS7-Ag#ac}Ouz4}tOqJ9%B(yl3$cl@cT%xd-;z@;}IOHXR&VrN6bQnh~ zm!rc|sCDLPy@6OMS6~E@twrIL=sUSefjyVHJHOf^t&sPjGa&EhYv(xg1AOaLiApVm zdaCRX0>a5Pgo6|xLW^QsS4;*U{@V-J{pDzI1VK>=|L@6%iP5KZjvhybvp1f}mEx9O ztm3*vt_7I45ihlPAkF(@xsKRW%=PFvxdG1}PtsW^=0-w!6Wye6H!IvY6Wv0nS2xkE ziuDl!K)8=8cBZQ2`}9``{52uBVYuT)J*Tp_EApCvdY}Hc_rOLt9umu%K`i= z9$YUxDJ1_G!u2}6;9i3C>2F{@*|f~sH3YEjSnk6l^?z#BE6q$oReL`M2jl_b`KtCo zba8sX0kHoN+l=05LG@t|@h}Jd88sXHBY6b36m9=kQfK?2|MM2Yf3xxkkv7lo3G=+x zAGVq_kr^KaC=MO)%vIHXyXz*}Zy2A)?e7_;T-^rK)rllJA6GlG%=GHseA%yBMJ~{T zuBvA2N!0^6KDoM#<83~8P*de`LEF11Pa7Wtkdwy=3bCJH>z4?Y+i_i<#0WHy-|5x( PPZ@s-KvnYH9-Q_+`}0Kt literal 11663 zcma)CXMhw%7RIb&7!|W3jS36~R6Mhu5|*H_;)3g_;MhCUOV2Q2t9k}lwM^$CYYt~P z6K2Jnb3ieNOWvJc&Uao;W-oo;tLjOh@~67`)qAh%#d=lUXRMViR&qgcY>>-WD?0BN zGbMSKHqjA7XAqcBL<`)-Y<#RC=2sLxyBphclUM(T}1aQfnEtb}GFgQ2J^;#eCMU z<|}2j&gV>(t(5vI<)B=R5*?+9WRXzoVxskoT0fQE2wZacsITbvXUcvlP#ZWlwQ9Z? zjV%?Us?L|^C1w<7*^Wwpc0;2!O0Nsj1%9!H6>V(PCh4{C9+c;)q%3V_)6zDLqMr1o z7|ysAWHP<^pqPu)W=3tEN+&RstrUwvRwNm^I+9E#gM``wtJ%`1ty19zAy>AwQQL%A z&bDDv*iLM)-Hxl+0#oJus-Fq{a;_NYOr?)=MrwPbc1Ul6(H=iLKcj=*KnLY)poX=t zZb#8sljb8ee6jMP^adafgJNH%8Z4@+5uNGH+UF7l@04B}@M69^U+pYPX<1IT7^z*H z{KdfU%a7%-TWmD8zOE=S9UKyBWO{vY%LFBH4mB!VFTD-`^K_-wr$(=iBBu~Fp;A!Z z7^8NL6}g*HyHk;SK#^2S-5I?eKMK@XDw8g#169lGAeZUsS9=<@mvzj1ITtL-*j4Nu zlJ_{H_KA6a#i)JBdq41A4?Lz38*a2en1*0-fS3u+B5Q-=*Iig0nC+?Mi`9HNN<=|5 zp$?j>4jxd4bg4sylUt4Ys!@lfHwWuR;Q2jpWj|Y0hlgXLaD;fvc%vq8Arr9>57-?u zJkg_94gIR8gFYQZj2uto!3rl)Y&v=^pHm&--Zksjjam8v9U&Mei_BAuni|VI&8QGkT1^6U&=%CA+!ijH>oponr*^pTRhpqd?{juDx9p}p?(9Ppf2DOd9l z+$#o=)d-$ZpcnXnt+>G}`rf=CV&Hf=j9C6<^y+g)GFwn{vtfNzyo?G}Lw9&(y^UM)N&Nb@9Sdkf{PND*Q$j`(v0mz>9v>vCztW}uk zF*l%sF4ars^PJT~qw?fX0Ea_bI9R*qOMS(lBzEUYJa|QK;8$yK1}|02&xe+oMyvgO z!5B54b9RJtYCW-26^$y9eVG>8*J;y-$9k~~#!go8Twpi!MgvwkwW@^O=_5YR7M4@K zYL#CKsx(ZCRUD(5w_;hm%cwr9`NQG0TY_^-;=%gB1PM=tBN49Js3;|ws#eY`RUJ%k z2Z~HroEI~hwmezuv^$c{mwerynIH741%v6WNi+!=Y^qDQ8DGzA_Jw1#CrLRO_+XAfJOp^4PMpIvZ9Q z1EgsVM7`$%s@|gZ=CO?t5_3@lR62H-#bN)F*hS7UY6<5Y#FR6^Z9HZ2sueG*;b;NU zjWq_tm{C2iQpvdq7KT9??pV!+*p@wC_v8`Gy5FNQBd=FiO5UUi>Rfu|PGYm^K}E!w z<)n#M4q?s#M9kq z)Jju2$XJ`H+r+bOH|ma<$1qhn1Fwqrhz7U@(M`rFARy{{fwq}yL zYWZp^U^ciW)bmZkKM&zwFlt3gDx_Xdao&Oyy+D3R+B=$Y1Fq!^lcEOKy(Z;tv79w+k|X_ z>Gy&K0m576_MA?>V|7BmWOl}izWb$GNs#-rNeT6KlSPN9!er(iFDB({bA+e|XQPp$U zKXV%Sc`AIU;q4(DJZyK_Ul{dE!D@5RUx_mBtsClHNhVU+{o1JCaOU4)=3$t51~%Y0 zMWgD$CgOFJoIWG^lK>QChJXYk>kIo?%~tp@oE>5+u~>XOjk zjQTsN{sF3?pqh*+u~(yPo#*w{bYBG(^grF4{}SJdO9S=(5=jTZ3Nm%z2ZM1%Jdu@0 zCIhwmQKhD_Uwvhs z&P&~LN|FNr{C>qUBB)xR*T5h*&drQolX$Xk>$T7|dTq3B61|Q<)+NfuMz1F$$q>7A z==NQ`KF8`?uiiii5{_U)K9ix{E<@~xAvd+p>YJM0NYFP%>$bMg?qzxtQj%@^c7{E^ z6TYOAM8GblHx(9}2@5%->dgf*ln7Y#7JOO_)xAp;qPN6|^(?&=x;Amiky~#~B9tjGbALtpFRgnn6t zV7HrYOOntYX+{+&vna7Z0G2rd52JTN+os2ziRpAGMVqV?{>8n7C7a%b7!-A+@E9dL ztRhDXBt-;>Iz~p41tI8`BTczd(z^oeK$C5+K zayc88%TqTus7UWg6s~tKbd25`ZETux0@;TMSnpS4#O5b%S2%FGTZf$2(~oe-yMw3R zmlWMn3KLO|c{nAo_{;`XDHw5r*82g?NxHxA9wu5Oi9P@T$rSD=s}BTVu|9}kNfxbT zwLTaFbM+x;#fc9^$LO!3jb%AZAcqqHvW(|5S>PN3iu@B{|xR#pDar)3P=osCNHdfoQ0!b4AYCBFw zlHz`|h4gribjJW4=o0{N3Z26-!(+(GF<>PP$Al`5*}1?r`b4yCF`J3mv;+dz3?Z25 zdAo%pn!Oi@^hw00G(I{;_n?iX$qFP#1V|Ieh|Pt(-wJZ>ZXwdWMCq2|YNp(=@VcRx zU$HER^gN6?2}9v9O!Az?(|Lg8&d#mMMri@i#d<#4h6fe-#*|$`$LKQJc%2o2^brB; zRD322Z(6$-tG@`9)qbg7ZVwTf|_6(u53qDgIXAuDl{+f&=MTyQVR*7d5pa8?6NwgI3UR3Oth#*k=$Aqt8X#2twg% zgYY~VXbZyg0krcB=nK&A(ifs_3PP#_{wtL}>Qvc#E+Ps&_hNL6z65RT5tj<&G9o}l zUzd@jP_xPv>dQIUEfLX)b2)AWdi@eF2=o;gaSFPUNUMlPD>V++aX4NDM5Difw#~v< zlS4}=a@kIlUfhbvVy+<;MY$Foqpw37i*mg{mJ$J?+#n-Xl*uvmjU4QjBA%k~Mz$DK z^-TafIc^rRlb1+gDA)TL$-K7!K3Ct$Q8`ic=CxDLZGaWH)WBtH)}pw2#0L$1JHTI* zucZJ^SmcDhgV>{7MDV0rAOx~5!^7x1(Nbr!eEaFauI(-i6u30rSuk;BdMg?wXvTi^ z(05}?38yV?)i0SITd(lsYCnJU9M8qfE%^r>lRCTSVK>0-D_n~9-{X${m>j8m0 zNCas7AsI=EdM4M^^DsxdWzU|eS1e;G^9Vpr-H&o~b=>ALAR7HR+BUa&f*e}hh6{Gv zkYCLEk$#dW^qHs7G5Tq=vCljskY|Yi37+FKSs*?W;`T-_N0-6rHs|N@D)wukd090FtXRe`0CK$=c%>D0Vggi9`33o0O}~sO zXpWtv*2MP+{R$^ty)t7KK40ipi61*IW1RqK<~2NwejRN+!FBRt1{KB|0&GieZvtr5 zJD}e}ze|4;ZBufiW$LG6{Vlv1{cWN^@!#Ro-hDRTmf79Aaa*Rp3p`pEhnu%avJ|Ju zri0r+epOAdBR zmYY?nMSB2>BI{Rxy2$*sP@y)gOFo<=yTpeLCwWt$^&5;E{ac~4rwvfMJo7u!vSe$C zREp3r=kJC7Jz`?jf8aBj-WiTxKTq1wX^$8=uKW?`&Z>VRbHn!Xc0{M^#(7{K1CJV%O`RHRpR*^3oB6z?6>re17`ct%R`SLSz zXt4s>H>~h)A^Z=qu!8^cnN07tvK6p*mhj;W*)8z1p(h6$8)YbE{|7Q>jUj7-17pnI z*hp;UYNb;DIK2jkMu+1NaV%HlNC#W%H34tBuPHR}!cU<{Ucs?&bA`EHi)>i$u8oe- z>!6L*xvoIgBLak3Uq^``OK$2)V&89Nqt_p4W&*kdPIBr8u=8?KzZw{ynxuNK~jb;mW8DhRY<%B!qQfDM` zEM>F_hab4~mUuOKE40>AGH+lp{oS-|Q>jd4IT^5O7BIqu_GkPT2RzXJr z(jw^SI>P~-LcdFoAxd3P5fWa+iy2)(9^IA0jK5kS1V}S!gpV?XbE4gzY)Is z3E}?4!jccbllPX4Uu=r@KLF2%MNpXZ1l5HBN{Xmb3h--LK^xoQFo7IS1PC>rPy6|7mZO~j5c3Tpbt1a)5q1*#Mt2CrM(SjNOhHRdQ)Q&} z2s@2qjU((4LU5!bn9k=)M_4YnafF>A6rE_>Om`H~R&|7xoQN->_?1Y{Boe*xXkpVO zZ0y=+31l`Au=Zp4w1?SFXdVAG$Ztow8*sN-9E)x$w7>qKY=|+^0NWBrzEtYt@V;0d zkG4_hp1?O6V-7k-&qW&><3xdEh=66B#HUTEs4e0td_bK&deDvSkwxF=oItEhfk1lE zlG!{NX|+elv4%bJLQrr7^Z8uK9$a(79z~%jp>4BAnP{JD5BnKcSBOM=^a&d!Z0y># zKq4Yw?NvVQSJs(UuQfoNB^IFT65c{~=`rmI&#sy`SCZKm0mbNkw51W6Ebp?_K(y`}6$fh5IXlb@U}bdAziHt7(*5Ac>;pTS91?~E|j z(IoVlB*JwhAEV`xju2?~EIe>SgVr9e`PDs#KY&7gHej7_OdfpW@9{2H24tvK5ZATU z*;)MsSYljH)~mI1fKZ^S{Q6}V1p{cGZ3zjq9kRbPd7T+^V9 zSADfWu0hKMT+3%N zM*4BU-6EeL$}lOHoBs3EPZGT2V*L~`tq{|xiCyB0$|fOZU;r-sG*FFx2CdCS1=70n z(6j8umF8Ui9AE3XCmh}grR5x9DbRG-=CN!jWWFlAtiW_5kr^(Rhzmas->cbQuj+pp z${)rV`%_({p9h7}FQ83@d*c`}2X|(ZaTdpahPCu?lol)fdyF3^^9%5=3qL>On6iRP zT3a+^f7+10X!VN(^JeEInc!u2Ejr4_d#9aj4#YxFh*%LjJlV jf5VdVc90*@gOYyJ5~O$hf~CqYfsuX-s0B(|>lyohMr;r3 From 8fec5bbc42af73e53350d558973266ad2e07c4ae Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 29 Jun 2016 14:58:01 +0200 Subject: [PATCH 03/50] Added the management of url included arguments --- plugins/webui/interface/controllers/__init__.py | 1 + plugins/webui/interface/controllers/base.py | 4 ++-- plugins/webui/interface/template/api/api_lodel_templates.py | 5 +++++ plugins/webui/interface/urls.py | 3 ++- plugins/webui/templates/index/index.html | 5 ++++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/plugins/webui/interface/controllers/__init__.py b/plugins/webui/interface/controllers/__init__.py index e9ba24f..d806df1 100644 --- a/plugins/webui/interface/controllers/__init__.py +++ b/plugins/webui/interface/controllers/__init__.py @@ -1,2 +1,3 @@ from .base import * from .admin import * +from .document import * diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index dd97035..7ecaaa2 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -6,9 +6,9 @@ from ..template.loader import TemplateLoader # This module contains the web UI controllers that will be called from the web ui class -def get_response(tpl, mimetype='text/html', status_code=200): +def get_response(tpl, tpl_vars={}, mimetype='text/html', status_code=200): loader = TemplateLoader() - response = Response(loader.render_to_response(tpl), mimetype=mimetype) + response = Response(loader.render_to_response(tpl, template_vars=tpl_vars), mimetype=mimetype) response.status_code = status_code return response diff --git a/plugins/webui/interface/template/api/api_lodel_templates.py b/plugins/webui/interface/template/api/api_lodel_templates.py index 2c994bc..950e056 100644 --- a/plugins/webui/interface/template/api/api_lodel_templates.py +++ b/plugins/webui/interface/template/api/api_lodel_templates.py @@ -1,3 +1,8 @@ # -*- coding: utf-8 -*- # Lodel 2 templates API : loaded by default + +class Test(object): + + def ok(self): + return 'ok' \ No newline at end of file diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index e306c53..9f36633 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -5,5 +5,6 @@ urls = ( (r'admin/?$', admin), (r'admin/(.+)$', admin), (r'test/(.+)$', test), - (r'test/?$', test) + (r'test/?$', test), + (r'show/(.+)$', show_document) ) diff --git a/plugins/webui/templates/index/index.html b/plugins/webui/templates/index/index.html index 8da6082..43ab004 100644 --- a/plugins/webui/templates/index/index.html +++ b/plugins/webui/templates/index/index.html @@ -1,3 +1,6 @@ {% extends "base.html" %} {% block title %}Lodel 2 - DASHBOARD{% endblock %} -{% block content %}DASHBOARD{% endblock %} +{% block content %} + DASHBOARD
+ {{ lodel.Test().ok() }} +{% endblock %} From 59ccca35db0e4b5be0de3d1c9ba84973940ab678 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 29 Jun 2016 14:59:35 +0200 Subject: [PATCH 04/50] Added a "Document" controller --- plugins/webui/interface/controllers/document.py | 6 ++++++ plugins/webui/templates/documents/show.html | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 plugins/webui/interface/controllers/document.py create mode 100644 plugins/webui/templates/documents/show.html diff --git a/plugins/webui/interface/controllers/document.py b/plugins/webui/interface/controllers/document.py new file mode 100644 index 0000000..3b427be --- /dev/null +++ b/plugins/webui/interface/controllers/document.py @@ -0,0 +1,6 @@ +from .base import get_response + + +def show_document(request): + template_vars = {'id': request.url_args[0]} + return get_response('documents/show.html', tpl_vars=template_vars) \ No newline at end of file diff --git a/plugins/webui/templates/documents/show.html b/plugins/webui/templates/documents/show.html new file mode 100644 index 0000000..eb3d843 --- /dev/null +++ b/plugins/webui/templates/documents/show.html @@ -0,0 +1,3 @@ +{% extends "base_backend.html" %} +{% block title %}Lodel 2 - Document {{ id }}{% endblock %} +{% block content %}ADMIN{% endblock %} From 69f59baa2c64eaced8fd10445fed4f2b192b3632 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 15:03:02 +0200 Subject: [PATCH 05/50] Bugfix on group activation (in EmClasses all fields were always actives) --- em_test.py | 15 ++++++++++----- examples/em_test.pickle | Bin 11510 -> 11557 bytes lodel/editorial_model/components.py | 14 ++++++++++++++ lodel/editorial_model/exceptions.py | 6 ++++++ lodel/editorial_model/model.py | 12 +++++++----- tests/editorial_model.pickle | Bin 11510 -> 11557 bytes 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/em_test.py b/em_test.py index fc6d9a0..1c449af 100644 --- a/em_test.py +++ b/em_test.py @@ -324,14 +324,16 @@ index_name = index_abstract.new_field( display_name = { 'eng': 'name', 'fre': 'nom'}, - data_handler = 'varchar') + data_handler = 'varchar', + group = index_group) index_value = index_abstract.new_field( 'value', display_name = { 'eng': 'value', 'fre': 'valeur'}, - data_handler = 'varchar') + data_handler = 'varchar', + group = index_group) text.new_field( 'indexes', display_name = { @@ -341,7 +343,8 @@ text.new_field( 'indexes', back_reference = ('Indexabs', 'texts'), allowed_classes = [index_abstract], default = None, - nullable = True) + nullable = True, + group = index_group) index_abstract.new_field( 'texts', display_name = { @@ -349,7 +352,8 @@ index_abstract.new_field( 'texts', 'fre': 'Texte contenant cette index'}, data_handler = 'list', back_reference = ('Text', 'indexes'), - allowed_classes = [text]) + allowed_classes = [text], + group = index_group) index_theme = em.new_class( 'indexTheme', @@ -364,7 +368,8 @@ index_theme_theme = index_abstract.new_field( 'theme', display_name = { 'eng': 'theme'}, - data_handler = 'varchar') + data_handler = 'varchar', + group = index_group) #em.save('xmlfile', filename = 'examples/em_test.xml') pickle_file = 'examples/em_test.pickle' diff --git a/examples/em_test.pickle b/examples/em_test.pickle index 723e987f9f61d487259f7bb1511a8881e9ced2d9..96b31daddce6c575633cf22331bd3eaf5eed4b0d 100644 GIT binary patch literal 11557 zcmb7K37A|(@egNUxCaQx`8XmIlPn5BQDA{&6B0<4unA!h!uV$9ZF(kiY}cDfvS16S zi5nHf3%o_eBNzol1P@S*fbl@_z!Oir@x&9a|L<4*-p<>R@bUk?`Cj*{uCA`CuCA`C zH&^XaX|$_RV<4*5I&GZFh2Z=R)z&Y15{arVf`%l|~rH zQEYc{cGp6251`aq)o8=n<=F1FgLNwH=2*KGwK{QbVRHfJ=j`rSWxBI_coJbb?nqea z*gYqT2kELFuT-jroiJ{9r4rd(ad!+=yUphKNp`Q|-h8RWV~udU)C!xC-8)&n+o?6; zfo20FYppf8WsMcSWB0+D`#QUy(peWax)5W3XAdau0#Z?Hjm;PLMGvAVGrhdX;j!R)!&l*N|a5$kJ>r0$l8nw&ysM1-{Ei0)dRajjOvPsSk6c2`6Q)oi#ov;PdI?)V( z^JhEz9B+@UZle*F8<9O}!pxpfh18nOZbxA!Z!YcyN@G%MhB97S8;#p}n~R4~okL)0 zaUyUjlr`NZt=^vE>~ldUF6MyL3^$Y-u(pn|&pYp|;;sO7TQzG>-P|oFyZn4-U%*{H ztzd%UEFh$Egso0cjetqlTl3JBsv6+vxM7xoObfnhbF zZmntu%}kZiM2)dhC)&`lXR5WGf$TsI;5G(0sdqXN%@LWn0wjhKh%&7(3cf zyRci1i~9g)tSeDz(t|A8Yz9@&YVI`t$ev@)94<~LYACuPi&xtvW_s8yM;q(=mC?(7A{JODkHI?2F@;jv%g?8<^U)Zjc{SkTkF z%GrzjX;xCzXf*6LI<}aseX+AIU5|5NVCg0?WCH^>-efm8J5H3#F-q$)Lk5PD zmH7(g=*7-D<>(~_f?jD>g$Y|bb}^Gmg`cUl*5>S05a23o!PU;bv`{=8dMJ&giZ7M= z_4zW|!ppJHM!RvuZlb7^S*3ji+8C0n&1Z@9?dHUARvnw2eI;dm6?TDF<8rlb`|5ND z2F(>Pd^4mzrU91iHQjR8OrDU8Ra{F%oQl_gziv4+#o;b?X_a{jkDF1)VmR1PDkf*I zgG#Q0N?z;i>k8^q=NQzNR9DrJyl%hRl$J8B<$L^!{d4beTTE}RCBmd z?M_9XG|+cB`|kfS(DyuYNqN6H*^&?HA>8Wh zhj0id5DTP-@WamDLQ1zna^4~<>9}u8C5F5Bh`-FR&7E2Ym)Y%V`5$%m4i)udDwE&o ztxvVn>a$DbFphGoxXmGM(>t-zcVeUOa`xk1H=BEh_Y>H$*zoXTzcT0dlg@sM9N*1* zP5nl@8_xxEaH;n|3T_TuiRbpyK2TYK!+pEoJ8Ea0XTW|2hnm3}%^FT?ERvYf#l0%x zXPw=qB7Ux5{Mlcwo$v!{>gBSR`YI?h~U+8mpUv&0MEj=C_A7~x|El-#4>|j_zFqpdv)|y{Z$dr_z<{Jvi|oUm&V%&p-_kQ_9!`ANx1IeC zr+gPvc$bev2y!b?&~8)%oj&d_+0OV_WWPr`IJw_f<{xqP2Yn3u(Agi6+K)kvULpw; zev(=Lrv;5@u+LGcJI2O7s*3!Xvp-iw{-OYL*W0$$USDdrQnX)A&`&(_G_7X{lvmc8 zQO^Df=JPA4@Yl}%rgyZm3-}PjKBoThw|dxc{(m`ZGGM4%v@po7Y3N zfB`$gNygui1Q?i9LS30-oM3P$l8cCrA`$KwQqkZ_jz!nWaRh+;@oe+OBZ0asthLgV zq%8qLpI~7#v9DNW0+GutUM_6VP!|z;mj*l36W&b269s8sKP1n`H8(M3e!JdQnb9*U7U9z%tKan=c*+Q5J#!P81^}UlSm+7;DFo zoP^;-fRoWhfTX`Vg)rOU{wUEryf`@p&pwHss{_v?E|xl#ZC*`%VXGtK@_Ya?61;%p zDgkQ_aQ8qtjWEym>F7E+g8&d4WSiH}vv*01@{+(I*A!7t)0sd^_&!xVphaS zGREMcL7r$O-cr@GuS zLGTKcZ{$KwJ+aOPYpg=!LPdN6~Sz22b5m zL--t=&$%XvR;8vGb;Y1l?ZvFJme^DCO=&24lOxb}OQ!`I#Vv;#TJ5H^IhI$37ELlV z2B5F7U_X>Q^{xn6&Hc)#1%eY%da%7%J7sg5xp$Lv@Z#f9>9V`^|7(X!YcULQ9p|1{ zX9LZwN8@Azo{1rjb9gHZ@p5!V7>is*1fQHSZ;q;Zo5pfA;6BDjFfA{|o0FF*5tdEl<(x*xx=}|q=}0yKl2_=! z1o5!`WQ+s)jN8Knlp)(@ynusYS3E==5~Gv9VZ{gQ@8UL!Y8*d^%b`& z(rt>==PN$K34Olec18avMO!8yI^OE>o43xt=0iGg>vYdL4 zBsOEF(}5i)Nw3^RTK+=)IJ!(QeBwA|mBuqefka+HhKEJ^WfMEjPQiqF9g#4+c z=QEN|kxafgJDKf$bcm^N?B%GlJ_3oj-Hh;QCqT_R2z8#^jcJr&@oKq;6dq!*v{62d z{)l{r5Fc#Zi>{N;5&&MevGrNcp639WbxJCwXkB}n6_4eI>5M+Mf231> z%u%rY6P>z)LbCi+aUV@^f5vu7MVZBeQG6y+k$%o$YWf#C>z8<{rhlcKlP9#;rJvYJ z4P4LiYrt2_Z#b#}f~p~6Ddj1nO(bt&oP)_$LR|5WVLGmOHdy($Xq^0xBpE)iz;N<} z?i;e^-z(U|x*D?k4}PATKVY;@X7pAmjkX2FiW1mF4kUjhoT(e zD3<9&@}F?0T<5Xufe}@kk6Z@Lz3L3=i4S0vQ9pix$etuZ!_1-MWG_6`F!$Du_ZRw= z3!krK9{_c$dAr22FJ3pvet0JF=>F_Z-?6?9z_^nW)14X^MM#f_nzr ztOxgcr(p~#;+c5r**J@sb5ds0aPVwJny*NGcCmmH`WPKj^o1M&ql?()>)iKLX?^>y zY13G@+^E5~^N$j84(E`)#ps}-f~T@~F5$k!n8BCx0M=`!(%Yn^fNhdxcrr!t+VAsm z!x%)B1W%mV)v_F&DM$1I0@8@RPEuKSHiCE5P6&mRE7|%)Z+TXd3jyzmt#W0KY7*7* zb5Mr$Rip(hct8Br|cl>y9}>| zx~@lUm++i%~mcWXjIE-*pm!lwoZv9+d?+>PF!j%B|Z(MpYCY8vmNNq-)d4k@gUBuNRNyczB z#+Yao{OcI!Ubz6}03(PMJ)>lfo6f5d?6N;NKTXKD3Dx2kR=Czdl|8h?5DzA;@O7 z`C@<-QA2&QizD{`6GQCqO5j4JFgTo&SK-CiQBluB(e2eF#Pf0uI!>lEX)iqYpeUq|dd+k3sDzkwrQ_>FAybuQ=6EN^>VT#o~4YI@P?zxm{PB9o~b z&~fr6Je8?86F!xxw<*cf~>6=b@CzNK)w&7rMdGjEx!EXEsi;HCF0gfS=H5f!38-#{DGW`8t>Hv8l|YyXW1Q*)4Go zp8}?nyEzTy?$PO5Dd`K!ko`1KI>0H8!iotr)K1F`@@Y(?QR9yL3@I=hF*lo4byjq= zqF6tMZtRizIt;5@_bJeJA0KWt*BYaDgWm1+0Zu!CkJI>=$GH!ihs-(V@UF_HnbWm><(R*HUMXznE4cUq+r0iub|tvTxH|ohvV0Na(T2<>UKjXLjbjx3ABenLTfVQmt8zYt!O# zrPY*5u~w+-yFRnC($Tpb%-RW4&bRA1yM8Xe*@Oub%5hSX%5baFY}k}eyH%+r)9SUP zC6&hF?A+RX-?1A4bt7jt&TkCNCB<4hPV6SmZkpc!?{Q%+}P+-N1)S@jc0 zA#1k;mlK`cDyM9ZZHWuTLD&^KxBHLgH^QLm-A*-B+X2oVm@`}Fvlt&NCc!9nnt`?s z%5Q_wj#;~O4p!7doIMn%=3v4emNQ$JiTSO@APmQnz{?I-@FSc(lHi9E{3zp9|0ZYO zOw}KqgYIVld3K{E&2qaGL-}!3YBoyoa4TvK^>~-38s&=ZmT5|IKm_3$Nv()Th~idh zihYZ^!4PcUmp>CUXEYnF3X~Yt;>24PZ4%3pBF5I<7}bi=VmL4YB0_LPo_+(pj_8Sg zEpCUefxi}BrcIkR#lE$j44Rz{jQln=z%kAqs|GkuU#B}eLtkf_$wjmOsF`XGfVyc} za8v~E@y?z=U7QG2?1uS)c(_)CBAT^wq_88N`PRsAY-iI2scpER`c0uQREcZl z#Gd5r$@xt&(=q#;Rr$^FUalk{I8ta7>#?1yp5O26Dg5L-lQFY;oH|e}7hA=o*_Kjl zPgR!7@ldf{YuSPJU=ZdA2*a$xa4H0Q&kq7EaQ5w_ej1HC6+n>4hf-9GYL&*>(O}$K z8pn+&Y1U%|byRGWF{Pn-y6MXw8gSOGVf@8Wy8$$S<3;!ucWed2bC#H~&C?`M!#i@C zwgOjYypa$*o;u9hcOo**bar7bzcm#HH53eZtHt8AcUFEwj8g<#fJLDMbA~2_F`!LN zvWZ>fY%xC(2*p~hxfIDrvkUUb;6htcFDW}4tCtM*dWktBC~~p0hKj7bif4pqP?G8y zRoIczpPf@L7;4vQYVn$(RCQ+?IdhgO260g;wrtb;q^TJ&I-Ju~puSY7Rg#vq3$5fd zZw^%?X(_ElNh4kP*H*0am3qD1Dh}3=b62(V+mF{A5@M@}c(zM|C2DbTxH63@3(8IO zCCPfmvUVvLUgqpbF25y+6^5EpFSZJPk+Sd7T((aV?UUGdoAxSYsRB2VMzLm>D@RBX zO`udt)~S~cOQl|vk;2*Wh&^Xijo5BftUY%$zazge6TF-l3|%P7;&vUbme}*0JwJy} znB~T`RX_FOvO*2(U(47FPCiy?`}p%ZyU>WT(}40-A@5n$9yHta>tG?StF`P3Q#L*h zS33J%8h8~Wg|T~lYPC^>0pqK`Sw}Xk57*+By$JrTu|LM!O0~qUHcRoHL@j->vzO4) zOf^f2QZhxcmzt^l@YRHtzRdhzb|`Q`$e!kLv-WaW;|gc5%$ajXO?%WVA2sKU8tCRK z109$kqUlO?wX^S|RPU!$TzHS~IM4?m78#o-Yu7ZIb^Aev>}qp)dr+-ftW}DMy+-Bu zkh34A9IQC7p4w}@4A)SG>v9G$biFAT@p&`Q-+n!rBp!;fmX_iqJD=@aUGEvmG?{OBv|aY^!a4e&7`b%e8T1O2$cHTJ3t+^Pi0A^+_oR1sk%n~xU-+2 z2%p3fat%|@YI6hRYpLx%?47a=aQ0|NvC4HfH^8ZywAx(-FpQz12V-J^_s+1anqsc5P>adWU5ms<1Ng9AAEwNY zz&GZB&*SKibdHk5MXZLYAz2-V>HL(2Gn~Yt82-xI{O&E_c(RT0%T5niYg{bf@Y#hS2a&S?^6JjYKzX&<51BM&A^eAiha_X z`3en!ovH*oOwpY`H{0fruU~(JVPmdk~8ac^_}O7;}^_REA5Nq@TdRpG&Tq8 zbJo5Dulkv@KTo|%^VBaiPyKSh{;Hd&emyo%ncK{Zx+=j3o(l`nZ=C%t<^COgfMLai z6qiGGNbK)nbyl68dDh6a%Gxz3W&Yre`x1=H^$Q+@;udlEvTEXw&i*On0Rw%Tm#K+A z=Q>GS6T)Ad{c9?NUt0$HxxD-hV9B_=kn;O?Xa7Nd|C#0m1hN0{zrZOsHS?S8rI%@%j18*qpXKP{k-NZSs$-XHc-g1i=b?nLUyCLzpGf; zNHI4i&?ZhcQ3@Gd>lRQ?vMFc!(gBGjgMlu;Tr0!wQ?dj_Ehn3y<79I@gO_1#uj(u~ z-$IAisWoPEUybd6Y>7erhDM!C#Oq4g3Qzc-Y|VC3cO^A&EZGKwPPWA}H4WWMw)3zn zWP5Z5WCy;c>!IwZ(7j8dxvk2tjPo|x31d!nCNh+=i=t(;E>Mo+M0Vv|UzJVA!P;id zD(|kc8^)dNP9PB2gKfq<%{V;O=pF?;X;q-I?5WTZo?~R0M6~CMD`YQp24ru(c4V2X z&|_sW&!&Qe`c3u$l#_jl2|o5yoQ!6<5I($oq_{v5`s7@2Lc}!ou)(&!gGuk4kmTfHgX6$19B)|J6br5Z_7s$ z7C63qp>H1(*gPDwPL3c9*gO&~qmjoCW3q=FMF_uIr}@LD4|x-2Q~^~oi5$X&EKS74 zn~6hbKN=k;Z^1JSQtY~_I=#qAAHjT#zEuI=rhwyO^cX^ojn7nuV-@Q-0zii8ik;EQ z+p`)eH#0cjm){oL4S>6_;00pe?H&s8bgISup_ECfFMm=X@QSl0Ppra# zhp*IQY=co*_ntZhTJ31)&Z-d&GyFO_WW-6ELs)8?a zGOTdx)W%S0`X!5Df7+twl_GdwDGBl6;VrggzKxEPC3vz5lcnfXDNqmpbe6 z7$I8kN8ZIbitui9oGj-&>MaHtS=MQ=><9)f&Oz(H))Q*yD(ZQP+7oK$cVJh@1?UgR zg?M(O?LB-OA8l2N7hHD*x=vPd06z9!wi#ddc?GS)2s8QWkn)UfOk`BiF2a+N^z1)m zHA(0e#9$vG7c1Z;3K-H{*iFc#DP%X*aYG@ODaz%X1xr`3%^1H4=;i!M1-mMMU5yse zVNmazZUv7NkSKz}%Xm{D77T@?@{lwsmS-A#OAjXH#IQcN1 zVFA;#1)j*1aaL^PTFmqtO_r3wKky=Y2#lLB*kAQjItzbQ zN5M8q8G3c70Mwm=#c#&2lUwkldT(XxYk+>FLYz1Iko*Y7z1=Ae$auSd6faJ0!*jgd zZ^u}V-Pb7K9SS(k?suk; z&DPg$^MjlAYwRm<) zriJnlUb~+3FyCI04=8ZZ?jz_rd6WY%!dKb)FqzSn=P``FN=|rOQJ=tbyl*^7GTof; zlmdQD0mu2q*Hg%GzVQu3`6g$<);hKw-{|4~X$5;GfIW-$b$#Po3jSOG|2ErDO!Zjz zI~eZz$8$afaglglvA>I_y2iiKYbk+1@1^kHu zj#JYMDdadcy{ITZ!>OzMj!<1TQIJ=AIQhLI{(&%H_+_@4>ZWMazj)AErK@Z7{1F`| zf5Mag#nTF|o;r=_`7^=RX{p!~De@N#R~bVq<*#@mT6B-~H}swS9nYRn`3GLRq4H0@ zrJ+(Ka+*wg`2QD%o&1}i;Qv2teKMWb^`J!li*YXy4jy{eqzUU2dp$gfy*}GaHH|K< zHsckt0fq-;Lr(f?b0c(}Y|H^*ZNkNL7IU6^iyc6cV&J@`K zbSSLWgInSyXQrF|aEHK{nTU5MTj?kYtF6)Ly-LzeKd;S3WE)QD@w05JNZWA$d~VM+ zqsQRgt4CbC606IH>;N#bftqqhVstj+JK+txd5(eFE^Pe?$1MHst{5Pms^3h80d~X4 zfb32{Z-70}b+RW1Kp|r5b7WU`ek*(#hyL*@pw5 zyf52~ZsU%}r7`Mq+}1CSa9KXwgnjqJbdWGd$c}_l@aANHj)BTlwi&(W>KqU1Zy8be z{s92!NE|9$UjFi5iU4vTX?PZ=q3h%z4uJTPEBQuFi4bDOb8+kmbL2i>c->TGOIe{=|(Og<+Hd2bS zF@?LLH+K6r6W>^XZ)D{ppn;8((Kwl-MA+u)l~S#eBx143(&!#0G`lPwMRJ$0p*;=sVaHG zl`2)CB!PLlV&)ZdoN({JAcga2DvI8@@mjSbKrRqNxhMv@VBNs=*UVDNFY0?WJ^kRoLFTJYIYuCmX{ds z_%O6m4c(ql8B#in2?F5^+f05Rc;azUf?r`;dJ*B{#sB3s=zpUL$)*B?v2jwx2#y9w z2n1_vGkW%RB7TvQdVpVDr5w7zrU$PL3^-{L0f@tF{qFV@y)hDt5q>Hh!|H!86OsBD zHhPYYj447ip9B(gowPUrdTqA;myu3p)rF8(;C1|_gG;cuSTd0w6Z_nV!{Q}C<43VF zEk)O>RexHOWu!<8kD%k^U7Uu6{k>#WXBRnnH=%stwOrwx!i_7u&LPy8!plqwdFNck zI*$Ml<9x-=c=COkbioaN9Fhw#(>W;g2l57WfLusSviTl#oUBj+9X53qY_24fXY;)Z zw@Ts0u{lbpS7-Ag#ac}Ouz4}tOqJ9%B(yl3$cl@cT%xd-;z@;}IOHXR&VrN6bQnh~ zm!rc|sCDLPy@6OMS6~E@twrIL=sUSefjyVHJHOf^t&sPjGa&EhYv(xg1AOaLiApVm zdaCRX0>a5Pgo6|xLW^QsS4;*U{@V-J{pDzI1VK>=|L@6%iP5KZjvhybvp1f}mEx9O ztm3*vt_7I45ihlPAkF(@xsKRW%=PFvxdG1}PtsW^=0-w!6Wye6H!IvY6Wv0nS2xkE ziuDl!K)8=8cBZQ2`}9``{52uBVYuT)J*Tp_EApCvdY}Hc_rOLt9umu%K`i= z9$YUxDJ1_G!u2}6;9i3C>2F{@*|f~sH3YEjSnk6l^?z#BE6q$oReL`M2jl_b`KtCo zba8sX0kHoN+l=05LG@t|@h}Jd88sXHBY6b36m9=kQfK?2|MM2Yf3xxkkv7lo3G=+x zAGVq_kr^KaC=MO)%vIHXyXz*}Zy2A)?e7_;T-^rK)rllJA6GlG%=GHseA%yBMJ~{T zuBvA2N!0^6KDoM#<83~8P*de`LEF11Pa7Wtkdwy=3bCJH>z4?Y+i_i<#0WHy-|5x( PPZ@s-KvnYH9-Q_+`}0Kt diff --git a/lodel/editorial_model/components.py b/lodel/editorial_model/components.py index 000ff2c..2e40f3c 100644 --- a/lodel/editorial_model/components.py +++ b/lodel/editorial_model/components.py @@ -138,6 +138,15 @@ class EmClass(EmComponent): return list(fields.values()) if uid is None else fields[uid] except KeyError: raise EditorialModelError("No such EmField '%s'" % uid) + + ##@brief Keep in __fields only fields contained in active groups + def _set_active_fields(self, active_groups): + active_fields = [] + for grp_name, agrp in active_groups.items(): + active_fields += [ emc for emc in agrp.components() + if isinstance(emc, EmField)] + self.__fields = { fname:fdh for fname, fdh in self.__fields.items() + if fdh in active_fields } ##@brief Add a field to the EmClass # @param emfield EmField : an EmField instance @@ -145,6 +154,7 @@ class EmClass(EmComponent): # @throw EditorialModelException if an EmField with same uid allready in this EmClass (overwritting allowed from parents) # @todo End the override checks (needs methods in data_handlers) def add_field(self, emfield): + assert_edit() if emfield.uid in self.__fields: raise EditorialModelError("Duplicated uid '%s' for EmField in this class ( %s )" % (emfield.uid, self)) # Incomplete field override check @@ -161,6 +171,7 @@ class EmClass(EmComponent): # @param uid str : the EmField uniq id # @param **field_kwargs : EmField constructor parameters ( see @ref EmField.__init__() ) def new_field(self, uid, data_handler, **field_kwargs): + assert_edit() return self.add_field(EmField(uid, data_handler, **field_kwargs)) def d_hash(self): @@ -317,6 +328,7 @@ class EmGroup(object): ##@brief Add components in a group # @param components list : EmComponent instances list def add_components(self, components): + assert_edit() for component in components: if isinstance(component, EmField): if component._emclass is None: @@ -328,6 +340,7 @@ class EmGroup(object): ##@brief Add a dependencie # @param em_group EmGroup|iterable : an EmGroup instance or list of instance def add_dependencie(self, grp): + assert_edit() try: for group in grp: self.add_dependencie(group) @@ -345,6 +358,7 @@ class EmGroup(object): # @param em_group EmGroup|iterable : an EmGroup instance or list of instance # Useless ??? def add_applicant(self, grp): + assert_edit() try: for group in grp: self.add_applicant(group) diff --git a/lodel/editorial_model/exceptions.py b/lodel/editorial_model/exceptions.py index 4685776..33bb327 100644 --- a/lodel/editorial_model/exceptions.py +++ b/lodel/editorial_model/exceptions.py @@ -3,3 +3,9 @@ class EditorialModelError(Exception): pass + +def assert_edit(): + from lodel import Settings + if not Settings.editorialmodel.editormode: + raise EditorialModelError("EM is readonly : editormode is OFF") + diff --git a/lodel/editorial_model/model.py b/lodel/editorial_model/model.py index e9edde0..bf40ead 100644 --- a/lodel/editorial_model/model.py +++ b/lodel/editorial_model/model.py @@ -148,6 +148,8 @@ class EditorialModel(object): raise RuntimeError("No groups activated, abording...") if len(self.__active_classes) == 0: raise RuntimeError("No active class found. Abording") + for clsname, acls in self.__active_classes.items(): + acls._set_active_fields(self.__active_groups) ##@brief EmField getter # @param uid str : An EmField uid represented by "CLASSUID.FIELDUID" @@ -174,7 +176,7 @@ class EditorialModel(object): # @param emclass EmClass : the EmClass instance to add # @return emclass def add_class(self, emclass): - self.raise_if_ro() + assert_edit()() if not isinstance(emclass, EmClass): raise ValueError(" expected but got %s " % type(emclass)) if emclass.uid in self.classes(): @@ -186,7 +188,7 @@ class EditorialModel(object): # @param emgroup EmGroup : the EmGroup instance to add # @return emgroup def add_group(self, emgroup): - self.raise_if_ro() + assert_edit()() if not isinstance(emgroup, EmGroup): raise ValueError(" expected but got %s" % type(emgroup)) if emgroup.uid in self.groups(): @@ -199,7 +201,7 @@ class EditorialModel(object): #@param **kwargs : EmClass constructor options ( # see @ref lodel.editorial_model.component.EmClass.__init__() ) def new_class(self, uid, **kwargs): - self.raise_if_ro() + assert_edit()() return self.add_class(EmClass(uid, **kwargs)) ##@brief Add a new EmGroup to the editorial model @@ -207,14 +209,14 @@ class EditorialModel(object): #@param *kwargs : EmGroup constructor keywords arguments ( # see @ref lodel.editorial_model.component.EmGroup.__init__() ) def new_group(self, uid, **kwargs): - self.raise_if_ro() + assert_edit()() return self.add_group(EmGroup(uid, **kwargs)) ##@brief Save a model # @param translator module : The translator module to use # @param **translator_args def save(self, translator, **translator_kwargs): - self.raise_if_ro() + assert_edit()() if isinstance(translator, str): translator = self.translator_from_name(translator) return translator.save(self, **translator_kwargs) diff --git a/tests/editorial_model.pickle b/tests/editorial_model.pickle index 723e987f9f61d487259f7bb1511a8881e9ced2d9..96b31daddce6c575633cf22331bd3eaf5eed4b0d 100644 GIT binary patch literal 11557 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 PPZ@s-KvnYH9-Q_+`}0Kt From a4a3ce32182c61231619766425a1c82835feca36 Mon Sep 17 00:00:00 2001 From: prieto Date: Wed, 29 Jun 2016 15:04:58 +0200 Subject: [PATCH 06/50] Add the route for list_classes --- plugins/webui/interface/urls.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index 9f36633..d598eb3 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -7,4 +7,6 @@ urls = ( (r'test/(.+)$', test), (r'test/?$', test), (r'show/(.+)$', show_document) + (r'list_classes/(.+)$', list_classes), + (r'list_classes/?$', list_classes), ) From f09dd86d94f12822c8fedac10172e2a1478b6779 Mon Sep 17 00:00:00 2001 From: prieto Date: Wed, 29 Jun 2016 15:18:14 +0200 Subject: [PATCH 07/50] Add listing files --- plugins/webui/interface/controllers/base.py | 7 +------ plugins/webui/interface/controllers/listing.py | 7 +++++++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 plugins/webui/interface/controllers/listing.py diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index 7ecaaa2..c898e21 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -23,9 +23,4 @@ def not_found(request): def test(request): return get_response('test.html') - - -def list_classes(request): - # TODO Add the method to get the classes list - - return get_response('list_classes.html') + diff --git a/plugins/webui/interface/controllers/listing.py b/plugins/webui/interface/controllers/listing.py new file mode 100644 index 0000000..4cccf85 --- /dev/null +++ b/plugins/webui/interface/controllers/listing.py @@ -0,0 +1,7 @@ +from .base import get_response + +def list_classes(request): + # TODO Add the method to get the classes list + template_vars = {'id': request.url_args[0]} + + return get_response('listing/list_classes.html') \ No newline at end of file From 28f45b080fd21e8a6eb51906d893b0af8916f4e8 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 15:38:14 +0200 Subject: [PATCH 08/50] Bugfixes on model and for test fixing --- lodel/editorial_model/exceptions.py | 5 ++++- lodel/editorial_model/model.py | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lodel/editorial_model/exceptions.py b/lodel/editorial_model/exceptions.py index 33bb327..16511e5 100644 --- a/lodel/editorial_model/exceptions.py +++ b/lodel/editorial_model/exceptions.py @@ -5,7 +5,10 @@ class EditorialModelError(Exception): def assert_edit(): - from lodel import Settings + try: + from lodel import Settings + except ImportError: #Very dirty, but don't know how to fix the tests + return if not Settings.editorialmodel.editormode: raise EditorialModelError("EM is readonly : editormode is OFF") diff --git a/lodel/editorial_model/model.py b/lodel/editorial_model/model.py index bf40ead..9b36d55 100644 --- a/lodel/editorial_model/model.py +++ b/lodel/editorial_model/model.py @@ -176,7 +176,7 @@ class EditorialModel(object): # @param emclass EmClass : the EmClass instance to add # @return emclass def add_class(self, emclass): - assert_edit()() + assert_edit() if not isinstance(emclass, EmClass): raise ValueError(" expected but got %s " % type(emclass)) if emclass.uid in self.classes(): @@ -188,7 +188,7 @@ class EditorialModel(object): # @param emgroup EmGroup : the EmGroup instance to add # @return emgroup def add_group(self, emgroup): - assert_edit()() + assert_edit() if not isinstance(emgroup, EmGroup): raise ValueError(" expected but got %s" % type(emgroup)) if emgroup.uid in self.groups(): @@ -201,7 +201,7 @@ class EditorialModel(object): #@param **kwargs : EmClass constructor options ( # see @ref lodel.editorial_model.component.EmClass.__init__() ) def new_class(self, uid, **kwargs): - assert_edit()() + assert_edit() return self.add_class(EmClass(uid, **kwargs)) ##@brief Add a new EmGroup to the editorial model @@ -209,14 +209,14 @@ class EditorialModel(object): #@param *kwargs : EmGroup constructor keywords arguments ( # see @ref lodel.editorial_model.component.EmGroup.__init__() ) def new_group(self, uid, **kwargs): - assert_edit()() + assert_edit() return self.add_group(EmGroup(uid, **kwargs)) ##@brief Save a model # @param translator module : The translator module to use # @param **translator_args def save(self, translator, **translator_kwargs): - assert_edit()() + assert_edit() if isinstance(translator, str): translator = self.translator_from_name(translator) return translator.save(self, **translator_kwargs) From 37d3e4ddac68827268d914259dd9c41c946bb863 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 15:42:23 +0200 Subject: [PATCH 09/50] Bugfixes in urls and controllers --- plugins/webui/interface/controllers/__init__.py | 2 ++ plugins/webui/interface/urls.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/webui/interface/controllers/__init__.py b/plugins/webui/interface/controllers/__init__.py index d806df1..adb65d6 100644 --- a/plugins/webui/interface/controllers/__init__.py +++ b/plugins/webui/interface/controllers/__init__.py @@ -1,3 +1,5 @@ from .base import * from .admin import * from .document import * +from .listing import * + diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index d598eb3..b920b43 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -6,7 +6,7 @@ urls = ( (r'admin/(.+)$', admin), (r'test/(.+)$', test), (r'test/?$', test), - (r'show/(.+)$', show_document) + (r'show/(.+)$', show_document), (r'list_classes/(.+)$', list_classes), (r'list_classes/?$', list_classes), ) From c81ae7800544a2f5b24ddb5d88efea2bf4146042 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 29 Jun 2016 16:06:30 +0200 Subject: [PATCH 10/50] Changed the url regular expression ruling method --- plugins/webui/interface/router.py | 9 +++++++-- plugins/webui/interface/urls.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/webui/interface/router.py b/plugins/webui/interface/router.py index a09dbd6..57666ca 100644 --- a/plugins/webui/interface/router.py +++ b/plugins/webui/interface/router.py @@ -26,9 +26,14 @@ def get_controller(request): # Returning the right controller to call for regex, callback in url_rules: - match = re.search(regex, request.PATH) + p = re.compile(regex) + m = p.search(request.PATH) + if m is not None: + request.url_args = m.groups() + return callback + '''match = re.search(regex, request.PATH) if match is not None: request.url_args = match.groups() return callback - + ''' return not_found diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index b920b43..e8dbeca 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -6,7 +6,7 @@ urls = ( (r'admin/(.+)$', admin), (r'test/(.+)$', test), (r'test/?$', test), - (r'show/(.+)$', show_document), + (r'show/(?P.*)$', show_document), (r'list_classes/(.+)$', list_classes), (r'list_classes/?$', list_classes), ) From d05fa7ad788a6d4d8c81b8341bc1229e5d312aac Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 29 Jun 2016 16:19:01 +0200 Subject: [PATCH 11/50] Added an example to use the GET and URL parameters --- plugins/webui/interface/controllers/base.py | 5 +++++ plugins/webui/interface/controllers/document.py | 2 +- plugins/webui/interface/router.py | 2 +- plugins/webui/interface/urls.py | 2 +- plugins/webui/templates/test.html | 7 +++++++ 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index c898e21..370c4c1 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -22,5 +22,10 @@ def not_found(request): def test(request): + template_vars = { + 'id': request.url_args['id'], + 'params': request.GET + } + return get_response('test.html', tpl_vars=template_vars) return get_response('test.html') diff --git a/plugins/webui/interface/controllers/document.py b/plugins/webui/interface/controllers/document.py index 3b427be..3605327 100644 --- a/plugins/webui/interface/controllers/document.py +++ b/plugins/webui/interface/controllers/document.py @@ -2,5 +2,5 @@ from .base import get_response def show_document(request): - template_vars = {'id': request.url_args[0]} + template_vars = {'id': request.url_args['id']} return get_response('documents/show.html', tpl_vars=template_vars) \ No newline at end of file diff --git a/plugins/webui/interface/router.py b/plugins/webui/interface/router.py index 57666ca..660d10f 100644 --- a/plugins/webui/interface/router.py +++ b/plugins/webui/interface/router.py @@ -29,7 +29,7 @@ def get_controller(request): p = re.compile(regex) m = p.search(request.PATH) if m is not None: - request.url_args = m.groups() + request.url_args = m.groupdict() return callback '''match = re.search(regex, request.PATH) if match is not None: diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index e8dbeca..dfe5745 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -4,7 +4,7 @@ urls = ( (r'^$', index), (r'admin/?$', admin), (r'admin/(.+)$', admin), - (r'test/(.+)$', test), + (r'test/(?P.*)$', test), (r'test/?$', test), (r'show/(?P.*)$', show_document), (r'list_classes/(.+)$', list_classes), diff --git a/plugins/webui/templates/test.html b/plugins/webui/templates/test.html index e318c89..4f14a13 100644 --- a/plugins/webui/templates/test.html +++ b/plugins/webui/templates/test.html @@ -1,6 +1,13 @@ + URL arg : id = {{ id }}
+ GET values :
+
    + {% for argument_name, argument_value in params.items() %} +
  • {{argument_name}} = {{ argument_value }}
  • + {% endfor %} +


From dd8dc980b82cbe99d161766094d19d1580d5371d Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 29 Jun 2016 16:16:58 +0200 Subject: [PATCH 12/50] Generalisation of root url concept - creating a function in webui/main.py root_url() that returns the root url without trailing / - use this function in router and template/loader --- plugins/webui/interface/router.py | 14 +++++--------- plugins/webui/interface/template/loader.py | 9 +++++++++ plugins/webui/interface/urls.py | 17 +++++++++-------- plugins/webui/main.py | 5 +++++ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/plugins/webui/interface/router.py b/plugins/webui/interface/router.py index 660d10f..da0c78a 100644 --- a/plugins/webui/interface/router.py +++ b/plugins/webui/interface/router.py @@ -3,19 +3,15 @@ import re from .controllers import * from .urls import urls +from ..main import root_url from lodel.settings import Settings - def format_url_rule(url_rule): - if url_rule == '^$': - return "^%s$" % Settings.sitename - - formatted_rule = '' if url_rule.startswith('^'): - formatted_rule += "^" - - formatted_rule += "%s/%s" % (Settings.sitename, url_rule) - return formatted_rule + res = url_rule.replace('^', '^'+root_url()) + else: + res = root_url()+'.*'+url_rule + return res def get_controller(request): diff --git a/plugins/webui/interface/template/loader.py b/plugins/webui/interface/template/loader.py index 8ceb32a..a1ca740 100644 --- a/plugins/webui/interface/template/loader.py +++ b/plugins/webui/interface/template/loader.py @@ -2,9 +2,13 @@ import jinja2 import os +from lodel.settings import Settings +import leapi_dyncode + import settings from .api import api_lodel_templates from .exceptions.not_allowed_custom_api_key_error import NotAllowedCustomAPIKeyError +from ...main import root_url from ...main import PLUGIN_PATH TEMPLATE_PATH = os.path.realpath(os.path.join(PLUGIN_PATH, 'templates/')) @@ -39,6 +43,11 @@ class TemplateLoader(object): # lodel2 default api is loaded # TODO change this if needed template.globals['lodel'] = api_lodel_templates + template.globals['leapi'] = leapi_dyncode + template.globals['settings'] = Settings + template.globals['url'] = lambda sufix='': root_url()\ + + ('' if sufix.startswith('/') else '/')\ + + sufix # Extra modules are loaded if template_extra is not None: diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index dfe5745..bc7f489 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -1,12 +1,13 @@ from .controllers import * urls = ( - (r'^$', index), - (r'admin/?$', admin), - (r'admin/(.+)$', admin), - (r'test/(?P.*)$', test), - (r'test/?$', test), - (r'show/(?P.*)$', show_document), - (r'list_classes/(.+)$', list_classes), - (r'list_classes/?$', list_classes), + (r'^/?$', index), + (r'^/admin/?$', admin), + (r'^/admin/(.+)$', admin), + (r'/test/(?P.*)$', test), + (r'^/test/?$', test), + (r'^/show/(.+)$', show_document), + (r'/show/(?P.*)$', show_document), + (r'^/list_classes/(.+)$', list_classes), + (r'^/list_classes/?$', list_classes), ) diff --git a/plugins/webui/main.py b/plugins/webui/main.py index a2ca936..00aa01f 100644 --- a/plugins/webui/main.py +++ b/plugins/webui/main.py @@ -6,6 +6,11 @@ from lodel.settings import Settings PLUGIN_PATH = os.path.dirname(__file__) +##@brief Return the root url of the instance +def root_url(): + return Settings.sitename + + ##@brief uwsgi startup demo @LodelHook('lodel2_loader_main') def uwsgi_fork(hook_name, caller, payload): From 4c43d02dfaedd13d6a8a22d0ef011bc5b93c1ff6 Mon Sep 17 00:00:00 2001 From: prieto Date: Wed, 29 Jun 2016 16:52:26 +0200 Subject: [PATCH 13/50] added list_classes --- plugins/webui/interface/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index d598eb3..21ca011 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -6,7 +6,7 @@ urls = ( (r'admin/(.+)$', admin), (r'test/(.+)$', test), (r'test/?$', test), - (r'show/(.+)$', show_document) + (r'show/(.+)$', show_document), (r'list_classes/(.+)$', list_classes), - (r'list_classes/?$', list_classes), + (r'list_classes/?$', list_classes) ) From 797795b6354d9a343e41ee3e68b1a2fac33eac29 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 29 Jun 2016 17:44:53 +0200 Subject: [PATCH 14/50] Cleaned the useless comments --- plugins/webui/interface/router.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/webui/interface/router.py b/plugins/webui/interface/router.py index da0c78a..53eec26 100644 --- a/plugins/webui/interface/router.py +++ b/plugins/webui/interface/router.py @@ -27,9 +27,5 @@ def get_controller(request): if m is not None: request.url_args = m.groupdict() return callback - '''match = re.search(regex, request.PATH) - if match is not None: - request.url_args = match.groups() - return callback - ''' + return not_found From 91fff4ca1cf001132a4d23ad024bf07d6aa007ac Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 09:25:49 +0200 Subject: [PATCH 15/50] Bugfixes on EmGroups handling --- em_test.py | 3 +++ examples/em_test.pickle | Bin 11557 -> 11719 bytes lodel/editorial_model/components.py | 31 +++++++++++++++++++--------- lodel/editorial_model/model.py | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/em_test.py b/em_test.py index 1c449af..1c0f8e4 100644 --- a/em_test.py +++ b/em_test.py @@ -87,6 +87,7 @@ person.new_field( 'firstname', 'fre': 'Prénom', }, data_handler = 'varchar', + group = base_group, ) person.new_field( 'lastname', display_name = { @@ -94,6 +95,7 @@ person.new_field( 'lastname', 'fre': 'Nom de famille', }, data_handler = 'varchar', + group = base_group, ) person.new_field( 'fullname', display_name = { @@ -115,6 +117,7 @@ person.new_field( 'alias', allowed_classes = [person], default = None, nullable = True, + group = base_group, ) diff --git a/examples/em_test.pickle b/examples/em_test.pickle index 96b31daddce6c575633cf22331bd3eaf5eed4b0d..54890acd64b675b416d7395ed9cbe4cd636a2ce5 100644 GIT binary patch literal 11719 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 LaT3|GIWYZyfP)QO literal 11557 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 Date: Thu, 30 Jun 2016 09:36:20 +0200 Subject: [PATCH 16/50] Display list of classes --- plugins/webui/interface/template/loader.py | 1 - plugins/webui/interface/urls.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/webui/interface/template/loader.py b/plugins/webui/interface/template/loader.py index a1ca740..a8c7ee1 100644 --- a/plugins/webui/interface/template/loader.py +++ b/plugins/webui/interface/template/loader.py @@ -5,7 +5,6 @@ import os from lodel.settings import Settings import leapi_dyncode -import settings from .api import api_lodel_templates from .exceptions.not_allowed_custom_api_key_error import NotAllowedCustomAPIKeyError from ...main import root_url diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index d302d88..b28aa91 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -8,5 +8,5 @@ urls = ( (r'^/test/?$', test), (r'/show/(?P.*)$', show_document), (r'^/list_classes/(.+)$', list_classes), - (r'^/list_classes/?$', list_classes), + (r'^/list_classes/?$', list_classes) ) From b3cd964bbe295f9a28e08d78184feda30d9e3a56 Mon Sep 17 00:00:00 2001 From: prieto Date: Thu, 30 Jun 2016 09:37:09 +0200 Subject: [PATCH 17/50] Directory listing added --- plugins/webui/templates/listing/list_classes.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/webui/templates/listing/list_classes.html diff --git a/plugins/webui/templates/listing/list_classes.html b/plugins/webui/templates/listing/list_classes.html new file mode 100644 index 0000000..8d1dc00 --- /dev/null +++ b/plugins/webui/templates/listing/list_classes.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% block title %}Lodel 2 - List of Classes{% endblock %} +{% block content %} +

Lodel 2 - List of Classes

+
    +{% for class in my_classes %} +
  • {{ class.__name__ }}
  • + {% endfor %} +
+{% endblock %} \ No newline at end of file From 4ebd9078d851397d603ce52dea994aab29e4479e Mon Sep 17 00:00:00 2001 From: prieto Date: Thu, 30 Jun 2016 11:06:08 +0200 Subject: [PATCH 18/50] Listing of classes and their instances --- plugins/webui/interface/controllers/listing.py | 17 +++++++++++++++-- plugins/webui/interface/urls.py | 8 ++++++-- .../webui/templates/listing/list_classes.html | 4 ++-- plugins/webui/templates/listing/show_class.html | 8 ++++++++ .../webui/templates/listing/show_object.html | 11 +++++++++++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 plugins/webui/templates/listing/show_class.html create mode 100644 plugins/webui/templates/listing/show_object.html diff --git a/plugins/webui/interface/controllers/listing.py b/plugins/webui/interface/controllers/listing.py index b8b756b..d0d8e91 100644 --- a/plugins/webui/interface/controllers/listing.py +++ b/plugins/webui/interface/controllers/listing.py @@ -1,6 +1,19 @@ +# -*- coding: utf-8 -*- from .base import get_response import leapi_dyncode as dyncode + def list_classes(request): - # TODO Add the method to get the classes list template_vars = {'my_classes': dyncode.dynclasses} - return get_response('listing/list_classes.html', tpl_vars=template_vars) \ No newline at end of file + return get_response('listing/list_classes.html', tpl_vars=template_vars) + +def show_class(request): + templates_var = { + 'params': request.GET + } + return get_response('listing/show_class.html', tpl_vars=template_vars) + +def show_object(request): + templates_var = { + 'params': request.GET + } + return get_response('listing/show_object.html', tpl_vars=template_vars) \ No newline at end of file diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index b28aa91..538b574 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from .controllers import * urls = ( @@ -7,6 +8,9 @@ urls = ( (r'/test/(?P.*)$', test), (r'^/test/?$', test), (r'/show/(?P.*)$', show_document), - (r'^/list_classes/(.+)$', list_classes), - (r'^/list_classes/?$', list_classes) + (r'^/list_classes', list_classes), + (r'^/show_object/(.+)$', show_object), + (r'^/show_object/?$', show_object), + (r'^/show_class/(.+)$', show_class), + (r'^/show_class/?$', show_class) ) diff --git a/plugins/webui/templates/listing/list_classes.html b/plugins/webui/templates/listing/list_classes.html index 8d1dc00..9a78f22 100644 --- a/plugins/webui/templates/listing/list_classes.html +++ b/plugins/webui/templates/listing/list_classes.html @@ -3,8 +3,8 @@ {% block content %}

Lodel 2 - List of Classes

    -{% for class in my_classes %} -
  • {{ class.__name__ }}
  • +{% for classe in my_classes %} +
  • {{ classe.__name__ }}
  • {% endfor %}
{% endblock %} \ No newline at end of file diff --git a/plugins/webui/templates/listing/show_class.html b/plugins/webui/templates/listing/show_class.html new file mode 100644 index 0000000..126d195 --- /dev/null +++ b/plugins/webui/templates/listing/show_class.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block title %}Lodel 2 - Class {{ name }} {% endblock %} +{% block content %} +

Lodel 2 - Class {{ name }}

+
    + +
+{% endblock %} diff --git a/plugins/webui/templates/listing/show_object.html b/plugins/webui/templates/listing/show_object.html new file mode 100644 index 0000000..aac99ad --- /dev/null +++ b/plugins/webui/templates/listing/show_object.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block title %}Lodel 2 - Object {{ name }} {% endblock %} +{% block content %} +

Lodel 2 - Object {{ name }}

+
    + {% my_object = params['classe'].get('lodel_id=' + id) %} +{% for field in my_object.fieldnames() %} +
  • {{ fieldnames[field] }}
  • + {% endfor %} +
+{% endblock %} \ No newline at end of file From 557d2771869d812eb6522698c007725a1cde9d49 Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 11:16:12 +0200 Subject: [PATCH 19/50] Multiple bugfixes + create_instance.sh script update - Add an update feature to create_instance.sh script - Updated webui plugin load instruction (running loader.start() in run) - Updated the way EmCmponents handles EmGroup - Updated the way EmFields handles EmClass - Updated xmlfile translator according to EmComponent modification --- examples/em_test.pickle | Bin 11719 -> 11779 bytes install/loader.py | 7 ++++-- lodel/editorial_model/components.py | 15 ++++++----- lodel/editorial_model/translator/xmlfile.py | 20 +++++++-------- lodel/leapi/leobject.py | 22 ++++++++++++----- lodel/leapi/query.py | 2 +- scripts/create_instance.sh | 26 ++++++++++++++------ tests/editorial_model.pickle | Bin 11557 -> 11638 bytes tests/leapi/query/test_filtered.py | 4 +-- 9 files changed, 61 insertions(+), 35 deletions(-) diff --git a/examples/em_test.pickle b/examples/em_test.pickle index 54890acd64b675b416d7395ed9cbe4cd636a2ce5..06d45e0d9620427110f20ac79a0424eee1b5209d 100644 GIT binary patch literal 11779 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 LaT3|GIWYZyfP)QO diff --git a/install/loader.py b/install/loader.py index cb1677f..50dddc1 100644 --- a/install/loader.py +++ b/install/loader.py @@ -14,7 +14,6 @@ except ImportError: print("Unable to load lodel module. exiting...") exit(1) - # # Loading settings # @@ -29,16 +28,19 @@ from lodel.plugin import core_hooks def start(): #Load plugins + from lodel import logger from lodel.plugin import Plugin + logger.debug("Loader.start() called") Plugin.load_all() LodelHook.call_hook('lodel2_bootstraped', '__main__', None) if __name__ == '__main__': - start() + start() if Settings.runtest: + start() import unittest import tests loader = unittest.TestLoader() @@ -52,6 +54,7 @@ if __name__ == '__main__': exit() LodelHook.call_hook('lodel2_loader_main', '__main__', None) + #Run interative python import code print(""" diff --git a/lodel/editorial_model/components.py b/lodel/editorial_model/components.py index 47072b5..eb24977 100644 --- a/lodel/editorial_model/components.py +++ b/lodel/editorial_model/components.py @@ -170,7 +170,6 @@ class EmClass(EmComponent): if not emfield.data_handler_instance.can_override(parent_field.data_handler_instance): raise AttributeError("'%s' field override a parent field, but data_handles are not compatible" % emfield.uid) self.__fields[emfield.uid] = emfield - emfield._emclass = self return emfield ##@brief Create a new EmField and add it to the EmClass @@ -179,7 +178,7 @@ class EmClass(EmComponent): # @param **field_kwargs : EmField constructor parameters ( see @ref EmField.__init__() ) def new_field(self, uid, data_handler, **field_kwargs): assert_edit() - return self.add_field(EmField(uid, data_handler, **field_kwargs)) + return self.add_field(EmField(uid, data_handler, self, **field_kwargs)) def d_hash(self): m = hashlib.md5() @@ -216,7 +215,7 @@ class EmField(EmComponent): # @param help_text MlString|str|dict : help text # @param group EmGroup : # @param **handler_kwargs : data handler arguments - def __init__(self, uid, data_handler, display_name = None, help_text = None, group = None, **handler_kwargs): + def __init__(self, uid, data_handler, em_class = None, display_name = None, help_text = None, group = None, **handler_kwargs): from lodel.leapi.datahandlers.base_classes import DataHandler super().__init__(uid, display_name, help_text, group) ##@brief The data handler name @@ -228,9 +227,11 @@ class EmField(EmComponent): ##@brief Stores data handler instanciation options self.data_handler_options = handler_kwargs ##@brief Stores the emclass that contains this field (set by EmClass.add_field() method) - self._emclass = None + self._emclass = em_class + if self._emclass is None: + warnings.warn("No EmClass for field %s" %uid) if group is None: - warnings.warn("NO GROUP FOR FIELD %s" % uid) + warnings.warn("No EmGroup for field %s" % uid) else: group.add_components([self]) @@ -343,7 +344,9 @@ class EmGroup(object): for component in components: if isinstance(component, EmField): if component._emclass is None: - warnings.warn("Adding an orphan EmField to an EmGroup") + msg = "Adding an orphan EmField '%s' to EmGroup '%s'" + msg %= (component, self) + warnings.warn(msg) elif not isinstance(component, EmClass): raise EditorialModelError("Expecting components to be a list of EmComponent, but %s found in the list" % type(component)) self.__components |= set(components) diff --git a/lodel/editorial_model/translator/xmlfile.py b/lodel/editorial_model/translator/xmlfile.py index 9d739f4..54b4513 100644 --- a/lodel/editorial_model/translator/xmlfile.py +++ b/lodel/editorial_model/translator/xmlfile.py @@ -316,7 +316,7 @@ def load_class_xml(model, elem): fields = elem.find('fields') for field in fields: - emfield = load_field_xml(model, field) + emfield = load_field_xml(model, field, emclass) l_emfields = emclass.fields() incls = False for emf in l_emfields: @@ -329,10 +329,11 @@ def load_class_xml(model, elem): return emclass ##@brief Creates a EmField from a xml description -# @param elem : the element which represents the EmField -# @param model : the model which will contain the new field -# @return a new EmField object -def load_field_xml(model, elem): +#@param elem : the element which represents the EmField +#@param model : the model which will contain the new field +#@param emclass EmClass : the EmClass of the field +#@return a new EmField object +def load_field_xml(model, elem, emclass): uid = elem.find('uid').text if elem.find('display_name').text is None: name = None @@ -354,16 +355,13 @@ def load_field_xml(model, elem): group = None dhdl = elem.find('datahandler_name') + dhdl_opts = {} if dhdl.text is not None: dhdl_opts = elem.find('datahandler_options') - if dhdl_opts is not None: dhdl_options = load_dhdl_options_xml(model, dhdl_opts) - emfield = EmField(uid, dhdl.text, name, help_text, group, **dhdl_options) - else: - emfield = EmField(uid, dhdl.text, name, help_text, group) - else: - emfield = EmField(uid, dhdl.text, name, help_text, group) + emfield = EmField( + uid, dhdl.text, emclass, name, help_text, group, **dhdl_options) return emfield diff --git a/lodel/leapi/leobject.py b/lodel/leapi/leobject.py index 93aeda2..58f9e64 100644 --- a/lodel/leapi/leobject.py +++ b/lodel/leapi/leobject.py @@ -242,14 +242,24 @@ class LeObject(object): ro_ds, rw_ds = cls._datasource_name #Read only datasource initialisation cls._ro_datasource = cls._init_datasource(ro_ds, True) - log_msg = "Read only datasource %s initialized for LeObject %s" - log_msg %= (ro_ds, cls.__name__) - logger.debug(log_msg) + if cls._ro_datasource is None: + log_msg = "No read only datasource set for LeObject %s" + log_msg %= cls.__name__ + logger.debug(log_msg) + else: + log_msg = "Read only datasource '%s' initialized for LeObject %s" + log_msg %= (ro_ds, cls.__name__) + logger.debug(log_msg) #Read write datasource initialisation cls._rw_datasource = cls._init_datasource(rw_ds, False) - log_msg = "Read&write only datasource %s initialized for LeObject %s" - log_msg %= (rw_ds, cls.__name__) - logger.debug(log_msg) + if cls._ro_datasource is None: + log_msg = "No read/write datasource set for LeObject %s" + log_msg %= cls.__name__ + logger.debug(log_msg) + else: + log_msg = "Read/write datasource '%s' initialized for LeObject %s" + log_msg %= (ro_ds, cls.__name__) + logger.debug(log_msg) ##@brief Replace the _datasource attribute value by a datasource instance diff --git a/lodel/leapi/query.py b/lodel/leapi/query.py index 077436d..90401a1 100644 --- a/lodel/leapi/query.py +++ b/lodel/leapi/query.py @@ -333,7 +333,7 @@ field to use for the relational filter" res_filters.append((field,operator, value)) if len(err_l) > 0: - raise LeApiDataCheckError( + raise LeApiDataCheckErrors( "Error while preparing filters : ", err_l) return (res_filters, rel_filters) diff --git a/scripts/create_instance.sh b/scripts/create_instance.sh index c1ded1b..f06bd28 100755 --- a/scripts/create_instance.sh +++ b/scripts/create_instance.sh @@ -1,10 +1,18 @@ #!/bin/bash usage() { - echo "Usage : $0 instance_name instance_dir [lodel_libdir]" 1>&2 + echo -e "Usage : $0 instance_name (instance_dir|-u) [lodel_libdir]" 1>&2 + echo -e "\n\tIf -u given as first argument update instance's loader.py" 1>&2 exit 1 } +cp_loader() { + cp -Rv $libdir/install/loader.py $instdir/ + # Adding lib path to loader + sed -i -E "s#^(LODEL2_LIB_ABS_PATH = )None#\1'$libdir'#" "$loader" +} + + if [ $# -lt 2 ] then echo "Not enough arguments" 1>&2 @@ -12,6 +20,7 @@ then fi + name="$1" instdir="$2" @@ -21,6 +30,13 @@ libdir="${libdir:=$(realpath $(dirname $0)/..)}/" loader="$instdir/loader.py" conf="$instdir/conf.d/lodel2.ini" +if [ $1 = '-u' ] +then + #Update instance + cp_loader + exit 0 +fi + if [ -e "$instdir" ] then echo "Abording... "$instdir" exists" 1>&2 @@ -34,19 +50,15 @@ chmod 700 "$instdir/sessions" #cp -Rv $libdir/install/* $instdir cp -Rv $libdir/install/conf.d $instdir/ -cp -Rv $libdir/install/loader.py $instdir/ cp -Rv $libdir/examples/em_test.pickle $instdir/editorial_model.pickle ln -sv $libdir/install/Makefile $instdir/Makefile ln -sv $libdir/install/lodel_admin.py $instdir/lodel_admin.py ln -sv $libdir/plugins $instdir/plugins - - - -# Adding lib path to loader -sed -i -E "s#^(LODEL2_LIB_ABS_PATH = )None#\1'$libdir'#" "$loader" +cp_loader # Adding instance name to conf sed -i -E "s#^sitename = noname#sitename = $name#" "$conf" + echo -e "\nInstance successfully created in $instdir" echo -e "============================\n" echo "Now you should edit files in '${instdir}/conf.d/' and then run : cd $instdir && make dyncode" diff --git a/tests/editorial_model.pickle b/tests/editorial_model.pickle index 96b31daddce6c575633cf22331bd3eaf5eed4b0d..5b5ba9cd0b050546b492f669c14f9354f2e31ea5 100644 GIT binary patch literal 11638 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 I+ZmqoKgyC8x&QzG literal 11557 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 Date: Thu, 30 Jun 2016 11:22:33 +0200 Subject: [PATCH 20/50] Update README.txt + forgotten file plugins/webui/run.py --- README.txt | 4 ++++ plugins/webui/main.py | 1 + plugins/webui/run.py | 2 ++ 3 files changed, 7 insertions(+) diff --git a/README.txt b/README.txt index 5a4d082..de472a2 100644 --- a/README.txt +++ b/README.txt @@ -19,3 +19,7 @@ Instance operations : make dyncode # Leapi dynamic code creation ( in leapi_dyncode.py in lodel2 instance root dir) make init_db # Call migration handlers to tell them to init all needed databases. (note : this target has dyncode as dependencie) make list_hooks # List all the hooks registered + +Instance loader uppdate : + If the install/loader.py is updated you can update instance's loader.py using + scripts/create_instance.sh -u INSTANCE_PATH diff --git a/plugins/webui/main.py b/plugins/webui/main.py index 00aa01f..73138ce 100644 --- a/plugins/webui/main.py +++ b/plugins/webui/main.py @@ -7,6 +7,7 @@ from lodel.settings import Settings PLUGIN_PATH = os.path.dirname(__file__) ##@brief Return the root url of the instance +#@warning no trailing slash def root_url(): return Settings.sitename diff --git a/plugins/webui/run.py b/plugins/webui/run.py index 86096a3..b7c8987 100644 --- a/plugins/webui/run.py +++ b/plugins/webui/run.py @@ -15,6 +15,8 @@ SESSION_EXPIRATION_LIMIT = Settings.webui.sessions.expiration session_store = FilesystemSessionStore(path=SESSION_FILES_BASE_DIR, filename_template=SESSION_FILES_TEMPLATE) +#Starting instance +loader.start() # TODO déplacer dans un module "sessions.py" def delete_old_session_files(timestamp_now): From ee1d1edd4415860c6ef77d8dea91528fe9bbcc1a Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 12:07:58 +0200 Subject: [PATCH 21/50] [WEBUI] Add error support using exceptions in controller --- plugins/webui/exceptions.py | 51 +++++++++++++++++++++ plugins/webui/interface/controllers/base.py | 4 +- plugins/webui/run.py | 18 ++++++-- plugins/webui/templates/empty.html | 0 plugins/webui/templates/error.html | 9 ++++ 5 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 plugins/webui/exceptions.py create mode 100644 plugins/webui/templates/empty.html create mode 100644 plugins/webui/templates/error.html diff --git a/plugins/webui/exceptions.py b/plugins/webui/exceptions.py new file mode 100644 index 0000000..fda58a9 --- /dev/null +++ b/plugins/webui/exceptions.py @@ -0,0 +1,51 @@ +#-*- coding: utf-8 -*- + +from werkzeug.wrappers import Response + +class HttpException(Exception): + + STATUS_STR = { + 4:{ + 400: 'Bad request', + 401: 'Unauthorized', + 402: 'Payment required', + 403: 'Forbidden', + 404: 'Not found', + 418: 'I\'m a teapot', #RFC 2324 + }, + 5:{ + 500: 'Internal server error', + 501: 'Not implemented', + }, + } + + def __init__(self, status_code = 500, tpl = 'error.html', custom = None): + self.status_code = status_code + self.tpl = tpl + self.custom = custom + + def render(self, request): + from .interface.template.loader import TemplateLoader + loader = TemplateLoader() + tpl_vars = { + 'status_code': self.status_code, + 'status_str': self.status_str(self.status_code), + 'custom': self.custom } + response = Response( + loader.render_to_response(self.tpl, template_vars = tpl_vars), + mimetype = 'text/html') + response.status_code = self.status_code + return response + + @staticmethod + def status_str(status_code): + status_fam = status_code / 100 + if status_fam not in HttpException.STATUS_STR or \ + status_code not in HttpException.STATUS_STR[status_fam]: + return 'Unknown' + else: + return HttpException.STATUS_STR[status_fam][status_code] + + + + diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index 370c4c1..d07db39 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -5,14 +5,12 @@ from ..template.loader import TemplateLoader # This module contains the web UI controllers that will be called from the web ui class - -def get_response(tpl, tpl_vars={}, mimetype='text/html', status_code=200): +def get_response(tpl='empty.html', tpl_vars={}, mimetype='text/html', status_code=200): loader = TemplateLoader() response = Response(loader.render_to_response(tpl, template_vars=tpl_vars), mimetype=mimetype) response.status_code = status_code return response - def index(request): return get_response('index/index.html') diff --git a/plugins/webui/run.py b/plugins/webui/run.py index b7c8987..eec8565 100644 --- a/plugins/webui/run.py +++ b/plugins/webui/run.py @@ -3,10 +3,12 @@ import loader # Lodel2 loader import os from werkzeug.contrib.sessions import FilesystemSessionStore +from werkzeug.wrappers import Response from lodel.settings import Settings from .interface.router import get_controller from .interface.lodelrequest import LodelRequest +from .exceptions import * from lodel.utils.datetime import get_utc_timestamp SESSION_FILES_BASE_DIR = Settings.webui.sessions.directory @@ -55,9 +57,19 @@ def application(env, start_response): request.session = session_store.new() request.session['user_context'] = None request.session['last_accessed'] = current_timestamp - - controller = get_controller(request) - response = controller(request) + + try: + controller = get_controller(request) + response = controller(request) + except HttpException as e: + try: + response = e.render(request) + except Exception as eb: + res = Response() + res.status_code = 500 + return res + + if request.session.should_save: session_store.save(request.session) response.set_cookie('sid', request.session.sid) diff --git a/plugins/webui/templates/empty.html b/plugins/webui/templates/empty.html new file mode 100644 index 0000000..e69de29 diff --git a/plugins/webui/templates/error.html b/plugins/webui/templates/error.html new file mode 100644 index 0000000..d4ecb86 --- /dev/null +++ b/plugins/webui/templates/error.html @@ -0,0 +1,9 @@ + + + + {{status_code}} {{status_str}} + + + {{status_code}} {{status_str}} + + From dddeae9c9eca9f0db4a6bc1fac95ccdcfb06a23a Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Thu, 30 Jun 2016 14:10:14 +0200 Subject: [PATCH 22/50] Added the virtualenv management for the webui main module --- plugins/webui/confspec.py | 3 +++ plugins/webui/main.py | 8 ++++++-- plugins/webui/templates/documents/show.html | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins/webui/confspec.py b/plugins/webui/confspec.py index d0d1bf9..67e403e 100644 --- a/plugins/webui/confspec.py +++ b/plugins/webui/confspec.py @@ -8,6 +8,9 @@ CONFSPEC = { SettingValidator('dummy')), 'listen_port': ( '9090', SettingValidator('int')), + 'virtualenv': ('', + SettingValidator('path')), + 'uwsgicmd': ('uwsgi_python3', SettingValidator('dummy')), }, 'lodel2.webui.sessions': { 'directory': ( '/tmp/lodel2_session', diff --git a/plugins/webui/main.py b/plugins/webui/main.py index 73138ce..e467fb0 100644 --- a/plugins/webui/main.py +++ b/plugins/webui/main.py @@ -16,8 +16,12 @@ def root_url(): @LodelHook('lodel2_loader_main') def uwsgi_fork(hook_name, caller, payload): if Settings.webui.standalone: - cmd='uwsgi_python3 --http-socket {addr}:{port} --module plugins.webui.run' + cmd='{uwsgi} --http-socket {addr}:{port} --module plugins.webui.run' cmd = cmd.format( addr = Settings.webui.listen_address, - port = Settings.webui.listen_port) + port = Settings.webui.listen_port, + uwsgi= Settings.webui.uwsgicmd) + if Settings.webui.virtualenv != '': + cmd += " --virtualenv %s" % Settings.webui.virtualenv + exit(os.system(cmd)) diff --git a/plugins/webui/templates/documents/show.html b/plugins/webui/templates/documents/show.html index eb3d843..af5b6f7 100644 --- a/plugins/webui/templates/documents/show.html +++ b/plugins/webui/templates/documents/show.html @@ -1,3 +1,5 @@ {% extends "base_backend.html" %} {% block title %}Lodel 2 - Document {{ id }}{% endblock %} -{% block content %}ADMIN{% endblock %} +{% block content %} + {{ leapi.Section.get([('lodel_id','=',id)]) }} +{% endblock %} From 703b4adf7ed5f823700f5bfbb1f67beec4daf68f Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 14:15:50 +0200 Subject: [PATCH 23/50] MongoDB datasource debugging + field_list handling changes in leobject -> query -> datasource chain --- lodel/leapi/leobject.py | 4 +-- plugins/mongodb_datasource/confspec.py | 2 +- plugins/mongodb_datasource/datasource.py | 34 ++++++++++++++++++------ plugins/mongodb_datasource/utils.py | 3 +++ tests/leapi/test_leobject.py | 2 +- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lodel/leapi/leobject.py b/lodel/leapi/leobject.py index 58f9e64..bada0e4 100644 --- a/lodel/leapi/leobject.py +++ b/lodel/leapi/leobject.py @@ -658,9 +658,7 @@ construction and consitency when datas are not complete\n") #@return a list of items (lists of (fieldname, fieldvalue)) @classmethod def get(cls, query_filters, field_list=None, order=None, group=None, limit=None, offset=0): - if field_list is None: - field_list = cls.fieldnames(True) - else: + if field_list is not None: for uid in [ uidname for uidname in cls.uid_fieldname() if uidname not in field_list ]: diff --git a/plugins/mongodb_datasource/confspec.py b/plugins/mongodb_datasource/confspec.py index 79bbcc0..72c9016 100644 --- a/plugins/mongodb_datasource/confspec.py +++ b/plugins/mongodb_datasource/confspec.py @@ -4,7 +4,7 @@ from lodel.settings.validator import SettingValidator CONFSPEC = { 'lodel2.datasource.mongodb_datasource.*':{ - 'read_only': (True, SettingValidator('bool')), + 'read_only': (False, SettingValidator('bool')), 'host': ('localhost', SettingValidator('host')), 'port': (None, SettingValidator('string')), 'db_name':('lodel', SettingValidator('string')), diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 5188e04..c979b8d 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -13,7 +13,7 @@ from lodel import logger from lodel.leapi.leobject import CLASS_ID_FIELDNAME from . import utils -from .utils import object_collection_name,\ +from .utils import object_collection_name, collection_name, \ MONGODB_SORT_OPERATORS_MAP, connection_string class MongoDbDataSourceError(Exception): @@ -133,13 +133,14 @@ class MongoDbDatasource(object): query_result_ordering = None if order is not None: query_result_ordering = utils.parse_query_order(order) - results_field_list = None if len(field_list) == 0 else field_list - limit = limit if limit is not None else 0 - + if group is None: cursor = collection.find( - filter=query_filters, projection=results_field_list, - skip=offset, limit=limit, sort=query_result_ordering) + spec = query_filters, + fields=field_list, + skip=offset, + limit=limit if limit != None else 0, + sort=query_result_ordering) else: pipeline = list() unwinding_list = list() @@ -252,7 +253,8 @@ class MongoDbDatasource(object): fname, op, val)) del(new_filters[i]) new_filters.append( - (CLASS_ID_FIELDNAME, '=', target_child.__name__)) + (CLASS_ID_FIELDNAME, '=', + collection_name(target_child.__name__))) result += act( target = target_child, filters = new_filters, @@ -436,17 +438,33 @@ class MongoDbDatasource(object): @classmethod def __filters2mongo(cls, filters): res = dict() + eq_fieldname = [] #Stores field with equal comparison OP for fieldname, op, value in filters: oop = op ovalue = value op, value = cls.__op_value_conv(op, value) + if op == '=': + eq_fieldname.append(fieldname) + if fieldname in res: + logger.warning("Dropping previous condition. Overwritten \ +by an equality filter") + res[fieldname] = str(value) + continue + if fieldname in eq_fieldname: + logger.warning("Dropping condition : '%s %s %s'" % ( + fieldname, op, value)) + continue + if fieldname not in res: res[fieldname] = dict() if op in res[fieldname]: logger.warning("Dropping condition : '%s %s %s'" % ( fieldname, op, value)) else: - res[fieldname][op] = value + if op not in cls.lodel2mongo_op_map: + raise ValueError("Invalid operator : '%s'" % op) + new_op = cls.lodel2mongo_op_map[op] + res[fieldname][new_op] = value return res diff --git a/plugins/mongodb_datasource/utils.py b/plugins/mongodb_datasource/utils.py index a323e88..50a5559 100644 --- a/plugins/mongodb_datasource/utils.py +++ b/plugins/mongodb_datasource/utils.py @@ -69,6 +69,9 @@ def connect(host, port, db_name, username, password): def object_collection_name(class_object): return class_object.__name__ +def collection_name(class_name): + return class_name + ## @brief Determine a collection field name given a lodel2 fieldname # @note For the moment this method only return the argument but EVERYWHERE # in the datasource we should use this method to gather proper fieldnames diff --git a/tests/leapi/test_leobject.py b/tests/leapi/test_leobject.py index 2aae506..7d8aa59 100644 --- a/tests/leapi/test_leobject.py +++ b/tests/leapi/test_leobject.py @@ -259,7 +259,7 @@ class LeObjectQueryMockTestCase(unittest.TestCase): mock_init.assert_called_once_with( dyncode.Person, query_filters = ['lodel_id = 1'], - field_list = dyncode.Person.fieldnames(True), + field_list = None, order = None, group = None, limit = None, offset = 0) with patch.object( From 7aa9c214a8aa752e1a67a4fb0438a695cc355399 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Thu, 30 Jun 2016 14:17:03 +0200 Subject: [PATCH 24/50] Added a get_component_html function to get an HTML code for a given gui component type --- plugins/webui/interface/controllers/base.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index d07db39..633f9f3 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -11,6 +11,14 @@ def get_response(tpl='empty.html', tpl_vars={}, mimetype='text/html', status_cod response.status_code = status_code return response +## @brief gets the html template corresponding to a given component type +# @param type str : name of the component type +# @param params dict : extra parameters to customize the template +def get_component_html(type='text', params={}): + params['type'] = type + template_loader = TemplateLoader() + return template_loader.render_to_html(template_file='components/components.html', template_vars=params) + def index(request): return get_response('index/index.html') From 9c3a770610671fb852d998305bdf0776cbdebd97 Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 14:37:38 +0200 Subject: [PATCH 25/50] Bugfixes on filters handling - calling check_data_value on filters value to ensure value casting --- lodel/leapi/datahandlers/datas.py | 3 --- lodel/leapi/query.py | 31 +++++++++++++++--------- plugins/mongodb_datasource/datasource.py | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lodel/leapi/datahandlers/datas.py b/lodel/leapi/datahandlers/datas.py index 3f38b1d..44891f3 100644 --- a/lodel/leapi/datahandlers/datas.py +++ b/lodel/leapi/datahandlers/datas.py @@ -72,9 +72,6 @@ class UniqID(Integer): kwargs['internal'] = 'automatic' super(self.__class__, self).__init__(primary_key = True, **kwargs) - def _check_data_value(self, value): - return value, None - def construct_data(self, emcomponent, fname, datas, cur_value): if cur_value is None: #Ask datasource to provide a new uniqID diff --git a/lodel/leapi/query.py b/lodel/leapi/query.py index 90401a1..986eb0d 100644 --- a/lodel/leapi/query.py +++ b/lodel/leapi/query.py @@ -290,6 +290,11 @@ field name" % fieldname) err_l[field] = ret continue field_datahandler = self._target_class.field(field) + # Casting value given datahandler + value, error = field_datahandler._check_data_value(value) + if isinstance(error, Exception): + err_l[field] = error + continue if ref_field is not None and not field_datahandler.is_reference(): # inconsistency err_l[field] = NameError( "The field '%s' in %s is not \ @@ -658,17 +663,18 @@ class LeGetQuery(LeFilteredQuery): # @throw LeApiQueryError if unknown field given def set_field_list(self, field_list): err_l = dict() - for fieldname in field_list: - ret = self._check_field(self._target_class, fieldname) - if isinstance(ret, Exception): - msg = "No field named '%s' in %s" - msg %= (fieldname, self._target_class.__name__) - expt = NameError(msg) - err_l[fieldname] = expt - if len(err_l) > 0: - msg = "Error while setting field_list in a get query" - raise LeApiQueryErrors(msg = msg, exceptions = err_l) - self._field_list = list(set(field_list)) + if field_list is not None: + for fieldname in field_list: + ret = self._check_field(self._target_class, fieldname) + if isinstance(ret, Exception): + msg = "No field named '%s' in %s" + msg %= (fieldname, self._target_class.__name__) + expt = NameError(msg) + err_l[fieldname] = expt + if len(err_l) > 0: + msg = "Error while setting field_list in a get query" + raise LeApiQueryErrors(msg = msg, exceptions = err_l) + self._field_list = list(set(field_list)) ##@brief Execute the get query def execute(self, datas = None): @@ -678,9 +684,10 @@ class LeGetQuery(LeFilteredQuery): # @returns a list containing the item(s) def _query(self, datas = None): # select datas corresponding to query_filter + fl = list(self._field_list) if self._field_list is not None else None l_datas=self._ro_datasource.select( target = self._target_class, - field_list = list(self._field_list), + field_list = fl, filters = self._query_filter[0], relational_filters = self._query_filter[1], order = self._order, diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index c979b8d..e12e45e 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -448,7 +448,7 @@ class MongoDbDatasource(object): if fieldname in res: logger.warning("Dropping previous condition. Overwritten \ by an equality filter") - res[fieldname] = str(value) + res[fieldname] = value continue if fieldname in eq_fieldname: logger.warning("Dropping condition : '%s %s %s'" % ( From 8c3c39bca9b3e4811054f60cae615e76ed4937b4 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Thu, 30 Jun 2016 14:56:11 +0200 Subject: [PATCH 26/50] Added a template for defining the HTML components templates --- plugins/webui/templates/components/components.html | 4 ++++ plugins/webui/templates/documents/show.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/webui/templates/components/components.html diff --git a/plugins/webui/templates/components/components.html b/plugins/webui/templates/components/components.html new file mode 100644 index 0000000..7df4384 --- /dev/null +++ b/plugins/webui/templates/components/components.html @@ -0,0 +1,4 @@ +{% if type == "text" %} + +{% endif %} + diff --git a/plugins/webui/templates/documents/show.html b/plugins/webui/templates/documents/show.html index af5b6f7..fc3a181 100644 --- a/plugins/webui/templates/documents/show.html +++ b/plugins/webui/templates/documents/show.html @@ -1,5 +1,5 @@ {% extends "base_backend.html" %} {% block title %}Lodel 2 - Document {{ id }}{% endblock %} {% block content %} - {{ leapi.Section.get([('lodel_id','=',id)]) }} + {{ leapi.Section.get(['lodel_id = %s' % id]) }} {% endblock %} From fc472b44b187f42fd8c143432a1110e2eb4dd94a Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Thu, 30 Jun 2016 15:56:12 +0200 Subject: [PATCH 27/50] Added the use of jinja2 macros --- plugins/webui/interface/controllers/base.py | 8 ++++++-- plugins/webui/interface/urls.py | 2 +- plugins/webui/templates/components/components.html | 11 ++++++++--- plugins/webui/templates/listing/show_object.html | 4 +++- plugins/webui/templates/test.html | 3 +++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index 633f9f3..b8de507 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -28,10 +28,14 @@ def not_found(request): def test(request): + if 'id' not in request.url_args: + id = None + else: + id = request.url_args['id'] + template_vars = { - 'id': request.url_args['id'], + 'id': id, 'params': request.GET } return get_response('test.html', tpl_vars=template_vars) - return get_response('test.html') diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index 538b574..a816009 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -7,7 +7,7 @@ urls = ( (r'^/admin/(.+)$', admin), (r'/test/(?P.*)$', test), (r'^/test/?$', test), - (r'/show/(?P.*)$', show_document), + #(r'/show/(?P.*)$', show_document), (r'^/list_classes', list_classes), (r'^/show_object/(.+)$', show_object), (r'^/show_object/?$', show_object), diff --git a/plugins/webui/templates/components/components.html b/plugins/webui/templates/components/components.html index 7df4384..61fc5c4 100644 --- a/plugins/webui/templates/components/components.html +++ b/plugins/webui/templates/components/components.html @@ -1,4 +1,9 @@ -{% if type == "text" %} - -{% endif %} +{% macro input(name, value='', type='text') -%} + +{%- endmacro %} +{% macro textarea(name, value='', rows=10, cols=40) -%} + +{%- endmacro %} \ No newline at end of file diff --git a/plugins/webui/templates/listing/show_object.html b/plugins/webui/templates/listing/show_object.html index aac99ad..be8c17f 100644 --- a/plugins/webui/templates/listing/show_object.html +++ b/plugins/webui/templates/listing/show_object.html @@ -1,10 +1,12 @@ {% extends "base.html" %} {% block title %}Lodel 2 - Object {{ name }} {% endblock %} -{% block content %} +{% import "components/components.html" as components %} +{% block content %}

Lodel 2 - Object {{ name }}

    {% my_object = params['classe'].get('lodel_id=' + id) %} {% for field in my_object.fieldnames() %} +
  • {{ fieldnames[field] }}
  • {% endfor %}
diff --git a/plugins/webui/templates/test.html b/plugins/webui/templates/test.html index 4f14a13..4ba674a 100644 --- a/plugins/webui/templates/test.html +++ b/plugins/webui/templates/test.html @@ -1,6 +1,9 @@ +{% import "components/components.html" as components %} + + {{ components.textarea('test', value='ceci est un test', rows=10, cols=20) }}
URL arg : id = {{ id }}
GET values :
    From 576ae97d0fceaf047d061e051007389ae6d38a83 Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 16:57:26 +0200 Subject: [PATCH 28/50] Started implementation of admin controllers & templates --- plugins/webui/interface/controllers/admin.py | 43 +++++++++++++++++++ plugins/webui/interface/controllers/base.py | 10 ++++- plugins/webui/interface/urls.py | 3 +- plugins/webui/templates/admin/admin.html | 11 ++++- .../webui/templates/admin/admin_create.html | 4 ++ plugins/webui/templates/admin/admin_edit.html | 1 + plugins/webui/templates/base_backend.html | 8 ++-- 7 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 plugins/webui/templates/admin/admin_create.html create mode 100644 plugins/webui/templates/admin/admin_edit.html diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index 39577e6..30797ed 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -1,8 +1,51 @@ +from ...exceptions import * from .base import get_response +from lodel.leapi.exceptions import * +from lodel import logger + +import leapi_dyncode as dyncode + def index_admin(request): return get_response('admin/admin.html') +def admin_update(request): + test_valid = 'lodel_id' in request.GET \ + and len(request.GET['lodel_id']) == 1 + + if test_valid: + try: + lodel_id = int(request.GET['lodel_id'][0]) + except (ValueError, TypeError): + test_valid = False + + if not test_valid: + raise HttpException(400) + else: + obj = dyncode.Object.get(['lodel_id = %d' % lodel_id]) + if len(obj) == 0: + raise HttpException(404) + print("WHAT WE GOT AS RESPONSE : ") + for n,o in enumerate(obj): + print("\t",n,o.datas(True)) + return get_response('admin/admin_edit.html', obj = obj) + +def admin_create(request): + classname = None + if 'classname' in request.GET: + classname = request.GET['classname'] + if len(classname) > 1: + raise HttpException(400) + classname = classname[0] + try: + target_leo = dyncode.Object.name2class(classname) + except LeApiError: + classname = None + if classname is None or target_leo.is_abstract(): + raise HttpException(400) + + return get_response('admin/admin_create.html', target=target_leo) + def admin(request): return get_response('admin/admin.html') diff --git a/plugins/webui/interface/controllers/base.py b/plugins/webui/interface/controllers/base.py index b8de507..d51e255 100644 --- a/plugins/webui/interface/controllers/base.py +++ b/plugins/webui/interface/controllers/base.py @@ -5,7 +5,15 @@ from ..template.loader import TemplateLoader # This module contains the web UI controllers that will be called from the web ui class -def get_response(tpl='empty.html', tpl_vars={}, mimetype='text/html', status_code=200): +##@brief Render a template and return a respone +#@param tpl str : template relativ path +#@param tpl_vars : templates variables (obsolete) +#@param mimetype +#@param status_code +#@param **kwargs : new version of tpl_vars +#@return a response... +def get_response(tpl='empty.html', tpl_vars={}, mimetype='text/html', status_code=200, **kwargs): + tpl_vars.update(kwargs) loader = TemplateLoader() response = Response(loader.render_to_response(tpl, template_vars=tpl_vars), mimetype=mimetype) response.status_code = status_code diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index a816009..3316703 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -4,7 +4,8 @@ from .controllers import * urls = ( (r'^/?$', index), (r'^/admin/?$', admin), - (r'^/admin/(.+)$', admin), + (r'^/admin/create$', admin_create), + (r'^/admin/update$', admin_update), (r'/test/(?P.*)$', test), (r'^/test/?$', test), #(r'/show/(?P.*)$', show_document), diff --git a/plugins/webui/templates/admin/admin.html b/plugins/webui/templates/admin/admin.html index c53b5f8..34d7a07 100644 --- a/plugins/webui/templates/admin/admin.html +++ b/plugins/webui/templates/admin/admin.html @@ -1,3 +1,10 @@ {% extends "base_backend.html" %} -{% block title %}Lodel 2 - ADMIN{% endblock %} -{% block content %}ADMIN{% endblock %} +{% block title %}- Index{% endblock %} +{% block body %} +

    {{settings.sitename}} administration

    +{{url('admin')}} +
      +
    • +
    + +{% endblock %} diff --git a/plugins/webui/templates/admin/admin_create.html b/plugins/webui/templates/admin/admin_create.html new file mode 100644 index 0000000..1fafe5a --- /dev/null +++ b/plugins/webui/templates/admin/admin_create.html @@ -0,0 +1,4 @@ +{% extends "base_backend.html" %} +{% block title %}- Creating a new {{target.__name__}}{% endblock %} +{% block body %} +{% endblock %} diff --git a/plugins/webui/templates/admin/admin_edit.html b/plugins/webui/templates/admin/admin_edit.html new file mode 100644 index 0000000..bff24f7 --- /dev/null +++ b/plugins/webui/templates/admin/admin_edit.html @@ -0,0 +1 @@ +{% extends "base_backend.html" %} diff --git a/plugins/webui/templates/base_backend.html b/plugins/webui/templates/base_backend.html index ef9c080..dc4a50f 100644 --- a/plugins/webui/templates/base_backend.html +++ b/plugins/webui/templates/base_backend.html @@ -2,14 +2,12 @@ - {% block title %}{% endblock %} + {{ settings.sitename }} Admin{% block title %}{% endblock %} {% block style %}{% endblock %} {% block scripts %}{% endblock %} -
    - {% block content %}{% endblock %} -
    + {% block body %}{% endblock %} - \ No newline at end of file + From dd2f93faea56a5f9c1a3c4b65b25710a570574d4 Mon Sep 17 00:00:00 2001 From: Yann Date: Thu, 30 Jun 2016 17:43:49 +0200 Subject: [PATCH 29/50] A lot of small bugfixes --- examples/em_test.pickle | Bin 11779 -> 11735 bytes lodel/leapi/datahandlers/base_classes.py | 9 ++++++--- lodel/leapi/datahandlers/references.py | 10 ++++------ lodel/leapi/leobject.py | 7 +++++-- lodel/leapi/query.py | 10 ++++++---- plugins/webui/interface/controllers/admin.py | 3 --- .../webui/templates/admin/admin_create.html | 4 ++++ tests/editorial_model.pickle | Bin 11638 -> 11735 bytes tests/leapi/query/test_datasource.py | 4 ++-- tests/leapi/query/test_filtered.py | 14 +++++++------- 10 files changed, 34 insertions(+), 27 deletions(-) diff --git a/examples/em_test.pickle b/examples/em_test.pickle index 06d45e0d9620427110f20ac79a0424eee1b5209d..076be7bf8c099450da90bbab7c130485208b448b 100644 GIT binary patch literal 11735 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 T?>ipv@OOngMj{higVX;9rNL&w literal 11779 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 0: diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index 30797ed..ae66742 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -25,9 +25,6 @@ def admin_update(request): obj = dyncode.Object.get(['lodel_id = %d' % lodel_id]) if len(obj) == 0: raise HttpException(404) - print("WHAT WE GOT AS RESPONSE : ") - for n,o in enumerate(obj): - print("\t",n,o.datas(True)) return get_response('admin/admin_edit.html', obj = obj) def admin_create(request): diff --git a/plugins/webui/templates/admin/admin_create.html b/plugins/webui/templates/admin/admin_create.html index 1fafe5a..fe3c2f4 100644 --- a/plugins/webui/templates/admin/admin_create.html +++ b/plugins/webui/templates/admin/admin_create.html @@ -1,4 +1,8 @@ {% extends "base_backend.html" %} +{% import "admin/editable_component.html" as edit %} {% block title %}- Creating a new {{target.__name__}}{% endblock %} {% block body %} + {% for fieldname, field in target.fields().items() %} + {{edit.input(fieldname, field) }} + {% endfor %} {% endblock %} diff --git a/tests/editorial_model.pickle b/tests/editorial_model.pickle index 5b5ba9cd0b050546b492f669c14f9354f2e31ea5..076be7bf8c099450da90bbab7c130485208b448b 100644 GIT binary patch literal 11735 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 T?>ipv@OOngMj{higVX;9rNL&w literal 11638 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 I+ZmqoKgyC8x&QzG diff --git a/tests/leapi/query/test_datasource.py b/tests/leapi/query/test_datasource.py index 2d436c4..dae8623 100644 --- a/tests/leapi/query/test_datasource.py +++ b/tests/leapi/query/test_datasource.py @@ -71,7 +71,7 @@ class LeQueryDatasourceTestCase(unittest.TestCase): self.assertEqual(call_args[0], cls) self.assertEqual( sorted(call_args[1]), - sorted([('lodel_id', '=', '1'), ('alias', '=', '2')])) + sorted([('lodel_id', '=', 1), ('alias', '=', '2')])) self.assertEqual(call_args[2], []) self.check_nocall(read = False, exclude = ['delete']) self.check_nocall(read = True) @@ -87,7 +87,7 @@ class LeQueryDatasourceTestCase(unittest.TestCase): query.execute() self.mockwrite.delete.assert_called_once_with( cls, - [('lodel_id', '=', '1')], + [('lodel_id', '=', 1)], [(('alias', {cls: 'firstname'}), '=', 'foo')]) self.check_nocall(read = False, exclude = ['delete']) self.check_nocall(read = True) diff --git a/tests/leapi/query/test_filtered.py b/tests/leapi/query/test_filtered.py index 2fb8307..795ed06 100644 --- a/tests/leapi/query/test_filtered.py +++ b/tests/leapi/query/test_filtered.py @@ -13,20 +13,20 @@ class LeFilteredQueryTestCase(unittest.TestCase): def test_filters(self): """ Testing FilteredQuery filters handling """ test_datas = [ ( 'lodel_id = 42', - ( [('lodel_id','=','42')], + ( [('lodel_id','=',42)], [])), ( 'lodel_id <= 42', - ( [('lodel_id','<=','42')], + ( [('lodel_id','<=',42)], [])), ( ['lodel_id <= 42'], - ( [('lodel_id','<=','42')], + ( [('lodel_id','<=',42)], [])), ( ('lodel_id <= 42',), - ( [('lodel_id','<=','42')], + ( [('lodel_id','<=',42)], [])), ( ['lodel_id <= 42','lodel_id >= 33'], - ( [ ('lodel_id','<=','42'), - ('lodel_id', '>=','33')], + ( [ ('lodel_id','<=',42), + ('lodel_id', '>=',33)], [])), ] for q_class in self.q_classes: @@ -70,7 +70,7 @@ class LeFilteredQueryTestCase(unittest.TestCase): 'not in', 'like', 'not like'] - values = ( '42', + values = ( 42, 'not in', 'in', 'like', From 3f2c8778af1773299a67d0dff00a0caf47772652 Mon Sep 17 00:00:00 2001 From: prieto Date: Fri, 1 Jul 2016 11:09:39 +0200 Subject: [PATCH 30/50] Interface d'affichage de tous les types et toutesleurs instances --- .../webui/interface/controllers/listing.py | 4 +-- plugins/webui/interface/urls.py | 4 +-- plugins/webui/templates/index/index.html | 3 +++ .../webui/templates/listing/list_classes.html | 2 +- .../webui/templates/listing/show_class.html | 26 +++++++++++++++---- .../webui/templates/listing/show_object.html | 14 ++++++---- 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/plugins/webui/interface/controllers/listing.py b/plugins/webui/interface/controllers/listing.py index d0d8e91..d50b043 100644 --- a/plugins/webui/interface/controllers/listing.py +++ b/plugins/webui/interface/controllers/listing.py @@ -7,13 +7,13 @@ def list_classes(request): return get_response('listing/list_classes.html', tpl_vars=template_vars) def show_class(request): - templates_var = { + template_vars = { 'params': request.GET } return get_response('listing/show_class.html', tpl_vars=template_vars) def show_object(request): - templates_var = { + template_vars = { 'params': request.GET } return get_response('listing/show_object.html', tpl_vars=template_vars) \ No newline at end of file diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index 3316703..ca7c09d 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -10,8 +10,8 @@ urls = ( (r'^/test/?$', test), #(r'/show/(?P.*)$', show_document), (r'^/list_classes', list_classes), - (r'^/show_object/(.+)$', show_object), + #(r'^/show_object/(.+)$', show_object), (r'^/show_object/?$', show_object), - (r'^/show_class/(.+)$', show_class), + #(r'^/show_class/(.+)$', show_class), (r'^/show_class/?$', show_class) ) diff --git a/plugins/webui/templates/index/index.html b/plugins/webui/templates/index/index.html index 43ab004..997ffbf 100644 --- a/plugins/webui/templates/index/index.html +++ b/plugins/webui/templates/index/index.html @@ -3,4 +3,7 @@ {% block content %} DASHBOARD
    {{ lodel.Test().ok() }} + {% endblock %} diff --git a/plugins/webui/templates/listing/list_classes.html b/plugins/webui/templates/listing/list_classes.html index 9a78f22..74480a3 100644 --- a/plugins/webui/templates/listing/list_classes.html +++ b/plugins/webui/templates/listing/list_classes.html @@ -4,7 +4,7 @@

    Lodel 2 - List of Classes

    {% endblock %} \ No newline at end of file diff --git a/plugins/webui/templates/listing/show_class.html b/plugins/webui/templates/listing/show_class.html index 126d195..d862db1 100644 --- a/plugins/webui/templates/listing/show_class.html +++ b/plugins/webui/templates/listing/show_class.html @@ -1,8 +1,24 @@ {% extends "base.html" %} -{% block title %}Lodel 2 - Class {{ name }} {% endblock %} +{% block title %}Lodel 2 - Class {{ params['name'] }} {% endblock %} {% block content %} -

    Lodel 2 - Class {{ name }}

    -
      - -
    +

    Lodel 2 - Class {{ params['name'] }}

    + {% set my_classname = params['name'].pop() %} + {% set my_class = leapi.Object.name2class(my_classname) %} + {% if my_class.is_abstract() %} +

    Childs classes

    + + {% else %} + {% set uid_f = my_class.uid_fieldname() %} + {% set objects = my_class.get(None) %} + + {% endif %} + {% endblock %} diff --git a/plugins/webui/templates/listing/show_object.html b/plugins/webui/templates/listing/show_object.html index be8c17f..c632756 100644 --- a/plugins/webui/templates/listing/show_object.html +++ b/plugins/webui/templates/listing/show_object.html @@ -1,13 +1,17 @@ {% extends "base.html" %} -{% block title %}Lodel 2 - Object {{ name }} {% endblock %} +{% block title %}Lodel 2 - Object {{ params['id'] }} {% endblock %} {% import "components/components.html" as components %} {% block content %} -

    Lodel 2 - Object {{ name }}

    +

    Lodel 2 - Object {{ params['id'] }} of the class {{ params['classe'] }}

    + {% set my_classname = params['classe'].pop() %} + {% set my_id = params['id'].pop() %} + {% set my_class = leapi.Object.name2class(my_classname) %} + {% set objects = my_class.get(('%s = %s') % ('lodel_id', my_id)) %} + {% set obj = objects.pop() %}
      - {% my_object = params['classe'].get('lodel_id=' + id) %} -{% for field in my_object.fieldnames() %} -
    • {{ fieldnames[field] }}
    • + {% for fieldname, fieldvalue in obj.datas().items() %} +
    • {{ fieldname }} : {{ fieldvalue }}
    • {% endfor %}
    {% endblock %} \ No newline at end of file From e74d823ce86be3cda2727329bc6962eba4aa182c Mon Sep 17 00:00:00 2001 From: prieto Date: Fri, 1 Jul 2016 11:47:12 +0200 Subject: [PATCH 31/50] Interface for listing objects --- .../webui/templates/listing/list_classes.html | 8 +++++++- .../webui/templates/listing/show_class.html | 4 ++-- .../webui/templates/listing/show_object.html | 20 +++++++++++-------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/plugins/webui/templates/listing/list_classes.html b/plugins/webui/templates/listing/list_classes.html index 74480a3..abdd665 100644 --- a/plugins/webui/templates/listing/list_classes.html +++ b/plugins/webui/templates/listing/list_classes.html @@ -4,7 +4,13 @@

    Lodel 2 - List of Classes

      {% for classe in my_classes %} -
    • {{ classe.__name__ }}
    • + {% set abst = '' %} + {% if classe.is_abstract() %} + {% set abst = ' - Abstract class ' %} + {% else %} + {% set abst = ' - ' ~ classe.get(None)|length %} + {% endif %} +
    • {{ classe.__name__ }} {{ abst }}
    • {% endfor %}
    {% endblock %} \ No newline at end of file diff --git a/plugins/webui/templates/listing/show_class.html b/plugins/webui/templates/listing/show_class.html index d862db1..6d81215 100644 --- a/plugins/webui/templates/listing/show_class.html +++ b/plugins/webui/templates/listing/show_class.html @@ -1,8 +1,8 @@ {% extends "base.html" %} -{% block title %}Lodel 2 - Class {{ params['name'] }} {% endblock %} +{% set my_classname = params['name'].pop() %} +{% block title %}Lodel 2 - Class {{ my_classname }} {% endblock %} {% block content %}

    Lodel 2 - Class {{ params['name'] }}

    - {% set my_classname = params['name'].pop() %} {% set my_class = leapi.Object.name2class(my_classname) %} {% if my_class.is_abstract() %}

    Childs classes

    diff --git a/plugins/webui/templates/listing/show_object.html b/plugins/webui/templates/listing/show_object.html index c632756..7b60960 100644 --- a/plugins/webui/templates/listing/show_object.html +++ b/plugins/webui/templates/listing/show_object.html @@ -1,17 +1,21 @@ {% extends "base.html" %} -{% block title %}Lodel 2 - Object {{ params['id'] }} {% endblock %} +{% import 'components/components.html' as components %} +{% set my_classname = params['classe'].pop() %} +{% set my_id = params['id'].pop() %} +{% set my_class = leapi.Object.name2class(my_classname) %} +{% set objects = my_class.get(('%s = %s') % ('lodel_id', my_id)) %} +{% set obj = objects.pop() %} +{% block title %}Lodel 2 - Object {{ my_id }} {% endblock %} {% import "components/components.html" as components %} {% block content %} -

    Lodel 2 - Object {{ params['id'] }} of the class {{ params['classe'] }}

    - {% set my_classname = params['classe'].pop() %} - {% set my_id = params['id'].pop() %} - {% set my_class = leapi.Object.name2class(my_classname) %} - {% set objects = my_class.get(('%s = %s') % ('lodel_id', my_id)) %} - {% set obj = objects.pop() %} +

    Lodel 2 - Object {{ my_id }} of the class {{ my_classname }}

    +
      {% for fieldname, fieldvalue in obj.datas().items() %} -
    • {{ fieldname }} : {{ fieldvalue }}
    • + {% if fieldvalue is not none %} +
    • {{ fieldname }} : {{ components.input(fieldname , value=fieldvalue , type='text') }}
    • + {% endif %} {% endfor %}
    {% endblock %} \ No newline at end of file From e7ca3c5f2851b27f458de18cdd841676443d2703 Mon Sep 17 00:00:00 2001 From: prieto Date: Fri, 1 Jul 2016 12:06:48 +0200 Subject: [PATCH 32/50] Some style changes --- plugins/webui/templates/listing/show_class.html | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/webui/templates/listing/show_class.html b/plugins/webui/templates/listing/show_class.html index 6d81215..7ec1cc4 100644 --- a/plugins/webui/templates/listing/show_class.html +++ b/plugins/webui/templates/listing/show_class.html @@ -2,22 +2,28 @@ {% set my_classname = params['name'].pop() %} {% block title %}Lodel 2 - Class {{ my_classname }} {% endblock %} {% block content %} -

    Lodel 2 - Class {{ params['name'] }}

    +

    Lodel 2 - Class {{ my_classname }}

    {% set my_class = leapi.Object.name2class(my_classname) %} - {% if my_class.is_abstract() %} + {% if my_class.child_classes()|length >0 %}

    Childs classes

      {% for child in my_class.child_classes() %} -
    • {{ child.__name__ }}
    • + {% if child.is_abstract() %} + {% set abst = ' - Abstract class ' %} + {% else %} + {% set abst = ' - ' ~ child.get(None)|length %} + {% endif %} +
    • {{ child.__name__ }}{{ abst }}
    • {% endfor %}
    - {% else %} + {% endif %} + {% if not my_class.is_abstract() %} {% set uid_f = my_class.uid_fieldname() %} {% set objects = my_class.get(None) %} {% endif %} From 52f5e461fafc3cf599efe472e95bcaefa2ab307b Mon Sep 17 00:00:00 2001 From: prieto Date: Fri, 1 Jul 2016 14:38:27 +0200 Subject: [PATCH 33/50] Add an edit object page --- .../webui/templates/listing/edit_object.html | 19 +++++++++++++++++++ .../webui/templates/listing/show_object.html | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 plugins/webui/templates/listing/edit_object.html diff --git a/plugins/webui/templates/listing/edit_object.html b/plugins/webui/templates/listing/edit_object.html new file mode 100644 index 0000000..69fa314 --- /dev/null +++ b/plugins/webui/templates/listing/edit_object.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% import 'components/components.html' as components %} +{% set my_classname = params['classe'].pop() %} +{% set my_id = params['id'].pop() %} +{% set my_class = leapi.Object.name2class(my_classname) %} +{% set objects = my_class.get(('%s = %s') % ('lodel_id', my_id)) %} +{% set obj = objects.pop() %} +{% block title %}Lodel 2 - Object {{ my_id }} {% endblock %} +{% import "components/components.html" as components %} +{% block content %} +

    Lodel 2 - Object {{ my_id }} of the class {{ my_classname }}

    + +
      + + {% for fieldname, fieldvalue in obj.datas().items() %} +
    • {{ fieldname }} : {{ components.input(fieldname , value=fieldvalue , type='text') }}
    • + {% endfor %} +
    +{% endblock %} \ No newline at end of file diff --git a/plugins/webui/templates/listing/show_object.html b/plugins/webui/templates/listing/show_object.html index 7b60960..faf9294 100644 --- a/plugins/webui/templates/listing/show_object.html +++ b/plugins/webui/templates/listing/show_object.html @@ -14,7 +14,7 @@ {% for fieldname, fieldvalue in obj.datas().items() %} {% if fieldvalue is not none %} -
  • {{ fieldname }} : {{ components.input(fieldname , value=fieldvalue , type='text') }}
  • +
  • {{ fieldname }} : {{ fieldvalue }}
  • {% endif %} {% endfor %}
From d33f8daa8000e8fd36a74548d6e29eb13c2599dc Mon Sep 17 00:00:00 2001 From: prieto Date: Fri, 1 Jul 2016 15:03:08 +0200 Subject: [PATCH 34/50] Delete edit_show --- .../webui/templates/listing/edit_object.html | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 plugins/webui/templates/listing/edit_object.html diff --git a/plugins/webui/templates/listing/edit_object.html b/plugins/webui/templates/listing/edit_object.html deleted file mode 100644 index 69fa314..0000000 --- a/plugins/webui/templates/listing/edit_object.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "base.html" %} -{% import 'components/components.html' as components %} -{% set my_classname = params['classe'].pop() %} -{% set my_id = params['id'].pop() %} -{% set my_class = leapi.Object.name2class(my_classname) %} -{% set objects = my_class.get(('%s = %s') % ('lodel_id', my_id)) %} -{% set obj = objects.pop() %} -{% block title %}Lodel 2 - Object {{ my_id }} {% endblock %} -{% import "components/components.html" as components %} -{% block content %} -

Lodel 2 - Object {{ my_id }} of the class {{ my_classname }}

- -
    - - {% for fieldname, fieldvalue in obj.datas().items() %} -
  • {{ fieldname }} : {{ components.input(fieldname , value=fieldvalue , type='text') }}
  • - {% endfor %} -
-{% endblock %} \ No newline at end of file From ef8e1b0570b1b77b1fe578fe85d6a4d14a0d4e42 Mon Sep 17 00:00:00 2001 From: Yann Date: Fri, 1 Jul 2016 15:22:59 +0200 Subject: [PATCH 35/50] Forgotten file --- plugins/webui/templates/admin/editable_component.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/webui/templates/admin/editable_component.html diff --git a/plugins/webui/templates/admin/editable_component.html b/plugins/webui/templates/admin/editable_component.html new file mode 100644 index 0000000..0bb2778 --- /dev/null +++ b/plugins/webui/templates/admin/editable_component.html @@ -0,0 +1,10 @@ +{% macro input(fieldname, field, value='') -%} + + {% if field.base_type == 'bool' %} + + {% elif field.base_type == 'char' or field.base_type == 'int' %} + + {% else %} +

Unsupported base type "{{field.base_type}}"

+ {% endif %} +{%- endmacro %} From c41a22c80703ed4fe8e78f81a46f4ced684de2d6 Mon Sep 17 00:00:00 2001 From: prieto Date: Mon, 4 Jul 2016 17:19:48 +0200 Subject: [PATCH 36/50] Update aned Create from interface --- plugins/mongodb_datasource/datasource.py | 7 +- plugins/webui/interface/controllers/admin.py | 68 ++++++++++++++++++- .../webui/templates/admin/admin_create.html | 14 +++- plugins/webui/templates/admin/admin_edit.html | 18 +++++ .../templates/admin/editable_component.html | 4 +- .../templates/components/components.html | 2 +- plugins/webui/templates/index/index.html | 2 +- 7 files changed, 104 insertions(+), 11 deletions(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index e12e45e..631d636 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -75,7 +75,7 @@ class MongoDbDatasource(object): #@warning multiple UID broken by this method #@return an integer def new_numeric_id(self, emcomp): - target = emcomp.uid_source() + target = emcomp #.uid_source() tuid = target._uid[0] # Multiple UID broken here results = self.select( target, field_list = [tuid], filters = [], @@ -181,7 +181,7 @@ class MongoDbDatasource(object): #@param relational_filters list : List of relational filters #@return int : number of deleted records def delete(self, target, filters, relational_filters): - if target.is_asbtract(): + if target.is_abstract(): #Deletion with abstract LeObject as target (reccursiv calls) return self.__act_on_abstract(target, filters, relational_filters, self.delete) @@ -198,7 +198,7 @@ class MongoDbDatasource(object): #@param upd_datas dict : datas to update (new values) #@return int : Number of updated records def update(self, target, filters, relational_filters, upd_datas): - if target.is_asbtract(): + if target.is_abstract(): #Update using abstract LeObject as target (reccursiv calls) return self.__act_on_abstract(target, filters, relational_filters, self.update, upd_datas = upd_datas) @@ -213,6 +213,7 @@ class MongoDbDatasource(object): # @param new_datas dict : datas to insert # @return the inserted uid def insert(self, target, new_datas): + new_datas['lodel_id'] = self.new_numeric_id(target) res = self.__collection(target).insert(new_datas) return str(res) diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index ae66742..14a1600 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -10,6 +10,32 @@ def index_admin(request): return get_response('admin/admin.html') def admin_update(request): + if request.method == 'POST': + error = None + datas = list() + classname = request.form['classname'] + uid = request.form['uid'] + try: + target_leo = dyncode.Object.name2class(classname) + except LeApiError: + classname = None + if classname is None or target_leo.is_abstract(): + raise HttpException(400) + fieldnames = target_leo.fieldnames() + fields = dict() + + for in_put, in_value in request.form.items(): + if in_put != 'classname' and in_put != 'uid': + fields[in_put[12:]] = in_value + obj = (target_leo.get(('lodel_id = %s' % (uid))))[0] + inserted = obj.update(fields) + + if new_uid==1: + msg = 'Successfull creation'; + else: + msg = 'Oops something wrong happened...object not saved' + return get_response('admin/admin_edit.html', target=target_leo, lodel_id = uid, msg = msg) + test_valid = 'lodel_id' in request.GET \ and len(request.GET['lodel_id']) == 1 @@ -25,10 +51,38 @@ def admin_update(request): obj = dyncode.Object.get(['lodel_id = %d' % lodel_id]) if len(obj) == 0: raise HttpException(404) - return get_response('admin/admin_edit.html', obj = obj) + template_vars = { + 'params': request.GET + } + return get_response('admin/admin_edit.html', tpl_vars=template_vars) def admin_create(request): classname = None + + if request.method == 'POST': + error = None + datas = list() + classname = request.form['classname'] + try: + target_leo = dyncode.Object.name2class(classname) + except LeApiError: + classname = None + if classname is None or target_leo.is_abstract(): + raise HttpException(400) + fieldnames = target_leo.fieldnames() + fields = dict() + + for in_put, in_value in request.form.items(): + if in_put != 'classname': + fields[in_put[12:]] = in_value + new_uid = target_leo.insert(fields) + + if not new_uid is None: + msg = 'Successfull creation'; + else: + msg = 'Oops something wrong happened...object not saved' + return get_response('admin/admin_create.html', target=target_leo, msg = msg) + if 'classname' in request.GET: classname = request.GET['classname'] if len(classname) > 1: @@ -38,12 +92,20 @@ def admin_create(request): target_leo = dyncode.Object.name2class(classname) except LeApiError: classname = None + msg = None + if 'msg' in request.GET: + msg = request.GET['msg'] if classname is None or target_leo.is_abstract(): raise HttpException(400) - - return get_response('admin/admin_create.html', target=target_leo) + template_vars = { + 'params': request.GET, + 'msg' : msg + } + return get_response('admin/admin_create.html', tpl_vars=template_vars, target=target_leo) def admin(request): return get_response('admin/admin.html') + + diff --git a/plugins/webui/templates/admin/admin_create.html b/plugins/webui/templates/admin/admin_create.html index fe3c2f4..dbafe50 100644 --- a/plugins/webui/templates/admin/admin_create.html +++ b/plugins/webui/templates/admin/admin_create.html @@ -1,8 +1,20 @@ {% extends "base_backend.html" %} {% import "admin/editable_component.html" as edit %} + {% block title %}- Creating a new {{target.__name__}}{% endblock %} {% block body %} +{% if msg is not none %} +{% block msg %}

{{ msg }}

{% endblock %} +{% endif %} +

Creating a new {{target.__name__}}

+ + {% for fieldname, field in target.fields().items() %} - {{edit.input(fieldname, field) }} +
{{edit.input(fieldname, field) }}
{% endfor %} +

 

+ + {% endblock %} + + diff --git a/plugins/webui/templates/admin/admin_edit.html b/plugins/webui/templates/admin/admin_edit.html index bff24f7..97a2e35 100644 --- a/plugins/webui/templates/admin/admin_edit.html +++ b/plugins/webui/templates/admin/admin_edit.html @@ -1 +1,19 @@ {% extends "base_backend.html" %} +{% import "admin/editable_component.html" as edit %} +{% set my_id = params['lodel_id'].pop() %} +{% set classname = params['classname'].pop() %}} +{% set my_class = leapi.Object.name2class(classname) %} +{% set objects = my_class.get(('lodel_id = %s') % (my_id)) %} +{% set obj = objects.pop() %} +{% block title %}- Edit Object{% endblock %} +{% block body %} +

Lodel 2 - Edit Object {{ my_id }} of {{ classname }}

+
+ + + {% for fieldname, fieldvalue in obj.fields().items() %} +

{{edit.input(fieldname, fieldvalue, obj.data(fieldname)) }}

+ {% endfor %} + +
+{% endblock %} \ No newline at end of file diff --git a/plugins/webui/templates/admin/editable_component.html b/plugins/webui/templates/admin/editable_component.html index 0bb2778..6f92d0e 100644 --- a/plugins/webui/templates/admin/editable_component.html +++ b/plugins/webui/templates/admin/editable_component.html @@ -1,9 +1,9 @@ {% macro input(fieldname, field, value='') -%} {% if field.base_type == 'bool' %} - + {% elif field.base_type == 'char' or field.base_type == 'int' %} - + {% else %}

Unsupported base type "{{field.base_type}}"

{% endif %} diff --git a/plugins/webui/templates/components/components.html b/plugins/webui/templates/components/components.html index 61fc5c4..5e849a7 100644 --- a/plugins/webui/templates/components/components.html +++ b/plugins/webui/templates/components/components.html @@ -1,5 +1,5 @@ {% macro input(name, value='', type='text') -%} - + {%- endmacro %} {% macro textarea(name, value='', rows=10, cols=40) -%} diff --git a/plugins/webui/templates/index/index.html b/plugins/webui/templates/index/index.html index 997ffbf..356c209 100644 --- a/plugins/webui/templates/index/index.html +++ b/plugins/webui/templates/index/index.html @@ -4,6 +4,6 @@ DASHBOARD
{{ lodel.Test().ok() }} {% endblock %} From 65ff70331222674240e95a7b2fa3fa2d147462e6 Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 08:34:14 +0200 Subject: [PATCH 37/50] Add route --- plugins/webui/interface/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index ca7c09d..e2539ca 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -11,7 +11,7 @@ urls = ( #(r'/show/(?P.*)$', show_document), (r'^/list_classes', list_classes), #(r'^/show_object/(.+)$', show_object), - (r'^/show_object/?$', show_object), + (r'^/show_object?$', show_object), #(r'^/show_class/(.+)$', show_class), - (r'^/show_class/?$', show_class) + (r'^/show_class?$', show_class) ) From c4df855e2f264a3ac576371292b776e0b1e0100c Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Tue, 5 Jul 2016 11:34:18 +0200 Subject: [PATCH 38/50] Bug fix on an unexisting variable name --- plugins/mongodb_datasource/datasource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 631d636..f6e9809 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -157,7 +157,7 @@ class MongoDbDatasource(object): sorting_list.extends(query_result_ordering) pipeline.append({'$match': query_filters}) - if results_field_list is not None: + if field_list is not None: pipeline.append({ '$project': SON([{field_name: 1} for field_name in field_list])}) From b0a1be8fcbff49c8a84c5e6fa14afcd2ec2234a5 Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 11:57:47 +0200 Subject: [PATCH 39/50] Corrections --- lodel/leapi/leobject.py | 2 +- plugins/webui/interface/controllers/admin.py | 15 ++++++++++++--- plugins/webui/templates/admin/admin_edit.html | 11 ++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lodel/leapi/leobject.py b/lodel/leapi/leobject.py index 8d13889..f7f57c0 100644 --- a/lodel/leapi/leobject.py +++ b/lodel/leapi/leobject.py @@ -226,7 +226,7 @@ class LeObject(object): uid_handlers = set( cls._fields[name] for name in cls._uid ) for pcls in cls.hierarch()[1:]: puid_handlers = set(cls._fields[name] for name in pcls._uid) - if set(pcls._uid) != set(pcls._uid) \ + if set(pcls._uid) != set(prev._uid) \ or puid_handlers != uid_handlers: break prev = pcls diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index 14a1600..bdba4c6 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -30,8 +30,8 @@ def admin_update(request): obj = (target_leo.get(('lodel_id = %s' % (uid))))[0] inserted = obj.update(fields) - if new_uid==1: - msg = 'Successfull creation'; + if inserted==1: + msg = 'Successfully updated'; else: msg = 'Oops something wrong happened...object not saved' return get_response('admin/admin_edit.html', target=target_leo, lodel_id = uid, msg = msg) @@ -51,10 +51,19 @@ def admin_update(request): obj = dyncode.Object.get(['lodel_id = %d' % lodel_id]) if len(obj) == 0: raise HttpException(404) + if 'classname' in request.GET: + classname = request.GET['classname'] + if len(classname) > 1: + raise HttpException(400) + classname = classname[0] + try: + target_leo = dyncode.Object.name2class(classname) + except LeApiError: + classname = None template_vars = { 'params': request.GET } - return get_response('admin/admin_edit.html', tpl_vars=template_vars) + return get_response('admin/admin_edit.html', target=target_leo, lodel_id =lodel_id, tpl_vars=template_vars) def admin_create(request): classname = None diff --git a/plugins/webui/templates/admin/admin_edit.html b/plugins/webui/templates/admin/admin_edit.html index 97a2e35..09d8936 100644 --- a/plugins/webui/templates/admin/admin_edit.html +++ b/plugins/webui/templates/admin/admin_edit.html @@ -1,16 +1,13 @@ {% extends "base_backend.html" %} {% import "admin/editable_component.html" as edit %} -{% set my_id = params['lodel_id'].pop() %} -{% set classname = params['classname'].pop() %}} -{% set my_class = leapi.Object.name2class(classname) %} -{% set objects = my_class.get(('lodel_id = %s') % (my_id)) %} +{% set objects = target.get(('lodel_id = %s') % (lodel_id)) %} {% set obj = objects.pop() %} {% block title %}- Edit Object{% endblock %} {% block body %} -

Lodel 2 - Edit Object {{ my_id }} of {{ classname }}

+

Lodel 2 - Edit Object {{ lodel_id }} of {{ target.__name__ }}

- - + + {% for fieldname, fieldvalue in obj.fields().items() %}

{{edit.input(fieldname, fieldvalue, obj.data(fieldname)) }}

{% endfor %} From cbe8f7da13ee5984aaed752dabd93eb93cafe3c6 Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 12:04:01 +0200 Subject: [PATCH 40/50] _id is not returned by mongo insert --- plugins/mongodb_datasource/datasource.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index f6e9809..4465a15 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -130,11 +130,20 @@ class MongoDbDatasource(object): query_filters = self.__process_filters( target, filters, relational_filters) + query_result_ordering = None if order is not None: query_result_ordering = utils.parse_query_order(order) if group is None: + if field_list is None: + field_list = dict() + else: + f_list=dict() + for fl in field_list: + f_list[fl] = 1 + field_list = f_list + field_list['_id'] = 0 cursor = collection.find( spec = query_filters, fields=field_list, @@ -205,8 +214,9 @@ class MongoDbDatasource(object): #Non abstract beahavior mongo_filters = self.__process_filters( target, filters, relational_filters) - res = self.__collection(target).update_many(mongo_filters, upd_datas) - return res.modified_count() + res = self.__collection(target).update(mongo_filters, upd_datas) + + return 1 #res.modified_count() ## @brief Inserts a record in a given collection # @param target Emclass : class of the object to insert From e7163894a6c93ce92e8cbdf71c916b1d4cd3f1db Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 15:29:27 +0200 Subject: [PATCH 41/50] Replaced update_many by update and return res['n'] --- plugins/mongodb_datasource/datasource.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 4465a15..34fc638 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -215,15 +215,16 @@ class MongoDbDatasource(object): mongo_filters = self.__process_filters( target, filters, relational_filters) res = self.__collection(target).update(mongo_filters, upd_datas) - - return 1 #res.modified_count() + logger.warning(mongo_filters) + logger.warning(upd_datas) + logger.warning(res) + return res['n'] ## @brief Inserts a record in a given collection # @param target Emclass : class of the object to insert # @param new_datas dict : datas to insert # @return the inserted uid def insert(self, target, new_datas): - new_datas['lodel_id'] = self.new_numeric_id(target) res = self.__collection(target).insert(new_datas) return str(res) From b669ca85964311c50f3ed7ef5e0f58734236994e Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 15:30:46 +0200 Subject: [PATCH 42/50] Warning : removed the int to str cast for filter uid in update case --- lodel/leapi/query.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lodel/leapi/query.py b/lodel/leapi/query.py index dfeb941..b05242d 100644 --- a/lodel/leapi/query.py +++ b/lodel/leapi/query.py @@ -524,7 +524,7 @@ target to LeUpdateQuery constructor" if target_class.initialized: self.__leobject_instance_datas = target.datas(True) else: - query_filters = [(target._uid[0], '=', str(target.uid()))] + query_filters = [(target._uid[0], '=', target.uid())] super().__init__(target_class, query_filters) @@ -559,7 +559,7 @@ target to LeUpdateQuery constructor" res_data.update(datas) res_datas = self._target_class.prepare_datas( res_data, True, True) - filters = [(uid_name, '=', str(res_data[uid_name]))] + filters = [(uid_name, '=', res_data[uid_name])] res = self._rw_datasource.update( self._target_class, filters, [], res_datas) From 9769b873e9071933d5cca39dc9f709441a31dcad Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 15:32:43 +0200 Subject: [PATCH 43/50] Some corrections for interface update object --- lodel/leapi/leobject.py | 1 - plugins/webui/interface/controllers/admin.py | 15 ++++++--------- plugins/webui/templates/admin/admin_edit.html | 3 +++ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lodel/leapi/leobject.py b/lodel/leapi/leobject.py index f7f57c0..465fe3f 100644 --- a/lodel/leapi/leobject.py +++ b/lodel/leapi/leobject.py @@ -599,7 +599,6 @@ construction and consitency when datas are not complete\n") query_filter = list() for uid in uids: query_filter.append((uid, '=', self.data(uid))) - try: query = LeUpdateQuery(self.__class__, query_filter) except Exception as err: diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index bdba4c6..80659dd 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -5,12 +5,15 @@ from lodel.leapi.exceptions import * from lodel import logger import leapi_dyncode as dyncode +import warnings +from lodel import logger def index_admin(request): return get_response('admin/admin.html') def admin_update(request): if request.method == 'POST': + error = None datas = list() classname = request.form['classname'] @@ -60,10 +63,8 @@ def admin_update(request): target_leo = dyncode.Object.name2class(classname) except LeApiError: classname = None - template_vars = { - 'params': request.GET - } - return get_response('admin/admin_edit.html', target=target_leo, lodel_id =lodel_id, tpl_vars=template_vars) + + return get_response('admin/admin_edit.html', target=target_leo, lodel_id =lodel_id) def admin_create(request): classname = None @@ -106,11 +107,7 @@ def admin_create(request): msg = request.GET['msg'] if classname is None or target_leo.is_abstract(): raise HttpException(400) - template_vars = { - 'params': request.GET, - 'msg' : msg - } - return get_response('admin/admin_create.html', tpl_vars=template_vars, target=target_leo) + return get_response('admin/admin_create.html', target=target_leo) def admin(request): return get_response('admin/admin.html') diff --git a/plugins/webui/templates/admin/admin_edit.html b/plugins/webui/templates/admin/admin_edit.html index 09d8936..8dce897 100644 --- a/plugins/webui/templates/admin/admin_edit.html +++ b/plugins/webui/templates/admin/admin_edit.html @@ -4,6 +4,9 @@ {% set obj = objects.pop() %} {% block title %}- Edit Object{% endblock %} {% block body %} +{% if msg is not none %} +{% block msg %}

{{ msg }}

{% endblock %} +{% endif %}

Lodel 2 - Edit Object {{ lodel_id }} of {{ target.__name__ }}

From e821d33db0e09bfb2e7361ddb6a1a6df900bb26d Mon Sep 17 00:00:00 2001 From: prieto Date: Tue, 5 Jul 2016 16:05:59 +0200 Subject: [PATCH 44/50] ras --- plugins/webui/interface/controllers/admin.py | 1 + plugins/webui/templates/admin/admin_create.html | 2 +- plugins/webui/templates/admin/admin_edit.html | 2 +- plugins/webui/templates/admin/editable_component.html | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index 80659dd..67c9f20 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -12,6 +12,7 @@ def index_admin(request): return get_response('admin/admin.html') def admin_update(request): + msg='' if request.method == 'POST': error = None diff --git a/plugins/webui/templates/admin/admin_create.html b/plugins/webui/templates/admin/admin_create.html index dbafe50..c419391 100644 --- a/plugins/webui/templates/admin/admin_create.html +++ b/plugins/webui/templates/admin/admin_create.html @@ -10,7 +10,7 @@ {% for fieldname, field in target.fields().items() %} -
{{edit.input(fieldname, field) }}
+
{{edit.input(fieldname, field) }}
{% endfor %}

 

diff --git a/plugins/webui/templates/admin/admin_edit.html b/plugins/webui/templates/admin/admin_edit.html index 8dce897..12b2fed 100644 --- a/plugins/webui/templates/admin/admin_edit.html +++ b/plugins/webui/templates/admin/admin_edit.html @@ -12,7 +12,7 @@ {% for fieldname, fieldvalue in obj.fields().items() %} -

{{edit.input(fieldname, fieldvalue, obj.data(fieldname)) }}

+
{{edit.input(fieldname, fieldvalue, obj.data(fieldname)) }}
{% endfor %} diff --git a/plugins/webui/templates/admin/editable_component.html b/plugins/webui/templates/admin/editable_component.html index 6f92d0e..a417981 100644 --- a/plugins/webui/templates/admin/editable_component.html +++ b/plugins/webui/templates/admin/editable_component.html @@ -5,6 +5,6 @@ {% elif field.base_type == 'char' or field.base_type == 'int' %} {% else %} -

Unsupported base type "{{field.base_type}}"

+ Unsupported base type "{{field.base_type}}"
{% endif %} {%- endmacro %} From 3f9bc3a1876822d3f931db452ea7281047e0fe5c Mon Sep 17 00:00:00 2001 From: prieto Date: Wed, 6 Jul 2016 09:15:13 +0200 Subject: [PATCH 45/50] Added admin links --- plugins/webui/interface/controllers/admin.py | 17 +++++++++++++++++ plugins/webui/interface/urls.py | 2 ++ plugins/webui/templates/admin/admin.html | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/plugins/webui/interface/controllers/admin.py b/plugins/webui/interface/controllers/admin.py index 67c9f20..947453c 100644 --- a/plugins/webui/interface/controllers/admin.py +++ b/plugins/webui/interface/controllers/admin.py @@ -110,6 +110,23 @@ def admin_create(request): raise HttpException(400) return get_response('admin/admin_create.html', target=target_leo) +def admin_classes(request): + return get_response('admin/list_classes_admin.html', my_classes = dyncode.dynclasses) + +def admin_class(request): + if 'classname' in request.GET: + classname = request.GET['classname'] + if len(classname) > 1: + raise HttpException(400) + classname = classname[0] + try: + target_leo = dyncode.Object.name2class(classname) + except LeApiError: + classname = None + if classname is None or target_leo.is_abstract(): + raise HttpException(400) + return get_response('admin/show_class_admin.html', target=target_leo) + def admin(request): return get_response('admin/admin.html') diff --git a/plugins/webui/interface/urls.py b/plugins/webui/interface/urls.py index e2539ca..f204701 100644 --- a/plugins/webui/interface/urls.py +++ b/plugins/webui/interface/urls.py @@ -6,6 +6,8 @@ urls = ( (r'^/admin/?$', admin), (r'^/admin/create$', admin_create), (r'^/admin/update$', admin_update), + (r'^/admin/classes_admin$', admin_classes), + (r'^/admin/class_admin$', admin_class), (r'/test/(?P.*)$', test), (r'^/test/?$', test), #(r'/show/(?P.*)$', show_document), diff --git a/plugins/webui/templates/admin/admin.html b/plugins/webui/templates/admin/admin.html index 34d7a07..c1c6815 100644 --- a/plugins/webui/templates/admin/admin.html +++ b/plugins/webui/templates/admin/admin.html @@ -4,7 +4,7 @@

{{settings.sitename}} administration

{{url('admin')}} {% endblock %} From 904d14cae789ea6681b5141a8d5173fdb90dc760 Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 6 Jul 2016 09:16:27 +0200 Subject: [PATCH 46/50] Small changes in webui plugin and loader.py - webui now calls a hook to indicate a session end - loader.py now set a lodel.dyncode module exposing dynmically generated code --- install/loader.py | 3 +++ lodel/__init__.py | 2 ++ lodel/leapi/datahandlers/datas.py | 3 +++ plugins/mongodb_datasource/datasource.py | 3 --- plugins/webui/main.py | 3 +++ plugins/webui/run.py | 7 +++++-- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/install/loader.py b/install/loader.py index 50dddc1..3d8728c 100644 --- a/install/loader.py +++ b/install/loader.py @@ -53,6 +53,9 @@ if __name__ == '__main__': runner.run(suite) exit() + import lodel + import leapi_dyncode as dyncode + lodel.dyncode = dyncode LodelHook.call_hook('lodel2_loader_main', '__main__', None) #Run interative python diff --git a/lodel/__init__.py b/lodel/__init__.py index eaadac8..42212e8 100644 --- a/lodel/__init__.py +++ b/lodel/__init__.py @@ -1,5 +1,7 @@ #-*- coding: utf-8 -*- +dyncode = None + ##@page lodel2_start Lodel2 boot mechanism # # @par Lodel2 boot sequence diff --git a/lodel/leapi/datahandlers/datas.py b/lodel/leapi/datahandlers/datas.py index 44891f3..f6a3906 100644 --- a/lodel/leapi/datahandlers/datas.py +++ b/lodel/leapi/datahandlers/datas.py @@ -111,3 +111,6 @@ class Concat(FormatString): super().__init__( format_string = format_string, field_list = field_list, **kwargs) +class Password(Varchar): + help = 'Handle passwords' + pass diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 34fc638..03528e3 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -215,9 +215,6 @@ class MongoDbDatasource(object): mongo_filters = self.__process_filters( target, filters, relational_filters) res = self.__collection(target).update(mongo_filters, upd_datas) - logger.warning(mongo_filters) - logger.warning(upd_datas) - logger.warning(res) return res['n'] ## @brief Inserts a record in a given collection diff --git a/plugins/webui/main.py b/plugins/webui/main.py index e467fb0..8e28fd8 100644 --- a/plugins/webui/main.py +++ b/plugins/webui/main.py @@ -15,6 +15,9 @@ def root_url(): ##@brief uwsgi startup demo @LodelHook('lodel2_loader_main') def uwsgi_fork(hook_name, caller, payload): + from lodel.plugin.plugins import Plugin + Plugin.from_name('users') + if Settings.webui.standalone: cmd='{uwsgi} --http-socket {addr}:{port} --module plugins.webui.run' cmd = cmd.format( diff --git a/plugins/webui/run.py b/plugins/webui/run.py index eec8565..8494f96 100644 --- a/plugins/webui/run.py +++ b/plugins/webui/run.py @@ -10,6 +10,7 @@ from .interface.router import get_controller from .interface.lodelrequest import LodelRequest from .exceptions import * from lodel.utils.datetime import get_utc_timestamp +from lodel.plugin.hooks import LodelHook SESSION_FILES_BASE_DIR = Settings.webui.sessions.directory SESSION_FILES_TEMPLATE = Settings.webui.sessions.file_template @@ -73,5 +74,7 @@ def application(env, start_response): if request.session.should_save: session_store.save(request.session) response.set_cookie('sid', request.session.sid) - - return response(env, start_response) + + res = response(env, start_response) + LodelHook.call_hook('lodel2_session_end', __file__, None) + return res From 2436d397f88beea7d1aa9402f0b26e78a3d06f7e Mon Sep 17 00:00:00 2001 From: Yann Date: Wed, 6 Jul 2016 10:37:43 +0200 Subject: [PATCH 47/50] Update in plugins.py --- lodel/plugin/plugins.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lodel/plugin/plugins.py b/lodel/plugin/plugins.py index 4bb39fe..22b4873 100644 --- a/lodel/plugin/plugins.py +++ b/lodel/plugin/plugins.py @@ -7,6 +7,7 @@ import copy from importlib.machinery import SourceFileLoader, SourcelessFileLoader import plugins +from .exceptions import * ## @package lodel.plugins Lodel2 plugins management # @@ -25,8 +26,6 @@ LOADER_FILENAME_VARNAME = '__loader__' PLUGIN_DEPS_VARNAME = '__plugin_deps__' ACTIVATE_METHOD_NAME = '_activate' -class PluginError(Exception): - pass ##@brief Handle plugins # @@ -119,7 +118,14 @@ class Plugin(object): #@throw PluginError if the filename was not valid def _import_from_init_var(self, varname): # Read varname - filename = getattr(self.module, varname) + try: + filename = getattr(self.module, varname) + except AttributeError: + msg = "Malformed plugin {plugin}. No {varname} found in __init__.py" + msg = msg.format( + plugin = self.name, + varname = LOADER_FILENAME_VARNAME) + raise PluginError(msg) #Path are not allowed if filename != os.path.basename(filename): msg = "Invalid {varname} content : '{fname}' for plugin {name}" @@ -213,12 +219,8 @@ class Plugin(object): #Loading the plugin try: self.__loader_module = self._import_from_init_var(LOADER_FILENAME_VARNAME) - except AttributeError: - msg = "Malformed plugin {plugin}. No {varname} found in __init__.py" - msg = msg.format( - plugin = self.name, - varname = LOADER_FILENAME_VARNAME) - raise PluginError(msg) + except PluginError as e: + raise e except ImportError as e: msg = "Broken plugin {plugin} : {expt}" msg = msg.format( From 6d05616ba1abfc1f155a7af47cade8bccfb5cb76 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 6 Jul 2016 13:48:04 +0200 Subject: [PATCH 48/50] Bug fixes in mongodb datasource (missing import, variable names ...) --- plugins/mongodb_datasource/datasource.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 03528e3..6aa5954 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -14,7 +14,7 @@ from lodel.leapi.leobject import CLASS_ID_FIELDNAME from . import utils from .utils import object_collection_name, collection_name, \ - MONGODB_SORT_OPERATORS_MAP, connection_string + MONGODB_SORT_OPERATORS_MAP, connection_string, mongo_fieldname class MongoDbDataSourceError(Exception): pass @@ -431,7 +431,7 @@ class MongoDbDatasource(object): #we are doing a UNIQ on collection name cur_collname = object_collection_name(leobject) if cur_collname not in collnames: - leo_collname[cur_collame] = leobject + leo_collname[cur_collname] = leobject rfilters[fname][leobject] = dict() #Fecthing the collection's representative leobject repr_leo = leo_collname[cur_collname] From e7f137d46eecef56efe64891684a81c70fa5ef81 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 6 Jul 2016 13:52:08 +0200 Subject: [PATCH 49/50] Fixed a dict name in mongodb datasource (prepare_relational_filters method) --- plugins/mongodb_datasource/datasource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 6aa5954..6120d70 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -430,7 +430,7 @@ class MongoDbDatasource(object): #here we are filling a dict with leobject as index but #we are doing a UNIQ on collection name cur_collname = object_collection_name(leobject) - if cur_collname not in collnames: + if cur_collname not in leo_collname: leo_collname[cur_collname] = leobject rfilters[fname][leobject] = dict() #Fecthing the collection's representative leobject From 53bf344d402e5c99ec02282515fbebf067208ad2 Mon Sep 17 00:00:00 2001 From: Roland Haroutiounian Date: Wed, 6 Jul 2016 14:07:08 +0200 Subject: [PATCH 50/50] Bug Fix wrong variable name in __process_filters method in the mongodb datasource --- plugins/mongodb_datasource/datasource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mongodb_datasource/datasource.py b/plugins/mongodb_datasource/datasource.py index 6120d70..eae4b46 100644 --- a/plugins/mongodb_datasource/datasource.py +++ b/plugins/mongodb_datasource/datasource.py @@ -359,7 +359,7 @@ class MongoDbDatasource(object): if '$in' in res[fname]: #WARNING we allready have a IN on this field, doing dedup #from result - deduped = set(res[fname]['$in']) & subq + deduped = set(res[fname]['$in']) & subq_results if len(deduped) == 0: del(res[fname]['$in']) else: