Importing Tasks

I am reading the manual for Omniplan iOS and see that you can import other .oplx files or upgrade to pro to import a MS Project file but is there any other way to import a task list?

My workflow for creating a Project is to first create a task list and organise into indented groups, tasks and milestones - because I make mistakes and because I organise better this way. After I have the task list then I create the rest of the task attributes - resources, durations, dependencies etc.

Note I have only procured the iOS version for working with the iPad Pro. Probably end up getting the Mac version in time.

Until you find a better solution, make a blank OP document, and create your task list and indented groups there, then move them into your main project.

@Rim12Tech OmniPlan for iOS doesn’t offer a great way to do this at this point in time, but I’d be happy to let the team know you’d find it helpful in your workflow! Would you find it more useful to be create this type of outline quickly in OmniPlan, or to be able to import an outline created in a different application?

1 Like

@ains I think my preference would be to import from another program. It comes down to what file format that Omni plan would recognise such as csv/comma delimited.

I appreciate you passing this information onto the dev team. Oh I would also assist with testing as I am also learning iOS in my spare time.

Cheers

Nathan

@Rim12Tech Thanks, that’s helpful to know!

Ok ended up getting the Mac standard version as well which enables you to work in a task view and import a csv file outline of your project. This is the exact functionality that I would certainly welcome on the iOS version. Although I have a work around now for a truely mobile iOS experience the task view and import csv file format would be great additions.

1 Like

This post was flagged by the community and is temporarily hidden.

I’d REALLY like to see import of tasks from some generic file format: OPML or TaskPaper or similar, much in the way that OmniFocus’s recent automation update allows.

Such a generic format import/export could then serve as a bridge to allow importing or exporting tasks to or from OmniOutliner and OmniFocus, which would be FANTASTIC, and would make OmniPlan super useful for my practice.

1 Like

…2019 and we are still waiting for this feature in the pro version.

Thank you!

And now we’re more than halfway through 2020. Is there any way at all of getting tasks into OmniPlan for iOS, without leaving iOS, other than retyping them? I’ve noticed there isn’t even a paste option.

This is the reason I have given up using omniplan for iOS, i use other pm tools on the cloud and desk top not Omniplan, but want to import plans for use on the ipad, cant do it. Omniplan Pro for iOS only supports MPP format which is a complete waste of time for me. I use Omnifocus all the time and would like to move projects between the 2 but I cant. I certainly won’t be upgrading to version 4 on iOS at this rate.

There’s a plugin on the Omni Automation site for moving tasks from OmniFocus to OmniPlan. (Sorry, I haven’t tried the plugin, but it might be useful to someone.)

I was able to import from iThoughts to OmniPlan on iOS by creating a plugin (the plugin does half the work, actually; there was more scripting involved specific to iThoughts native file format). My point is really that I think I’ll be using OmniPlan more now that I’ve found a way to import.

1 Like

Not sure how many other folks want to import from iThoughts to OmniPlan, but I decided to post the scripts. Basically, it’s a two step process and, in addition to iThoughts and OmniPlan, you also need Pyto (I suspect it can be easily adapted to other iOS Python implementations, but that’s the one I used).

The Python script opens the iThoughts .itmz file (the format is undocumented, so how long this will work is anyone’s guess) and creates a .json file.

The Omni Automation plug-in loads data from the .json file into OmniPlan. The plug-in works, so far, under OmniPlan 3 and the Testflight version of OmniPlan 4.

The following information is copied from iThoughts:

  • Topic name as task name (note that the main topic becomes the project name)
  • Notes
  • Start date as a Start at earliest constraint
  • Due date as an End at latest constraint
  • Effort
  • Cost as Task Cost
  • Progress as Completion
  • Priority as Leveling Priority
  • Resources
  • A finish-start dependency is added for topics joined by a relationship

The Python script follows, since I can’t attach it. The Omni Automation plug-in is attached.iThoughtsJSON.omnijs (5.1 KB)

# This script extracts the overall map structure
# and project-related attributes from an
# iThoughts .itmz file in JSON format. The
# intended use is with a companion omnijs
# plugin that subsequently loads the JSON into OmniPlan.

# Note that the output file is named based on the root
# node of the map (so probably best to avoid any characters that
# doesn't work well in a file name) and it will appear
# in the pyto folder. 

# While most of the code should be generic,
# the bookmarks module, which is basically an
# iOS file picker that remembers the last selection, is
# specific to pyto, as far as I know.

# The format of the .itmz file, which is actually a zip
# archive, and the mapdata.xml file contained
# within are undocumented and may very well change.

# There should be no expectation that this script is fit for any
# purpose. It may not even serve as a warning to others of the
# dangers of poor software development practice.

import zipfile
import bookmarks as bm
from lxml import etree
import json

resources = set()

def format_task(t, n, td, r):
    topics = t.xpath('./topic')
    if len(topics) == 0 :
        return
    td['topics'] = []   
    for topic in topics:
        t_dict = {}
        t_dict['uuid'] = topic.get('uuid')
        t_dict['text'] = topic.get('text')
        note = topic.get('note')
        if note:
            t_dict['note'] = note
        progress = topic.get('task-progress')
        if progress:
            t_dict['progress'] = progress
        effort = topic.get('task-effort')
        if effort:
            t_dict['effort'] = effort
        start = topic.get('task-start')
        if start:
            t_dict['start'] = start
        due = topic.get('task-due')
        if due:
            t_dict['due'] = due
        resources = topic.get('resources')
        if resources:
            res = resources.split(',')
            t_dict['resources'] = res
            r.update(res)
        priority = topic.get('task-priority')
        if priority:
            t_dict['priority'] = priority
        cost = topic.get('cost')
        costType = topic.get('cost-type')
        if cost and costType and costType == '1':
            t_dict['cost'] = cost
        nn = n + 1
        format_task(topic,nn,t_dict, r)
        td['topics'].append(t_dict)

itmz_file = bm.FileBookmark("my_itmz_file").path

with zipfile.ZipFile(itmz_file) as myzip:
    with myzip.open('mapdata.xml') as mydata:
        content = {}
        mapdata = etree.parse(mydata)
        root = mapdata.getroot()
        
        topics = root.xpath('//topics/topic')
        topic_list = []
        for topic in topics:
            t_dict = {}
            t_dict['uuid'] = topic.get('uuid')
            top = topic.get('text')
            t_dict['text'] = top
            format_task(topic, 0, t_dict, resources)
            topic_list.append(t_dict)
            
        rels = root.xpath('//relationships/relationship')
        rel_list = []
        for rel in rels:
            r_dict = {}
            r_dict['uuid1']  = rel.get('end1-uuid')
            r_dict['uuid2']  = rel.get('end2-uuid')
            r_dict['style1'] = rel.get('end1-style')
            r_dict['style2'] = rel.get('end2-style')
            r_dict['type']   = rel.get('type')
            rel_list.append(r_dict)

        content['topics']        = topic_list
        content['resources']     = sorted(resources)
        content['relationships'] = rel_list
        
        json_file = open(top + '.json', 'w')
        json.dump(content, json_file)
        json_file.close()

        
print('Done converting iThoughts file. Output in ' + top + '.json')

# We don't want to remember our file selection for next time                                                                                                                                                                                                                             
bm.FileBookmark("my_itmz_file").delete_from_disk()
1 Like

I’ll just point out that iThoughts can export to CSV. This is pretty stable. Enough so that I wrote filterCSV to manipulate the format - including colouring nodes based on rules.

With filterCSV you can (and I do) import the result back into iThoughts.

I mention this because:

  1. It might be a useful part of the toolchain eg in preparing a mind map for this code to import into OmniPlan.
  2. It occurred to me that CSV is probably the stabler format to be working with than .itmz.

Note: I don’t have OmniPlan so can’t test. (But I do participate in Omni Group forums and will monitor this thread.)

Thanks, Martin. I had considered the CSV format, but in the context of having to add a pure JavaScript CSV parser to the OmniJS plugin. After carefully reviewing established practice (a quick glance at StackOverflow) that seemed less attractive than just getting something working. However, I didn’t consider processing the CSV with Python.

Another possibility might have been Markdown, which is interesting now, given the work that draft8 has done. I also looked at iThoughts MS Project XML format, which, unfortunately, doesn’t properly capture effort (all tasks are milestones).

One point that wasn’t clear to me about the CSV format was whether you can reliably infer the hierarchy. Based on the work you have done with FilterCSV, that doesn’t appear to be an issue. However, one potential gap is that the CSV format doesn’t appear to capture links between topics, which I believe is the most intuitive way to represent task constraints.