Reminder email and wiki page for trac
I wrote this a long time ago, never had a chance to update it, and somebody asked on the trac
mailing list today…
You can get ADMMailHandler
in the ADMLogger package (sorry, too lazy today).
You need to configure a few places too. Like I implied, not quite ready for public consumption, but at my rate never will be. Please feel free to "upstream" me any changes.
Also, if there is a trac project that matches the user name (that's how my company does trac sandboxes) then it will also create a page MyTickets with a dump of links.
#!/usr/bin/perl -w use strict; # Script to send email reminders in a cron job. # Email trac at revragnarok <.> com # I should've made it DBI compliant - but I'm not getting paid for this ;) BEGIN { push @INC, "/usr/src/my_scripts/mail_reminder"; # Where ADMMailHandler is hiding } use Data::Dumper; use ADMMailHandler; use DirHandle; use constant URLbeforeproj => 'http://webmail.revragnarok.com/'; use constant URLafterproj => '/ticket/'; use constant Nodomain => '@yourdomain.com'; use constant Subject => 'Outstanding tickets'; chdir("/var/www/trac"); my (%proj, %user); my @projs; # Look in directory for project names my $dh = DirHandle->new('.') or die "Can't open trac directory! : $!\n"; while (defined ($_ = $dh->read)) { # Does it have a trac DB? if (-e "$_/db/trac.db") { push @projs, $_; } # -e } foreach my $projname (@projs) { # Open each one open(SQL,"/usr/bin/sqlite3 $projname/db/trac.db \"select id,status,owner,summary from ticket where status != 'closed'\"|"); while (<SQL>) { chomp; my ($id, $status, $owner, $summary) = split /\|/; #print "Proj: $projname, ID: '$id', status: '$status', owner: '$owner', summary: '$summary'\n"; next if ($owner eq ''); $user{$owner}{"$projname-$id"} = $summary; } close(SQL); } foreach my $username (sort keys %user) { # Verify it is valid my $fullname = $username; $fullname.= Nodomain if ($fullname !~ /@/); # Put together the email my $mh = ADMMailHandler::new($fullname, 1, Subject); $mh->append(qq{<TABLE WIDTH=95% BORDER=1><TR> <TD><B><U>Project</U></B></TD> <TD><B><U>Ticket Summary</U></B></TD></TR>}); foreach my $ticket (sort keys %{$user{$username}}) { my ($proj, $num) = split(/-/, $ticket); # print "Processing (proj = $proj) (num = $num) (summary = $user{$username}{$ticket})\n"; $mh->append(qq{<TR><TD>$proj #$num</TD><TD><A HREF="}.URLbeforeproj.$proj.URLafterproj.$num.qq{">}.$user{$username}{$ticket}."</A></TD></TR>\n"); } $mh->append("</TABLE>"); $mh->sendit(); # Now we'll make a special 'MyTickets' wiki page if the person has their own sandbox my ($tryname, undef) = split(/@/, $fullname); if (scalar grep(/^${tryname}$/, @projs)) { # There is a match open(WIKI, ">/tmp/$$"); print WIKI "== My Tickets ==\n||'''__Project__'''||'''__Ticket Summary__'''||\n"; foreach my $ticket (sort keys %{$user{$username}}) { my ($proj, $num) = split(/-/, $ticket); print WIKI "||$proj !#$num||[$proj:ticket:$num $user{$username}{$ticket}]||\n"; } close WIKI; `/usr/bin/trac-admin $tryname wiki remove MyTickets > /dev/null 2>/dev/null`; `/usr/bin/trac-admin $tryname wiki import MyTickets /tmp/$$`; unlink "/tmp/$$"; } # Sandbox or not } # Each username
Comments
No comments.