--- loncom/publisher/lonrights.pm 2003/03/20 19:20:31 1.4 +++ loncom/publisher/lonrights.pm 2005/04/07 06:56:27 1.17 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to show and edit custom distribution rights # -# $Id: lonrights.pm,v 1.4 2003/03/20 19:20:31 www Exp $ +# $Id: lonrights.pm,v 1.17 2005/04/07 06:56:27 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,26 +32,128 @@ package Apache::lonrights; use strict; use Apache::Constants qw(:common :http); -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); use HTML::LCParser; use Apache::File; +use Apache::lonlocal; sub handler { my $r=shift; - $r->content_type('text/html'); + my $target = $env{'form.grade_target'}; + if ($target eq 'meta') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $env{'request.uri'}=$r->uri; + my $file = &Apache::lonnet::filelocation("",$r->uri); + my $content=&Apache::lonnet::getfile($file); + my $result=&Apache::lonxml::xmlparse(undef,'meta',$content); + $r->print($result); + return OK; + } + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print( - 'LON-CAPA Custom Distribution Rights'); + 'LON-CAPA Custom Distribution Rights'. + &Apache::loncommon::coursebrowser_javascript().''); $r->print(&Apache::loncommon::bodytag('Custom Distribution Rights')); + $r->rflush(); my $uri=$r->uri; my $fn=&Apache::lonnet::filelocation('',$uri); my $contents=''; my $constructmode=($uri=~/^\/\~/); + +# ============================================================ Modify and store + if ($constructmode) { + if ($env{'form.store'}) { + my @newrules=(); + undef @newrules; +# read rules from form + foreach (keys %env) { + if ($_=~/^form\.effect\_(\d+)$/) { + my $number=$1; + my %rulehash=(); + foreach ('effect','domain','course','section','role') { + $rulehash{$_}=$env{'form.'.$_.'_'.$number}; + } + if ($rulehash{'role'} eq 'au') { + $rulehash{'course'}=''; + $rulehash{'section'}=''; + } + if ($rulehash{'role'} eq 'cc') { + $rulehash{'section'}=''; + } + unless (($rulehash{'effect'} eq 'deny') || + ($rulehash{'effect'} eq 'allow')) { + $rulehash{'effect'}='deny'; + } + $rulehash{'domain'}=~s/\W//g; + $rulehash{'course'}=~s/\W//g; + $rulehash{'section'}=~s/\W//g; + unless ($rulehash{'domain'}) { + $rulehash{'domain'}=$env{'user.domain'}; + } + my $realm=''; + if ($number) { + $realm=$rulehash{'domain'}; + if ($rulehash{'course'}) { + $realm.='_'.$rulehash{'course'}; + } + if ($rulehash{'section'}) { + $realm.='_'.$rulehash{'section'}; + } + } + $newrules[$number]=$rulehash{'effect'}.':'. + $realm.':'.$rulehash{'role'}; + } + } +# edit actions? + foreach (keys %env) { + if ($_=~/^form\.action\_(\d+)$/) { + my $number=$1; + if ($env{$_} eq 'delete') { $newrules[$number]=''; } + if (($env{$_} eq 'moveup') && ($number>1)) { + my $buffer=$newrules[$number]; + $newrules[$number]=$newrules[$number-1]; + $newrules[$number-1]=$buffer; + } + if (($env{$_} eq 'movedown') && ($number<$#newrules)) { + my $buffer=$newrules[$number]; + $newrules[$number]=$newrules[$number+1]; + $newrules[$number+1]=$buffer; + } + if ($env{$_} eq 'insertabove') { + for (my $i=$#newrules;$i>=$number;$i--) { + $newrules[$i+1]=$newrules[$i]; + } + $newrules[$number]='deny'; + } + if ($env{$_} eq 'insertbelow') { + for (my $i=$#newrules;$i>$number;$i--) { + $newrules[$i+1]=$newrules[$i]; + } + $newrules[$number+1]='deny'; + } + } + } + +# store file + my $fh=Apache::File->new('>'.$fn); + foreach (my $i=0;$i<=$#newrules;$i++) { + if ($newrules[$i]) { + my ($effect,$realm,$role)=split(/\:/,$newrules[$i]); + print $fh + "\n"; + } + } + $fh->close; + } + } +# ============================================================ Read and display unless ($constructmode) { # =========================================== This is not in construction space $contents=&Apache::lonnet::getfile($fn); @@ -63,24 +165,41 @@ sub handler { $contents=join('',<$fh>); $fh->close(); } - $r->print('
'); + $r->print(''); + } + unless ($contents=~/\new(\$contents); my $token; my $rulecounter=0; - my $colzero=($constructmode?'Edit action':'Rule'); + my $colzero=&mt($constructmode?'Edit action':'Rule'); + my %lt=&Apache::lonlocal::texthash('ef' => 'Effect', + 'do' => 'Domain', + 'co' => 'Course', + 'se' => 'Section/Group', + 'ro' => 'Role'); # ---------------------------------------------------------- Start table output $r->print(< - $colzeroEffectDomainCourse -SectionRole + $colzero$lt{'ef'}$lt{'do'}$lt{'co'} +$lt{'se'}$lt{'ro'} ENDSTARTTABLE # --------------------------------------------------------------------- Default # Fast forward to first rule $token=$parser->get_token; while ($token->[1] ne 'accessrule') { $token=$parser->get_token; } # print default - $r->print(' '); + $r->print(''); + if ($constructmode) { + $r->print(&Apache::loncommon::select_form('','action_0', + ('' => '', + 'insertbelow' => 'Insert rule below '))); + + } else { + $r->print(' '); + } + $r->print(''); if ($constructmode) { $r->print(&Apache::loncommon::select_form ($token->[2]->{'effect'},'effect_0', @@ -91,14 +210,15 @@ ENDSTARTTABLE } $r->print('Default'); if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { - $r->print(' - Error! No default set.'); + $r->print(' - '.&mt('Error! No default set.'). + ''); } $r->print(''); # Additional roles while ($token=$parser->get_token) { if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) { $rulecounter++; - $r->print(''); + $r->print(''); # insert, delete, etc $r->print($rulecounter.'. '); if ($constructmode) { @@ -107,11 +227,11 @@ ENDSTARTTABLE ('' => '', 'delete' => 'Delete this rule', 'insertabove' => 'Insert rule above', - 'insertbelow' => 'Insert rule below', + 'insertbelow' => 'Insert rule below ', 'moveup' => 'Move rule up', 'movedown' => 'Move rule down'))); } - $r->print(''); + $r->print(''); # effect if ($constructmode) { $r->print(&Apache::loncommon::select_form @@ -127,8 +247,9 @@ ENDSTARTTABLE my $realm=$token->[2]->{'realm'}; $realm=~s/^\W//; my ($rdom,$rcourse,$rsec)=split(/[\/\_]/,$realm); -# realm role +# realm domain if ($constructmode) { + unless ($rdom) { $rdom=$env{'user.domain'}; } $r->print(&Apache::loncommon::select_dom_form($rdom, 'domain_'.$rulecounter)); } else { @@ -152,7 +273,7 @@ ENDSTARTTABLE $r->print($rsec); } - $r->print(''); + $r->print(''); # role if ($constructmode) { my %hash=('' => ''); @@ -166,6 +287,17 @@ ENDSTARTTABLE } else { $r->print(&Apache::lonnet::plaintext($token->[2]->{'role'})); } +# course selection link + $r->print(''); + if ($rcourse) { + my %descript= + &Apache::lonnet::coursedescription($rdom.'_'.$rcourse); + $r->print($descript{'description'}.'   '); + } + if ($constructmode) { + $r->print(&Apache::loncommon::selectcourse_link('rules', + 'course_'.$rulecounter,'domain_'.$rulecounter)); + } # close row $r->print(''); } @@ -173,7 +305,7 @@ ENDSTARTTABLE $r->print(''); # ------------------------------------------------------------ End table output if ($constructmode) { - $r->print(''); + $r->print(''); } $r->print(''); return OK;