def mix_id_zope (idinit):
  # Ce script permet de transformer un texte en id zope
  # ici est donc choisi l'ensemble des caracteres authorises pour les identifiants
  # par exemple le login est un id zope, et donc suit ces regles.


  #on transforme les accents par les lettres correspondantes.

  import string
  
  b=''
  for a in idinit:
    if a in 'éèêë':
      a='e'
    elif a in 'àâä':
      a='a'
    elif a in 'ç':
      a='c'
    elif a in 'îï':
      a='i'
    elif a in 'öô':
      a='o'
    elif a in 'ûüù':
      a='u'
    elif a in 'ÿ':
      a='y'
    #on accepte les caracteres suivants : 
    #chiffre, minuscule, majuscule '.', '-' et '_'.
    elif a in string.digits or a in string.lowercase or a in string.uppercase or a=='.' or a=='-' or a=='_':
      b=b+a
  c=b.lower()

  if idinit!='' and c=="":
    c="vide"
  if c!='':
    if c[0]=='_':
      c='x'+c
    l=len(c)
    if c[l-1]=='_':
      c=c+'x'
  return c
											    
def unzipfile (self, zf_id_or_data, folder_obj):
  """
  Unzip the file zf_id_or_data (where zf_id_or_data is the identifiant or the data of the zip-file) in the folder folder_obj.
  """
  import zipfile 
  import string
  
  list_of_files=[]
  zfile = zipfile.ZipFile(zf_id_or_data, 'r') 
  for filename in zfile.namelist(): 
    data = zfile.read(filename)
    norm_id=mix_id_zope(filename)
    while norm_id in folder_obj.objectIds():
      norm_id = 'new_'+norm_id
    list_of_files.append(norm_id)
    ext=filename[max(0, string.rfind(filename, '.'))+1:]
    if not ext.lower() in ['png', 'jpg', 'jpeg', 'gif', 'tif', 'bmp']:
      folder_obj.manage_addProduct['OFSP'].manage_addFile(norm_id, data, filename)
    else:
      folder_obj.manage_addProduct['OFSP'].manage_addImage(norm_id, data, filename)
  zfile.close()
  return list_of_files

def export_in_zipfile (self, list_of_files, folder_obj, REQUEST, RESPONSE):
  """
  Export, in a zip-file given to download, the files who are in the folder folder_obj, with name in list_of_files.
  """
  from zipfile import ZipFile, ZIP_DEFLATED
  from cStringIO import StringIO
  from OFS.Image import File
  import string

  if not folder_obj:
    folder_obj=self
  if list_of_files!=[]:
    sio = StringIO()
    z = ZipFile(sio, mode='w', compression=ZIP_DEFLATED)
    for f_id in list_of_files:
      f=getattr(folder_obj, f_id)
      l_id=f_id.lower()
      #z.writestr('%s/%s' % (self.getId(), f_id), str(f.data))
      z.writestr('%s' % (f_id), str(f.data))
    z.close()
    sio.seek(0)
    
    """
    folder_obj.manage_addProduct['OFSP'].manage_addFile('%s' % mix_id_zope (self.title_or_id() + '.zip'), str(sio.read()), 'ZIP')
    return
    """
    RESPONSE.setHeader('Content-Disposition', 'attachment; filename=%s' % mix_id_zope (self.title_or_id() + '.zip'))
    _v_zopeFile = File('id', 'title', str(sio.read()), content_type='application/zip')
    return _v_zopeFile.index_html( REQUEST, RESPONSE)
  else:
    return None
  


