## $Id: helpers.py 10678 2013-10-31 17:58:50Z uli $ ## ## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## """General helper functions for Kofa. """ import unicodecsv as csv # XXX: csv ops should move to dedicated module. import datetime import imghdr import logging import os import pytz import re import shutil import tempfile import grok from cStringIO import StringIO from docutils.core import publish_string from zope.component import getUtility from zope.component.interfaces import IFactory from zope.interface import implementedBy from zope.interface.interface import Method, Attribute from zope.schema import getFieldNames from zope.schema.fieldproperty import FieldProperty from zope.security.interfaces import NoInteraction from zope.security.management import getInteraction from zope.pluggableauth.interfaces import IAuthenticatorPlugin BUFSIZE = 8 * 1024 def remove_file_or_directory(filepath): """Remove a file or directory. Different to :func:`shutil.rmtree` we also accept not existing paths (returning silently) and if a dir turns out to be a regular file, we remove that. """ filepath = os.path.abspath(filepath) if not os.path.exists(filepath): return if os.path.isdir(filepath): shutil.rmtree(filepath) else: os.unlink(filepath) return def copy_filesystem_tree(src, dst, overwrite=False, del_old=False): """Copy contents of directory src to directory dst. Both directories must exists. If `overwrite` is true, any same named objects will be overwritten. Otherwise these files will not be touched. If `del_old` is true, copied files and directories will be removed from the src directory. This functions returns a list of non-copied files. Unix hidden files and directories (starting with '.') are not processed by this function. """ if not os.path.exists(src): raise ValueError('source path does not exist: %s' % src) if not os.path.exists(dst): raise ValueError('destination path does not exist: %s' % dst) if not os.path.isdir(src): raise ValueError('source path is not a directory: %s' % src) if not os.path.isdir(dst): raise ValueError('destination path is not a directory: %s' % dst) not_copied = [] for item in os.listdir(src): if item.startswith('.'): continue # We do not copy hidden stuff... itemsrc = os.path.join(src, item) itemdst = os.path.join(dst, item) if os.path.exists(itemdst): if overwrite is True: remove_file_or_directory(itemdst) else: not_copied.append(item) continue if os.path.isdir(itemsrc): shutil.copytree(itemsrc, itemdst) else: shutil.copy2(itemsrc, itemdst) if del_old: remove_file_or_directory(itemsrc) return not_copied def get_inner_HTML_part(html_code): """Return the 'inner' part of a complete HTML snippet. If there is a form part, get this. If there is no form part, try to return the body part contents. If there is no body, return as-is. Let's see how that works. If we deliver some doc with form, we will get that form only: >>> doc = '
Outside the form' >>> get_inner_HTML_part(doc) '' No form? Then seek for a body part and get the contents: >>> doc = 'My BodyTrailing Trash' >>> get_inner_HTML_part(doc) 'My Body' If none of these is included, return what we got: >>> doc = 'without body nor form' >>> get_inner_HTML_part(doc) 'without body nor form' """ try: result = re.match('^.+().+$', html_code, re.DOTALL).groups()[0] return result except AttributeError: # No