version 1.484, 2012/05/07 19:43:44
|
version 1.487, 2012/06/19 10:11:35
|
Line 484 use POSIX qw (floor strftime);
|
Line 484 use POSIX qw (floor strftime);
|
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use LONCAPA; |
use LONCAPA; |
use DateTime(); |
use DateTime(); |
|
use HTML::Entities; |
|
|
# For debugging |
# For debugging |
|
|
# use Data::Dumper; |
use Data::Dumper; |
|
|
|
|
# symbolic constants |
# symbolic constants |
Line 1481 sub render {
|
Line 1482 sub render {
|
'document.clearbubbles.submit()', |
'document.clearbubbles.submit()', |
'Mark all posts read'); |
'Mark all posts read'); |
my $time=time; |
my $time=time; |
|
my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"'); |
$result .= (<<END); |
$result .= (<<END); |
<form name="clearbubbles" method="post" action="/adm/feedback"> |
<form name="clearbubbles" method="post" action="/adm/feedback"> |
<input type="hidden" name="navurl" value="$ENV{'QUERY_STRING'}" /> |
<input type="hidden" name="navurl" value="$querystr" /> |
<input type="hidden" name="navtime" value="$time" /> |
<input type="hidden" name="navtime" value="$time" /> |
END |
END |
if ($env{'form.register'}) { |
if ($env{'form.register'}) { |
Line 1825 END
|
Line 1827 END
|
} |
} |
} |
} |
} |
} |
|
|
|
$result.=&Apache::loncommon::end_data_table(); |
|
|
# Print out the part that jumps to #curloc if it exists |
# Print out the part that jumps to #curloc if it exists |
# delay needed because the browser is processing the jump before |
# delay needed because the browser is processing the jump before |
Line 1841 if (location.href.indexOf('#curloc')==-1
|
Line 1845 if (location.href.indexOf('#curloc')==-1
|
"); |
"); |
} |
} |
|
|
$result.=&Apache::loncommon::end_data_table(); |
|
|
|
if ($r) { |
if ($r) { |
$r->print($result); |
$r->print($result); |
$result = ""; |
$result = ""; |
Line 1873 sub show_linkitems_toolbar {
|
Line 1875 sub show_linkitems_toolbar {
|
'<td class="LC_middle">'.&mt('Tools:').'</td>'; |
'<td class="LC_middle">'.&mt('Tools:').'</td>'; |
} |
} |
$result .= '<td align="left">'."\n". |
$result .= '<td align="left">'."\n". |
'<span class="LC_nobreak">'."\n". |
|
'<ul id="LC_toolbar">'; |
'<ul id="LC_toolbar">'; |
my @linkorder = ('firsthomework','everything','uncompleted', |
my @linkorder = ('firsthomework','everything','uncompleted', |
'changefolder','clearbubbles','edittoplevel'); |
'changefolder','clearbubbles','edittoplevel'); |
Line 1901 sub show_linkitems_toolbar {
|
Line 1902 sub show_linkitems_toolbar {
|
} |
} |
} |
} |
$result .= '</ul>'. |
$result .= '</ul>'. |
'</span></td>'; |
'</td>'; |
if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) { |
if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) { |
$result .= '<td><a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'. |
$result .= '<td><a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'. |
&mt('Content Editor').'</a></td>'; |
&mt('Content Editor').'</a></td>'; |
Line 2146 sub generate_course_user_opt {
|
Line 2147 sub generate_course_user_opt {
|
return; |
return; |
} |
} |
|
|
|
|
|
|
sub generate_email_discuss_status { |
sub generate_email_discuss_status { |
my $self = shift; |
my $self = shift; |
my $symb = shift; |
my $symb = shift; |
Line 2559 sub parmval {
|
Line 2562 sub parmval {
|
return $result->[0]; |
return $result->[0]; |
} |
} |
|
|
|
|
sub parmval_real { |
sub parmval_real { |
my $self = shift; |
my $self = shift; |
my ($what,$symb,$recurse) = @_; |
my ($what,$symb,$recurse) = @_; |
|
|
|
|
# Make sure the {USER_OPT} and {COURSE_OPT} hashes are populated |
# Make sure the {USER_OPT} and {COURSE_OPT} hashes are populated |
$self->generate_course_user_opt(); |
$self->generate_course_user_opt(); |
|
|
Line 2591 sub parmval_real {
|
Line 2596 sub parmval_real {
|
my $mapparm=$mapname.'___(all).'.$what; |
my $mapparm=$mapname.'___(all).'.$what; |
my $usercourseprefix=$cid; |
my $usercourseprefix=$cid; |
|
|
|
|
|
|
my $grplevel=$usercourseprefix.'.['.$cgroup.'].'.$what; |
my $grplevel=$usercourseprefix.'.['.$cgroup.'].'.$what; |
my $grplevelr=$usercourseprefix.'.['.$cgroup.'].'.$symbparm; |
my $grplevelr=$usercourseprefix.'.['.$cgroup.'].'.$symbparm; |
my $grplevelm=$usercourseprefix.'.['.$cgroup.'].'.$mapparm; |
my $grplevelm=$usercourseprefix.'.['.$cgroup.'].'.$mapparm; |
|
|
|
|
my $seclevel= $usercourseprefix.'.['.$csec.'].'.$what; |
my $seclevel= $usercourseprefix.'.['.$csec.'].'.$what; |
my $seclevelr=$usercourseprefix.'.['.$csec.'].'.$symbparm; |
my $seclevelr=$usercourseprefix.'.['.$csec.'].'.$symbparm; |
my $seclevelm=$usercourseprefix.'.['.$csec.'].'.$mapparm; |
my $seclevelm=$usercourseprefix.'.['.$csec.'].'.$mapparm; |
|
|
|
|
my $courselevel= $usercourseprefix.'.'.$what; |
my $courselevel= $usercourseprefix.'.'.$what; |
my $courselevelr=$usercourseprefix.'.'.$symbparm; |
my $courselevelr=$usercourseprefix.'.'.$symbparm; |
my $courselevelm=$usercourseprefix.'.'.$mapparm; |
my $courselevelm=$usercourseprefix.'.'.$mapparm; |
|
|
|
|
my $useropt = $self->{USER_OPT}; |
my $useropt = $self->{USER_OPT}; |
my $courseopt = $self->{COURSE_OPT}; |
my $courseopt = $self->{COURSE_OPT}; |
my $parmhash = $self->{PARM_HASH}; |
my $parmhash = $self->{PARM_HASH}; |
Line 2669 sub parmval_real {
|
Line 2679 sub parmval_real {
|
if (defined($pack_def)) { return [$pack_def,'resource']; } |
if (defined($pack_def)) { return [$pack_def,'resource']; } |
return ['']; |
return ['']; |
} |
} |
|
# |
|
# Determines the open/close dates for printing a map that |
|
# encloses a resource. |
|
# |
|
sub map_printdates { |
|
my ($self, $res, $part) = @_; |
|
|
|
|
|
|
|
|
|
|
|
my $opendate = $self->get_mapparam($res->symb(), "$part.printstartdate"); |
|
my $closedate= $self->get_mapparam($res->symb(), "$part.printenddate"); |
|
|
|
|
|
return ($opendate, $closedate); |
|
} |
|
|
|
sub get_mapparam { |
|
my ($self, $symb, $what) = @_; |
|
|
|
# Ensure the course option hash is populated: |
|
|
|
$self->generate_course_user_opt(); |
|
|
|
# Get the course id and section if there is one. |
|
|
|
my $cid=$env{'request.course.id'}; |
|
my $csec=$env{'request.course.sec'}; |
|
my $cgroup=''; |
|
my @cgrps=split(/:/,$env{'request.course.groups'}); |
|
if (@cgrps > 0) { |
|
@cgrps = sort(@cgrps); |
|
$cgroup = $cgrps[0]; |
|
} |
|
my $uname=$self->{USERNAME}; |
|
my $udom=$self->{DOMAIN}; |
|
|
|
unless ($symb) { return ['']; } |
|
my $result=''; |
|
|
|
|
|
# Figure out which map we are in. |
|
|
|
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
|
$mapname = &Apache::lonnet::deversion($mapname); |
|
|
|
|
|
my $rwhat=$what; |
|
$what=~s/^parameter\_//; |
|
$what=~s/\_/\./; |
|
|
|
# Build the hash keys for the lookup: |
|
|
|
my $symbparm=$symb.'.'.$what; |
|
my $mapparm=$mapname.'___(all).'.$what; |
|
my $usercourseprefix=$cid; |
|
|
|
|
|
my $grplevel = "$usercourseprefix.[$cgroup].$mapparm"; |
|
my $seclevel = "$usercourseprefix.[$csec].$mapparm"; |
|
my $courselevel = "$usercourseprefix.$mapparm"; |
|
|
|
|
|
# Get handy references to the hashes we need in $self: |
|
|
|
my $useropt = $self->{USER_OPT}; |
|
my $courseopt = $self->{COURSE_OPT}; |
|
my $parmhash = $self->{PARM_HASH}; |
|
|
|
# Check per user |
|
|
|
|
|
|
|
if ($uname and defined($useropt)) { |
|
if (defined($$useropt{$courselevel})) { |
|
return $$useropt{$courselevel}; |
|
} |
|
} |
|
|
|
# Check course -- group |
|
|
|
|
|
|
|
if ($cgroup ne '' and defined ($courseopt)) { |
|
if (defined($$courseopt{$grplevel})) { |
|
return $$courseopt{$grplevel}; |
|
} |
|
} |
|
|
|
# Check course -- section |
|
|
|
|
|
|
|
|
|
|
|
if ($csec and defined($courseopt)) { |
|
if (defined($$courseopt{$seclevel})) { |
|
return $$courseopt{$seclevel}; |
|
} |
|
} |
|
# Check the map parameters themselves: |
|
|
|
my $thisparm = $$parmhash{$symbparm}; |
|
if (defined($thisparm)) { |
|
return $thisparm; |
|
} |
|
|
|
|
|
# Additional course parameters: |
|
|
|
if (defined($courseopt)) { |
|
if (defined($$courseopt{$courselevel})) { |
|
return $$courseopt{$courselevel}; |
|
} |
|
} |
|
return undef; # Unefined if we got here. |
|
} |
|
|
|
sub course_printdates { |
|
my ($self, $symb, $part) = @_; |
|
|
|
|
|
my $opendate = $self->getcourseparam($symb, $part . '.printstartdate'); |
|
my $closedate = $self->getcourseparam($symb, $part . '.printenddate'); |
|
return ($opendate, $closedate); |
|
|
|
} |
|
|
|
sub getcourseparam { |
|
my ($self, $symb, $what) = @_; |
|
|
|
$self->generate_course_user_opt(); # If necessary populate the hashes. |
|
|
|
my $uname = $self->{USERNAME}; |
|
my $udom = $self->{DOMAIN}; |
|
|
|
# Course, section, group ids come from the env: |
|
|
|
my $cid = $env{'request.course.id'}; |
|
my $csec = $env{'request.course.sec'}; |
|
my $cgroup = ''; # Assume no group |
|
|
|
my @cgroups = split(/:/, $env{'request.course.groups'}); |
|
if(@cgroups > 0) { |
|
@cgroups = sort(@cgroups); |
|
$cgroup = $cgroups[0]; # There is a course group. |
|
} |
|
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
|
$mapname = &Apache::lonnet::deversion($mapname); |
|
|
|
# |
|
# Make the various lookup keys: |
|
# |
|
|
|
$what=~s/^parameter\_//; |
|
$what=~s/\_/\./; |
|
|
|
|
|
my $symbparm = $symb . '.' . $what; |
|
my $mapparm=$mapname.'___(all).'.$what; |
|
|
|
# Local refs to the hashes we're going to look at: |
|
|
|
my $useropt = $self->{USER_OPT}; |
|
my $courseopt = $self->{COURSE_OPT}; |
|
|
|
# |
|
# We want the course level stuff from the way |
|
# parmval_real operates |
|
# TODO: Fator some of this stuff out of |
|
# both parmval_real and here |
|
# |
|
my $courselevel = $cid . '.' . $what; |
|
my $grplevel = $cid . '.[' . $cgroup . ']' . $what; |
|
my $seclevel = $cid . '.[' . $csec . ']' . $what; |
|
|
|
|
|
# Try for the user's course level option: |
|
|
|
if ($uname and defined($useropt)) { |
|
if (defined($$useropt{$courselevel})) { |
|
return $$useropt{$courselevel}; |
|
} |
|
} |
|
# Try for the group's course level option: |
|
|
|
if ($uname ne '' and defined($courseopt)) { |
|
if (defined($$courseopt{$grplevel})) { |
|
return $$courseopt{$grplevel}; |
|
} |
|
} |
|
|
|
# Try for section level parameters: |
|
|
|
if ($csec and defined($courseopt)) { |
|
if (defined($$courseopt{$seclevel})) { |
|
return $$courseopt{$seclevel}; |
|
} |
|
} |
|
# Try for 'additional' course parameterse: |
|
|
|
if (defined($courseopt)) { |
|
if (defined($$courseopt{$courselevel})) { |
|
return $$courseopt{$courselevel}; |
|
} |
|
} |
|
return undef; |
|
|
|
} |
|
|
|
|
=pod |
=pod |
|
|
Line 3094 sub new {
|
Line 3315 sub new {
|
my $firstResource = $resource->map_start(); |
my $firstResource = $resource->map_start(); |
my $finishResource = $resource->map_finish(); |
my $finishResource = $resource->map_finish(); |
my $result; |
my $result; |
return |
$result = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}); |
return $result; |
|
|
|
|
} |
} |
|
|
# Set up some bookkeeping information. |
# Set up some bookkeeping information. |
Line 4068 their code.)
|
Line 4291 their code.)
|
|
|
=over 4 |
=over 4 |
|
|
|
|
=item * B<printable> |
=item * B<printable> |
|
|
returns true if the current date is such that the |
returns true if the current date is such that the |
specified resource part is printable. |
specified resource part is printable. |
|
|
|
|
=item * B<resprintable> |
=item * B<resprintable> |
|
|
Returns true if all parts in the resource are printable making the |
Returns true if all parts in the resource are printable making the |
Line 4131 Get the weight for the problem.
|
Line 4356 Get the weight for the problem.
|
|
|
=cut |
=cut |
|
|
|
|
|
|
|
|
sub printable { |
sub printable { |
|
|
my ($self, $part) = @_; |
my ($self, $part) = @_; |
|
|
# Get the print open/close dates for the resource. |
&Apache::lonnet::logthis($self->symb()); |
|
|
my $start = $self->parmval("printstartdate", $part); |
|
my $end = $self->parmval("printenddate", $part); |
|
|
|
# The following cases apply: |
# The following cases apply: |
# - No dates set: Printable. |
# - If a start date is not set, it is replaced by the open date. |
|
# - Ditto for start/open replaced by content open. |
|
# - If neither start nor printdates are set the part is printable. |
# - Start date set but no end date: Printable if now >= start date. |
# - Start date set but no end date: Printable if now >= start date. |
# - End date set but no start date: Printable if now <= end date. |
# - End date set but no start date: Printable if now <= end date. |
# - both defined: printable if start <= now <= end |
# - both defined: printable if start <= now <= end |
# |
# |
|
|
|
# Get the print open/close dates for the resource. |
|
|
|
my $start = $self->parmval("printstartdate", $part); |
|
my $end = $self->parmval("printenddate", $part); |
|
|
|
if (!$start) { |
|
$start = $self->parmval("opendate", $part); |
|
} |
|
if (!$start) { |
|
$start = $self->parmval("contentopen", $part); |
|
} |
|
|
|
|
my $now = time(); |
my $now = time(); |
|
|
|
|
my $startok = 1; |
my $startok = 1; |
my $endok = 1; |
my $endok = 1; |
|
|