#-----------------------------------------------------------------------------
# Name:        ZoaClient.py
# Purpose:     Nicer interface to Zope's Client.py. Also, the zoa installer
#
# Author:      Riaan Booysen
#
# Created:     2002
# RCS-ID:      $Id: ZoaClient.py,v 1.9 2007/07/02 15:01:17 riaan Exp $
# Copyright:   (c) 2002 - 2007
# Licence:     GPL
#-----------------------------------------------------------------------------
import os

import Client

class ZClient:
    def __init__(self, url, user, passwd, timeout=None, argnames=()):
        self.__url = url
        self.__user = user
        self.__passwd = passwd
        self.__timeout = timeout
        self.__argnames = argnames
    def __request(self, methodname, *args, **kwargs):
        msg, res = apply(Client.Function(self.__url+'/'+methodname,
                  username=self.__user, password=self.__passwd,
                  timeout=self.__timeout, arguments=self.__argnames),
                args, kwargs)
        return res
    def __getattr__(self, name):
        return _MethodDisp(self.__request, name)

class _MethodDisp:
    def __init__(self, request, name):
        self.__request = request
        self.__name = name
    def __getattr__(self, name):
        return _MethodDisp(self.__request, '%s/%s' % (self.__name, name))
    def __call__(self, *args, **kwargs):
        return apply(self.__request, (self.__name,) + args, kwargs)

def installZopeScript(conninfo, name, body):
    url, user, passwd = conninfo
    z = ZClient(url, user, passwd)
    try:
        z.manage_addProduct.PythonScripts.manage_addPythonScript(id=name, file=body)
    except Client.ServerError, error:
        if error.http_code != 302:
            raise

def installZopeFolder(conninfo, name):
    url, user, passwd = conninfo
    z = ZClient(url, user, passwd)
    z.manage_addFolder(id=name)

def installFromFS(conninfo, filepath):
    name = os.path.basename(filepath)
    installZopeFolder(conninfo, name)

    url, user, passwd = conninfo
    conninfo = url+'/'+name, user, passwd
    os.path.walk(filepath, installList, (filepath, conninfo) )

def installList(info, dirname, names):
    if os.path.basename(dirname) == 'CVS':
        return

    fsPath, (url, user, passwd) = info

    reldir = dirname[len(fsPath)+1:]
    if reldir:
        url = '/'.join([url] + reldir.split(os.sep))

    info = (url, user, passwd)
    for item in names:
        name, ext = os.path.splitext(item)
        if ext == '.py':
            installZopeScript(info, name, open(os.path.join(dirname, item)).read())
        else:
            if item != 'CVS' and os.path.isdir(os.path.join(dirname, item)):
                installZopeFolder(info, item)
