; zoCc@sjdZdkZdklZdklZdklZlZdk l Z dk l Z l Z dklZydklZWn ej odklZnXd klZd klZd klZd klZd klZlZlZdklZlZl Z l!Z!dk"Z"dk#l$Z$hZ%de eefdYZ&e'e'e'dZ(e(fZ)ee&dS(st ZSyncerTool a CMF tool that wraps and provides a UI for ZSyncer. Work in progress, may not actually do much yet! N(sClassSecurityInfo(saq_base(sInitializeClasssDTMLFile(s SimpleItem(s UniqueObjects getToolByName(sZSyncerObjNotFound(s ManagePortal(sActionProviderBase(sActionInformation(s Expression(sFolder(sZSyncersmanage_addZSyncersZSYNC_PERMISSION(sMISSINGsEXTRAsOKsOOD(s StringTypes ZSyncerToolcBsltZdZdZdZdZeieiZe Z e ddddde d d d e d d d e fdddeie ddddde d dd e d dd e fdddeie ddddde d dd e d dd e fdddeigZdZe idedZdZe ie deedZe ie ded Ze ie d!ed"Ze ie d#ed$Ze ie d%ed&Ze ie d'ed(Ze ie d)ed*Ze ie d+d,Ze ie d-ed.Ze ie d/ed0Z d1Z!d2Z"RS(3s A CMF tool that contains and provides a UI for a ZSyncer instance. XXX Example UI still in the early stages, it will go in skins/. sportal_zsyncersPortal ZSyncer ToolsDefaultsidszsyncer_fol_statusstitles Sync Statussactionstexts(string: ${folder_url}/zsyncer_folderviews conditionspython: folder is objects permissionsscategorysfoldersvisibleszsyncer_obj_statuss(string: ${object_url}/zsyncer_objectviewspython: not (folder is object)sobjects zsyncer_diffsDiffs"string: ${object_url}/zsyncer_diffs5python:portal.portal_zsyncer.isObjectDiffable(object)cCsSti|}g}x3|D]+}|dtijo|i|qqW|SdS(sTFilter meta types. Only ZSyncers can be added inside a ZSyncerTool. snameN( sFoldersfiltered_meta_typessselfstypesslstsZSyncers meta_typesappend(sselfslststypes((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysfiltered_meta_types\ss listActionscCs |iSdS(s)Return actions provided by tool. N(sselfs_actions(sselfsinfo((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pys listActionsiscOsV|i|ijo<t||idi|ii}|||i_ndS(s4Configuration after a ZSyncerTool is added. s/N( sselfs_default_zsyncers objectIdssmanage_addZSyncersjoins aq_parentsgetPhysicalPaths portal_pathsrelative_path_base(sselfsargsskwargss portal_path((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysmanage_afterAddns s getStatusc Cs|i|}y|i||\}}Wntj o nX|i |}|i |}gi }|D]"}||i |i |qp~}||f}|SdS(s)Is this object (and subs, if any) in or out of sync? Result is a tuple of (info, subs), where info (and each item in the subs list) is a dictionary with all the useful keys. Also includes anything else useful for UI, e.g. actions we might want to link to. N(sselfs getZSyncerssyncersmanage_comparespathsrecursesinfossubssZSyncerObjNotFounds _setDefaultss _setActionssappends_[1]sssresult( sselfspathssyncersrecursesinfossubssss_[1]sresult((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pys getStatus~s9 sgetDiffcCs |i|}|i|SdS(s*Show differences for this object. N(sselfs getZSyncerssyncersmanage_diffObjectsobj_path(sselfsobj_pathssyncer((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysgetDiffssobj_synccCs&|i|}|i|}|SdS(s3Sync object. Return a list of StatusMsgs. N(sselfs getZSyncerssyncersmanage_pushToRemotes obj_pathssmsgs(sselfs obj_pathsssyncersmsgs((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysdoPushssdoDeletecCs-|i|}g}|i|||SdS(s(Delete remote AND local object. N(sselfs getZSyncerssyncersmsgssmanage_syncDeletes obj_paths(sselfs obj_pathsssyncersmsgs((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysdoDeletes sgetDestinationscCs|i|}|iSdS(s4Get a list of destinations for this syncer. N(sselfs getZSyncerssyncers dest_servers(sselfssyncer((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysgetDestinationsssgetPathcCs6|i}|i|}|i|}|dSdS(sB Get a path to obj that the syncer can work with. s relative_pathN(sobjsgetPhysicalPathspathsselfs getZSyncerssyncers getPathInfos path_info(sselfsobjssyncerspaths path_info((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysgetPaths  sgetObjectFromPathcCs |i|}|i|SdS(sB Get a path to obj that the syncer can work with. N(sselfs getZSyncerssyncers _getObjectspath(sselfspathssyncer((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysgetObjectFromPathssisObjectDiffablecCsnt|}|i}|idt|dtodSn|idt|dtodSndSdS(s) Is the object diffable? s meta_types portal_typeiiN( saq_basesobjsbasesselfs getZSyncerssyncers is_diffablesgetattrsNone(sselfsobjssyncersbase((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pysisObjectDiffables  s getZSyncercCs`|tjp |i o |i}nt||t}|tjotd|n|SdS(s0get the specified (or default) zsyncer. sZSyncer %s is not foundN(snamesNonesstripsselfs_default_zsyncersgetattrsobjs ValueError(sselfsnamesobj((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pys getZSyncers  scallManyRemotecCs |i|}|i|SdS(sCall multiple remote methods and return a list of return values. methodlist should be a sequence of dictionaries with the following keys: 'path': path to the object on which to call the method. 'method_name': name of the method. 'args' (optional): list of positional arguments to pass. 'kwargs' (optional): dictionary of keyword arguments to pass. N(sselfs getZSyncerssyncerscallManyRemotes methodlist(sselfs methodlistssyncer((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pyscallManyRemotes cCsx|idd}|id||idd|id|ii||id|ii||SdS(NsstatussNot Found Anywhere!siconss status_icons status_color(sadictsgetsstatuss setdefaultsselfs getZSyncers status_icons status_colour(sselfsadictsstatus((s?/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/ZSyncerTool.pys _setDefaultss  cCsXhdt<dt<dt<dt<}||d