version 1.347, 2012/03/16 18:32:47
|
version 1.350, 2012/03/17 04:55:10
|
Line 513 imscp_v1p1.xsd http://www.imsglobal.org/
|
Line 513 imscp_v1p1.xsd http://www.imsglobal.org/
|
my $currdepth = 0; |
my $currdepth = 0; |
my $firstidx = $alldiscussion{$showposts[0]}; |
my $firstidx = $alldiscussion{$showposts[0]}; |
foreach my $post (@showposts) { |
foreach my $post (@showposts) { |
unless (($sortposts eq 'thread') || (($sortposts eq '') && ($env{'environment.threadeddiscussion'})) || ($outputtarget eq 'export')) { |
unless (($sortposts eq 'thread') || |
|
(($sortposts eq '') && (!$env{'environment.unthreadeddiscussion'})) || |
|
($outputtarget eq 'export')) { |
$alldiscussion{$post} = $post; |
$alldiscussion{$post} = $post; |
} |
} |
unless ( ($notshown{$alldiscussion{$post}} eq '1') || ($shown{$alldiscussion{$post}} == 0) ) { |
unless ( ($notshown{$alldiscussion{$post}} eq '1') || ($shown{$alldiscussion{$post}} == 0) ) { |
Line 1117 sub build_posting_display {
|
Line 1119 sub build_posting_display {
|
my $origindex='0.'; |
my $origindex='0.'; |
my $numoldver=0; |
my $numoldver=0; |
if ($contrib{$idx.':replyto'}) { |
if ($contrib{$idx.':replyto'}) { |
if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) { |
if ( ((!$env{'environment.unthreadeddiscussion'}) && ($sortposts eq '')) || |
|
($sortposts eq 'thread') || ($outputtarget eq 'export')) { |
# this is a follow-up message |
# this is a follow-up message |
$original[$idx]=$original[$contrib{$idx.':replyto'}]; |
$original[$idx]=$original[$contrib{$idx.':replyto'}]; |
$$depth[$idx]=$$depth[$contrib{$idx.':replyto'}]+1; |
$$depth[$idx]=$$depth[$contrib{$idx.':replyto'}]+1; |
Line 1330 sub build_posting_display {
|
Line 1333 sub build_posting_display {
|
} |
} |
if ($outputtarget eq 'export' || $message) { |
if ($outputtarget eq 'export' || $message) { |
my $thisindex=$idx; |
my $thisindex=$idx; |
if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) { |
if ( ((!$env{'environment.unthreadeddiscussion'}) && ($sortposts eq '')) || |
|
($sortposts eq 'thread') || ($outputtarget eq 'export')) { |
$thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2); |
$thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2); |
} |
} |
$$alldiscussion{$thisindex}=$idx; |
$$alldiscussion{$thisindex}=$idx; |
Line 3204 sub getdiscussionrecords {
|
Line 3208 sub getdiscussionrecords {
|
|
|
sub getdiscussionstats { |
sub getdiscussionstats { |
my %record=&getdiscussionrecords(@_); |
my %record=&getdiscussionrecords(@_); |
return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$record{'totalvotes'}); |
my $totalvotes = $record{'totallikes'} + $record{'totalunlikes'}; |
|
return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$totalvotes); |
} |
} |
|
|
# Calculate discussion karma |
# Calculate discussion karma |
Line 3268 sub storediscussionpoints {
|
Line 3273 sub storediscussionpoints {
|
# Store discussion "likes" |
# Store discussion "likes" |
|
|
sub storediscussionlikes { |
sub storediscussionlikes { |
my ($likes,$uname,$udom,$course)=@_; |
my ($chglikes,$chgunlikes,$uname,$udom,$course,$context)=@_; |
unless ($likes) { $likes=0; } |
|
if ($likes>0) { $likes=1; } |
|
if ($likes<0) { $likes=-1; } |
|
unless ($uname) { $uname=$env{'user.name'}; } |
unless ($uname) { $uname=$env{'user.name'}; } |
unless ($udom) { $udom=$env{'user.domain'}; } |
unless ($udom) { $udom=$env{'user.domain'}; } |
unless ($course) { $course=$env{'request.course.id'}; } |
unless ($course) { $course=$env{'request.course.id'}; } |
my %record=&getdiscussionrecords($uname,$udom,$course); |
my %record=&getdiscussionrecords($uname,$udom,$course); |
my $totallikes=$record{'totallikes'}; |
my $totallikes=$record{'totallikes'}; |
my $totalvotes=$record{'totalvotes'}; |
my $totalunlikes=$record{'totalunlikes'}; |
$totallikes+=$likes; |
$totallikes += $chglikes; |
$totalvotes++; |
$totalunlikes += $chgunlikes; |
my %newrecord=('likes_user' => $env{'user.name'}, |
my %newrecord=('likes_user' => $env{'user.name'}, |
'likes_domain' => $env{'user.domain'}, |
'likes_domain' => $env{'user.domain'}, |
'likes' => $likes, |
'totallikes' => $totallikes, |
'totallikes' => $totallikes, |
'totalunlikes' => $totalunlikes, |
'totalvotes' => $totalvotes); |
'context' => $context); |
my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname); |
my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname); |
if ($status eq 'ok') { |
if ($status eq 'ok') { |
&updatekarma($uname,$udom,$course); |
&updatekarma($uname,$udom,$course); |
Line 4033 ENDREDIR
|
Line 4035 ENDREDIR
|
my $entry=$env{'form.hide'}?$env{'form.hide'}:$env{'form.unhide'}; |
my $entry=$env{'form.hide'}?$env{'form.hide'}:$env{'form.unhide'}; |
my ($symb,$idx)=split(/\:\:\:/,$entry); |
my ($symb,$idx)=split(/\:\:\:/,$entry); |
($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); |
($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); |
my $ressymb = &wrap($symb); |
my $ressymb = &wrap_symb($symb); |
|
|
my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum); |
my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum); |
unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) { |
unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) { |
Line 4070 ENDREDIR
|
Line 4072 ENDREDIR
|
$cdom,$cnum); |
$cdom,$cnum); |
} |
} |
} |
} |
&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, |
my $result; |
$cdom,$cnum); |
if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, |
|
$cdom,$cnum) eq 'ok') { |
&redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />', |
my $prefix=$symb.':'.$idx.':'; |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum, |
|
'^'.$prefix); |
|
my ($totallikes,$totalunlikes); |
|
if (ref($likes{$prefix.'likers'}) eq 'HASH') { |
|
$totallikes = scalar(keys(%{$likes{$prefix.'likers'}})); |
|
} |
|
if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { |
|
$totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}})); |
|
} |
|
if ($totallikes || $totalunlikes) { |
|
my ($chglikes,$chgunlikes,$context); |
|
if ($env{'form.hide'}) { |
|
$chglikes = -1 * $totallikes; |
|
$chgunlikes = -1 * $totalunlikes; |
|
$context = 'hide'; |
|
} else { |
|
$chglikes = $totallikes; |
|
$chgunlikes = $totalunlikes; |
|
$context = 'unhide'; |
|
} |
|
&storediscussionlikes($chglikes,$chgunlikes, |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}, |
|
$env{'request.course.id'}, |
|
$context); |
|
|
|
} |
|
$result = &mt('Changed discussion status'); |
|
} else { |
|
$result = &mt('Discussion status unchanged'); |
|
} |
|
&redirect_back($r,$feedurl,$result.'<br />','0','0','','', |
|
$env{'form.previous'},undef,undef,undef, |
undef,undef,undef,$group); |
undef,undef,undef,$group); |
return OK; |
return OK; |
} elsif (($env{'form.like'}) || ($env{'form.unlike'})) { |
} elsif (($env{'form.like'}) || ($env{'form.unlike'})) { |
Line 4126 ENDREDIR
|
Line 4160 ENDREDIR
|
# Users cannot like a post twice, or unlike it twice. |
# Users cannot like a post twice, or unlike it twice. |
# They can change their mind, though. |
# They can change their mind, though. |
my $alreadyflag=0; |
my $alreadyflag=0; |
|
my $votetype; |
if ($env{'form.like'}) { |
if ($env{'form.like'}) { |
if ($userlikes) { |
if ($userlikes) { |
$alreadyflag=1; |
$alreadyflag=1; |
} elsif ($userunlikes) { |
} elsif ($userunlikes) { |
delete($likes{$prefix.'unlikers'}{$thisuser}); |
delete($likes{$prefix.'unlikers'}{$thisuser}); |
|
$votetype = 'switch'; |
$likescount++; |
$likescount++; |
} else { |
} else { |
if (ref($likes{$prefix.'likers'}) eq 'HASH') { |
if (ref($likes{$prefix.'likers'}) eq 'HASH') { |
Line 4145 ENDREDIR
|
Line 4181 ENDREDIR
|
$alreadyflag=1; |
$alreadyflag=1; |
} elsif ($userlikes) { |
} elsif ($userlikes) { |
delete($likes{$prefix.'likers'}{$thisuser}); |
delete($likes{$prefix.'likers'}{$thisuser}); |
|
$votetype = 'switch'; |
$likescount--; |
$likescount--; |
} else { |
} else { |
if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { |
if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { |
Line 4169 ENDREDIR
|
Line 4206 ENDREDIR
|
# Store data in db-file "disclikes" |
# Store data in db-file "disclikes" |
if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') { |
if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') { |
# Also store with the person who posted the liked/unliked entry |
# Also store with the person who posted the liked/unliked entry |
|
my ($chglike,$chgunlike); |
if ($env{'form.like'}) { |
if ($env{'form.like'}) { |
&storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
if ($votetype eq 'switch') { |
|
$chglike = 0; |
|
$chgunlike = -1; |
|
} else { |
|
$chglike = 1; |
|
$chgunlike = 0; |
|
} |
|
&storediscussionlikes($chglike,$chgunlike, |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}, |
|
$env{'request.course.id'},'like'); |
$result=&mt("Registered 'Like'"); |
$result=&mt("Registered 'Like'"); |
} else { |
} else { |
&storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
if ($votetype eq 'switch') { |
|
$chglike = -1; |
|
$chgunlike = 0; |
|
} else { |
|
$chglike = 0; |
|
$chgunlike = 1; |
|
} |
|
&storediscussionlikes($chglike,$chgunlike, |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}, |
|
$env{'request.course.id'},'unlike'); |
$result=&mt("Registered 'Unlike'"); |
$result=&mt("Registered 'Unlike'"); |
} |
} |
} else { |
} else { |
Line 4194 ENDREDIR
|
Line 4252 ENDREDIR
|
return OK; |
return OK; |
} elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) { |
} elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) { |
my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'}); |
my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'}); |
if ($env{'form.cmd'} eq 'threadedon') { |
if ($env{'form.cmd'} eq 'threadedoff') { |
|
&Apache::lonnet::put('environment',{'unthreadeddiscussion' => 'on'}); |
|
&Apache::lonnet::appenv({'environment.unthreadeddiscussion' => 'on'}); |
|
&Apache::lonnet::del('environment',['threadeddiscussion']); |
|
&Apache::lonnet::delenv('environment.threadeddiscussion'); |
|
} else { |
&Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'}); |
&Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'}); |
&Apache::lonnet::appenv({'environment.threadeddiscussion' => 'on'}); |
&Apache::lonnet::appenv({'environment.threadeddiscussion' => 'on'}); |
} else { |
&Apache::lonnet::del('environment',['unthreadeddiscussion']); |
&Apache::lonnet::del('environment',['threadeddiscussion']); |
&Apache::lonnet::delenv('environment.unthreadeddiscussion'); |
&Apache::lonnet::delenv('environment.threadeddiscussion'); |
|
} |
} |
&redirect_back($r,$feedurl,&mt('Changed discussion view mode').'<br />', |
&redirect_back($r,$feedurl,&mt('Changed discussion view mode').'<br />', |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
Line 4225 ENDREDIR
|
Line 4287 ENDREDIR
|
$cdom,$cnum); |
$cdom,$cnum); |
} |
} |
my %newhash=('deleted' => $contrib{'deleted'}.".$idx."); |
my %newhash=('deleted' => $contrib{'deleted'}.".$idx."); |
&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, |
|
$cdom,$cnum); |
my $result; |
&redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />', |
if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
$cdom,$cnum) eq 'ok') { |
|
$result = &mt('Changed discussion status'); |
|
my $prefix=$symb.':'.$idx.':'; |
|
my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum, |
|
'^'.$prefix); |
|
my ($totallikes,$totalunlikes); |
|
if (ref($likes{$prefix.'likers'}) eq 'HASH') { |
|
$totallikes = scalar(keys(%{$likes{$prefix.'likers'}})); |
|
} |
|
if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { |
|
$totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}})); |
|
} |
|
if ($totallikes || $totalunlikes) { |
|
my $chglikes = -1 * $totallikes; |
|
my $chgunlikes = -1 * $totalunlikes; |
|
&storediscussionlikes($chglikes,$chgunlikes, |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}, |
|
$env{'request.course.id'}, |
|
'delete'); |
|
} |
|
} else { |
|
$result = &mt('Discussion status unchanged'); |
|
} |
|
&redirect_back($r,$feedurl,$result.'<br />','0','0','','', |
|
$env{'form.previous'},undef,undef,undef, |
undef,undef,undef,$group); |
undef,undef,undef,$group); |
return OK; |
return OK; |
} elsif ($env{'form.preview'}) { |
} elsif ($env{'form.preview'}) { |
Line 4289 ENDREDIR
|
Line 4376 ENDREDIR
|
my $ressymb=&wrap_symb($symb); |
my $ressymb=&wrap_symb($symb); |
$r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries')); |
$r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries')); |
if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) { |
if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) { |
if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'}, |
my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, |
$cdom,$cnum) eq 'ok') { |
$cdom,$cnum); |
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"))); |
$contrib{'deleted'} =~ s/^\.//; |
} else { |
$contrib{'deleted'} =~ s/\.$//; |
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1)); |
if ($contrib{'deleted'} ne '') { |
} |
if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'}, |
$r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>"); |
$cdom,$cnum) eq 'ok') { |
|
my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,'^'.$symb.':'); |
|
my @ids = split(/\.\./,$contrib{'deleted'}); |
|
my (%chglikes,%chgunlikes); |
|
foreach my $idx (@ids) { |
|
my $uname = $contrib{$idx.':sendername'}; |
|
my $udom = $contrib{$idx.':senderdomain'}; |
|
my ($totallikes,$totalunlikes); |
|
if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') { |
|
$totallikes = scalar(keys(%{$likes{$symb.':'.$idx.':likers'}})); |
|
} |
|
if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') { |
|
$totalunlikes = scalar(keys(%{$likes{$symb.':'.$idx.':unlikers'}})); |
|
} |
|
if ($totallikes || $totalunlikes) { |
|
$chglikes{$uname.':'.$udom} += $totallikes; |
|
$chgunlikes{$uname.':'.$udom} += $totalunlikes; |
|
} |
|
} |
|
foreach my $user (keys(%chglikes)) { |
|
my ($uname,$udom) = split(/:/,$user); |
|
&storediscussionlikes($chglikes{$user},$chgunlikes{$user}, |
|
$uname,$udom,$env{'request.course.id'}, |
|
'undelete'); |
|
} |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"))); |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1)); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt("No entries to undelete"),1)); |
|
} |
|
$r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>"); |
} |
} |
$r->print(&Apache::loncommon::end_page()); |
$r->print(&Apache::loncommon::end_page()); |
return OK; |
return OK; |
Line 4654 None
|
Line 4773 None
|
|
|
=item list_discussion() |
=item list_discussion() |
|
|
|
=item can_see_discussion() |
|
|
=item send_feedback_link() |
=item send_feedback_link() |
|
|
=item send_message_link() |
=item send_message_link() |