From 1758f43f2bcd700b843be7416a7d8ce5864d7c1c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 29 Oct 2025 17:02:24 +0100 Subject: [PATCH 01/12] feat(import_project): new schema, rpc added to reset viewer and prepare imported datas --- .../rpc/schemas/reset_project.json | 7 +++ .../rpc/utils_protocols.py | 27 ++++++++++ tests/data/images/viewer/import_project.jpeg | Bin 0 -> 10759 bytes tests/test_utils_protocols.py | 46 ++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 src/opengeodeweb_viewer/rpc/schemas/reset_project.json create mode 100644 tests/data/images/viewer/import_project.jpeg create mode 100644 tests/test_utils_protocols.py diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset_project.json b/src/opengeodeweb_viewer/rpc/schemas/reset_project.json new file mode 100644 index 0000000..b28d1f6 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/schemas/reset_project.json @@ -0,0 +1,7 @@ +{ + "rpc": "reset_project", + "type": "object", + "properties": {}, + "required": [], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 8dbd70f..5aaa36e 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -7,6 +7,7 @@ # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict from opengeodeweb_viewer.vtk_protocol import VtkView +from opengeodeweb_microservice.database import connection class VtkUtilsView(VtkView): @@ -25,3 +26,29 @@ def kill(self) -> None: ) print("Manual viewer kill, shutting down...", flush=True) os._exit(0) + + @exportRpc(utils_prefix + utils_schemas_dict["reset_project"]["rpc"]) + def resetProject(self, rpc_params: dict | None = None) -> None: + print( + f"{self.utils_prefix + self.utils_schemas_dict['reset_project']['rpc']}", + flush=True, + ) + renderWindow = self.getView("-1") + renderer = renderWindow.GetRenderers().GetFirstRenderer() + + renderer.RemoveAllViewProps() + + widget = self.get_widget() + if widget is not None: + try: + widget.EnabledOff() + except Exception: + pass + self.coreServer.setSharedObject("widget", None) + self.coreServer.setSharedObject("grid_scale", None) + self.coreServer.setSharedObject("axes", None) + + self.get_data_base().clear() + + db_full_path = os.path.join(self.DATA_FOLDER_PATH, "project.db") + connection.init_database(db_full_path, create_tables=False) diff --git a/tests/data/images/viewer/import_project.jpeg b/tests/data/images/viewer/import_project.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6ca64aa3396ea2ac180c85a9ab2799796509b2f8 GIT binary patch literal 10759 zcmb_>byS?ovhO!I1RLDlLXg3o!QCwc3GVLh5}e>}!QEYg1&2UzNN`B7-~{Kf&)NID zd+%EBulst|tnQksuBvZVReja{dtQ3p05IjGWTgNQ2mnAYAK-Zv5PzZmcjGT5|2qvY zyPx|3FcOFf!~_eX0${)(STN{$5FmST5(WnLg%A8Q5Ru>!VBwHqKqxPK!WYI1_aEM0 zGYl*oJi_w|fC~Gv6%!WoPWw%VDsfJ-TBU*1DCT zwfwS_PSATkJm-5E^N*Pz`fh?s^&f`y!}-~Q*)+>p17;siHg-Pj{)$;R><+D!5Kuk} zHPr9@N1n{-UFI_&Ocv?;c!5o3Qk%pdw{#%U$fRxQh#MG)qTBFgK_Xq`A8FNc9=YXs zg^NeQ^4B{~%b0Lpl*8d6@2XQY1g|``Nqj>tuK5_6$11cgFA=l0lM@?x?Lr@K??{pEWMdWm zQF9KLfA;)bj(ar%8gl;ECQ_w!JwP>*p z>%eD>6Zcg)W{Ior@(7W4)?}v9*uBbpA3Y97K&FSg!iKf+x7&yA5~9V+Y|@wH(qX{L zZwHy`r7WH?wPTBErOlrcIrgC#)W0eImi>QBpy@ELZl71JQ@#IHfWUW9K0c-UD1pxY z{jkGtYhC*qg8$0@pX-2^*kpSNJp>R8JS+?x;=lQzf5j$%2*$+1;S|BfrJ$rif^ewd zQM0idItISPEYeFTgWzGFflqL|sJMx!*FTq!zt+_?3^NRjBlzg08%m7D!O`??ZtY<4 zwDb%k=i~=R#sNVg!*j@d2z13&bOK3tmVhlG@zMir=TSRx%1Ar|JsaaFlw9@W&!Cbw zO@l#g=u+2E03P44uMtBia3&z3kL(NLFhN1 zwn;HE?R&3V6HB`e@6QQk`*(Qe=4%dE^pra8>&U{p8n=k*(usI`j{6kg{f&p%cdS(P zbXUwW^nImvr%AsRR3O$t5^t`H;iX3Dkm+}<&&JHJsG_5#ZhJV%Th?I@v-WQ3pe{Yu zk$i_7V=y+iJSpRpZiR(SH3*!?b+CpI$AsVPH!500{nJWQS=7H%;>qufS%k*4KrBho zN=re#{#`Tz3F9M=DH)$jT2k9E&9*>M_S}m@an*~V(@#jae zkCu0Da#Oz!mb@OgSk$PV$@`co_f>7)CI(%dDLH0~L!6pHrBio(XjK6|vgAx&%@Sduc3U|t$aFDdkv6qyYAo;c z`+-DVKyCq2IkOH2Im_Kl@gJ1H-UuXhOBYl$%A=3rPrq=E`cBw|O)(S=8Jabygk7E|D1ucWm zfI6z6h{x#H+1KroU#%JGVA?Aw@TW& z`*^g~d^V78MQ)!kl>Dxl4TYF$$IhROdJ<pOC%fbhMf+ycrnVBSf zeHZA`qH~CCj%in?!!qfo#AOpdmLc9i6SASs#wq_VHuY$pq&07+bibl}W6Iw)Nqhzr zo`IJXr2_-700f?Ua?A7IAElyc0 zvA@~SmnS_0>~vG@@N+6&k@Y@N|Jw@~5F7xD{ErjB-(Fx-u>tTRqAyN3{o4zezr1+R zIj50(FReXe=i!ViIRdluOYfub1F0Xbw5OW9tSmm!Cp}cBo#-@liInytGtnq&?j_fS zBLS2#bH-1K^(cJgrk9rwxA)R7mbEbfm={~HaHvSg2&jKmsef69$D#zV*>I>tRS__8 zso6!0oScIa>M6Ly)YM%P`)D{gjf0a48fU~+LK^z#X(19ChNh0L$=_yA14BO*H4SY3 zUC9ujFO_Uis;Y2GYCT4|38T|tv}kei!TllAz`So3qr%J{-q;**x%Er>hl;rT`@&T{ z{>~??!l&F7qx7I>V012Ec6Dp)M4z*8trI6P&edoTXHoxUxAO9XyJormsH2?ut=6{5 zfPD1r@cR{hzk=pII5IeEjM^cHChIO*IsIqrNJTI#tn+4|iw+_5DJD<($40RG>X-&P z=RD+%++X4WWZ~*eU+xm^gOc&~2mylPigGgky(Bij3%eE2u9ZjSp0#~g=b*b z{zfWw{~17D*9~OxW?|g8y|Es@t0-1}I?j)9@)Et)_F27l-+#n7CJ%lJ4VXVRY;dJ% z_IL(XzI*oyyq)y1FRLi}TmaiD)lEutWw&%psW;9-DJu}?5b{B4sg#$EFgcS}nkbPx zXmgujo}I-vF_LC0F$huExKCi9xRWqN5}n3O%%GkzEY8ssNdf1=}scT?ZOFux(mqK#{V+)`q{dtA8Jdd%7@83v<%3RONTAP-J z5v_lKsBZ^%;2k zCokClF9R4tno2_T7d5ALtf*JU41S-Z-UC59)J z>V}|Ph%uX7BJfxPAM}24$Rkiwn42t6L25Ikmf)aJf`P~jl(x6`(#tF7xzGVi|0-Yd zUyCQJ%5bOWUfct_`wHfH&p@P}@|F8QpfIVC124{Ozyx4JdN91k-8=0mRbu&QO&#moMPf%HzcCa|v~LF%i$w?#9T@TK%d(O2p!lR^j18_VT3=F_5^Sp09*_LGgtDQc#Tb!~{EP0JH)gig#^_pgd^+EW28l^+ zr5*6gV|KF=iLBjkn>DABIZGopRaMEA=9=<7+U7-noj8HAKFDecH#XT_=o2sXUTaO#Oziu_=_wa3>FOAm+_Wu0B13|$k2!G+AedpB+NlpuTg z`I6n4nZqGu{RHjPWcY#u7aBnl`b5{>T<&}7Rt)&jIjf;{+_z7Sub$3Vw<=za4MqWL zy1sAqTuEpK_$7~PsJPxEe%cn3jJzrNe3fqSCv|y<_$`%e@@rYh?`VX!#2$`GlI@bp zjXit&h2Q!CpqdNR`t8yop0<`&ygBV0J4I$PlI?_Ib(v-^PA3E2hznHpIfFBu?-;b# zsdxng$4rXE2!jVK9F?#G$VP5_ZfFbA!5kvSLq-F1UaYwG1SwJ-3EMyRAQ~C_VuU7E znh}S+)|_%F&D4jhjDHXcdw#*)*KF!!%!?;M2+yCyVn*m$9;Oz*+s!#HEdg zFDdOSzg-W-eDlWnQb%@LosxQ|ni}E&mb8;7w?Z3(^Fm=HWvM7| z-E3j~pye+&Zxv-!&;@DC53X9>=|4fmz>4MI{Az#e@+7pKATCYSz@Lj6$KH@fiLk1y zs2=6PldfBTBr=rfkh2`UIiKI+#RnNXz$u*SzQc<@O%G9gD`w+(NmKGVe61pVs69(? ztk6d}m8+|o${w>$@t(BIWq;|>a`-mYhe)3UwXOzT|kpumFM@W?e^k>d(qu8Vl(3DvL#hrcxTe6fNO#@t*G{0 zR0ds~Qr!$Irn?RacVZ=GxxH#v(HJIH3+a? zhrv*M9B5X(!g@Mx8PRvyU+e3)t=%Nj~y|#w%6tdKX#8)UrmcoCx^&Bq%SKt0d=B*~;2aXu>CW z-)YF|24%iGdYioI2E&KX=lgJODTA<)9kCnTlRcAeI;{A{wT4-_BSvRY|1wfKFCP46 zZD?@Us9{`@j$9Kjjy9@Jiae)8)6H!0FmBS8u|l;tGqV&et<0LHIxvo=Iz(SJa>Th3 z?KgSUr^~ue-ho}K2TkUmq<-oMU&l}JJg8W~M^=ev(H8fg$td3ZqAip!|K$K5n<7ht z7Jfh?ryK0mrbQE--yM^rHjGu@5g4=CzStu95@7g|y49(16kcTksZ}wt`f1sS{PeeU z+=-Cn`hM!E$+61vgjyrBSD^CGu>KyCbv%5^EJJl2+;_Bg4})h7=81xnx1GVtT3I?g zU(Tpn3B`#BvUo5@CdFuDygYLFLOG;j&Ohk&V=GsSqm}2(kWoUGut-JTRxOh7 zfL4XkhOR!>2hWfbWD+Y+QlC!*zs4EIk%!BsjN>A)hU5HcB=)B?ymFQ8S4GrxA2z0O zsar#nrxS`qf@dIK+oAZR`PZ2QVgaKSGUA=~PrTN7;#+PLcp)xJQckWn&d5-z>V0Ae zQA6N&udu5|A$L-B3FdXvs{V?tXnB`*rDLPS71U9VS5|)Ehj=C73lHzr?OdYJ&4ubxtess-rFGq%iZ5-9vN~h*l}GxCoojL&%%ef* z!rbJQEGaM4CYek~(Z}`jI5RjH$!w8JmUyLPa?`vbxod|9tNr}RA@2Jp>;(<%-z$^S zas%Va;6F8swj3DrRWq|m_ub(-D73ApO?9ta_f2Q@Yno19pG$;%@6-kmRi*<0r@>b2*p0 zjAC4IV*CKsl!TjSljaYxGLhXy`lB}(@-T{b+wZU!hg5rBoV+V}RsYJRc!We|6|w(( z;QNRVZQ-y}0<%Q^{6OgDP5OYPS^|Y<1%9Wdwm&snSy?2G(V^v@aX~=F>%n?y2A%XA zkBHiou%iJ8x6!mzp*6`Hq#rD7%WR%yd%k4h^$-%G%o4;QpVyTYWkso?khmpokTlai zycDI*JaOc9QNpHVtV_EYQjklku~%i{FxOOutwaB+%H|E{CB(?NS?NujF$9&RL8@lJ z{I{8f5wEtksT}X=gfy2HRI8lSRaP^6vu-SGH#>mMu*is@g!u=Pac1z69`T=&HNBH! zgG?MYRj2goMutwL3PzKot3h@(SyGhkoFwrOgaXT*k{(!eJ~E_V@i_J-zCwj5i=1OS zi9Xrs0j48WMvYwv~elj2X^^L<&Fr<~v zG6aDA$5WCfPE8uFu>EqE$L$~Ca&OK^%*Wjo&pUFiau#T*eScv17I6AU7}%!3R3RaB z4Z1u7h=^yOFi~mrKkC?SdYSDTq_i1Ms=>A~fu4Tk9ihBWS0bW~ABS_r|V zvSvc%baocX>2wCUAH9AC2nr9g@hj|cl~%VGtroH3R(@AoVX?LxaB?n$q3s``>ew## zP|)cA4m_;hFXNPu;w;_qYlA9io*FPe(eDd%AuJYpSKc4)X2*DGHtK+cCHWh(uhCgm z6UxTu)(4e?=Yw3!SxS)KNHSp0sdoEZt@iQu+=OgaI@6dOQwTCeVf1Q9+SRf9Zs1)Mx0OeS;2vS|hAZOyQ{tSaJ;-u9zd46b*g76sWMb1I>t z$KsD*|5V}|=I2O0@&AF*{dM8xp~z=0rgr>hYd3d)?Km%dP?dWyq>EGIV^HiJr?o7x# zUgGkp-qqPJ^ftP0eUY1w@GGs2g#?**LC^>~07n;y#OY|WWr<}=gUu~aN`o4d6H8`a z6rZC)OaQchA7P8NX-XPzY*ph^?}5lABk1_18Bi?emRA>EWXV6AmBFJ0aKt zS5zVW6{N^90tQ$(Q7~3yJsJ1_iiJ8?jUgSVkO-e)6mPgnb~Wwy751~j>a-uu>74JQ zv*NGE2Od`Gof|pywCZwv^FAul3yXF%B1^Azhp*r}Tqy-=2}<|R==mxzg#dTOFIeld zXhd%l^~&NHx`J?$EfQ=~OC@ytUdl~+&DnSZ5OO5J{f#IUL6UN1ET8R=^RxLDTy;NOu z6l_|x;?Lro?1(czDg%3Bex=f;bs3+as!)lVR&{;r{gyhQb9)3vcSS!K_&FejQddTc zRCBDl>67XwSc|zHN_^`;Gca&bl7jqk`)C5=n>SVkU_gXJ+?svWCD|pk zaD%iM?+=yRJ1^dmDs*_qmaw^)x};iB3(OxHWM709)eiJNa!S+q69so|t@E?opWt}q z70h4vZA$+Xej=?=pUf-Rwn$TG$@PCiBlu<%#($a{5VuAKbvb?@cM$AYAG7tn6S|mW z9>=0q9^5JV(i9`2^p-(sS@xYJU%9Fu8MtqZs<9b>g9uriGI|B6+v+ROFmGh{l%Tl{ z^1a#==0`?qk~GZov6l(G*$Q+&Ln;p)_ke@~_DR8C181aJ3vOL5yL)hE*L%$;f^V?p zTn{{;RmLU5Y=@!&y0iF z414o-W97AGS^S)Ig(!)P3L1ukiPRiB!s=)70?N9~exv++ZW+Y)E5<0KC88u==Chb4 zbP09Eq7GFCazGNMCqFt}eHeDJH(bPMB|4V`Q`@(C_1Q&zX=!^}#V`~JcN)wuWgT3z z#-Jims%Bo!ImHb41DgaZ7WvF5m@OMgl}s(egx*hrZ;24lE=D6-Fykp{I6ug>rb-b2 zp{ORARU%FKeI_!rN$MfM&U6~IgSj|!8?6vrv!J_rSg3;_ zyawEml(bT|Zag+sCE*x$#Ne;+Ocxm`CX?Pc|M*H5H-kP$ao3cWMHf*k1%?=BmIVnvmYufta-G$Xwd;j476%DIa)OLJqH*dy ze#Q~}^;2^oSq6bkNyRambE*DC+%IH<>@n1WS|$RsUXV_2kk(68`ntto+M9mV21=7O zgao~Y$|&E-dMHJf3ldVI^>FrV99GL?l05^(1Pqk3T5(b#SU65^a6&PW37JhT3P@o^ z#J<0>Fw4MDXNXr0m?=`ix7D!yfS)t&h-^-EW$)yX;7T6wcEYNIBbp8LG%Hh8`}-NV zT>ShGl>CAe0Kf~R_y28R!BR9LA^k^PUnF2M`5y|P0wBi!q2MV10AlzL2@0gC7p3`! zf&;@~f<*qNRE8+T5h(gb|5lrT1c0J|q`<$qFsQt6;9EDVij_l~ofi2T(U*<8P7zLxUX> zS5x?+h#34A%n$R|-~9J@QN$+tkDkA<56qj^jw>385vpR*@y*SKu|o@MZu1qrj0qc% z8ZJ>_N7e!KMG^DgjTk%}2=3qN{%OQskc<}~W9GC#rEl|$0`gx#S19I7Cl(mHWsedl zvQ(g$&fbsG5m;OI;1a|uE(#+3C?U@}5Ip~i8!D~nLNBk5bPz5MLFNq;X{Od}`o+F> zRn4*+V}*^t3(-bO$NLpsl^b|WUDDJ7cU{j8Q+w!Fz!iYsPjyiah! z#AHU#fyk8#|0YU{t!;7wn#ik&<~4Y~$V>SkCS=k6GFLV4+rV9kgt5aMZu>{yx)4zw zoXuU+1D;3}LQD@8xLA%^aXs{kai*%RuHDjF#LnTL+XU8cikH^RH+otfgoz7g1EAX% zQE7)Ko8z3@yrS8^@4e7dhS*5B@Ag3sMM1^Z#$S;Blu_BjRuF%AEY+u%>$J^-%syHQ z6i!6r`>uKKnnz+6*k?|A^kJ)4g9osf9Xlz$qJf6;g#5Gpd~PsQt~^gwFTKukULOve zJb6JH#Y5jWpnUpRj4QfDwTlrO{w=t__T&7OmQ4tp-~bZ-cO*YFdqr%4D(R0f5kZ)6 zLqnQZ!M zixH;fE3R)ZLj)j4tSI&HQuq&$iJBO2!AB7c@EX8MCBR=<2p1@$$d-wGRBy+W^uz@= zR)zCaLgb&oAj?m8Z;tEy3`|ZI|e&^Ui{+EfTY^1J1!XE$}m4k9d({n2N7^)%qw#> zAUp#pQXaEBIQCnhp6d^67$6(~E@-0Ku)_*{52#H*BC0rbA!wqOkXckTAkZe?(^U35 z&ypuck^tGye4A8`)nT^QZC1z6oddX`##D&0(I0IsXvgV}j53+uzCwkY(gr9P;3QPR zgnJ&*yc)75v`!F)Rq5?!XAwmlL9^G}4!L_5=6M8h>;Q zvAxe@JwK!yM=w@;t6i^kp(*}7D3J2Nb;D9j;l!i|G#NXF4{(YlL9F1-NDQ-$_eLLf zkjdWyC;+?)q)QejQ!S97!z1fwV?|KquTe$Xnb#F#!9dDq1L?q;( z-m7_Fb#&=ZB861;bnV49djt*mGom`QF67_!=pu8qJQVdqfA`&l0&<&hU{xWeMyRa{ zb8+1eo1mzC9)savVlh<&NGuPgBRe8=RCObHcavSdK@3HN1gC|U1eYa~!&0^xd1h3{ z=^^jzYlzzh(-!C1px>PU1c`$3{>SdsSpoCMt89#6jM9P_@jAbob=bX4$bGy;>Fwp% zgwR5Lt2U8O>_Ji#vb*E@U{XELDK%-&CxkweFD7sRLP9$*6tK3}`b!42f)Oc2aTEcv znz@8cgmrVVfo9c}z?Rek_eaHm94In)zb^V^RixHx+%MR5E@tAE(M&PLUkBI4s$gdxehcM$?{y>QcMq064f@lSJoPox`)ou^c$q)v; zzO|+f-Me;#GD5|^`Fs(4jYxNq4~U8lT?n(&npvjs;Ut(Y9V@xzZ;M^w1W`g-U7_DM zJvfC?U^-xG4F^kM#b-MYo&h2r7G=eN4*~wqfPt-KvaxG`Dt~4_z4)@!-a>m#=8i9c zcH9VddEv%lp}IT>=9Rd_*iK_M4~YrQ&Wd3glp`k1BkTP_h%1Q>*GaudvqrDrH) zr|`82M`b0j+4G@t42=Y;=-LX!BkjAZck8=a|BM!~xj zn4$uJVzPGA(p(mHtknkAc3Yt1Pm^^j7t41E!NA9wpQ;wP4hsv+;y zr0%}gi4@4WiBE}<9#TyAqSS%%A!UJdG@?iVOfZvPAjZOGK_Fu zZQRfwI&?vl3MylSh8CY;&;#=|YUW>h+98V-xm9j=gXCUlTGx9q_1QZjkddf>iqa(! zbf!g3Fmh8Q@M^H!Q2r5;%^)KTZ)-;(IZp!@{dJ$^hOauDnWDdF{f@|^r$H4@ZGzBq nx7i(v6z<+N)|g None: + # Mock + pre_id = "123456789" + dataset_factory(id=pre_id, viewable_file_name="hat.vtp") + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": pre_id}], + ) + assert server.compare_image(3, "mesh/register.jpeg") is True + + # Import + with get_session() as session: + session.query(Data).delete() + session.commit() + + post_id = "987654321" + dataset_factory(id=post_id, viewable_file_name="hat.vtp") + + server.call( + VtkUtilsView.utils_prefix + + VtkUtilsView.utils_schemas_dict["reset_project"]["rpc"] + ) + server.get_response() + + server.call( + VtkViewerView.viewer_prefix + + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"] + ) + assert server.compare_image(3, "viewer/reset_visualization.jpeg") is True + + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": post_id}], + ) + assert server.compare_image(3, "viewer/import_project.jpeg") is True From 8343da2fe720a1c57750c40cc3b43fa72973e6b8 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 12:00:25 +0100 Subject: [PATCH 02/12] clean database session before initializing a new one --- src/opengeodeweb_viewer/rpc/utils_protocols.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 5aaa36e..c02f999 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -50,5 +50,13 @@ def resetProject(self, rpc_params: dict | None = None) -> None: self.get_data_base().clear() + # Clean up any existing database session + if connection.scoped_session_registry is not None: + connection.scoped_session_registry.remove() + if connection.engine is not None: + connection.engine.dispose() + # Reset all connection attributes to None + connection.engine = connection.session_factory = connection.scoped_session_registry = None + db_full_path = os.path.join(self.DATA_FOLDER_PATH, "project.db") connection.init_database(db_full_path, create_tables=False) From 34933a2eb7b64de3eca2c81fadbf5849efb37c4c Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 30 Oct 2025 11:04:32 +0000 Subject: [PATCH 03/12] Apply prepare changes --- opengeodeweb_viewer_schemas.json | 8 ++++++++ requirements.txt | 1 - src/opengeodeweb_viewer/rpc/schemas/__init__.py | 1 + src/opengeodeweb_viewer/rpc/schemas/reset_project.py | 7 +++++++ src/opengeodeweb_viewer/rpc/utils_protocols.py | 4 +++- tests/test_utils_protocols.py | 2 +- 6 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/opengeodeweb_viewer/rpc/schemas/reset_project.py diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index c39d37d..7f992f0 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1135,6 +1135,14 @@ } } }, + "reset_project": { + "$id": "opengeodeweb_viewer.reset_project", + "rpc": "reset_project", + "type": "object", + "properties": {}, + "required": [], + "additionalProperties": false + }, "kill": { "$id": "opengeodeweb_viewer.kill", "rpc": "kill", diff --git a/requirements.txt b/requirements.txt index 9e24baf..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.6rc1 diff --git a/src/opengeodeweb_viewer/rpc/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/schemas/__init__.py index 4452316..99aac02 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/schemas/__init__.py @@ -1 +1,2 @@ +from .reset_project import * from .kill import * diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset_project.py b/src/opengeodeweb_viewer/rpc/schemas/reset_project.py new file mode 100644 index 0000000..681106d --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/schemas/reset_project.py @@ -0,0 +1,7 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class ResetProject(DataClassJsonMixin): + pass diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index c02f999..32151bf 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -56,7 +56,9 @@ def resetProject(self, rpc_params: dict | None = None) -> None: if connection.engine is not None: connection.engine.dispose() # Reset all connection attributes to None - connection.engine = connection.session_factory = connection.scoped_session_registry = None + connection.engine = connection.session_factory = ( + connection.scoped_session_registry + ) = None db_full_path = os.path.join(self.DATA_FOLDER_PATH, "project.db") connection.init_database(db_full_path, create_tables=False) diff --git a/tests/test_utils_protocols.py b/tests/test_utils_protocols.py index 725bcb6..f82978c 100644 --- a/tests/test_utils_protocols.py +++ b/tests/test_utils_protocols.py @@ -38,7 +38,7 @@ def test_reset_project_after_import( + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"] ) assert server.compare_image(3, "viewer/reset_visualization.jpeg") is True - + server.call( VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": post_id}], From a8f1a05a4341627f9eef731451d311fcfdab0684 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 15:04:39 +0100 Subject: [PATCH 04/12] add import project schema and replace reset project --- .../{reset_project.json => import_project.json} | 2 +- .../rpc/schemas/import_project.py | 4 ++++ src/opengeodeweb_viewer/rpc/utils_protocols.py | 15 ++++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) rename src/opengeodeweb_viewer/rpc/schemas/{reset_project.json => import_project.json} (77%) create mode 100644 src/opengeodeweb_viewer/rpc/schemas/import_project.py diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset_project.json b/src/opengeodeweb_viewer/rpc/schemas/import_project.json similarity index 77% rename from src/opengeodeweb_viewer/rpc/schemas/reset_project.json rename to src/opengeodeweb_viewer/rpc/schemas/import_project.json index b28d1f6..16201f6 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/reset_project.json +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.json @@ -1,5 +1,5 @@ { - "rpc": "reset_project", + "rpc": "import_project", "type": "object", "properties": {}, "required": [], diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py new file mode 100644 index 0000000..24c237f --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -0,0 +1,4 @@ +from typing import TypedDict + +class ImportProjectParams(TypedDict): + pass \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index c02f999..9fbdc79 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -8,6 +8,8 @@ from opengeodeweb_microservice.schemas import get_schemas_dict from opengeodeweb_viewer.vtk_protocol import VtkView from opengeodeweb_microservice.database import connection +from opengeodeweb_viewer.utils_functions import validate_schema +from opengeodeweb_viewer.rpc.schemas.import_project import ImportProjectParams class VtkUtilsView(VtkView): @@ -27,16 +29,15 @@ def kill(self) -> None: print("Manual viewer kill, shutting down...", flush=True) os._exit(0) - @exportRpc(utils_prefix + utils_schemas_dict["reset_project"]["rpc"]) - def resetProject(self, rpc_params: dict | None = None) -> None: + @exportRpc(utils_prefix + utils_schemas_dict["import_project"]["rpc"]) + def importProject(self, rpc_params: ImportProjectParams) -> None: print( - f"{self.utils_prefix + self.utils_schemas_dict['reset_project']['rpc']}", + f"{self.utils_prefix + self.utils_schemas_dict['import_project']['rpc']}", flush=True, ) - renderWindow = self.getView("-1") - renderer = renderWindow.GetRenderers().GetFirstRenderer() - - renderer.RemoveAllViewProps() + validate_schema( + rpc_params, self.utils_schemas_dict["import_project"], self.utils_prefix, + ) widget = self.get_widget() if widget is not None: From 0dd5977060858027fdcd602eb6048baa5a8f95a1 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 30 Oct 2025 14:05:21 +0000 Subject: [PATCH 05/12] Apply prepare changes --- opengeodeweb_viewer_schemas.json | 12 ++++++------ src/opengeodeweb_viewer/rpc/schemas/__init__.py | 2 +- .../rpc/schemas/import_project.py | 9 ++++++--- src/opengeodeweb_viewer/rpc/utils_protocols.py | 4 +++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index 7f992f0..319ed44 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1135,17 +1135,17 @@ } } }, - "reset_project": { - "$id": "opengeodeweb_viewer.reset_project", - "rpc": "reset_project", + "kill": { + "$id": "opengeodeweb_viewer.kill", + "rpc": "kill", "type": "object", "properties": {}, "required": [], "additionalProperties": false }, - "kill": { - "$id": "opengeodeweb_viewer.kill", - "rpc": "kill", + "import_project": { + "$id": "opengeodeweb_viewer.import_project", + "rpc": "import_project", "type": "object", "properties": {}, "required": [], diff --git a/src/opengeodeweb_viewer/rpc/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/schemas/__init__.py index 99aac02..451f1fc 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/schemas/__init__.py @@ -1,2 +1,2 @@ -from .reset_project import * from .kill import * +from .import_project import * diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py index 24c237f..2fd045e 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/import_project.py +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -1,4 +1,7 @@ -from typing import TypedDict +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass -class ImportProjectParams(TypedDict): - pass \ No newline at end of file + +@dataclass +class ImportProject(DataClassJsonMixin): + pass diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index e00ec9d..7f2ae4d 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -36,7 +36,9 @@ def importProject(self, rpc_params: ImportProjectParams) -> None: flush=True, ) validate_schema( - rpc_params, self.utils_schemas_dict["import_project"], self.utils_prefix, + rpc_params, + self.utils_schemas_dict["import_project"], + self.utils_prefix, ) widget = self.get_widget() From 2461e112b8fd30490bf7e02c0694cb474efa20cb Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 15:28:27 +0100 Subject: [PATCH 06/12] type --- src/opengeodeweb_viewer/rpc/schemas/import_project.py | 2 +- src/opengeodeweb_viewer/rpc/utils_protocols.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py index 24c237f..fec4f41 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/import_project.py +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -1,4 +1,4 @@ from typing import TypedDict -class ImportProjectParams(TypedDict): +class ImportProject(TypedDict): pass \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index e00ec9d..f3cb023 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -9,7 +9,7 @@ from opengeodeweb_viewer.vtk_protocol import VtkView from opengeodeweb_microservice.database import connection from opengeodeweb_viewer.utils_functions import validate_schema -from opengeodeweb_viewer.rpc.schemas.import_project import ImportProjectParams +from opengeodeweb_viewer.rpc.schemas.import_project import ImportProject class VtkUtilsView(VtkView): @@ -30,7 +30,7 @@ def kill(self) -> None: os._exit(0) @exportRpc(utils_prefix + utils_schemas_dict["import_project"]["rpc"]) - def importProject(self, rpc_params: ImportProjectParams) -> None: + def importProject(self, rpc_params: ImportProject) -> None: print( f"{self.utils_prefix + self.utils_schemas_dict['import_project']['rpc']}", flush=True, From 8bbac392cb2bff37e7a804fe7d8664d2578f8d94 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 15:34:23 +0100 Subject: [PATCH 07/12] test --- src/opengeodeweb_viewer/rpc/schemas/import_project.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py index 4910951..621117c 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/import_project.py +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -1,6 +1,6 @@ from dataclasses_json import DataClassJsonMixin from dataclasses import dataclass - -class ImportProject(TypedDict): +@dataclass +class ImportProject(DataClassJsonMixin): pass From 3870e81b6e523cdb8645a2804ff04bbf6a5bd99c Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 30 Oct 2025 14:35:01 +0000 Subject: [PATCH 08/12] Apply prepare changes --- src/opengeodeweb_viewer/rpc/schemas/import_project.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py index 621117c..2fd045e 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/import_project.py +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -1,6 +1,7 @@ from dataclasses_json import DataClassJsonMixin from dataclasses import dataclass + @dataclass class ImportProject(DataClassJsonMixin): pass From 15f1aebed8b2274fafd13d582ac44c871367ba76 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 15:50:38 +0100 Subject: [PATCH 09/12] to_dict() --- src/opengeodeweb_viewer/rpc/utils_protocols.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index a572107..9b2f942 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -36,7 +36,7 @@ def importProject(self, rpc_params: ImportProject) -> None: flush=True, ) validate_schema( - rpc_params, + rpc_params.to_dict(), self.utils_schemas_dict["import_project"], self.utils_prefix, ) From 3732c429b93847bb0b6594c2d01850eff8d1ae1c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 30 Oct 2025 16:20:22 +0100 Subject: [PATCH 10/12] cast used --- src/opengeodeweb_viewer/rpc/utils_protocols.py | 3 ++- tests/test_utils_protocols.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 9b2f942..a5f5858 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -1,5 +1,6 @@ # Standard library imports import os +from typing import cast # Third party imports from wslink import register as exportRpc # type: ignore @@ -36,7 +37,7 @@ def importProject(self, rpc_params: ImportProject) -> None: flush=True, ) validate_schema( - rpc_params.to_dict(), + cast(dict[str, str], rpc_params.to_dict()), self.utils_schemas_dict["import_project"], self.utils_prefix, ) diff --git a/tests/test_utils_protocols.py b/tests/test_utils_protocols.py index f82978c..a7c373d 100644 --- a/tests/test_utils_protocols.py +++ b/tests/test_utils_protocols.py @@ -29,7 +29,7 @@ def test_reset_project_after_import( server.call( VtkUtilsView.utils_prefix - + VtkUtilsView.utils_schemas_dict["reset_project"]["rpc"] + + VtkUtilsView.utils_schemas_dict["import_project"]["rpc"] ) server.get_response() From 4540bfc13ec7a1b4fba356c9341c45d8bb2608f1 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 31 Oct 2025 12:07:29 +0100 Subject: [PATCH 11/12] delete former reset_project type file --- src/opengeodeweb_viewer/rpc/schemas/reset_project.py | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 src/opengeodeweb_viewer/rpc/schemas/reset_project.py diff --git a/src/opengeodeweb_viewer/rpc/schemas/reset_project.py b/src/opengeodeweb_viewer/rpc/schemas/reset_project.py deleted file mode 100644 index 681106d..0000000 --- a/src/opengeodeweb_viewer/rpc/schemas/reset_project.py +++ /dev/null @@ -1,7 +0,0 @@ -from dataclasses_json import DataClassJsonMixin -from dataclasses import dataclass - - -@dataclass -class ResetProject(DataClassJsonMixin): - pass From 9bc56354b8159879208a2e8f26a00f0e4609880a Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 31 Oct 2025 16:31:25 +0100 Subject: [PATCH 12/12] test --- src/opengeodeweb_viewer/rpc/utils_protocols.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index a5f5858..73969b5 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -37,7 +37,7 @@ def importProject(self, rpc_params: ImportProject) -> None: flush=True, ) validate_schema( - cast(dict[str, str], rpc_params.to_dict()), + cast(dict[str, str], rpc_params), self.utils_schemas_dict["import_project"], self.utils_prefix, )