From d1ba8c87dc9d4d55bd5144927c6a1cd67f38129a Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 12 Jun 2023 12:34:38 +0100 Subject: [PATCH] tidy up table image dlocks --- anatomy/static/not-found-image.jpg | Bin 0 -> 28564 bytes anatomy/tables.py | 14 ++------ atlas/tables.py | 50 ++------------------------- generic/models.py | 3 +- generic/tables.py | 49 +++++++++++++++++++++++++- longs/tables.py | 53 +++-------------------------- physics/tables.py | 15 -------- rad/static/css/anatomy.css | 4 +++ rapids/tables.py | 17 ++------- sbas/tables.py | 15 -------- 10 files changed, 66 insertions(+), 154 deletions(-) create mode 100644 anatomy/static/not-found-image.jpg diff --git a/anatomy/static/not-found-image.jpg b/anatomy/static/not-found-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dd4fee6aad2587475ccbdd92ce683c2cfea75ed GIT binary patch literal 28564 zcmeIb1z258mM*+;cMb0D?(Q7q;K3otf#4Dd?(VJ$Zowfq!3mn62_7_fkYGW7^0m$M z*V8>S-FNQ)%uVsIYwcCK-deRvcI|y0<{nl7OeHx*IRFX@0H7ZKfQLmO1b~M6>3&|J ze>zy0pI10oSQuD%IC%Kq{t=K6;SrD!;NcNb5Rs67xS{btUE%6WSzY)pM&5GS%B56mVHmcDI6WcU9l2e*CA5YXjU;)%v| zdAfLE`~1;X+%lntsKtr@(QN<3=3lHKP~Ewgp)NzL)naf zDJMPGrU3fw9|QiiW(kTg$xTt`8MIE6#2@qj=|M5eQeBU}G@&PgjiEXIEdZM5aq#+> z_Z$7+yFlf&p63;%{Y;FodiNbOSAz~wE0v^d5wMa2FOWI5}lQT*rwWU8~O;V{Vjx395v;D!c?V`IM|N36yF_CK9eDiLW zSFkn3W2}E+%OIS7-}$km)BOmQmP@B>>8q$OroN_+W&F{RiTX8A^R~t+1}d5EwWbZzSxn-7{*ml?y<3>0zaj6=zls<_7!=bqzV!PW(Sm81gOkrpK!M ziw*DJ6z*TxiT`H)zcGIa@@H)R*UT~0I5--j23gkYq6I3=KQI&i&)!6Sh5s|8zleVl z0k~I{{7c*Wck?GPJAMxU^zf(A4-&_rRTUCBsv7S<)Iw1|07MPv*tym%Nj4e2+h^aS z)i)80H(BaXMFr0Ge<1Mab_2=J7+2G$EiHsDDTJ;bfXNL7nv{>oBOf^?=ltJ3zok=} zg;@2mX)GzQ%v!#aL4z?^2m$KP3obBy5S+?)Z`x9tHHPpDc8c(|IM_njXPyaN%?oh~ zGbZ( zKr3Ea$tHJ+>0I}$V*+D#s}TFC6+-{o^Qynu?^>03pBA7hR7DXh!_c%7tt2EF6 z7%TA__K3_|Tn7Tja08`AoOv%>%e7#m9aGWX$>XV49ZCT|_dC#aUM(?s`5P&Zswgua zHh;`E)O=BkQ{} zs+&Ys+xoW=Q?}#Vi`?8tqIB)_C|Xta8my={FdyVx0}vKZeBq10C|_h1EYO(8RhXGN zeQMp0AE%%F7$O9k@jEt*4%&nUIR|O^r!QM(?w6m00l;)t=JSejqrW31cgrf8;)geC zcS_=aQ%HaS{gpwzWS$qo>wtekLg<@`=x;J_qdt71zJ^r0s#x35DEVL!{A|oLM9lb-Uu{;?>1lCB>P`-5$44bC5xUrKAoBjW$yX8E0}Kw(11S-2^rJ zJB+SXz{Gag2l)X|q48Y(C*%Z7ys+Fq;MeI@?1_IlhJa$F*qmXsnc4N>>dU(dRd=_W zEkV22ZXa)%+^aU2GVk&xpo(9X=MDJOBe3e7Xts|2t1ynv%q}Zj)aDR#l%EHM1p~Zd7KqL-oe2G2w2$s zt__Ho_=J?4k~(HiZiy-NlT$dj6jan4ToO`XQ)idJ{5m{tUOp{t_v9V|9%*$A^PnUe z8LQNS;@-Xu&9&oa6YD3ma(R!3?+_o4fAE(P{66k@f= zRyvSRi}&z;O23F-ApHMa69m&Y4ko$No%kc^jCW;;2?0@aV(`rQVZJB#2HK{*)5-#4 zFdawx|5L1$Q5@-k$!KP*dP)#TPEI z*l_6Kohq6MgD`ATP;Su6(ikt*c=KTsj3}mwgWUDA!6mKfJ2eQz3THQQDjeB zYfrg#m{z~+mv((KaKw^i!rJG-c(q)Te-sh6tsA}aw$B?tF4RPDK2l)8*%_=m?!Jdkwvhr)gcHhx%R zx_gQFg`O{SiPofsig@$uv~b9q^G#`=oCRyARKJc0$K-59v659T3#Y_SSp2qSQiOT3 zAx)65ZjY4zTLoABKWVc5=PmVhs0ZsJ{^7_bNW_{q#Z^cN^^9bkV;v*nBa-90Xq{qX z%9CURlT|GK7KY*%+67)u3fs=~naA_rEK~z_hy{ILA%04JCQO&R=q()6r$2PN6x@5l zLThYWuxibt5pwf?FyuZa%X(7SdX~jJUcmcCH##;XYZ0M@%ES}gvCAMlVb9YSCq~sl z`|g@zt37GC$uJ5bCan1!?RN_BCDE%pY4t^jswG64K!xkg3)6e-1)eC2@ML|&B$Dxs z23tfrScapW8%C^QYGR#%&Ux1-Mu|==h-JR+t3}>chhMDaVM# z=?39*zz56iIe%4s6hlEtyS5}}I0(dd(KrL9HY&>I+_NKB_}Ia znqrun>N0kSc(g~zP{KCJApjcXJk2v3JuDmdiWN>tY5JqKB6b>)tOJQed`BW;Em;mh zX>a*?1r<|8=TYb7Ua34$Jy;wkuV(kv%>f-#haz) z6~;Dr#_(@B$z59IRk)e>$w!DtkKl8xGJT|1AvZ9;N3sp~FQMGoNZob#ml@lKbeLc9(JK13+$+lIbG-{s+BZaft(mO0-~` z@OJa0P*)`!l~Kzax8Op*z{yG|@@2k+8-!<_zZd>AXWv{q*&&-{qvRFBx!eXMyhup) z@<7A6s=Udm&7rV51tLCcfEGY`(^um7;{D!Bp(d+&5v65*BfbgoidJF?m`i!kyTd3& z_Xeg9x~xggQ#A0R)+BQD`)rRpgaj6*R-~kEk>o557 z5vxnz10YA#cJKVhtmq@x6f|!t3lC!JQVy^9tZZwd3#lybK5IqHSekP*YJ|~j!f3ZA z-Nc$s(KCT24CI&r&j5t5LRTn{vvwaYMyy~_8ado^x&6|mvcyUv1>URiyM8V==w<_j znh4UEl>|>QUv^#`FmE!Ph5%s+ijsM39_8Yj-}S0Rz7MrXtl?^M%S#cr8nBZ>!L{UZ zsq`bW8T6s3b81tSto!;j4*S#OD9ekcQ~iCMj1#K~*640-psZ&uWX@B_5~m_6?3Eh) zm=68HB^no+VHe>|3ARCr`AuXLx)||qCR1D4PV6pYDK*AAVE{xKtT)d^Xc7R@JF$~! zh0_q1FQJx$Q5kMCI~4Hurjte1)cpk)(>*J#=Jry{Zc+$kZoZ9iTClrlZxx;{c2U?s zTepavG>SGxNm66-wi$Dx7}cFaxrH#HUei}7W;a-dr* zzo-vf&*QMG6RX+-KF%VpdbFb}^~t1?D#zKyd3&^23cNV`xcA^&Sjc(s&hucNhz4yq z2hb4`RYZ$m0>+<-0`RrIsN&uXpe!3XnbQQDoZeRS;+GB4JOB;1hs=CbY`F%KMH zjQp<0zh!G<1#^cpcDp}zf_BIB7t-j4sjWYjXT=%@G5n2sQIFDKFLxBu=#{Ffh;K;4%sfX-*9l_@7vUH zU$|$}Q@!8Z)`(;QZ861bOQo)EgGgoC$I305h?&rMStgO)CDBK6!Gb9{PK5xAaBC5s zx`06TpdzdrJw3;_F>Ol^wd8#fh59L#3F?BCz}1*gSA~_LDhyx!F5-bmG(opm;*c0u zTrvGZO5Dh2XF}fT3(5j2jSHFJ%V6CPWFMv(RVFjJSoA7My%7|(VwWmRFsBrASHJhu zP;m^fX|V-|4U)A|dv>f)?(P513|GI5AE0B*T^xFos6L=KTtXDWfH((`79c=Hk0nA& ztyZeGy`N#r^XzwrPW9GEu+d+qCu#Az<&l~=u)+8iR(25IaBgp=RYU}7kCLcwy2=YwM#9)qC8=PeUY7NtDREuT;-l^Iv3sm_ZI#%zS; z^=kW_Rd^G3+w|R?ageOKW^YhXv}LC}#h{L|ow*@hddy^jNNFkrSv4G12z~;Qyhv+- zUfsuv)MWNMs1Q2GtPeeo8zy{b1`VdH2T%d%z4*H8$0MrijqC`80Ey(&#gAITZuEj%H0zo9~a?(P_p)R{cp^H6In^0FEk& zM(TWX3W0L{tV4S5J5y2_lZ6iGu~4%p(^?6ir|Rr!^WTcDdS*ZW&fXe&Y&B<>t8z>L zG7b`~SX0Pa=bC9I3dth2Ca6SipB}(gcNclyabjJ!;dGRyKBXbBMkC*aw}XY zMjY**q?p~|WmPM=Cr|{qwFCypU;T|%$j`hEpmGWkMvz)CdeL7uJj~G`1j{urL zCqrIoJj*)Ozlz6G@4L+_?fb^bwP)icFLke{%$?nFCXpY=2wj-rh_D0ZSvr_iWtMvxwx_g3e#^^M7nT>-97)_LZxb^hX@8F{3t56(@M zA(W0Ju9iTCt9}z~RbfllWkGRIc~~?{3(|P@E;X(e8|odSIi#dC!yiqg;%%DQcb}yY zWV(W4Sq%~pLk6$_hcydT;$cI)TgTo-&y~4c?CIie_MnS;J(p19oA-P(;P>^wAhhHvPShGm%-bU|wq0nNvzYRL?3 zV#%zELBX+6W?_(#4qaZw7l|zN%BP|$eO`q-SO8UK503y|bgt+*TAnm|P1fH~0|uWs z7s>XF6wo`%!azC8 zOCwt1FqU~0sS0J*@1A!C8Z*9!dS1_;smOD~$hqP?b?=@l9Nc3FSX@S8X>9LvEVI$8 zPjW4)SjTc9C4nj6;kaUgPrFaAj-o4IdV&{0%lUIAG6^+WCcIMGmU=l&)79V8N&5gS zj+QUfv8)_CODqas{kmO?^Z*#%vvb%Ufq5n%0W?XLDmO?Hs}t@qy-y(+ zvuuIsoRta)&$L#$=L_4eEBWbhs7@N3?ozS>PO6H;X<)A=m5tpB3-(fF*gTswWU8OO zaMr5*42#dMlBcCDTCDEx_9c{>L(ifIT?3B*qMe|{!ijc-fq5`hx5@8<>+}>cDpsd) z>@zvyJIZ-vg$85uuQFEX3A?XCG{dEKn(-IFXu|NBU&ZT8zM7m&i@d*Jz8$?6vd*|4 z@Xz#rufQX}<|(YuEV<*$GZ%Fx{Kml{3dXXn&8^aF`S$f7R>)WXl51vD-2%5S(hb!d zPc4V8%3nRZ!MnG707$vV{LQ<@x;Bcw82@;awygXkb%&Ho9X)#bvo0SYg3_vpk&e9o zYh~Z8Qj(NNkt;EhwFf}DeFrg9IohtNyJ_T4l>mJwpR4)Kezp7ioPQX-Y)aP(uzFrx zJ;T_>u4*)Ix>)S=L|a!^>7%o=aC?FDA|gt1c$iQK+G{6pFuZz`P2bvhL=+?b7SA*a z0G&MGIeOZ=9oCC=B{>h@w?x)IO^%tZ^#aB({>?=#DFdBdgHBJGR<^-lQ_SulF^1l0dcLMJh8QPv3pd=G2X%FyKr;7B-?zlMGM3&co~`dRjrgWJV7;{KZeO!+L>3{*UN1;e)`!`K7VFw;d8V-@ z_{-!M>t;A_2S~7dXQ~ahWbSxQWJb#0Y)Omqa>|c*Bnj^8Dm5X2DR*pStct`*nAlnL`xURS)NW<8D(QSIQB*3(94Q}DM~YS+;EV^;$uaMCA0 zZjqUK3_`Qdq)Y4*ur>5Do{V$gPkuG(3pvDIT*}sZm*2=}qT$$`3}q!}qqjmOn)DIQ z-sn#Bwk^1G&%4~jmrMB;L_B43*HH%I9kZfa!5(X>*fK9s6NpU-kbF8?YjrFKS4X!C zh0?G=E)W;X{H<131=QC|fE_wSMBx$_u~_taUCe2I5BV8pw+o?!ggq3RlGcDJvw)-u zdK9zUT>?PTS5nT4wmn0BGu61or84Cm7NYu@0YMHT)NEG1k0M>3EN0#7H!h8jJ52h$ z=km+-r(dw9rb2dGI!&Fj}ih4FPK+eQ`T9`ZG@Ankl?E^BM zGh-BAO1BUNPleFB+wPP`<-&Hs6UkP{*+v0%ne^2Kd?KN%Km(px9W0cVE=8ggu@<9< zQXI{2YCoD84rZ|1vgGkJDdnxmsxbIZh8vXB^;*hF*?SZe-;k~#Gn+#8W-j+au4#_} zs(`Ha(r(Hlb@2oCbO!bXR0?Yui4Po1EBWnAQ(RVy`L3Mm6gE?0e-!3|B?ns26Kw?V znM;j#*B0ql8T>_EH!ro}kXWR=5u&gsEN1q?i}-K_`a0#=up#sE&tpRrf?VUeH8^pM zdGTEd+(Z*c2Gv*U_H3gBJaKRPFJEAd-iHEbGDTrOXLr}$DE0oD4@Y2E7>x7fhb% z3f4$9MA3{l>Yvr6~LVg!NM5R24m zLbzx>B08Cug@yYhP2w4aLF{d*qdsM?OI|T#YV-P(S(lVB`~aJzl6(ukxemZ$2#n%G zv_aIUqSG9Ac_vV?{nk4!Y}MbV4O*;I+=xqFLZOi{W-wFeOa~VabCxk^Vg>U7z@Kp^ z_tqiHnw!?7so9>$!CpC?%x-2OE&7pFkX2TO09sqk;E}MQ1s!f9**ChQ0NS+Cm?Cg6 zZD@}g`Z``4)yXQ6?%R+MBirNNx67M(K&dXLjJ#Nq z8sil3BbCYgE{1bqOITZ?aP$iGew>Ztu9Uj#WAVFj%{V2NC{=7O6iig<6eX7o9#{m8 z*U6a}`W*MD`hKbwqL98TPMaTs3Fn0vs{^H*U!_0AhzH}xBWnn2g`fbq#4w*hab={zYXC=w%{jhEfc8lfK1O3bO9%8Cpy*mk~cCR#Oed4Xh2LvVQ@t2Wt7saQL0G8NoidwDmyT%$wWG8A zR^Uo8E}cGyE92fg4)NWdF6(K5UzTTqrPl0e{;RBv!Yx@pE!Q@TqdgaXVZp7TU`kTh zmB7BMD3S$TP4m__kl0UIzNlO043FD!Vi%R7ymcidiY6cP1!z0BM#>aNSM`1rr$^1L zP>4oNPB8TpcNK5fCxbesYy$)XI=>mxn-YCkT|w%UR>%=tqM~SIz1BtH*HXxTA(i^q zJ^LvUE(0U-XNedhA24xho3H3@3v z?{`+7Egf|aM@(Y$hO3)KPA}-aZ(N9B)>?w^=4*?X1MFx}OcwH7ci{ch9`Dtd{ z0RIHWBvGlDu^v(NXO36n!>M48W}8smIG)D?OEmoM@ zsNmx)N-bA|77bwoIXU|mTkL{f0@~|lj(tvY-y1ApkUxL@Bnl&$C~HsOmY*t4M~Mp zNrnBs&u-CFL@;Sj3Z!gu5QZ`A1WeV?&1?%k?J%F%=_W;+lbtA;s9%bGuJDR_r{-gkgn zF%=1`UrQAi@mzw$jp81F_Af2_PYv%C36c2Zda;PEdb*5d5%D=q;f>Hi_@OBoYx05b zS9;M6gq{vhV{o7c9JzDo+16$B=_x^d7If0;9Z#%}ERl&oD#3@6>PFV>P^d%heTtnm z0a@npO*h#aDYNvVHOe#a4o42Zs=BpFlI48jLiRRybQ0|pgI*I%!^yN&9^U&DjIoV* z%b27n6@pBZR@TmOL~#G(ui9KXD=pdT#bg2E83%7)5<*zUZurJFP{7pu_|T-lr7WpD zFp9DOo*|T3NR20xx3Y%{Lz#76ALAQ(X_*_tKN#2jH8q@QDO^xo*_2bsNIrmw;cHRu zF_A4IWATcr7mzj2k4Tmg{nlXQ7ibsa3Xg32rVWT}EmCi4N^T`6t1vxAW# zE&uu7m~AHY_*c4_nexi^v7e#TVYGsOj(!Cw1-sCK4tb=!$ncb-MW&>b#a@a^-6h;0 z6|DP6Oy0>5m==Rx4C7Z1fM()_l6D312WMCZSr<1x3DaW{>g%)M&l^P>9ED7ysv8v% z`a#kY0Y21mfzo~>4EdkbN12=-PYh)ARfzsws}JhpH~B{E89XaZg-*#yLlrAGU{I-z z^F3fuf#qrC3+xq+p-)9y6oP!LGbIX77`2R(+)ZQ4nSks?m{tx5?n>>%IYNAS84{yz zowTZ2VjcXa#Nr7LTl9eVGSR|1g-XRrBBBoMlW!Uh31xW)aMW1*SY-_v?fD0Bx?JIN zjrJo$UvR0WZmtBft0gCxplV&_@1u0J;PlQywu^_|3Z+wrk%^l5mieiH~ebm{(i_butFwvKUzJtN9z{GHJ|1^*PalaTgf)g-RPP2S1*9yCht#dr7A1 zd-O&-delCPJ7F@$;cm*n}#yK0*xD%d9Z4>2(f+O&EA+BssBDcmsFqqjjJ%b*vyoFa`${+kBuD9FG=t@Yc^G zg)14B?mdq!?0icqzcL$M(!?_}%>3hw9=5ro)sza{#xO@WZfPcNuK5Y70!NEoN~ zZuPj+tguTN;0adEq`jv@+hxCBF_P7hQfj72Br+aAI`s-CJLo#QT`TV_SLi1rB@bst zisoe+VlhCM_Wv3%4+Kl|Lu0aQGB&73}S;+`XutTU1p<)HYPE-DT zyrhl>Fu*aF)Fo$|(+2i@YBL?Xh#V0@VJvq4ibipM&SgDzr8Zw?-kVAN&XfCwr={;A zC+-0dOS|D!6=dYPUG{HDUB}P`zl}>FHGDt#xz(XQtwF0VFY|p5Y2f9Los(?qLoJJQ z=!&Ew?6S<>$Mvaa8DSyqhkFoNrUSL363GR_t8TX=H$+5mmy^NpPCwV$hfzrk zXjfKX=if^~aiM!aN9xWycY&lI4gdb-9w6J?V4E8J;jD z;9c)2yHbcSZXTl%QLlv_wHr7sU>gwn`2Ckh3;(;hkPMSw-6y}c;ZZs4%x6gQCD@ZF zzD#hSPfx?T)6jY~w!yKIpHT7vr(m6)3TDCPXnR_pcn$@xP_fO%)|u8$#)zq+aZ-v&WvOp^=)iOylr&qaHo*0dQ(3!i@r9yM3{fwVcH zCzhNMrh=#x6np_;#WebNEz|ZqI^LH5vycMDPWcoyjMI z(n!QZ++0HJCW%0J@pQ^ESdsEzJeV^?qJx{B;{9T?&m#JcpyLcBD~s+01eEHbTEF8x z_-=2nawWIqY^B=4Z*)Vpw)7Y>rIcUjpux~^d6f3dr|ifvDk_FjRQAhsdY-uN?dntk ze(Q-wVHFu!vxLZDT`(jGO_T8D$m1CVL<5J&e8`k(ZqaNWJ6O&>jAR>ueIVeExU)5;9ZRpYn_=$U7%KGu=t_LH z#VF(HeB6xt6!p>8EeRIC_LOLfzgbrDB*!0(VpK)~pCRH(@-MBXH1uNj>>TIC@W^wT z!oJw3{g8yXU9z>wQy=i6`G zW&wkI3sr*ekKev%{ad2^JNa}|Hn-aqsr5}PXZEPL?}%Po$VJ{R>Lq=@gYNLYF&4e6 zM0$A-r?KR~P8KLmkxUJXm7~rV+P=d=QuXF#7~E*GWs7K!ON*S;2kl!5Tz85z%DbHj+8#vAGj;PEt9IO*uG7Kg65)2IRntI>%Q(l=~O9l z<&td+$2|3u%;tT6OCeLy1moqz%58bO!ZyGmoQ`8U$AdyduE#wYfKr8)_DPicG{0vl zAa2BYt@6}gH5M1NAo>9K!s0LXz8W#qUC}Khf+vMM06Ar*4J}0@uwh72JwF}*iSlz+ z0R&}#JYm0qojf8tzHcKtJ@u|R`I44`aYM_<%yi3`F>T^T&af@SIr89!as_s5iWdG3 z(xe#wUK)i+3y-U7yE#D=2w(E0I^C{H2KyY0Rd0))K2rNRVrw1ORZ@zDC(~v=`Kvf; zW33K)dH9eJ#MB=_hMy0(vqXpaF&chMvMkd>+P1ff`d+XF^7?g>Od$sLC+`(xYE#)S zj;y)Aq&vr#WW}EH>(zRCb!xY0UvP;|Ou)Zbx(^IN5Z(j~XqHE> z{*J;+ZA6crx5V-0HIYh|-?l_uRhj21TfUc4QSr?4q7q}bAdJFF@5e@kFNe_yL6m}e zfoOt=KU6l58!!im4@8bHsH9p2YAeaQA~Am@7^?EPQ; z^AA=D_?fh@{o{fD0>`7m!oZRGyla686wt7mrZu%oUN;o;TZjChAxMOe8J`1UVe%m% z`d($l9U76%;!~Z+=c+J$CY~GkpF*C9f0cUL6CMz~XfRYcJO3@VG1O{;@eHHcd~441 z9#cW`YTfR$)CRUQo$8mOSr*pRK1?x7D-_r{@sF5sdb@{~=AQ{$W}E}^6q|3&CWm~y z_Ut~(R8r|1M(cior%=Lw56cbUW1Q)8zzHYVrFf1=6^~Ys#ty5+<*H=u*n$D2cJEPRQq20#<(LP-aZSLz zxYe~jO1Rx0-$S=5|e0AbvA{Pb>;oc#~tFY=KCU2u_31mhz zyYZA=Xyo=VrX}8naM!#oXx68JuwWqK6Xx8YTYB^)Fhf-#FbAlEO+Pk~K-vWY2{+^l zAecG?*j^kU#PnH?r#djFM2SZH38}wQ)+`KxeWyxV`2KarcmC&}}Ab8Bs!Prh? zkygD*hTJ0^x=K{HqUQ6|O}Wdg7xHd_%cduaCtNt)J>Bx!X1#@BxH9~#K-IjEX5FSK zhzb&46E|jm&noBQGvSW>khRO@WdgDL-C?I%cmqUP% zaav|XIG#jhOz|QsNK6+!GGU04L|r$K0RBY(Sa@i`yo)9qClW{C!r|yNa7=2H4k-q2 zDPCT~>#O@fr-wgBjdX4yo$rPB0@o#FWJHEe$xsr70e7uym;`E_0^|XAczii55)a;{E34xt1Dhj1gy|>=ML!|HJFLMtRx)$w+f+ZC?M>R8KIs=%KRyB>6cS?MxECB+Q;W|ub%mreG8%>z~Y!L#Ie(|bxyS#8#38@&WS+}X5(il z>~9&{?yrfIBIZMoHL8kddzouvhPbkk%;zDkPbvJiJC2IJ^fxV$>BKDVq6%T`ld47T zjPhei8)NC|&JZA*5(dG>mNT`N@VZ>cs40h zfVGmpOmF!zM?yz-4S7$vhw}Zp2C*P^@($E6a;pKc&1B0m`djNpob2T#FqDY840pboCTu8}+=+@0GGwSe1F=p@x$2pwnpGyy%irW zKqp_r%Bkj)@mZ3LXj|8awzieWrI6ClUinR)f-|zo1o`EV<2mDc^SQb!3X++ISw;8R zb5#zdz=Uin@hnBxcV4ZtY|CHNXd4zLOEbP4%Ghlb(Vvx>O1zhoUsLVEp{!TOu}Q8M zl`5j(yN&IOz#xpZ@uOVe;cPA2qc#?{^z7_Jex6)UKCjVg+M;mh9my!Z9&iSB{J?*o z{8()Z>d|g^!cSYCCZ`?jKa2@(Yf$br64;%hD;t#%p+4WMsIF3Wgm;Jq`zGj9HSeqj z-uV6*;`I} zkrGL4=noCF=AF51(I(omtDvbq$mQ0j*iI+(2#C!N9SRA$W$sG2fg!MP zCa4rcT-LHV?a_%Vw+Cbt!iO{q1Ixw?5Bz;=5`~YBp%0nkqcg`tQ{JeJ4W192&Q?uN|~~qLsa` z($g@o5irZ?ASjs9LIF;A>lbG#1{AJn1N3}3uumx!gd$?aWG`qmvaLM8rEfPFaUC-F zB(jO%R4bJpfCcsfeJ=zTElXp^g+oot{@_u882XUZ*Dkvfsm@PuWNfaSTc35q@7zdF z5OXjH$0XMgXn9zEJ!T=UhS5f@ePWZygAUu%ea3+!*`X|;bR@0nM2jh%)aFgbAwg?Y z;gGz{;KoZMGh#Yx+VFdHL z!d%S02|y3n(R!;1YfGF|QeREK_!9$>#mdx0*_PFG%qNhnA}T=!3SPVc3jCxD%otbP?BhwxYAeQ%g_9nq+bR}hcwq( zMG)d5;j3T~d4D7d+oj`E42^JA{j8pMfV;&+5gZkQfFGDTEYYG#>%_WdAS-&E1*1GZ zH!}C8Q;Y3cCX{gf{!cY2%Q((Ztjw7n4p(|FC?ZJqfdMms0!_4vh+Noyt#DeNj&$tX z>{B~bVcTtywAYr5=j%kw6R2bXdJMdvhA}ovh@M`e^*Ud1$95f+A{J{{9EU7pNU9sB zuvniCA)n+>&Aeuw#;w|1u^~<(k~;Aq~R}9RaC|iWA|ECM1y4x83%gMZu)6_ zF9qzZJ;DTK9$tJT11lU(05VE@4BIDN4pp&+Ck7r{;v2YpDlF7A2}^hmh8J^`Dwqo( z=bCOhuk8y!nNRF}n~m><{vjxm7HK3eZ|?Tjw=Kry)Ehv%19G)CaWEi|LB4wMXUZ zbM<`Wb&fI0V==Ns#64sK{CQUG^heULm{>wcs>#u*2Y0wSBG?DueH)~V&DXcT?att0 i{q?WVP5ib4^Y}}8;s8_O', thumbnailer["exam-list"]) - except InvalidImageFormatError: - return format_html('Invalid image url', value) - - class AnatomyQuestionTable(tables.Table): edit = tables.LinkColumn( "anatomy:anatomy_question_update", text="Edit", args=[A("pk")], orderable=False @@ -28,7 +20,7 @@ class AnatomyQuestionTable(tables.Table): view = tables.LinkColumn( "anatomy:question_detail", text="View", args=[A("pk")], orderable=False ) - image = ImageColumn("image", orderable=False) + image = SingleImageColumn("image", orderable=False) # clone = tables.LinkColumn('anatomy:anatomy_question_clone', # text='Clone', # args=[A('pk')], diff --git a/atlas/tables.py b/atlas/tables.py index 3e1f1575..f95ac078 100755 --- a/atlas/tables.py +++ b/atlas/tables.py @@ -1,6 +1,8 @@ import django_tables2 as tables from django_tables2.utils import A +from generic.tables import SeriesImageColumn + from .models import ( Case, Condition, @@ -19,53 +21,7 @@ from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.exceptions import InvalidImageFormatError -class AtlasImageColumn(tables.Column): - def render(self, value): - blocks = [] - for obj in value.all(): - blocks.append(obj.get_block()) - return format_html( - """ - {} - """.format("".join(blocks)) - ) - obj = value.first() - - if obj is None: - return format_html("No image") - - return obj.get_thumbnail()[0] - - # image_object = obj.image - # try: - # thumbnailer = get_thumbnailer(image_object) - # return format_html('', thumbnailer["exam-list"]) - # except InvalidImageFormatError: - # return format_html('Invalid image url', image_object) - - -class SeriesImageColumn(tables.Column): - def render(self, value): - obj = value.first() - - if obj is None: - return "None" - - image_object = obj.image - try: - thumbnailer = get_thumbnailer(image_object) - return format_html( - '
[{}]', - thumbnailer["exam-list"], - value.count(), - ) - except InvalidImageFormatError: - return format_html( - 'Invalid image url
[{}]', - image_object, - value.count(), - ) class CaseTable(tables.Table): @@ -81,7 +37,6 @@ class CaseTable(tables.Table): delete = tables.LinkColumn( "atlas:case_delete", text="Delete", args=[A("pk")], orderable=False ) - #series = AtlasImageColumn("Images", orderable=False) #differential = tables.ManyToManyColumn(verbose_name="Differential") @@ -329,7 +284,6 @@ class CaseCollectionTable(tables.Table): delete = tables.LinkColumn( "atlas:collection_delete", text="Delete", args=[A("pk")], orderable=False ) - #series = AtlasImageColumn("Images", orderable=False) #differential = tables.ManyToManyColumn(verbose_name="Differential") diff --git a/generic/models.py b/generic/models.py index a1c601ae..5e53503c 100644 --- a/generic/models.py +++ b/generic/models.py @@ -194,6 +194,7 @@ class SeriesBase(models.Model): else: # This is a mess... return format_html('", "'.join(images)) + def get_thumbnail(self): images = self.images.all() @@ -205,7 +206,7 @@ class SeriesBase(models.Model): thumbnailer = get_thumbnailer(img) thumbnail = thumbnailer["exam-list"] except InvalidImageFormatError: - return format_html('Invalid image url', img), len( + return format_html('', img), len( images ) return format_html('', thumbnail), len(images) diff --git a/generic/tables.py b/generic/tables.py index 08adf03f..1dc08bb9 100644 --- a/generic/tables.py +++ b/generic/tables.py @@ -12,7 +12,7 @@ from generic.models import CidUser from django.contrib.auth.models import User -class ImageColumn(tables.Column): +class SingleImageColumn(tables.Column): def render(self, value): try: thumbnailer = get_thumbnailer(value) @@ -20,6 +20,53 @@ class ImageColumn(tables.Column): except InvalidImageFormatError: return format_html('Invalid image url', value) +class BlockImageColumn(tables.Column): + def render(self, value): + blocks = [] + for obj in value.all(): + blocks.append(obj.get_block()) + return format_html( + """ + {} + """.format("".join(blocks)) + ) + +class SeriesImageColumn(tables.Column): + def render(self, value): + obj = value.first() + + if obj is None: + return "None" + + image_object = obj.image + try: + thumbnailer = get_thumbnailer(image_object) + return format_html( + '
[{}]', + thumbnailer["exam-list"], + value.count(), + ) + except InvalidImageFormatError: + return format_html( + 'Invalid image url
[{}]', + image_object, + value.count(), + ) + +class FirstImageColumn(tables.Column): + def render(self, value): + obj = value.all() + + if not obj: + return format_html('No image') + + image_object = obj[0].image + try: + thumbnailer = get_thumbnailer(image_object) + return format_html('', thumbnailer["exam-list"]) + except InvalidImageFormatError: + return format_html('Invalid image url', image_object) + class CidUserTable(tables.Table): # edit = tables.LinkColumn( diff --git a/longs/tables.py b/longs/tables.py index 1aaca779..acd7a72d 100755 --- a/longs/tables.py +++ b/longs/tables.py @@ -1,6 +1,8 @@ import django_tables2 as tables from django_tables2.utils import A +from generic.tables import BlockImageColumn, SeriesImageColumn + from .models import Long, LongSeries, UserAnswer from django.utils.html import format_html @@ -11,53 +13,6 @@ from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.exceptions import InvalidImageFormatError -class LongImageColumn(tables.Column): - def render(self, value): - blocks = [] - for obj in value.all(): - blocks.append(obj.get_block()) - return format_html( - "{}".format("".join(blocks)) - ) - - obj = value.first() - - if obj is None: - return format_html("No image") - - return obj.get_thumbnail()[0] - - # image_object = obj.image - # try: - # thumbnailer = get_thumbnailer(image_object) - # return format_html('', thumbnailer["exam-list"]) - # except InvalidImageFormatError: - # return format_html('Invalid image url', image_object) - - -class LongSeriesImageColumn(tables.Column): - def render(self, value): - obj = value.all() - - if not obj: - return "None" - - image_object = obj[0].image - try: - thumbnailer = get_thumbnailer(image_object) - return format_html( - '
[{}]', - thumbnailer["exam-list"], - value.count(), - ) - except InvalidImageFormatError: - return format_html( - 'Invalid image url
[{}]', - image_object, - value.count(), - ) - - class LongTable(tables.Table): edit = tables.LinkColumn( "longs:long_update", text="Edit", args=[A("pk")], orderable=False @@ -71,7 +26,7 @@ class LongTable(tables.Table): delete = tables.LinkColumn( "longs:long_delete", text="Delete", args=[A("pk")], orderable=False ) - series = LongImageColumn("Images", orderable=False) + series = BlockImageColumn("Images", orderable=False) # series = tables.ManyToManyColumn(verbose_name="Exams") exams = tables.ManyToManyColumn(verbose_name="Exams") @@ -120,7 +75,7 @@ class LongSeriesTable(tables.Table): ) popup = tables.Column(empty_values=(), orderable=False) - images = LongSeriesImageColumn("Images", orderable=False) + images = SeriesImageColumn("Images", orderable=False) delete = tables.LinkColumn( "longs:long_series_delete", text="Delete", args=[A("pk")], orderable=False diff --git a/physics/tables.py b/physics/tables.py index c0f7bb29..969cb0dc 100644 --- a/physics/tables.py +++ b/physics/tables.py @@ -6,21 +6,6 @@ from .models import Question, UserAnswer from django.utils.html import format_html -# from easy_thumbnails.files import get_thumbnailer - -# from easy_thumbnails.exceptions import InvalidImageFormatError - -# from generic.tables import UserAnswerTable - - -# class ImageColumn(tables.Column): -# def render(self, value): -# try: -# thumbnailer = get_thumbnailer(value) -# return format_html('', thumbnailer["exam-list"]) -# except InvalidImageFormatError: -# return format_html('Invalid image url', value) - class QuestionTable(tables.Table): # edit = tables.LinkColumn( diff --git a/rad/static/css/anatomy.css b/rad/static/css/anatomy.css index 65b956a1..39daa622 100644 --- a/rad/static/css/anatomy.css +++ b/rad/static/css/anatomy.css @@ -579,6 +579,10 @@ td.user-answer-score-2.rapid-ans::after { color: darkblue } +.series-block img { + max-width: 100%; +} + .sortable-placeholder { border: 4px solid purple; diff --git a/rapids/tables.py b/rapids/tables.py index f8e191b1..35d789f5 100755 --- a/rapids/tables.py +++ b/rapids/tables.py @@ -1,6 +1,8 @@ import django_tables2 as tables from django_tables2.utils import A +from generic.tables import FirstImageColumn + from .models import Rapid, UserAnswer from django.utils.html import format_html @@ -10,19 +12,6 @@ from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.exceptions import InvalidImageFormatError -class ImageColumn(tables.Column): - def render(self, value): - obj = value.all() - - if not obj: - return format_html('No image') - - image_object = obj[0].image - try: - thumbnailer = get_thumbnailer(image_object) - return format_html('', thumbnailer["exam-list"]) - except InvalidImageFormatError: - return format_html('Invalid image url', image_object) class RapidTable(tables.Table): @@ -42,7 +31,7 @@ class RapidTable(tables.Table): text='Delete', args=[A('pk')], orderable=False) - images = ImageColumn("images", orderable=False) + images = FirstImageColumn("images", orderable=False) exams = tables.ManyToManyColumn(verbose_name="Exams") diff --git a/sbas/tables.py b/sbas/tables.py index da138262..bb7b374b 100644 --- a/sbas/tables.py +++ b/sbas/tables.py @@ -6,21 +6,6 @@ from .models import Question, UserAnswer from django.utils.html import format_html -#from easy_thumbnails.files import get_thumbnailer - -#from easy_thumbnails.exceptions import InvalidImageFormatError - -#from generic.tables import UserAnswerTable - - -#class ImageColumn(tables.Column): -# def render(self, value): -# try: -# thumbnailer = get_thumbnailer(value) -# return format_html('', thumbnailer["exam-list"]) -# except InvalidImageFormatError: -# return format_html('Invalid image url', value) - class QuestionTable(tables.Table): #edit = tables.LinkColumn(