[Erp5-report] r7404 - in /erp5/trunk/products/ERP5Subversion: ./ Tool/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon May 22 16:24:33 CEST 2006


Author: chris
Date: Mon May 22 16:24:30 2006
New Revision: 7404

URL: http://svn.erp5.org?rev=7404&view=rev
Log:
- huge code cleanup

Modified:
    erp5/trunk/products/ERP5Subversion/SubversionClient.py
    erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py

Modified: erp5/trunk/products/ERP5Subversion/SubversionClient.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Subversion/SubversionClient.py?rev=7404&r1=7403&r2=7404&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Subversion/SubversionClient.py (original)
+++ erp5/trunk/products/ERP5Subversion/SubversionClient.py Mon May 22 16:24:30 2006
@@ -34,7 +34,6 @@
 from MethodObject import Method
 from Globals import InitializeClass
 from AccessControl import ClassSecurityInfo
-from Products.ERP5Type import Permissions
 from Products.PythonScripts.Utility import allow_class
 from tempfile import mktemp
 from Products.ERP5.Document.BusinessTemplate import removeAll
@@ -129,7 +128,8 @@
       # 0x8 means that the CA is unknown.
       return True, 0x8, permanent
 
-  # Wrap objects defined in pysvn so that skins have access to attributes in the ERP5 way.
+  # Wrap objects defined in pysvn so that skins
+  # have access to attributes in the ERP5 way.
   class Getter(Method):
     def __init__(self, key):
       self._key = key
@@ -164,15 +164,18 @@
   class Status(ObjectWrapper):
     # XXX Big Hack to fix a bug
     __allow_access_to_unprotected_subobjects__ = 1
-    attribute_list = ('path', 'entry', 'is_versioned', 'is_locked', 'is_copied', 'is_switched', 'prop_status', 'text_status', 'repos_prop_status', 'repos_text_status')
+    attribute_list = ('path', 'entry', 'is_versioned', 'is_locked', \
+    'is_copied', 'is_switched', 'prop_status', 'text_status', \
+    'repos_prop_status', 'repos_text_status')
   initializeAccessors(Status)
   
   class Entry(ObjectWrapper):
-    attribute_list = ('checksum', 'commit_author', 'commit_revision', 'commit_time',
-                      'conflict_new', 'conflict_old', 'conflict_work', 'copy_from_revision',
-                      'copy_from_url', 'is_absent', 'is_copied', 'is_deleted', 'is_valid',
-                      'kind', 'name', 'properties_time', 'property_reject_file', 'repos',
-                      'revision', 'schedule', 'text_time', 'url', 'uuid')
+    attribute_list = ('checksum', 'commit_author', 'commit_revision', \
+    'commit_time', 'conflict_new', 'conflict_old', 'conflict_work', \
+    'copy_from_revision', 'copy_from_url', 'is_absent', 'is_copied', \
+    'is_deleted', 'is_valid', 'kind', 'name', 'properties_time', \
+    'property_reject_file', 'repos', 'revision', 'schedule', \
+    'text_time', 'url', 'uuid')
 
   class Revision(ObjectWrapper):
     attribute_list = ('kind', 'date', 'number')
@@ -193,9 +196,10 @@
       self.client.callback_get_log_message = GetLogMessageCallback(obj)
       self.client.callback_get_login = GetLoginCallback(obj)
       self.client.callback_notify = NotifyCallback(obj)
-      self.client.callback_ssl_server_trust_prompt = SSLServerTrustPromptCallback(obj)
+      self.client.callback_ssl_server_trust_prompt = \
+      SSLServerTrustPromptCallback(obj)
       self.creation_time = time.time()
-      self.__dict__.update(kw)
+      self.__dict__.update(**kw)
       self.exception = None
 
     def getLogMessage(self):
@@ -218,7 +222,8 @@
     
     def checkin(self, path, log_message, recurse):
       try:
-        return self.client.checkin(path, log_message=log_message or 'none', recurse=recurse)
+        return self.client.checkin(path, log_message=log_message \
+        or 'none', recurse=recurse)
       except pysvn.ClientError, error:
         excep = self.getException()
         if excep:
@@ -237,17 +242,19 @@
           raise error
         
     def status(self, path, **kw):
-      # Since plain Python classes are not convenient in Zope, convert the objects.
+      # Since plain Python classes are not convenient in 
+      # Zope, convert the objects.
       status_list = [Status(x) for x in self.client.status(path, **kw)]
-      # XXX: seems that pysvn return a list that is upside-down, we reverse it...
+      # XXX: seems that pysvn return a list that is 
+      # upside-down, we reverse it...
       status_list.reverse()
       return status_list
     
-    def removeAllInList(self, list):
+    def removeAllInList(self, path_list):
       """Remove all files and folders in list
       """
-      for file in list:
-        removeAll(file)
+      for file_path in path_list:
+        removeAll(file_path)
       
     def diff(self, path, revision1, revision2):
       tmp = mktemp()
@@ -255,9 +262,12 @@
       if not revision1 or not revision2:
         diff = self.client.diff(tmp_path=tmp, url_or_path=path, recurse=False)
       else:
-        diff = self.client.diff(tmp_path=tmp, url_or_path=path, recurse=False, revision1=pysvn.Revision(pysvn.opt_revision_kind.number,revision1), revision2=pysvn.Revision(pysvn.opt_revision_kind.number,revision2))
+        diff = self.client.diff(tmp_path=tmp, url_or_path=path, \
+        recurse=False, revision1 = pysvn.Revision(pysvn.opt_revision_kind\
+        .number,revision1), revision2=pysvn.Revision(pysvn\
+        .opt_revision_kind.number,revision2))
       # clean up temp dir
-      self.activate().removeAllInList([tmp,])
+      self.activate().removeAllInList([tmp, ])
       return diff
     
     def revert(self, path, recurse=False):
@@ -299,8 +309,10 @@
         else:
           raise error
       # transform entry to dict to make it more usable in zope
-      members_tuple=('url', 'uuid', 'revision', 'kind', 'commit_author', 'commit_revision', 'commit_time',)
-      entry_dict = dict([(member,getattr(entry,member)) for member in members_tuple])
+      members_tuple = ('url', 'uuid', 'revision', 'kind', \
+      'commit_author', 'commit_revision', 'commit_time',)
+      entry_dict = dict([(member, getattr(entry, member)) \
+      for member in members_tuple])
       entry_dict['revision'] = entry_dict['revision'].number
       entry_dict['commit_revision'] = entry_dict['commit_revision'].number
       entry_dict['commit_time'] = time.ctime(entry_dict['commit_time'])
@@ -318,9 +330,9 @@
         else:
           raise error
        #Modify the list to make it more usable in zope
-      for dict in dict_list:
-        dict['created_rev']=dict['created_rev'].number
-        dict['time']=time.ctime(dict['time'])
+      for dictionary in dict_list:
+        dictionary['created_rev'] = dictionary['created_rev'].number
+        dictionary['time'] = time.ctime(dictionary['time'])
       return dict_list
 
     def cleanup(self, path):

Modified: erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py?rev=7404&r1=7403&r2=7404&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py (original)
+++ erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py Mon May 22 16:24:30 2006
@@ -35,7 +35,7 @@
 from Products.ERP5Type import Permissions
 from Products.ERP5Subversion import _dtmldir
 from Products.ERP5Subversion.SubversionClient import newSubversionClient
-import os, re, commands, time, exceptions
+import os, re, commands, time, exceptions, pysvn
 from DateTime import DateTime
 from cPickle import dumps, loads
 from App.config import getConfiguration
@@ -45,7 +45,8 @@
 from tempfile import mktemp
 from shutil import copy
 from Products.CMFCore.utils import getToolByName
-from Products.ERP5.Document.BusinessTemplate import removeAll, TemplateConditionError
+from Products.ERP5.Document.BusinessTemplate import removeAll
+from Products.ERP5.Document.BusinessTemplate import TemplateConditionError
 from xml.sax.saxutils import escape
 from dircache import listdir
 from OFS.Traversable import NotFound
@@ -60,8 +61,13 @@
   set
 except NameError:
   from sets import Set as set
-  
+
+NBSP = ' '
+NBSP_TAB = NBSP*8
+
 class File(object):
+  """ Class that represents a file in memory
+  """
   __slots__ = ('status','name')
   # Constructor
   def __init__(self, name, status) :
@@ -70,7 +76,9 @@
 ## End of File Class
 
 class Dir(object):
-  __slots__ = ('status','name','sub_dirs','sub_files')
+  """ Class that reprensents a folder in memory
+  """
+  __slots__ = ('status', 'name', 'sub_dirs', 'sub_files')
   # Constructor
   def __init__(self, name, status) :
     self.status = status
@@ -78,32 +86,40 @@
     self.sub_dirs = [] # list of sub directories
     self.sub_files = [] # list of sub files
 
-  # return a list of sub directories' names
   def getSubDirsNameList(self) :
+    """ return a list of sub directories' names
+    """
     return [d.name for d in self.sub_dirs]
 
-  # return directory in subdirs given its name
   def getDirFromName(self, name):
-    for d in self.sub_dirs:
-      if d.name == name:
-        return d
+    """ return directory in subdirs given its name
+    """
+    for directory in self.sub_dirs:
+      if directory.name == name:
+        return directory
       
   def getObjectFromName(self, name):
-    for d in self.sub_dirs:
-      if d.name == name:
-        return d
-    for f in self.sub_files:
-      if f.name == name:
-        return f
+    """ return dir object given its name
+    """
+    for directory in self.sub_dirs:
+      if directory.name == name:
+        return directory
+    for sub_file in self.sub_files:
+      if sub_file.name == name:
+        return sub_file
       
   def getContent(self):
+    """ return content for directory
+    """
     content = self.sub_dirs
     content.extend(self.sub_files)
     return content
 ## End of Dir Class
 
 class Error(exceptions.EnvironmentError):
-    pass
+  """ Simple Exception
+  """
+  pass
 
 class SubversionPreferencesError(Exception):
   """The base exception class for the Subversion preferences.
@@ -121,37 +137,37 @@
   pass
       
 def copytree(src, dst, symlinks=False):
-    """Recursively copy a directory tree using copy().
-
-    If exception(s) occur, an Error is raised with a list of reasons.
-    dst dir must exist
-
-    If the optional symlinks flag is true, symbolic links in the
-    source tree result in symbolic links in the destination tree; if
-    it is false, the contents of the files pointed to by symbolic
-    links are copied.
-    
-    Copyright (c) 2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved
-    """
-    names = listdir(src)
-    errors = []
-    for name in names:
-        srcname = os.path.join(src, name)
-        dstname = os.path.join(dst, name)
-        try:
-            if symlinks and os.path.islink(srcname):
-                linkto = os.readlink(srcname)
-                os.symlink(linkto, dstname)
-            elif os.path.isdir(srcname):
-                if not os.path.exists(dstname):
-                  os.makedirs(dstname)
-                copytree(srcname, dstname, symlinks)
-            else:
-                copy(srcname, dstname)
-        except (IOError, os.error), why:
-            errors.append((srcname, dstname, 'Error: ' + str(why.strerror)))
-    if errors:
-        raise Error, errors
+  """Recursively copy a directory tree using copy().
+
+  If exception(s) occur, an Error is raised with a list of reasons.
+  dst dir must exist
+
+  If the optional symlinks flag is true, symbolic links in the
+  source tree result in symbolic links in the destination tree; if
+  it is false, the contents of the files pointed to by symbolic
+  links are copied.
+  
+  Copyright (c) 2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved
+  """
+  names = listdir(src)
+  errors = []
+  for name in names:
+    srcname = os.path.join(src, name)
+    dstname = os.path.join(dst, name)
+    try:
+      if symlinks and os.path.islink(srcname):
+        linkto = os.readlink(srcname)
+        os.symlink(linkto, dstname)
+      elif os.path.isdir(srcname):
+        if not os.path.exists(dstname):
+          os.makedirs(dstname)
+        copytree(srcname, dstname, symlinks)
+      else:
+        copy(srcname, dstname)
+    except (IOError, os.error), why:
+      errors.append((srcname, dstname, 'Error: ' + str(why.strerror)))
+  if errors:
+    raise Error, errors
     
 def cacheWalk(top, topdown=True, onerror=None):
   """Directory tree generator.
@@ -162,30 +178,30 @@
   Copyright (c) 2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved
   """
   try:
-      # Note that listdir and error are globals in this module due
-      # to earlier import-*.
-      names = listdir(top)
-  except error, err:
-      if onerror is not None:
-          onerror(err)
-      return
+    # Note that listdir and error are globals in this module due
+    # to earlier import-*.
+    names = listdir(top)
+  except os.error, err:
+    if onerror is not None:
+      onerror(err)
+    return
 
   dirs, nondirs = [], []
   for name in names:
-      if os.path.isdir(os.path.join(top, name)):
-          dirs.append(name)
-      else:
-          nondirs.append(name)
+    if os.path.isdir(os.path.join(top, name)):
+      dirs.append(name)
+    else:
+      nondirs.append(name)
 
   if topdown:
-      yield top, dirs, nondirs
+    yield top, dirs, nondirs
   for name in dirs:
-      path = os.path.join(top, name)
-      if not os.path.islink(path):
-          for x in cacheWalk(path, topdown, onerror):
-            yield x
+    path = os.path.join(top, name)
+    if not os.path.islink(path):
+      for elem in cacheWalk(path, topdown, onerror):
+        yield elem
   if not topdown:
-      yield top, dirs, nondirs
+    yield top, dirs, nondirs
 
     
 def colorizeTag(tag):
@@ -208,41 +224,43 @@
   elif 'key' in text:
     color = '#0C4F0C'#dark green
   else:
-    color='blue'
-  return "<font color='%s'>%s</font>"%(color,text,)
+    color = 'blue'
+  return "<font color='%s'>%s</font>" % (color, text, )
     
 def colorize(text):
   """Return HTML Code with syntax hightlighting
   """
   # Escape xml before adding html tags
   html = escape(text)
-  html = html.replace(' ', '&nbsp;&nbsp;')
-  html = html.replace('\t', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
+  html = html.replace(' ', NBSP)
+  html = html.replace('\t', NBSP_TAB)
   # Colorize comments
-  p = re.compile(r'#.*')
-  html = p.sub(colorizeTag, html)
+  pattern = re.compile(r'#.*')
+  html = pattern.sub(colorizeTag, html)
   # Colorize tags
-  p = re.compile(r'&lt;.*?&gt;')
-  html = p.sub(colorizeTag, html)
+  pattern = re.compile(r'&lt;.*?&gt;')
+  html = pattern.sub(colorizeTag, html)
   # Colorize strings
-  p = re.compile(r'\".*?\"')
-  html = p.sub(colorizeTag, html)
+  pattern = re.compile(r'\".*?\"')
+  html = pattern.sub(colorizeTag, html)
   html = html.replace(os.linesep, os.linesep+"<br>")
   return html
 
 class DiffFile:
+  """
   # Members :
-  # - path : path of the modified file
-  # - children : sub codes modified
-  # - old_revision
-  # - new_revision
+   - path : path of the modified file
+   - children : sub codes modified
+   - old_revision
+   - new_revision
+  """
 
   def __init__(self, raw_diff):
     if '@@' not in raw_diff:
-      self.binary=True
+      self.binary = True
       return
     else:
-      self.binary=False
+      self.binary = False
     self.header = raw_diff.split('@@')[0][:-1]
     # Getting file path in header
     self.path = self.header.split('====')[0][:-1].strip()
@@ -264,63 +282,74 @@
       if line:
         if line.startswith('@@') and not first:
           self.children.append(CodeBlock(os.linesep.join(tmp)))
-          tmp = [line,]
+          tmp = [line, ]
         else:
           first = False
           tmp.append(line)
     self.children.append(CodeBlock(os.linesep.join(tmp)))
     
   def toHTML(self):
+    """ return HTML diff
+    """
     # Adding header of the table
     if self.binary:
       return '<b>Folder or binary file or just no changes!</b><br><br><br>'
     
-    html = '''
+    html_list = []
+    html_list.append('''
     <table style="text-align: left; width: 100%%;" border="0" cellpadding="0" cellspacing="0">
   <tbody>
     <tr height="18px">
       <td style="background-color: grey"><b><center>%s</center></b></td>
       <td style="background-color: black;" width="2"></td>
       <td style="background-color: grey"><b><center>%s</center></b></td>
-    </tr>'''%(self.old_revision, self.new_revision)
+    </tr>''' % (self.old_revision, self.new_revision))
     header_color = 'grey'
+    child_html_text = '''<tr height="18px"><td style="background-color: %s">
+    &nbsp;</td><td style="background-color: black;" width="2"></td>
+    <td style="background-color: %s">&nbsp;</td></tr><tr height="18px">
+    <td style="background-color: rgb(68, 132, 255);"><b>Line %%s</b></td>
+    <td style="background-color: black;" width="2"></td>
+    <td style="background-color: rgb(68, 132, 255);"><b>Line %%s</b></td>
+    </tr>''' % (header_color, header_color)
     for child in self.children:
       # Adding line number of the modification
-      html += '''<tr height="18px"><td style="background-color: %s">&nbsp;</td><td style="background-color: black;" width="2"></td><td style="background-color: %s">&nbsp;</td></tr>    <tr height="18px">
-      <td style="background-color: rgb(68, 132, 255);"><b>Line %s</b></td>
-      <td style="background-color: black;" width="2"></td>
-      <td style="background-color: rgb(68, 132, 255);"><b>Line %s</b></td>
-      </tr>'''%(header_color, header_color, child.old_line, child.new_line)
+      html_list.append( child_html_text % (child.old_line, child.new_line) )
       header_color = 'white'
       # Adding diff of the modification
       old_code_list = child.getOldCodeList()
       new_code_list = child.getNewCodeList()
-      i=0
+      i = 0
       for old_line_tuple in old_code_list:
         new_line_tuple = new_code_list[i]
         new_line = new_line_tuple[0] or ' '
         old_line = old_line_tuple[0] or ' '
-        i+=1
-        html += '''    <tr height="18px">
+        i += 1
+        html_list.append( '''<tr height="18px">
         <td style="background-color: %s">%s</td>
         <td style="background-color: black;" width="2"></td>
         <td style="background-color: %s">%s</td>
-        </tr>'''%(old_line_tuple[1], escape(old_line).replace(' ', '&nbsp;').replace('\t', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'), new_line_tuple[1], escape(new_line).replace(' ', '&nbsp;').replace('\t', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'))
-    html += '''  </tbody>
-</table><br><br>'''
-    return html
+        </tr>'''%(old_line_tuple[1],
+        escape(old_line).replace(' ', NBSP).replace('\t', NBSP_TAB),
+        new_line_tuple[1],
+        escape(new_line).replace(' ', NBSP).replace('\t', NBSP_TAB))
+        )
+    html_list.append('''  </tbody></table><br/><br/>''')
+    return '\n'.join(html_list)
       
 
-# A code block contains several SubCodeBlocks
 class CodeBlock:
-  # Members :
-  # - old_line : line in old code (before modif)
-  # - new line : line in new code (after modif)
-  #
-  # Methods :
-  # - getOldCodeList() : return code before modif
-  # - getNewCodeList() : return code after modif
-  # Note: the code returned is a list of tuples (code line, background color)
+  """
+   A code block contains several SubCodeBlocks
+   Members :
+   - old_line : line in old code (before modif)
+   - new line : line in new code (after modif)
+  
+   Methods :
+   - getOldCodeList() : return code before modif
+   - getNewCodeList() : return code after modif
+   Note: the code returned is a list of tuples (code line, background color)
+  """
 
   def __init__(self, raw_diff):
     # Splitting body and header
@@ -334,7 +363,7 @@
     # Splitting modifications in SubCodeBlocks
     in_modif = False
     self.children = []
-    tmp=[]
+    tmp = []
     for line in self.body.split(os.linesep):
       if line:
         if (line.startswith('+') or line.startswith('-')):
@@ -342,33 +371,36 @@
             tmp.append(line)
           else:
             self.children.append(SubCodeBlock(os.linesep.join(tmp)))
-            tmp = [line,]
+            tmp = [line, ]
             in_modif = True
         else:
-            if in_modif:
-              self.children.append(SubCodeBlock(os.linesep.join(tmp)))
-              tmp = [line,]
-              in_modif = False
-            else:
-              tmp.append(line)
+          if in_modif:
+            self.children.append(SubCodeBlock(os.linesep.join(tmp)))
+            tmp = [line, ]
+            in_modif = False
+          else:
+            tmp.append(line)
     self.children.append(SubCodeBlock(os.linesep.join(tmp)))
     
-  # Return code before modification
   def getOldCodeList(self):
+    """ Return code before modification
+    """
     tmp = []
     for child in self.children:
       tmp.extend(child.getOldCodeList())
     return tmp
     
-  # Return code after modification
   def getNewCodeList(self):
+    """ Return code after modification
+    """
     tmp = []
     for child in self.children:
       tmp.extend(child.getNewCodeList())
     return tmp
     
-# a SubCodeBlock contain 0 or 1 modification (not more)
 class SubCodeBlock:
+  """ a SubCodeBlock contain 0 or 1 modification (not more)
+  """
   def __init__(self, code):
     self.body = code
     self.modification = self._getModif()
@@ -385,75 +417,92 @@
       self.color = 'rgb(83, 253, 74);'#light green
     
   def _getModif(self):
+    """ Return type of modification :
+        addition, deletion, none
+    """
     nb_plus = 0
     nb_minus = 0
     for line in self.body.split(os.linesep):
       if line.startswith("-"):
-        nb_minus-=1
+        nb_minus -= 1
       elif line.startswith("+"):
-        nb_plus+=1
-    if (nb_plus==0 and nb_minus==0):
+        nb_plus += 1
+    if (nb_plus == 0 and nb_minus == 0):
       return 'none'
-    if (nb_minus==0):
+    if (nb_minus == 0):
       return 'addition'
-    if (nb_plus==0):
+    if (nb_plus == 0):
       return 'deletion'
     return 'change'
       
   def _getOldCodeLength(self):
+    """ Private function to return old code length
+    """
     nb_lines = 0
     for line in self.body.split(os.linesep):
       if not line.startswith("+"):
-        nb_lines+=1
+        nb_lines += 1
     return nb_lines
       
   def _getNewCodeLength(self):
+    """ Private function to return new code length
+    """
     nb_lines = 0
     for line in self.body.split(os.linesep):
       if not line.startswith("-"):
-        nb_lines+=1
+        nb_lines += 1
     return nb_lines
   
-  # Return code before modification
   def getOldCodeList(self):
-    if self.modification=='none':
+    """ Return code before modification
+    """
+    if self.modification == 'none':
       old_code = [(x, 'white') for x in self.body.split(os.linesep)]
-    elif self.modification=='change':
-      old_code = [self._getOldCodeList(x) for x in self.body.split(os.linesep) if self._getOldCodeList(x)[0]]
+    elif self.modification == 'change':
+      old_code = [self._getOldCodeList(x) for x in self.body.split(os.linesep) \
+      if self._getOldCodeList(x)[0]]
       # we want old_code_list and new_code_list to have the same length
       if(self.old_code_length < self.new_code_length):
-        filling = [(None, self.color)]*(self.new_code_length-self.old_code_length)
+        filling = [(None, self.color)] * (self.new_code_length - \
+        self.old_code_length)
         old_code.extend(filling)
     else: # deletion or addition
       old_code = [self._getOldCodeList(x) for x in self.body.split(os.linesep)]
     return old_code
   
   def _getOldCodeList(self, line):
+    """ Private function to return code before modification
+    """
     if line.startswith('+'):
       return (None, self.color)
     if line.startswith('-'):
-      return (' '+line[1:], self.color)
+      return (' ' + line[1:], self.color)
     return (line, self.color)
   
-  # Return code after modification
   def getNewCodeList(self):
-    if self.modification=='none':
+    """ Return code after modification
+    """
+    if self.modification == 'none':
       new_code = [(x, 'white') for x in self.body.split(os.linesep)]
-    elif self.modification=='change':
-      new_code = [self._getNewCodeList(x) for x in self.body.split(os.linesep) if self._getNewCodeList(x)[0]]
+    elif self.modification == 'change':
+      new_code = [self._getNewCodeList(x) for x in self.body.split(os.linesep) \
+      if self._getNewCodeList(x)[0]]
       # we want old_code_list and new_code_list to have the same length
       if(self.new_code_length < self.old_code_length):
-        filling = [(None, self.color)]*(self.old_code_length-self.new_code_length)
+        filling = [(None, self.color)] * (self.old_code_length - \
+        self.new_code_length)
         new_code.extend(filling)
     else: # deletion or addition
       new_code = [self._getNewCodeList(x) for x in self.body.split(os.linesep)]
     return new_code
   
   def _getNewCodeList(self, line):
+    """ Private function to return code after modification
+    """
     if line.startswith('-'):
       return (None, self.color)
     if line.startswith('+'):
-      return (' '+line[1:], self.color)
+      return (' ' + line[1:], self.color)
     return (line, self.color)
   
 class SubversionTool(BaseTool, UniqueObject, Folder):
@@ -488,33 +537,36 @@
 
   # Filter content (ZMI))
   def __init__(self):
-      return Folder.__init__(self, SubversionTool.id)
-
-  # Filter content (ZMI))
+    return Folder.__init__(self, SubversionTool.id)
+
+
   def filtered_meta_types(self, user=None):
-      # Filters the list of available meta types.
-      all = SubversionTool.inheritedAttribute('filtered_meta_types')(self)
-      meta_types = []
-      for meta_type in self.all_meta_types():
-          if meta_type['name'] in self.allowed_types:
-              meta_types.append(meta_type)
-      return meta_types
+    """
+     Filter content (ZMI))
+     Filters the list of available meta types.
+    """
+    all = SubversionTool.inheritedAttribute('filtered_meta_types')(self)
+    meta_types = []
+    for meta_type in self.all_meta_types():
+      if meta_type['name'] in self.allowed_types:
+        meta_types.append(meta_type)
+    return meta_types
     
   # path is the path in svn working copy
   # return edit_path in zodb to edit it
   # return '#' if no zodb path is found
-  def editPath(self, bt, path):
+  def editPath(self, business_template, path):
     """Return path to edit file
        path can be relative or absolute
     """
-    path = self.relativeToAbsolute(path, bt).replace('\\', '/')
+    path = self.relativeToAbsolute(path, business_template).replace('\\', '/')
     if 'bt' in path.split('/'):
       # not in zodb
       return '#'
     # if file have been deleted then not in zodb
     if not os.path.exists(path):
       return '#'
-    svn_path = self.getSubversionPath(bt).replace('\\', '/')
+    svn_path = self.getSubversionPath(business_template).replace('\\', '/')
     edit_path = path.replace(svn_path, '').strip()
     if edit_path == '':
       # not in zodb 
@@ -528,20 +580,25 @@
     # remove file extension
     edit_path = os.path.splitext(edit_path)[0]
     # Add beginning and end of url
-    edit_path = os.path.join(bt.REQUEST["BASE2"], edit_path, 'manage_main')
+    edit_path = os.path.join(business_template.REQUEST["BASE2"], \
+    edit_path, 'manage_main')
     return edit_path
     
   def _encodeLogin(self, realm, user, password):
-    # Encode login information.
+    """ Encode login information.
+    """
     return b64encode(dumps((realm, user, password)))
 
   def _decodeLogin(self, login):
-    # Decode login information.
+    """ Decode login information.
+    """
     return loads(b64decode(login))
   
-  def goToWorkingCopy(self, bt):
-      working_path = self.getSubversionPath(bt)
-      os.chdir(working_path)
+  def goToWorkingCopy(self, business_template):
+    """ Change to business template directory
+    """
+    working_path = self.getSubversionPath(business_template)
+    os.chdir(working_path)
     
   def setLogin(self, realm, user, password):
     """Set login information.
@@ -560,7 +617,8 @@
     value = ','.join(login_list)
     expires = (DateTime() + 1).toZone('GMT').rfc822()
     request.set(self.login_cookie_name, value)
-    response.setCookie(self.login_cookie_name, value, path = '/', expires = expires)
+    response.setCookie(self.login_cookie_name, value, path = '/', \
+    expires = expires)
 
   def _getLogin(self, target_realm):
     request = self.REQUEST
@@ -572,12 +630,14 @@
           return user, password
     return None, None
       
-  def getHeader(self, bt, file):
-    file = self.relativeToAbsolute(file, bt)
-    header = "<b><a href='BusinessTemplate_viewSvnShowFile?file="+file+"'>" + file + "</a></b>"
-    edit_path = self.editPath(bt, file)
+  def getHeader(self, business_template, file_path):
+    file_path = self.relativeToAbsolute(file_path, business_template)
+    header = "<b><a href='BusinessTemplate_viewSvnShowFile?file=" + \
+    file_path + "'>" + file_path + "</a></b>"
+    edit_path = self.editPath(business_template, file_path)
     if edit_path != '#':
-      header += "&nbsp;&nbsp;<a href='"+self.editPath(bt, file)+"'><img src='imgs/edit.png' border='0'></a>"
+      header += "&nbsp;&nbsp;<a href='"+self.editPath(business_template, \
+      file_path) + "'><img src='imgs/edit.png' border='0'></a>"
     return header
 
   def _encodeSSLTrust(self, trust_dict, permanent=False):
@@ -595,41 +655,49 @@
   def getPreferredUsername(self):
     """return username in preferences if set of the current username
     """
-    username = self.getPortalObject().portal_preferences.getPreferredSubversionUserName()
+    username = self.getPortalObject().portal_preferences\
+    .getPreferredSubversionUserName()
     if username is None or username.strip() == "":
       # not set in preferences, then we get the current username in zope
       username = self.portal_membership.getAuthenticatedMember().getUserName()
     return username
   
-  def diffHTML(self, file_path, bt, revision1=None, revision2=None):
-    raw_diff = self.diff(file_path, bt, revision1, revision2)
+  def diffHTML(self, file_path, business_template, revision1=None, \
+  revision2=None):
+    """ Return HTML diff
+    """
+    raw_diff = self.diff(file_path, business_template, revision1, revision2)
     return DiffFile(raw_diff).toHTML()
   
-  # Display a file content in HTML with syntax highlighting
-  def fileHTML(self, bt, file_path):
-    file_path = self.relativeToAbsolute(file_path, bt)
-    file = open(file_path, 'r')
+  def fileHTML(self, business_template, file_path):
+    """ Display a file content in HTML with syntax highlighting
+    """
+    file_path = self.relativeToAbsolute(file_path, business_template)
+    input_file = open(file_path, 'r')
     if os.path.exists(file_path):
       if os.path.isdir(file_path):
         text = "<b>"+file_path+"</b><hr>"
         text += file_path +" is a folder!"
       else:
-        head = "<b>"+file_path+"</b>  <a href='"+self.editPath(bt, file_path)+"'><img src='imgs/edit.png' border='0'></a><hr>"
-        text = head + colorize(file.read())
+        head = "<b>"+file_path+"</b>  <a href='" + \
+        self.editPath(business_template, file_path) + \
+        "'><img src='imgs/edit.png' border='0'></a><hr>"
+        text = head + colorize(input_file.read())
     else:
       # see if tmp file is here (svn deleted file)
-      if file_path[-1]==os.sep:
-        file_path=file_path[:-1]
+      if file_path[-1] == os.sep:
+        file_path = file_path[:-1]
       filename = file_path.split(os.sep)[-1]
       tmp_path = os.sep.join(file_path.split(os.sep)[:-1])
-      tmp_path = os.path.join(tmp_path,'.svn','text-base',filename+'.svn-base')
+      tmp_path = os.path.join(tmp_path, '.svn', 'text-base', \
+      filename+'.svn-base')
       if os.path.exists(tmp_path):
         head = "<b>"+tmp_path+"</b> (svn temporary file)<hr>"
-        text = head + colorize(file.read())
+        text = head + colorize(input_file.read())
       else : # does not exist
         text = "<b>"+file_path+"</b><hr>"
         text += file_path +" does not exist!"
-    file.close()
+    input_file.close()
     return text
       
   security.declareProtected(Permissions.ManagePortal, 'acceptSSLServer')
@@ -648,9 +716,12 @@
     value = ','.join(trust_list)
     expires = (DateTime() + 1).toZone('GMT').rfc822()
     request.set(self.ssl_trust_cookie_name, value)
-    response.setCookie(self.ssl_trust_cookie_name, value, path = '/', expires = expires)
+    response.setCookie(self.ssl_trust_cookie_name, value, path = '/', \
+    expires = expires)
     
   def acceptSSLPerm(self, trust_dict):
+    """ Accept SSL server permanently
+    """
     self.acceptSSLServer(self, trust_dict, True)
 
   def _trustSSLServer(self, target_trust_dict):
@@ -671,71 +742,78 @@
     return newSubversionClient(self, **kw)
   
   security.declareProtected('Import/Export objects', 'getSubversionPath')
-  # with_name : with business template name at the end of the path
-  def getSubversionPath(self, bt, with_name=True):
-    # return the working copy path corresponding to
-    # the given business template browsing
-    # working copy list in preferences (looking
-    # only at first level of directories)
-    wc_list = self.getPortalObject().portal_preferences.getPreferredSubversionWorkingCopyList()
+  def getSubversionPath(self, business_template, with_name=True):
+    """
+     return the working copy path corresponding to
+     the given business template browsing
+     working copy list in preferences (looking
+     only at first level of directories)
+     
+     with_name : with business template name at the end of the path
+    """
+    wc_list = self.getPortalObject().portal_preferences\
+    .getPreferredSubversionWorkingCopyList()
     if not wc_list:
-      wc_list = self.getPortalObject().portal_preferences.default_site_preference.getPreferredSubversionWorkingCopyList()
+      wc_list = self.getPortalObject().portal_preferences.\
+      default_site_preference.getPreferredSubversionWorkingCopyList()
       if not wc_list:
-        raise SubversionPreferencesError, 'Please set at least one Subversion Working Copy in preferences first.'
+        raise SubversionPreferencesError, \
+        'Please set at least one Subversion Working Copy in preferences first.'
     if len(wc_list) == 0 :
-      raise SubversionPreferencesError, 'Please set at least one Subversion Working Copy in preferences first.'
-    bt_name = bt.getTitle()
-    for wc in wc_list:
-      wc = self._getWorkingPath(wc)
-      if not os.path.exists(os.path.join(wc, '.svn')):
-        raise SubversionNotAWorkingCopyError, "You must check out working copies in this directory: "+wc+" or choose another path in portal preferences."
-      if bt_name in listdir(wc) :
-        wc_path = os.path.join(wc, bt_name)
+      raise SubversionPreferencesError, \
+      'Please set at least one Subversion Working Copy in preferences first.'
+    bt_name = business_template.getTitle()
+    for working_copy in wc_list:
+      working_copy = self._getWorkingPath(working_copy)
+      if not os.path.exists(os.path.join(working_copy, '.svn')):
+        raise SubversionNotAWorkingCopyError, \
+        "You must check out working copies in this directory: " + \
+        working_copy + " or choose another path in portal preferences."
+      if bt_name in listdir(working_copy) :
+        wc_path = os.path.join(working_copy, bt_name)
         if os.path.isdir(wc_path):
           if with_name:
             return wc_path
           else:
             return os.sep.join(wc_path.split(os.sep)[:-1])
-    raise SubversionUnknownBusinessTemplateError, "Could not find '"+bt_name+"' at first level of working copies."
-    
-  def getTopWorkingPath(self):
-    return self.top_working_path
+    raise SubversionUnknownBusinessTemplateError, "Could not find '"+\
+    bt_name+"' at first level of working copies."
 
   def _getWorkingPath(self, path):
-    #if path[0] != '/':
-    #  path = os.path.join(self.top_working_path, path)
-    #path = os.path.abspath(path)
+    """ Check if the given path is reachable (allowed)
+    """
     if not path.startswith(self.top_working_path):
       raise Unauthorized, 'unauthorized access to path %s' % path
     return path
     
   security.declareProtected('Import/Export objects', 'update')
-  def update(self, bt):
+  def update(self, business_template):
     """Update a working copy.
     """
-    path = self._getWorkingPath(self.getSubversionPath(bt))
-    client = self._getClient()
-    # Revert local changes in working copy first to import a "pure" BT after update
+    path = self._getWorkingPath(self.getSubversionPath(business_template))
+    client = self._getClient()
+    # Revert local changes in working copy first 
+    # to import a "pure" BT after update
     self.revert(path=path, recurse=True)
     # Update from SVN
     client.update(path)
     # Import in zodb
-    return self.importBT(bt)
-  
-    security.declareProtected('Import/Export objects', 'updatewc')
-  def updatewc(self, bt):
+    return self.importBT(business_template)
+  
+  security.declareProtected('Import/Export objects', 'updatewc')
+  def updatewc(self, business_template):
     """Update a working copy.
     """
-    path = self._getWorkingPath(self.getSubversionPath(bt))
+    path = self._getWorkingPath(self.getSubversionPath(business_template))
     client = self._getClient()
     # Update from SVN
     client.update(path)
 
   security.declareProtected('Import/Export objects', 'switch')
-  def switch(self, bt, url):
+  def switch(self, business_template, url):
     """switch SVN repository for a working copy.
     """
-    path = self._getWorkingPath(self.getSubversionPath(bt))
+    path = self._getWorkingPath(self.getSubversionPath(business_template))
     client = self._getClient()
     if url[-1] == '/' :
       url = url[:-1]
@@ -744,51 +822,58 @@
   
   security.declareProtected('Import/Export objects', 'add')
   # path can be a list or not (relative or absolute)
-  def add(self, path, bt=None):
+  def add(self, path, business_template=None):
     """Add a file or a directory.
     """
-    if bt is not None:
+    if business_template is not None:
       if isinstance(path, list) :
-        path = [self._getWorkingPath(self.relativeToAbsolute(x, bt)) for x in path]
+        path = [self._getWorkingPath(self.relativeToAbsolute(x, \
+        business_template)) for x in path]
       else:
-        path = self._getWorkingPath(self.relativeToAbsolute(path, bt))
+        path = self._getWorkingPath(self.relativeToAbsolute(path, \
+        business_template))
     client = self._getClient()
     return client.add(path)
 
   security.declareProtected('Import/Export objects', 'info')
-  def info(self, bt):
+  def info(self, business_template):
     """return info of working copy
     """
-    working_copy = self._getWorkingPath(self.getSubversionPath(bt))
+    working_copy = self._getWorkingPath(self\
+    .getSubversionPath(business_template))
     client = self._getClient()
     return client.info(working_copy)
   
   security.declareProtected('Import/Export objects', 'log')
   # path can be absolute or relative
-  def log(self, path, bt):
+  def log(self, path, business_template):
     """return log of a file or dir
     """
     client = self._getClient()
-    return client.log(self._getWorkingPath(self.relativeToAbsolute(path, bt)))
+    return client.log(self._getWorkingPath(self\
+    .relativeToAbsolute(path, business_template)))
   
   security.declareProtected('Import/Export objects', 'cleanup')
-  def cleanup(self, bt):
+  def cleanup(self, business_template):
     """remove svn locks in working copy
     """
-    working_copy = self._getWorkingPath(self.getSubversionPath(bt))
+    working_copy = self._getWorkingPath(self\
+    .getSubversionPath(business_template))
     client = self._getClient()
     return client.cleanup(working_copy)
 
   security.declareProtected('Import/Export objects', 'remove')
   # path can be a list or not (relative or absolute)
-  def remove(self, path, bt=None):
+  def remove(self, path, business_template=None):
     """Remove a file or a directory.
     """
-    if bt is not None:
+    if business_template is not None:
       if isinstance(path, list) :
-        path = [self._getWorkingPath(self.relativeToAbsolute(x, bt)) for x in path]
+        path = [self._getWorkingPath(self\
+        .relativeToAbsolute(x, business_template)) for x in path]
       else:
-        path = self._getWorkingPath(self.relativeToAbsolute(path, bt))
+        path = self._getWorkingPath(self.relativeToAbsolute(path, \
+        business_template))
     client = self._getClient()
     return client.remove(path)
 
@@ -801,35 +886,40 @@
 
   security.declareProtected('Import/Export objects', 'ls')
   # path can be relative or absolute
-  def ls(self, path, bt):
+  def ls(self, path, business_template):
     """Display infos about a file.
     """
     client = self._getClient()
-    return client.ls(self._getWorkingPath(self.relativeToAbsolute(path, bt)))
+    return client.ls(self._getWorkingPath(self\
+    .relativeToAbsolute(path, business_template)))
 
   security.declareProtected('Import/Export objects', 'diff')
   # path can be relative or absolute
-  def diff(self, path, bt, revision1=None, revision2=None):
+  def diff(self, path, business_template, revision1=None, revision2=None):
     """Make a diff for a file or a directory.
     """
     client = self._getClient()
-    return client.diff(self._getWorkingPath(self.relativeToAbsolute(path, bt)), revision1, revision2)
+    return client.diff(self._getWorkingPath(self.relativeToAbsolute(path, \
+    business_template)), revision1, revision2)
   
   security.declareProtected('Import/Export objects', 'revert')
   # path can be absolute or relative
-  def revert(self, path, bt=None, recurse=False):
+  def revert(self, path, business_template=None, recurse=False):
     """Revert local changes in a file or a directory.
     """
     client = self._getClient()
     if not isinstance(path, list) :
-      path = [self._getWorkingPath(self.relativeToAbsolute(path, bt))]
-    if bt is not None:
-      path = [self._getWorkingPath(self.relativeToAbsolute(x, bt)) for x in path]
+      path = [self._getWorkingPath(self.relativeToAbsolute(path, \
+      business_template))]
+    if business_template is not None:
+      path = [self._getWorkingPath(self.relativeToAbsolute(x, \
+      business_template)) for x in path]
     client.revert(path, recurse)
 
   security.declareProtected('Import/Export objects', 'revertZODB')
   # path can be absolute or relative
-  def revertZODB(self, bt, added_files=None, other_files=None, recurse=False):
+  def revertZODB(self, business_template, added_files=None, \
+  other_files=None, recurse=False):
     """Revert local changes in a file or a directory
        in ZODB and on hard drive
     """
@@ -841,13 +931,13 @@
     if not other_files :
       other_files = []
     if not isinstance(added_files, list) :
-      added_files=[added_files]
+      added_files = [added_files]
     if not isinstance(other_files, list) :
-      other_files=[other_files]
+      other_files = [other_files]
     
     # Reinstall removed or modified files
-    for p in other_files :
-      path_list = self._getWorkingPath(p).split(os.sep)
+    for path in other_files :
+      path_list = self._getWorkingPath(path).split(os.sep)
       if 'bt' not in path_list:
         if len(path_list) > 2 :
           tmp = os.sep.join(path_list[2:])
@@ -856,8 +946,8 @@
           object_to_update[tmp] = 'install'
     path_added_list = []
     # remove added files
-    for p in added_files :
-      path_list = self._getWorkingPath(p).split(os.sep)
+    for path in added_files :
+      path_list = self._getWorkingPath(path).split(os.sep)
       if 'bt' not in path_list:
         if len(path_list) > 2 :
           tmp = os.sep.join(path_list[2:])
@@ -866,7 +956,8 @@
           path_added_list.append(tmp)
     ## hack to remove objects
     # Create a temporary bt with objects to delete
-    tmp_bt = getToolByName(bt, 'portal_templates').newContent(portal_type="Business Template")
+    tmp_bt = getToolByName(business_template, 'portal_templates')\
+    .newContent(portal_type="Business Template")
     tmp_bt.setTemplatePathList(path_added_list)
     tmp_bt.setTitle('tmp_bt_revert')
     # Build bt
@@ -876,57 +967,67 @@
     tmp_bt.install()
     tmp_bt.uninstall()
     # Remove it from portal template
-    bt.portal_templates.manage_delObjects(ids=tmp_bt.getId())
+    business_template.portal_templates.manage_delObjects(ids=tmp_bt.getId())
     #revert changes
     added_files.extend(other_files)
-    to_revert = [self.relativeToAbsolute(x, bt) for x in added_files]
+    to_revert = [self.relativeToAbsolute(x, business_template) \
+    for x in added_files]
     if len(to_revert) != 0 :
       client.revert(to_revert, recurse)
       # Partially reinstall installed bt
-      installed_bt = bt.portal_templates.getInstalledBusinessTemplate(                                                          bt.getTitle())
+      installed_bt = business_template.portal_templates\
+      .getInstalledBusinessTemplate(business_template.getTitle())
       installed_bt.reinstall(object_to_update=object_to_update, force=0)
     
   security.declareProtected('Import/Export objects', 'resolved')
   # path can be absolute or relative
-  def resolved(self, path, bt):
+  def resolved(self, path, business_template):
     """remove conflicted status
     """
     client = self._getClient()
     if isinstance(path, list) :
-      path = [self._getWorkingPath(self.relativeToAbsolute(x, bt)) for x in path]
+      path = [self._getWorkingPath(self.relativeToAbsolute(x, \
+      business_template)) for x in path]
     else:
-      path = self._getWorkingPath(self.relativeToAbsolute(path, bt))
+      path = self._getWorkingPath(self.relativeToAbsolute(path, \
+      business_template))
     return client.resolved(path)
 
-  def relativeToAbsolute(self, path, bt) :
+  def relativeToAbsolute(self, path, business_template):
+    """ Return an absolute path given the absolute one
+        and the business template
+    """
     if path[0] == os.sep:
       # already absolute
       return path
     # relative path
-    if path.split(os.sep)[0] == bt.getTitle():
-      return os.path.join(self.getSubversionPath(bt, False), path)
+    if path.split(os.sep)[0] == business_template.getTitle():
+      return os.path.join(self.getSubversionPath(business_template, \
+      False), path)
     else:
-      return os.path.join(self.getSubversionPath(bt), path)
+      return os.path.join(self.getSubversionPath(business_template), path)
 
   security.declareProtected('Import/Export objects', 'checkin')
   # path can be relative or absolute (can be a list of paths too)
-  def checkin(self, path, bt, log_message=None, recurse=True):
+  def checkin(self, path, business_template, log_message=None, recurse=True):
     """Commit local changes.
     """
     if isinstance(path, list) :
-      path = [self._getWorkingPath(self.relativeToAbsolute(x, bt)) for x in path]
+      path = [self._getWorkingPath(self.relativeToAbsolute(x, \
+      business_template)) for x in path]
     else:
-      path = self._getWorkingPath(self.relativeToAbsolute(path, bt))
+      path = self._getWorkingPath(self.relativeToAbsolute(path, \
+      business_template))
     client = self._getClient()
     return client.checkin(path, log_message, recurse)
 
   security.declareProtected('Import/Export objects', 'getLastChangelog')
-  def getLastChangelog(self, bt):
+  def getLastChangelog(self, business_template):
     """Return last changelog of a business template
     """
-    bt_path = self._getWorkingPath(self.getSubversionPath(bt))
+    bt_path = self._getWorkingPath(self.getSubversionPath(business_template))
     changelog_path = bt_path + os.sep + 'bt' + os.sep + 'change_log'
-    changelog=""
+    changelog = ""
     if os.path.exists(changelog_path):
       changelog_file = open(changelog_path, 'r')
       changelog_lines = changelog_file.readlines()
@@ -934,7 +1035,7 @@
       for line in changelog_lines:
         if line.strip() == '':
           break
-        changelog+=line
+        changelog += line
     return changelog
     
 
@@ -952,10 +1053,10 @@
     client = self._getClient()
     status_list = client.status(self._getWorkingPath(path), **kw)
     unversioned_list = []
-    for statusObj in status_list:
-      if str(statusObj.getTextStatus()) == "unversioned":
+    for status_obj in status_list:
+      if str(status_obj.getTextStatus()) == "unversioned":
         my_dict = {}
-        my_dict['uid'] = statusObj.getPath()
+        my_dict['uid'] = status_obj.getPath()
         unversioned_list.append(my_dict)
     return unversioned_list
       
@@ -966,35 +1067,39 @@
     client = self._getClient()
     status_list = client.status(self._getWorkingPath(path), **kw)
     conflicted_list = []
-    for statusObj in status_list:
-      if str(statusObj.getTextStatus()) == "conflicted":
+    for status_obj in status_list:
+      if str(status_obj.getTextStatus()) == "conflicted":
         my_dict = {}
-        my_dict['uid'] = statusObj.getPath()
+        my_dict['uid'] = status_obj.getPath()
         conflicted_list.append(my_dict)
     return conflicted_list
 
   security.declareProtected('Import/Export objects', 'removeAllInList')
-  def removeAllInList(self, list):
+  def removeAllInList(self, path_list):
     """Remove all files and folders in list
     """
-    for file in list:
-      removeAll(file)
-    
-  def getModifiedTree(self, bt, show_unmodified=False) :
+    for file_path in path_list:
+      removeAll(file_path)
+    
+  def getModifiedTree(self, business_template, show_unmodified=False) :
+    """ Return tree of files returned by svn status
+    """
     # Get subversion path without business template name at the end
-    bt_path = self._getWorkingPath(self.getSubversionPath(bt, False))
+    bt_path = self._getWorkingPath(self.getSubversionPath(business_template, \
+    False))
     if bt_path[-1] != '/':
       bt_path += '/'
     # Business template root directory is the root of the tree
-    root = Dir(bt.getTitle(), "normal")
-    somethingModified = False
+    root = Dir(business_template.getTitle(), "normal")
+    something_modified = False
     
     # We browse the files returned by svn status
-    for status_obj in self.status(os.path.join(bt_path, bt.getTitle())) :
+    for status_obj in self.status(os.path.join(bt_path, \
+    business_template.getTitle())) :
       # can be (normal, added, modified, deleted, conflicted, unversioned)
       status = str(status_obj.getTextStatus())
       if (show_unmodified or status != "normal") and status != "unversioned":
-        somethingModified = True
+        something_modified = True
         # Get object path
         full_path = status_obj.getPath()
         relative_path = full_path.replace(bt_path, '')
@@ -1005,11 +1110,11 @@
         
         # First we add the directories present in the path to the tree
         # if it does not already exist
-        for d in relative_path.split(os.sep)[1:-1] :
-          if d :
-            if d not in parent.getSubDirsNameList() :
-              parent.sub_dirs.append(Dir(d, "normal"))
-            parent = parent.getDirFromName(d)
+        for directory in relative_path.split(os.sep)[1:-1] :
+          if directory :
+            if directory not in parent.getSubDirsNameList() :
+              parent.sub_dirs.append(Dir(directory, "normal"))
+            parent = parent.getDirFromName(directory)
         
         # Consider the whole path which can be a folder or a file
         # We add it the to the tree if it does not already exist
@@ -1026,51 +1131,65 @@
         else :
           # add new file to the tree
           parent.sub_files.append(File(filename, str(status)))
-    return somethingModified and root
-  
-  def extractBT(self, bt):
-    # first update working copy
-    #self.updatewc(bt)
-    bt.build()
-    svn_path = self._getWorkingPath(self.getSubversionPath(bt) + os.sep)
+    return something_modified and root
+  
+  def extractBT(self, business_template):
+    """ 
+     Extract business template to hard drive
+     and do svn add/del stuff comparing it
+     to local working copy
+    """
+    business_template.build()
+    svn_path = self._getWorkingPath(self.getSubversionPath(business_template) \
+    + os.sep)
     path = mktemp() + os.sep
     try:
-      bt.export(path=path, local=1)
+      business_template.export(path=path, local=1)
       # svn del deleted files
-      self.deleteOldFiles(svn_path, path, bt)
+      self.deleteOldFiles(svn_path, path)
       # add new files and copy
-      self.addNewFiles(svn_path, path, bt)
-      self.goToWorkingCopy(bt)
-    except (pysvn.ClientError, NotFound, AttributeError, AttributeError, Error), error:
+      self.addNewFiles(svn_path, path)
+      self.goToWorkingCopy(business_template)
+    except (pysvn.ClientError, NotFound, AttributeError, \
+    AttributeError, Error), error:
       # Clean up
       removeAll(path)
       raise error
     # Clean up
-    self.activate().removeAllInList([path,])
-    
-  def importBT(self, bt):
-    return bt.download(self._getWorkingPath(self.getSubversionPath(bt)))
+    self.activate().removeAllInList([path, ])
+    
+  def importBT(self, business_template):
+    """
+     Import business template from local
+     working copy
+    """
+    return business_template.download(self._getWorkingPath(self\
+    .getSubversionPath(business_template)))
     
   # Get a list of files and keep only parents
   # Necessary before recursively commit removals
-  def cleanChildrenInList(self, list):
-    res = list
-    for file in list:
-      res = [x for x in res if file == x or file not in x]
+  def cleanChildrenInList(self, path_list):
+    """
+     Get a list of files and keep only parents
+     Necessary before recursively commit removals
+    """
+    res = path_list
+    for file_path in path_list:
+      res = [x for x in res if file_path == x or file_path not in x]
     return res
 
   # return a set with directories present in the directory
   def getSetDirsForDir(self, directory):
     dir_set = set()
-    for root, dirs, files in cacheWalk(directory):
+    for root, dirs, _ in cacheWalk(directory):
       # don't visit SVN directories
       if '.svn' in dirs:
         dirs.remove('.svn')
       # get Directories
       for name in dirs:
         i = root.replace(directory, '').count(os.sep)
-        f = os.path.join(root, name)
-        dir_set.add((i, f.replace(directory,'')))
+        path = os.path.join(root, name)
+        dir_set.add((i, path.replace(directory,'')))
     return dir_set
       
   # return a set with files present in the directory
@@ -1083,8 +1202,8 @@
       # get Files
       for name in files:
         i = root.replace(directory, '').count(os.sep)
-        f = os.path.join(root, name)
-        dir_set.add((i, f.replace(directory,'')))
+        path = os.path.join(root, name)
+        dir_set.add((i, path.replace(directory,'')))
     return dir_set
   
   # return files present in new_dir but not in old_dir
@@ -1109,22 +1228,24 @@
     new_set = self.getSetDirsForDir(new_dir)
     return new_set.difference(old_set)
     
-  # svn del files that have been removed in new dir
-  def deleteOldFiles(self, old_dir, new_dir, bt):
+  def deleteOldFiles(self, old_dir, new_dir):
+    """ svn del files that have been removed in new dir
+    """
     # detect removed files
     files_set = self.getNewFiles(new_dir, old_dir)
     # detect removed directories
     dirs_set = self.getNewDirs(new_dir, old_dir)
     # svn del
-    list = [x for x in files_set]
-    list.sort()
-    self.remove([os.path.join(old_dir, x[1]) for x in list])
-    list = [x for x in dirs_set]
-    list.sort()
-    self.remove([os.path.join(old_dir, x[1]) for x in list])
-  
-  # copy files and add new files
-  def addNewFiles(self, old_dir, new_dir, bt):
+    path_list = [x for x in files_set]
+    path_list.sort()
+    self.remove([os.path.join(old_dir, x[1]) for x in path_list])
+    path_list = [x for x in dirs_set]
+    path_list.sort()
+    self.remove([os.path.join(old_dir, x[1]) for x in path_list])
+  
+  def addNewFiles(self, old_dir, new_dir):
+    """ copy files and add new files
+    """
     # detect created files
     files_set = self.getNewFiles(old_dir, new_dir)
     # detect created directories
@@ -1132,21 +1253,27 @@
     # Copy files
     copytree(new_dir, old_dir)
     # svn add
-    list = [x for x in dirs_set]
-    list.sort()
-    self.add([os.path.join(old_dir, x[1]) for x in list])
-    list = [x for x in files_set]
-    list.sort()
-    self.add([os.path.join(old_dir, x[1]) for x in list])
-  
-  def treeToXML(self, item, bt) :
+    path_list = [x for x in dirs_set]
+    path_list.sort()
+    self.add([os.path.join(old_dir, x[1]) for x in path_list])
+    path_list = [x for x in files_set]
+    path_list.sort()
+    self.add([os.path.join(old_dir, x[1]) for x in path_list])
+  
+  def treeToXML(self, item, business_template) :
+    """ Convert tree in memory to XML
+    """
     output = "<?xml version='1.0' encoding='iso-8859-1'?>"+ os.linesep
     output += "<tree id='0'>" + os.linesep
-    output = self._treeToXML(item, output, bt.getTitle(), True)
+    output = self._treeToXML(item, output, business_template.getTitle(), True)
     output += "</tree>" + os.linesep
     return output
   
   def _treeToXML(self, item, output, relative_path, first) :
+    """
+     Private function to convert recursively tree 
+     in memory to XML
+    """
     # Choosing a color coresponding to the status
     status = item.status
     if status == 'added' :
@@ -1170,7 +1297,8 @@
         'im1="folder_open.png" im2="folder.png">'%(item.name,
         relative_path, color) + os.linesep
       for it in item.getContent():
-        output = self._treeToXML(item.getObjectFromName(it.name), output, os.path.join(relative_path,it.name),first)
+        output = self._treeToXML(item.getObjectFromName(it.name), output, \
+        os.path.join(relative_path,it.name),first)
       output += '</item>' + os.linesep
     else :
       output += '<item text="%s" id="%s" aCol="%s" im0="document.png"/>'\




More information about the Erp5-report mailing list