--- loncom/publisher/lonrights.pm 2003/03/14 02:26:12 1.1 +++ loncom/publisher/lonrights.pm 2003/03/21 14:13:30 1.7 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to show and edit custom distribution rights # -# $Id: lonrights.pm,v 1.1 2003/03/14 02:26:12 www Exp $ +# $Id: lonrights.pm,v 1.7 2003/03/21 14:13:30 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,6 +34,8 @@ use strict; use Apache::Constants qw(:common :http); use Apache::lonnet(); use Apache::loncommon(); +use HTML::LCParser; +use Apache::File; sub handler { @@ -41,10 +43,240 @@ sub handler { $r->content_type('text/html'); $r->send_http_header; - $r->print('LON-CAPA Custom Distribution Rights'); + $r->print( + 'LON-CAPA Custom Distribution Rights'); $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>2)) { + 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); + if ($contents==-1) { $contents=''; } + } else { +# =============================================== This is in construction space + if (-e $fn) { + my $fh=Apache::File->new($fn); + $contents=join('',<$fh>); + $fh->close(); + } + $r->print('
'); + } + unless ($contents=~/\new(\$contents); + my $token; + my $rulecounter=0; + my $colzero=($constructmode?'Edit action':'Rule'); +# ---------------------------------------------------------- Start table output + $r->print(< + $colzeroEffectDomainCourse +SectionRole +ENDSTARTTABLE +# --------------------------------------------------------------------- Default +# Fast forward to first rule + $token=$parser->get_token; + while ($token->[1] ne 'accessrule') { $token=$parser->get_token; } +# print default + $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', + ('allow' => 'allow', + 'deny' => 'deny'))); + } else { + $r->print($token->[2]->{'effect'}); + } + $r->print('Default'); + if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { + $r->print(' - 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(''); +# insert, delete, etc + $r->print($rulecounter.'. '); + if ($constructmode) { + $r->print(&Apache::loncommon::select_form( + '','action_'.$rulecounter, + ('' => '', + 'delete' => 'Delete this rule', + 'insertabove' => 'Insert rule above', + 'insertbelow' => 'Insert rule below ', + 'moveup' => 'Move rule up', + 'movedown' => 'Move rule down'))); + } + $r->print(''); +# effect + if ($constructmode) { + $r->print(&Apache::loncommon::select_form + ($token->[2]->{'effect'}, + 'effect_'.$rulecounter, + ('allow' => 'allow', + 'deny' => 'deny'))); + } else { + $r->print($token->[2]->{'effect'}); + } + $r->print(''); +# ---- realm + my $realm=$token->[2]->{'realm'}; + $realm=~s/^\W//; + my ($rdom,$rcourse,$rsec)=split(/[\/\_]/,$realm); +# realm domain + if ($constructmode) { + unless ($rdom) { $rdom=$ENV{'user.domain'}; } + $r->print(&Apache::loncommon::select_dom_form($rdom, + 'domain_'.$rulecounter)); + } else { + $r->print($rdom); + } + $r->print(''); +# realm course + if ($constructmode) { + $r->print(''); + } else { + $r->print($rcourse); + } + + $r->print(''); +# realm section + if ($constructmode) { + $r->print(''); + } else { + $r->print($rsec); + } + + $r->print(''); +# role + if ($constructmode) { + my %hash=('' => ''); + foreach ('au','cc','in','ta','st') { + $hash{$_}=&Apache::lonnet::plaintext($_); + } + my $role=$token->[2]->{'role'}; + unless ($role) { $role=''; } + $r->print(&Apache::loncommon::select_form( + $role,'role_'.$rulecounter,%hash)); + } else { + $r->print(&Apache::lonnet::plaintext($token->[2]->{'role'})); + } +# close row + $r->print(''); + } + } + $r->print(''); +# ------------------------------------------------------------ End table output + if ($constructmode) { + $r->print(''); + } $r->print(''); return OK; }