From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Becker Subject: Re: [PATCH] Smart inference of task progress when exporting to TJ3 Date: Fri, 03 May 2013 13:26:11 +0200 Message-ID: <51839ED3.6070609@web.de> References: <0LlWCR-1TzVer28MZ-00b7Lb@smtp.web.de> <87r4hobgna.fsf@tanger.home> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040308080504080308040504" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:34028) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UYE81-0001g8-2E for emacs-orgmode@gnu.org; Fri, 03 May 2013 07:26:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UYE7x-0000lu-Oi for emacs-orgmode@gnu.org; Fri, 03 May 2013 07:26:16 -0400 Received: from mout.web.de ([212.227.15.4]:52807) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UYE7x-0000ll-Fe for emacs-orgmode@gnu.org; Fri, 03 May 2013 07:26:13 -0400 In-Reply-To: <87r4hobgna.fsf@tanger.home> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Daimrod Cc: emacs-orgmode@gnu.org This is a multi-part message in MIME format. --------------040308080504080308040504 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Dear Daimrod, Thank you for these remarks, next time I know. I attached a "clean" patch. On 03.05.2013 10:40, Daimrod wrote: > Martin writes: > > Hello Martin, > > Thanks for your patch. I will only make a few stylistic remarks. > > 1. Could you add `contrib/lisp/ox-taskjuggler.el:' to the subject? (The > first line of the commit message) > > 2. IIUC you don't need the TINYCHANGE cookie because the changes are > made in contrib/ which doesn't require copyright assignment. > Furthermore, I don't think your changes could be considered `tiny' > (it changes more than 20 lines and doesn't look like a rewrite). > > 3. Could you reformat a bit your code so it fit in 80 column? (You can > often use M-q for the comments) > --------------040308080504080308040504 Content-Type: text/x-patch; name="0001-contrib-lisp-ox-taskjuggler.el-Smart-inference-of-ta.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-contrib-lisp-ox-taskjuggler.el-Smart-inference-of-ta.pa"; filename*1="tch" >From ec5076f93678a3ca5d0944cd777a0d87c74dfeee Mon Sep 17 00:00:00 2001 From: Martin Becker Date: Thu, 2 May 2013 23:08:40 +0200 Subject: [PATCH] contrib/lisp/ox-taskjuggler.el: Smart inference of task progress when exporting to TJ3 * contrib/lisp/ox-taskjuggler.el: Extend variable `complete' to respect clock times if no other information is given. There are three possibilities for setting a task's progress when exporting to TJ3: 1) If TODO state equals "done" => 100% 2) If property "complete" is explicitly given => use that. 3) Otherwise get the clocksum of the task and set the progress by comparing to `effort'. --- contrib/lisp/ox-taskjuggler.el | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/contrib/lisp/ox-taskjuggler.el b/contrib/lisp/ox-taskjuggler.el index 3458e06..97c4aae 100644 --- a/contrib/lisp/ox-taskjuggler.el +++ b/contrib/lisp/ox-taskjuggler.el @@ -780,6 +780,17 @@ channel." ;; Closing report. "}\n")) + +(defun org-taskjuggler--clocksum-task (task) + "Return the clocksum of a parsed subtree => does not verify +whether the parsed duration matches the start and end times" + (let* ((tsum 0)) + (org-element-map (org-element-contents task) 'clock + (lambda (hl) (setq tsum (+ tsum (org-duration-string-to-minutes + (org-element-property :duration hl)))))) + tsum + )) + (defun org-taskjuggler--build-task (task info) "Return a task declaration. @@ -791,11 +802,28 @@ a property \"task_id\" it will be used as the id for this task. Otherwise it will use the ID property. If neither is defined a unique id will be associated to it." (let* ((allocate (org-element-property :ALLOCATE task)) + (effort (org-element-property :EFFORT task)) + ;; smart completeness inference: + ;; - if state=done => 100% + ;; - if explicit property for "complete" => take that value + ;; - otherwise get clocksum of this task and relate to the + ;; effort, whilst limiting values to [0,99] + ;; => 100% possible if and only if state=DONE. + ;; Overbooking does stop at 99%. + (complete-explicit (org-element-property :COMPLETE task)) (complete - (if (eq (org-element-property :todo-type task) 'done) "100" - (org-element-property :COMPLETE task))) + ;; state=done => complete=100 + (if (eq (org-element-property :todo-type task) 'done) 100.0 + ;; else if explicit property => use that + (if complete-explicit (string-to-number complete-explicit) + ;; else guess the completeness from clocksum + (let* ((clocked (org-taskjuggler--clocksum-task task)) + (complete-guess + (and effort (/ (* 100 clocked) + (org-duration-string-to-minutes effort))))) + (and complete-guess (max (min 99 complete-guess) 0))) + ))) (depends (org-taskjuggler-resolve-dependencies task info)) - (effort (org-element-property :EFFORT task)) (milestone (or (org-element-property :MILESTONE task) (not (or (org-element-map (org-element-contents task) 'headline @@ -826,7 +854,7 @@ a unique id will be associated to it." (if (>= org-taskjuggler-target-version 3.0) "allocate" "allocations") allocate)) - (and complete (format " complete %s\n" complete)) + (and complete (format " complete %.1f\n" complete)) (and effort (format " effort %s\n" (let* ((minutes (org-duration-string-to-minutes effort)) -- 1.7.9.5 --------------040308080504080308040504--