|
@@ -263,9 +263,10 @@ defined in `org-export-taskjuggler-default-reports'."
|
|
|
(let* ((tasks
|
|
|
(org-taskjuggler-resolve-dependencies
|
|
|
(org-taskjuggler-assign-task-ids
|
|
|
- (org-map-entries
|
|
|
- '(org-taskjuggler-components)
|
|
|
- org-export-taskjuggler-project-tag nil 'archive 'comment))))
|
|
|
+ (org-taskjuggler-compute-task-leafiness
|
|
|
+ (org-map-entries
|
|
|
+ '(org-taskjuggler-components)
|
|
|
+ org-export-taskjuggler-project-tag nil 'archive 'comment)))))
|
|
|
(resources
|
|
|
(org-taskjuggler-assign-resource-ids
|
|
|
(org-map-entries
|
|
@@ -392,6 +393,23 @@ a path to the current task."
|
|
|
(setq previous-level level)
|
|
|
(setq resolved-tasks (append resolved-tasks (list task)))))))
|
|
|
|
|
|
+(defun org-taskjuggler-compute-task-leafiness (tasks)
|
|
|
+ "Figure out if each task is a leaf by looking at it's level,
|
|
|
+and the level of its successor. If the successor is higher (ie
|
|
|
+deeper), then it's not a leaf."
|
|
|
+ (cond
|
|
|
+ ((null tasks) nil)
|
|
|
+ ;; if a task has no successors it is a leaf
|
|
|
+ ((null (car (cdr tasks)))
|
|
|
+ (cons (cons (cons "leaf-node" t) (car tasks))
|
|
|
+ (org-taskjuggler-compute-task-leafiness (cdr tasks))))
|
|
|
+ ;; if the successor has a lower level than task it is a leaf
|
|
|
+ ((<= (cdr (assoc "level" (car (cdr tasks)))) (cdr (assoc "level" (car tasks))))
|
|
|
+ (cons (cons (cons "leaf-node" t) (car tasks))
|
|
|
+ (org-taskjuggler-compute-task-leafiness (cdr tasks))))
|
|
|
+ ;; otherwise examine the rest of the tasks
|
|
|
+ (t (cons (car tasks) (org-taskjuggler-compute-task-leafiness (cdr tasks))))))
|
|
|
+
|
|
|
(defun org-taskjuggler-assign-resource-ids (resources &optional unique-ids)
|
|
|
"Given a list of resources return the same list, assigning a
|
|
|
unique id to each resource."
|
|
@@ -621,11 +639,17 @@ org-mode priority string."
|
|
|
(cdr (assoc "complete" task))))
|
|
|
(parent-ordered (cdr (assoc "parent-ordered" task)))
|
|
|
(previous-sibling (cdr (assoc "previous-sibling" task)))
|
|
|
+ (milestone (or (cdr (assoc "milestone" task))
|
|
|
+ (and (assoc "leaf-node" task)
|
|
|
+ (not (or effort
|
|
|
+ (cdr (assoc "duration" task))
|
|
|
+ (cdr (assoc "end" task))
|
|
|
+ (cdr (assoc "period" task)))))))
|
|
|
(attributes
|
|
|
'(account start note duration endbuffer endcredit end
|
|
|
- flags journalentry length maxend maxstart milestone
|
|
|
- minend minstart period reference responsible
|
|
|
- scheduling startbuffer startcredit statusnote)))
|
|
|
+ flags journalentry length maxend maxstart minend
|
|
|
+ minstart period reference responsible scheduling
|
|
|
+ startbuffer startcredit statusnote)))
|
|
|
(insert
|
|
|
(concat
|
|
|
"task " unique-id " \"" headline "\" {\n"
|
|
@@ -639,6 +663,7 @@ org-mode priority string."
|
|
|
(and complete (format " complete %s\n" complete))
|
|
|
(and effort (format " effort %s\n" effort))
|
|
|
(and priority (format " priority %s\n" priority))
|
|
|
+ (and milestone (format " milestone\n"))
|
|
|
|
|
|
(org-taskjuggler-get-attributes task attributes)
|
|
|
"\n"))))
|