[Erp5-report] r35214 nicolas - /erp5/trunk/products/ERP5/mixin/downloadable.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed May 12 15:08:07 CEST 2010


Author: nicolas
Date: Wed May 12 15:08:06 2010
New Revision: 35214

URL: http://svn.erp5.org?rev=35214&view=rev
Log:
Add downloadable mixin which follows downloadable interface

Added:
    erp5/trunk/products/ERP5/mixin/downloadable.py

Added: erp5/trunk/products/ERP5/mixin/downloadable.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/mixin/downloadable.py?rev=35214&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/mixin/downloadable.py (added)
+++ erp5/trunk/products/ERP5/mixin/downloadable.py [utf8] Wed May 12 15:08:06 2010
@@ -1,0 +1,110 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
+#                    Nicolas Delaby <nicolas at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+from AccessControl import ClassSecurityInfo
+from Products.ERP5Type import Permissions
+from Products.CMFCore.utils import getToolByName, _setCacheHeaders,\
+    _ViewEmulator
+
+class DownloadableMixin:
+  security = ClassSecurityInfo()
+
+  ### Content processing methods
+  security.declareProtected(Permissions.View, 'index_html')
+  def index_html(self, REQUEST, RESPONSE, format=None, **kw):
+    """
+      We follow here the standard Zope API for files and images
+      and extend it to support format conversion. The idea
+      is that an image which ID is "something.jpg" should
+      ne directly accessible through the URL
+      /a/b/something.jpg. The same is true for a file and
+      for any document type which primary purpose is to
+      be used by a helper application rather than displayed
+      as HTML in a web browser. Exceptions to this approach
+      include Web Pages which are intended to be primarily rendered
+      withing the layout of a Web Site or withing a standard ERP5 page.
+      Please refer to the index_html of TextDocument.
+
+      Should return appropriate format (calling convert
+      if necessary) and set headers.
+
+      format -- the format specied in the form of an extension
+      string (ex. jpeg, html, text, txt, etc.)
+
+      **kw -- can be various things - e.g. resolution
+
+    """
+    from Products.ERP5.Document.Document import VALID_TEXT_FORMAT_LIST,\
+                                                        VALID_IMAGE_FORMAT_LIST
+    web_cache_kw = kw.copy()
+    web_cache_kw['format'] = format
+    _setCacheHeaders(_ViewEmulator().__of__(self), web_cache_kw)
+
+    method = self._getTypeBasedMethod('checkConversionFormatPermission',
+                 fallback_script_id='Document_checkConversionFormatPermission')
+    if not method(format=format):
+      raise Unauthorized("OOoDocument: user does not have enough permission'\
+                         ' to access document in %s format" %\
+                                                        (format or 'original'))
+
+    mime, data = self.convert(format, **kw)
+    if not format:
+      # Guess the format from original mimetype
+      mimetypes_registry = getToolByName(self.getPortalObject(),
+                                                          'mimetypes_registry')
+      mimetype_object_list = mimetypes_registry.lookup(mime)
+      for mimetype_object in mimetype_object_list:
+        if mimetype_object.extensions:
+          format = mimetype_object.extensions[0]
+          break
+        elif mimetype_object.globs:
+          format = mimetype_object.globs.strip('*.')
+          break
+
+    RESPONSE.setHeader('Content-Length', len(data))
+    if format in VALID_TEXT_FORMAT_LIST:
+      RESPONSE.setHeader('Content-Type', '%s; charset=utf-8' % mime)
+    else:
+      RESPONSE.setHeader('Content-Type', mime)
+    if format not in (VALID_TEXT_FORMAT_LIST + VALID_IMAGE_FORMAT_LIST):
+      # need to return it as attachment
+      filename = self.getStandardFileName(format=format)
+      RESPONSE.setHeader('Content-Disposition',
+                         'attachment; filename="%s"' % filename)
+      RESPONSE.setHeader('Accept-Ranges', 'bytes')
+    return str(data)
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                                                                  'index_html')
+  def getStandardFileName(self, format=None):
+    """Returns the document coordinates as a standard file name. This
+    method is the reverse of getPropertyDictFromFileName.
+    """
+    method = self._getTypeBasedMethod('getStandardFileName',
+                             fallback_script_id='Document_getStandardFileName')
+    return method(format=format)




More information about the Erp5-report mailing list