-- Procedural database code for the workflow package, a package in the OpenACS system.
--
-- @author Lars Pind (lars@collaboraid.biz)
-- @author Peter Marklund (peter@collaboraid.biz)
--
-- This is free software distributed under the terms of the GNU Public
-- License. Full text of the license is available from the GNU Project:
-- http://www.fsf.org/copyleft/gpl.html
---------------------------------
-- Workflow level, Generic Model
---------------------------------
create or replace function workflow__delete (integer)
returns integer as '
declare
delete_workflow_id alias for $1;
rec record;
begin
-- Delete all cases first
for rec in select case_id
from workflow_cases
where workflow_id = delete_workflow_id loop
perform workflow_case_pkg__delete (rec.case_id);
end loop;
perform acs_object__delete(delete_workflow_id);
return 0;
end;' language 'plpgsql';
create or replace function workflow_case_pkg__delete (integer)
returns integer as '
declare
delete_case_id alias for $1;
rec record;
begin
-- All workflow data cascades from the case id
delete from workflow_cases
where case_id = delete_case_id;
return 0;
end;' language 'plpgsql';
-- Function for creating a workflow
create or replace function workflow__new (
varchar, -- short_name
varchar, -- pretty_name
varchar, -- package_key
integer, -- object_id
varchar, -- object_type
integer, -- creation_user
varchar, -- creation_ip
integer -- context_id
)
returns integer as '
declare
p_short_name alias for $1;
p_pretty_name alias for $2;
p_package_key alias for $3;
p_object_id alias for $4;
p_object_type alias for $5;
p_creation_user alias for $6;
p_creation_ip alias for $7;
p_context_id alias for $8;
v_workflow_id integer;
begin
-- Instantiate the ACS Object super type with auditing info
v_workflow_id := acs_object__new(null,
''workflow_lite'',
now(),
p_creation_user,
p_creation_ip,
p_context_id,
''t'');
-- Insert workflow specific info into the workflows table
insert into workflows
(workflow_id, short_name, pretty_name, package_key, object_id, object_type)
values
(v_workflow_id, p_short_name, p_pretty_name, p_package_key, p_object_id, p_object_type);
return v_workflow_id;
end;
' language 'plpgsql';
-- Function for getting the pretty state of a case
create or replace function workflow_case_pkg__get_pretty_state (
varchar, -- workflow_short_name
integer -- object_id
)
returns varchar as '
declare
p_workflow_short_name alias for $1;
p_object_id alias for $2;
v_state_pretty varchar;
begin
select s.pretty_name
into v_state_pretty
from workflows w,
workflow_cases c,
workflow_case_fsm cfsm,
workflow_fsm_states s
where w.short_name = p_workflow_short_name
and c.object_id = p_object_id
and c.workflow_id = w.workflow_id
and cfsm.case_id = c.case_id
and s.state_id = cfsm.current_state;
return v_state_pretty;
end;
' language 'plpgsql';
select define_function_args ('workflow_case_log_entry__new','entry_id,content_type;workflow_case_log_entry,case_id,action_id,comment,comment_mime_type,creation_user,creation_ip,package_id');
create or replace function workflow_case_log_entry__new (
integer, -- entry_id
varchar, -- content_type
integer, -- case_id
integer, -- action_id
varchar, -- comment
varchar, -- comment_mime_type
integer, -- creation_user
varchar, -- creation_ip
integer -- package_id
) returns integer as '
declare
p_item_id alias for $1;
p_content_type alias for $2;
p_case_id alias for $3;
p_action_id alias for $4;
p_comment alias for $5;
p_comment_mime_type alias for $6;
p_creation_user alias for $7;
p_creation_ip alias for $8;
p_package_id alias for $9;
v_name varchar;
v_action_short_name varchar;
v_action_pretty_past_tense varchar;
v_case_object_id integer;
v_item_id integer;
v_revision_id integer;
v_package_id integer;
begin
select short_name, pretty_past_tense
into v_action_short_name, v_action_pretty_past_tense
from workflow_actions
where action_id = p_action_id;
-- use case object as context_id
select object_id
into v_case_object_id
from workflow_cases
where case_id = p_case_id;
-- build the unique name
if p_item_id is not null then
v_item_id := p_item_id;
else
select nextval
into v_item_id
from acs_object_id_seq;
end if;
v_name := v_action_short_name || '' '' || v_item_id;
-- get the package_id
if p_package_id is not null then
v_package_id := p_package_id;
else
-- this will return null if the app stores the package_id
-- in a package-specific table instead of acs_objects
v_package_id := acs_object__package_id(v_case_object_id);
end if;
v_item_id := content_item__new (
v_item_id, -- item_id
v_name, -- name
v_case_object_id, -- parent_id
v_action_pretty_past_tense, -- title
now(), -- creation_date
p_creation_user, -- creation_user
v_case_object_id, -- context_id
p_creation_ip, -- creation_ip
''t'', -- is_live
p_comment_mime_type, -- mime_type
p_comment, -- text
''text'', -- storage_type
''t'', -- security_inherit_p
''CR_FILES'', -- storage_area_key
''content_item'', -- item_subtype
p_content_type, -- content_type
v_package_id -- package_id
);
-- insert the row into the single-column entry revision table
select content_item__get_live_revision (v_item_id)
into v_revision_id;
insert into workflow_case_log_rev (entry_rev_id)
values (v_revision_id);
-- insert into workflow-case-log
insert into workflow_case_log (entry_id, case_id, action_id)
values (v_item_id, p_case_id, p_action_id);
-- return id of newly created item
return v_item_id;
end;' language 'plpgsql';
-- keep original version of this function around for backwards compatibility with application packages
create or replace function workflow_case_log_entry__new (
integer, -- entry_id
varchar, -- content_type
integer, -- case_id
integer, -- action_id
varchar, -- comment
varchar, -- comment_mime_type
integer, -- creation_user
varchar -- creation_ip
) returns integer as '
declare
p_item_id alias for $1;
p_content_type alias for $2;
p_case_id alias for $3;
p_action_id alias for $4;
p_comment alias for $5;
p_comment_mime_type alias for $6;
p_creation_user alias for $7;
p_creation_ip alias for $8;
v_name varchar;
v_action_short_name varchar;
v_action_pretty_past_tense varchar;
v_case_object_id integer;
v_item_id integer;
v_revision_id integer;
begin
select short_name, pretty_past_tense
into v_action_short_name, v_action_pretty_past_tense
from workflow_actions
where action_id = p_action_id;
-- use case object as context_id
select object_id
into v_case_object_id
from workflow_cases
where case_id = p_case_id;
-- build the unique name
if p_item_id is not null then
v_item_id := p_item_id;
else
select nextval
into v_item_id
from acs_object_id_seq;
end if;
v_name := v_action_short_name || '' '' || v_item_id;
v_item_id := content_item__new (
v_item_id, -- item_id
v_name, -- name
v_case_object_id, -- parent_id
v_action_pretty_past_tense, -- title
now(), -- creation_date
p_creation_user, -- creation_user
v_case_object_id, -- context_id
p_creation_ip, -- creation_ip
''t'', -- is_live
p_comment_mime_type, -- mime_type
p_comment, -- text
''text'', -- storage_type
''t'', -- security_inherit_p
''CR_FILES'', -- storage_area_key
''content_item'', -- item_subtype
p_content_type -- content_type
);
-- insert the row into the single-column entry revision table
select content_item__get_live_revision (v_item_id)
into v_revision_id;
insert into workflow_case_log_rev (entry_rev_id)
values (v_revision_id);
-- insert into workflow-case-log
insert into workflow_case_log (entry_id, case_id, action_id)
values (v_item_id, p_case_id, p_action_id);
-- return id of newly created item
return v_item_id;
end;' language 'plpgsql';