Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
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
Léo-Paul Géneau
slapos.core
Commits
55fc2d9f
Commit
55fc2d9f
authored
Feb 25, 2022
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
slapos_cloud: Add Person.notify() API
Used to create support requests to send users notifications.
parent
76618994
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
411 additions
and
0 deletions
+411
-0
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudPersonSlapInterfaceWorkflow.py
...s/test.erp5.testSlapOSCloudPersonSlapInterfaceWorkflow.py
+205
-0
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/script_Person_notify.py
...ow/person_slap_interface_workflow/script_Person_notify.py
+60
-0
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/script_Person_notify.xml
...w/person_slap_interface_workflow/script_Person_notify.xml
+76
-0
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/state_draft.xml
...l_workflow/person_slap_interface_workflow/state_draft.xml
+1
-0
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/state_open_order_created.xml
...rson_slap_interface_workflow/state_open_order_created.xml
+1
-0
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/transition_notify.xml
...flow/person_slap_interface_workflow/transition_notify.xml
+68
-0
No files found.
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudPersonSlapInterfaceWorkflow.py
View file @
55fc2d9f
...
...
@@ -1253,3 +1253,208 @@ class TestSlapOSCorePersonRequestToken(SlapOSTestCaseMixin):
self
.
assertEqual
(
token
.
getPortalType
(),
"One Time Restricted Access Token"
)
self
.
assertEqual
(
token
.
getUrlMethod
(),
"POST"
)
class
TestSlapOSCorePersonNotify
(
SlapOSTestCaseMixin
):
def
afterSetUp
(
self
):
SlapOSTestCaseMixin
.
afterSetUp
(
self
)
self
.
person
=
self
.
makePerson
()
self
.
tic
()
def
beforeTearDown
(
self
):
pass
def
test_Person_notify_mandatory_argument
(
self
):
self
.
assertRaises
(
TypeError
,
self
.
person
.
notify
)
self
.
assertRaises
(
TypeError
,
self
.
person
.
notify
,
support_request_title
=
"a"
)
self
.
assertRaises
(
TypeError
,
self
.
person
.
notify
,
support_request_title
=
"a"
,
support_request_description
=
"b"
)
def
test_Person_notify_unknown_aggregate
(
self
):
self
.
assertRaises
(
KeyError
,
self
.
person
.
notify
,
support_request_title
=
"a"
,
support_request_description
=
"b"
,
aggregate
=
"c"
)
def
test_Person_notify_computer_node
(
self
):
compute_node
,
_
=
self
.
_makeComputeNode
()
self
.
_test_Person_notify
(
compute_node
)
def
test_Person_notify_instance_tree
(
self
):
person
=
self
.
portal
.
person_module
.
template_member
\
.
Base_createCloneDocument
(
batch_mode
=
1
)
instance_tree
=
self
.
portal
\
.
instance_tree_module
.
template_instance_tree
\
.
Base_createCloneDocument
(
batch_mode
=
1
)
instance_tree
.
validate
()
new_id
=
self
.
generateNewId
()
instance_tree
.
edit
(
title
=
"Test hosting sub ticket %s"
%
new_id
,
reference
=
"TESTHST-%s"
%
new_id
,
destination_section_value
=
person
)
self
.
_test_Person_notify
(
instance_tree
)
def
test_Person_notify_software_installation
(
self
):
self
.
_makeComputeNode
()
software_installation
=
self
.
portal
\
.
software_installation_module
.
template_software_installation
\
.
Base_createCloneDocument
(
batch_mode
=
1
)
software_installation
.
edit
(
url_string
=
self
.
generateNewSoftwareReleaseUrl
(),
aggregate
=
self
.
compute_node
.
getRelativeUrl
(),
reference
=
'TESTSOFTINSTS-%s'
%
self
.
generateNewId
(),
title
=
'Start requested for %s'
%
self
.
compute_node
.
getUid
()
)
software_installation
.
validate
()
software_installation
.
requestStart
()
self
.
_test_Person_notify
(
software_installation
)
def
_test_Person_notify
(
self
,
aggregate_value
):
# Step 1: Notify
self
.
person
.
notify
(
support_request_title
=
"A"
,
support_request_description
=
"B"
,
aggregate
=
aggregate_value
.
getRelativeUrl
()
)
# Step 2: Check return
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertNotEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
get
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
support_request_relative_url
)
support_request
=
self
.
portal
.
restrictedTraverse
(
support_request_in_progress
)
self
.
assertEqual
(
support_request
.
getSimulationState
(),
"validated"
)
self
.
assertEqual
(
support_request
.
getTitle
(),
"A"
)
self
.
assertEqual
(
support_request
.
getDescription
(),
"B"
)
self
.
assertNotEqual
(
support_request
.
getStartDate
(),
None
)
self
.
assertEqual
(
support_request
.
getDestinationDecision
(),
self
.
person
.
getRelativeUrl
())
self
.
assertEqual
(
support_request
.
getAggregateValue
(),
aggregate_value
)
self
.
assertEqual
(
support_request
.
getResource
(),
"service_module/slapos_crm_monitoring"
)
# Step 3: Reset REQUEST and check in progress before catalog
self
.
person
.
REQUEST
.
set
(
"support_request_relative_url"
,
None
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertEqual
(
None
,
support_request_relative_url
)
self
.
person
.
notify
(
support_request_title
=
"A"
,
support_request_description
=
"B"
,
aggregate
=
aggregate_value
.
getRelativeUrl
()
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertNotEqual
(
None
,
support_request_relative_url
)
self
.
assertEqual
(
support_request_in_progress
,
support_request_relative_url
)
self
.
tic
()
# Step 4: Reset parameters and check if the support request is got again.
self
.
person
.
REQUEST
.
set
(
"support_request_relative_url"
,
None
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
None
)
self
.
commit
()
self
.
person
.
notify
(
support_request_title
=
"A"
,
support_request_description
=
"B"
,
aggregate
=
aggregate_value
.
getRelativeUrl
()
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertNotEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
get
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
support_request_relative_url
)
# Check if it is the same Support Request as before
self
.
assertEqual
(
support_request
.
getRelativeUrl
(),
support_request_relative_url
)
# Step 5: Retry the same thing, but now on suspended state
support_request
.
suspend
()
self
.
tic
()
self
.
person
.
REQUEST
.
set
(
"support_request_relative_url"
,
None
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
None
)
self
.
commit
()
self
.
person
.
notify
(
support_request_title
=
"A"
,
support_request_description
=
"B"
,
aggregate
=
aggregate_value
.
getRelativeUrl
()
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertNotEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
get
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
support_request_relative_url
)
# Check if it is the same Support Request as before and still suspended
self
.
assertEqual
(
support_request
.
getRelativeUrl
(),
support_request_relative_url
)
self
.
assertEqual
(
support_request
.
getSimulationState
(),
"suspended"
)
# Step 6: If the support request is closed, create indeed a new one.
support_request
.
invalidate
()
self
.
tic
()
self
.
person
.
REQUEST
.
set
(
"support_request_relative_url"
,
None
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
set
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
None
)
self
.
commit
()
self
.
person
.
notify
(
support_request_title
=
"A"
,
support_request_description
=
"B"
,
aggregate
=
aggregate_value
.
getRelativeUrl
()
)
support_request_relative_url
=
self
.
person
.
REQUEST
.
get
(
"support_request_relative_url"
,
None
)
self
.
assertNotEqual
(
None
,
support_request_relative_url
)
support_request_in_progress
=
self
.
person
.
REQUEST
.
get
(
"support_request_in_progress"
,
None
)
self
.
assertEqual
(
support_request_in_progress
,
support_request_relative_url
)
# Check if it is the another Support Request
self
.
assertEqual
(
support_request
.
getSimulationState
(),
"invalidated"
)
self
.
assertNotEqual
(
support_request
.
getRelativeUrl
(),
support_request_relative_url
)
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/script_Person_notify.py
0 → 100644
View file @
55fc2d9f
person
=
state_change
[
'object'
]
portal
=
person
.
getPortalObject
()
# Get required arguments
kwargs
=
state_change
.
kwargs
# Required args
# Raise TypeError if all parameters are not provided
try
:
support_request_title
=
kwargs
[
'support_request_title'
]
description
=
kwargs
[
'support_request_description'
]
# Aggregate can be None, so it isn't included on the kwargs
aggregate
=
kwargs
[
"aggregate"
]
except
KeyError
:
raise
TypeError
,
"Person_requestSupportRequest takes exactly 3 arguments"
aggregate_value
=
portal
.
restrictedTraverse
(
aggregate
)
support_request_in_progress
=
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
'Support Request'
,
title
=
support_request_title
,
simulation_state
=
[
"validated"
,
"submitted"
,
"suspended"
],
default_aggregate_uid
=
aggregate_value
.
getUid
(),
)
if
support_request_in_progress
is
not
None
:
context
.
REQUEST
.
set
(
"support_request_relative_url"
,
support_request_in_progress
.
getRelativeUrl
())
context
.
REQUEST
.
set
(
"support_request_in_progress"
,
support_request_in_progress
.
getRelativeUrl
())
return
support_request_in_progress
=
context
.
REQUEST
.
get
(
"support_request_in_progress"
,
None
)
if
support_request_in_progress
is
not
None
:
support_request
=
portal
.
restrictedTraverse
(
support_request_in_progress
,
None
)
if
support_request
and
support_request
.
getTitle
()
==
support_request_title
and
\
support_request
.
getAggregateUid
()
==
aggregate_value
.
getUid
():
context
.
REQUEST
.
set
(
"support_request_relative_url"
,
support_request_in_progress
)
return
# Ensure resoure is Monitoring
resource
=
portal
.
service_module
.
\
slapos_crm_monitoring
.
getRelativeUrl
()
support_request
=
portal
.
restrictedTraverse
(
portal
.
portal_preferences
.
getPreferredSupportRequestTemplate
())
\
.
Base_createCloneDocument
(
batch_mode
=
1
)
support_request
.
edit
(
title
=
support_request_title
,
description
=
description
,
start_date
=
DateTime
(),
destination_decision
=
person
.
getRelativeUrl
(),
aggregate_value
=
aggregate_value
,
resource
=
resource
)
support_request
.
validate
()
context
.
REQUEST
.
set
(
"support_request_relative_url"
,
support_request
.
getRelativeUrl
())
context
.
REQUEST
.
set
(
"support_request_in_progress"
,
support_request
.
getRelativeUrl
())
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/script_Person_notify.xml
0 → 100644
View file @
55fc2d9f
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Workflow Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
state_change
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
script_Person_notify
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Workflow Script
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Person_notify
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/state_draft.xml
View file @
55fc2d9f
...
...
@@ -16,6 +16,7 @@
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_notify
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_network
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_organisation
</string>
...
...
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/state_open_order_created.xml
View file @
55fc2d9f
...
...
@@ -17,6 +17,7 @@
<value>
<tuple>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_draft
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_notify
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_compute_node
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_network
</string>
<string>
destination/portal_workflow/person_slap_interface_workflow/transition_request_organisation
</string>
...
...
master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/transition_notify.xml
0 → 100644
View file @
55fc2d9f
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Workflow Transition"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
action_name
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
action_type/workflow
</string>
<string>
before_script/portal_workflow/person_slap_interface_workflow/script_Person_checkConsistency
</string>
<string>
after_script/portal_workflow/person_slap_interface_workflow/script_Person_notify
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
guard_permission
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
icon
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
transition_notify
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Workflow Transition
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Notify
</string>
</value>
</item>
<item>
<key>
<string>
trigger_type
</string>
</key>
<value>
<int>
2
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
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