Commit 250056ec authored by Romain Courteaud's avatar Romain Courteaud

slapos_erp5: wip install erp5_bulletin

slapos_erp5: wip security for bulletin

slapos_erp5: Site Message are visible to all project's customers

slapos_erp5: Note will only be visible to project managers

slapos_erp5: Acknowledgement will only be visible by customer

slapos_erp5: trigger Bulletin local roles calculation

slapos_erp5: set bulletin module business_application

slapos_erp5: coding style: add bulletin scripts

slapos_erp5: coding style: skin selection: erp5_bulletin

slapos_erp5: drop dependency

slapos_panel: allow created different kind of Event

slapos_panel: action to add a Bulletin

slapos_panel: display Bulletin in the ticket's listboxes

slapos_panel: view Bulletin / Site Message

slapos_panel: create Note event for Bulletin

Keep the event only visible to managers

slapos_panel: change the Bulletin's event portal type based on the context

slapos_panel: dont add attachment to bulletin

It will explode size of acknowledgements

slapos_panel: don't expect any custom resource for Bulletin

slapos_panel: missing bulletin dependency

slapos_panel: drop dependency

slapos_crm: wip bulletin idea

slapos_crm: fixup bulletin?

slapos_crm: fixup

slapos_crm: add erp5_bulletin dependency

slapos_configurator: test configurator: bulletin_module

test: erp5_bulletin bt5 added

test mixin: erp5_bulletin
parent baffd61f
......@@ -157,6 +157,7 @@ class TestSlapOSConfigurator(SlapOSTestCaseMixin):
'account_module',
'accounting_module',
'allocation_supply_module',
'bulletin_module',
'business_configuration_module',
'business_process_module',
'campaign_module',
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Alarm" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>active_sense_method_id</string> </key>
<value> <string>Alarm_checkBulletinEventToPropagate</string> </value>
</item>
<item>
<key> <string>automatic_solve</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>slapos_crm_bulletin_event_to_propagate</string> </value>
</item>
<item>
<key> <string>periodicity_hour</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_hour_frequency</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>periodicity_minute</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_minute_frequency</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>periodicity_month</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_month_day</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_month_frequency</string> </key>
<value> <int>12</int> </value>
</item>
<item>
<key> <string>periodicity_start_date</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="DateTime" module="DateTime.DateTime"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<tuple>
<float>1288051200.0</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>periodicity_week</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Alarm</string> </value>
</item>
<item>
<key> <string>sense_method_id</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Check bulletin\'s events to propagate</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
portal = context.getPortalObject()
activate_kw = {'tag': tag}
portal.portal_catalog.searchAndActivate(
portal_type='Bulletin',
causality__portal_type='Compute Node',
simulation_state='validated',
method_id='Bulletin_checkEventToPropagate',
method_kw={'activate_kw': activate_kw},
activate_kw=activate_kw
)
context.activate(after_tag=tag).getId()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>tag, fixit, params</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Alarm_checkBulletinEventToPropagate</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
portal = context.getPortalObject()
bulletin = context
if bulletin.getSimulationState() != 'validated':
return
compute_node = bulletin.getCausalityValue(portal_type='Compute Node')
if compute_node is None:
return
# Get the list of private notes
note_list = portal.portal_catalog(
portal_type='Note',
simulation_state=['stopped', 'delivered'],
follow_up__uid=bulletin.getUid()
)
# Get the list of compute node customers
grouped_instance_list = portal.portal_catalog(
portal_type=['Software Instance', 'Slave Instance'],
group_by=['specialise_uid'],
aggregate__uid=[x.getUid() for x in compute_node.contentValues(portal_type='Compute Partition')]
)
context.log('grouped_instance_tree_uid_list', [x.getSpecialiseUid() for x in grouped_instance_list])
grouped_instance_tree_list = portal.portal_catalog(
portal_type='Instance Tree',
# group_by=['destination_section_uid'],
uid=[x.getSpecialiseUid() for x in grouped_instance_list]
)
customer_list = [x.getDestinationSectionValue() for x in grouped_instance_tree_list]
customer_uid_list = [x.getUid() for x in customer_list]
# Check if every customer received an Acknowledgement for every Note
for note in note_list:
note = note.getObject()
# Search existing ones
acknowledgement_customer_uid_list = [x.getDestinationUid() for x in portal.portal_catalog(
portal_type='Acknowledgement',
destination__uid=customer_uid_list,
follow_up__uid=bulletin.getUid(),
causality__uid=note.getUid()
)]
# Calculate missing ones
for customer in customer_list:
if customer.getUid() not in acknowledgement_customer_uid_list:
# And create it
bulletin.Ticket_createProjectEvent(
note.getTitle(),
'outgoing',
'Acknowledgement',
note.getResource(),
note.getTextContent(),
note.getContentType(),
destination=customer.getRelativeUrl()
)
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>activate_kw=None</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Bulletin_checkEventToPropagate</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -50,7 +50,7 @@
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>title, direction, portal_type, resource, text_content, content_type=None, attachment=None, notification_message=None, substitution_method_parameter_dict=None, keep_draft=False, source=None, destination=None, language=None, comment=None, REQUEST=None, **kw</string> </value>
<value> <string>title, direction, portal_type, resource, text_content, content_type=None, attachment=None, notification_message=None, substitution_method_parameter_dict=None, keep_draft=False, source=None, destination=None, language=None, comment=None, document_proxy=None, REQUEST=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
......
erp5_crm
erp5_bulletin
slapos_accounting
\ No newline at end of file
<local_roles_item>
<local_roles>
<role id='F-CUSTOMER'>
<item>Auditor</item>
</role>
<role id='F-PRODUCTION*'>
<item>Auditor</item>
<item>Author</item>
</role>
<role id='F-SALE*'>
<item>Auditor</item>
</role>
</local_roles>
<local_role_group_ids>
<local_role_group_id id='function'>
<principal id='F-CUSTOMER'>Auditor</principal>
<principal id='F-PRODUCTION*'>Auditor</principal>
<principal id='F-PRODUCTION*'>Author</principal>
<principal id='F-SALE*'>Auditor</principal>
</local_role_group_id>
</local_role_group_ids>
</local_roles_item>
\ No newline at end of file
......@@ -15,56 +15,4 @@
<multi_property id='categories'>local_role_group/user</multi_property>
<multi_property id='base_category'>source</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Destination Project Production Agent</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/agent</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Destination Project Production Manager</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Sale Agent</property>
<property id='condition'>python: (context.getDestinationProject('', portal_type='Project') == "") and (context.getSourceProject('', portal_type='Project') == "")</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/sale/agent</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Sale Manager</property>
<property id='condition'>python: (context.getDestinationProject('', portal_type='Project') == "") and (context.getSourceProject('', portal_type='Project') == "")</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/sale/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Source Project Production Agent</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/agent</multi_property>
<multi_property id='base_category'>source_project</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Source Project Production Manager</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>source_project</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor; Author'>
<property id='title'>Production</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/production*</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Project Customer</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/customer</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Sale</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/sale*</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Destination Project Customer</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/customer</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Destination Project Production Agent</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/agent</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Destination Project Production Manager</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Sale Agent</property>
<property id='condition'>python: (context.getDestinationProject('', portal_type='Project') == "") and (context.getSourceProject('', portal_type='Project') == "")</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/sale/agent</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Sale Manager</property>
<property id='condition'>python: (context.getDestinationProject('', portal_type='Project') == "") and (context.getSourceProject('', portal_type='Project') == "")</property>
<multi_property id='categories'>local_role_group/function</multi_property>
<multi_property id='category'>function/sale/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Source Project Customer</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/customer</multi_property>
<multi_property id='base_category'>source_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Source Project Production Agent</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/agent</multi_property>
<multi_property id='base_category'>source_project</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Source Project Production Manager</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>source_project</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Customer</property>
<property id='description'>Monovalued role</property>
<property id='condition'>python: here.getDestinationValue(portal_type='Person') is not None</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/user</multi_property>
<multi_property id='base_category'>destination</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Customer</property>
<property id='description'>Monovalued role</property>
<property id='condition'>python: here.getSourceValue(portal_type='Person') is not None</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/user</multi_property>
<multi_property id='base_category'>source</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Destination Project Production Agent</property>
<property id='description'>XXX add local role group</property>
......
<type_roles>
<role id='Auditor'>
<property id='title'>Customer</property>
<property id='description'>Monovalued role</property>
<property id='condition'>python: here.getDestinationValue(portal_type='Person') is not None</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/user</multi_property>
<multi_property id='base_category'>destination</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Customer</property>
<property id='description'>Monovalued role</property>
<property id='condition'>python: here.getSourceValue(portal_type='Person') is not None</property>
<property id='title'>Destination Project Customer</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getDestinationProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/user</multi_property>
<multi_property id='base_category'>source</multi_property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/customer</multi_property>
<multi_property id='base_category'>destination_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Destination Project Production Agent</property>
......@@ -47,6 +40,15 @@
<multi_property id='category'>function/sale/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Source Project Customer</property>
<property id='description'>XXX add local role group</property>
<property id='condition'>python: context.getSourceProject('', portal_type='Project') != ""</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='categories'>local_role_group/project</multi_property>
<multi_property id='category'>function/customer</multi_property>
<multi_property id='base_category'>source_project</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Source Project Production Agent</property>
<property id='description'>XXX add local role group</property>
......
......@@ -15,6 +15,10 @@
<type>Balance Transaction</type>
<workflow>local_permission_slapos_interaction_workflow</workflow>
</chain>
<chain>
<type>Bulletin</type>
<workflow>local_permission_slapos_interaction_workflow</workflow>
</chain>
<chain>
<type>Cloud Contract</type>
<workflow>local_permission_slapos_interaction_workflow</workflow>
......
......@@ -43,6 +43,7 @@ for business_application_id, module_name_list in [
"subscription_change_request_module",
]],
["crm", [ # Customer Relation Management
"bulletin_module",
"campaign_module",
"event_module",
"incident_response_module",
......
......@@ -112,6 +112,7 @@ def makeTestSlapOSCodingStyleTestCase(tested_business_template):
'slapos_cloud/SoftwareInstance_viewRenameAndRequestDestroyAction',
'slapos_cloud/SoftwareInstance_checkDuplicationOnInstanceTreeConsistency',
'slapos_cloud/ComputerNetwork_getRelatedSoftwareReleaseList',
'slapos_crm_monitoring/Bulletin_checkEventToPropagate',
'slapos_crm_monitoring/SupportRequest_afterNewEvent',
'slapos_crm/RegularisationRequest_afterClone',
'slapos_crm/RegularisationRequest_getResourceItemList',
......@@ -208,6 +209,7 @@ def makeTestSlapOSCodingStyleTestCase(tested_business_template):
'slapos_panel_compatibility/Person_requestComputer',
'slapos_panel/AllocationSupply_invalidateComputeNodeList',
'slapos_panel/AllocationSupply_validateAndSupplyComputeNodeList',
'slapos_panel/Base_addSlapOSBulletin',
'slapos_panel/Base_addSlapOSSupportRequest',
'slapos_panel/Base_getAuthenticatedPersonUid',
'slapos_panel/Base_getNewsDictFromComputeNodeList',
......
......@@ -62,6 +62,7 @@ erp5_auto_logout
erp5_base
erp5_bearer_token
erp5_big_file
erp5_bulletin
erp5_ckeditor
erp5_code_mirror
erp5_commerce
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Interaction Workflow Interaction" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>after_script/portal_workflow/local_permission_slapos_interaction_workflow/script_Base_updateAllLocalRoles</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>interaction_Bulletin_edit</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Interaction Workflow Interaction</string> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<tuple>
<string>Bulletin</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type_group_filter</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>trigger_method_id</string> </key>
<value>
<tuple>
<string>_setSourceProject.*</string>
<string>_setDestinationProject.*</string>
</tuple>
</value>
</item>
<item>
<key> <string>trigger_once_per_transaction</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -16,6 +16,7 @@ account_module/refundable_vat
account_module/sales
accounting_module
allocation_supply_module
bulletin_module
business_process_module
business_process_module/slapos_sale_subscription_business_process
cloud_contract_module
......
......@@ -10,6 +10,8 @@ Allocation Supply Module
Assignment
Balance Transaction
Bank Account
Bulletin
Bulletin Module
Business Process
Business Process Module
Cash Register
......
......@@ -2,6 +2,7 @@ Accounting Transaction | local_permission_slapos_interaction_workflow
Acknowledgement | local_permission_slapos_interaction_workflow
Allocation Supply | local_permission_slapos_interaction_workflow
Balance Transaction | local_permission_slapos_interaction_workflow
Bulletin | local_permission_slapos_interaction_workflow
Cloud Contract | local_permission_slapos_interaction_workflow
Compute Node | local_permission_slapos_interaction_workflow
Compute Node | slapos_erp5_interaction_workflow
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>slapos_panel_view</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>10.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Panel View</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/SupportRequest_viewOnSlaposPanel</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_jio_fast_input</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_jio_fast_input</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>add_slapos_bulletin</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>0.6</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Add Bulletin</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/Base_viewSlapOSBulletinFastInputDialog</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>python: context.Base_hasSlapOSProjectUserGroup(project_relation=\'follow_up\', manager=True, agent=True, customer=True)</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>slapos_panel_view</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>10.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Panel View</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/Event_viewOnSlaposPanel</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
portal = context.getPortalObject()
REQUEST = context.REQUEST
person = portal.portal_membership.getAuthenticatedMember().getUserValue()
# Max ~3Mb
if int(REQUEST.getHeader('Content-Length', 0)) > 3145728:
REQUEST.RESPONSE.setStatus(413)
return ""
if context.getPortalType() == 'Project':
project = context
# Make the message visible to everybody in the project
event_portal_type = 'Site Message'
elif context.getPortalType() == 'Compute Node':
project = context.getFollowUpValue()
# Keep the note private
# Create dedicated acknowledgment for the Compute Node customers
event_portal_type = 'Note'
elif context.getPortalType() == 'Instance Tree':
project = context.getFollowUpValue()
# Make the message visible to the user
event_portal_type = 'Web Message'
else:
raise NotImplementedError('Unsupported portal type: %s' % context.getPortalType())
support_request = project.Project_createTicketWithCausality(
'Bulletin',
title,
description,
causality=context.getRelativeUrl(),
destination_decision=person.getRelativeUrl(),
)
support_request.Ticket_addSlapOSEvent(title, description, portal_type=event_portal_type, attachment=attachment, batch=True)
return support_request.Base_redirect()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>title, description, attachment=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_addSlapOSBulletin</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Base_addSlapOSBulletin</string> </value>
</item>
<item>
<key> <string>action_title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string>multipart/form-data</string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>bottom</string>
<string>center</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list>
<string>your_title</string>
<string>your_description</string>
</list>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_viewSlapOSBulletinFastInputDialog</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>Base_viewSlapOSBulletinFastInputDialog</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_dialog</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Add Bulletin</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>required</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>your_description</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_dialog_mode_description</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Message</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>display_width</string>
<string>required</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>your_title</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_title</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Subject</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -154,6 +154,10 @@
<string>Subscription Request</string>
<string>Subscription Request</string>
</tuple>
<tuple>
<string>Bulletin</string>
<string>Bulletin</string>
</tuple>
</list>
</value>
</item>
......
......@@ -142,6 +142,10 @@
<string>Support Request</string>
<string>Support Request</string>
</tuple>
<tuple>
<string>Bulletin</string>
<string>Bulletin</string>
</tuple>
</list>
</value>
</item>
......
......@@ -202,6 +202,10 @@
<string>Subscription Request</string>
<string>Subscription Request</string>
</tuple>
<tuple>
<string>Bulletin</string>
<string>Bulletin</string>
</tuple>
</list>
</value>
</item>
......
......@@ -329,6 +329,10 @@
<string>Subscription Request</string>
<string>Subscription Request</string>
</tuple>
<tuple>
<string>Bulletin</string>
<string>Bulletin</string>
</tuple>
</list>
</value>
</item>
......
......@@ -20,7 +20,7 @@ if resource is None:
resource = ticket.getResource()
event = ticket.Ticket_createProjectEvent(
title, direction, 'Web Message',
title, direction, portal_type,
resource,
text_content=text_content,
content_type='text/plain',
......
......@@ -50,7 +50,7 @@
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>title, text_content, attachment=None, batch=None, resource=None, **kw</string> </value>
<value> <string>title, text_content, portal_type=\'Web Message\', attachment=None, batch=None, resource=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
......
......@@ -5,10 +5,12 @@ Allocation Supply Module | slapos_panel_view
Allocation Supply | slapos_fast_invalidate
Allocation Supply | slapos_panel_view
Allocation Supply | validate_and_slapos_supply
Bulletin | slapos_panel_view
Certificate Login | slapos_fast_invalidate
Certificate Login | slapos_panel_view
Compute Node Module | slapos_panel_view
Compute Node Module | slapos_panel_view_my_compute_node_list
Compute Node | add_slapos_bulletin
Compute Node | add_slapos_support_request
Compute Node | jump_to_slapos_allocation_supply
Compute Node | request_slapos_certificate_action
......@@ -81,6 +83,7 @@ Sale Supply Module | slapos_panel_view
Sale Supply | slapos_fast_invalidate
Sale Supply | slapos_fast_validate
Sale Supply | slapos_panel_view
Site Message | slapos_panel_view
Slave Instance | slapos_panel_view
Slave Instance | slapos_panel_view_allocation_report
Software Installation Module | slapos_panel_view
......
......@@ -223,6 +223,7 @@ class testSlapOSMixin(ERP5TypeTestCase):
'erp5_ingestion_mysql_innodb_catalog',
'erp5_ingestion',
'erp5_crm',
'erp5_bulletin',
'erp5_system_event',
'erp5_secure_payment',
'erp5_security_uid_innodb_catalog',
......
......@@ -4,6 +4,7 @@ import os, re
import sys
slapos_bt_list = [
'erp5_bulletin',
'erp5_web_shacache',
'erp5_web_shadir',
'slapos_accounting',
......
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