Tasker version 0.3

(Manage a to-do list via the web)

Maintained by Russ Allbery <rra@stanford.edu>

Copyright 2003, 2004, 2008 Russ Allbery <rra@stanford.edu>. This software is distributed under an MIT-style license. Please see the section LICENSE below for more information.

DESCRIPTION

Tasker is a lightweight to-do list manager. There are tons of these out there, I know, and I've looked at several of them. Here are the reasons why I wrote a new one rather than using one of the existing ones:

So I wrote Tasker. Since I was working on learning Python, I wrote it in Python. This is the first Python CGI program that I've written (although I've written many CGI programs in other languages). This is also the first Python module I've written. Any recommendations on coding style or Python techniques are appreciated, as I'm still learning the language.

Tasker has two views, an overview of all of the open tasks (with a form at the bottom to add a new task or group), and a detail view of each task. A task may have any number of subtasks, seen in the detail view. Each task belongs to a group and has a priority from 1 to 5, and the main view can be limited by group or to only tasks with a given priority or higher. Tasks can be marked complete (at which point they disappear) from the main screen, and subtasks can be marked complete or the task edited from the detail view.

That's pretty much all there is to it. For more details of how Tasker works behind the scenes, see the separate DESIGN file.

REQUIREMENTS

Tasker is written assuming Python 2.3 or later, as this was the current stable version of Python when I originally wrote it. I haven't tried to find any alternate techniques for things introduced in 2.3 or to test Tasker against any older version. My past experience is that requiring the current stable version causes a bit of problems originally and quickly ceases to be a problem, and supporting older versions wasn't worth the effort during early development.

Since Tasker is a CGI application, it requires a web server configured to run CGI scripts and some area where it can read and write data as the user the web server runs it as. Other than that, it doesn't require any other packages, database, or libraries.

The output of Tasker uses CSS extensively for formatting. I've only checked the output in Mozilla, so browsers with inferior or differing CSS support may have some minor problems. If so, please let me know, and I'm happy to work with you to try to fix them.

INSTALLATION

Tasker comes as a Python module, with a small wrapper around that module that can be run as a CGI script. If you have access to install new Python modules, you can install the main Tasker module with:

    python setup.py install

This will install tasker.py into your local module directory, and will install the wrapper, the sample configuration file, and the style sheet into prefix/share/tasker (/usr/local/share/tasker by default). These files are just there for convenience in setting up new Tasker to-do lists; Tasker won't use them from that location.

If you don't have access to install new Python modules, don't worry. You can still use Tasker if you can run CGI applications.

Just installing Tasker won't actually do anything. To set up a to-do list, you need to create a CGI script and database area and configure it. To do this, copy tasker and tasker_config.py from prefix/share/tasker (or directly from the distribution if you want) into your cgi-bin directory, wherever that is. Note that you may need to rename tasker to tasker.cgi if your web server requires this. Then, copy tasker.css from the distribution or from prefix/share/tasker into your regular web space and note the URL of where you put it. (Make sure that your web server serves out *.css files as text/css, or the style sheet won't work.)

Now, edit tasker_config.py to match your local configuration. There are extensive comments that should explain what all the settings are. The main things you'll need to do are create two directories, one for active tasks and one for archived completed tasks, and change the URL of the style sheet to reflect where you put it. You can also change the short cuts that appear at the top of each page.

Note that the two directories must be writable by whatever user your server runs CGI scripts as, generally something like web, www, or www-data. If you have root on your system, just make them owned by the user the web server runs CGI scripts as. If you don't have root access, hopefully your server administrator has configured your CGI scripts to run as your regular identity, so you don't need to do anything other than create the directories.

Finally, if you weren't able to install Tasker in the site Python module directory, just copy tasker.py into the same directory as the CGI wrapper and tasker_config.py. Python should be able to find it there.

Now, go to the URL of the tasker CGI script and see if you get a form to add new tasks and groups. If so, hopefully things are working properly. You can start by creating a new group, since you won't have any to begin with, and then you'll be able to create a new task in that group and see it in the menu. Clicking on the name of the task will show you the detail view.

If there are any problems, you'll get an exception and traceback. Right now, the error handling isn't particularly pretty, but if you scroll down to the bottom of the traceback, you'll hopefully get a hint as to what the problem is.

Once you have things working, you'll probably want to limit who can access your to-do list. Tasker doesn't have any internal security; it relies completely on the security enforced by your web server. You can usually limit who can access the script by putting a .htaccess file in the same directory as the Tasker CGI script specifying either a password or limiting access to particular hosts; see the documentation of your web server for more details.

INSTALLATION EXAMPLE

Here's a sample Apache configuration for running Tasker under todo.example.com with Apache 2.0. The idea here is that there will be a separate Tasker installation for each user using it, all under the same domain name. In /work/tasker/styles is the tasker.css style sheet, and then there is a directory under /work/tasker for each user. In the user's directory are two subdirectories, data and archive, writable by the web server, and the tasker CGI wrapper and tasker_config.py file.

    <VirtualHost *>
        ServerName tasker.example.com
        DocumentRoot "/work/tasker"
        <Directory "/">
            Options None
            AllowOverride None
            Order deny,allow
            Deny from all
        </Directory>
        <Directory "/work/todo/styles">
            Options None
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
        ScriptAliasMatch /([a-z]+)/tasker($|[/?].*) \
            /work/tasker/$1/tasker$2
        RedirectMatch permanent ^/([a-z]+)/?$ \
            http://tasker.example.com/$1/tasker
        <Location ~ "^/[a-z]+/tasker">
            Order deny,allow
            Deny from all
            Allow from localhost
        </Location>
    </VirtualHost>

This configuration only allows the to-do manager to be accessed from localhost (suitable if, for example, you're running Apache 2.0 on your personal machine and you're the only user). Generally, you'll instead want to use AuthType Basic, AuthUserFile, and Require user, or some other similar access control mechanism, or at least expand the hosts that can access the to-do list.

In this setup, data is set to /work/tasker/<user>/data for each user's tasker_config.py (replacing <user> with the user's directory name, of course), and archive is similarly set to /work/tasker/<user>/archive. style_url is set to http://tasker.example.com/styles/tasker.css.

SOURCE REPOSITORY

Tasker is maintained using Git. You can access the current source by pointing a Git client at:

    http://archives.eyrie.org/software/git/tasker.git

No gitweb interface is available (yet).

LICENSE

Copyright 2003, 2004 Russ Allbery <rra@stanford.edu>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Converted to XHTML by faq2html version 1.33