m &Ec@s@dZdklZdkZdkZdkZdkZdkZdkl Z l Z dkl Z dk l Z dklZdklZdklZd klZd klZlZd klZd klZd klZdklZdkl Z l!Z!l"Z"dk#l$Z$dk%Z%dk&l'Z'dk(l)Z)dk*l+Z+dk,l,Z,l-Z-dk.l/Z0dk/l/Z1dk2l3Z3dk4l4Z4ei5dZ6e de7Z8e9e9dZ:de eefdYZ;e e;dZ<dZ=deefd YZ>ed!d"Z?e@d#ZAeBgeBfd$ZCdS(%sE ZCatalog product $Id: ZCatalog.py 71169 2006-11-17 20:11:22Z lra $ (swarnN(sDTMLFiles MessageDialog(sInitializeClass(sFolder(s ObjectManager(sDateTime(sImplicit(s Persistent(s InstanceDicts TemplateDict(sEval(sClassSecurityInfo(s name_trans(sRestrictedDTML(smanage_zcatalog_entriessmanage_zcatalog_indexesssearch_zcatalog(s ConflictError(sPluggableIndexInterface(sIPluggableIndex(s implements(sCatalogs CatalogError(s IZCatalog(s ZLogHandler(sZCatalogIndexess Zope.ZCatalogsdtml/addZCatalogcCsht|}t|}t||||}|i|||dj o|i ||ddSndS(sAdd a ZCatalog object t update_menuiN( tstrtidttitletZCatalogtvocab_idtselftct _setObjecttREQUESTtNonet manage_main(RRRRR R((t9/data/zmath/zope/lib/python/Products/ZCatalog/ZCatalog.pytmanage_addZCatalog5s   RcBsbtZdZeZeeeZei e dfei e dfei e ddfdZ dZhdd<dd<d d d fd1ed?Z'eie d@eeedAZ(eie dBeeeeeeeedCZ)eie dDeeedEZ*eie dFeeedGZ+eie dHeeeedIZ,eie dJeeeedKZ-eie dLeeeedMZ.edNZ/eie dOeeeedPZ0eie dQdRZ1eie dSeedTedUZ2eie dVdWZ3eie dXdYZ4eie dZd[Z5ed\Z6eie d]ed^Z7d_Z8d`Z9daZ:dbZ;eie dcddZ<eie dedfZ=eie dgdhZ>eie didjZ?dkZ@dlZAeie dmeednZBeie doeBZCeie dped1edTdqZDfZEeie drdsZFeeeeeeeed1eed2ed2dtZGeie dudvZHdwZIdxZJeie dyd1eedzZKd{ZLeeed|ZMed}ZNd~ZOdZPedZQdZRRS(sZCatalog object A ZCatalog contains arbirary index like references to Zope objects. ZCatalog's can index either 'Field' values of object, or 'Text' values. ZCatalog does not store references to the objects themselves, but rather to a unique identifier that defines how to get to the object. In Zope, this unique idenfier is the object's relative path to the ZCatalog (since two Zope object's cannot have the same URL, this is an excellent unique qualifier in Zope). Most of the dirty work is done in the _catalog object, which is an instance of the Catalog class. An interesting feature of this class is that it is not Zope specific. You can use it in any Python program to catalog objects. tManagert AnonymousRsmisc_/ZCatalog/ZCatalog.giftlabeltContentstactionR thelptOFSPsObjectManager_Contents.stxtCatalogtmanage_catalogViewsZCatalog_Cataloged-Objects.stxt Propertiestmanage_propertiesFormsProperties.stxtIndexestmanage_catalogIndexessZCatalog_Indexes.stxtMetadatatmanage_catalogSchemasZCatalog_MetaData-Table.stxs Find Objectstmanage_catalogFinds#ZCatalog_Find-Items-to-ZCatalog.stxtAdvancedtmanage_catalogAdvancedsZCatalog_Advanced.stxtUndotmanage_UndoFormsUndo.stxtSecurityt manage_accesss Security.stxt Ownershipt manage_owners Ownership.stxtall_meta_typessdtml/catalogAddRowFormsdtml/catalogViewsdtml/catalogFindsdtml/catalogSchemasdtml/catalogIndexessdtml/catalogAdvancedtmanage_objectInformationsdtml/catalogObjectInformationi'itcCsf|dj o|i|}n||_||_d|_d|_d|_d|_ t |_ dS(NR(i'i( t containerR Rt__of__RRt vocabularyRt thresholdt_v_totalRt_catalog(RRRRR)((R t__init__s       cCs|iit|iS(N(RR.tmigrate__len__tlen(R((R t__len__s icCsGt|tdj ot|}n||_|i|ddS(s edit the catalog is2/manage_main?manage_tabs_message=Catalog%20ChangedN(ttypeR,tintRtRESPONSEtredirecttURL1(RR5R7R,R ((R t manage_edits  cCs5|io d|_n d|_|i|ddS(s toggle subtransactions i's=/manage_catalogAdvanced?manage_tabs_message=Catalog%20ChangedN(RR,R R5R6R7(RR R5R7((R tmanage_subbingToggles    tmanage_catalogObjectcCs|ot|to |f}nxu|D]i}|i|}|djo&t|do|i ||}n|dj o|i ||q+q+Wn|i |ddS(s+ index Zope object(s) that 'urls' point to R s:/manage_catalogView?manage_tabs_message=Object%20CatalogedN(turlst isinstanceRturlRt resolve_pathtobjR thasattrt resolve_urlR tcatalog_objectR5R6R7(RR R5R7R;R?R=((R R:s  tmanage_uncatalogObjectcCs[|o?t|to |f}nx|D]}|i|q+Wn|i|ddS(s, removes Zope object(s) 'urls' from catalog s</manage_catalogView?manage_tabs_message=Object%20UncatalogedN( R;R<RR=Rtuncatalog_objectR5R6R7(RR R5R7R;R=((R RCs tmanage_catalogReindexcCsti}ti}|i}|djo t|pd}|i ddd|ti|}ti|}|i |dtid| | fdS(s- clear the catalog, then re-index everything itclearit pghandlers,/manage_catalogAdvanced?manage_tabs_message=s2Catalog Updated Total time: %s Total CPU time: %sN(ttimetelapsetclocktc_elapseRt_getProgressThresholdt pgthresholdt ZLogHandlerR thandlertrefreshCatalogR5R6R7turllibtquote(RR R5R7RIRKRORM((R REs    RPc Cs[|i}|ii}|ot|}|int|}|o!|i d|i d|nxt |D]}|o|i|n||}|i|}|djo|i||i}n|dj oZy|i||d|Wq>tj o q>tid|dtiq>XqzqzW|o|indS(s! re-index everything we can find sRefreshing catalog: %siRGs Recataloging object at %s failedtexc_infoN(RR.tcattpathstvaluesRFttupleR1t num_objectsRGtinitt absolute_urltxrangetitreporttpR>R?R RAR RBt ConflictErrortLOGterrortsysRStfinish( RRFRGRUR^RTR\RXR?((R RPs6   !     tmanage_catalogClearcCs4|ii|o|o|i|dndS(s clears the whole enchilada s=/manage_catalogAdvanced?manage_tabs_message=Catalog%20ClearedN(RR.RFR R5R6R7(RR R5R7((R Rd2s tmanage_catalogFoundItemsc Csti} ti}d}|id}di|i }|i |d|d|d|d|d| d | d | d | d dd |d|id| }ti| } ti|}|i|dtid| | fdS(sC Find object according to search criteria and Catalog them iit/t obj_metatypestobj_idstobj_searchtermtobj_exprt obj_mtimet obj_mspectobj_permissiont obj_rolest search_subR t apply_funct apply_paths(/manage_catalogView?manage_tabs_message=s1Catalog Updated Total time: %s Total CPU time: %sN(RHRIRJRKtwordsR tPARENTSR?tjointgetPhysicalPathtpathRtZopeFindAndApplyRgRhRiRjRkRlRmRnRBtresultsR5R6R7RQRR(RR R5tURL2R7RgRhRiRjRkRlRnRmRIR?RKRxRvRr((R Re>s,      tmanage_addColumncCs4|i||o|o|i|dndS(s add a column s8/manage_catalogSchema?manage_tabs_message=Column%20AddedN(Rt addColumntnameR R5R6R7(RR|R R5R7((R Rzls tmanage_delColumncCsbt|to |f}nx|D]}|i|q$W|o|o|i|dndS(s! delete a column or some columns s:/manage_catalogSchema?manage_tabs_message=Column%20DeletedN( R<tnamesRR|Rt delColumnR R5R6R7(RR~R R5R7R|((R R}ws tmanage_addIndexcCs:|i||||o|o|i|dndS(s add an index s8/manage_catalogIndexes?manage_tabs_message=Index%20AddedN( RtaddIndexR|R3textraR R5R6R7(RR|R3RR R5R7((R Rstmanage_delIndexcCs|ptddddddSnt|to |f}nx|D]}|i|qHW|o|o|i |dndS( s! delete an index or some indexes RsNo items specifiedtmessagesNo items were specified!Rs./manage_catalogIndexess:/manage_catalogIndexes?manage_tabs_message=Index%20DeletedN( tidst MessageDialogR<RR|RtdelIndexR R5R6R7(RRR R5R7R|((R Rs  tmanage_clearIndexcCs|ptddddddSnt|to |f}nx|D]}|i|qHW|o|o|i |dndS( s clear an index or some indexes RsNo items specifiedRsNo items were specified!Rs./manage_catalogIndexess:/manage_catalogIndexes?manage_tabs_message=Index%20ClearedN( RRR<RR|Rt clearIndexR R5R6R7(RRR R5R7R|((R Rs  c Cst|to |f}n|iii}d}|o|i d|t |nx:|D]2}|d7}|o|i |n|i|}|djo|i||}n|djotid|qay&|i||d|ddd|Wqatj otd|iity |i||d|d|Wqtj o4td|iit|i||d|qXqaXqaW|o|indS( Nis reindexing %sis9reindexIndex could not resolve an object from the uid %r.tidxstupdate_metadataRGs-catalog_object interface of %s not up to date(R<R|RRR.tuidstkeysRUR\RGRYR1R^R]R>R?R RAR R`RaRBt TypeErrortwarnt __class__t__name__tDeprecationWarningRc(RR|R RGRUR?R^R\((R t reindexIndexs<     $tmanage_reindexIndexcCs|ptddddddSn|i}|djo t|pd }|i||||o|o|i |dnd S( s!Reindex indexe(s) from a ZCatalogRsNo items specifiedRsNo items were specified!Rs./manage_catalogIndexesisA/manage_catalogIndexes?manage_tabs_message=Reindexing%20PerformedN( RRRRLRMRNR RORR R5R6R7(RRR R5R7RORM((R Rs   tavailableSplitterscCsdkl}|iS(s splitter we can add (sSplitterN(t Products.PluginIndexes.TextIndextSplitterR(RR((R Rs RBicCsF|d joEy |i}Wntj otdqrXdi|}n!t|tptdn|i i ||d |d||id j otti}||ijo d|_n||_|id|_|i|ijoBtidt|iid|_|o|idq>qBnd S( s wrapper around catalog shA cataloged object must support the 'getPhysicalPath' method if no unique id is provided when catalogingRfs&The object unique id must be a string.Riit optimisticscommiting subtransactionN(tuidR R?RutAttributeErrort CatalogErrorRtR<RRR.t catalogObjectRRR,Rt transactiontgetttt_v_transactionR-t savepointtTruet_p_jartcacheGCRGtinfo(RR?RRRRGR((R RBs.        RDcCs|ii|dS(sWrapper around catalog N(RR.tuncatalogObjectR(RR((R RD6stuniqueValuesForcCs|ii|S(s0Return the unique values for a given FieldIndex N(RR.RR|(RR|((R R;stgetpathcCs|ii|S(sHReturn the path to a cataloged object given a 'data_record_id_' N(RR.RUtrid(RR((R R@scCs|iii||S(sJReturn 'data_record_id_' the to a cataloged object given a 'path' N(RR.RRRvtdefault(RRvR((R tgetridEst getobjectcCs|ii|i|S(s<Return a cataloged object given a 'data_record_id_' N(Rt aq_parenttunrestrictedTraverseRR(RRR ((R RKscCs |ii|}|ii|S(s;return the correct metadata given the uid, usually the pathN(RR.RRRtgetMetadataForRID(RRR((R tgetMetadataForUIDPscCs |ii|}|ii|S(sAreturn the current index contents given the uid, usually the pathN(RR.RRRtgetIndexDataForRID(RRR((R tgetIndexDataForUIDUscCs|iit|S(s7return the correct metadata for the cataloged record idN(RR.RR4R(RR((R RZscCs|ii|S(s6return the current index contents for the specific ridN(RR.RR(RR((R R^stschemacCs|iiiS(N(RR.RR(R((R RcstindexescCs|iiiS(N(RR.RR(R((R Rgst index_objectscCs|iiiS(N(RR.RRV(R((R RkstgetIndexObjectscCs7|ii}g}|iD]}|||q~S(N(RR.tgetIndext_[1]RR|(RRRR|((R Rqs cCs@h}hdd<}x$|iiiD]}|||@s c Cs|ii}|ii}d} g} g}x|iD]\}}d }|d djo|i |d|}n|d jo7|i ||}|d jo|i|q7qndi|i}||jo| i||fq7| d} q7Wx9| D]1\}}||}||=|||<|||RRRLRRRRR{R(((R RBs   o!           !-   / -                  3b  ( : %   cCsdti|tdS(Nt_t _Permission(tstringt translateR|t name_trans(R|((R RscCst|o |Sn|S(N(tcallabletattr(R6((R Rs RcBstZRS(N(RR(((R RsicCsK|\}}}}||||z|i|}Wd||SXdS(N( tedteRtpushtpopRRtevalR(RR7RRRR8R:R9((R RscCsB||dpdSn|djo|i|jp |i|jS(Nt_p_mtimeit<(tfnRtqR<R(RRR?R>((R Rsc Csg}|i}xt||ot||}t||jo2t ||t|do|i }qnPnt||jot ||Pn|djot |dPqnt|do|i }qnPqWx#|D]}||jodSqqWdS(NiRRRi(sManagers Anonymous(tprRR>R@Rt permissionRR^R3tlttmapRtttR RR( RRARRBRDR@R^RR>((R R s6          (DRtwarningsRRQRHRbR2tloggingtGlobalsR+RtInitializeClasst OFS.FoldertFoldertOFS.ObjectManagerRRt AcquisitiontImplicitt Persistencet PersistenttDocumentTemplate.DT_Utilt InstanceDictt TemplateDictRt AccessControlR"tAccessControl.PermissionR4tAccessControl.DTMLtRestrictedDTMLtAccessControl.PermissionsR%R&R'tZODB.POSExceptionR_Rt,Products.PluginIndexes.common.PluggableIndexRt!Products.PluginIndexes.interfacesRtzope.interfaceR RRRt IZCatalogR!RtProgressHandlerRNR.t getLoggerR`R,tmanage_addZCatalogFormR R RRRRRR@RR3R(,RNR`RRRR_R'RJRRRRQRRQRRHRMR!R2RRR"ROR+RbRRR4RRRR_RR RRRFR%R R.RHRR&RVR((R t?sN -