Task assignment
Tasks can be assigned to users. An user may decide to "claim" a task directly, which will assign the task to him. Otherwise, it is possible to set some arbitrary user as the assignee or remove the assignee completely through the edition form. Marking a task as completed will remove the assignee, while re-activating a task will assign it to the user who re-activated it. Also, fixed a bug which allowed a completed task to be edited.
This commit is contained in:
parent
850d2fa8d4
commit
56741bccaa
12 changed files with 180 additions and 80 deletions
|
@ -77,6 +77,7 @@ CREATE TABLE tasks (
|
|||
task_description TEXT NOT NULL,
|
||||
task_added TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT now(),
|
||||
user_id INT NOT NULL REFERENCES users(user_id) ON UPDATE NO ACTION ON DELETE CASCADE,
|
||||
user_id_assigned INT REFERENCES users(user_id) ON UPDATE NO ACTION ON DELETE SET NULL ,
|
||||
PRIMARY KEY(task_id)
|
||||
);
|
||||
|
||||
|
|
|
@ -32,12 +32,17 @@ BEGIN
|
|||
RETURN 1;
|
||||
END;
|
||||
|
||||
UPDATE tasks SET user_id_assigned = NULL WHERE task_id = t_id;
|
||||
|
||||
INSERT INTO notes ( task_id , user_id , note_text )
|
||||
VALUES ( t_id , u_id , n_text );
|
||||
RETURN 0;
|
||||
END;
|
||||
$finish_task$ LANGUAGE plpgsql;
|
||||
|
||||
REVOKE EXECUTE ON FUNCTION finish_task( INT , INT , TEXT ) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION finish_task( INT , INT , TEXT ) TO :webapp_user;
|
||||
|
||||
|
||||
-- Restart a task
|
||||
CREATE OR REPLACE FUNCTION restart_task( t_id INT , u_id INT , n_text TEXT )
|
||||
|
@ -50,31 +55,62 @@ BEGIN
|
|||
IF NOT FOUND THEN
|
||||
RETURN 1;
|
||||
END IF;
|
||||
UPDATE tasks SET user_id_assigned = u_id
|
||||
WHERE task_id = t_id;
|
||||
INSERT INTO notes ( task_id , user_id , note_text )
|
||||
VALUES ( t_id , u_id , n_text );
|
||||
RETURN 0;
|
||||
END;
|
||||
$restart_task$ LANGUAGE plpgsql;
|
||||
|
||||
REVOKE EXECUTE ON FUNCTION restart_task( INT , INT , TEXT ) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION restart_task( INT , INT , TEXT ) TO :webapp_user;
|
||||
|
||||
|
||||
-- Update a task
|
||||
CREATE OR REPLACE FUNCTION update_task( t_id INT , p_id INT , t_title TEXT , t_description TEXT , t_priority INT )
|
||||
CREATE OR REPLACE FUNCTION update_task( t_id INT , p_id INT , t_title TEXT , t_description TEXT , t_priority INT , t_assignee INT )
|
||||
RETURNS INT
|
||||
STRICT VOLATILE
|
||||
SECURITY INVOKER
|
||||
AS $update_task$
|
||||
BEGIN
|
||||
UPDATE tasks SET item_id = p_id , task_title = t_title ,
|
||||
task_description = t_description ,
|
||||
task_priority = t_priority
|
||||
WHERE task_id = t_id;
|
||||
PERFORM 1
|
||||
FROM tasks
|
||||
LEFT OUTER JOIN completed_tasks
|
||||
USING( task_id )
|
||||
WHERE task_id = t_id AND completed_task_time IS NULL
|
||||
FOR UPDATE OF tasks;
|
||||
IF NOT FOUND THEN
|
||||
RETURN 4;
|
||||
END IF;
|
||||
|
||||
BEGIN
|
||||
IF t_assignee <= 0 THEN
|
||||
t_assignee := NULL;
|
||||
END IF;
|
||||
BEGIN
|
||||
UPDATE tasks SET user_id_assigned = t_assignee WHERE task_id = t_id;
|
||||
EXCEPTION
|
||||
WHEN foreign_key_violation THEN
|
||||
RAISE EXCEPTION 'bad user';
|
||||
END;
|
||||
UPDATE tasks SET item_id = p_id , task_title = t_title ,
|
||||
task_description = t_description ,
|
||||
task_priority = t_priority
|
||||
WHERE task_id = t_id;
|
||||
EXCEPTION
|
||||
WHEN unique_violation THEN
|
||||
RETURN 1;
|
||||
WHEN foreign_key_violation THEN
|
||||
RETURN 2;
|
||||
WHEN raise_exception THEN
|
||||
RETURN 3;
|
||||
END;
|
||||
|
||||
RETURN 0;
|
||||
EXCEPTION
|
||||
WHEN unique_violation THEN
|
||||
RETURN 1;
|
||||
WHEN foreign_key_violation THEN
|
||||
RETURN 2;
|
||||
END;
|
||||
$update_task$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
REVOKE EXECUTE ON FUNCTION update_task( INT , INT , TEXT , TEXT , INT , INT ) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION update_task( INT , INT , TEXT , TEXT , INT , INT ) TO :webapp_user;
|
||||
|
|
|
@ -10,14 +10,16 @@ CREATE VIEW tasks_list
|
|||
t.task_description AS description, t.task_added AS added_at,
|
||||
u1.user_view_name AS added_by,
|
||||
ct.completed_task_time AS completed_at,
|
||||
u2.user_view_name AS completed_by ,
|
||||
u2.user_view_name AS assigned_to ,
|
||||
u3.user_view_name AS completed_by ,
|
||||
t.task_priority AS priority ,
|
||||
bd.bad_deps AS missing_dependencies ,
|
||||
mtd.trans_missing AS total_missing_dependencies
|
||||
FROM tasks t
|
||||
INNER JOIN users_view u1 ON u1.user_id = t.user_id
|
||||
LEFT OUTER JOIN completed_tasks ct ON ct.task_id = t.task_id
|
||||
LEFT OUTER JOIN users_view u2 ON u2.user_id = ct.user_id
|
||||
LEFT OUTER JOIN users_view u2 ON u2.user_id = t.user_id_assigned
|
||||
LEFT OUTER JOIN users_view u3 ON u3.user_id = ct.user_id
|
||||
LEFT OUTER JOIN (
|
||||
SELECT td.task_id , COUNT(*) AS bad_deps
|
||||
FROM task_dependencies td
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue