Commit cf2720a7 by Bryton Lacquement

Get rid of Products.CMFDefault.{File.File,Portal.CMFSite}

1 parent daf42ca5
......@@ -27,6 +27,7 @@
#
##############################################################################
from DateTime import DateTime
from AccessControl import ClassSecurityInfo
from Products.ERP5Type.Base import WorkflowMethod
from Products.ERP5Type import Permissions, PropertySheet
......@@ -34,8 +35,7 @@ from Products.ERP5.Document.Document import Document, VALID_TEXT_FORMAT_LIST
from Products.ERP5.Document.Document import VALID_IMAGE_FORMAT_LIST
from Products.ERP5.Document.Document import ConversionError
from Products.ERP5Type.Base import Base, removeIContentishInterface
from Products.CMFDefault.File import File as CMFFile
from OFS.Image import Pdata
import OFS.Image
from cStringIO import StringIO
from Products.ERP5Type.Utils import deprecated
......@@ -48,7 +48,7 @@ def _unpackData(data):
_MARKER = object()
class File(Document, CMFFile):
class File(Document, OFS.Image.File):
"""
A File can contain raw data which can be uploaded and downloaded.
It is the root class of Image, OOoDocument (ERP5OOo product),
......@@ -113,8 +113,14 @@ class File(Document, CMFFile):
filename = kw.get('filename')
if filename:
self._setFilename(filename)
if self._isNotEmpty(file_object):
self._setFile(file_object, precondition=precondition)
if file_object is not None:
# XXX: Rather than doing nothing if empty, consider changing:
# - _update_image_info to clear metadata
# - interactions to do nothing (or else?)
file_object.seek(0, 2)
if file_object.tell():
file_object.seek(0)
self._setFile(file_object, precondition=precondition)
Base._edit(self, **kw)
security.declareProtected( Permissions.ModifyPortalContent, 'edit' )
......@@ -141,11 +147,17 @@ class File(Document, CMFFile):
return None
def _setFile(self, data, precondition=None):
if data is not None and self.hasData() and \
str(data.read()) == str(self.getData()):
# Same data as previous, no need to change it's content
if data is not None and \
str(data.read()) == (self.hasData() and str(self.getData())):
# Same data as previous, no need to change its content
return
CMFFile._edit(self, precondition=precondition, file=data)
# from Products.CMFDefault.File
if precondition: self.precondition = precondition
elif self.precondition: del self.precondition
if data is not None and data.tell():
data.seek(0)
self.manage_upload(data)
security.declareProtected(Permissions.ModifyPortalContent,'setFile')
def setFile(self, data, precondition=None):
......@@ -193,11 +205,16 @@ class File(Document, CMFFile):
return str(data)
# DAV Support
PUT = CMFFile.PUT
security.declareProtected(Permissions.ModifyPortalContent, 'PUT')
def PUT(self, REQUEST, RESPONSE):
"""from Products.CMFDefault.File"""
OFS.Image.File.PUT(self, REQUEST, RESPONSE)
self.reindexObject()
security.declareProtected(Permissions.FTPAccess, 'manage_FTPstat',
'manage_FTPlist')
manage_FTPlist = CMFFile.manage_FTPlist
manage_FTPstat = CMFFile.manage_FTPstat
manage_FTPlist = OFS.Image.File.manage_FTPlist
manage_FTPstat = OFS.Image.File.manage_FTPstat
security.declareProtected(Permissions.AccessContentsInformation, 'getMimeTypeAndContent')
def getMimeTypeAndContent(self):
......
......@@ -15,6 +15,7 @@
Portal class
"""
from DateTime import DateTime
from six.moves import map
import threading
from weakref import ref as weakref
......@@ -26,7 +27,7 @@ from Products.SiteErrorLog.SiteErrorLog import manage_addErrorLog
from ZPublisher import BeforeTraverse
from ZPublisher.BaseRequest import RequestContainer
from AccessControl import ClassSecurityInfo
from Products.CMFDefault.Portal import CMFSite
from Products.CMFCore.PortalObject import PortalObjectBase
from Products.ERP5Type import Permissions
from Products.ERP5Type.Core.Folder import FolderMixIn
from Acquisition import aq_base
......@@ -230,7 +231,7 @@ getSite, setSite = _site()
_missing_tools_registered = None
class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
class ERP5Site(FolderMixIn, PortalObjectBase, CacheCookieMixin):
"""
The *only* function this class should have is to help in the setup
of a new ERP5. It should not assist in the functionality at all.
......@@ -271,6 +272,15 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
def __init__(self, id):
PortalObjectBase.__init__(self, id)
self.creation_date = DateTime()
security.declarePrivate('reindexObject')
def reindexObject(self, idxs=[]):
"""from Products.CMFDefault.Portal"""
pass
security.declarePublic('isSubtreeIndexable')
def isSubtreeIndexable(self):
"""
......@@ -410,7 +420,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
return self.index_html()
def __of__(self, parent):
self = CMFSite.__of__(self, parent)
self = PortalObjectBase.__of__(self, parent)
# Use a transactional variable for performance reason,
# since ERP5Site.__of__ is called quite often.
tv = getTransactionalVariable()
......@@ -480,7 +490,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
path_item_list=path_item_list,
new_id=new_id)
# Rename the object
return CMFSite.manage_renameObject(self, id=id, new_id=new_id,
return PortalObjectBase.manage_renameObject(self, id=id, new_id=new_id,
REQUEST=REQUEST)
......@@ -598,7 +608,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
# _getProperty is missing, but since there are no protected properties
# on an ERP5 Site, we can just use getProperty instead.
_getProperty = CMFSite.getProperty
_getProperty = PortalObjectBase.getProperty
security.declareProtected(Permissions.AccessContentsInformation, 'getUid')
def getUid(self):
......@@ -712,7 +722,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
email_from_address, email_from_name,
validate_email
):
CMFSite.setupDefaultProperties(self, p, title, description,
PortalObjectBase.setupDefaultProperties(self, p, title, description,
email_from_address, email_from_name,
validate_email)
......@@ -1876,7 +1886,7 @@ factory_type_information = () # No original CMF portal_types installed by defaul
class PortalGenerator:
klass = CMFSite
klass = PortalObjectBase
def setupTools(self, p):
"""Set up initial tools"""
......
......@@ -682,10 +682,9 @@ class TestDocument(TestDocumentMixin):
for document_type in portal.getPortalDocumentTypeList():
module = portal.getDefaultModule(document_type)
obj = module.newContent(portal_type=document_type)
self.assertNotEquals(obj.getCreationDate(),
module.getCreationDate())
self.assertNotEquals(obj.getCreationDate(),
portal.CreationDate())
self.assertIsInstance(portal.creation_date, DateTime)
self.assertLess(portal.creation_date, obj.getCreationDate())
self.assertIsNone(module.getCreationDate())
def test_06_ProcessingStateOfAClonedDocument(self):
"""
......@@ -2886,7 +2885,7 @@ class TestDocumentWithSecurity(TestDocumentMixin):
reference='Foo_001',
title='Foo_OO1')
f = makeFileUpload('Foo_001.odt')
text_document.edit(file=f.read())
text_document.edit(file=f)
f.close()
self.tic()
......
......@@ -85,7 +85,6 @@ from CopySupport import CopyContainer, CopyError,\
from Errors import DeferredCatalogError, UnsupportedWorkflowMethod
from Products.CMFActivity.ActiveObject import ActiveObject
from Products.ERP5Type.Accessor.Accessor import Accessor as Method
from Products.ERP5Type.Accessor.TypeDefinition import asDate
from Products.ERP5Type.Message import Message
from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod, super_user
......@@ -3226,9 +3225,8 @@ class Base( CopyContainer,
if history)
except ValueError:
pass
if getattr(aq_base(self), 'CreationDate', None) is not None:
return asDate(self.CreationDate())
return None # JPS-XXX - try to find a way to return a creation date instead of None
if getattr(aq_base(self), 'creation_date', None):
return self.creation_date.toZone(DateTime().timezone())
security.declareProtected(Permissions.AccessContentsInformation, 'getModificationDate')
def getModificationDate(self):
......@@ -3257,7 +3255,13 @@ class Base( CopyContainer,
# Return a copy of history time, to prevent modification
return DateTime(max_date)
if self._p_serial:
return DateTime(TimeStamp(self._p_serial).timeTime())
return DateTime(self._p_mtime)
security.declareProtected(Permissions.AccessContentsInformation, 'modified')
def modified(self):
warnings.warn('modified is a deprecated alias to getModificationDate.',
DeprecationWarning)
return self.getModificationDate()
# Layout management
security.declareProtected(Permissions.AccessContentsInformation, 'getApplicableLayout')
......
......@@ -15,6 +15,7 @@
import collections
import email
from io import BytesIO
import re
import transaction
from lxml import html
......@@ -80,7 +81,7 @@ class TextContent:
headers = self.parseHeadersFromText(body)
content_type = REQUEST.get_header('Content-Type', '')
headers.setdefault('content_type', content_type)
headers['file'] = body
headers['file'] = BytesIO(body)
self._edit(**headers)
except ResourceLockedError, msg:
transaction.abort()
......
......@@ -38,6 +38,7 @@ import transaction
from random import randint
from unittest import expectedFailure
from Acquisition import aq_base
from DateTime import DateTime
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import DummyLocalizer
from zLOG import INFO
......@@ -2570,8 +2571,9 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor):
portal = self.getPortalObject()
folder = self.getOrganisationModule()
object = folder.newContent(portal_type='Organisation')
self.assertNotEquals(object.getCreationDate(), portal.CreationDate())
self.assertNotEquals(object.getCreationDate(), folder.getCreationDate())
self.assertIsInstance(portal.creation_date, DateTime)
self.assertLess(portal.creation_date, object.getCreationDate())
self.assertIsNone(folder.getCreationDate())
def test_copyWithoutModificationRight(self):
"""
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!