App-Todo

 view release on metacpan or  search on metacpan

bin/todo.pl  view on Meta::CPAN


=head1 TASKS

Methods related to manipulating tasks -- the meat of the script.

=cut

sub list_tasks {
    my $query = shift || $default_query;

    if( scalar @ARGV ){
        $query = join '/', @ARGV;
    }

    #substitute actual query if this is a named search.
    if( defined $config{named_searches}->{$query} ){
        $query = $config{named_searches}->{$query};
        $query =~ s!\s+!/!g;
    }

    my $tag;
    $query .= "/tag/$tag" while $tag = shift @{$args{tag}};

    for my $key (qw(group priority due)) {
        $query .= "/$key/$args{$key}" if $args{$key};
    }

    $query .= "/owner/$args{owner}";

    my $tasks = download_tasks($query);
    if (@$tasks == 0)
    {
        print "You have no matching tasks.\n";
        return;
    }
 
    for my $t (@$tasks) {
        printf "#%4s ", $locator->encode($t->{id});

        print colored('(' . priority_to_string($t->{priority}) . ')',
                      priority_to_color($t->{priority})), ' '
            if $t->{priority} != 3;

        print colored($t->{summary}, priority_to_color($t->{priority}));
        
        print ' ', colored("(Due " . $t->{due} . ")",
                           (overdue($t->{due}) ? 'magenta' : 'dark'))
            if $t->{due};

        if ($t->{tags}) {
            print color('reset'), ' ', color('dark');
            print '[' . $t->{tags} . ']';
        }

        $t->{owner} =~ s/<nobody>/<nobody\@localhost>/;
        $t->{requestor} =~ s/<nobody>/<nobody\@localhost>/;
        
        my ($owner) = Email::Address->parse($t->{owner});
        my ($requestor) = Email::Address->parse($t->{requestor});

        my $not_owner = lc $owner->address ne lc $config{email};
        my $not_requestor = lc $requestor->address ne lc $config{email};
        if( $t->{group} || $not_owner || $not_requestor ) {
            print color('reset'), ' ', color('dark');
            print '(';
            print join(", ",
                       $t->{group} || "personal",
                       $not_requestor ? "for " . $requestor->name : (),
                       $not_owner ? "by " . $owner->name : (),
                      );
            print ')';
        }
        
        print color('reset');
        print "\n";
    }
}

sub do_task {
    my $task = get_task_id('complete');
    my $result = call(UpdateTask =>
                      id         => $task,
                      complete   => 1);
    result_ok($result, "Finished task");
}

sub add_task {
    my $summary = join(" ",@ARGV) or pod2usage(-message => "Must specify a task description");
    my %task = %{args_to_task()};
    $task{summary} = $summary;
    $task{owner_id} = $config{email};


    my $result = call(CreateTask => %task);
    result_ok($result, "Created task");
}

sub edit_task {
    my $task = get_task_id('edit');
    my $summary = join(" ",@ARGV);
    my %task = %{args_to_task()};
    $task{id} = $task;
    $task{summary} = $summary if $summary;

    my $result = call(UpdateTask => %task);
    result_ok($result, "Updated task");
}

sub tag_task {
    my $task = get_task_id('tag');
    my @tags = @ARGV;

    my $tasks = download_tasks("id/" . $locator->encode($task));
    my $tags = $tasks->[0]{tags} ||'';

    my $result = call(UpdateTask =>
                      id      => $task,
                      tags    => $tags . " " . join_tags(@tags));

    result_ok($result, "Tagged task");
}

sub del_task {
    my $task = get_task_id('delete');
    my $result = call(DeleteTask => id => $task);

    result_ok($result, "Deleted task");
}



( run in 2.380 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )