diff --git a/lisp/org-taskjuggler.el b/lisp/org-taskjuggler.el index 571808607..e1ed12b1e 100644 --- a/lisp/org-taskjuggler.el +++ b/lisp/org-taskjuggler.el @@ -177,15 +177,6 @@ defined in `org-export-taskjuggler-default-reports'." (let ((task (car tasks)) (time-string (format-time-string "%Y-%m-%d"))) (setcar tasks (push (cons "start" time-string) task)))) - ;; add a default end date to the first task if none was given - (unless (assoc "end" (car tasks)) - (let* ((task (car tasks)) - (now (current-time)) - (duration - (days-to-time org-export-taskjuggler-default-project-duration)) - (time-string - (format-time-string "%Y-%m-%d" (time-add now duration)))) - (setcar tasks (push (cons "end" time-string) task)))) ;; add a default version if none was given (unless (assoc "version" (car tasks)) (let ((task (car tasks)) @@ -368,15 +359,43 @@ more parts of the headline or finally add more underscore characters (\"_\")." (and id (replace-regexp-in-string "[^a-zA-Z0-9_]" "_" id))) (defun org-taskjuggler-open-project (project) - (let ((unique-id (cdr (assoc "unique-id" project))) + "Insert a the beginning of project declaration. All valid +attributes from the PROJECT alist are inserted. If no end date is +specified it is calculated +`org-export-taskjuggler-default-project-duration' days from now." + (let* ((unique-id (cdr (assoc "unique-id" project))) (headline (cdr (assoc "headline" project))) (version (cdr (assoc "version" project))) (start (cdr (assoc "start" project))) - (end (cdr (assoc "end" project)))) + (end (cdr (assoc "end" project))) + (now (current-time)) + (duration + (days-to-time org-export-taskjuggler-default-project-duration)) + (time-string + (format-time-string "%Y-%m-%d" (time-add now duration)))) (insert (concat "project " unique-id - " \"" headline "\" \"" version "\" " start " - " end " {\n }\n")))) + " \"" headline "\" \"" version "\" " start " - " + (or end time-string)" {\n }\n")))) + +(defun org-taskjuggler-get-attributes (item attributes) + "Return all attribute as a single formated string. ITEM is an alist +representing either a resource or a task. ATTRIBUTES is a list of +symbols. Only entries from ITEM are considered that are listed in +ATTRIBUTES." + (mapconcat + 'identity + (remq + nil + (mapcar + (lambda (attribute) + (let ((value (cdr (assoc (symbol-name attribute) item)))) + (and value + (if (equal attribute 'limits) + (format "%s { %s }" (symbol-name attribute) value) + (format "%s %s" (symbol-name attribute) value))))) + attributes)) "\n")) (defun org-taskjuggler-open-resource (resource) (let ((id (org-taskjuggler-clean-id (cdr (assoc "ID" resource)))) @@ -386,18 +405,7 @@ more parts of the headline or finally add more underscore characters (\"_\")." (insert (concat "resource " (or id unique-id) " \"" headline "\" {\n " - (mapconcat - 'identity - (remq - nil - (mapcar - (lambda (attribute) - (let ((value (cdr (assoc (symbol-name attribute) resource)))) - (and value - (if (equal attribute 'limits) - (format "%s { %s }" (symbol-name attribute) value) - (format "%s %s" (symbol-name attribute) value))))) - attributes)) "\n") "\n")))) + (org-taskjuggler-get-attributes resource attributes) "\n")))) (defun org-taskjuggler-clean-effort (effort) "Translate effort strings into a format acceptable to taskjuggler, @@ -420,28 +428,30 @@ supports (like weeks, months and years) are currently not supported." (effort (org-taskjuggler-clean-effort (cdr (assoc org-effort-property task)))) (depends (cdr (assoc "depends" task))) (allocate (cdr (assoc "allocate" task))) - (account (cdr (assoc "account" task))) - (start (cdr (assoc "start" task))) + (priority (and (cdr (assoc "PRIORITY" task)) + (org-get-priority (cdr (assoc "PRIORITY" task))))) (state (cdr (assoc "TODO" task))) (complete (or (and (member state org-done-keywords) "100") (cdr (assoc "complete" task)))) - (note (cdr (assoc "note" task))) - (priority (cdr (assoc "priority" task))) (parent-ordered (cdr (assoc "parent-ordered" task))) - (previous-sibling (cdr (assoc "previous-sibling" task)))) + (previous-sibling (cdr (assoc "previous-sibling" task))) + (attributes + '(account start note duration endbuffer endcredit end + flags journalentry, length maxend maxstart milestone + minend minstart period reference responsible + scheduling startbuffer startcredit statusnote))) (insert (concat - "task " unique-id " \"" headline "\" {" - (and effort (concat "\n effort " effort)) + "task " unique-id " \"" headline "\" {\n" (if (and parent-ordered previous-sibling) - (concat "\n depends " previous-sibling) - (and depends (concat "\n depends " depends))) - (and allocate (concat "\n purge allocations\n allocate " allocate)) - (and account (concat "\n account " account)) - (and start (concat "\n start " start)) - (and complete (concat "\n complete " complete)) - (and note (concat "\n note " note)) - (and priority (concat "\n priority " priority)) + (format " depends %s\n" previous-sibling) + (and depends (format " depends %s\n" depends))) + (and allocate (format " purge allocations\n allocate %s\n" allocate)) + (and complete (format " complete %s\n" complete)) + (and effort (format " effort %s\n" effort)) + (and priority (format " priority %s\n" priority)) + + (org-taskjuggler-get-attributes task attributes) "\n")))) (defun org-taskjuggler-close-maybe (level)