;ò )©ï@c @sñdklZdklZdklZdklZlZdk l Z dk l Z dk lZdklZdkZd klZd klZd klZdkZd klZlZlZd klZl Z dZ!dZ"eo8dk#Z$dk#l%Z%l&Z&l'Z'l(Z(e(Z)e'Z*ndZ+dZ,dZ-dZ.dZ/e+dfe,dfe/dfe.dfe-dffZ0hdd<dd<dd<dd <d!d"<d#d$<d%d&<d'hdd(<d)d*<d+d,<d-ei1f„ƒYZ8ee8ƒdS(?(sClassSecurityInfo(sInitializeClass(sBase(sImplicits aq_parent(s Traversable(sChangeCacheSettingsPermission(sCMFCorePermissions(sImageN(sOOBTree(sescape(sStringIO(sLOGsERRORsINFO(sisPilAvailablesisConvertAvailableiid(sNEARESTsBILINEARsBICUBICs ANTIALIASiiiisFlip around vertical axissFlip around horizontal axissRotate 90 clockwises Rotate 180sRotate 90 counterclockwisesidsPhotos meta_types descriptions3Photos objects can be embedded in Portal documents.siconsphoto_icon.gifsproductsCMFPhotosfactorysaddPhotosimmediate_viewsimage_edit_formsactionssviewsnamesViewsactions photo_views permissionssedits Propertiessportal_form/image_edit_forms transformsTransform Imagesphoto_transformsmetadatasMetadatasportal_form/metadata_edit_formss image/pngcCs„tii|||ƒ\}}|iƒ}t||d|||||| | | | | ƒ }|i||ƒ|i|ƒi|ƒdS(s Add an Photo sN(sOFSsImagescookIdsidstitlesfilesselfsthissPhotos content_types preconditionssubjects descriptions contributorsseffective_datesexpiration_datesformatslanguagesrightssiobjs _setObjects_getObs manage_upload(sselfsidstitlesfiles content_types preconditionssubjects descriptions contributorsseffective_datesexpiration_datesformatslanguagesrightssiobj((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pysaddPhotoTs  sDynVariantWrappercBstZdZd„ZRS(su provide a transparent wrapper from photo to dynvariant call it with url ${photo_url}/variant/${variant} cCs|iƒSdS(N(sparentsVariants(sselfsparent((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys__of__€s(s__name__s __module__s__doc__s__of__(((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pysDynVariantWrapperzs s DynVariantcBs tZdZd„Zd„ZRS(s( provide access to the variants cCsdS(N((sself((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys__init__ˆscCs8|i|ƒo |i|ƒit|ƒƒSn|SdS(N(sselfscheckForVariantsnamesgetPhotos__of__s aq_parent(sselfsname((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys __getitem__‹s (s__name__s __module__s__doc__s__init__s __getitem__(((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys DynVariant„s  c Bs$tZdZeifZdZddddfdfeedddd„ ZeƒZ e ƒZ e i e idƒd„Ze i e idƒd „Ze i e id ƒd „Ze i e id ƒd „Ze idƒd„Ze i e idƒed„Ze i e idƒeeedddeedd„ Ze i e idƒed„Ze idƒd„Ze idƒeed„Zed„Ze i e idƒd„Ze i e idƒd „Ze i ed!ƒed"„Z e i e id#ƒd$„Z!e i e i"d%ƒd&„Z#RS('s. Implements a Photo, a scalable image sPhotoss image/pngsen-UScCsDti|||||||||| | | | | ƒtƒ|_dS(N(sImages__init__sselfsidstitlesfiles content_types preconditionssubjects descriptions contributorsseffective_datesexpiration_datesformatslanguagesrightssOOBTrees_photos(sselfsidstitlesfiles content_types preconditionssubjects descriptions contributorsseffective_datesexpiration_datesformatslanguagesrights((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys__init__žs sVariantscCstƒi|ƒSdS(N(s DynVariants__of__sself(sself((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pysVariants¸ssgetPhotocCs|i|SdS(s'returns the Photo of the specified sizeN(sselfs_photosssize(sselfssize((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pysgetPhoto½ss getDisplaysc Cs¼g}x›|iƒiƒD]‡\}}t|ƒdjo|d}nt}|i hd|<dd||d|df<d|d|df<d |<ƒqW|i d „ƒ|SdS( Niisnameslabels %s (%dx%d)iissizesqualitycCs5t|dd|dd|dd|ddƒS(Nssizeii(scmpsd1sd2(sd1sd2((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pysÐs( sresultsselfsphoto_display_sizessitemssnamessizeslensqualitysDEFAULT_QUALITYsappendssort(sselfsnamesresultsqualityssize((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys getDisplaysÂs Xs getTransformscCsAgi}tD](\}}|hd|<d|<ƒq~SdS(Nsnameslabel(sappends_[1]s TRANSPOSE_MAPsmethodsname(sselfs_[1]smethodsname((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys getTransformsÔsscheckForVariantcCsã||iƒiƒjoÂ|ii|ƒ oDtii|||i|iƒi |ddfƒƒƒ|i|N(+sselfswidthswsheightshsNonessizesphoto_display_sizesskeyss_photosshas_keysgetsxsystmpwstmphsexif_orientationsmirrorsrotationsintsroundsfloats ValueErrorsphotosxscalesscalesxdeltasyscalesydeltasstrs absolute_urlsescapesresultsaltsgetattrstitlesappends_[1]sargsslowers css_classskeysvalue(sselfsheightswidthsaltsscalesxscalesyscales css_classstitlessizesargssphotosresultsmirrorstmpwstmphsxdeltaskeysrotationsydeltasvalues_[1]swshsysx((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pystagòsj   ((     &&  ;  s doTransformcCs†tƒ}t|ƒ}toStiitt|i ƒƒƒ}|i }|i|ƒ}|i||dtƒnÜto½|tttgjoMd}|tjo d}n|tjo d}n|i|d|ƒ}qJ|tjo|i|dƒ}qJ|tjo|i|dƒ}qJtd|f‚ntotd ƒ‚n|i|iƒƒ|o|ii |i!ƒd ƒnd S( sÎ Transform an Image: FLIP_LEFT_RIGHT FLIP_TOP_BOTTOM ROTATE_90 (rotate counterclockwise) ROTATE_180 ROTATE_270 (rotate clockwise) squalityiZi´isrotatesflopsflipsUnknown method '%s'sError in doTransforms/photo_transformN("sStringIOsimagesintsmethodsisPilAvailablesPILsImagesopensstrsselfsdatasimgsformatsfmts transposessavesDEFAULT_QUALITYsisConvertAvailables ROTATE_90s ROTATE_180s ROTATE_270sdegs callConvertsFLIP_LEFT_RIGHTsFLIP_TOP_BOTTOMs ValueErrorsDEBUGs Exceptions update_datasgetvaluesREQUESTsRESPONSEsredirects absolute_url(sselfsmethodsREQUESTsimagesimgsfmtsdeg((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys doTransformFs4  !       s callConvertc Os8dt} x|D]} | d| f7} qWx.|iƒD] \} }| d| |f7} q9W| d7} ti djo&dk l }|| dƒ\} }n,dk l}|| ƒ}|i}|i} | it|iƒƒ| iƒ|i|iƒƒ|iƒti djo|iƒn|id ƒ|Sd S( sj Convert an image using the 'convert' program img_file_obj is a StringIO instance sconvert -quality %ss -%s s -%s %s s - -swin32(spopen2sb(sPopen3iN(sDEFAULT_QUALITYscommandsargssargskwargssitemsskeysvalssyssplatforms win32pipespopen2simginsimgoutsPopen3sconverts fromchildstochildswritesstrsselfsdatascloses img_file_objsreadswaitsseek( sselfs img_file_objsargsskwargssconvertsvalspopen2simgoutsPopen3scommandskeysimginsarg((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys callConvertps0           s update_datacCs$|iƒti||||ƒdS(s: Update/upload image -> remove all copies N(sselfs clearCachesImages update_datasdatas content_typessize(sselfsdatas content_typessize((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys update_data•s c Cs:tƒ}|d}|d}t|ƒdjo |tjo|d}n|i ƒ\}}t ot iitt|iƒƒƒ}|i} |i||ftƒ|o d|}|i|tƒ}n|i|| d|ƒnNto/d||f} |i|d|d | ƒ}ntotd ƒ‚n|Sd S( sResize and resample photo.iiiiihsqualitys%sx%ssrotatesgeometrysKError in _resize: No image manipulation engine found! Pleas read the readmeN(sStringIOsimagessizeswidthsheightslensqualitysDEFAULT_QUALITYsselfsexif_orientationsmirrorsrotationsisPilAvailablesPILsImagesopensstrsdatasimgsformatsfmts thumbnails RESIZING_ALGOsrotates ROTATING_ALGOssavesisConvertAvailablesgeometrys callConvertsDEBUGs RuntimeError( sselfssizesqualitysheightsmirrorsimgswidthsimagesrotationsgeometrysfmt((s;/mnt/gmirror/ports/www/zope-cmfphoto/work/CMFPhoto/Photo.pys_resizeœs*    !  sgetEXIFcCsÁdk}y"|itt|iƒƒƒ}Wn h}nX| o h}n|iƒ}|iƒh}xM|D]E}|ddfjoqpnyt||i ƒ||