From d99bd2a51067da0e07576029da27e6e86a98cc5e Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Fri, 20 Feb 2026 15:04:45 +0000 Subject: [PATCH 1/2] Refresh Vuforia secrets and simplify admin script Replace suspended license credentials with 100 fresh cloud database credentials. Simplify the secrets creation script to reuse existing VuMark and inactive database credentials from the existing secrets file instead of creating new ones each run. Co-Authored-By: Claude Opus 4.6 --- admin/create_secrets_files.py | 85 ++++------------------------------ pyproject.toml | 2 +- secrets.tar.gpg | Bin 17558 -> 19046 bytes 3 files changed, 10 insertions(+), 77 deletions(-) diff --git a/admin/create_secrets_files.py b/admin/create_secrets_files.py index 13d2310d0..7e62b84b9 100644 --- a/admin/create_secrets_files.py +++ b/admin/create_secrets_files.py @@ -19,11 +19,6 @@ from vws_web_tools import DatabaseDict, VuMarkDatabaseDict -VUMARK_TEMPLATE_SVG_FILE_PATH = Path(__file__).with_name( - name="vumark_template.svg", -) - - def _create_and_get_database_details( driver: "WebDriver", email_address: str, @@ -55,25 +50,6 @@ def _create_and_get_database_details( ) -def _create_and_get_vumark_details( - driver: "WebDriver", - vumark_database_name: str, -) -> "VuMarkDatabaseDict": - """Create a VuMark database and get its details. - - Returns VuMark database details. - """ - vws_web_tools.create_vumark_database( - driver=driver, - database_name=vumark_database_name, - ) - - return vws_web_tools.get_vumark_database_details( - driver=driver, - database_name=vumark_database_name, - ) - - def _generate_secrets_file_content( database_details: "DatabaseDict", vumark_details: "VuMarkDatabaseDict", @@ -103,27 +79,7 @@ def _generate_secrets_file_content( ) -def _create_and_get_vumark_target_id( - driver: "WebDriver", - vumark_database_name: str, - vumark_template_name: str, -) -> str: - """Upload a VuMark template and get its target ID.""" - vws_web_tools.upload_vumark_template( - driver=driver, - database_name=vumark_database_name, - svg_file_path=VUMARK_TEMPLATE_SVG_FILE_PATH, - template_name=vumark_template_name, - width=100.0, - ) - return vws_web_tools.get_vumark_target_id( - driver=driver, - database_name=vumark_database_name, - target_name=vumark_template_name, - ) - - -def _create_vuforia_resource_names() -> tuple[str, str, str, str]: +def _create_vuforia_resource_names() -> tuple[str, str]: """Create names for Vuforia resources.""" time = datetime.datetime.now(tz=datetime.UTC).strftime( format="%Y-%m-%d-%H-%M-%S", @@ -131,8 +87,6 @@ def _create_vuforia_resource_names() -> tuple[str, str, str, str]: return ( f"my-license-{time}", f"my-database-{time}", - f"my-vumark-database-{time}", - f"my-vumark-template-{time}", ) @@ -157,6 +111,14 @@ def main() -> None: "client_access_key": os.environ["INACTIVE_VUFORIA_CLIENT_ACCESS_KEY"], "client_secret_key": os.environ["INACTIVE_VUFORIA_CLIENT_SECRET_KEY"], } + vumark_details: VuMarkDatabaseDict = { + "database_name": os.environ[ + "VUMARK_VUFORIA_TARGET_MANAGER_DATABASE_NAME" + ], + "server_access_key": os.environ["VUMARK_VUFORIA_SERVER_ACCESS_KEY"], + "server_secret_key": os.environ["VUMARK_VUFORIA_SERVER_SECRET_KEY"], + } + vumark_target_id = os.environ["VUMARK_VUFORIA_TARGET_ID"] new_secrets_dir.mkdir(exist_ok=True) num_databases = 100 @@ -175,8 +137,6 @@ def main() -> None: ( license_name, database_name, - vumark_database_name, - vumark_template_name, ) = _create_vuforia_resource_names() try: @@ -195,33 +155,6 @@ def main() -> None: driver = None continue - try: - vumark_details = _create_and_get_vumark_details( - driver=driver, - vumark_database_name=vumark_database_name, - ) - except TimeoutException: - sys.stderr.write( - "Timed out waiting for VuMark setup/details after retries\n" - ) - driver.quit() - driver = None - continue - - try: - vumark_target_id = _create_and_get_vumark_target_id( - driver=driver, - vumark_database_name=vumark_database_name, - vumark_template_name=vumark_template_name, - ) - except TimeoutException: - sys.stderr.write( - "Timed out waiting for VuMark template upload after retries\n" - ) - driver.quit() - driver = None - continue - driver.quit() driver = None diff --git a/pyproject.toml b/pyproject.toml index f4e49c096..d50470288 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,7 +105,7 @@ optional-dependencies.dev = [ "vulture==2.14", "vws-python==2026.2.15", "vws-test-fixtures==2023.3.5", - "vws-web-tools==2026.2.17.1", + "vws-web-tools==2026.2.20", "yamlfix==1.19.1", "zizmor==1.22.0", ] diff --git a/secrets.tar.gpg b/secrets.tar.gpg index a21cf43fd538155a3612c7f1b41c19eb17508113..32c9b9c6f5e398b64161ca4cf9bd9aa193cca373 100644 GIT binary patch literal 19046 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 literal 17558 zcmV(jK=!|k4Fm}T2>Ds<2*;ntn*Y-30jF-+f7lGhx1;y4H;_|%oC=38-GQgs7oM1X z!x3=?=U&UVgOq^LM$F@SL^+t`VgYFgR1C+43atW*$+G?TklQ#DVNQNS6wz7rUB}ki z>KQbJz_1*%a1C;=ttN*EO7zy0JGSPL{)rOl7Z1=fFw3Gi^TYs@p@~$(k$=eG6Bt7W z)wMEzqdeyNI}@f$_?YP>P5ND~7&vuSZGzEj z)UoYhb2gxeYAkz%u-rMH0nSSL9CHCRq`VJkAn1wd$PorFzNyJT8w||htxq{cfTNIFWUP~G?n+7%C?Ua zefq#~B2App--jV2BysX(^~xtk{sOFEPuFMbSm)`Rf0ABxKqO46MsI-tno%}aDC1rO zGEfp4jc4uaiPiMJD;lSG&>Adx&J~)6+|L90q*}g>lrAxCwqd=9dJZ^|jpf}$d>o!b z$0Cp5b7f=dCXM1(i-~;##$C7T{yCy<8JT$eNkg+@k?Br+WD{>AOt zR@Z7>8aQAiCtT`eZA^wFLH#4w@t~ndAZ*O@3NAmQue{SOBEfQ9`^}J z^v>hw$IlFqDSgzNyrKpOtiCpyw;f|V%0eg}{KXQ5C$ngl#2ILri41K|c7#?ZtTcAX zP6TdjDUWffA1}5=?btm*sz%Q~f}ita!po`zCY)w390{r~dmxIVxv~5w2qN(9DCkbu z@j;0|he@w^uhrvoDLt;Har9KAv2T=7Vzv5Q zgr4l%QcefIQ;=|-#~yq8ZlbtzN;Dw71<}85v(s4kEMEkyTC=@al%gbGnfk9qranSs z(E%mao*aK=3C?Evfx;N}cn*DkSP$}@8VuqH)%AKlB|JrFxJgI-a6L#BnNr;=pnw(9 zN7IpbY8L1C|3*kWHIP-@66!b?(~$}9?2Na-8{ZgmX;=`QFQeb10y7|mdVQH!eZGU0 zfMr>kcgCXO>HtA@DEj}-cm#FiAZX4WG%KSdZMh0f;~@yV^xbB0&s##xlTH=^8^21j z5$BLKnXatydSp~+Suc3Nyy!KMl;e`^ry&JaR6DK_>CW5`T$#ZT&@(6Si^YYC@8eR44~-o9FtOhS@h4L+vS_`Eadg1*gB)kf16Af)S38m$aH#o)%RLkn(eREwUMzQ}h`&8#6L=GFm%x-wxtBHh16ha1a;^3+myx^0Vfv4v~i{| z7}`AK=9u?0@3FDMUh;+T6#ahCs-4pHii9>6v?+Y4d?8fYbFM9Iz5^UBW8K6Lj;67U z{ZfetY?s*KEn&ZwNi&Pr4T<43ZfH5|WfcH`6zy!hx|QPjC3eAAZ3n(m*f9syg`Zv8N>>Xo`;n;4^6Hgps+-fN+^UVD( z{fQKrb6z=vCLA+>l{3=ZqCJUoqK$c+qrpZMBBH1k#yn15>Rm#fbu%%xX{q;Wyi*E| z1#`Oo=-a7rVSC^?B0gwwNO{jT4eolN4KV?dX^4!JIrF#Bh}V2Y1yc9%JKZgwHVsTzUHAAfeGy#R|{a*i&jy%SKCbJ>IXH$7=_onaBx4v;>h0 zFI7p1y@d7G^6j~g0Ep7o<6*SPgRq$m!@WRVp3F&0QK3guEcz;chcMQNRYw?=^MYPcw;uBUtQo>m@?t0{{5w_^5F>mu- zVF(noega0qmQp*Ln_o+a1)RjGY$@|66(!2psSYgls|kkDjG^doepdQ{fYbV@LQf6r zoYDAnQ>PH&O!T`3?j11(SP6vn1T#7Wzw2@~!>3}#cr&F2Fe;s@-B_Pt&)Seq$HISU zn-+MIgzK$7B$*|x$mcin;u3{-P9rp^`sw+ObJO2w@cQcCa=#+IXN*efienBiC*xjV z>J^pt=t1k-NUmV9zenm1}q!m;DrEA z6utm>ZHqEG9+s6laZc0zvII4MR43C76v-8dr_`5{SbZ5-v*PF0VTnJjGa0#W?CFQUmP;{ti9V z$5-Q&0vf3LnisgOuLFK8=9MKqVOT>8&=a`?U$OyBG`lOSacyLy@mjN5S~9AaDB&;M zmNo1Owq|Mg5q?ZuPehrCNkaEebwqqA`YB z5G_H|s#@H5C6`4-FSdw{L?0f>O;&v&M2=I8n1sQHf! zyX^WU<#a67MuwoRJ*Ctnrb_)cMXUpBLPpL`1R>6y%$$cuzGd`9W=eR%h=jH>h?Y9^ z8d1oa&(StbhQe}hi01s(52fYAt}G|tvzWD+1Msv6TpX2h?>s(vro4_S;p)f{ufP z8`fWz3!}UKL?jB)1)UHHL9&{3^J_w1yfeA4E5d+(Kd(eCLpf$S{|}YJx~Rt$BO+9! zA^bx!BC<^ywU*I-fMXYBrP{5U-8Rggf5w}b)R2n9y%lgu-r?)xz2Z?TfyH@E1c#0H3V7XNChDEzsa2`(xF=;)?bt=4hCPuy z{=i5$SzZ;nhL-3QtdM-^^TulbCtaotaZo(ke)zNVtNlt2E{1AUfiu zm~RbMx@-P{DG;HJ$(cR#28zxM(#?W{A_s33i4u3w=Om0Hdr;kUxNi0FZ2P|KI;MGXu-;}qT(;6*=m8Ubm4H2h1ZzgQd%Tkwkk_nkfpgb$Z=s8^DsuR^k zlYOc*dRm0%J{Olzk`xolHQb`(8(X!6kPSv@UJcFL28w@^#Bp>&!Um+M=pD?iN4^c@oYQ$j#nnC@ELg|!r*qFg z18>UQY5Vc^o&8`>b?$0Vc|=}{Sa2ZLvb@Oxoczs>khbll`5B^@M~9sW}7+xJh)H@!c43^!3h23aFJ2Ecn{6cqL3u4vK^0 zasZ128tlE7wOjr^RXS99CJW^kbYYyji;{eD{QJMZ>^SF1Z!{6Ae9g$UT##<{hAzF% zcxmPsSJxl8hC-SNNMerk5M2$xc%PrF@g+8t3Em#1_?|CfQa#?)eudpCK&N2CIVD%l zeUb(V>roz-Ptsk1L(oIz())Pob4^~*P}-5PSOM$GeftJ(!v!m>94tiT&AxmSk{3R+ z5=!wr={Ku47^Pei7wO4rHwuTIS-1!6v+S4Gu&XBkZwIjLkYBwIzEk0SKh=)2;I%z> zqw!Fb-v;m{TfO7vO~_9I0AqbZpE|^uiS;LF6;7pHa02@u2RvYKHA$0516a{;c$cA; zQqm2oxOSB!VB@P4W;8TEL@$bj-#N>vJOM@N1|SEal#r7@HqGDgKpBN(j1s|vX+HfjLxh(rS_)v(Au^Z{ zlZ(@OaEs$8+yxorJ6~cE!&K~dMltD@&>%dEA^!kk?}uqW$*7Q_{LG;C)EJ*fy>ESA z0+|7n@iGyy96ytsw{6*?>>SjLPsk##vNkp<#Y)#q`4m;z34GcbgzJ-z!x|R#x0N1s%FXGK$ymNLcd0Lr4>e|IQr=?Qw@%qAj z83_VQ*H?F%Pv%coCx?qERFpz+y?i?Zdl~Y*O{Po(&(`Fk+yGwugji^qz=@BKzc@iC zs);A#d!my_v8Zh@_8}*qmTg)Z&VU6OgL?&;(46f0FSiRC(`;rn0XkU! zZVSfi50-QTJZDVPgg1-2wkk0|c}tT&uen^GN`H=g%AUWOT%8O59~daHUFEN~3T4CZ z$<~pkX%F6FsArx^T&U zd6u)gfx|4kAXb&Hy>G^pzJyDkgO6Ga=_XH|?U+Yx-@JwHs>8o>-)qvlP<p1PebX{^#Gm}e&!Sy-M@!PBKKQ3tTZ3W3cv8rmywW2j@M<@CO5V@ z%Ssw=#tcW-EUbPE$#T+iDMY*;#Vqq4F)zNFVQkmt|8l7!&=-cTPFN0!)LP479d2Tzhr+Iy?M$xMZx<5}SX(?%wMmFxP#|{*ENq zqm)u<6R3K34hhn%p2%_mKNj`WR-qMCkRAdK6t@)h@3TavUD$}%!UB2)P6{HO>S|rV z>16|2Dm=K2tRe>R>j%y+TlA(a5yfI&@!k#&munCnLUczEgd9o%10K45K@fo>6Z1`S z)FQ1HGF@$>V9#`19hl2-Cm(lWx3rF(L>zPZT~CQEq)Vq;H_KKMD1DYn(zw;HZ8wdR zT%>t>8#Ahc@I_h6mMkp}=-}FS_;E{GbCPolfMYN9b#%lzGeJz3CT@zO@B>Jl(?c!xpb*rr`yW0kr?`w!-T1xr;fjgL6eKNqu@E@mh($V4);5V z8$q8*t7I1zLN$#0q1cRu|KZcz<*wQ+QDiTB!7uwd)30Kl)eOwG4PSHGkQ6o)B%y|^ zuT?xGT%il*D%*?4e^z$ay~o8W{L|V51DT{u6-8X`j5%^SMS0Q_{62VUBrXgtX6S3x zJfgCWT_JV1kn@Ig$vH0oYnyNAnnMqvo1bBK6!s%clK5HP?0jSNVXHu(rIQzjzbDgU z6gcOrN6kPpcaCVlVd2FC6knxbU~L(TgXalX>g@L-BnXnH;;K^-1dylahJt zxq1)YW>j-tnND&OERzfE%ct7(i2S~JEl`aFe{##tM9Z;(9reVpm!PXJO01a}2s2V8 z$4NcBIugF7IL2bM#+&=yYox71JgBgZQf{-IpK#F1ad2m`-NU z(5E?WSgl9O^KRI?z$)->aG*+(^RHnS#cyh#TopW$et*a7+i&-!@dqK`f*wd4(J=B< zC`S?BBHd%u@;d+&%>cPU;d$H%D#8p%vhoSw2`$>ZyqO+0y4NzU$#2f$u=;oHf=nsy zc(5x|o+9Pg{?cDgM`8-LiOiU_sJ{>AYkK8l54!MIybEM+7$L8aR)`vn0{(NnCG0Bg zZGx4TJ3ZHBE%ra@LK32nl~f&>NMVy0e{)GX&uz9CUy9&nJARHSm2=V8FXxL(yxtHY zl%*v1aTDTryC-iA3Iq9>nHsm_wD6{88Ta_fnW1Hg&`8CXKx*elC+dtV4ZzH7(#w`f zHS-%tr8bZE>}LWfFqG@8fE$7xhD>8G@Phd5HNtX|e4bvvc$o(lTef9dQRGxJ5pi>UoYwqP1I@(nm`yZTrHr5WW<3W_>KZ)3 zR@smhauP}g3eDW?0=uDg8Edd?SUuwLnxl;Qf)4vBB;qf_LaV;TVG6`UCW(N{T8MEX5E%~9pVe;*DHFk*a#iY!<%dV<46-T zz=`W=2zUQ4ZV(uIc3Vdt{ELsbsmZRDC6sV~|D?das?r#E#g&Lj@h=xePSAtly_?kj zAMC`D^tz=Bcx))3d-k)Q;hfibi(viLN^gEm#!Y_z_sUx9;A|9ei|d+O8EO0gK+tp* z2H>0Bow{lm=JV6zly~PfS7?zzF}14ZBE#Ch<8iq+UrTXu6}0)Zv^}_6p&50Re?s%j zR^O}FRP<6ar`%eqUQ)&zreIexA3`ua6hw2Tj?%Os_jdmwlA%#3g$kC>o5C>+Ctm_O z*>rOTBOFl*3%kTV%-P%n0j`JO6jWcd_{MQi^<2dN;-8PE%X`E|BF_s|jZ}2O5@GPwpUDJWcjf5$)qek6`sYD_XZ?`|ALL03LVP7dl*}} zx+7`7wvZAy^ax3Ypbbs&xIYQk?Z6GMjF#n}QJ{qM$_v<3Gr98ML1r&{2h918(}L7u z;&;c1+Cyz9AQrqhl(3P)%a(NH2!sZ1lH4gZR(}ib)T)@!24Z{FhY1Kf z7&E!^rT3CHgi|jJL!`Eo>L~#~5eVg|DDkB^U$bMq+}P$G+9y}r(cg2DuL{hP^D8%6 zkQ82+8I6qHG{Z2Wvt4Gbrg_WWSDHy@lynsd)K%XAOhF zd@!LiFi4-SKel|8f)H1q6P1kL)nI3lKYg);ImZc{jzQ#P(h1rc!ka%HIyLIe3;pfn zY&<_EGan$%Vo&8Yz=A=FgMzklWu#{UGF6>L?jA4im)CRrItf~BUCY71(nO^;V0pxtBWju5-L?r!3nF1YgTXOTk6CvjH3wO)cpZ*vJ6beshX{&oDHWE}#49meWmSC?>;dUc z!Xr_Ejj#oXk+oPBaB+Rx7(&_S7-zROfWXX2uB-yy<__pxm}%F0CjBJ8T(FH`7a8x* zytD@A*-?YzjqkvnQ8lKm-GasQ>yOnew;x3=0y&$x?X`q$do}bDZv_nj-Y9Koml@R} zOKYvx?}Ki*J+PBkL(WNT-E$eITH`JG`cKeJcJ&M zeJL#|GzbiI`YMOejMUCkNana41+7c?PrT_MyznnHNtK|yX_ zH+%Xlh^N+`ouow@gntPpA8vi6Jem8mKlUNuOs!cwy=5~=))R{Vl&OXT_+s6fXh9}2 z_}`l9-tJrZ5fbXcvXI-k*BB}_=N4GpodN~2uu-8I)!9kcY=S1%?cC8D)lQb5Uq5R8 zbnFz!q}y%IjZ0T;{A^&xu=FS^N!Sy~-?rKOqk_%{1G3^~Vq(yD6D*h2tBl?m>y`X| zc&T|(Hg6RYz_dr1&QCYk%T{Er0lplY>4qzZdvY1$dDH{N!O6JZJ;(j6Vd#(h%|5lyA0wnl9T^l) zcpWu5K#1|1fUJ2XojbIxo&4BdC_%wrsfxm1!&MGwV5t{BH@W{&uR`J!cXMjE&9I7k z!dHpM3}CM?bGK*%U0imY8U3r`@!BQWR6}Xl2x{)u`)|^1N}0_EALyboWj5<;MqCDNFC8jzEDyhIXigmr+lL;GeKK<<$t9-c zZG_c09*Q2Akhn`>MR}u#eqZwDN#?ij6euUE&Uq}{_ZwxnZAG?}1005i0o=EUaU z)eOV(>Q~E&Bg5GX7wL4{|0cHRB_(~6a4JKkiR>{bs{8RztN~wI&chv8fW;muT4_WTj$&({zeybc~gPUdOyyfr!``-W6&oqz(;3|hLfyHkG zBNhI29K=pP+H7>+1W~DFDaZA)=FAWUxy9*J9p{ij5t7w_Zuo&3NfYv@kx{@yF&0oJ z$UPo=PMn)w)rwqx`p~V!Rc>eFxD43dI3Y6vvP9X<>YvCIj$nns*)}QjQ?;F>%K_c^ z&jXk^5`(*A6l<|I2ih6K(4G~QPp>yQ& z)(HneuVI(bPwG9pfGtE3()pTw0T= zRf(#hA+mQpF?YyOqb=3*R@8v8Sm^Kyh=`>?EPCVRis zOBAR8a)=ux7I$8~n*wir|#sxG=8LY9HZ!!VKgu4QY?~<`8$i854$T z@NIXs<^zPThrSTG^i6ixJK?;e#}^=26}K4sT@_ri#}?4Wvd%6DY8~axDYxksBxD^mvQz28R5sS za$Axb#^o)3MH}Ta{m6dNh!q^(N)RI-$ZAl;M>wE5`( zQ2!%?2_T|)#mz{eBN-+Ilf2nUAMra()tR-0XC*LXGz1uGsOp7XwZQbAlGlJ(z4 z5neO5Gx)ZUIb@KdRHy!s{fwpolf}XJsDZM0x?L)8x#vqzWc?)8rA<2sj?5s0&2`Ki z)}I_v^(!CookD6xCMjn|Iq5_>=un!#L&6VW7M}lxh-y%!WFD8CW)nhZ3MOEXW;YS% zC|aJK%68{Q-YQ21z|a-jym#^KSC`g3PsBMyVibv&y~EU37qp*;PzearDpkkInbuyyNe_>;cFYf1Xc{h8GkDVf@++feS;U@ta#NhxpI&$8x{D5o?)^ zV4uQk!@vY<8HbLnEhT1Yq?BRCHSJ2WGQKVLRB=i7BWkw*tHXrDd{<;McDl5^j6J>J z!@0t_Rc#J-Ih{==16;C!+T(Nv&7&(qIFn3^7y@U$FvE`4FEVkVK@+sQ79q9gV@CJ8 zA}vDYY^>)XQXS5bN(_ksvdg#x2WvjMUF>`CTZ?FwI)JKR$0_S30J`c z1eK;0K*d6D>0k1VL8$3Y$!!d&CGE|@$ja5|$@3H*-^=>0{XE^g^_pc+m5FyYHw`_0 z(kT+xtP&ELZzqP?$&GD$5=Ko$soxj1A@ZRW;$PYEDr%ZFKLvJe&m}2db8>l6L|Gir z9snc))qYpc4#R!;G05Y>=Q0=X%`Z7RU&%{{&+qnX2d z&^J3UA}T{(?=60wY+2i5XZW0UZIYGeQy{M8L(?@Z`P59ARIebGr@Vugemtg`KH};% zLnx@exzwmQcFc0EU80mFi|*pm5^D>Ig47iPRu+LwwfeF58o#A$=*D!x#q=8?vX7dP zy(ab3?7(f#$xy71wGKtBHiU0@hQBj$_}JGS0<`E&n;hlV}pS_%a1 zv0ex+X8zU7-HDPHhBCT-U*g96^Sv4L| z%ZDj#g%t^+sN@15G(H+$mE-*RjvZN!mmZq3PkibnJZJI z2#!0;+;qh{J|qq~H-1^Y$)zt;0Zd_4el#TlB(i|kC#QA+yE%T@at(AWco|W$G}7@m zhtj93pVk)+IvU)<8%3fuCX56b&cJDLY#*!5(jnytBMy2AsxO8Eb5^9cv^OfN3TZ$!cUTT7;Mu-R!@tij7PB*0BuuiPaQP99+NFz>#B!`hwu+;0fxU5wL9b5ht<+-KNDwtzk$WcWzQVuxbg4bFxqS~f|`Zot(#q_&zKWIs@QeGsR zDObNw*Kde2u0Lz|X}dL2@9$l)79tNsKjOlomo3$(<3*&b_w8aX^)z>Qk6YOt?Y2?q z$!4_y=|J(l;tUIQ6p&Mf=e`+LB*uy!2}M*O;x7`1r$*$Ah9nGVTsfEvW1EC!< z(9d3kj~&UkjhkAC!;#&{my3=A*TB&+=b8#=eNm!;TR`Kj21HFDkJgPRG8<*Jbu5r)vY-Yr{$ zxaX~l1wql9EUQ|6o7ueKKT)C?G)7^=(X{z`Yq0UEgi(fxV5mgkGOLXv5 z(TSEV_-y&qICsBI3?UrA$u&7C93@q189A=JXB7qF1x>LUHQ`1-7aDlf>J#jw*6hU8$FUEAU?u@-`A-4fGW9@gt4X zS?~LfCjwtEF`2OBjr{i=)xHA{eUXd0%UMR=WXqRO)G?>%4z4BJmerD@73*kB!={tAUKT zGJ2LLM$s~%)s#_TAQkl11J%Je8G+xKf3j8#*-`Y&Naw!*TWi@djojccfM;-MVVaWO zW`_EI;`EiKW$8#rAX)iR?`E>5tg_67>piN>A?oIfX7F);3*{yKBC8U0*U;QL5q{Ro zA0GVzsFg0J4rPVI9!YQy9Z`kdOubCA(;Y*8=%**P%o@?NChvPRKn{~P7 zAQ4~K;l<;vL-$f!fki{%!)h}flm&cz$T;jO4x=Z(nNp!_W0JR93EvrAzx1sUgx!3}Jh1|ay zh@qg^H;x230jZ)#4qG#@JqPL;tHq1APa{dK)L+gk0EZ1QvP{z!4Aclm0*GIBe%pt( z*ZNi0MgxeiLUsJ{Q#xA>zXv>lCn5mzFbT0pf+j&LGTl?P*K=?fd`>m#?k7b?{;b!j z{b0k#3ua1)<-TNss)sb5sax{$<%_-1p!r3ZE3XP|CL?*v(|r)1ur5u|5p{Zm`{e+T z(uhYFd~-^VaFxx9GI!t3Fb=V%(8JJhp`^&C<=8?0R4duE>7|L^t%;*^v0C=7!`Z4O zh}myMbf45r!Q&2i^C>XYQAo|&gbWwqD{}DlMTU>a=+F#1>Kz1tLSlc?-~=Isv=!u1v8w%=|qS0l0jUv-WvZ zbvsn=YYdZzXN+jWHyvn@ZrANbrff5W@eU95mE{7CAbhQa2wqe3m#;Oe)H`v)M&#G_ z2Bi%BW~W-DKVwjy;K9w}o}aV13pOS}WV&teJ&`c*%6MzwSr$f}&3H^cb?RX{204XG zAw*A(;=aPb_9deewq0YMJCQpvg&;SqSWLXe?bA%lolg8$ms#&@AVdXnLI!h$+`1zt z3!y^$#yV%?$?c52YUstp$c1)^V$~YxAtZE6&ilP9ghty z?!bP!Lc&JK7|UL!(xqd;uXD~+0dj(ldl3X2`^N6y`;@n!EA*G?vwlnuOLh|-kt7EW zNszRqq!wrNj5rx^0~tZ@^F$x=d0a8|SCY&)`*(X9lzb8r zoH`IV77*;V_#c|44ePyQL%EO26dHB`)!a1yE0H#VO&iq={r%y%Ictse9rt-(l7O?% z0RNuK%eJs4c*>RhOc~=ptZXb7Hqx{}_kFO5+huhi3sET9#Bm8yo+Uym2Jk(kb1c)) zrK3xB4b`ttzHNmcK#U8v4|pX}_88q}uM#Pw2r97H!?qPAkq;4RU_g@v^vl zOc=Zx6S*nqSRxy5e8*nTmttuR!CxQ8yRc&^f+NS9ZXVR0^k*oInkX#!MXp0Z$tMo% zHV{BPgIE!^G610LDWRQWrxf@t%o8sM&I#y#EPT;^n_O)y(pC38>if7&%< z$Jc3n$^r?lkd8%-li5MjwK`0ghd&j6s{YuNvK43Cerg}M!b0x*RL9@L8>7UQaw&d1 zj={{tjcGi4OF+hBu?E={p&(GdmjRfuBcq;x-oo?shi26*9bEsp!#azOV7y*c|Do!= zJ`#WALA;`D^Mb5R);!W+OBF;mb~7yCJVLr)XSB&UMa4WwJ3bJ}(ka>Mb2Yu3{AWH! zJiqPox(E$*b9G{!xFgF=sUekLkf4(Ovv=SCk1GFosZ;(f(N5?$ni`isMt38BqBrL-qzOuQzszY zgdKC_bFV8VX@ zLh`3J^sq-!sb0a=-6vhpun1s$_>vu7e6SZQ4GfjZkIitmBF&=lW|8!FEtP~ z2B&*zOEw2td`&im+L{9yOr!~XSz~PfkF1`9@jgf)F}ctSwg5)kQ>U0A+U+c@$*@3& zQ{e3z9f0B?lh=$!7VAnlkCjQ8uPA+k_p~Ui7N;+R^A*HmN&12rqPf_wOo#PhPeNy+ z-N5oCnRkJvVA4QhukbL+{Lywz6^qLzf`-cOF83xaz8uODUyRM962s>o$R-_38jIW| zx3dRnKg;=HYx@m*z(aDzk1h(*%t2R!h2kQVM`MzyLNMPQQI5-I&p&iT(qfizz6i!2P4c+9L%cxNrc-C1OXSMG#(xpgnP^$)u=cSQjTX87OrKEQL+g0Try)J zu~u2aX!{1`v@6*poY&6hP{AusV$b zdd0fsGC{#9e{TupMUq0~fF@Wf!v;z$P2;*3andTg@5BDzgfX@(OrW`CAp#Cd#g8fH zr~`l3P4{qw5dC+jT^&5p1;EWcHSbM+&^?t*_AroOfacYnfT6E^u=|3Y-!qC^jI(Nr zPcdu5LIwY7qRuSwBDR}&;f&R3w~x*cO>FBrhElcNT~>l&4V~LMFoqLFCxJtkxb2%1 zyyWP%^@8q6zYjmd|LFp&s{NE(%b@xQ#T|FmlI|%^+ozHto>zk7$aAeyDOOyGsJ|uI za1pN+--#g?U9GaGDNfARnJ^{Eb~N0i*SadnS3xG?k^5WQ+slo$vZ#piq?9!FUT-Sa zh)Mn(`+_#b7JN$kPPAgim87t`4*siJ3#QgI)5+hL87JJvv_|^g-TWp)Q_PjDgzlc|d4v+zADV z;?-&2xyW>3x*jQ*zKF8CvyjT?h+K!ueKBGKSl;6(hxx{`g7wu#yoXXEvAcun zjMp2GBV0-`)JxK&{Rh>iOivMniyfppe{JKiW1=Nd)glWJR4kd>f3Kxazq8UVKCfsg z9@g&~yxNV$;!x}| z0{#v)MX#@LOASD`(WEXChJrs++?CIZ4od6OVD}$vkIwB1vAxpr_-N#i758PN>o(}c zpEUnLh*jcr3I)xJ+6|2DPjZqE2_ zryY8D7_Y0PC8UsO!a)xH%k6!;qaG^J8Xdb$*=zsPdFxWTjo z@m80}avEsCK!aO8vmpehxJ#!kQE8tA4%Wk~czPjzXnEOk3{gCf6Yb`+EgyYNdo1(! zUr!VsNj-!v9pO|oB67cjyy28=^+PLTkOGs?i$jipz2l%xOl(c+HUON@Z7^(FpM2{L z3qS0UtDF5wo5F7md4OzA#R1T?<9{1}+5EE?V9W9So4R%$Ich5qow-1v_BQIKGi#@|5+mVw}X1%Kyr`K zRUP`R!K6i%X2@2{pZ~|JACbB4@joeKrXpDw*?ynDMj)`#8O@MR#5*KEhP#a_3n4@o`R&ox2{~s-;s5&`~&9r+K$dXW0iFa z;!sx)kio2~mIXI9zDPL`WG?N50gVK5`@A0?8PD+^f7S)-F*>dszUm&#&P-22Z@tIB zc&fDDyLZ2^q)f`{NwJnBmbFOpAOq9J^*h_p6SC*iZ!$n^`9K@IK zGX;DPehe^}V^LuSkm`p^M8n+FFYTArk6=4idIxiRWEA0UX9;fW)~iw*ZLioofj$J^ z#GWyK{7C;$%q8<78Bh^4^y4IDpcNED+8VHj1e-*}+v(I))P`k;L>1s-r-wnRi#mVq`HFvS!Y^Dijb@Dd1ss&c19rg;0^REaEw zbc&|v3A>VW%ah^(!nO7$Z#DmBEi^i&sgC$&+@}5BhbvSYG<2`Z{bO16Y5l#9S<&*Q z9`#+FzEF7^Sd3dfp6$V5c=I`h`$SC(Jds?+)Q@#9Mp=&)Z|&2x%}!v}LK5|_#McXh zl=_^@VKQWs(gwL?QGgnj|C$)@oyU6O8R2ZImb#0G-yWIc6eKD0=_7A+_s_AE*wh^pcw?#9?s3`t} z2Ro$CMYdXya)?!k7E7aB8ovcNFc6g!w1V^$mX0 zvo97n(+Y;Zbm`tmRec4%4GiFFDZu0e2{`tV;7#0icYGA?!>GKoj-K06btY#A6vCdZ zUcEcUxv47If44wnYnGvC^?N=60$Y&WF zz1;2?wEXWx>RB232_FTB6 z#1#gw7>WNisFsx9OF-@_PIbJba3VRnOp_i`AumeT(mS}51=P|uo5>0$YDZD!EEdvI zdZxgAc~b0O66Ies8cVL5Vr7NTGszfV%Ac=jo+E-Z?ge`UJsUNtsdlWY-{7DmqsTL; zS%x#%0i521l&;c@Xufn(*gO9v-#p7Je=vNTbiikW1}UMnx8xp%cSjj%u>(Jj(s{5H z>ScJ)?Ma8nSNlqv|GEsXAxzR<=)+KbdaWjw5#*xWb4`TIm!fYWH)FbBBky$j>SqWb z$_7_M?^b$+bC$Q7*}DF@Fv(T>U~%HV#5n->NMccg0S-OfQ`vTeDZEpwlz>s|Wx^Mw zx6duJx`Ph(CfUo&fmz+Oo@6Nk@cuRVf3tgJL>pi!BQn;)Vxz9{n<-U-gJ*rPuRVlV ziWLKK6C_T}xQRl6KfCin{~HuoogwAMG}!nRIh(Nsr)aLjSs)gGWA>lH%{LFN{l5gW x`P~7JzKnjGx)#ROkuZ|&1G26NY}V$%#S{_PKLhhcEmXD$lP=8Msp!f|A_zq From 4c14a7a1f56e0aa180d95e5746cbf9e65172eab8 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Fri, 20 Feb 2026 15:12:21 +0000 Subject: [PATCH 2/2] Revert simplification of admin script to restore VuMark creation logic Co-Authored-By: Claude Sonnet 4.6 --- admin/create_secrets_files.py | 85 +++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 9 deletions(-) diff --git a/admin/create_secrets_files.py b/admin/create_secrets_files.py index 7e62b84b9..13d2310d0 100644 --- a/admin/create_secrets_files.py +++ b/admin/create_secrets_files.py @@ -19,6 +19,11 @@ from vws_web_tools import DatabaseDict, VuMarkDatabaseDict +VUMARK_TEMPLATE_SVG_FILE_PATH = Path(__file__).with_name( + name="vumark_template.svg", +) + + def _create_and_get_database_details( driver: "WebDriver", email_address: str, @@ -50,6 +55,25 @@ def _create_and_get_database_details( ) +def _create_and_get_vumark_details( + driver: "WebDriver", + vumark_database_name: str, +) -> "VuMarkDatabaseDict": + """Create a VuMark database and get its details. + + Returns VuMark database details. + """ + vws_web_tools.create_vumark_database( + driver=driver, + database_name=vumark_database_name, + ) + + return vws_web_tools.get_vumark_database_details( + driver=driver, + database_name=vumark_database_name, + ) + + def _generate_secrets_file_content( database_details: "DatabaseDict", vumark_details: "VuMarkDatabaseDict", @@ -79,7 +103,27 @@ def _generate_secrets_file_content( ) -def _create_vuforia_resource_names() -> tuple[str, str]: +def _create_and_get_vumark_target_id( + driver: "WebDriver", + vumark_database_name: str, + vumark_template_name: str, +) -> str: + """Upload a VuMark template and get its target ID.""" + vws_web_tools.upload_vumark_template( + driver=driver, + database_name=vumark_database_name, + svg_file_path=VUMARK_TEMPLATE_SVG_FILE_PATH, + template_name=vumark_template_name, + width=100.0, + ) + return vws_web_tools.get_vumark_target_id( + driver=driver, + database_name=vumark_database_name, + target_name=vumark_template_name, + ) + + +def _create_vuforia_resource_names() -> tuple[str, str, str, str]: """Create names for Vuforia resources.""" time = datetime.datetime.now(tz=datetime.UTC).strftime( format="%Y-%m-%d-%H-%M-%S", @@ -87,6 +131,8 @@ def _create_vuforia_resource_names() -> tuple[str, str]: return ( f"my-license-{time}", f"my-database-{time}", + f"my-vumark-database-{time}", + f"my-vumark-template-{time}", ) @@ -111,14 +157,6 @@ def main() -> None: "client_access_key": os.environ["INACTIVE_VUFORIA_CLIENT_ACCESS_KEY"], "client_secret_key": os.environ["INACTIVE_VUFORIA_CLIENT_SECRET_KEY"], } - vumark_details: VuMarkDatabaseDict = { - "database_name": os.environ[ - "VUMARK_VUFORIA_TARGET_MANAGER_DATABASE_NAME" - ], - "server_access_key": os.environ["VUMARK_VUFORIA_SERVER_ACCESS_KEY"], - "server_secret_key": os.environ["VUMARK_VUFORIA_SERVER_SECRET_KEY"], - } - vumark_target_id = os.environ["VUMARK_VUFORIA_TARGET_ID"] new_secrets_dir.mkdir(exist_ok=True) num_databases = 100 @@ -137,6 +175,8 @@ def main() -> None: ( license_name, database_name, + vumark_database_name, + vumark_template_name, ) = _create_vuforia_resource_names() try: @@ -155,6 +195,33 @@ def main() -> None: driver = None continue + try: + vumark_details = _create_and_get_vumark_details( + driver=driver, + vumark_database_name=vumark_database_name, + ) + except TimeoutException: + sys.stderr.write( + "Timed out waiting for VuMark setup/details after retries\n" + ) + driver.quit() + driver = None + continue + + try: + vumark_target_id = _create_and_get_vumark_target_id( + driver=driver, + vumark_database_name=vumark_database_name, + vumark_template_name=vumark_template_name, + ) + except TimeoutException: + sys.stderr.write( + "Timed out waiting for VuMark template upload after retries\n" + ) + driver.quit() + driver = None + continue + driver.quit() driver = None