Index: openacs-4/packages/tasks/tasks.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/tasks/tasks.info,v diff -u -r1.2 -r1.3 --- openacs-4/packages/tasks/tasks.info 25 Sep 2005 23:49:22 -0000 1.2 +++ openacs-4/packages/tasks/tasks.info 25 Sep 2005 23:54:16 -0000 1.3 @@ -7,12 +7,12 @@ f f - + Matthew Geddert Keep track of tasks to do. This package uses project manager tcl and sql as the base for a simple task program without project manager's complexity. - + Index: openacs-4/packages/tasks/sql/postgresql/upgrade/upgrade-0.1d-0.1d1.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/tasks/sql/postgresql/upgrade/upgrade-0.1d-0.1d1.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/tasks/sql/postgresql/upgrade/upgrade-0.1d-0.1d1.sql 25 Sep 2005 23:54:16 -0000 1.1 @@ -0,0 +1,489 @@ +----------------------------------------------------- +-- +-- Create the data model for the timecard application +-- Author: Matthew Geddert geddert@yahoo.com +-- Creation Date: 2004-02-16 +-- +----------------------------------------------------- + +create table t_processes ( + process_id integer + constraint t_process_id_pk + primary key + constraint t_process_id_fk + references acs_objects, + title varchar(1000), + description text, + mime_type varchar(200) default 'text/plain', + workflow_id integer + constraint t_process_workflow_fk + references workflows +); + +create table t_process_instances ( + process_instance_id integer + constraint t_process_instances_id_pk + primary key + constraint t_process_instances_id_fk + references acs_objects, + process_id integer + constraint t_process_instances_process_fk + references t_processes, + case_id integer, + party_id integer + constraint t_process_instances_party_fk + references parties, + object_id integer + constraint t_process_instances_tasks_object_fk + references acs_objects +); + + +create sequence t_task_status_seq start 3; + +create table t_task_status ( + status_id integer + constraint t_task_status_pk + primary key, + short_name varchar(100), + title varchar(100), + -- closed or open + status_type char(1) default 'c' + constraint t_task_status_type_ck + check (status_type in ('c', 'o')) +); + +insert into t_task_status (status_id, short_name, title, status_type) values +(1, 'open', '#acs-kernel.common_Open#', 'o'); +insert into t_task_status (status_id, short_name, title, status_type) values +(2, 'closed', '#acs-kernel.common_Closed#', 'c'); + + +create table t_process_tasks ( + task_id integer + constraint t_process_tasks_task_pk + primary key + constraint t_process_tasks_task_fk + references acs_objects, + process_id integer + constraint t_process_tasks_process_fk + references t_processes, + -- action creating this task + open_action_id integer + constraint t_process_tasks_open_action_fk + references workflow_actions, + -- action when closing task + closing_action_id integer + constraint t_process_tasks_close_action_fk + references workflow_actions, + party_id integer + constraint t_process_tasks_party_fk + references parties, + object_id integer + constraint t_process_tasks_object_fk + references acs_objects, + title varchar(1000), + description text, + mime_type varchar(200) default 'text/plain', + comment text, + status_id integer + constraint t_process_tasks_status_fk + references t_task_status, + priority integer, + -- start date relative to current date + start numeric, + -- due date relative to current date + due numeric +); + + +create table t_tasks ( + task_id integer + constraint t_tasks_task_pk + primary key + constraint t_tasks_task_fk + references acs_objects, + process_instance_id integer + constraint t_tasks_instance_fk + references t_process_instances, + process_task_id integer + constraint t_tasks_process_task_fk + references t_process_tasks, + party_id integer + constraint t_tasks_party_fk + references parties, + object_id integer + constraint t_tasks_object_fk + references acs_objects, + title varchar(1000), + description text, + mime_type varchar(200) default 'text/plain', + comment text, + status_id integer + constraint t_tasks_status_fk + references t_task_status, + priority integer, + start_date timestamptz, + due_date timestamptz, + completed_date timestamptz +); + + + + + + +CREATE FUNCTION inline_0() +RETURNS integer +AS 'declare + begin + PERFORM + acs_object_type__create_type( + ''tasks_task'', -- object_type + ''Task'', -- pretty_name + ''Tasks'', -- pretty_plural + ''acs_object'', -- supertype + ''t_tasks'', -- table_name + ''task_id'', -- id_column + ''tasks_task'', -- package_name + ''f'', -- abstract_p + null, -- type_extension_table + null -- name_method + ); + + PERFORM + acs_object_type__create_type( + ''tasks_process'', -- object_type + ''Task Process'', -- pretty_name + ''Task Processes'', -- pretty_plural + ''acs_object'', -- supertype + ''t_processes'', -- table_name + ''process_id'', -- id_column + ''tasks_process'', -- package_name + ''f'', -- abstract_p + null, -- type_extension_table + null -- name_method + ); + + PERFORM + acs_object_type__create_type( + ''tasks_process_instance'', -- object_type + ''Task Process Instance'', -- pretty_name + ''Task Process Instances'', -- pretty_plural + ''acs_object'', -- supertype + ''t_process_instances'', -- table_name + ''process_instance_id'', -- id_column + ''tasks_process_instance'', -- package_name + ''f'', -- abstract_p + null, -- type_extension_table + null -- name_method + ); + + PERFORM + acs_object_type__create_type( + ''tasks_process_task'', -- object_type + ''Process Task'', -- pretty_name + ''Process Tasks'', -- pretty_plural + ''acs_object'', -- supertype + ''t_process_tasks'', -- table_name + ''task_id'', -- id_column + ''tasks_process_task'', -- package_name + ''f'', -- abstract_p + null, -- type_extension_table + null -- name_method + ); + + return 0; + + end;' +LANGUAGE 'plpgsql'; + +SELECT inline_0(); + +DROP function inline_0(); + + + +create or replace function tasks__relative_date ( + timestamptz -- date_comparative +) returns varchar +as ' +declare + p_date alias for $1; + v_date varchar; +begin + v_date := CASE WHEN to_char(p_date,''YYYY'') = to_char(now(),''YYYY'') THEN + CASE WHEN to_char(p_date,''YYYY-MM-DD'') = to_char(now(),''YYYY-MM-DD'') THEN ''Today'' + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() - ''1 day''::interval),''YYYY-MM-DD'') THEN ''Yesterday'' + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() - ''2 day''::interval),''YYYY-MM-DD'') THEN ''Two Days Ago'' + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() + ''1 day''::interval),''YYYY-MM-DD'') THEN ''Tomorrow'' + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() + ''2 day''::interval),''YYYY-MM-DD'') THEN CASE WHEN to_char(p_date,''FMDay'') not in ( ''Sunday'', ''Saturday'', ''Monday'', ''Tuesday'') THEN to_char(p_date,''Day'') ELSE to_char(p_date,''Mon DD (Dy)'') END + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() + ''3 day''::interval),''YYYY-MM-DD'') THEN CASE WHEN to_char(p_date,''FMDay'') not in ( ''Sunday'', ''Saturday'', ''Monday'', ''Tuesday'') THEN to_char(p_date,''Day'') ELSE to_char(p_date,''Mon DD (Dy)'') END + WHEN to_char(p_date,''YYYY-MM-DD'') = to_char((now() + ''4 day''::interval),''YYYY-MM-DD'') THEN CASE WHEN to_char(p_date,''FMDay'') not in ( ''Sunday'', ''Saturday'', ''Monday'', ''Tuesday'') THEN to_char(p_date,''Day'') ELSE to_char(p_date,''Mon DD (Dy)'') END + ELSE to_char(p_date,''Mon DD (Dy)'') END + ELSE to_char(p_date,''Mon DD, YYYY'') END; + + + return v_date; +end;' language 'plpgsql'; + +create or replace function tasks__completion_date ( + integer +) returns timestamptz +as ' +declare + p_task_id alias for $1; + v_complete_p boolean; + v_date varchar; + v_previous_p boolean; + revision record; +begin + v_complete_p := ''1'' from pm_tasks where task_id = p_task_id and status = ''2''; + v_date := NULL; + + IF v_complete_p THEN + v_previous_p := ''t''; + FOR revision IN + select ptr.percent_complete, ao.creation_date + from cr_revisions cr, pm_tasks_revisions ptr, acs_objects ao + where cr.item_id = p_task_id + and cr.revision_id = ao.object_id + and cr.revision_id = ptr.task_revision_id + order by ao.creation_date desc + LOOP + IF revision.percent_complete = ''100'' AND v_previous_p THEN + v_date := revision.creation_date; + ELSE + v_previous_p := ''f''; + EXIT; + END IF; + END LOOP; + + END IF; + + return v_date; +end;' language 'plpgsql'; + + +create or replace function tasks__completion_user ( + integer +) returns integer +as ' +declare + p_task_id alias for $1; + v_complete_p boolean; + v_user varchar; + v_previous_p boolean; + revision record; +begin + v_complete_p := ''1'' from pm_tasks where task_id = p_task_id and status = ''2''; + v_user := NULL; + + IF v_complete_p THEN + v_previous_p := ''t''; + FOR revision IN + select ptr.percent_complete, ao.creation_user + from cr_revisions cr, pm_tasks_revisions ptr, acs_objects ao + where cr.item_id = p_task_id + and cr.revision_id = ao.object_id + and cr.revision_id = ptr.task_revision_id + order by ao.creation_date desc + LOOP + IF revision.percent_complete = ''100'' AND v_previous_p THEN + v_user := revision.creation_user; + ELSE + v_previous_p := ''f''; + EXIT; + END IF; + END LOOP; + + END IF; + + return v_user; +end;' language 'plpgsql'; + + +----------------------------- + +select define_function_args('tasks_task__new','task_id,process_instance_id,process_task_id,party_id,object_id,title,description,mime_type,comment,status_id,priority,start_date,due_date,package_id,creation_user,creation_ip,context_id'); + +create or replace function tasks_task__new (integer,integer,integer,integer,integer,varchar,text,varchar,text,integer,integer,timestamptz,timestamptz,integer,integer,varchar,integer) +returns integer as ' +declare + p_task_id alias for $1; + p_process_instance_id alias for $2; + p_process_task_id alias for $3; + p_party_id alias for $4; + p_object_id alias for $5; + p_title alias for $6; + p_description alias for $7; + p_mime_type alias for $8; + p_comment alias for $9; + p_status_id alias for $10; + p_priority alias for $11; + p_start_date alias for $12; + p_due_date alias for $13; + p_package_id alias for $14; + p_creation_user alias for $15; + p_creation_ip alias for $16; + p_context_id alias for $17; + v_task_id integer; + v_start_date timestamptz; +begin + v_task_id:= acs_object__new( + p_task_id, + ''tasks_task'', + now(), + p_creation_user, + p_creation_ip, + coalesce(p_context_id, p_package_id), + ''t'', + p_title, + p_package_id + ); + + if p_start_date is null then + v_start_date := now(); + else + v_start_date := p_start_date; + end if; + + insert into t_tasks + (task_id, process_instance_id, process_task_id, party_id, object_id, + title, description, mime_type, comment, status_id, priority, + start_date, due_date) + values + (v_task_id, p_process_instance_id, p_process_task_id, p_party_id, + p_object_id, p_title, p_description, p_mime_type, p_comment, + p_status_id, p_priority, v_start_date, p_due_date); + + return v_task_id; +end; +' language 'plpgsql'; + + +select define_function_args('tasks_process_task__new','task_id,process_id,open_action_id,closing_action_id,party_id,object_id,title,description,mime_type,comment,status_id,priority,start,due,package_id,creation_user,creation_ip,context_id'); + +create or replace function tasks_process_task__new (integer,integer,integer,integer,integer,integer,varchar,text,varchar,text,integer,integer,numeric,numeric,integer,integer,varchar,integer) +returns integer as ' +declare + p_task_id alias for $1; + p_process_id alias for $2; + p_open_action_id alias for $3; + p_closing_action_id alias for $4; + p_party_id alias for $5; + p_object_id alias for $6; + p_title alias for $7; + p_description alias for $8; + p_mime_type alias for $9; + p_comment alias for $10; + p_status_id alias for $11; + p_priority alias for $12; + p_start alias for $13; + p_due alias for $14; + p_package_id alias for $15; + p_creation_user alias for $16; + p_creation_ip alias for $17; + p_context_id alias for $18; + v_task_id integer; +begin + v_task_id:= acs_object__new( + p_task_id, + ''tasks_process_task'', + now(), + p_creation_user, + p_creation_ip, + coalesce(p_context_id, p_package_id), + ''t'', + p_title, + p_package_id + ); + + insert into t_process_tasks + (task_id, process_id, open_action_id, closing_action_id, party_id, + object_id, title, description, mime_type, comment, status_id, + priority, start, due) + values + (v_task_id, p_process_id, p_open_action_id, p_closing_action_id, + p_party_id, p_object_id, p_title, p_description, p_mime_type, + p_comment, p_status_id, p_priority, p_start, p_due); + + return v_task_id; +end; +' language 'plpgsql'; + + +select define_function_args('tasks_process__new','process_id,title,description,mime_type,workflow_id,package_id,creation_user,creation_ip,context_id'); + +create or replace function tasks_process__new (integer,varchar,text,varchar,integer,integer,integer,varchar,integer) +returns integer as ' +declare + p_process_id alias for $1; + p_title alias for $2; + p_description alias for $3; + p_mime_type alias for $4; + p_workflow_id alias for $5; + p_package_id alias for $6; + p_creation_user alias for $7; + p_creation_ip alias for $8; + p_context_id alias for $9; + v_process_id integer; +begin + v_process_id:= acs_object__new( + p_process_id, + ''tasks_process'', + now(), + p_creation_user, + p_creation_ip, + coalesce(p_context_id, p_package_id), + ''t'', + p_title, + p_package_id + ); + + insert into t_processes + (process_id, title, description, mime_type, workflow_id) + values + (v_process_id, p_title, p_description, p_mime_type, p_workflow_id); + + return v_process_id; +end; +' language 'plpgsql'; + + +select define_function_args('tasks_process_instance__new','process_instance_id,process_id,case_id,party_id,object_id,package_id,creation_user,creation_ip,context_id'); + +create or replace function tasks_process_instance__new (integer,integer,integer,integer,integer,integer,integer,varchar,integer) +returns integer as ' +declare + p_process_instance_id alias for $1; + p_process_id alias for $2; + p_case_id alias for $3; + p_party_id alias for $4; + p_object_id alias for $5; + p_package_id alias for $6; + p_creation_user alias for $7; + p_creation_ip alias for $8; + p_context_id alias for $9; + v_process_instance_id integer; +begin + v_process_instance_id:= acs_object__new( + p_process_instance_id, + ''tasks_process_instance'', + now(), + p_creation_user, + p_creation_ip, + coalesce(p_context_id, p_package_id), + ''t'', + ''process instance of process '' || p_process_id || '' for object '' || p_object_id, + p_package_id + ); + + insert into t_process_instances + (process_instance_id, process_id, case_id, party_id, object_id) + values + (v_process_instance_id, p_process_id, p_case_id, p_party_id, p_object_id); + + return v_process_instance_id; +end; +' language 'plpgsql'; Index: openacs-4/packages/tasks/tcl/tasks-install-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/tasks/tcl/tasks-install-procs.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/tasks/tcl/tasks-install-procs.tcl 25 Sep 2005 23:49:23 -0000 1.1 +++ openacs-4/packages/tasks/tcl/tasks-install-procs.tcl 25 Sep 2005 23:54:16 -0000 1.2 @@ -40,5 +40,20 @@ -from_version_name $from_version_name \ -to_version_name $to_version_name \ -spec { + 0.1d 0.1d1 { + set spec { + name "Tasks_Action_SideEffect" + aliases { + GetObjectType tasks::workflow::impl::action_side_effect::object_type + GetPrettyName tasks::workflow::impl::action_side_effect::pretty_name + DoSideEffect tasks::workflow::impl::action_side_effect::do + } + } + + lappend spec contract_name [workflow::service_contract::action_side_effect] + lappend spec owner tasks + + acs_sc::impl::new_from_spec -spec $spec + } } }