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 )