Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
Romain Courteaud
erp5
Commits
12e4cc8b
Commit
12e4cc8b
authored
Sep 25, 2019
by
Bryton Lacquement
🚪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Get rid of Products.CMFDefault.{File.File,Portal.CMFSite}
parent
956599fa
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
68 additions
and
33 deletions
+68
-33
bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_finishPdfCreation.py
...kins/erp5_corporate_identity/WebPage_finishPdfCreation.py
+3
-1
product/ERP5/Document/File.py
product/ERP5/Document/File.py
+29
-12
product/ERP5/ERP5Site.py
product/ERP5/ERP5Site.py
+17
-7
product/ERP5OOo/tests/testDms.py
product/ERP5OOo/tests/testDms.py
+4
-5
product/ERP5Type/Base.py
product/ERP5Type/Base.py
+9
-5
product/ERP5Type/WebDAVSupport.py
product/ERP5Type/WebDAVSupport.py
+2
-1
product/ERP5Type/tests/testERP5Type.py
product/ERP5Type/tests/testERP5Type.py
+4
-2
No files found.
bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_finishPdfCreation.py
View file @
12e4cc8b
...
...
@@ -17,6 +17,8 @@ Save, download or return generated PDF Document
# doc_pdf_file pdf content to store
# doc_aggregate_list not applicable (only used for events)
from
io
import
BytesIO
if
doc_save
:
dms_module
=
getattr
(
context
,
'document_module'
,
None
)
if
dms_module
is
not
None
:
...
...
@@ -31,7 +33,7 @@ if doc_save:
)
document
.
edit
(
source_reference
=
''
.
join
([
doc_reference
,
'.pdf'
]),
file
=
doc_pdf_file
file
=
BytesIO
(
doc_pdf_file
)
)
document
.
setContentType
(
"application/pdf"
)
...
...
product/ERP5/Document/File.py
View file @
12e4cc8b
...
...
@@ -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
from
OFS.Image
import
File
as
OFS_File
from
cStringIO
import
StringIO
from
Products.ERP5Type.Utils
import
deprecated
...
...
@@ -48,7 +48,7 @@ def _unpackData(data):
_MARKER
=
object
()
class
File
(
Document
,
CMF
File
):
class
File
(
Document
,
OFS_
File
):
"""
A File can contain raw data which can be uploaded and downloaded.
It is the root class of Image, OOoDocument (ERP5OOo product),
...
...
@@ -112,7 +112,13 @@ class File(Document, CMFFile):
filename
=
kw
.
get
(
'filename'
)
if
filename
:
self
.
_setFilename
(
filename
)
if
self
.
_isNotEmpty
(
file_object
):
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
)
...
...
@@ -140,11 +146,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
):
...
...
@@ -192,11 +204,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_File
.
PUT
(
self
,
REQUEST
,
RESPONSE
)
self
.
reindexObject
()
security
.
declareProtected
(
Permissions
.
FTPAccess
,
'manage_FTPstat'
,
'manage_FTPlist'
)
manage_FTPlist
=
CMF
File
.
manage_FTPlist
manage_FTPstat
=
CMF
File
.
manage_FTPstat
manage_FTPlist
=
OFS_
File
.
manage_FTPlist
manage_FTPstat
=
OFS_
File
.
manage_FTPstat
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'getMimeTypeAndContent'
)
def
getMimeTypeAndContent
(
self
):
...
...
product/ERP5/ERP5Site.py
View file @
12e4cc8b
...
...
@@ -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.CMF
Default.Portal
import
CMFSit
e
from
Products.CMF
Core.PortalObject
import
PortalObjectBas
e
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
,
CMFSit
e
,
CacheCookieMixin
):
class
ERP5Site
(
FolderMixIn
,
PortalObjectBas
e
,
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
):
"""
...
...
@@ -409,7 +419,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
return
self
.
index_html
()
def
__of__
(
self
,
parent
):
self
=
CMFSit
e
.
__of__
(
self
,
parent
)
self
=
PortalObjectBas
e
.
__of__
(
self
,
parent
)
# Use a transactional variable for performance reason,
# since ERP5Site.__of__ is called quite often.
tv
=
getTransactionalVariable
()
...
...
@@ -479,7 +489,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
path_item_list
=
path_item_list
,
new_id
=
new_id
)
# Rename the object
return
CMFSit
e
.
manage_renameObject
(
self
,
id
=
id
,
new_id
=
new_id
,
return
PortalObjectBas
e
.
manage_renameObject
(
self
,
id
=
id
,
new_id
=
new_id
,
REQUEST
=
REQUEST
)
...
...
@@ -597,7 +607,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
=
CMFSit
e
.
getProperty
_getProperty
=
PortalObjectBas
e
.
getProperty
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'getUid'
)
def
getUid
(
self
):
...
...
@@ -711,7 +721,7 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin):
email_from_address
,
email_from_name
,
validate_email
):
CMFSit
e
.
setupDefaultProperties
(
self
,
p
,
title
,
description
,
PortalObjectBas
e
.
setupDefaultProperties
(
self
,
p
,
title
,
description
,
email_from_address
,
email_from_name
,
validate_email
)
...
...
@@ -1862,7 +1872,7 @@ factory_type_information = () # No original CMF portal_types installed by defaul
class
PortalGenerator
:
klass
=
CMFSit
e
klass
=
PortalObjectBas
e
def
setupTools
(
self
,
p
):
"""Set up initial tools"""
...
...
product/ERP5OOo/tests/testDms.py
View file @
12e4cc8b
...
...
@@ -680,10 +680,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
):
"""
...
...
@@ -2884,7 +2883,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
()
...
...
product/ERP5Type/Base.py
View file @
12e4cc8b
...
...
@@ -83,7 +83,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'
)
...
...
product/ERP5Type/WebDAVSupport.py
View file @
12e4cc8b
...
...
@@ -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
()
...
...
product/ERP5Type/tests/testERP5Type.py
View file @
12e4cc8b
...
...
@@ -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
...
...
@@ -2590,8 +2591,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
):
"""
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment