Commit 83757f4e authored by Bryton Lacquement's avatar Bryton Lacquement 🚪

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

parent 669eac14
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
# #
############################################################################## ##############################################################################
from DateTime import DateTime
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from Products.ERP5Type.Base import WorkflowMethod from Products.ERP5Type.Base import WorkflowMethod
from Products.ERP5Type import Permissions, PropertySheet from Products.ERP5Type import Permissions, PropertySheet
...@@ -34,8 +35,7 @@ from Products.ERP5.Document.Document import Document, VALID_TEXT_FORMAT_LIST ...@@ -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 VALID_IMAGE_FORMAT_LIST
from Products.ERP5.Document.Document import ConversionError from Products.ERP5.Document.Document import ConversionError
from Products.ERP5Type.Base import Base, removeIContentishInterface from Products.ERP5Type.Base import Base, removeIContentishInterface
from Products.CMFDefault.File import File as CMFFile import OFS.Image
from OFS.Image import Pdata
from cStringIO import StringIO from cStringIO import StringIO
from Products.ERP5Type.Utils import deprecated from Products.ERP5Type.Utils import deprecated
...@@ -48,7 +48,7 @@ def _unpackData(data): ...@@ -48,7 +48,7 @@ def _unpackData(data):
_MARKER = object() _MARKER = object()
class File(Document, CMFFile): class File(Document, OFS.Image.File):
""" """
A File can contain raw data which can be uploaded and downloaded. A File can contain raw data which can be uploaded and downloaded.
It is the root class of Image, OOoDocument (ERP5OOo product), It is the root class of Image, OOoDocument (ERP5OOo product),
...@@ -94,6 +94,25 @@ class File(Document, CMFFile): ...@@ -94,6 +94,25 @@ class File(Document, CMFFile):
# OFS.File has an overloaded __str__ that returns the file content # OFS.File has an overloaded __str__ that returns the file content
__str__ = object.__str__ __str__ = object.__str__
def CreationDate():
# Required to not create a regression after dropping the Products.CMFDefault
# dependency (cf product.ERP5Type.Base.Base.getCreationDate)
pass
security.declarePrivate('_isNotEmpty')
def _isNotEmpty(self, file):
"""from Products.CMFDefault.File"""
if not file:
return 0
elif type(file) is str or hasattr(file, 'filename'):
return 1
elif not hasattr(file, 'read'):
return 0
file.seek(0, 2)
t = file.tell()
file.seek(0)
return 1 if t else 0
### Special edit method ### Special edit method
security.declarePrivate( '_edit' ) security.declarePrivate( '_edit' )
def _edit(self, **kw): def _edit(self, **kw):
...@@ -145,7 +164,12 @@ class File(Document, CMFFile): ...@@ -145,7 +164,12 @@ class File(Document, CMFFile):
str(data.read()) == str(self.getData()): str(data.read()) == str(self.getData()):
# Same data as previous, no need to change it's content # Same data as previous, no need to change it's content
return return
CMFFile._edit(self, precondition=precondition, file=data)
# from Products.CMFDefault.File
if precondition: self.precondition = precondition
elif self.precondition: del self.precondition
if self._isNotEmpty(data):
self.manage_upload(data)
security.declareProtected(Permissions.ModifyPortalContent,'setFile') security.declareProtected(Permissions.ModifyPortalContent,'setFile')
def setFile(self, data, precondition=None): def setFile(self, data, precondition=None):
...@@ -193,11 +217,16 @@ class File(Document, CMFFile): ...@@ -193,11 +217,16 @@ class File(Document, CMFFile):
return str(data) return str(data)
# DAV Support # 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', security.declareProtected(Permissions.FTPAccess, 'manage_FTPstat',
'manage_FTPlist') 'manage_FTPlist')
manage_FTPlist = CMFFile.manage_FTPlist manage_FTPlist = OFS.Image.File.manage_FTPlist
manage_FTPstat = CMFFile.manage_FTPstat manage_FTPstat = OFS.Image.File.manage_FTPstat
security.declareProtected(Permissions.AccessContentsInformation, 'getMimeTypeAndContent') security.declareProtected(Permissions.AccessContentsInformation, 'getMimeTypeAndContent')
def getMimeTypeAndContent(self): def getMimeTypeAndContent(self):
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
Portal class Portal class
""" """
from DateTime import DateTime
from six.moves import map from six.moves import map
import threading import threading
from weakref import ref as weakref from weakref import ref as weakref
...@@ -26,7 +27,7 @@ from Products.SiteErrorLog.SiteErrorLog import manage_addErrorLog ...@@ -26,7 +27,7 @@ from Products.SiteErrorLog.SiteErrorLog import manage_addErrorLog
from ZPublisher import BeforeTraverse from ZPublisher import BeforeTraverse
from ZPublisher.BaseRequest import RequestContainer from ZPublisher.BaseRequest import RequestContainer
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from Products.CMFDefault.Portal import CMFSite from Products.CMFCore.PortalObject import PortalObjectBase
from Products.ERP5Type import Permissions from Products.ERP5Type import Permissions
from Products.ERP5Type.Core.Folder import FolderMixIn from Products.ERP5Type.Core.Folder import FolderMixIn
from Acquisition import aq_base from Acquisition import aq_base
...@@ -228,7 +229,7 @@ class _site(threading.local): ...@@ -228,7 +229,7 @@ class _site(threading.local):
getSite, setSite = _site() getSite, setSite = _site()
class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): class ERP5Site(FolderMixIn, PortalObjectBase, CacheCookieMixin):
""" """
The *only* function this class should have is to help in the setup 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. of a new ERP5. It should not assist in the functionality at all.
...@@ -269,6 +270,15 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): ...@@ -269,6 +270,15 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
security = ClassSecurityInfo() security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation) 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') security.declarePublic('isSubtreeIndexable')
def isSubtreeIndexable(self): def isSubtreeIndexable(self):
""" """
...@@ -400,7 +410,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): ...@@ -400,7 +410,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
return self.index_html() return self.index_html()
def __of__(self, parent): def __of__(self, parent):
self = CMFSite.__of__(self, parent) self = PortalObjectBase.__of__(self, parent)
# Use a transactional variable for performance reason, # Use a transactional variable for performance reason,
# since ERP5Site.__of__ is called quite often. # since ERP5Site.__of__ is called quite often.
tv = getTransactionalVariable() tv = getTransactionalVariable()
...@@ -470,7 +480,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): ...@@ -470,7 +480,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
path_item_list=path_item_list, path_item_list=path_item_list,
new_id=new_id) new_id=new_id)
# Rename the object # 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) REQUEST=REQUEST)
...@@ -588,7 +598,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): ...@@ -588,7 +598,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
# _getProperty is missing, but since there are no protected properties # _getProperty is missing, but since there are no protected properties
# on an ERP5 Site, we can just use getProperty instead. # on an ERP5 Site, we can just use getProperty instead.
_getProperty = CMFSite.getProperty _getProperty = PortalObjectBase.getProperty
security.declareProtected(Permissions.AccessContentsInformation, 'getUid') security.declareProtected(Permissions.AccessContentsInformation, 'getUid')
def getUid(self): def getUid(self):
...@@ -702,7 +712,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): ...@@ -702,7 +712,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
email_from_address, email_from_name, email_from_address, email_from_name,
validate_email validate_email
): ):
CMFSite.setupDefaultProperties(self, p, title, description, PortalObjectBase.setupDefaultProperties(self, p, title, description,
email_from_address, email_from_name, email_from_address, email_from_name,
validate_email) validate_email)
...@@ -1866,7 +1876,7 @@ factory_type_information = () # No original CMF portal_types installed by defaul ...@@ -1866,7 +1876,7 @@ factory_type_information = () # No original CMF portal_types installed by defaul
class PortalGenerator: class PortalGenerator:
klass = CMFSite klass = PortalObjectBase
def setupTools(self, p): def setupTools(self, p):
"""Set up initial tools""" """Set up initial tools"""
......
...@@ -682,10 +682,9 @@ class TestDocument(TestDocumentMixin): ...@@ -682,10 +682,9 @@ class TestDocument(TestDocumentMixin):
for document_type in portal.getPortalDocumentTypeList(): for document_type in portal.getPortalDocumentTypeList():
module = portal.getDefaultModule(document_type) module = portal.getDefaultModule(document_type)
obj = module.newContent(portal_type=document_type) obj = module.newContent(portal_type=document_type)
self.assertNotEquals(obj.getCreationDate(), self.assertIsInstance(portal.creation_date, DateTime)
module.getCreationDate()) self.assertLess(portal.creation_date, obj.getCreationDate())
self.assertNotEquals(obj.getCreationDate(), self.assertIsNone(module.getCreationDate())
portal.CreationDate())
def test_06_ProcessingStateOfAClonedDocument(self): def test_06_ProcessingStateOfAClonedDocument(self):
""" """
......
...@@ -85,7 +85,6 @@ from CopySupport import CopyContainer, CopyError,\ ...@@ -85,7 +85,6 @@ from CopySupport import CopyContainer, CopyError,\
from Errors import DeferredCatalogError, UnsupportedWorkflowMethod from Errors import DeferredCatalogError, UnsupportedWorkflowMethod
from Products.CMFActivity.ActiveObject import ActiveObject from Products.CMFActivity.ActiveObject import ActiveObject
from Products.ERP5Type.Accessor.Accessor import Accessor as Method 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.Message import Message
from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod, super_user from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod, super_user
...@@ -3226,9 +3225,9 @@ class Base( CopyContainer, ...@@ -3226,9 +3225,9 @@ class Base( CopyContainer,
if history) if history)
except ValueError: except ValueError:
pass pass
if getattr(aq_base(self), 'CreationDate', None) is not None: # "CreationDate" is a marker used only here
return asDate(self.CreationDate()) if getattr(aq_base(self), 'CreationDate', None):
return None # JPS-XXX - try to find a way to return a creation date instead of None return self.creation_date.toZone(DateTime().timezone())
security.declareProtected(Permissions.AccessContentsInformation, 'getModificationDate') security.declareProtected(Permissions.AccessContentsInformation, 'getModificationDate')
def getModificationDate(self): def getModificationDate(self):
...@@ -3257,7 +3256,13 @@ class Base( CopyContainer, ...@@ -3257,7 +3256,13 @@ class Base( CopyContainer,
# Return a copy of history time, to prevent modification # Return a copy of history time, to prevent modification
return DateTime(max_date) return DateTime(max_date)
if self._p_serial: 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 # Layout management
security.declareProtected(Permissions.AccessContentsInformation, 'getApplicableLayout') security.declareProtected(Permissions.AccessContentsInformation, 'getApplicableLayout')
......
...@@ -38,6 +38,7 @@ import transaction ...@@ -38,6 +38,7 @@ import transaction
from random import randint from random import randint
from unittest import expectedFailure from unittest import expectedFailure
from Acquisition import aq_base from Acquisition import aq_base
from DateTime import DateTime
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import DummyLocalizer from Products.ERP5Type.tests.utils import DummyLocalizer
from zLOG import INFO from zLOG import INFO
...@@ -2570,8 +2571,9 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): ...@@ -2570,8 +2571,9 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor):
portal = self.getPortalObject() portal = self.getPortalObject()
folder = self.getOrganisationModule() folder = self.getOrganisationModule()
object = folder.newContent(portal_type='Organisation') object = folder.newContent(portal_type='Organisation')
self.assertNotEquals(object.getCreationDate(), portal.CreationDate()) self.assertIsInstance(portal.creation_date, DateTime)
self.assertNotEquals(object.getCreationDate(), folder.getCreationDate()) self.assertLess(portal.creation_date, object.getCreationDate())
self.assertIsNone(folder.getCreationDate())
def test_copyWithoutModificationRight(self): def test_copyWithoutModificationRight(self):
""" """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment