In order to trigger a workflow for an absence please see How to trigger a Workflow
]po[ Workflow provides highly flexible configuration options for permission settings that are based on current workflow status and user permissions.
The availability of buttons DELETE/EDIT of the Absence Workflow Panel is set by a function as defined in the following parameters:
Abb.: Absence Workflow Panel
Default configuration for the EDIT button is as follows (im_absence_new_page_wf_perm_edit_button):
Whereas permission table "im_absence_new_page_wf_perm_table" contains (by default) the following data structure to define the permissions:
In order to set up your own permission rules please follow instructions as given below:
1) Create a "Custom Package"
Use the OpenACS Package Manager (http://[YOUR_SERVER]/acs-admin/apm) to create a new package. You probably want to follow the ]po[ naming conventions and name this package "intranet-cust-[YOUR_COMPANY_NAME]"
2) Create a tcl file named [PACKAGE-NAME]-procs.tcl in directory ~/packages/[PACKAGE-NAME]/tcl/
3) In this package create a procedure named "im_absence_new_page_wf_perm_edit_button_custom" as follows:
set req [im_absence_status_requested] set rej [im_absence_status_rejected] set act [im_absence_status_active] set del [im_absence_status_deleted] set perm_hash(owner-$rej) {v r d w a} set perm_hash(owner-$req) {v r d} set perm_hash(owner-$act) {v r d} set perm_hash(owner-$del) {v r d} set perm_hash(assignee-$rej) {v r} set perm_hash(assignee-$req) {v r} set perm_hash(assignee-$act) {v r} set perm_hash(assignee-$del) {v r} set perm_hash(hr-$rej) {v r d w a} set perm_hash(hr-$req) {v r d w a} set perm_hash(hr-$act) {v r d w a} set perm_hash(hr-$del) {v r d w a} set perm_table [array get perm_hash] set perm_set [im_workflow_object_permissions -object_id $absence_id -perm_table $perm_table] ns_log Notice "im_absence_new_page_wf_perm_edit_button absence_id=$absence_id => $perm_set" return [expr [lsearch $perm_set "w"] > -1]
4) Set the permissions accordingly.
Example:
To avoid that "owners" can edit the absence after it has been approved, rejected or deleted replace lines
set perm_hash(owner-$rej) {v r d w a} set perm_hash(owner-$req) {v r d} set perm_hash(owner-$act) {v r d} set perm_hash(owner-$del) {v r d }
with lines:
set perm_hash(owner-$rej) {v } set perm_hash(owner-$req) {v d} set perm_hash(owner-$act) {v } set perm_hash(owner-$del) {v }
5) Set paramter AbsenceNewPageWfEditButtonPerm to: im_absence_new_page_wf_perm_edit_button_custom
6) Restart your web server and make sure that your new lib is compiled correctly (see ~/log/error.log for details)
7) Verify functionality
CREATE OR REPLACE FUNCTION im_absence__add_comment(integer, character varying, character varying) RETURNS integer AS $BODY$ declare p_case_id alias for $1; p_transition_key alias for $2; p_custom_arg alias for $3; v_task_id integer; v_case_id integer; v_creation_ip varchar; v_user_id integer; v_creation_user integer; v_object_id integer; v_object_type varchar; v_journal_id integer; v_transition_key varchar; v_workflow_key varchar; v_group_id integer; v_group_name varchar; v_task_owner integer; v_absence_id integer; v_description text; v_msg text; v_object_name text; v_locale text; v_action_pretty text; begin RAISE NOTICE 'im_absence__add_comment: enter - p_case_id=%, p_transition_key=%, p_custom_arg=%', p_case_id, p_transition_key, p_custom_arg; -- Select out some frequently used variables of the environment select c.object_id, c.workflow_key, co.creation_user, task_id, c.case_id, co.object_type, co.creation_ip into v_object_id, v_workflow_key, v_creation_user, v_task_id, v_case_id, v_object_type, v_creation_ip from wf_tasks t, wf_cases c, acs_objects co where c.case_id = p_case_id and c.case_id = co.object_id and t.case_id = c.case_id and t.workflow_key = c.workflow_key and t.transition_key = p_transition_key; -- set absence_id v_absence_id := v_object_id; RAISE NOTICE 'im_absence__add_comment: v_absence_id:% ', v_absence_id; select owner_id, description into v_user_id, v_description from im_user_absences where absence_id = v_absence_id; -- get owner locale select language_preference into v_locale from user_preferences where user_id = v_user_id; IF v_locale IS NULL THEN v_locale := 'en_US'; RAISE NOTICE 'im_absence__add_comment: Missing language_preference for user_id:%', v_user_id; END IF; -- get comment v_action_pretty := p_custom_arg || ' finish'; select msg into v_msg from journal_entries where object_id = v_case_id and action_pretty = v_action_pretty; -- RAISE NOTICE 'im_absence__add_comment: msg:% from action_pretty:% and absence_id:%', v_msg, v_action_pretty, v_absence_id; -- v_description := v_description || '\n\n' || acs_lang_lookup_message(v_locale, 'intranet-core', 'Comment') || ':\n\n' || v_msg; -- RAISE NOTICE 'im_absence__add_comment: New description:%', v_description; update im_user_absences set comments = v_msg where absence_id = v_absence_id; return 0; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE;
Calle Aprestadora 19, 12o-2a
08902 Hospitalet de Llobregat (Barcelona)
Spain
Tel Europe: +34 609 953 751
Tel US: +1 415 200 2465
Mail: info@project-open.com