File:  [LON-CAPA] / loncom / html / adm / helper / resettimes.helper
Revision 1.11: download - view: text, annotated - select for diffs
Tue May 31 22:04:14 2016 UTC (8 years, 5 months ago) by raeburn
Branches: MAIN
CVS tags: version_2_12_X, version_2_11_2_uiuc, version_2_11_2_msu, HEAD
- Bug 6763. "Done" button.
  - When "Reset access times" helper deletes student-specific interval
    interval parameter (set by "Done" button push), devalidate cache of
    userres data for that student.

<helper title="Reset Access Times" requiredpriv="mgr">
  <state name="START" title="Select Scope">
    <message>
      <message_text>Select </message_text>
    </message>
    <choices variable="harry">
      <choice computer='1' nextstate="Student">Reset times on one or more folders/maps, resources or the course for a single student.</choice>
      <choice computer='0' nextstate="Class">Reset times on a single folder/map, resource or the course for a section or the whole class.</choice>
      </choices>
  </state>
  <state name="Student" title="Select Student">
    <message nextstate="SelectAccess">
	<message_text>Choose a student:<br /></message_text>
    </message>
    <student variable='stu1' coursepersonnel='true' activeonly='true' />
  </state>

  <state name="SelectAccess">
    <message nextstate="ConfirmStu">
       <message_text>This is a list of first access times and what was accessed, please select those you want deleted.</message_text>
    </message>
    <choices variable='delete' multichoice='true'>
      <exec>
         my ($uname,$udom,$sec,$fullname)=split(':',$helper->{'VARS'}{'stu1'});
         my %times=&Apache::lonnet::dump('firstaccesstimes',$udom,$uname,
					 "^$env{'request.course.id'}\0");
         foreach my $res (sort(keys(%times))) {
	     my (undef,$symb)=split("\0",$res);
	     my $escsymb=&Apache::lonnet::escape($symb);
	     my $title = 
		 ($symb ne 'course') ? &Apache::lonnet::gettitle($symb)
	                             : $env{'course.'.$env{'request.course.id'}.'.description'};
	     my $time=&Apache::lonlocal::locallocaltime($times{$res});
	     my $description="<a href='/adm/navmaps?postsymb=".&Apache::lonnet::escape($symb)."'>$title</a> on $time";
	     push(@{$state->{CHOICES}},[$description,$escsymb]);
	 }
      </exec>
    </choices>
  </state>

  <state name="ConfirmStu">
    <message nextstate="FinishStu">
       <message_text>Will remove access times from user <ul></message_text>
    </message>
    <eval>
        my ($uname,$udom,undef,$fullname)=split(':',$helper->{'VARS'}{'stu1'});
        if (!$fullname) { $fullname="$uname\@$udom"; }
        return '<li>'.$fullname.'</li>';
    </eval>
    <message><message_text></ul> for <ul></message_text></message>
    <eval>
	my $list;
	my @symbs=split(/\|\|\|/,$helper->{'VARS'}{'delete'});
	foreach my $escsymb (@symbs) {
	    my $symb=&Apache::lonnet::unescape($escsymb);
	    my $title = 
		($symb ne 'course') ? &Apache::lonnet::gettitle($symb)
	                            : $env{'course.'.$env{'request.course.id'}.'.description'};
	    $list.='<li>'.$title.'</li>';
	}
	return $list;
    </eval>
  </state>

  <state name="FinishStu" title="Processing">
    <final>
      <finalcode>
        if ($helper->{'STATE'} ne 'FinishStu') { return; }
        my $result;
        my $courseid=$env{'request.course.id'};
        my ($uname,$udom,$sec,$fullname)=split(':',$helper->{'VARS'}{'stu1'});
        &Apache::lonnet::logthis($helper->{'VARS'}{'delete'});
        my $needsdeval;
        foreach my $escsymb (split(/\|\|\|/,$helper->{'VARS'}{'delete'})) {
	    my $symb=&Apache::lonnet::unescape($escsymb);
            my $key = "$courseid\0$symb";
            my $title =    
                ($symb ne 'course') ? &Apache::lonnet::gettitle($symb)
                                    : $env{'course.'.$courseid.'.description'};
	    my $res=&Apache::lonnet::del('firstaccesstimes',
					 [$key],$udom,$uname);
            $result.="Removing access time from ".
                      $title.": ".$res.'</li><li>';
            if ($res eq 'ok') {
                if ($symb ne 'course') {
                    my $what = [];
                    my ($storeunder,@recurseup,$recursed);
                    my $mapp = &Apache::lonnet::deversion((
                                   &Apache::lonnet::decode_symb($symb))[2]);
                    if ($symb =~ /\.(page|sequence)$/) {
                        $storeunder = $env{'request.course.id'}.'.'.$mapp.'___(all).0.interval';
                        $what = [$storeunder,'map'];
                    } else {
                        $storeunder = $env{'request.course.id'}.'.'.$symb.'.0.interval';
                        $what = [$storeunder,'resource'];
                    }
                    &Apache::lonnet::del('timerinterval',[$key],$udom,$uname);
                    my $userreply=&Apache::lonnet::resdata($uname,$udom,'user',$mapp,
                                                           \$recursed,\@recurseup,
                                                           $env{'request.course.id'},
                                                           '.','0.interval',($what));
                    if (ref($userreply) eq 'ARRAY') {
                        if ($userreply->[0] =~ /^\d+$/) {
                            if (($userreply->[1] eq 'map') || ($userreply->[1] eq 'resource')) {
                                my %storecontent=($storeunder         => $userreply->[0],
                                                  $storeunder.'.type' => 'date_interval');
                                if (&Apache::lonnet::del
                                       ('resourcedata',[keys(%storecontent)],$udom,$uname) eq 'ok') {
                                    &Apache::lonparmset::log_parmset(\%storecontent,1,$uname,$udom);
                                    $needsdeval = 1;
                                }
                            }
                        }
                    }
                }
            }
	}
        if ($needsdeval) {
            &Apache::lonnet::devalidateuserresdata($uname,$udom);
        }
        $result=~s/<li>$//;
        return $result;
      </finalcode>
      <exitpage>/adm/flip?postdata=return:</exitpage>
    </final>
  </state>

  <state name="Class">
    <message nextstate="SelectMap">
    </message>
    <student variable='stu1' coursepersonnel='true' activeonly='true' multichoice='true' />
  </state>

  <state name="SelectMap" title="Select a folder/map">
    <resource variable="res2" includecourse="true">
      <filterfunc>return (($res->is_map() && $res->map_contains_problem()) 
                          ||$res->is_problem() );</filterfunc>
      <valuefunc>return $res->symb()</valuefunc>
      <nextstate>ShowPlan</nextstate>
    </resource>    
  </state>

  <state name="ShowPlan" title="Processing">
    <message nextstate="FINISH"><message_text>Will remove access times for <ul></message_text></message>

    <eval>
	return '<li>'.&Apache::lonnet::gettitle($helper->{'VARS'}{'res2'}).'</li>';
    </eval>
    <message><message_text></ul> from users <ul></message_text></message>
    <eval>
	my $list;
	my @names=split(/\|\|\|/,$helper->{'VARS'}{'stu1'});
	foreach my $name (@names) {
	    my ($uname,$udom,$sec,$fullname)=split(':',$name);
	    if (!$fullname) { $fullname="$uname\@$udom"; }
	    $list.='<li>'.$fullname.'</li>';
	}
	return $list;
    </eval>
  </state>

  <state name="FINISH" title="Processing">
      <final>
        <finalcode>
        if ($helper->{'STATE'} ne 'FINISH') { return; }
        my $result;
        my $symb=$helper->{'VARS'}{'res2'};
        my $key=$env{'request.course.id'}."\0".$symb;
	my @names=split(/\|\|\|/,$helper->{'VARS'}{'stu1'});
        my $what = [];
        my ($storeunder,@recurseup,$recursed);
        my $mapp = &Apache::lonnet::deversion((
                       &Apache::lonnet::decode_symb($symb))[2]);
        if ($symb =~ /\.(page|sequence)$/) {
            $storeunder = $env{'request.course.id'}.'.'.$mapp.'___(all).0.interval';
            $what = [$storeunder,'map'];
        } else {
            $storeunder = $env{'request.course.id'}.'.'.$symb.'.0.interval';
            $what = [$storeunder,'resource'];
        }
        my %donedeval;
	foreach my $name (@names) {
	    my ($uname,$udom,$sec,$fullname)=split(':',$name);
	    if (!$fullname) { $fullname="$uname\@$udom"; }
	    my %times=&Apache::lonnet::get('firstaccesstimes',
					   [$key],$udom,$uname);
	    if (!$times{$key}) {
		$result.="No Access times found for student ".$fullname;
	    } else {
		$result.="Removing access times ".
		    &Apache::lonlocal::locallocaltime($times{$key}).
		    " found for student ".$fullname.": ";
		my $delres=&Apache::lonnet::del('firstaccesstimes',
					      [$key],$udom,$uname);
                $result.=$delres;
                if ($delres eq 'ok') {
                    &Apache::lonnet::del('timerinterval',
                                         [$key],$udom,$uname);
                    my $userreply=&Apache::lonnet::resdata($uname,$udom,'user',$mapp,
                                                           \$recursed,\@recurseup,
                                                           $env{'request.course.id'},
                                                           '.','0.interval',($what));
                    if (ref($userreply) eq 'ARRAY') {
                        if ($userreply->[0] =~ /^\d+$/) {
                            if (($userreply->[1] eq 'map') || ($userreply->[1] eq 'resource')) {
                                my %storecontent=($storeunder         => $userreply->[0],
                                                  $storeunder.'.type' => 'date_interval');
                                if (&Apache::lonnet::del
                                       ('resourcedata',[keys(%storecontent)],$udom,$uname) eq 'ok') {
                                    &Apache::lonparmset::log_parmset(\%storecontent,1,$uname,$udom);
                                    unless ($donedeval{$uname.':'.$udom}) {
                                        &Apache::lonnet::devalidateuserresdata($uname,$udom);
                                        $donedeval{$uname.':'.$udom} = 1;
                                    }
                                }
                            }
                        }
                    }
                }
	    }
	    $result.="</li>\n<li>";
	}
        $result=~s/<li>$//;
        return $result;
        </finalcode>
      <exitpage>/adm/flip?postdata=return:</exitpage></final>
  </state>
</helper>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>