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
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
amrani
erp5
Commits
3826a2f9
Commit
3826a2f9
authored
Jan 23, 2012
by
Łukasz Nowak
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master' into lazy_simulation_causality
parents
8383758b
220efc32
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
115 additions
and
14 deletions
+115
-14
bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Organisation_view/my_default_email_url_string.xml
...p5_base/Organisation_view/my_default_email_url_string.xml
+1
-1
bt5/erp5_base/bt/revision
bt5/erp5_base/bt/revision
+1
-1
bt5/erp5_base/bt/template_portal_type_allowed_content_type_list
...p5_base/bt/template_portal_type_allowed_content_type_list
+1
-1
bt5/erp5_base/bt/template_portal_type_id_list
bt5/erp5_base/bt/template_portal_type_id_list
+1
-1
bt5/erp5_dms/WorkflowTemplateItem/portal_workflow/document_publication_workflow/scripts/archiveVersion.xml
.../document_publication_workflow/scripts/archiveVersion.xml
+7
-2
bt5/erp5_dms/bt/revision
bt5/erp5_dms/bt/revision
+1
-1
erp5/util/benchmark/result.py
erp5/util/benchmark/result.py
+2
-2
product/ERP5/tests/testCRM.py
product/ERP5/tests/testCRM.py
+37
-0
product/ERP5OOo/tests/testDms.py
product/ERP5OOo/tests/testDms.py
+47
-2
product/ERP5Type/ConflictFree.py
product/ERP5Type/ConflictFree.py
+17
-3
No files found.
bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Organisation_view/my_default_email_url_string.xml
View file @
3826a2f9
...
@@ -107,7 +107,7 @@
...
@@ -107,7 +107,7 @@
<dictionary>
<dictionary>
<item>
<item>
<key>
<string>
_text
</string>
</key>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: here.getDefaultEmail().isDetailed()
</string>
</value>
<value>
<string>
python:
here.hasDefaultEmail() and
here.getDefaultEmail().isDetailed()
</string>
</value>
</item>
</item>
</dictionary>
</dictionary>
</pickle>
</pickle>
...
...
bt5/erp5_base/bt/revision
View file @
3826a2f9
1008
1009
\ No newline at end of file
\ No newline at end of file
bt5/erp5_base/bt/template_portal_type_allowed_content_type_list
View file @
3826a2f9
bt5/erp5_base/bt/template_portal_type_id_list
View file @
3826a2f9
bt5/erp5_dms/WorkflowTemplateItem/portal_workflow/document_publication_workflow/scripts/archiveVersion.xml
View file @
3826a2f9
...
@@ -66,19 +66,24 @@ if not reference:\n
...
@@ -66,19 +66,24 @@ if not reference:\n
portal = document.getPortalObject()\n
portal = document.getPortalObject()\n
portal_catalog = portal.portal_catalog\n
portal_catalog = portal.portal_catalog\n
language = document.getLanguage()\n
language = document.getLanguage()\n
search_kw = dict(reference=reference,\n
validation_state=validation_state,\n
# exclude current workflow changed document\n
uid=\'NOT %s\' %document.getUid())\n
if not language:\n
if not language:\n
# If language is None, we have to check is this document\n
# If language is None, we have to check is this document\n
# is language independent. In this case, archival is possible\n
# is language independent. In this case, archival is possible\n
# But if a document exists with same reference and defined\n
# But if a document exists with same reference and defined\n
# language, we can not do anything\n
# language, we can not do anything\n
for old_document in portal_catalog(
reference=reference, validation_state=validation_state
):\n
for old_document in portal_catalog(
**search_kw
):\n
old_document = old_document.getObject()\n
old_document = old_document.getObject()\n
if not old_document.getLanguage():\n
if not old_document.getLanguage():\n
old_document.archive()\n
old_document.archive()\n
return\n
return\n
\n
\n
# We can now archive all documents with same reference and language in published state\n
# We can now archive all documents with same reference and language in published state\n
for old_document in portal_catalog(reference=reference, language=language, validation_state=validation_state):\n
search_kw[\'language\'] = language\n
for old_document in portal_catalog(**search_kw):\n
old_document = old_document.getObject()\n
old_document = old_document.getObject()\n
old_document.archive()\n
old_document.archive()\n
</string>
</value>
</string>
</value>
...
...
bt5/erp5_dms/bt/revision
View file @
3826a2f9
1262
1263
\ No newline at end of file
\ No newline at end of file
erp5/util/benchmark/result.py
View file @
3826a2f9
...
@@ -197,7 +197,7 @@ class BenchmarkResult(object):
...
@@ -197,7 +197,7 @@ class BenchmarkResult(object):
result_list
.
extend
(
missing_result_n
*
[
-
1
])
result_list
.
extend
(
missing_result_n
*
[
-
1
])
def
exitSuite
(
self
,
with_error
=
False
):
def
exitSuite
(
self
,
with_error
=
False
):
elapsed_time
=
int
(
time
.
time
()
-
self
.
_current_use_case_elapsed_time
)
elapsed_time
=
time
.
time
()
-
self
.
_current_use_case_elapsed_time
if
with_error
:
if
with_error
:
if
self
.
_current_suite_dict
[
'expected'
]
!=
-
1
:
if
self
.
_current_suite_dict
[
'expected'
]
!=
-
1
:
...
@@ -217,7 +217,7 @@ class BenchmarkResult(object):
...
@@ -217,7 +217,7 @@ class BenchmarkResult(object):
self
.
_current_suite_dict
[
'expected'
])
self
.
_current_suite_dict
[
'expected'
])
self
.
_current_suite_dict
[
'all_use_case_result_list'
].
append
(
self
.
_current_suite_dict
[
'all_use_case_result_list'
].
append
(
(
self
.
_current_use_case_counter
,
elapsed_time
))
(
self
.
_current_use_case_counter
,
int
(
elapsed_time
)
))
if
self
.
_current_use_case_counter
!=
0
:
if
self
.
_current_use_case_counter
!=
0
:
self
.
_current_suite_dict
[
'use_case_stat'
].
add
(
self
.
_current_suite_dict
[
'use_case_stat'
].
add
(
...
...
product/ERP5/tests/testCRM.py
View file @
3826a2f9
...
@@ -1494,6 +1494,43 @@ class TestCRMMailSend(BaseTestCRM):
...
@@ -1494,6 +1494,43 @@ class TestCRMMailSend(BaseTestCRM):
self
.
assertEquals
(
new_event
.
getTitle
(),
real_title
)
self
.
assertEquals
(
new_event
.
getTitle
(),
real_title
)
self
.
assertEquals
(
new_event
.
getTextContent
(),
real_content
)
self
.
assertEquals
(
new_event
.
getTextContent
(),
real_content
)
def
test_cloneTicketAndEventList
(
self
):
"""
All events uses after script and interaciton
workflow add a test for clone
"""
portal
=
self
.
portal
event_list
=
[]
destination_list
=
[]
for
i
in
range
(
0
,
100
):
person
=
portal
.
person_module
.
newContent
(
portal_type
=
'Person'
,
title
=
'Person %s'
%
i
)
destination_list
.
append
(
person
)
campaing
=
portal
.
campaign_module
.
newContent
(
portal_type
=
'Campaign'
,
reference
=
'Test'
)
for
i
in
range
(
0
,
3
):
event
=
portal
.
event_module
.
newContent
(
portal_type
=
'Mail Message'
,
title
=
'Mail %s'
%
i
,
follow_up
=
campaing
.
getRelativeUrl
())
event
.
setDestinationList
([
x
.
getRelativeUrl
()
for
x
in
destination_list
])
event_list
.
append
(
event
)
self
.
stepTic
()
# use Ticket_cloneTicketAndEventList
campaing
.
Ticket_cloneTicketAndEventList
()
self
.
stepTic
()
cloned_campaign
=
[
x
for
x
in
portal
.
campaign_module
.
objectValues
()
if
x
!=
campaing
][
0
]
cloned_event_list
=
[
x
for
x
in
portal
.
event_module
.
objectValues
()
if
x
.
getFollowUpValue
()
==
cloned_campaign
]
self
.
assertEqual
(
campaing
.
getTitle
(),
cloned_campaign
.
getTitle
())
self
.
assertEqual
(
campaing
.
getReference
(),
cloned_campaign
.
getReference
())
for
i
in
range
(
0
,
3
):
self
.
assertSameSet
(
event_list
[
i
].
getDestinationValueList
(),
cloned_event_list
[
i
].
getDestinationValueList
())
def
test_Base_addEvent
(
self
):
def
test_Base_addEvent
(
self
):
"""Check Base_addEvent script with a logged in user.
"""Check Base_addEvent script with a logged in user.
"""
"""
...
...
product/ERP5OOo/tests/testDms.py
View file @
3826a2f9
...
@@ -2571,6 +2571,51 @@ return 1
...
@@ -2571,6 +2571,51 @@ return 1
self
.
_test_document_publication_workflow
(
'Text'
,
self
.
_test_document_publication_workflow
(
'Text'
,
'share_alive_action'
)
'share_alive_action'
)
def
test_document_publication_workflow_archiveVersion
(
self
):
""" Test old versions of a doc are auto archived. """
portal
=
self
.
portal
upload_file
=
makeFileUpload
(
'TEST-en-002.doc'
)
kw
=
dict
(
file
=
upload_file
,
synchronous_metadata_discovery
=
True
)
document_002
=
self
.
portal
.
Base_contribute
(
**
kw
)
document_002
.
publish
()
self
.
stepTic
()
document_003
=
document_002
.
Base_createCloneDocument
(
batch_mode
=
1
)
document_003
.
setVersion
(
'003'
)
document_003
.
publish
()
self
.
stepTic
()
self
.
assertEqual
(
'published'
,
document_003
.
getValidationState
())
self
.
assertEqual
(
'archived'
,
document_002
.
getValidationState
())
# check if in any case document doesn't archive itself
# (i.e. shared_alive -> published or any other similar chain)
document_004
=
document_003
.
Base_createCloneDocument
(
batch_mode
=
1
)
document_004
.
setVersion
(
'004'
)
document_004
.
shareAlive
()
self
.
stepTic
()
document_004
.
publish
()
self
.
stepTic
()
self
.
assertEqual
(
'published'
,
document_004
.
getValidationState
())
# check case when no language is used
document_nolang_005
=
document_004
.
Base_createCloneDocument
(
batch_mode
=
1
)
document_nolang_005
.
setVersion
(
'TEST-no-lang'
)
document_nolang_005
.
setVersion
(
'005'
)
document_nolang_005
.
setLanguage
(
None
)
document_nolang_005
.
publish
()
self
.
stepTic
()
self
.
assertEqual
(
'published'
,
document_nolang_005
.
getValidationState
())
document_nolang_006
=
document_nolang_005
.
Base_createCloneDocument
(
batch_mode
=
1
)
document_nolang_006
.
setVersion
(
'006'
)
document_nolang_006
.
shareAlive
()
self
.
stepTic
()
self
.
assertEqual
(
'archived'
,
document_nolang_005
.
getValidationState
())
self
.
assertEqual
(
'shared_alive'
,
document_nolang_006
.
getValidationState
())
class
TestDocumentWithSecurity
(
TestDocumentMixin
):
class
TestDocumentWithSecurity
(
TestDocumentMixin
):
username
=
'yusei'
username
=
'yusei'
...
@@ -2710,8 +2755,8 @@ class TestDocumentPerformance(TestDocumentMixin):
...
@@ -2710,8 +2755,8 @@ class TestDocumentPerformance(TestDocumentMixin):
def
test_suite
():
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
TestDocument
))
suite
.
addTest
(
unittest
.
makeSuite
(
TestDocument
))
#
suite.addTest(unittest.makeSuite(TestDocumentWithSecurity))
suite
.
addTest
(
unittest
.
makeSuite
(
TestDocumentWithSecurity
))
#
suite.addTest(unittest.makeSuite(TestDocumentPerformance))
suite
.
addTest
(
unittest
.
makeSuite
(
TestDocumentPerformance
))
return
suite
return
suite
...
...
product/ERP5Type/ConflictFree.py
View file @
3826a2f9
...
@@ -2,6 +2,9 @@ from persistent import Persistent
...
@@ -2,6 +2,9 @@ from persistent import Persistent
class
ConflictFreeLog
(
Persistent
):
class
ConflictFreeLog
(
Persistent
):
"""Scalable conflict-free append-only double-linked list
"""Scalable conflict-free append-only double-linked list
Wasted ZODB space due to conflicts is roughly proportional to the number of
clients that continuously add items at the same time.
"""
"""
_prev
=
_next
=
None
_prev
=
_next
=
None
_tail_count
=
0
_tail_count
=
0
...
@@ -70,9 +73,20 @@ class ConflictFreeLog(Persistent):
...
@@ -70,9 +73,20 @@ class ConflictFreeLog(Persistent):
break
break
def
_p_resolveConflict
(
self
,
old_state
,
saved_state
,
new_state
):
def
_p_resolveConflict
(
self
,
old_state
,
saved_state
,
new_state
):
if
old_state
.
get
(
'_tail_count'
,
0
)
==
new_state
.
get
(
'_tail_count'
,
0
):
# May be called for the head and its predecessor.
i
=
len
(
old_state
[
'_log'
])
old_tail_count
=
old_state
.
get
(
'_tail_count'
,
0
)
else
:
d
=
new_state
.
get
(
'_tail_count'
,
0
)
-
old_tail_count
if
d
:
if
old_tail_count
==
saved_state
.
get
(
'_tail_count'
,
0
):
# We are the first one to rotate. Really rotate.
# Only the head conflicts in this case.
return
dict
(
new_state
,
_log
=
saved_state
[
'_log'
][
d
:]
+
new_state
[
'_log'
])
# Another node rotated before us. Revert our rotation.
# Both the head and its predecessor conflict.
i
=
0
i
=
0
else
:
# We didn't rotate. Just add our items to saved head.
# Only the head conflicts.
i
=
len
(
old_state
[
'_log'
])
saved_state
[
'_log'
].
extend
(
new_state
[
'_log'
][
i
:])
saved_state
[
'_log'
].
extend
(
new_state
[
'_log'
][
i
:])
return
saved_state
return
saved_state
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