From 3842ebf6fac0c662fc1ea3c8e5862196f2a23315 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Wed, 5 Mar 2008 23:06:58 +0000 Subject: [PATCH] Added WebGUI::Asset::File::GalleryFile Changed Photo to subclass WebGUI::Asset::File::GalleryFile --- docs/changelog/7.x.x.txt | 3 + .../root_import_gallery-templates.wgpkg | Bin 124416 -> 124928 bytes docs/upgrades/upgrade_7.5.4-7.5.5.pl | 24 +++ lib/WebGUI/Asset/File/GalleryFile.pm | 142 ++++++++++++++++ .../File/{Image => GalleryFile}/Photo.pm | 155 +++++++++--------- lib/WebGUI/Asset/Wobject/Gallery.pm | 45 ++++- lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 30 +++- lib/WebGUI/i18n/English/Asset_Gallery.pm | 10 ++ lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm | 2 +- .../{Image => GalleryFile}/Photo/00base.t | 10 +- .../{Image => GalleryFile}/Photo/comment.t | 6 +- .../{Image => GalleryFile}/Photo/download.t | 4 +- .../{Image => GalleryFile}/Photo/editSave.t | 8 +- .../File/{Image => GalleryFile}/Photo/exif.t | 2 +- .../Photo/makeResolutions.t | 10 +- .../Photo/makeShortcut.t | 4 +- .../Photo/permissions.t | 2 +- .../{Image => GalleryFile}/Photo/setFile.t | 4 +- .../File/{Image => GalleryFile}/Photo/view.t | 4 +- t/Asset/Wobject/GalleryAlbum/rss.t | 2 +- t/Asset/Wobject/GalleryAlbum/slideshow.t | 2 +- t/Asset/Wobject/GalleryAlbum/thumbnails.t | 2 +- t/Asset/Wobject/GalleryAlbum/view.t | 4 +- 23 files changed, 360 insertions(+), 115 deletions(-) create mode 100644 lib/WebGUI/Asset/File/GalleryFile.pm rename lib/WebGUI/Asset/File/{Image => GalleryFile}/Photo.pm (94%) rename t/Asset/File/{Image => GalleryFile}/Photo/00base.t (89%) rename t/Asset/File/{Image => GalleryFile}/Photo/comment.t (97%) rename t/Asset/File/{Image => GalleryFile}/Photo/download.t (94%) rename t/Asset/File/{Image => GalleryFile}/Photo/editSave.t (93%) rename t/Asset/File/{Image => GalleryFile}/Photo/exif.t (97%) rename t/Asset/File/{Image => GalleryFile}/Photo/makeResolutions.t (95%) rename t/Asset/File/{Image => GalleryFile}/Photo/makeShortcut.t (97%) rename t/Asset/File/{Image => GalleryFile}/Photo/permissions.t (98%) rename t/Asset/File/{Image => GalleryFile}/Photo/setFile.t (95%) rename t/Asset/File/{Image => GalleryFile}/Photo/view.t (94%) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 9033ae39f..bfe4c1b62 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -5,6 +5,9 @@ - Added ability to edit comments. Entirely changed how comments work in prep for turning it into a mixin. - fixed: Child assets not indicated by plus sign in uncommited tags + - Added WebGUI::Asset::File::GalleryFile as a subclass for all files to be + used inside the Gallery. + - Changed WebGUI::Asset::File::Image::Photo to subclass GalleryFile 7.5.4 - fixed: unable to remove calendar feeds in IE6 diff --git a/docs/upgrades/packages-7.5.5/root_import_gallery-templates.wgpkg b/docs/upgrades/packages-7.5.5/root_import_gallery-templates.wgpkg index 7771d9a96fd0b4e9ab7d5a939cca17c5af327e40..84f692c8f7579b95b61a8b4b66013f1c19a46154 100644 GIT binary patch delta 17432 zcma*O2Rv5)`#N!II72q_;c0A%n<~? zfFI@iH}GI07ThHYz=0|9lm3&%FSBGn=oFzY`#~q*FBb3?cGL~H1V8>xrP@G9=r>3F z;?n=y5sqR%xrniT=Tg0C?Tub-a>M#pGL#DcBy$0FLy_oD4&MjiWjX*iY+m6fbXVBM zCNAuf64752U>iPIu)9jrzcYZPC?Eam3{=ei|3{Ly`cDGt{C^XGncSeP4!F(oD~Uss zf0E$;lK}q@@I$6Q!T)Xd@1XVXEd2pG-W>V`w2;7m0qte|6SOtoPtZQUhJLfhKe1kf zZFo}tiTC^956mf^KQVtdc=ZRbX^dYjzWO`xY7Rdu^k0$l{TJk(K|hfP@%}{K1yt9E z5EA_o{8Wkmgiitk6B+)5e>QmeN2sqQ{)GRB$=zWKe;|LFy!30N3;(B8>zMu%dHP?G zjzV7c2tob}a%A~Gk)MarSCajS{QKY!!}nJF3v!vNd`c@JRS_v|eqIY_K7BzQb9I=UT66F0au5hgXNvQq@A=Dm9mGtc#oDdTrtfqRwf%^-ul-56Z z!S7@O=V5hie-NX8|9udi?F8^(2=a-+%;}WQHq+|z_gKGdq(ci>FprKu)^By*>$Tr# z{HF!%*!`16_rKBTDf)#5IqPj$B5>p%EKs*PV<05R_y1t9J^JS!N;mHE zD+7N1|KbRzshX{MQA||DVk7y!sRTD#u^otG=b8{|y?px_<6o4r08`3;zU; z8iZ$C13a+C4U(S+@o%wn1J=K__&ada2sumwxstT|L#v!g5M-L|@OLiNoJh-GognaE zPGPtc2JnLhTnq#FEr#k*i+SM}UjPEXFMzWUf}C_|6vWl&4~ZU05;oB1lOSfh~c?LfG&LUZ2YIB<2#EYK6o=5z<8$T zn9gkfUBkhPNPr99jSfFg3XuFfwY=fzWPm=bxrz?HDvlC_#K{W3ft82PUIrRdDS$9) z5nePtUJ+pdfitoDzX19#M={)p>Tlp!a0x1a^el|@e+PaAu1XDj51_x%6T^$Cf$t*j z2L%-xfbx6jV~B|H!d%Tbze`TIMmBJ!r-k8dG(Zfqv4@MZyPb!f^Sx^fZq|V z*Nxqb?-_geaM|6nvc7+ffxlki0#J(mD{XvAE^QYveH(ryH6dLwdoeC)^;L zF;R;8Z&TExbn8`$UupgBO~LvO3844a&=dS+3or)YW@Z2u++PWx`e#A`e_;kt!Q*5A z!n3sED%?~CAcB=m5y6_V&cOqy06JJ7mJys=7LY#k3L#uW8xVu{%K}8-_ceH|EI|7` z!+;ma0pHV$A56~v`Vp44a({=V1Ki0JxB_#+6@ev;Nt|Uu%>N8arur~>0Pk-$La6Bc z-$JSf6ak(8D>Z`OSN`D!DR{0H5CyMPL50;#V?YV6q4LAUVMjQ(&r<=Om? zrs=ab@MafMv?i+vl_toKa()HYuI0G z!ceaKUp{=U9>oUvD-o5*e<5-vp}!}URDY8Bd*%nBODGQiLg?PZAB2Yf;DQ=w_?63l zIm&pxXZ3KgctG$k8b6#enEr7Zs;O7}w z599&o0C4<5jw4BUp!t&BYm$VO5hhrA_pJvTSlX0dw*nc@*9yU6WidjTuC4=&j~`?8 zxIU|sdT;;iJlwE;Se9gU_=2HPy!hR@(Ym@(x>`E8?w0DNg3-xyEJEgM2RZ3hi=R#! zXS`dS0}dJw=7Dt{63nPDX*3s;&Y^NWFYh2UfC;3$jEjGzg5(YXCVC#)oq3&)X80;L zeUUPpw>hf_JmS|kTnD$><_a8KOvdHw1#`1EqpSD|ZaeWeke=rzCXGgxcq6>WZ!GId zmf0CY(s^iIuxM@uaz3d+{ZC6e(jSAJ-6%zBeG zOK%B6xWSPDd(ffyJ&2Ld99q{_^qx{=k0N7#1BkY&vThDs-*B91ewCMJzB*QV-Fv;s z_h7xwY3h^DYU#khz=NH|wNI~n2eZXDnorh|rzZz%Q?|8+c7l^r&MmJjI-?Ih`EHEr znTfm1-ZU{WF)%Rj^z>9y8)y$BsCWEOb@v^}*i?;0Kq*Qax3@Y@MMYI^SX+{tduOCj z74@8gk*`8RLY#VKA1ll|w!ifD+w6R7a2Ij@WNc(~-D6oJ|J_|)YBzWHnfvpxLJniv z+S&_WzND)ZCM6|(`{pPqDH$eRd4KD32oCY$(o#f3gtvzW05Gxoo;V$=L8&oZQN)^k^K1WLp7YsXupTE91|P+Q-eDWgsqy+|7H1IzJ!E?=-U0Y z+Hq};6gV7SUw`mK5%$f?S5q^w-{#~C+)UzdHiSOlFt4O!<&krvc}Hm6>^~)grVs4b#+lo_#L7wAVs30s%l-SFJRL*^wk3eT*7lD zxzj?-|G4H>zL@X+b7O8vzeC<|^Zx#RQc_Z7I5!b4F3H2r?(S|1{4e`!Q&CY-gxK?Y z<7RpsDKh~lPA)E+NzBSDYMG*r6BT1)V^WeDQ8(Mp8n; zv{Y9;M?#!~qoksOmy`41;F4Lh-_gqGGgntvhw(CTw}nUzHpJ(LJp2LzWjy4Sb2^k7U>6pfhM!q)uTklg9dILm@JISl>+dNMum2b3Wh!^zml!%z?#5HAwCx3iAOfB)Q$Vn}w5C53S*zRsZ zX$7{mUe>+Acr$G}VgZ^U%j7N4@eBTO}9juOr>Y^=-B0_|hHBxm=owkYzFMTCI z$9~YYxv5E`UF1Vvkll7Pafe6oLjGJ7InT%Zr|#bthI4Ceof>=1*yvT_QaVaK2iSC7 zFkJ+KVaq~K64RmLtE*}AcOz>)NMof5ld%h4IV6{7;`zWI4rc0qka+WKHp!n9o%b;p zF8XNwA(i7Q^~1~rfLVfuii<(W;Uxnz+to>3sx1pQdFCi7`S~E+ZtyKUPRRjB+LGI} zvPwD6p%;;UlL)OU`l1pI!K7CwhSjnD^#>=-ah;^l0Gl{%0=>5 z3Okf)5GUOYQ&&oBL5@TCk@dXRA@^FgkFmK6L#ekm$TKFY9CAT~pN2waECFgtz zqty$rbSjmLJ7dBPY2>!Qif+3-g{h=#OFceu$5>!0FWp{An)BrmHEfrlBX}C>t2shj zWhZEfu3(+um%GcZ_8~V{SjJl0Uf}7Mh6XC~H~~o;i#VP4jaM?{;bof1@=LKVr18^w z0`05}*H}R=TCtl-bIhd#p*Dv}3;dh;53rpV6R&#_JWWWyC$H8`>&xh1?|mDqV?DGN z``wEK>-KhnuTen;b~u-;D4nLaFXCoRuADC`rqB;sE+Mon{Dv6l44R)3t@sEg4>w3Tmo<( zZuU~KI~lJ(rE+X|c=R+67=BP>)afcB&EY*~EYXRS7xG6;>Jl*51<5c1gTy2){DJ0a zwOC^KV41JMoxvk|e7wy)$x5U<^!kVhx~Q}%84QskHVzQwJ0BLoEUIif zXBQcd>m!PMh)>cras*0JkCF3!)E2&q=~@I<%Jt}95ta!%|Aw+8mc_)ByS}vuN8p16 z=E8ihj7gbvJiG1Il`Ze1!;5}5sM)@>6zMXls?E*w-3|zn%84jeL12cKr+4cyWTacx z6c@4^3X1bJ4lyYV=i+^xeSv4$Hd8Lz_7*)sfet`R+^0r^@&-)q(>?cx(8&(*7{9KA zV_|c6Y*ld8BKQ7VS(E;C8^L?jCsa3ikB5-N!7uh9ao^JontdKXDrEo{Uyh98eMUdF z*43Q&D@)Uo>#e;4Hqh9yul+{66X^^cV2+#QaygBFfd3AYF78|D+jOCkq){Fm%iH{S z>PSZ{#10>EOIq_6rCd`P^qPM5u;1PiO9zRpRz_ED4wv1~aOJ za0pspJs)Nu6AHbVKoU$ErI1H@=e8{18Bdt>g5yfNeo$lty-VBFYx(fTa-1t879h*L zaaL-a;Wa8G8DXG<-Rf@EyV*^yP`EUdp zsYLHx1$&?g$3t_7Cy=BaYSiOAFoGjuKjurmk>A}~B6IQgdV$~f1i3SQyh~9J(Un22 z$4g(ABu}nX46~MgEJp<1dolac0i?Sz20eT^0Dh8$raY0#Oq6ZvLD14cgy)_U*^??P z1*-CacVCJc7C&GMH7`bJk_b@mUSqa-g8?9J6c{)yX7t?>8fb?;eX*axR(_8R!3>}$ zagC>1t~{M5V5&^3fF#*^i9nM54eUH04cK}tVunf<74BCl=ayQ;eIXo>Rhy2NxbHq; zze&?Z+oo?Bm-3&$2D-8LM1FaCGj*Os|&c;X1(2tGQH*7uH0cDXmiICI+NODB~ z^Vi+A>J`3PoSTTHcm#1c=CT$kw8e&$M_q%6p9P7xBpIQ3g8_(nTQU+s9G~a*3f+Ey zZ@0u$U4vuq29hA3*Aeg*h-6Ny5?TU| zH{#FRmw$uoCZHX((}R9rl3F}G60%JzJOuFsjyDaOKFrmxKDF#jeDm`CBEHXFKnV+@ z^f<%!0@j)MCIUd19wl)wVSu#UYr2{ta$!!TBDR}rwa@+dBnHcqN z@!e?L2=9H|(#Ct00hh9Om!cJv_|Q*ebGafg-dr>~4-wd?luOE)!85Ry zN$CPC*Kfy<>+~EYPR0Y*#id8={CdW&|gU1nRKnNzu{$*S~!RNQpUA3!%F6L_wb^8$<%DdkA z_GnFVED{8%CqQh-!@eNV>(1t#yhsnrhDtgoKL3%Sq0P^o50?gWBz^b4eI0qKo_*s1 z;?ULK|1@7do=(C~Ur+B~wk_o3U}L7ydt-gN5hYn0{7?2vQS$6l(}Vdpv8&_dW{qBJ zC?%#>X58R+v|WJGil$BX=i0+|Q1?Y?T$IEGZ3i+@(sH+0>!}**2`G6tj}m4m0fy4K zD3vE4M=R!c=z>!0Iy$3mC^1SaS^+{x)N^!nb#=A1li~0U)T2@2-`d)`prC-6nHh!V zQ?0}JK-P8dZxfZME1jn5oTguT_NH<@LJ8d(yOB32E$KL+VQg%ytqp4H>%Ry%J@!N? za+Ah7lv9Pc( zF;Np@zcMW!`TBW&zSgkxR({mOhg#1@Ia2IV(p9N|Usza}h2>VBh6V*Qyw{pPU7Leh z(d~Va<`tAB`7C5TJUmb-ij~#E=3K`WM#k`S;H3+cl$2y-WVE!j6ckK}3h3zQ$9t=+ zB)A$BSntlqzuno{S)FdIFE1~zudhdC8&97;jfjv(8Qgbwd2VrW?3J&#o}Qkq?Gm@i zOHnbg4^vZTW|xULheEQu(H$=wvSfL^qKWG&NRGpzQbBt`KSOO@dOp{zrM*BIJO{EF z3vaGUeTA10n`CBxVcw)FNpcFQ7R%rMb_2XRBRM6)J9&EFZ7HYv1gT9qx!3HSK%i&P zO8K=(3+GrNn&8~@%*iwynYj9xKiWTQ@ep^-^`mu#J2y|AkGZu?dBsstl|5cG!Hx)@N6_q`XChS-9qzQADPh z(rOvaG$e+!5lY%=+;6WR`G{zGk|ZJ4ZpWtC}GjJl*=l; z-yV^EIf}U6-E0dxE}um1m*v}<1^PhqPw6@Q@lRhlwj2tVIJ|U-Oj!G9a_Iukkxwbd zr#EHu+HfVDaVyJ=k=ddht;PvPu=oqNh2Egx^)4Fj%6d=1)QLSd!F5+WBWjIlE*G9> z&n<0nme9s#zRh+&AD9EI%|fry^S{K@{iwQj$KgOmv8=!46#ZNC7JHSl3&)0Fs~6() zN9v1H3rW2RE%fZJ9!<%^y*9UXYF~Hif3y5XscUpS*F7iNaO$26?O-__H7+={&=@K@ zL3LVxC*;+oXEX9s$-8Qfk*XTXV!OA1)Dw{Q)?p0vRBtEtz1cRj$U_Yc9)fS6N4Z1G zkeS~nBqaC6b`82DO*`2DEv=BxUl0fU%M1N-!j8-U0MVke1eP*E@+I1tOzFB$-wne7 z?BlmHsnC}WgxPTXLof1?%l=uWpmSRU9hL zopS`Rw`w?U)3E9!R`K0XAA;lfY~lu!Y%#Li-I3)bw&K5!XP6S6y!t>&+SHHneyqA+ z!dz4m-wY0srn|))MOYn3D7fs4w>wUb^PUkydhQ~1t1P8JtFN^iNG_>ro8vu;c^a50 zsP6E24ufr5Tv5XnJ1gli@d-hA_HG(U@Pg7M+08If3J2c1 zdlq!WH#4X1Pj`-%NB1tyJ zUKe54zSV6mds$=FEiY63w&-LNzy93|F{BougIH7_16lNGc+Egn&WFry!TXFVg#{3}+bPi5%0tY)mCZBWN!La$uG0v7G z8-~s943pGxcFs)%1g^ATF+fvv2=EM#?|i{APa*PAF=VsSl78%5h&-t-g^+AZ(Dr^%FthBU2EosLaUZ#+fhJ%rJpkKth)Fn`Z)_NV3nvtq1 z-5916Nlsm*e>>TEDp}4oH2P9}({2&sdu*}*mEMG$T%{lIAnGF!E$5e8JjX(4`V|5b z1BH}l!ThY`FYw%c;10|MuuOdkgi{IrDY*Fms&mx?jQ{}v8aYzvP}A8Fc)XxUe1z*k z5FOn&knTQU?BztSM1oEogJ;?v;$mZ4H(e#-ZPTdZm&)PE<=$5 zLue6z$Kgh*6nYb_&4@nZKGvY4*2^Jj@5zC1E_XUF?voq==!+lZx0Ew)o#~8*Wlx zj>5rv$xqtn@i09)Tr@aWi1FqJUW}~n-grS1aKY{Zs7a9<_*HfbSEF#7ZbfzJk=EA1 zwQ?Wu22jcW@Ys^UJEm#(CX?>7!MK9QpGq`_*fD(CTfopewn%xwEdt!$uFe*%tu9*B z3r(@;_!x^@{BJp_g|u572FJgAIdAq&T>Fx*`$(b5cv)?8qs?lD&}yCI(YNJ#Njk*# zM0%?7$^NA>JUOrR8!kuN&Q4Asce&YA)9Fq3olgW*pcsg>-;VX>HaXslAYZDn<|Mu( zR{LP*?F>jO)(|ky>hLH7LN3j~o(}jQoPND@-D~4;cQ$D@`e-NT)%~p%y$E&8d`>vG z$>i{`+v#yE(M4h7hHc-DsaVOZlZL!48SyInp5$TA)p|2%Om{$c$VC1FUhu4IkUO_2IuTN~jr{fNseG$=cN!Q(X=zE7_Fxx9{ zvokcO4o#=~W>dcAjO(qpXbA7MHQ3g`i8JB}r}Z_5{9gJ^hE@hZ9hNxxxFT2h?`}@G zJ`0cE;pQ>BlrD^qDNp>!SU9hEZmX)h;}%sMJ5Ad*XAf&7R!>@#Iwck7l|o@63wbs< zxjtC{q+-XCk&nyN<}Jik4pYg~zGkhi7QjsgYBbN$X;@!db>II`AAj^*CpLRLFC~*a8(jdseViHs=jp~VgM3D)0IT?3c`uL zsxz8{e@Jc>b<6&=)~6k}^RY2Msg2ogSLBy@bF%0Xb29xma7}}3rOn4|$A@qa&vk;G zLv4;u*7-T=cZAJ0=gi0pTZHDu!#Z>Cz5AxL>6ZkHIr`kLw4WYU{h=%-WK9!~zA1#P z3$!)DYrcqe^%cLE#^43^+miMkz4=@w$CoP%&gIGX%PM%EJ4wADK5K@CI};8X;(2W4 zSYw{B6jnT^RH}IV z9n5wzgv%<;;D$yJs0HA=$nKB^pTA0~Y8l}TPYKSe$fhfhk(xEa%%xWjz{ zg@#T@u>h+mu>e-lFs*b#ZYJ*KawI+)13Fh?WLp>>kUr@d8emj4yELXl9-`b5Ud#{H zFN8dQKO`q7gNYLu>G_;YjwM5BFeD@Le56&Lp8c+qO~b35HjFlXMrjpWp@N$YoY2nw zm+v7qD--0BqxPh{o?DlYn|b^Rp)Xy9saU2G;k2oU(J%!hJPs+;tbh+rPerK0&Kqei zn~K8h^*OHdQTg;iw~tSpPY$5n1A5Q^9pf^z({NMoz_ovW9sRhHtN+=RyvTv{@=ni} zixFweTlYmN7+AP4H!A~+A7z@ec=WWpH{R$UBh)K{(=8hkeub{yxd@STk(@(AE`4r+ zR}ZhHauSOg9XZ#xOF$tW0=d1A8y}8}p^SU*j`hktNn|oKa$MdE3A|eFI|5&|LXGRt z<4r2;_7h2}<&~+X<&V(ZI^=c$8Z_Q?AA}lbbGE^&4Tl>StEyM0qd;$H+&>CZxX~Cj zjKh9{AhuW@15akRzBMjBmbQ~bQWHfUOFA#2nS6Nr@_M(g`)T}Zpb|M4a=2s>Hq412 z4&4LkUbi%6&VF(ipY@r=M{c%4c|JZ!w42qge(?b6mg!G@*G zjgRhw;>1`?0WzA&d2G035;VJGPoKZaBMArj1*H;1gJ21S9lZEqR(B!~`|ayoSXvFQ zm8(^)Tzfh`>Rur_)bwyCz)M1_+~=`^`e(rlpByO@IT?sEn4G^}LhMgUH68~Q1|iw; zJNU?`qX|1`hRm>^um_MUL-<<;8+iDbeXX+UDop*P31qzK{n1P&kBgeTgFxEOG$SOK zgBC~M!Je70$y0Lso|=TfqP1>!m~@^-heVf7kq1?=5~16H*Jwj1?h;ODV?v34P6>~N zahTO~bLh1x*%P0h2GtKMc3%F0b;-z;V(&~}rUFD%_JpHbzCnk!>Y_(TU%~909$j$v@ z?T9Zl%Goo{b9Ya$0YvV;oHDh?eb#l8b1b)3xF=D$QH^%@eR7RogF2SRt}9$*U61adT|D_)x^SpGMDysD5eS`7}a$G{bfD!3ei~hw|-P zW|iSO&DZM~$;-Q#dWI?18DEZ3>O2}0g#4e>7JM+ESnJZ#Ex!UO;Yv2Ty#E5~Xq8>f z(Xf8BRGCxSUEr{jwwPpQWMp(|ZVgCV_SGW&8Sc_kFmH0+LC3F@*`Wgi#;B;`*_V1G z0%)&`9kwzoyBtL(d}~m@^)^mLtU+7kF4g;Th6R`9Vno`IUfEz!F4jo6RZO|aKo8rw z8R~|yFogAnVe3ri@{)}&LhP=84infNwt@S_H zF4iMBw~j|cm)JH!K2f1{6jG7d6ntLhX=xnY(Zq;xA64g8RnW*{-`&29m-qE%YL|l? zI@Dg5KWg@i6Y_a(xkA1Xu}I&BZCptdrIm$uIUgtc*d?h{+n3#u)iJ;R03@Djskc~* zBX!-1pd#+?@hNj|0j^|NSz6|#SJ624iJ$fkycF_3z6nE@)g*f)&I~A53CVF$iQsSg zL#%hnLV??e87;$gKRP=Iz7GwQ&Xf8wu0io>?FC;r`s|7=l%={3j?$p>$2eX{k(=9K zrYVp5IJGKv{(YJ|x!^WvdSrH?)43N)puUCUgIL13vxnwlX)TI{p{w)tLQ0g;lP|;C zc1_*S1)lVjvWO!}VlLl#U9{v;Y%l)QAUFo_Cmq7bV^fN1dh^VdJ4R}FWQ6pYrt@r# zjch!lU3J?`%?C>5kA0XXDt?(s!UK;k!D3p_2h*-!T6g&z*!X0SAIutJO_msuzcx(y zqT#`I1F=K}-9mnBNvjkwTjfQq&0ZLIsa-p#P!p8l!@_wd<<_mls4vpZ; z`d=UV6GE#>f~fR3MQm*8-4Ju} zLP~2z?DNOGf+*@c%hbQ&{)L@5Xm6vnd@bWpbe>~)}$$v9<20}v|NO;b)C1NcM$r2#$ z-QF>Q7?3!75O9i&pn&S945>~ala&@b7c|^p1o3BLkJ^VvLCp$#X17nrF=*6y&n2z2 z1ZzGU&RD+;2AR4bTY8a$yeho!A%&BcT_k)LIWFF$&g09p2E9_bOm^Kuxi!gx;!)@U z6mX~u#ll{AK%6g4G0~AP@^-}`c`_+iDE<(`WLg0BDIH=h%I$)10+FYQd43EC92uk} z+U|__#^u;lCI&@@1m;cporAOvG!3*LU-067Ko1V}1ECiLc=<&BOaTQ1f3`Z-1A~Ai z05VPwW7k!C)v2VPSlY7q(l2GZx1he)iAV;h&;q-5FwMo~5`2$+@foNY@JZaRT8Xs} z@)8o`O5XeIr+ATNxbiLymo_}k)VIkGn(v-V$}--6u$FzV2t-f6_Jl3NT$JtnSVXI< zSmXT0w``(7&xgSTSJN=1@nAJ7xFY4X`al3NQA`8?qT4@~kW>ueE#A+l$$g zlW#BP_?~FXk3YOvU+QbOT4{O7*KqP>BPc%oZnS0xwsw6V+;KX&xZ&r5MDX^lm7qZ&a>f4VYs(BDs=B|cT_fAW@9Jv(4-v~aLR z^kwbWj_H$gj-L?6&Hgz1b+q3^M;hGv!$%#=9GsoYiw!6gh0A6t)~f5Sz`0K!%(ZvU zOCmkiKMtn%+2;&WsS0r@Eo`(PAAmVq#+*mu-Rsg3rVTEBu7j<-8a zhVRephBw--W)6yE!&wFzpxlZ!K^*~3mFewFD_l*&Cjnp zt;g+Xf2Cntfn(ys`Am+PhDhf`@WdoZX=z$sdoMlRGRKDL60zoh4{&n0q~AyW>U4(h z+0wOvImjX<0(wLY0r?V%MnvF1lY!ri4Z?QR+Z(Y&hK#r1k)1P(GHeIS3}0+swoa_L zagNT^=BjT=oZp?fQ>!?Kga8QxYDuPa)ld* z$O`F3Gdr4@)#wlcxgY{Z>>D(l1-arNLzs$hc_vZuzGo~<=eNpulZ3 zEM(Q_>k42NR23@Hzin`D&!-@i=#1e78TOPmzoB&oR| zV`>wMW>rb@f-io0JjFmRLCU(`?5eC}4ljddE@KJDKqfj-l#+f2zXF++EEYRsg0y`F zgQnw4((;$eLL_P{u2$DLZ(#R%9_7po?$3bwBA$tvbs(7dePTA04&a069+(@ttsBIsh56C8>R@ zmaiZeB^01N1o?(W^B03n-3}z1PRu@? zmfyY4b_hx$ERlns1p`+Hp}Qh;GmVg^)@R9Vj=M7zBV7`ZrPx?6G^y#@=J_x&uf`cX zM~`+611YHfNbaUyTj8K^6W=`8Mf~t^25X-OTZSDM>bQ*b4myQ$4mJ&aFKi0V+7KZK zr~|o6|4!Dd;8LEb=4Z+=;2w=2|E~@H-I*G3YOQ)rCiU9hGzkY=nhaJ^R3t^oB^Rcf=!Nz1AXlM*fRX!!`B!42 zQqodxIj(1ur5_EmE;<6|FOt&9>`v2n`=@vhiXUX2WVx?5uv$bOVR!IG&68N2u*@ww zn`?z!W>+C&iv};V1S$g9?^dunHE*GSQGu|e2q{ySV+;$?(pt^Wb>zGPl z(8snfa9dGgk|tFDf)_gwlBhPitflf9Q}u=x!CedpHynK2zfZp#cAJ7Vi001LVDhbu zuSn|S5EZosnf0NOOGBw#My9WPYEk7!lSVJq9EoZB+SHU3Yb&cKPoALaXqIncXix=B zZZ0lVADhC12M<(KRCIO69?LzXyK(=H@FP_96xGn!fT}$jRNJH^C)0}i?6wABOw~Js zr^kD!(ku8>C0$xmTUuJ$%gf8r@wx7^(XSrG#b@Q#ED`5y7)%RQSVgrD3Oh}Dd>t-8 zl{m!%5ciRYBUFh~0#(vIYrs?bf@)A49v;3**^BCZL^a!)Xld=Bio>WLxGXVu79JiR zHnyUQ3YWHEtcxP|GDTf2{QMB8$|;=3>>en1;fq^Cb+x;u<~vktCXZQj-~1LPIuOi& z>do^%+%!jZ={Y&Ap(?4I92`t!-Kb*jII4tf)t!Xuxuhlx@9XPB)mBk$i6Vl6@5jeC zrs@a#``5-wjc|zRRMgZ0_P?dW;o~UEI7Am}P?h1x$VgPZHx~6m6II7WwQz#Z%F5J~ zl&(G4wh9Q4z`Z+=Eq;PHa#vR$TwcEG?Ck9A?VZF_Zqg`>s&b>iAD*1#h`I(Benq|T zB&6n@{n87^4|{CZ5|Egf$O2O=A4gT2$H&L(Q8ng>bC;ABp-rG=`m?|vOY-K_b+PT_+PKV|X3C1V`iNr0%HYcd?K z>xf9O`0Y)DfUX|g8HlbL+fcbAOZ3%MDvpZ*i!OqVR+F&N6g4#v3W^|BoeOJ>qo2(? ztTk88oxkrrJ*yF>4!mW*R?*UCsJiv$;5Kv;_t-fnIBzKB+f0bV)g5=S_578@%z1)i zS;(WJO<-Ac-2WmAbvCh%>!pT#%qolCcbVCU=E~0KM=e~v3;F|W6|LFT;^7~!p6VHQ z5`Vg(1}^D8V>Ds_agQw%o+o)D48>A$Vm(W%{HV@v8odk9?#$}nq7@O`lGa_1-Vlke zdBRD{G5y#WUBI;UZ6*|z9LJu7AM!#5hoEEojg=vzubdS3Se5Ij!6*N5*DC@d7Hvv3_d=_kzqY%KP>S-PU}7cjElHqd52y%>?VXBzLF?*92dUZ6*{plpSYZevNp1wuJYo zT)at$pNg?Li%9Oo<-kEwl{un$m7;kmI^9*;`V?g)X{a*Gq15xp*CZ5U;e}cv@!ny6 z%<7fJu~GbbI7sh#Xry=?LK2sM)3gg__X<5As)&u~*m|}LK|4^9D1tS_%bBcYC5(Sp zL5z0)9DVDlST9%UkhhFFv~8BRNy0Oe(Pp&58F4f7MPslz<$N<*#4u4W`T3zpXN#pr ztWTLZ<@#;`YX=ZDyPQ5WbN*t&9`qctMeX4V4xLa7h^#w>c09%)?=TueSiemO*sab8kWjU}TBlfz#p8N6W7<@&m`Hp9 zy@Q`LCX(c)>5QIx+M z24m-EDzSUtwnft4I?Rit{$?{|ambYW{0+NyLGnC*%xmkdG$pm6w2amiHl>n`F|1z4 z5Y3P3N|9}Q!nt^3SbgJ-o~nf^3;+f#@16YfzMBSp3SXWW7C*UjgD#PrsW=o*NSfj9 zjj~(Tfqb7IrhT0lu#le$!Th}U#;T|9>Qgk38>E5o!nz{%&G41jzafys)ND4LlkD%U zO{g6_@H?(1s-*<>Z$&02N3Cm@Y>;CdIxij3cNXlMLZj!SQVu#1a_U_1vcjq969i6^ z;Nwc-}fHPw)IsY+E#s9<*cUR7NMk^C z8bZU^X#Nn{K-qHs5u3zr$0t%0pK9NZut;?uKoX%S?-H*-6>Z?{nj zF{5-UqBt1`>~BDg=q8t@s2oqJKqIJg3_Oj>(_LwqICic>Hd<2F`NpqfFG2BVMbmk+ zj??(iJ?IL-JeYjF2LX-#w5*Q1d z(v}$BkF5dMQzwDP(vu^suEAL0E%fw=0b>{u{2Bu(qRbe^1V_;e!EZ6hBHTz}4Di@f zU-;gl09=pp1AL2)0Nyq#01siB{(&D+CI_Q}mod-%SPoH9(SHY>o$nv$>_4Gb53pCC z`vZ0hw%K2h8HMTpfQ%vX12O{~8vYeF5nRvL9=>Hw_z!GBIJfBB57^MMQ&n4tiT=9c zqQ6-2f2_C^=RdHee!~8?;_$D87pjRbRTKUJA4~oFs&oDUUsB^2_%`a)f5LZxgBpbJ zFCx-#2hHE1!&9`5eqC_kf8{H>!v7%G{jbQcqgMwTaQwOYtJl86r-fg!qWOb@p!F{l z=B!x$r0}Z+1mMOtYrk562A*V#{FR3IzoOwF^bZY(|4Ks#y*fyy4!xSe^4QlAEVy6$FKk=fV8rnHc9QSu zmjV9wl%H&?V^7Ip|0FVDxc95y^DlLEUg!F+Ttxp}KIr+*rRRTf=`HvVE>gd6`6Y_} z;vxS2Hy%He+7AxZZKFi6AI5+(@%d_&53axB|F+-$i}0D``X>=g{#X2P!Xw;jim4c^ z-%P;@6a0Z*ZsC`F*5UwJ;r!w+=%L{s{`Lbsv;zvmN0%0V5cu1h@K^5rngE3Vodwo; z{$a5GpA4!tQqX@#4xiX0`murcZe92pFW<0Z2#Jaza*Sbo&<4%`@7<#Puh{tzO!zPy zIL2Z`#o&FLD ze+dzV)1Nl@XUcz%gnzgQpokGVQ7~Qj)idA+p}*Wp0A>A~QU1*akGO#WgZ%0?j1a+u z0c{VziYh2Ce+%+DD9D%ounkP)yH|aK{D)g1oN-~lbNcU&^%tR^o>eDz4yO03RYU~; zOKm3g-ChTK}bCCEy8S9*HEJDHO2#G(zHNLV^B+{X*ien2-eat-zh~s#&ZZd?jLsG{QvNf z=lX|75f?=J4`Y~e!+varM2Np;KtxRITDf7o6#s=o9kj*G{pLEq1oRH<_cDSP5qtSN zOu5THVG_byu!taO%K(3i#f_j{&57!uLP+5!YB52H@4BN7rU5hlKdKd=TYVpoRQ~6A^M9h7G5({pKgkh(kk|FoNw0a(8p80FDu!>XPKv0of~@ATtp0-sB2f3+L;tDj5amuV z{X`P16un;@2;%j9gR6t-!(wrMC`V}Iy9}v=ng22JeM_l>+5R!|^LLzo8xa!x`8%H9 zN50jvP>uF)QVHV5T^PqdY2@xtzxb=bL>%9Tjn};mgt7mT;bGsE4lP0ufRX*&q`oD0 zggfwaRTLX#?>`*w|G}XS;(+=CK0-R;?>PLY<|IH!MM8G|tyDnxMgGcyQTVS({}&4^ zghw>=1ZayI`kjw^G>q|AKEnTQe~O2R{=+B!4?cg}WFi5^@jEFNbm5<(=kJ1m2$RXc z&=8@24U$9ODesDP>>1XJ37ZohPOWa+TnKiDA-A4AgZ`^g5Roe>*PV3dEDj6dU7ZvRZ8 z_~CfaLC2pb1_FqOSy0gbB`pMYun>)zFa;_}dp%=GV?$315fe2*SK-TIzRtoLiocZ? zkgt;A2@8sfNeK#z2*HI=UMbnId*?;PCH~kE#YIJa=7Ag-5e!(R%3>qOz1&u@D{6B;13HQ2W6_kx$C`jEJ6_2oRt64BuH%Z5}yJm6O zWxW!I@8!f;?L^+#;xJE3yPRv~pwneSu}ib^uM*rFZg2T*9X1^XBZ%u;+XZ<^Bhj)? zxkG`wUYlYxBpqacP*koUFBOa~M=wGHjYz2TtaRx5>sU#6j+kFp%r5D?oSnuw?9^3HPiR$VQ@%%2sV}LdthBdE zGUW~2Mj($jInVSubWAtRIBJ$=NifHtY-Mt-kP5H__5x9cje1u-E2$H-M$n)_vU>QQ_~Mmq;C6e zPBplEDD#^Q^4pqezI(7yX;JEZ>Fi70tW~Y+_}#7M!?oh_&B?m*mX?;6FJC@;#vvi$ zhe94d7I(9#umNC|?_c`w(h+q})VOGAYMPXo>6@9=+rD}*-Q*`i6EiU}vD}9!x2(JM zc{ty(+W%l<{DQ=-lH%eEGIuK8-4LZA@b~w3f4Tj-$hes2;>F$FU2P6SXJ=;}ow%&5 zETtT?dXIV3+37ia{EkD)9RtICx>4ncBAi3}Qs7ZVd^|Bs+Uo8Xu}7NA(C5n+S=$cG zrfI9IS6!>egO8UH#BxV-4;h0C%F0kHkKJ`LE{WN{jwx?BS?d#M<-K?@&!Et0Ff&8g zAOhZ!>KUTHLf7j8#fDGOfc((rmf>$>ie1VSc z<&Af_+l$@A=Y^k^mVW7%m_?#aw@k~fN(G(lHQWYPgAc}?prxR|@A~io(PhVsJ3KQJ zXPatL-0U&0WNbXTngs-ZnW%{*=VXxf-FO{)p})U>{X_ZT;i0a&x?b_9;d7nXs3;yD zp5B20DqKuz0jrmR$6kSf$hFa8V){#LWRWdL3(+MdB?zm4!kU`V&)%aJ0p4qA+~LNl>+{<{?}CrrhaSh}{3Y%<2gq;}ZL zY@3z-*X3%XM}nr&98c>!xulpPR8)#Ks4VsXIS!nP@=F%$TJW1vabDII>LYY?b5-bS zY}NY{y!IUft0<`$LNu!L3TF|d3|1Mq{9^=!kHj}B*~dD+s#(xxc)O@8nAlt>PQmAo zQyl-8&CV+(EBcnv(!9+fKq&mfoBVtUg-auxwAKAZDdx;som#Q6RSsj>PuAe{Sa|1n zfTRW1qI6A4BOBIc!3QIBLHB!UrmW2E*1d;t=-!O=y70;w=e!DHZet=oPbaB{GBzo9cYo-w5kf*045-#tlykp3lR{&@j)91a!7x+k>jV3aogob=z0(S6aO z&VJ9i`w|Pi`Z>N~ct@_=KB>SnZxj7g0$x}|0_v{oc*GtNljsVP{o-?ima5JytoP_7 zO;0Ohq{@TT&=nkFY7Of)KVPNUzUnyM9ujucmxmd4)F#v(wwO=gVfiv+A-cfTD)-+Dv!v|iR^-<*s)JWtT@m<9asG33=6RtxCDv zjK=;b>m>(C=89HgUv~To%}eu#x5oLVSWF(!%QD~Ih$<yZ$2n}VyM!~UUtm+=9uM!x zIB45B-xqaBM_HN*#&{{|CK@f0<&7pGgWyV1UXk|7dY8`gxZ7iuJ8dF8pZQ>hPY(`6 z{SkRu2R;Wo{P_6>*s6gYQ-0f+tBhhXmBo|1FX~nK@1x7CCmqN?%IKfyxQaE{%mobj zARo31&SNK`vQF!kw!Y5Vkb#Lu@tr{Pw)KaRSg>(GcJ!#+C2({k2296AQ(urjWb6PI z@dFL@Gn){cU$csj86zViz`Ne4?#l~cz184F6WW+#>_dkT++%X)0-RN#^Xu8R^_7S_ zfvD$<6zim1w`g%l6)_7vyLu&A0Xgma)LoQ?u^iWe8OnzW9#%<`QIL^r=J4z0bUzZo zOjNdpy}PV{iD8c=P(;~7ZiuBEW2ARuXmybX&O}Oi=|Bw{+(usy_8zZecvQ zn3)~6sN>X)g1T-z*<`fBJs4(oB|kY+z5Dj9fPlbRc}2V(T<(TCR|&#+1t1~liBg7> z_}cr;k+WM>47s3Es@}oOF+kBJGXowHoFSAFG@b4#+i_z%_dAAj>o75Kt%3p5p;_*4 zkDCvginfR|64m1sa0#^h1v@U^OT(q*R9cublZ(;RbKbaKFxjghrFu1bl}xtjOL9-P z$(o1k^HX=9NOQNhulAocxdZ+;YkE6JRxdhv4^E6wNNQ#iQx1?bS4800E2TaU(Pt+% z?OKrJ=<2N3#1h)7)1=L?3i5lvurT-W3QgpzPEW25&I6Hm9GC5`hI5OOVdV~I8;D)G zYDL|Kn4A2X$3v{0w@|&bGcw6H^TbO7ZNpp1ZZJ&mlnf}idwU3av*z?%oR?j>8 zm6;S0%0-L&W#Hol9C}By>t(2#cy=`~6r&k~WwR2Ue_ei_Nkh*71etgxkm2tE3Bl3u zXWs5hps8wo97qyLv%QCmcRB(bSstwLPkqS4F6(2Y#KSw?0>+Q!2NOX15D-*5dx)u; ziHn?NoEXh>2)c{fL@}C!ieo^+KI8Q>obTTTN$beodT&nx9*_0yhwSEL&o8+i$^~Tuv5n6}GcQOk5*y0xBj zT`x6T=xI@ym#mM9h{ZlVOVnvRZ9cp^d)9Jzf6%rCQrIlGMBRau?SNH-z=gMpHi;y! z1Zk)i=m7pOruu|eSl3eBJ+WEyafZllm>WG=>)#bSq~j%eandzvJu5TJxqmN zMSB|)j{-4s9N6RcwaJRes*2Hr_G=as2}OHowg;&Z=FBSkP2t(p1^F!hPmFfh1Z0XI zAJRn7zhdDgxy(s>tk1&^pL_fcpx{j4IAElV3ONth>}P3|iN<_kluV^CqhU-kS?U=zbXl!kPWw22Qp>vuDk`( zMxN_tUGiCj-oUBzL^2q8RB7KG#~^EAZ0xi2Ch^rnVp9_n6C)!!nLA%0;dy$vHCyLy z4XJB$b8~0s&(Nz6H^vPO3=FPby=r9i0zz}G$@j}t!|m=k`frG8-6qFME$dvztDr(b z8&daE^`5UD5Z=Fk9}5fX_!u~bM5A>bR7%vi?C$J9svG|Janm==TWnH#wZW?^iV^}p z*wbSURSm=WS_oeAsyo{YD$!JYSL;36!?1Q&2L}fRG9}z+pm(mmO%s7i4MM~Z6CgL=ZD#R))E6c~{cCz=mu&{9Cnf7CdbTT*a4SEtB&Z(Oz<2?KnlCwIg zg0{$`?L|n^Lb4JXwX?HRQc?;G47_^v$zP>KK(m~QMszIv|^BWC1q7rR#jD1R=)S}Au*$z3?y?u4dpNc z%*=|4ilL#QFc{3B@crOmxpiwWOCqj{KFKvaOms%ZENF$leF6dk?%b(wYHDg|*xwkh zhF-|e&kq$te!jlG-rgI-`O)Fw;iaW+(6UQ=f3k6K=z4i2_{I4t#>tRnxA~)V(o~-? zd(-ZBzFzFw;lXG42)?s%0bm?xE62&VDw6T`40!PH4Z?`i0>^Pjb@^jGXx0eS)&Wn~ zw>t;qoes_l+3MGW2GKZMc;YXP-Q^(OOQKq#Z)`nm5(s+rLFFlBfb`pK7B|l+=L-8; zrbaJY|A6v@^(9U4oOEF`@3J zt#?-!>V|e2kBOy?1I6Y5M0JZ?We^6it1EX6PCv%!JzCM&+ASqJC2{CC{}dTk{W5zk z$M+U%bX1PJR}psdp(d;0@aZ#^dT?ITbIY6^EN*Nq-TgF9ojn5{eSYXw9%xOxF3=MD zDSeGj*^9o(CConGy4<+iV%+=5n$fM*CpR=bY3MwIZ&JIkHN4jV7B({NFr+$EYR3+q zu{>rtekQBKeC~{=>3C~7*?Yrv^;7rpV?vp<5vlj(OVKvnmpM4Ws-_uFt zkL5K>SJ>b91eC@#5D3o6qiT`mBvj%(;2bXgk^A^@79g%yLY!Ttcr`f$%}68cYVLDY z?t(iSGNlp)FN9u7Hq+7$P}(LaJbz{+BrL|x$m)T!h2M4oJ&dU{%)?@Zk%|i~jX?2< zPH8>`wjvsLL@Z8L<+du1sMV#F(-3A_E72!U-|xqVVFwA^M>Q^nq+=;0xub zUH1~neBBHTN;4_SGbJHL(uD%iR9jX_ykqpsbJIqGL`od@7(?}6MxyLfm$N{#2Pinn zQ@zj3O6m)GFWwc1sAHmsJel>F>iMviXElmSS-V@!s+650cxA^X`5{XV7YDN*9`DMl zR9x1s#Dwu)1^ob?^x+VRe&62gyk#EEelY;YiTVW~_rT!78qgK8R1o@nthYN=&COL9 zALHG_umw`CD_?EsLj8ql;JaM+Q*%AYs15M3uFt;b;Wob67<^CFqe7BGmAzgsj5&~L zFk3~b&7E2EUN)tdM~g5U4_{mA=I4G8+w2~wgpXch0V+@nJ06@|4@-#Zj#ca=EzG{m6z zgPy8mD29W-3$lATSNn^60k-X;yko<#;H6_y`}kTjM(OTJZW~`|nez_WvnY$=O!PDN zc@!gSTgp(?dg}yBF3F8$)rmJEH2b0v9rByLH9pY}cUx6MTRD_d zE7AGJ01DN)14uXRgJS;n?tvB*HsZUp6=NygK!JKh#kRGjdKBr>P-@gE?RMQ0kml$j zfYt}9o(TD$VJ?86A;=e2={pZjDm7Vf(wDynD)(ny&m=6t{xP6>e>ThQ>`-kSY~2Lg zQCT6A?Z@$Lxkw<0sr|1}*Rwiv%8w`RUqOLdR8z(W;DT7=m>bhN+>tw(<=+9R+Q2b$;#vtU zSPFW|l~54&!4J(GO%D=RqbZHB2h{&@hAAxev&S&_?F>_e&f58$w?9Q90(TETDr)1) z#@mg>frHCnO2yU|6-<9Fax+WbNJg-hqdc4bA>Y#@*A|EqM{E*T?8+2`Y)UCC>?l zbqD*=X<%;vG9_FzeLI;jCY!YFA^rhGz$-R99t#6gm$l1&nF5nrMp70Az4@7b44*Sk zx*nG>hlbpuA<|U&!fgBGK>94x0!Lz6S62H>APSvA@ER8btoKFpLyM8)g=DaKAbN&c zgvrEF-&?Q9LN;W+D;^W z>#=f!GVejU@5V`ERn=PbG|o+X_gfz;7JDDX`I)*|)!giVrkzEPI_N&LW{?^UwjIn2 z_sMy4@a2@>3RzmcJD9IsJXyQx;xZYui4<@ev?>D@GtN;5pUrS$Zy zVO;q&5a?MOt8E33504^6W`h8)$=Zxbx#?D}de_Y}tux(%lQX~d8CgBHH#sjR*0@77g|lMyS;S#Ey) zxn0Xp-o0q%ZkgRqc(tyxz?KB#`Ijw41z)Z&Cwu0dp&qIcE0f-`xZc+G&fbK8e({<` zgRrmzCT<*^aHZW{h& zqqhx>=9Y~5QcigxK}dUz5Pnp~Za~12C`$U`HRLRCbVy71ZtteYGso?q$H!T`1}N*H zW9!hb02$Hk9t9cFXlVq@09<;YuU6G{2RbdMKF0^VP_=e=6t9+`**qAMJUBU$fVL#}>mpAj=OGdag@ zrf(o<>5}gGYH*igVP<_YW5z6(gZ#{QJJUxwg$g&M1NKJI7N#6bdJ;N#E+K|uR%t9s z*i}31eG;yla~C&j8IBU$M&(*SULnAl%jWvDMaAcuNWBMdMJMgPsy<%s#%0zgxS?-g zyl6UDTy3QNYPcp9%A&FK6W5IJA9MuVOum4QK8ucaX12rnDc>bM5 zm_s9}j5E%CqipCbTM%g$s!kQarn+U4GTB7JOA^D*(&=qtfS=s7BOm{~55*|U8p_vxT<{HFG{y9lVp!nLdu<918U?8f4(tsIz3?o7)%w zeN;A}Y_7G3tb<;{h1&hpovGt6EGx<>Y5h#*;4EGl)_@v(kz=@jHxvN0b3&&|?c|IBYGk%syTPuYJ`$ZpFQdJR}-#*wc=224ynnE3E2W$(LNP?Nt3GE!Be-`DUg1;8!=U~8HJtJe9 zRvs!VpN@_E<$9K-=;_nojWvpA&mzJ(Qpc|>PfwrQsIOR;Ycpk6iXu)>F%mSm(x)ck z7%Ph!Dtz%!O4}JIOiN?hF}rT=s~Gxd;98fm(#Mphsyl;>Q_WMi2M#l~4ufWo2mA)~ z6&9!|RL)0*G0pd6gK`dj`1rN}*JX0d&|C__9zg=u^Xk~?5!NM+=bX?>@^{zRipy>X zTnoYp$LNxl+^XKq3>c+W2_Sp^?yF;U#8sI85Zkf9=G=5Kj^7-PItG#(|CJCKR}{gk z^Lp0UPq~9h&jI(3N)9ox&>d}ZIWHxh;A-NfzI9Yd;@3BtX{rF|x>D~V0ePMIHbV6S z0Uq9&0jJk5-|{pFauM8|!fA*~-n26=RNR~?ywu7y-0;YQTHnXA;DOz1W96|eOC$Hk zH)a*2>MmN!_Lr63&>9!W#O^-6pO;aqaqw1s)zQ3xd$=LCIav~Au)yZTY+3Cawr*x+ zoY>wX-kT}bv)E$th`seQuOAT9Q01x}cvguliiwQ1{&dkq$5ke%fJXxL`g1d|PDy!T zr7j?SN?q#&Q z$|WtbC--~%R=D|=pS#Gve-R*4bAiLiktufe`osr#zv;mH>v6txg7r}}z~SI&A0n>w zE?}kA<^BPfUcHoTRGIE7lW2PCtmDQodS}lKDygH4Bbx41-IiYWG_kH!HEw<=eeSEU z{dKKT^TSoG^nne}ttekt7Pu5L%t0#qRw88_zy!OSvUBgJ;<2wqe%&UH z3y;#2{nIO^dEFL^J07~9 z$P>@Y$c7Ti8w=9(4G3Hna-CTFlo&79)kP@dnF9=t9dc#!li{>g;UxXH6-IxFOG<@4Y= z)YkcXTeH!kpw=#UCbqs)B3rS#_TI2Cl@N&wHTA>9*}K*?sS z%rc>L0@ZEdHZ))d2tKx^?b_-A6KEj$kEBL>wFY|?`)Hnmz|1(`#fW2*j}P%ob5Ywd zgW33&*ynju2Lc$Ys_b(u<8`Tivg-r|(IK?Z35w=*=JL!2CTtB|U9}R`=FpLJQrW1d zkb8|dTJmm-P=B@~TX^)sb8{p0I+F5^>Xdi=bQH#Bl3X9)t(2vAa)r@Z*K%&B{hVBv5=UNPa`buhSX;>$B$0v8{S)Le5i zom#UPN6IiXa?`1aO(U8s8h)0onE3Oal9uBmH z#ETDpos;}jyQWTg8iGki_>5wJWm6%fW=aAD@40jYcql0BfD5@^#eN5{ZpKiWJmtLG zc(}W9SNqeB2a1o*us*iNuLEI9;b%xwCbEmctQd-Qi-e(;@7`x?fx34GfoUI9{Ik=} z6GpsyKF7dw%u3;yudheB8!4=AncrG!PiN$`9k}s+UGxbS8#+n&>ki8$$LL5L{iAT} zsuKyDLLX_o7kv>COIU$*zyszm6q5RDLDE^>h}h@+Lk)$gw_xe^2?ID!KsW$k9-@dV zz!@AroH$;lha47jevi|)j>svncUs9%^mA+5z#b5G1j-KpBcjvPJD@sKNuT_qgaJTf zwG}y%E%)By5;*#>E&0JPJ>Fi}KG1#4xRDT6{6aAp)G~uyzSSGlY6M5=<=1Ag~*fPuJ7n-1UR9xvQL!R zQS!K7i97L^!H+=J8xRMELirOH*08}e(A#-K0kr5=k?UxBi7=~_0a!S#ump5f?e`m= z;vzpTM%KXwVfHY9?Bg)D@AFA>n$%N!Cyu+D&8wMP!A=8Gw=wSR5~4Bf$S9hbk}j2@ z`Upt~NU(63(PY$)&OeyH(-Ge!IXnCy(!0b$^_!)18w)MqH>_>_`aX6_x{V5!F}nb;*3(mHN~ZQb%%%WYqETk@{^5jTYj^CE&DTS zPJ^hiiId|>d%&r7>xOmfe0cMhQ{uo=!_$__&vi1~Zq9goott+jLVlb$>G?b&Ygrc@ zfIR9!Sh*kX6u)|GDL2#LH2XT%eRI6p-ER_AW;oqvT58#F5<4(3(AbETczt)m$Fk*< zr1yNsEOY`df3hp!G=NO+DcL&?d}mahtBg8ZZ8fz%6$BEk?8~k`wp2SPTPvS;z|_}z zTbo%TM!H;jsJoSccau{VSZFA6qrAw`GV(A-6KmU8p{ry@8_2b8k_UH ze4KIv`NZbSq@o#FSvYUjpWle^TvUyt>yM$SF2N&XrFm^_)qcfdbZ;YOG7TSGDtbpL zfd7Q(B8L$$%^JI}?bhh`Y~VQ1-rpHna=JJ9OdC2nNfj${`{>PuYxw+1+OgOZEADMC zhy8+W2es~$*rKxJt&$8r;^$%0vh6)P)8~%FkK^Up3j+r*l(kzQNgdo!9o{BcE}@3B za2#cJH_)xHCE^hWuDZyeW&@DKG_jF#lkJI?7iWOFG%!+TeFr(nzAYcsRS=Uj4Ch`I zR)~@JD@E$s+zURI@2)621lgI!NGfUu26xy@j0d=?;xY~N^QH2&Fdl14E*a9_Lc;LNMID9*T6C7B%7dg1 zp%s8A5yLe*UjJvIfj3a$*ZIeoc6At*%7mqoU3GO1(>@O80ZVY}3wQ)M;uz2BylK%D z+=z16ugDfjbq8r>$RM5C+K|LvZC|#tq>mWcG{lPFFGC8cg!+@2M?}YDJSwNotFI9T zjk_bZ{MFbz?P0hEA^B#G%;y|3AB9q&>D>bq3o~E5BpA=m!;P}n=+iyVtsR-0I@|am z<#BqZf)MLz@{s6gww;DUq1akJl@f^>BTw!fs;?AtGz$08jJTd^;(99TC=_YVy!&wR zex4BDqQ9`RS!<$O$-drCpVtJEYRc>9f>fPZ zOp?pkwUJbJDxV6Mb6-+8!n$HTkh9S#VRo+ zrc`=hl6sW=R1kDq0TXa;fhfzUj^6AcpuWnGpSy~}*O7B+A5=Oxb1Z1$_wB=09+1 z*EI3!wkVw2)0KMi6}|R&aA8k(@5q|zo=T)YQlK}mY-_`H8O-(H=mtu-=1#JTfkCi= z4JG19*q>G)phkFlbUD*j26>yxdvjAY0>sG#$(TLPj&(1h1hAT-CNDJXGR_TW2-&}1;O+bhNtN7`x#$ZIauwfsQDaU~^PbHY>?^xy>h~3S zUQ|>Il6dh@s6?D%FRNiNVPcx6r!(_9|!2+TtIVLa#*WLDG% zC?2rmc2Y-o(O_@4Q=F*fzEh?}bLmND5!XN4-k&&?|42vE|JVhEl+0(?XSDU=Ei^Jv zWsQZZH1!ZU`5a)X2%w{8wIiUTXrW;)Il&oz3Jm1~%x5KjUHDvxx!h}t5jnPSvY`tF zY&HDvxMGaEhiXE7zsB2eon)S=c`5;K=d$>NUOYXu|4M9d{xg1q(x9JGetv$rRr5qk z(COxM6Vwp2uQcoJ>oYVoBqt~L+nkbuzGUwnP*77dO8b`N=CVLn)MRCY#;Y9S8Dxdi zuI#S#7nhVwL2XOq@oscfR2-vxFx054s;Ywel;4_j&>cWF4d||#Bg0A;1uK+7yAuG@_X=`h5Zf+(fCT3=4 zmX(!ZDndP8d#E=HwRLy)_htQe*i`f%OSm%#Uw;ENbCROk6*E6`e3 z=Le$B;_0NwsHr(0X$n}k$T+^GAyLYJI^R&w`fzjlv9N=txA)$=Jhcy{mVRd^`%TcT z(wBh$?s&Bm)Qg51-SiT-=%Tv6jKiY7hY6K?oAvM`Q7~9 z2U+I4`?m^LjC}ILUjcLPSjnZB2jCCudjPhlSdP4c(v33-!6BvFs^#HMMp?M~k99G+U)yE3{KH{>$M z5z-zOImiR|;t{iz+g@*5x6tcI>!Lx*<}DmuBA1Fq(P)|Q?sG@>sV|alFQ{UrU;x_Q zWx~LP`9n*TqEU}kn^%^o@TNh)*u+*{tl0B6UwE#uJV6>-w~57p%2Aw4(Z{fj#8=0Q zUK~%;UY)8a=%nmujDF6<(E2#?-bm=O;kd=TCq`hI|Px~uWNrwIdSZ1{xa=}ehIe^-J5>9 z9$#)VeF|i}aP4x;h@X$GZ$eO{4E5Tsn$)D$n=zTI4z=}r^O#a(b!(#l*3mmh zXJobIl5>b0``aSsd9P})xxG?~aZV42>2G%5=Fc!YUO?ng%uA^&> zMe~XA)acAKOns&pw6Vji**_}35HgC@MmWzZNnNo9FWD1HkS~10mc`aJvOga34 zbeeAV)kLeyMK$<@g)!6(;eIM}grsqc!upu`M?x}YnD`>O%FU{3ML-P82!(zWEmB** z_)21^u*&t0dq>$^c@`IVzb<0m$M&*Zp`G$YAT;HwWO&xU?&O+iS^6Ifo;qi-o*%wX zSJNKysGMJK!zn5I1xI*#F7c^}_(XdvjcVoL*Z5qTaB%Rw&8ijLtAVE`G+OH^jo*Ww zrxGU-%4iE6^5xR^FI@&)wf6idw!RoFg@v|N7@@JEE6d<126=Siq~O^mE96&km5ug# z*b^=h2*X}F*BGkG<{QCjTlUj5h4iuc3Wdah5rgDjuAxuK+a^Ws55trd_i|XUB+(bq zX~}*$d`hQL^R1D^t){I=*FH@&3~JuAojb<|s7rw(E4M<#ng&inNL_Y)P9o z)e8r6)v2U?xQ~<+JMKXL*n#98dP)HaUfAn79wU4jcp#}rhP3%xSIY#2n1KX^^iRta zZOia&#;o|4?x1Z4u(Ab)hUS`5nHK>5PVDW*#OUsK3+kQwva!6BAuoUz}W>T z9=bJy#nSi}OS_ONvlh>kO;SEfp8GNZXxs)(qfzooc5WCizMuq{t|WL2$Cn8hoHl7N z2MSHlnQ|78bA>vmWTH#Shk0r=TjiM~ap>Wad`{-*WfM#X2q+>tnj~a{x;b|h;xXl} zNH)&kd((ippU63AkRy59V@BtZbt&B+4q|6|!K~qpJIIG5l5MSSv*1TnloPs`=q0Su$krQ|B%Z-_L6_B&4poAh*a|h^$(|E~GI29%E42=E^o}9bvwg(8E&0Ych zR(V|qGp7NJ9gz4;o&}p)wV4@oLdx%+3alJj%TA)#&Xo~@gL{Aosdb->write( q{ ALTER TABLE Gallery ADD COLUMN richEditIdAlbum VARCHAR(22) BINARY } ); + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN richEditIdFile VARCHAR(22) BINARY + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Move File::Image::Photos to File::GalleryFile::Photos +sub migrateToGalleryFile { + my $session = shift; + print "\tMigrating Image::Photos to GalleryFile::Photos (this may take time)..." unless $quiet; + + # Change WebGUI::Asset::File::Image::Photo to WebGUI::Asset::File::GalleryFile::Photo + $session->db->write( q{ + UPDATE asset SET className='WebGUI::Asset::File::GalleryFile::Photo' WHERE + className='WebGUI::Asset::File::Image::Photo' + }); + + # Delete Photos from ImageAsset table + $session->db->write( + "DELETE FROM ImageAsset WHERE assetId IN ( SELECT assetId FROM Photo )" + ); print "DONE!\n" unless $quiet; } diff --git a/lib/WebGUI/Asset/File/GalleryFile.pm b/lib/WebGUI/Asset/File/GalleryFile.pm new file mode 100644 index 000000000..52449c897 --- /dev/null +++ b/lib/WebGUI/Asset/File/GalleryFile.pm @@ -0,0 +1,142 @@ +package WebGUI::Asset::File::GalleryFile; + +=head1 LEGAL + + ------------------------------------------------------------------- + WebGUI is Copyright 2001-2008 Plain Black Corporation. + ------------------------------------------------------------------- + Please read the legal notices (docs/legal.txt) and the license + (docs/license.txt) that came with this distribution before using + this software. + ------------------------------------------------------------------- + http://www.plainblack.com info@plainblack.com + ------------------------------------------------------------------- + +=cut + +use strict; +use base 'WebGUI::Asset::File'; + + + +=head1 NAME + +WebGUI::Asset::File::GalleryFile - Superclass to create files for the Gallery + +=head1 SYNOPSIS + + +=head1 DESCRIPTION + +=head1 METHODS + +These methods are available from this class + +=cut + +#---------------------------------------------------------------------------- + +=head2 getThumbnailUrl ( ) + +Gets the URL to the thumbnail for this GalleryFile. This should probably be +overridded by your child class. + +=cut + +sub getThumbnailUrl { + my $self = shift; + +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateVars ( ) + +Gets the template vars for this GalleryFile. You should probably extend this +method. + +=cut + +sub getTemplateVars { + my $self = shift; + my $var = $self->get; + + $var->{ fileUrl } = $self->getFileUrl; + $var->{ thumbnailUrl } = $self->getThumbnailUrl; + + return $var; +} + +#---------------------------------------------------------------------------- + +=head2 processStyle ( html ) + +Returns the HTML from the Gallery's style. + +=cut + +sub processStyle { + my $self = shift; + return $self->getGallery->processStyle( @_ ); +} + +#---------------------------------------------------------------------------- + +=head2 www_demote + +Override the default demote page to send the user back to the GalleryAlbum +edit screen. + +=cut + +sub www_demote { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + $self->demote; + + return $self->session->asset( $self->getParent )->www_edit; +} + +#---------------------------------------------------------------------------- + +=head2 www_promote + +Override the default promote page to send the user back to the GalleryAlbum +edit screen. + +=cut + +sub www_promote { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + $self->promote; + + return $self->session->asset( $self->getParent )->www_edit; +} + +#---------------------------------------------------------------------------- + +=head2 www_view ( ) + +Show the default view, with content chunking. + +=cut + +sub www_view { + my $self = shift; + $self->session->http->setLastModified($self->getContentLastModified); + $self->session->http->sendHeader; + $self->prepareView; + my $style = $self->processStyle("~~~"); + my ($head, $foot) = split("~~~",$style); + $self->session->output->print($head, 1); + $self->session->output->print($self->view); + $self->session->output->print($foot, 1); + return "chunked"; +} + +1; # Who knew the truth would be so obvious? diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/GalleryFile/Photo.pm similarity index 94% rename from lib/WebGUI/Asset/File/Image/Photo.pm rename to lib/WebGUI/Asset/File/GalleryFile/Photo.pm index 586fbae21..0fab64b66 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/GalleryFile/Photo.pm @@ -1,4 +1,4 @@ -package WebGUI::Asset::File::Image::Photo; +package WebGUI::Asset::File::GalleryFile::Photo; =head1 LEGAL @@ -15,7 +15,7 @@ package WebGUI::Asset::File::Image::Photo; =cut use strict; -use base 'WebGUI::Asset::File::Image'; +use base 'WebGUI::Asset::File::GalleryFile'; use Carp qw( carp croak ); use Image::ExifTool qw( :Public ); @@ -26,18 +26,19 @@ use Tie::IxHash; use WebGUI::DateTime; use WebGUI::Friends; use WebGUI::Utility; +use WebGUI::Storage::Image; =head1 NAME -WebGUI::Asset::File::Image::Photo +WebGUI::Asset::File::GalleryFile::Photo =head1 DESCRIPTION =head1 SYNOPSIS -use WebGUI::Asset::File::Image::Photo +use WebGUI::Asset::File::GalleryFile::Photo =head1 DIAGNOSTICS @@ -101,7 +102,7 @@ sub definition { autoGenerateForms => 0, icon => 'photo.gif', tableName => 'Photo', - className => 'WebGUI::Asset::File::Image::Photo', + className => 'WebGUI::Asset::File::GalleryFile::Photo', i18n => 'Asset_Photo', properties => \%properties, }; @@ -196,13 +197,18 @@ sub applyConstraints { my $gallery = $self->getGallery; # Update the asset's size and make a thumbnail - $self->SUPER::applyConstraints({ - maxImageSize => $self->getGallery->get("imageViewSize"), - thumbnailSize => $self->getGallery->get("imageThumbnailSize"), - }); - - $self->makeResolutions(); - $self->updateExifDataFromFile(); + my $maxImageSize = $self->getGallery->get("imageViewSize") + || $self->session->setting->get("maxImageSize"); + my $thumbnailSize = $self->getGallery->get("imageThumbnailSize") + || $self->session->setting->get("thumbnailSize"); + my $parameters = $self->get("parameters"); + my $storage = $self->getStorageLocation; + my $file = $self->get("filename"); + $storage->adjustMaxImageSize($file); + $self->generateThumbnail; + $self->setSize; + $self->makeResolutions; + $self->updateExifDataFromFile; } #---------------------------------------------------------------------------- @@ -311,6 +317,23 @@ sub deleteComment { ); } +#------------------------------------------------------------------- + +=head2 generateThumbnail ( ) + +Generates a thumbnail for this image. + +=cut + +sub generateThumbnail { + my $self = shift; + $self->getStorageLocation->generateThumbnail( + $self->get("filename"), + $self->getGallery->get("imageThumbnailSize"), + ); + return; +} + #---------------------------------------------------------------------------- =head2 getAutoCommitWorkflowId ( ) @@ -453,6 +476,19 @@ sub getResolutions { #---------------------------------------------------------------------------- +=head2 getStorageClass ( ) + +Get the WebGUI::Storage subclass name for this file. This file uses the +Image class. + +=cut + +sub getStorageClass { + return 'WebGUI::Storage::Image'; +} + +#---------------------------------------------------------------------------- + =head2 getTemplateVars ( ) Get a hash reference of template variables shared by all views of this asset. @@ -462,7 +498,7 @@ Get a hash reference of template variables shared by all views of this asset. sub getTemplateVars { my $self = shift; my $session = $self->session; - my $var = $self->get; + my $var = $self->SUPER::getTemplateVars; my $owner = WebGUI::User->new( $session, $self->get("ownerUserId") ); # Fix 'undef' vars since HTML::Template does inheritence on them @@ -487,9 +523,6 @@ sub getTemplateVars { = $self->getGallery->getUrl('func=listFilesForUser;userId=' . $self->get("ownerUserId")); $var->{ url_promote } = $self->getUrl('func=promote'); - $var->{ fileUrl } = $self->getFileUrl; - $var->{ thumbnailUrl } = $self->getThumbnailUrl; - ### Download resolutions for my $resolution ( $self->getResolutions ) { push @{ $var->{ resolutions_loop } }, { @@ -512,6 +545,21 @@ sub getTemplateVars { #---------------------------------------------------------------------------- +=head2 getThumbnailUrl ( ) + +Get the URL to the thumbnail for this Photo. + +=cut + +sub getThumbnailUrl { + my $self = shift; + return $self->getStorageLocation->getThumbnailUrl( + $self->get("filename") + ); +} + +#---------------------------------------------------------------------------- + =head2 i18n ( [ session ] ) Get a WebGUI::International object for this class. @@ -704,19 +752,6 @@ sub processPropertiesFromFormPost { #---------------------------------------------------------------------------- -=head2 processStyle ( html ) - -Returns the HTML from the Gallery's style. - -=cut - -sub processStyle { - my $self = shift; - return $self->getGallery->processStyle( @_ ); -} - -#---------------------------------------------------------------------------- - =head2 purge ( ) Purge the asset. Remove all comments on the photo. @@ -771,6 +806,20 @@ sub setComment { #---------------------------------------------------------------------------- +=head2 setFile ( filename ) + +Extend the superclass setFile to automatically generate thumbnails. + +=cut + +sub setFile { + my $self = shift; + $self->SUPER::setFile(@_); + $self->generateThumbnail; +} + +#---------------------------------------------------------------------------- + =head2 updateExifDataFromFile ( ) Gets the EXIF data from the uploaded image and store it in the database. @@ -917,25 +966,6 @@ sub www_deleteConfirm { #---------------------------------------------------------------------------- -=head2 www_demote - -Override the default demote page to send the user back to the GalleryAlbum -edit screen. - -=cut - -sub www_demote { - my $self = shift; - - return $self->session->privilege->insufficient unless $self->canEdit; - - $self->demote; - - return $self->session->asset( $self->getParent )->www_edit; -} - -#---------------------------------------------------------------------------- - =head2 www_download Download the Photo with the specified resolution. If no resolution specified, @@ -1211,25 +1241,6 @@ sub www_makeShortcutSave { #---------------------------------------------------------------------------- -=head2 www_promote - -Override the default promote page to send the user back to the GalleryAlbum -edit screen. - -=cut - -sub www_promote { - my $self = shift; - - return $self->session->privilege->insufficient unless $self->canEdit; - - $self->promote; - - return $self->session->asset( $self->getParent )->www_edit; -} - -#---------------------------------------------------------------------------- - =head2 www_showConfirmation ( ) Shows the confirmation message after adding / editing a gallery album. @@ -1266,15 +1277,7 @@ sub www_view { # Add to views $self->update({ views => $self->get('views') + 1 }); - $self->session->http->setLastModified($self->getContentLastModified); - $self->session->http->sendHeader; - $self->prepareView; - my $style = $self->processStyle("~~~"); - my ($head, $foot) = split("~~~",$style); - $self->session->output->print($head, 1); - $self->session->output->print($self->view); - $self->session->output->print($foot, 1); - return "chunked"; + return $self->SUPER::www_view; } 1; diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index bd162c98a..08ac3d984 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -125,6 +125,13 @@ sub definition { label => $i18n->get("richEditIdAlbum label"), hoverHelp => $i18n->get("richEditIdAlbum description"), }, + richEditIdFile => { + tab => "properties", + fieldType => "selectRichEditor", + defaultValue => "PBrichedit000000000002", # Forum Rich editor + label => $i18n->get("richEditIdFile label"), + hoverHelp => $i18n->get("richEditIdFile description"), + }, richEditIdComment => { tab => "properties", fieldType => "selectRichEditor", @@ -323,6 +330,34 @@ sub definition { #---------------------------------------------------------------------------- +=head2 addChild ( properties, [...] ) + +Add a child to this asset. See C for more info. + +Overridden to ensure that only GalleryAlbums are added to Galleries. + +=cut + +sub addChild { + my $self = shift; + my $properties = shift; + my $albumClass = "WebGUI::Asset::Wobject::GalleryAlbum"; + + # Load the class + WebGUI::Pluggable::load( $properties->{className} ); + + if ( !$properties->{className}->isa( $albumClass ) ) { + $self->session->errorHandler->security( + "add a ".$properties->{className}." to a ".$self->get("className") + ); + return undef; + } + + return $self->SUPER::addChild( $properties, @_ ); +} + +#---------------------------------------------------------------------------- + =head2 appendTemplateVarsSearchForm ( var ) Appends the template vars for the search form to the hash reference C. @@ -372,9 +407,9 @@ sub appendTemplateVarsSearchForm { # Search classes tie my %searchClassOptions, 'Tie::IxHash', ( - 'WebGUI::Asset::File::Image::Photo' => $i18n->get("search class photo"), - 'WebGUI::Asset::Wobject::GalleryAlbum' => $i18n->get("search class galleryalbum"), - '' => $i18n->get("search class any"), + 'WebGUI::Asset::File::GalleryFile::Photo' => $i18n->get("search class photo"), + 'WebGUI::Asset::Wobject::GalleryAlbum' => $i18n->get("search class galleryalbum"), + '' => $i18n->get("search class any"), ); $var->{ searchForm_className } = WebGUI::Form::radioList( $session, { @@ -580,7 +615,7 @@ sub getAssetClassForFile { # Checks for Photo assets if ( $filepath =~ /\.(jpe?g|gif|png)$/i ) { - return "WebGUI::Asset::File::Image::Photo"; + return "WebGUI::Asset::File::GalleryFile::Photo"; } # No class found @@ -931,7 +966,7 @@ sub www_search { my $joinClass = [ 'WebGUI::Asset::Wobject::GalleryAlbum', - 'WebGUI::Asset::File::Image::Photo', + 'WebGUI::Asset::File::GalleryFile::Photo', ]; if ( $form->get("className") ) { $joinClass = [ $form->get('className') ]; diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index b4781de61..81847bc6d 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -146,6 +146,34 @@ sub addArchive { #---------------------------------------------------------------------------- +=head2 addChild ( properties [, ... ] ) + +Add a child to this GalleryAlbum. See C for more info. + +Override to ensure only appropriate classes get added to GalleryAlbums. + +=cut + +sub addChild { + my $self = shift; + my $properties = shift; + my $fileClass = 'WebGUI::Asset::File::GalleryFile'; + + # Load the class + WebGUI::Pluggable::load( $properties->{className} ); + + if ( !$properties->{className}->isa( $fileClass ) ) { + $self->session->errorHandler->security( + "add a ".$properties->{className}." to a ".$self->get("className") + ); + return undef; + } + + return $self->SUPER::addChild( $properties, @_ ); +} + +#---------------------------------------------------------------------------- + =head2 appendTemplateVarsFileLoop ( vars, assetIds ) Append template vars for a file loop for the specified assetIds. C is @@ -381,7 +409,7 @@ sub getTemplateVars { # Friendly URLs $var->{ url } = $self->getUrl; $var->{ url_addArchive } = $self->getUrl('func=addArchive'); - $var->{ url_addPhoto } = $self->getUrl("func=add;class=WebGUI::Asset::File::Image::Photo"); + $var->{ url_addPhoto } = $self->getUrl("func=add;class=WebGUI::Asset::File::GalleryFile::Photo"); $var->{ url_addNoClass } = $self->getUrl("func=add"); $var->{ url_delete } = $self->getUrl("func=delete"); $var->{ url_edit } = $self->getUrl("func=edit"); diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm index 15130d8ad..c9701d7b4 100644 --- a/lib/WebGUI/i18n/English/Asset_Gallery.pm +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -87,6 +87,16 @@ our $I18N = { lastUpdated => 0, context => 'Asset property description', }, + "richEditIdFile label" => { + message => "Rich Editor for Files", + lastUpdated => 0, + context => 'Asset property label', + }, + "richEditIdFile description" => { + message => "The Rich Text Editor to use for Files", + lastUpdated => 0, + context => 'Asset property description', + }, "richEditIdFileComment label" => { message => "Rich Editor for Comments", lastUpdated => 0, diff --git a/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm index 8578ccc16..6f7aa0bd1 100644 --- a/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm +++ b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm @@ -79,7 +79,7 @@ our $I18N = { }, 'help thumbnails body' => { - message => 'These variables are available from the slideshow view of the Album', + message => 'These variables are available from the thumbnails view of the Album', lastUpdated => 0, }, diff --git a/t/Asset/File/Image/Photo/00base.t b/t/Asset/File/GalleryFile/Photo/00base.t similarity index 89% rename from t/Asset/File/Image/Photo/00base.t rename to t/Asset/File/GalleryFile/Photo/00base.t index 3cb164d53..2a69c6ce5 100644 --- a/t/Asset/File/Image/Photo/00base.t +++ b/t/Asset/File/GalleryFile/Photo/00base.t @@ -54,13 +54,13 @@ plan tests => 5; #---------------------------------------------------------------------------- # Test module compiles okay # plan tests => 1 -use_ok("WebGUI::Asset::File::Image::Photo"); +use_ok("WebGUI::Asset::File::GalleryFile::Photo"); #---------------------------------------------------------------------------- # Test creating a photo $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, @@ -71,12 +71,12 @@ $photo $versionTag->commit; is( - blessed $photo, "WebGUI::Asset::File::Image::Photo", - "Photo is a WebGUI::Asset::File::Image::Photo object", + blessed $photo, "WebGUI::Asset::File::GalleryFile::Photo", + "Photo is a WebGUI::Asset::File::GalleryFile::Photo object", ); isa_ok( - $photo, "WebGUI::Asset::File::Image", + $photo, "WebGUI::Asset::File::GalleryFile", ); diff --git a/t/Asset/File/Image/Photo/comment.t b/t/Asset/File/GalleryFile/Photo/comment.t similarity index 97% rename from t/Asset/File/Image/Photo/comment.t rename to t/Asset/File/GalleryFile/Photo/comment.t index 5254711ae..25401a8d2 100644 --- a/t/Asset/File/Image/Photo/comment.t +++ b/t/Asset/File/GalleryFile/Photo/comment.t @@ -20,7 +20,7 @@ use WebGUI::Session; use Test::More; use Test::Deep; use Scalar::Util qw( blessed ); -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -43,7 +43,7 @@ my $album }, @addArguments ); my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, @addArguments ); $versionTags[-1]->commit; @@ -195,7 +195,7 @@ TODO: { my $html; $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, @addArguments ); # Permissions diff --git a/t/Asset/File/Image/Photo/download.t b/t/Asset/File/GalleryFile/Photo/download.t similarity index 94% rename from t/Asset/File/Image/Photo/download.t rename to t/Asset/File/GalleryFile/Photo/download.t index 464c4ee70..b69c03058 100644 --- a/t/Asset/File/Image/Photo/download.t +++ b/t/Asset/File/GalleryFile/Photo/download.t @@ -19,7 +19,7 @@ use Scalar::Util qw( blessed ); use WebGUI::Test; use WebGUI::Session; use Test::More; -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -47,7 +47,7 @@ my $album }); my $photo = $gallery->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, diff --git a/t/Asset/File/Image/Photo/editSave.t b/t/Asset/File/GalleryFile/Photo/editSave.t similarity index 93% rename from t/Asset/File/Image/Photo/editSave.t rename to t/Asset/File/GalleryFile/Photo/editSave.t index 560d10bad..33613743c 100644 --- a/t/Asset/File/Image/Photo/editSave.t +++ b/t/Asset/File/GalleryFile/Photo/editSave.t @@ -20,7 +20,7 @@ use WebGUI::Test; use WebGUI::Session; use Test::More; use WebGUI::Test::Maker::HTML; -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -49,7 +49,7 @@ my $album }); my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, @@ -91,7 +91,7 @@ $maker->prepare({ method => "www_editSave", formParams => { assetId => "new", - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, test_regex => [ qr/You must select a file/, @@ -107,7 +107,7 @@ $maker->prepare({ method => "www_editSave", formParams => { assetId => "new", - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, test_regex => [ qr/awaiting approval and commit/, diff --git a/t/Asset/File/Image/Photo/exif.t b/t/Asset/File/GalleryFile/Photo/exif.t similarity index 97% rename from t/Asset/File/Image/Photo/exif.t rename to t/Asset/File/GalleryFile/Photo/exif.t index 36b669590..51e8938d7 100644 --- a/t/Asset/File/Image/Photo/exif.t +++ b/t/Asset/File/GalleryFile/Photo/exif.t @@ -41,7 +41,7 @@ my $album ); my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, { skipAutoCommitWorkflows => 1 }, diff --git a/t/Asset/File/Image/Photo/makeResolutions.t b/t/Asset/File/GalleryFile/Photo/makeResolutions.t similarity index 95% rename from t/Asset/File/Image/Photo/makeResolutions.t rename to t/Asset/File/GalleryFile/Photo/makeResolutions.t index 5d83cd334..76a8c8c34 100644 --- a/t/Asset/File/Image/Photo/makeResolutions.t +++ b/t/Asset/File/GalleryFile/Photo/makeResolutions.t @@ -29,7 +29,7 @@ BEGIN { $graphicsClass = 'Graphics::Magick'; } } -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -63,7 +63,7 @@ plan tests => 13; # makeResolutions gets default resolutions from a parent Photo Gallery asset $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, @@ -110,7 +110,7 @@ $album }); $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, @@ -148,7 +148,7 @@ TODO: { push @versionTags, WebGUI::VersionTag->getWorking($session); $photo = $node->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, @@ -185,7 +185,7 @@ TODO: { push @versionTags, WebGUI::VersionTag->getWorking($session); $photo = $node->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, diff --git a/t/Asset/File/Image/Photo/makeShortcut.t b/t/Asset/File/GalleryFile/Photo/makeShortcut.t similarity index 97% rename from t/Asset/File/Image/Photo/makeShortcut.t rename to t/Asset/File/GalleryFile/Photo/makeShortcut.t index e84d9aa1e..6f283294d 100644 --- a/t/Asset/File/Image/Photo/makeShortcut.t +++ b/t/Asset/File/GalleryFile/Photo/makeShortcut.t @@ -20,7 +20,7 @@ use WebGUI::Test; use WebGUI::Session; use Test::More; use WebGUI::Test::Maker::HTML; -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -35,7 +35,7 @@ my $otherParent }); my $photo = $node->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", userDefined1 => "ORIGINAL", }, undef, diff --git a/t/Asset/File/Image/Photo/permissions.t b/t/Asset/File/GalleryFile/Photo/permissions.t similarity index 98% rename from t/Asset/File/Image/Photo/permissions.t rename to t/Asset/File/GalleryFile/Photo/permissions.t index d1530ee5f..f4ed2129e 100644 --- a/t/Asset/File/Image/Photo/permissions.t +++ b/t/Asset/File/GalleryFile/Photo/permissions.t @@ -63,7 +63,7 @@ my $album my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", friendsOnly => 0, }, undef, diff --git a/t/Asset/File/Image/Photo/setFile.t b/t/Asset/File/GalleryFile/Photo/setFile.t similarity index 95% rename from t/Asset/File/Image/Photo/setFile.t rename to t/Asset/File/GalleryFile/Photo/setFile.t index 26c9f1dd3..30156d45a 100644 --- a/t/Asset/File/Image/Photo/setFile.t +++ b/t/Asset/File/GalleryFile/Photo/setFile.t @@ -19,7 +19,7 @@ use WebGUI::Test; use WebGUI::Session; use Test::More; use Test::Deep; -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -43,7 +43,7 @@ my $album }); my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, diff --git a/t/Asset/File/Image/Photo/view.t b/t/Asset/File/GalleryFile/Photo/view.t similarity index 94% rename from t/Asset/File/Image/Photo/view.t rename to t/Asset/File/GalleryFile/Photo/view.t index fae1ddac6..53b97959c 100644 --- a/t/Asset/File/Image/Photo/view.t +++ b/t/Asset/File/GalleryFile/Photo/view.t @@ -19,7 +19,7 @@ use WebGUI::Test; use WebGUI::Session; use Test::More; use WebGUI::Test::Maker::HTML; -use WebGUI::Asset::File::Image::Photo; +use WebGUI::Asset::File::GalleryFile::Photo; #---------------------------------------------------------------------------- # Init @@ -43,7 +43,7 @@ my $album }); my $photo = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", }, undef, undef, diff --git a/t/Asset/Wobject/GalleryAlbum/rss.t b/t/Asset/Wobject/GalleryAlbum/rss.t index 63a6fb81f..10523b6b7 100644 --- a/t/Asset/Wobject/GalleryAlbum/rss.t +++ b/t/Asset/Wobject/GalleryAlbum/rss.t @@ -51,7 +51,7 @@ my @photos; for my $i ( 0 .. 5 ) { $photos[ $i ] = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", filename => "$i.jpg", }, undef, diff --git a/t/Asset/Wobject/GalleryAlbum/slideshow.t b/t/Asset/Wobject/GalleryAlbum/slideshow.t index 76d5fec48..f8aa0657e 100644 --- a/t/Asset/Wobject/GalleryAlbum/slideshow.t +++ b/t/Asset/Wobject/GalleryAlbum/slideshow.t @@ -51,7 +51,7 @@ my @photos; for my $i ( 0 .. 5 ) { $photos[ $i ] = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", filename => "$i.jpg", }, undef, diff --git a/t/Asset/Wobject/GalleryAlbum/thumbnails.t b/t/Asset/Wobject/GalleryAlbum/thumbnails.t index e8e211430..0034897c0 100644 --- a/t/Asset/Wobject/GalleryAlbum/thumbnails.t +++ b/t/Asset/Wobject/GalleryAlbum/thumbnails.t @@ -51,7 +51,7 @@ my @photos; for my $i ( 0 .. 5 ) { $photos[ $i ] = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", filename => "$i.jpg", }, undef, diff --git a/t/Asset/Wobject/GalleryAlbum/view.t b/t/Asset/Wobject/GalleryAlbum/view.t index 543383d69..69123241a 100644 --- a/t/Asset/Wobject/GalleryAlbum/view.t +++ b/t/Asset/Wobject/GalleryAlbum/view.t @@ -52,7 +52,7 @@ my @photos; for my $i ( 0 .. 5 ) { $photos[ $i ] = $album->addChild({ - className => "WebGUI::Asset::File::Image::Photo", + className => "WebGUI::Asset::File::GalleryFile::Photo", filename => "$i.jpg", }, undef, @@ -87,7 +87,7 @@ cmp_deeply( $album->getTemplateVars, superhashof( { %{$album->get}, url => $albu my $expected = { "url_addPhoto" => all( - re( qr/class=WebGUI::Asset::File::Image::Photo/ ), + re( qr/class=WebGUI::Asset::File::GalleryFile::Photo/ ), re( qr/func=add/ ), re( $album->getUrl ), ),