예제 #1
0
 def initExportFilter(self, id, REQUEST):
   # Set environment variables.
   instance_home = standard.getINSTANCE_HOME()
   package_home = standard.getPACKAGE_HOME()
   package_home = os.path.normpath(package_home)
   REQUEST.set( 'ZMS_FILTER', True)
   REQUEST.set( 'ZMS_FILTER_INSTANCE_HOME', instance_home)
   REQUEST.set( 'ZMS_FILTER_PACKAGE_HOME', package_home)
   # Set local variables.
   ob_filter = self.getFilterManager().getFilter(id)
   ob_filter_format = ob_filter.get('format', '')
   # Create temporary folder.
   tempfolder = tempfile.mktemp()
   ressources = self.exportRessources( tempfolder, REQUEST, from_zms=ob_filter_format=='XHTML', from_home=ob_filter_format=='XHTML')
   # Export data to file.
   if ob_filter_format == 'export':
     outfilename = _fileutil.getOSPath('%s/INDEX0'%tempfolder)
   elif ob_filter_format in ['XML', 'XML_incl_embedded']:
     # Set XML.
     data = self.toXml( REQUEST)
     outfilename = _fileutil.getOSPath('%s/export.xml'%tempfolder)
     _fileutil.exportObj( data, outfilename)
   elif ob_filter_format == 'XHTML':
     # Set XHTML.
     data = self.toXhtml( REQUEST)
     outfilename = _fileutil.getOSPath('%s/export.html'%tempfolder)
     _fileutil.exportObj( data, outfilename)
   elif ob_filter_format == 'myXML':
     # Set myXML.
     data = self.getXmlHeader() + getattr( self, 'getObjToXml_DocElmnt')(context=self)
     outfilename = _fileutil.getOSPath('%s/export.xml'%tempfolder)
     _fileutil.exportObj( data, outfilename)
   else:
     raise zExceptions.InternalError("Unknown format '%s'"%ob_filter.get('format', ''))
   return tempfolder, outfilename
예제 #2
0
파일: zms.py 프로젝트: zms-publishing/ZMS5
 def zms_version(self, custom=False):
   file = open(_fileutil.getOSPath(package_home(globals())+'/version.txt'),'r')
   rtn = file.read()
   file.close()
   zms_custom_version = os.environ.get('ZMS_CUSTOM_VERSION', '')
   if custom and zms_custom_version != '':
     rtn += ' ({})'.format(zms_custom_version)
   if custom and os.path.exists(_fileutil.getOSPath(package_home(globals())+'/../../.git/FETCH_HEAD')):
     file = open(_fileutil.getOSPath(package_home(globals())+'/../../.git/FETCH_HEAD'),'r')
     FETCH_HEAD = file.read()
     file.close()
     FETCH_HEAD = FETCH_HEAD[0:7]
     rtn += ' git#%s'%(FETCH_HEAD)
   return rtn
예제 #3
0
def processCommand(self, filename, command):
  standard.writeBlock( self, '[processCommand]: infilename=%s'%filename)
  infilename = _fileutil.getOSPath( filename)
  outfilename = _fileutil.getOSPath( filename)
  mCurDir = '{cur_dir}'
  mIn = '{in}'
  mOut = '{out}'
  i = command.find(mOut[:-1])
  if i >= 0:
      j = command.find('}', i)
      mExt = command[i+len(mOut[:-1]):j]
      mOut = command[i:j+1]
      if len(mExt) > 0:
          outfilename = outfilename[:outfilename.rfind('.')] + mExt
      else:
          outfilename += '.tmp'
  tmpoutfilename = outfilename + '~'
  instance_home = standard.getINSTANCE_HOME()
  package_home = standard.getPACKAGE_HOME()
  package_home = os.path.normpath(package_home)
  command = command.replace( '{package_home}', package_home)
  command = command.replace( '{instance_home}', instance_home)
  command = command.replace( mCurDir, _fileutil.getFilePath(infilename))
  command = command.replace( mIn, infilename)
  command = command.replace( mOut, tmpoutfilename)
  # Change directory (deprecated!).
  if self.getConfProperty('ZMS.filtermanager.processCommand.chdir', 0):
      path = _fileutil.getFilePath(filename)
      standard.writeBlock( self, '[processCommand]: path=%s'%path)
      os.chdir(path)
  # Execute command.
  standard.writeBlock( self, '[processCommand]: command=%s'%command)
  os.system(command)
  # Check if output file exists.
  try: 
      os.stat( _fileutil.getOSPath( tmpoutfilename)) 
      standard.writeBlock( self, '[processCommand]: rename %s to %s'%( tmpoutfilename, outfilename))
      try:
          os.remove( outfilename)
      except OSError:
          pass
      os.rename( tmpoutfilename, outfilename)
  except OSError:
      outfilename = infilename
  # Remove input file if it is the result of a transformation of output file.
  if outfilename != infilename:
      os.remove( infilename)
  # Return filename.
  standard.writeBlock( self, '[processCommand]: outfilename=%s'%( outfilename))
  return outfilename
예제 #4
0
def importTheme(folder, theme):
  
  filename = _fileutil.extractFilename(theme)
  id = filename[:filename.rfind('.')]
  
  if filename.endswith('.zexp'):
    ### Store copy of ZEXP in INSTANCE_HOME/import-folder.
    filepath = standard.getINSTANCE_HOME() + '/import/' + filename
    if theme.startswith('http://'):
      initutil = standard.initutil()
      initutil.setConfProperty('HTTP.proxy',REQUEST.get('http_proxy',''))
      zexp = standard.http_import( initutil, theme)
      _fileutil.exportObj( zexp, filepath)
    else:
      packagepath = package_home(globals()) + '/import/' + filename
      try:
        os.stat(_fileutil.getOSPath(filepath))
      except OSError:
        shutil.copy( packagepath, filepath)
    
    ### Import theme from ZEXP.
    _fileutil.importZexp( folder, filename)
  
  else:
    id = filename[:filename.find('-')]
    _confmanager.initConf(folder.content, id, remote=False)
  
  return id
예제 #5
0
 def toXml(self, sender=None, base_path='', data2hex=True):
     """
   Serialize this file to xml-string.
   @param sender: the sender-node
   @type sender: C{zmsobject.ZMSObject=None}
   @param base_path: the base-path
   @type base_path: C{str=''}
   @param data2hex: convert data inline to hex, otherwise saved to file in base-path
   @type data2hex: C{Bool=True}
   @return: the xml-string
   @rtype: C{str}
   """
     data = ''
     objtype = ''
     filename = _fileutil.getOSPath(
         _fileutil.extractFilename(getattr(self, 'filename', '')))
     content_type = getattr(self, 'content_type', '')
     if data2hex:
         if content_type.startswith('text/') or content_type in [
                 'application/css', 'application/javascript', 'image/svg'
         ]:
             data = '<![CDATA[%s]]>' % str(self.getData(sender), 'utf-8')
         else:
             data = standard.bin2hex(bytes(self.getData(sender)))
         objtype = ' type="file"'
     else:
         filename = self.getFilename()
         filename = getLangFilename(sender, filename, self.lang)
         filename = '%s%s' % (base_path, filename)
     xml = '\n<data'
     xml += ' content_type="%s"' % content_type
     xml += ' filename="%s"' % filename
     xml += objtype + '>' + data
     xml += '</data>'
     return xml
예제 #6
0
    def toZippedHtml(self, REQUEST, get_data=True):
        REQUEST.set('ZMS_INDEX_HTML', 1)
        REQUEST.set('ZMS_HTML_EXPORT', 1)

        #-- Create temporary folder.
        tempfolder = tempfile.mktemp()
        ressources = self.exportRessources(tempfolder,
                                           REQUEST,
                                           from_zms=self.getLevel() == 0,
                                           from_home=True)

        #-- Download HTML-pages.
        for lang in self.getLangIds():
            REQUEST.set('lang', lang)
            REQUEST.set('preview', None)
            self.recurse_downloadHtmlPages(self, tempfolder, lang, REQUEST)

        #-- Get zip-file.
        zipfiles = _fileutil.getOSPath('%s/*' % tempfolder)
        rtn = _fileutil.buildZipArchive(zipfiles, get_data)

        #-- Remove temporary folder.
        if not self.getConfProperty('ZMS.debug', 0):
            _fileutil.remove(tempfolder, deep=1)

        return rtn
예제 #7
0
def optimize(img, qual=75):
  """
  Optimize image.
  @rtype: C{MyImage}
  """
  from PIL import Image, ImageFile
  ImageFile.LOAD_TRUNCATED_IMAGES = True
  
  # Save image in temp-folder
  context = img.aq_parent
  tempfolder = tempfile.mktemp()
  filepath = _fileutil.getOSPath('%s/%s'%(tempfolder, img.filename))
  _fileutil.exportObj(img, filepath)
  
  # Resize image
  im = Image.open(filepath)
  im = im.convert('RGB')
  im.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True)
  
  # Read optimized image from file-system
  f = open(filepath, 'rb')
  data = f.read()
  result = {'data':data,'filename':img.filename}
  f.close()
  
  # Remove temp-folder and images
  _fileutil.remove(tempfolder, deep=1)
  
  # Returns resulting image
  image = standard.ImageFromData(context, result['data'], result['filename'])
  return image
예제 #8
0
def rotate(img, direction, qual=75):
    """
  Rotate image.
  """
    try:
        from PIL import Image
    except:
        import Image

    # Save image in temp-folder
    context = img.aq_parent
    tempfolder = tempfile.mktemp()
    filepath = _fileutil.getOSPath('%s/%s' % (tempfolder, img.filename))
    _fileutil.exportObj(img, filepath)

    # Rotate image
    im = Image.open(filepath)
    im = im.rotate(direction)
    im.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True)

    # Read rotated image from file-system
    f = open(filepath, 'rb')
    data = f.read()
    result_filename = _fileutil.extractFilename(filepath)
    result = {'data': data, 'filename': img.filename}
    f.close()

    # Remove temp-folder and images
    _fileutil.remove(tempfolder, deep=1)

    # Returns resulting image
    image = standard.ImageFromData(context, result['data'], result['filename'])
    return image
예제 #9
0
def crop(img, box, qual=75):
    """
  Crop image.
  @rtype: C{MyImage}
  """
    try:
        from PIL import Image
    except:
        import Image

    # Save image in temp-folder
    context = img.aq_parent
    tempfolder = tempfile.mktemp()
    filepath = _fileutil.getOSPath('%s/%s' % (tempfolder, img.filename))
    _fileutil.exportObj(img, filepath)

    # Crop image
    im = Image.open(filepath)
    im = im.crop(box)
    im.convert('RGB').save(filepath, "JPEG", quality=qual)

    # Read resized image from file-system
    f = open(filepath, 'rb')
    result_data = f.read()
    result_filename = _fileutil.extractFilename(filepath)
    result = {'data': result_data, 'filename': result_filename}
    f.close()

    # Remove temp-folder and images
    _fileutil.remove(tempfolder, deep=1)

    # Returns resulting image
    image = standard.ImageFromData(context, result['data'], result['filename'])
    return image
예제 #10
0
 def zms_version(self):
   file = open(_fileutil.getOSPath(package_home(globals())+'/version.txt'),'r')
   rtn = file.read()
   file.close()
   zms_custom_version = os.environ.get('ZMS_CUSTOM_VERSION', '')
   if zms_custom_version != '':
       rtn += ' ({})'.format(zms_custom_version)
   return rtn
예제 #11
0
def importFile(self, file, REQUEST, handler):

    # Get filename.
    if isinstance(file, ZPublisher.HTTPRequest.FileUpload):
        filename = file.filename
    else:
        filename = file.name
    standard.writeBlock(self, '[importFile]: filename=' + filename)

    # Create temporary folder.
    folder = tempfile.mktemp()
    os.mkdir(folder)

    # Save to temporary file.
    filename = _fileutil.getOSPath(
        '%s/%s' % (folder, _fileutil.extractFilename(filename)))
    _fileutil.exportObj(file, filename)

    # Import ZEXP-file.
    if _fileutil.extractFileExt(filename) == 'zexp':
        ob = self._importObjectFromFile(filename, verify=0)
        # Remove temporary files.
        _fileutil.remove(folder, deep=1)
        # Refresh zcatalog_index
        standard.triggerEvent(self, '*.onImportObjEvt')
        return ob

    # Find XML-file.
    if _fileutil.extractFileExt(filename) == 'zip':
        _fileutil.extractZipArchive(filename)
        filename = None
        for deep in [0, 1]:
            for ext in ['xml', 'htm', 'html']:
                if filename is None:
                    filename = _fileutil.findExtension(ext, folder, deep)
            break
        if filename is None:
            raise zExceptions.InternalError('XML-File not found!')

    # Import Filter.
    if REQUEST.get('filter', '') in self.getFilterManager().getFilterIds():
        filename = _filtermanager.importFilter(self, filename,
                                               REQUEST.get('filter', ''),
                                               REQUEST)

    # Import XML-file.
    standard.writeBlock(self, '[importFile]: filename=' + filename)
    f = standard.pyopen(filename, 'r', encoding='utf-8')
    ob = handler(self, f)
    f.close()

    # Remove temporary files.
    _fileutil.remove(folder, deep=1)

    # Return imported object.
    return ob
예제 #12
0
def processData(self, processId, data, trans=None):
  # Create temporary folder.
  folder = tempfile.mktemp()
  # Save data to file.
  filename = _fileutil.getOSPath('%s/in.dat'%folder)
  _fileutil.exportObj(data, filename)
  # Save transformation to file.
  if trans:
    transfilename = _fileutil.getOSPath('%s/%s'%(folder, trans.getId()))
    _fileutil.exportObj(trans, transfilename)
  # Process file.
  filename = processFile(self, processId, filename, trans)
  # Read data from file.
  f = open(filename, 'rb')
  data = f.read()
  f.close()
  # Remove temporary folder.
  if not self.getConfProperty('ZMS.debug', 0):
    _fileutil.remove(folder, deep=1)
  # Return data.
  return data
예제 #13
0
def recurse_importContent(self, folder):
  # Cleanup.
  for key in ['oRootTag', 'oCurrNode', 'oParent', 'dTagStack', 'dValueStack']:
    try: delattr(self, key)
    except: pass
  
  # Upload ressources.
  langs = self.getLangIds()
  prim_lang = self.getPrimaryLanguage()
  obj_attrs = self.getObjAttrs()
  for key in obj_attrs:
    obj_attr = self.getObjAttr(key)
    datatype = obj_attr['datatype_key']
    if datatype in _globals.DT_BLOBS:
      for lang in langs:
        try:
          if obj_attr['multilang'] or lang==prim_lang:
            req = {'lang':lang,'preview':'preview'}
            obj_vers = self.getObjVersion(req)
            blob = self._getObjAttrValue(obj_attr, obj_vers, lang)
            if blob is not None:
              filename = _fileutil.getOSPath('%s/%s'%(folder, blob.filename))
              standard.writeBlock( self, '[recurse_importContent]: filename=%s'%filename)
              # Backup properties (otherwise manage_upload sets it).
              bk = {}
              for __xml_attr__ in blob.__xml_attrs__:
                bk[__xml_attr__] = getattr(blob, __xml_attr__, '')
              # Read file to ZODB.
              f = open( filename, 'rb')
              try:
                blob = _blobfields.createBlobField( self, datatype, file={'data':f,'filename':filename})
              finally:
                f.close()
              # Restore properties.
              for __xml_attr__ in blob.__xml_attrs__:
                if bk.get(__xml_attr__, '') not in ['', 'text/x-unknown-content-type']:
                  setattr(blob, __xml_attr__, bk[__xml_attr__])
              blob.getFilename() # Normalize filename
              self.setObjProperty(key, blob, lang)
        except:
          standard.writeError(self, "[recurse_importContent]")
  
  # Commit object.
  self.onChangeObj( self.REQUEST, forced=1)
  transaction.commit()
  
  # Process children.
  for ob in self.getChildNodes():
    recurse_importContent(ob, folder)
예제 #14
0
 def __init__(self, filename='_language.xml'):
     """
   Constructor 
   """
     manage_langs = []
     lang_dict = {}
     filepath = package_home(globals()) + '/import/'
     xmlfile = open(_fileutil.getOSPath(filepath + filename), 'rb')
     builder = _xmllib.XmlBuilder()
     nWorkbook = builder.parse(xmlfile)
     for nWorksheet in _xmllib.xmlNodeSet(nWorkbook, 'Worksheet'):
         for nTable in _xmllib.xmlNodeSet(nWorksheet, 'Table'):
             for nRow in _xmllib.xmlNodeSet(nTable, 'Row'):
                 lRow = []
                 currIndex = 0
                 for nCell in _xmllib.xmlNodeSet(nRow, 'Cell'):
                     ssIndex = int(
                         nCell.get('attrs', {}).get('ss:Index',
                                                    currIndex + 1))
                     currData = None
                     for i in range(currIndex + 1, ssIndex):
                         lRow.append(currData)
                     for nData in _xmllib.xmlNodeSet(nCell, 'Data'):
                         currData = nData['cdata']
                     lRow.append(currData)
                     currIndex = ssIndex
                 if len(manage_langs) == 0:
                     del lRow[0]
                     manage_langs = lRow
                 else:
                     if len(lRow) > 0:
                         key = lRow[0]
                         value = {}
                         for i in range(len(manage_langs)):
                             if i + 1 < len(lRow):
                                 if lRow[i + 1] is not None:
                                     value[manage_langs[i]] = lRow[i + 1]
                         lang_dict[key] = value
     xmlfile.close()
     self.manage_langs = manage_langs
     self.langdict = lang_dict
예제 #15
0
    def toZippedXml(self, REQUEST, get_data=True):

        #-- Create temporary folder.
        tempfolder = tempfile.mktemp()
        ressources = self.exportRessources(tempfolder, REQUEST)

        #-- Get xml-export.
        xml = self.toXml(REQUEST)

        #-- Write xml-export to file.
        xmlfilename = os.path.join(tempfolder, 'content.xml')
        _fileutil.exportObj(xml, xmlfilename)

        #-- Get zip-file.
        zipfiles = _fileutil.getOSPath('%s/*' % tempfolder)
        rtn = _fileutil.buildZipArchive(zipfiles, get_data)

        #-- Remove temporary folder.
        if not self.getConfProperty('ZMS.debug', 0):
            _fileutil.remove(tempfolder, deep=1)

        return rtn
예제 #16
0
def recurse_downloadRessources(self, base_path, REQUEST):
    ressources = []
    # Check Constraints.
    root = getattr(self, '__root__', None)
    if root is not None:
        return ressources
    # Attributes.
    langs = self.getLangIds()
    prim_lang = self.getPrimaryLanguage()
    obj_attrs = self.getObjAttrs()
    for key in obj_attrs:
        obj_attr = self.getObjAttr(key)
        datatype = obj_attr['datatype_key']
        if datatype in _globals.DT_BLOBS:
            for lang in langs:
                try:
                    if obj_attr['multilang'] or lang == prim_lang or (
                            obj_attr['multilang'] == 0 and lang != prim_lang):
                        req = {'lang': lang, 'preview': 'preview'}
                        obj_vers = self.getObjVersion(req)
                        blob = self._getObjAttrValue(obj_attr, obj_vers, lang)
                        if blob is not None:
                            filename = blob.getFilename()
                            filename = getLangFilename(self, filename, lang)
                            filename = '%s%s' % (base_path, filename)
                            filename = _fileutil.getOSPath(filename)
                            _fileutil.exportObj(blob, filename)
                            ressources.append({
                                'filepath':
                                filename,
                                'content_type':
                                blob.getContentType()
                            })
                except:
                    standard.writeError(
                        self,
                        "[recurse_downloadRessources]: Can't export %s" % key)
        elif datatype == _globals.DT_LIST:
            for lang in langs:
                try:
                    if obj_attr['multilang'] or lang == prim_lang or (
                            obj_attr['multilang'] == 0 and lang != prim_lang):
                        req = {'lang': lang, 'preview': 'preview'}
                        obj_vers = self.getObjVersion(req)
                        v = self._getObjAttrValue(obj_attr, obj_vers, lang)
                        i = 0
                        for r in v:
                            uu = []
                            if isinstance(r, dict):
                                for k in r:
                                    u = r[k]
                                    if isinstance(u, MyImage) or isinstance(
                                            u, MyFile):
                                        uu.append(u)
                            elif isinstance(r, MyImage) or isinstance(
                                    r, MyFile):
                                uu.append(r)
                            for u in uu:
                                filename = u.getFilename()
                                filename = getLangFilename(
                                    self, filename, lang)
                                filename = '%s@%i/%s' % (base_path, i,
                                                         filename)
                                filename = _fileutil.getOSPath(filename)
                                _fileutil.exportObj(u, filename)
                                ressources.append({
                                    'filepath':
                                    filename,
                                    'content_type':
                                    u.getContentType()
                                })
                            i = i + 1
                except:
                    standard.writeError(
                        self,
                        "[recurse_downloadRessources]: Can't export %s" % key)
    # Process children.
    for child in self.getChildNodes():
        ressources.extend(
            recurse_downloadRessources(child, base_path + child.id + '/',
                                       REQUEST))
    # Return list of ressources.
    return ressources
예제 #17
0
def toCdata(self, s, xhtml=False):
  rtn = ''

  # Return Text (HTML) in CDATA as XHTML.
  from Products.zms import _filtermanager
  processId = 'tidy'
  if not xhtml \
     and self.getConfProperty('ZMS.export.xml.tidy', 0) \
     and processId in self.getProcessIds():

    # Create temporary folder.
    folder = tempfile.mktemp()
    os.mkdir(folder)

    # Save <HTML> to file.
    filename = _fileutil.getOSPath('%s/xhtml.html' % folder)
    _fileutil.exportObj(s, filename)

    # Call <HTML>Tidy
    processOb = self.getProcess(processId)
    command = processOb.get('command')
    if command.find('{trans}') >= 0:
      trans = _fileutil.getOSPath(package_home(globals()) + '/conf/xsl/tidy.html2xhtml.conf')
      command = command.replace('{trans}', trans)
    filename = _filtermanager.processCommand(self, filename, command)

    # Read <XHTML> from file.
    f = open(htmfilename, 'rb')
    rtn = f.read().strip()
    f.close()

    # Read Error-Log from file.
    f = open(logfilename, 'rb')
    log = f.read().strip()
    f.close()

    # Remove temporary files.
    _fileutil.remove(folder, deep=1)

    # Process <XHTML>.
    prefix = '<p>'
    if s[:len(prefix)] != prefix and rtn[:len(prefix)] == prefix:
      rtn = rtn[len(prefix):]
      suffix = '</p>'
      if s[-len(suffix):] != suffix and rtn[-len(suffix):] == suffix:
        rtn = rtn[:-len(suffix)]
    f.close()

    # Process Error-Log.
    if log.find('0 errors') < 0:
      rtn += '<!-- ' + log + '-->'

  # Return Text.
  elif standard.is_str(s) and s.find(' ') < 0 and s.find('<') < 0 and s.find('&') < 0:
    rtn = s

  # Return Text in CDATA.
  elif s is not None:
    if standard.is_bytes(s):
      s = standard.pystr(s)
    # Hack for invalid characters
    s = s.replace(chr(30), '')
    # Hack for nested CDATA
    s = re.compile(r'\<\!\[CDATA\[(.*?)\]\]\>').sub(r'<!{CDATA{\1}}>', s)
    # Wrap with CDATA
    rtn = '<![CDATA[%s]]>' % s

  # Return.
  return rtn
예제 #18
0
    def manage_changeWorkflow(self,
                              lang,
                              btn='',
                              key='properties',
                              REQUEST=None,
                              RESPONSE=None):
        """ ZMSWorkflowProvider.manage_changeWorkflow """
        message = ''

        # Version Control.
        # -----------
        if key == 'history':
            old_active = self.getConfProperty('ZMS.Version.active', 0)
            new_active = REQUEST.get('active', 0)
            old_nodes = self.getConfProperty('ZMS.Version.nodes', ['{$}'])
            new_nodes = standard.string_list(REQUEST.get('nodes', ''))
            self.setConfProperty('ZMS.Version.active', new_active)
            self.setConfProperty('ZMS.Version.nodes', new_nodes)
            nodes = []
            if old_active == 1 and new_active == 0:
                nodes = old_nodes
            if old_active == 1 and new_active == 1:
                nodes = standard.difference_list(
                    old_nodes,
                    self.getConfProperty('ZMS.Version.nodes', ['{$}']))
            for node in nodes:
                ob = self.getLinkObj(node)
                if ob is not None:
                    try:
                        message += '[%s: %i]' % (node, ob.packHistory())
                    except:
                        message += '[%s: %s]' % (node, 'No history to pack')
            message = self.getZMILangStr('MSG_CHANGED') + message

        # Properties.
        # -----------
        elif key == 'properties':
            # Save.
            # ------
            if btn == 'BTN_SAVE':
                # Autocommit & Nodes.
                old_autocommit = self.autocommit
                new_autocommit = REQUEST.get('workflow', 0) == 0
                self.revision = REQUEST.get('revision', '0.0.0')
                self.autocommit = new_autocommit
                self.nodes = standard.string_list(REQUEST.get('nodes', ''))
                if old_autocommit == 0 and new_autocommit == 1:
                    self.doAutocommit(lang, REQUEST)
                message = self.getZMILangStr('MSG_CHANGED')

            # Clear.
            # ------
            elif btn == 'BTN_CLEAR':
                self.doAutocommit(lang, REQUEST)
                self.autocommit = 1
                self.activities = []
                self.transitions = []
                message = self.getZMILangStr('MSG_CHANGED')

            # Export.
            # -------
            elif btn == 'BTN_EXPORT':
                return exportXml(self, REQUEST, RESPONSE)

            # Import.
            # -------
            elif btn == 'BTN_IMPORT':
                f = REQUEST['file']
                if f:
                    filename = f.filename
                    xml = f
                else:
                    filename = REQUEST.get('init')
                    xml = open(_fileutil.getOSPath(filename), 'rb')
                self.importXml(xml)
                message = self.getZMILangStr('MSG_IMPORTED') % ('<i>%s</i>' %
                                                                filename)

        # Return with message.
        message = standard.url_quote(message)
        return RESPONSE.redirect(
            'manage_main?lang=%s&key=%s&manage_tabs_message=%s#_properties' %
            (lang, key, message))
예제 #19
0
파일: zms.py 프로젝트: zms-publishing/ZMS4
    def zms_version(self):
        """
      Try to obtain the version from package info if installed by pip
      otherwise read from version.txt and from svnversion
        
        1. installed by pip from PyPI
          (revision 'XXXX' in version.txt - package info of official releases does not contain revision)
        2. installed by pip from ZMSLabs w/ info by svn
          (revision 'svn-rXXXX' in package info due to setup.cfg)
        3. installed by pip from TAR-Ball w/o info by svn
          (revision 'XXXX' in version.txt due to nightly build - 'svn0' in package info due to setup.cfg)
        4. deployed to instance/Products
          (revision 'XXXX' in version.txt, maybe installed but unused package)
        5. checked out to instance/Products as working copy from svn 
          (revision 'REV' in version.txt, maybe installed but unused package)
      """
        from pkg_resources import WorkingSet, Requirement
        zms = WorkingSet().find(Requirement.parse('ZMS3'))
        pth = _fileutil.getOSPath(package_home(globals()))

        file = open(_fileutil.getOSPath(pth + '/version.txt'), 'r')
        version_txt = file.read()
        version = version_txt.strip().split('.')
        file.close()

        # return plain version info if it is a deployment specific format like
        # ZMS3-3.Y.Z.XXXX.prj-ABCD
        if len(version) != 4:
            return version_txt

        # obtain revision and return formatted version info
        # ZMS3-3.Y.Z.XXXX
        else:
            revision = version.pop()
            # get revision from pip if running as package
            if (zms is not None) and ('site-packages' in pth):
                version_pip = str(zms.version)
                if ('.svn-r' in version_pip):
                    # leave -r in revision to recognize as snapshot below
                    revision = version_pip.strip().split('.svn', 1)[1]
            # get revision from svnversion
            elif (revision == 'REV'):
                import subprocess
                version_svn = subprocess.Popen("svnversion",
                                               stdout=subprocess.PIPE,
                                               stderr=subprocess.PIPE,
                                               shell=True,
                                               cwd=pth,
                                               universal_newlines=True)
                revision = version_svn.communicate()[0].strip()
            # format revision info
            if (revision.startswith('export')):
                revision = ' (unknown build/snapshot)'
            # at moment there are 4-digits for builds
            elif len(revision) == 4:
                revision = ' (build #%s)' % revision
            # otherwise it is a development snapshot
            else:
                revision = ' (snapshot #%s)' % revision.replace('-r', '')

        return '.'.join(version) + revision
예제 #20
0
def resize(img, size, mode='resize', sffx='_thumbnail', qual=75):
  """
  Resize image.
  @rtype: C{MyImage}
  """
  from PIL import Image, ImageFile
  ImageFile.LOAD_TRUNCATED_IMAGES = True
  
  # Save image in temp-folder
  context = img.aq_parent
  tempfolder = tempfile.mktemp()
  filepath = _fileutil.getOSPath('%s/%s'%(tempfolder, img.filename))
  _fileutil.exportObj(img, filepath)
  
  # Resize SVG
  svg_dim = svgutil.get_dimensions(img)
  if svg_dim is not None:
    img = svgutil.set_dimensions(img,size)
    f = open(filepath, 'wb')
    f.write(img.getData())
    f.close()
  
  # Resize image
  else:
    im = Image.open(filepath)
    im = im.convert('RGB')
    maxdim = max(list(size))
    if mode == 'thumbnail':
      try:
        im.thumbnail((maxdim, maxdim), Image.ANTIALIAS)
      except:
        im.thumbnail((maxdim, maxdim))
    elif mode == 'resize':
      try:
        im = im.resize(size, Image.ANTIALIAS)
      except:
        im = im.resize(size)
    elif mode == 'square':
      try:
        width, height = im.size
        dst_width, dst_height = maxdim, maxdim
        if width > height:
          delta = width - height
          left = int(delta/2)
          upper = 0
          right = height + left
          lower = height
        else:
          delta = height - width
          left = 0
          upper = int(delta/2)
          right = width
          lower = width + upper
        im = im.crop(( left, upper, right, lower))
        im = im.resize((dst_width, dst_height), Image.ANTIALIAS)
      except:
        im.resize(size)
    im.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True)
  
  # Read resized image from file-system
  f = open(filepath, 'rb')
  result_data = f.read()
  f.close()
  
  # Remove temp-folder and images
  _fileutil.remove(tempfolder, deep=1)
  
  thumb_sffx = str(sffx)
  getfilename = _fileutil.extractFilename(filepath).split('.')
  filename = getfilename[0:-1]
  filename = ".".join(filename)
  filename = filename.replace('.', '_')
  extension = _fileutil.extractFileExt(filepath)
  result_filename = filename + thumb_sffx + '.' + extension
  result = {'data':result_data,'filename':result_filename}
  
  # Returns resulting image
  image = standard.ImageFromData(context, result['data'], result['filename'])
  return image
예제 #21
0
def initContent(self, filename, REQUEST):
  file = open(_fileutil.getOSPath(package_home(globals())+'/import/'+filename), 'rb')
  _importable.importFile( self, file, REQUEST, _importable.importContent)
  file.close()