Allow for mass-processing of requests -- close and assign points to the
last answer on the request.
Patch by LiveJournal; packaged for Dreamwidth by kareila.
diffs (236 lines):
diff -r 77110236993c -r a5d459a0e358 cgi-bin/LJ/Support.pm
--- a/cgi-bin/LJ/Support.pm Fri Jul 02 14:21:44 2010 +0800
+++ b/cgi-bin/LJ/Support.pm Fri Jul 02 14:43:08 2010 +0800
@@ -143,13 +143,13 @@ sub load_email_to_cat_map
return $map;
}
-sub calc_points
-{
- my ($sp, $secs) = @_;
- my $base = $sp->{_cat}->{'basepoints'} || 1;
+sub calc_points {
+ my ( $sp, $secs, $spcat ) = @_;
+ $spcat ||= $sp->{_cat};
+ my $base = $spcat->{basepoints} || 1;
$secs = int($secs / (3600*6));
my $total = ($base + $secs);
- if ($total > 10) { $total = 10; }
+ $total = 10 if $total > 10;
return $total;
}
@@ -467,6 +467,27 @@ sub load_request
}
return $sp;
+}
+
+# load_requests:
+# Given an arrayref, fetches information about the requests
+# with these spid's; unlike load_request(), it doesn't fetch information
+# about supportcats.
+
+sub load_requests {
+ my ( $spids ) = @_;
+ my $dbr = LJ::get_db_reader() or return;
+
+ my $list = join( ',', map { '?' } @$spids );
+ my $requests = $dbr->selectall_arrayref(
+ "SELECT spid, reqtype, requserid, reqname, reqemail, state," .
+ " authcode, spcatid, subject, timecreate, timetouched, timeclosed," .
+ " timelasthelp FROM support WHERE spid IN ($list)",
+ { Slice => {} }, map { $_ + 0 } @$spids
+ );
+ die $dbr->errstr if $dbr->err;
+
+ return $requests;
}
sub load_response
@@ -797,6 +818,59 @@ sub set_points
}
}
+# closes request, assigning points for the last response left to the request
+
+sub close_request_with_points {
+ my ( $sp, $spcat, $remote ) = @_;
+
+ my $spid = $sp->{spid} + 0;
+ my $dbh = LJ::get_db_writer() or return;
+
+ # close the request
+ $dbh->do( 'UPDATE support SET state="closed", '.
+ 'timeclosed=UNIX_TIMESTAMP() WHERE spid=?', undef, $spid );
+ die $dbh->errstr if $dbh->err;
+
+ # check to see who should get the points
+ my $response = $dbh->selectrow_hashref(
+ 'SELECT splid, timelogged, userid FROM supportlog '.
+ 'WHERE spid=? AND type="answer" '.
+ 'ORDER BY timelogged DESC LIMIT 1', undef, $spid );
+ die $dbh->errstr if $dbh->err;
+
+ # deliberately not using LJ::Support::append_request
+ # to avoid sysban checks etc.; this sub is supposed to be fast.
+
+ my $sth = $dbh->prepare(
+ 'INSERT INTO supportlog '.
+ '(spid, timelogged, type, userid, message) VALUES '.
+ '(?, UNIX_TIMESTAMP(), "internal", ?, ?)' );
+
+ unless ( defined $response ) {
+ # no points awarded
+ $sth->execute( $spid, LJ::want_userid( $remote ),
+ "(Request has been closed as part of mass closure)" );
+ die $sth->errstr if $sth->err;
+ return 1;
+ }
+
+ # award the points
+ my $userid = $response->{userid};
+ my $points = LJ::Support::calc_points(
+ $sp, $response->{timelogged} - $sp->{timecreate}, $spcat );
+
+ LJ::Support::set_points( $spid, $userid, $points );
+
+ my $username = LJ::want_user( $userid )->display_name;
+
+ $sth->execute( $spid, LJ::want_userid( $remote ),
+ "(Request has been closed as part of mass closure, " .
+ "granting $points points to $username for response #" .
+ $response->{splid} . ")" );
+ die $sth->errstr if $sth->err;
+ return 1;
+}
+
sub touch_request
{
my ($spid) = @_;
diff -r 77110236993c -r a5d459a0e358 htdocs/support/actmulti.bml
--- a/htdocs/support/actmulti.bml Fri Jul 02 14:21:44 2010 +0800
+++ b/htdocs/support/actmulti.bml Fri Jul 02 14:43:08 2010 +0800
@@ -19,7 +19,7 @@ body<=
{
use strict;
use vars qw(%POST);
-
+
my $remote = LJ::get_remote();
return "<?needlogin?>" unless $remote;
@@ -49,7 +49,7 @@ body<=
my $in = join ',', @ids;
$dbh->do("UPDATE support SET state='closed',
timeclosed=UNIX_TIMESTAMP() " .
"WHERE spid IN ($in) AND spcatid = ?", undef, $spcatid);
-
+
# and now insert a log comment for all of these... note that we're not
using
# LJ::Support::append_request because that'd require us to load a
bunch of requests
# and then do a bunch of individual queries, and that sucks.
@@ -61,9 +61,28 @@ body<=
my $sql = "INSERT INTO supportlog (spid, timelogged, type, userid,
message) VALUES ";
$sql .= join ',', @stmts;
$dbh->do($sql);
-
+
# return redirection back? or success message otherwise
- return BML::redirect($POST{ret}) if $POST{ret};
+ return BML::redirect( sprintf( $POST{ret}, '' ) ) if $POST{ret};
+ return "<?h1 $ML{'.success'} h1?><?p $ML{'.request.specified'} p?>";
+ } elsif ( $POST{'action:closewithpoints'} ) {
+ my $can_close = 0;
+ $can_close = 1 if LJ::Support::can_close_cat( { _cat => $cat },
$remote );
+ return "<?h1 $ML{'.error'} h1?><?p $ML{'.not.have.access'} p?>" unless
$can_close;
+
+ # let's implement a limit so that we don't overload
+ # the DB and/or timeout
+ my @filtered_ids = splice( @ids, 0, 50 );
+
+ my $requests = LJ::Support::load_requests( \...@filtered_ids );
+
+ foreach my $sp ( @$requests ) {
+ LJ::Support::close_request_with_points( $sp, $cat, $remote );
+ }
+
+ return BML::redirect( sprintf( $POST{ret},
+ '&mark=' . join( ',', @ids ) ) )
+ if $POST{ret};
return "<?h1 $ML{'.success'} h1?><?p $ML{'.request.specified'} p?>";
} elsif ($POST{'action:move'}) {
return "<?h1 $ML{'.error'} h1?><?p
$ML{'.not.have.access.move.request'} p?>"
@@ -90,7 +109,7 @@ body<=
$dbh->do($sql);
# done now
- return BML::redirect($POST{ret}) if $POST{ret};
+ return BML::redirect( sprintf( $POST{ret}, '' ) ) if $POST{ret};
return "<?h1 $ML{'.success'} h1?><?p $ML{'.request.moved'} p?>";
}
}
diff -r 77110236993c -r a5d459a0e358 htdocs/support/help.bml
--- a/htdocs/support/help.bml Fri Jul 02 14:21:44 2010 +0800
+++ b/htdocs/support/help.bml Fri Jul 02 14:43:08 2010 +0800
@@ -255,9 +255,14 @@ body<=
$ret .= "<form method='post' action='/support/actmulti'>" . LJ::form_auth()
if $can_close && $rct;
# start the rest of the table
+
+ my %marked = map { $_ => 1 } split( ',', $GET{mark} );
my $uri = "$LJ::SITEROOT/support/help?cat=$filtercat&state=$state";
$ret .= "<p><table class='supporttable'><tr bgcolor='#d0d0d0'>\n";
- $ret .= "<td> <b>X</b></td>\n" if $can_close;
+ if ( $can_close ) {
+ my $link = "$uri&sort=$sort&closeall=" . ( $GET{closeall} ? 0 : 1 );
+ $ret .= "<td> <b><a href='$link'>X</a></b></td>\n";
+ }
my @headers = ( id => "ID#", summary => $ML{'.th.summary'}, area =>
$ML{'.th.problemarea'}, date => $ML{'.th.posted'} );
while (my ($sorttype, $desc) = splice(@headers, 0, 2)) {
if ($sort eq $sorttype) {
@@ -288,6 +293,9 @@ body<=
$status = "answered<br /><b>still needs help</b>";
$barbg = "green";
}
+ my $original_barbg = $barbg;
+ $barbg = 'clicked' if ( $GET{closeall} && $original_barbg eq 'yellow' )
+ || $marked{$sp->{spid}};
next if $state eq "green" && $barbg ne "green";
@@ -337,9 +345,13 @@ body<=
# generate the HTML for this row
$ret .= "<tr valign='top' $style $js>\n";
if ($can_close) {
- $ret .= "<td>" . LJ::html_check({ name => "check_$sp->{spid}", id =>
"check_$sp->{spid}",
- onclick => "doClick($sp->{spid});",
selected => $GET{closeall}, }) .
- "<input type='hidden' name='c$sp->{spid}' id='c$sp->{spid}'
value='$barbg' /></td>\n";
+ $ret .= "<td>";
+ $ret .= LJ::html_check( { name => "check_$sp->{spid}",
+ id => "check_$sp->{spid}",
+ onclick => "doClick($sp->{spid});",
+ selected => $barbg eq 'clicked' } );
+ $ret .= "<input type='hidden' name='c$sp->{spid}' id='c$sp->{spid}'
value='$original_barbg' />";
+ $ret .= "</td>\n";
$js = "onclick='return doClick($sp->{spid});'";
}
$ret .= "<td><b><a
href=\"$LJ::SITEROOT/support/see_request?id=$sp->{'spid'}\"
$js>$sp->{'spid'}</a></b></td>";
@@ -357,7 +369,7 @@ body<=
my $time = time();
$ret .= LJ::html_hidden('ids', join(':', map { $_->{spid} } @support_log),
'spcatid', $fcat->{spcatid},
- 'ret',
"/support/help?state=$state&cat=$filtercat&time=$time");
+ 'ret',
"/support/help?state=$state&cat=$filtercat&time=$time%s");
$ret .= "<br />";
$ret .= LJ::html_submit('action:move', 'Move Marked Requests');
$ret .= " to ";
@@ -371,6 +383,9 @@ body<=
$ret .= LJ::html_submit('action:close', 'Close Marked Requests',
{ onclick => 'return confirm("Are you sure you
want to close the marked requests?");' });
$ret .= " (this is permanent)";
+ $ret .= "<br /><br />";
+ $ret .= LJ::html_submit('action:closewithpoints', 'Close Marked Requests,
granting points to last responses',
+ { onclick => 'return confirm("Are you sure you
want to close the marked requests?");' });
$ret .= "</form>";
}
$ret .= "<?hr?>";
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog