From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dan Davison Subject: Re: [ANN] Exporter for taskjuggler Date: Fri, 16 Apr 2010 16:39:43 -0400 Message-ID: <874ojbgmi8.fsf@stats.ox.ac.uk> References: <87ljdarxpw.fsf@saadawi.sbszh.ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O2sKW-0008Js-U6 for emacs-orgmode@gnu.org; Fri, 16 Apr 2010 16:40:00 -0400 Received: from [140.186.70.92] (port=33612 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O2sKP-0008Ij-Tw for emacs-orgmode@gnu.org; Fri, 16 Apr 2010 16:39:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O2sKK-000567-Af for emacs-orgmode@gnu.org; Fri, 16 Apr 2010 16:39:50 -0400 Received: from markov.stats.ox.ac.uk ([163.1.210.1]:55693) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O2sKK-00055T-0e for emacs-orgmode@gnu.org; Fri, 16 Apr 2010 16:39:48 -0400 In-Reply-To: <87ljdarxpw.fsf@saadawi.sbszh.ch> (Christian Egli's message of "Tue, 30 Mar 2010 10:59:55 +0200") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Christian Egli Cc: emacs-orgmode@gnu.org Christian Egli writes: [...] > So in order to create a professional looking gant and resource usage > charts I implemented an exporter from org-mode to TaskJuggler > (http://www.taskjuggler.org/). The code is attached and I'm looking for > feedback and would love to get this integrated in the org-mode > distribution. Hi Christian, I'm interested in this too! I had a few teething problems but I think I'm doing OK now. A simple org file demonstrating some of the features is the most important thing lacking at the moment. I encountered problems with the fact that - I was using `org-odd-levels-only' - the "allocate" property name is required to be lower case (unlike Effort) - A Resource named with Uppercase letters will be expected to be all lowercase by TJ (e.g. my Alf resource below). I've put patches corresponding to the hacks I made to solve these below. It would also be nice if repeated invocation of org-export-as-taskjuggler-and-open on the same project didn't spawn multiple TJ instances (TJ v2.4.3 ubuntu). I had a quick look at the TJ page -- it sounded as if the cross-platform ruby version is advancing rapidly? Here's my test file and patches. --8<---------------cut here---------------start------------->8--- * Project :taskjuggler_project: *** DONE First milestone :PROPERTIES: :Effort: 01:00 :Allocate: Alf :END: *** TODO Second milestone :PROPERTIES: :Effort: 01:00 :Allocate: Alf :END: * Resources :taskjuggler_resource: *** Alf alf contents --8<---------------cut here---------------end--------------->8--- Make it work if `org-odd-levels-only' is in use: --8<---------------cut here---------------start------------->8--- diff --git a/org-taskjuggler.el b/org-taskjuggler.el index e887d33..e843dcd 100644 --- a/org-taskjuggler.el +++ b/org-taskjuggler.el @@ -309,7 +309,7 @@ the current node such as the headline, the level, todo state information, all the properties, etc." (let* ((props (org-entry-properties)) (components (org-heading-components)) - (level (car components)) + (level (nth 1 components)) (headline (nth 4 components)) (parent-ordered (org-taskjuggler-parent-is-ordered-p))) (push (cons "level" level) props) --8<---------------cut here---------------end--------------->8--- Allow variations in capitalisation of allocate property name (or maybe the documentation should just point out that it must be lowercase) --8<---------------cut here---------------start------------->8--- diff --git a/org-taskjuggler.el b/org-taskjuggler.el index 718ae9d..ab92eca 100644 --- a/org-taskjuggler.el +++ b/org-taskjuggler.el @@ -525,7 +525,7 @@ org-mode priority string." (headline (cdr (assoc "headline" task))) (effort (org-taskjuggler-clean-effort (cdr (assoc org-effort-property task)))) (depends (cdr (assoc "depends" task))) - (allocate (cdr (assoc "allocate" task))) + (allocate (or (cdr (assoc "allocate" task)) (cdr (assoc "Allocate" task)) (cdr (assoc "ALLOCATE" task)))) (priority-raw (cdr (assoc "PRIORITY" task))) (priority (and priority-raw (org-taskjuggler-get-priority priority-raw))) (state (cdr (assoc "TODO" task))) --8<---------------cut here---------------end--------------->8--- Always output resource names lower case --8<---------------cut here---------------start------------->8--- diff --git a/org-taskjuggler.el b/org-taskjuggler.el index ab92eca..1cc5222 100644 --- a/org-taskjuggler.el +++ b/org-taskjuggler.el @@ -544,7 +544,7 @@ org-mode priority string." (if (and parent-ordered previous-sibling) (format " depends %s\n" previous-sibling) (and depends (format " depends %s\n" depends))) - (and allocate (format " purge allocations\n allocate %s\n" allocate)) + (and allocate (format " purge allocations\n allocate %s\n" (downcase allocate))) (and complete (format " complete %s\n" complete)) (and effort (format " effort %s\n" effort)) (and priority (format " priority %s\n" priority)) --8<---------------cut here---------------end--------------->8--- More comprehensible error message if you forget to define a project... --8<---------------cut here---------------start------------->8--- diff --git a/org-taskjuggler.el b/org-taskjuggler.el index e843dcd..718ae9d 100644 --- a/org-taskjuggler.el +++ b/org-taskjuggler.el @@ -244,6 +244,8 @@ defined in `org-export-taskjuggler-default-reports'." (buffer (find-file-noselect filename)) (old-level 0) task resource) + (unless tasks + (error "No taskjuggler project found")) ;; add a default resource (unless resources (setq resources --8<---------------cut here---------------end--------------->8--- Dan > > TaskJuggler uses a text format to define projects, tasks and resources, > so it is a natural fit for org-mode. It can produce all sorts of reports > for tasks or resources in either HTML, CSV or PDF. The current version > of TaskJuggler requires KDE but the next version is implemented in Ruby > and should therefore run on any platform. > > The exporter is a bit different from other exporters, such as the HTML > and LaTeX exporters for example, in that it does not export all the > nodes of a document or strictly follow the order of the nodes in the > document. > > Instead the TaskJuggler exporter looks for a tree that defines the > tasks and a optionally tree that defines the resources for this > project. It then creates a TaskJuggler file based on these trees > and the attributes defined in all the nodes. > > * Installation > > Put the attached file into your load-path and the following line into > your ~/.emacs: > > (require 'org-taskjuggler) > > The interactive functions are similar to those of the HTML and LaTeX > exporters: > > M-x `org-export-as-taskjuggler' > M-x `org-export-as-taskjuggler-and-open' > > * Tasks > > Let's illustrate the usage with a small example. Create your tasks as > you usually do with org-mode. Assign efforts to each task using > properties (it's easiest to do this in the column view). You should end > up with something similar to the example by Peter Jones in > http://www.contextualdevelopment.com/static/artifacts/articles/2008/project-planning/project-planning.org. > Now mark the top node of your tasks with a tag named > "taskjuggler_project" (or whatever you customized > `org-export-taskjuggler-project-tag' to). You are now ready to export > the project plan with `org-export-as-taskjuggler-and-open' which will > export the project plan and open a gant chart in TaskJugglerUI. > > * Resources > > Next you can define resources and assign those to work on specific > 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). 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 > > C-c C-x p allocate RET RET > > Once the allocations are done you can again export to TaskJuggler and > check in the Resource Allocation Graph which person is working on what > task at what time. > > * Export of properties > > The exporter also takes TODO state information into consideration, i.e. > if a task is marked as done it will have the corresponding attribute in > TaskJuggler ("complete 100"). Also it will export any property on a task > resource or resource node which is known to TaskJuggler, such as limits, > vacation, shift, booking, efficiency, journalentry, rate for resources > or account, start, note, duration, end, journalentry, milestone, > reference, responsible, scheduling, etc for tasks. > > * Dependencies > > The exporter will handle dependencies that are defined in the tasks > either with the ORDERED attribute (see TODO dependencies in the Org 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. > > Thanks > Christian