From bb2f75ec1ccb662e1a71a8e4f23fe3dcfbf8bafe Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 18 Aug 2013 23:19:25 +0200 Subject: Really fix setting priority for tasks When selecting the task to replace the task with based on priority, be sure to limit the options to tasks with the same story id. --- data.lisp | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'data.lisp') diff --git a/data.lisp b/data.lisp index 03b9dcb..7d7b3a2 100644 --- a/data.lisp +++ b/data.lisp @@ -98,30 +98,37 @@ (defun story-set-state (type id state) (execute (:update type :set 'state state :where (:= 'id id)))) -(defun story-change-priority (type id dir) - (let* ((current-priority (query (:select 'priority :from type +(defun story-change-priority (id dir) + (let* ((current-priority (query (:select 'priority :from 'story :where (:= 'id id)) :single)) (next-priority (funcall (ecase dir (:up #'-) (:down #'+)) current-priority 1)) (max-priority - (case type - ('story (query (:select (:max 'priority) :from type) - :single)) - ('task - (query (:select - (:max 'priority) :from type - :where (:= 'story-id - (:select 'story-id - :from 'task - :where (:= 'id id)))) - :single))))) - (execute (:update type :set 'priority current-priority + (query (:select (:max 'priority) :from 'story) + :single))) + (execute (:update 'story :set 'priority current-priority :where (:= 'priority next-priority))) - (execute (:update type :set + (execute (:update 'story :set 'priority (max 1 (min next-priority max-priority)) :where (:= 'id id))))) +(defun task-change-priority (id dir) + (destructuring-bind (priority story-id) + (query (:select 'priority 'story-id :from 'task + :where (:= 'id id)) :list) + (let* ((next-priority + (funcall (ecase dir (:up #'-) (:down #'+)) priority 1)) + (max-priority + (query (:select (:max 'priority) :from 'task + :where (:= 'story-id story-id)) :single))) + (execute (:update 'task :set 'priority priority + :where (:and (:= 'priority next-priority) + (:= 'story-id story-id)))) + (execute (:update 'task :set + 'priority (max 1 (min next-priority max-priority)) + :where (:= 'id id)))))) + (defun set-assignee (type id assignee) (execute (:update type :set 'assignee assignee :where (:= 'id id)))) -- cgit v1.2.3-54-g00ecf