summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Egli <christian.egli@alumni.ethz.ch>2010-04-28 09:11:09 +0200
committerChristian Egli <christian.egli@alumni.ethz.ch>2010-06-08 09:20:33 +0200
commit68068aa661fa2e19dbf4bb79a2ef801827d77109 (patch)
tree29465a15931306fd483fa9fdbd9789e0444e2c56
parent399844ee5233d6cd757ae6a4c170e26ae85324fe (diff)
downloadorg-mode-68068aa661fa2e19dbf4bb79a2ef801827d77109.tar.gz
Do not use the ID property frivolously
use a property named "task_id" instead as we do not search for task ids across files. For resources use a property named "resource_id" or only as a fall back the ID property. Also issue a warning if a dependency cannot be resolved.
-rw-r--r--lisp/ChangeLog8
-rw-r--r--lisp/org-taskjuggler.el64
2 files changed, 43 insertions, 29 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 512bbe6..5000f2f 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -291,6 +291,14 @@
* org-html.el (org-format-org-table-html): Test all columns
for number content.
+2010-04-28 Christian Egli <christian.egli@sbszh.ch>
+
+ * org-taskjuggler.el (org-taskjuggler-find-task-with-id): Do not
+ use the ID property frivolously, i.e. use a property named
+ "task_id" instead as we do not search for ids across files.
+ (org-taskjuggler-resolve-explicit-dependencies): Issue a warning
+ if a dependency cannot be resolved.
+
2010-04-28 Carsten Dominik <carsten.dominik@gmail.com>
* org-latex.el (org-export-latex-treat-sub-super-char): Make
diff --git a/lisp/org-taskjuggler.el b/lisp/org-taskjuggler.el
index ef8ebe1..f292513 100644
--- a/lisp/org-taskjuggler.el
+++ b/lisp/org-taskjuggler.el
@@ -79,16 +79,17 @@
;; tasks. You can group your resources hierarchically. Tag the top
;; node of the resources with "taskjuggler_resource" (or whatever you
;; customized `org-export-taskjuggler-resource-tag' to). You can
-;; optionally assign an ID to the resources (using the standard org
-;; properties commands) or you can let the exporter generate IDs
-;; automatically (the exporter picks the first word of the headline as
-;; the ID as long as it is unique, see the documentation of
-;; `org-taskjuggler-get-unique-id'). Using that ID you can then
-;; allocate resources to tasks. This is again done with the "allocate"
-;; property on the tasks. Do this in column view or when on the task
-;; type
+;; optionally assign an identifier (named "resource_id") to the
+;; resources (using the standard org properties commands) or you can
+;; let the exporter generate identifiers automatically (the exporter
+;; picks the first word of the headline as the identifier as long as
+;; it is unique, see the documentation of
+;; `org-taskjuggler-get-unique-id'). Using that identifier you can
+;; then allocate resources to tasks. This is again done with the
+;; "allocate" property on the tasks. Do this in column view or when on
+;; the task type
;;
-;; C-c C-x p allocate RET <ID> RET
+;; C-c C-x p allocate RET <resource_id> RET
;;
;; Once the allocations are done you can again export to TaskJuggler
;; and check in the Resource Allocation Graph which person is working
@@ -112,15 +113,15 @@
;; mode manual) or with the BLOCKER attribute (see org-depend.el) or
;; alternatively with a depends attribute. Both the BLOCKER and the
;; depends attribute can be either "previous-sibling" or a reference
-;; to an ID which is defined for another task in the project. BLOCKER
-;; and the depends attribute can define multiple dependencies
-;; separated by either space or comma. You can also specify optional
-;; attributes on the dependency by simply appending it. The following
-;; examples should illustrate this:
+;; to an identifier (named "task_id") which is defined for another
+;; task in the project. BLOCKER and the depends attribute can define
+;; multiple dependencies separated by either space or comma. You can
+;; also specify optional attributes on the dependency by simply
+;; appending it. The following examples should illustrate this:
;;
;; * Training material
;; :PROPERTIES:
-;; :ID: training_material
+;; :task_id: training_material
;; :ORDERED: t
;; :END:
;; ** Markup Guidelines
@@ -143,8 +144,8 @@
;; - What about property inheritance and org-property-inherit-p?
;; - Use TYPE_TODO as an way to assign resources
;; - Make sure multiple dependency definitions (i.e. BLOCKER on
-;; previous-sibling and on a specific ID) in multiple attributes
-;; are properly exported.
+;; previous-sibling and on a specific task_id) in multiple
+;; attributes are properly exported.
;; - Fix compiler warnings about reference and assignment to free
;; variable `old-level' in org-taskjuggler-close-maybe
;;
@@ -275,13 +276,13 @@ defined in `org-export-taskjuggler-default-reports'."
;; add a default resource
(unless resources
(setq resources
- `((("ID" . ,(user-login-name))
+ `((("resource_id" . ,(user-login-name))
("headline" . ,user-full-name)
("level" . 1)))))
;; add a default allocation to the first task if none was given
(unless (assoc "allocate" (car tasks))
(let ((task (car tasks))
- (resource-id (cdr (assoc "ID" (car resources)))))
+ (resource-id (cdr (assoc "resource_id" (car resources)))))
(setcar tasks (push (cons "allocate" resource-id) task))))
;; add a default start date to the first task if none was given
(unless (assoc "start" (car tasks))
@@ -447,12 +448,12 @@ dependencies. A dependency will have to match `[-a-zA-Z0-9_]+'."
(defun org-taskjuggler-resolve-explicit-dependencies (dependencies tasks)
"For each dependency in DEPENDENCIES try to find a
-corresponding task with a matching ID in TASKS. Return a list
-containing the resolved links for all DEPENDENCIES where a
-matching tasks was found. If the dependency is
+corresponding task with a matching property \"task_id\" in TASKS.
+Return a list containing the resolved links for all DEPENDENCIES
+where a matching tasks was found. If the dependency is
\"previous-sibling\" it is ignored (as this is dealt with in
`org-taskjuggler-resolve-dependencies'). If there is no matching
-task the dependency is silently ignored."
+task the dependency is ignored and a warning is displayed ."
(unless (null dependencies)
(let*
;; the dependency might have optional attributes such as "{
@@ -472,13 +473,16 @@ task the dependency is silently ignored."
(cons (mapconcat 'identity (list path optional-attributes) " ")
(org-taskjuggler-resolve-explicit-dependencies
(cdr dependencies) tasks)))
- ;; silently ignore all other dependencies
- (t (org-taskjuggler-resolve-explicit-dependencies (cdr dependencies) tasks))))))
+ ;; warn about dangling dependency but otherwise ignore it
+ (t (display-warning
+ 'org-export-taskjuggler
+ (format "No task with matching property \"task_id\" found for id %s" id))
+ (org-taskjuggler-resolve-explicit-dependencies (cdr dependencies) tasks))))))
(defun org-taskjuggler-find-task-with-id (id tasks)
"Find ID in tasks. If found return the path of task. Otherwise
return nil."
- (let ((task-id (cdr (assoc "ID" (car tasks))))
+ (let ((task-id (cdr (assoc "task_id" (car tasks))))
(path (cdr (assoc "path" (car tasks)))))
(cond
((null tasks) nil)
@@ -551,13 +555,15 @@ If the ATTRIBUTE is not in ITEM return nil."
(t (org-taskjuggler-get-attribute (cdr item) attribute))))
(defun org-taskjuggler-open-resource (resource)
- (let ((id (org-taskjuggler-clean-id (cdr (assoc "ID" resource))))
- (unique-id (org-taskjuggler-clean-id (cdr (assoc "unique-id" resource))))
+ (let ((id (org-taskjuggler-clean-id
+ (or (cdr (assoc "resource_id" resource))
+ (cdr (assoc "ID" resource))
+ (cdr (assoc "unique-id" resource)))))
(headline (cdr (assoc "headline" resource)))
(attributes '(limits vacation shift booking efficiency journalentry rate)))
(insert
(concat
- "resource " (or id unique-id) " \"" headline "\" {\n "
+ "resource " id " \"" headline "\" {\n "
(org-taskjuggler-get-attributes resource attributes) "\n"))))
(defun org-taskjuggler-clean-effort (effort)