--- loncom/publisher/lonrights.pm 2003/03/28 01:53:55 1.9 +++ loncom/publisher/lonrights.pm 2011/11/14 00:20:31 1.33 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to show and edit custom distribution rights # -# $Id: lonrights.pm,v 1.9 2003/03/28 01:53:55 www Exp $ +# $Id: lonrights.pm,v 1.33 2011/11/14 00:20:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,114 +32,141 @@ 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'. - &Apache::loncommon::coursebrowser_javascript().''); - - $r->print(&Apache::loncommon::bodytag('Custom Distribution Rights')); + # Breadcrumbs + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Construction Space', + 'href' => &Apache::loncommon::authorspace($r->uri), + }); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Custom Rights Editor', + 'title' => 'Custom Distribution Rights Editor', + 'href' => '',}); + + my $js = &Apache::loncommon::coursebrowser_javascript(). + &Apache::loncommon::studentbrowser_javascript(); + # Breadcrumbs are included by &start_page + $r->print(&Apache::loncommon::start_page('Custom Distribution Rights',$js) + .&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()) + ); $r->rflush(); my $uri=$r->uri; my $fn=&Apache::lonnet::filelocation('',$uri); my $contents=''; - my $constructmode=($uri=~/^\/\~/); + my $constructmode=($uri=~ m{^/priv/}); # ============================================================ Modify and store - if ($constructmode) { - if ($ENV{'form.store'}) { - my @newrules=(); - undef @newrules; + if ($constructmode && $env{'form.store'}) { + + my @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'; - } + foreach my $key (keys(%env)) { + next if ($key!~/^form\.effect\_(\d+)$/); + my $number=$1; + my %rulehash; + foreach my $action ('effect','type','domain','course','section','role') { + $rulehash{$action}=$env{'form.'.$action.'_'.$number}; + } + if ($rulehash{'type'} !~ /^(user|course)$/) { + $rulehash{'type'} = 'course'; + } + if ($rulehash{'type'} eq 'user') { + $rulehash{'section'}=''; + $rulehash{'role'}=''; + } + 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'} = + &LONCAPA::clean_domain($rulehash{'domain'}); + if ($rulehash{'type'} eq 'course') { + $rulehash{'course'} = + &LONCAPA::clean_courseid($rulehash{'course'}); + } else { + $rulehash{'course'} = + &LONCAPA::clean_username($rulehash{'course'}); + } + $rulehash{'section'}=~s/\W//g; + if (!$rulehash{'domain'}) { + $rulehash{'domain'}=$env{'user.domain'}; + } + my $realm=''; + my $separator = ($rulehash{'type'} eq 'course') ? '_' : '/'; + if ($number) { + $realm=$rulehash{'domain'}; + if ($rulehash{'course'}) { + $realm.=$separator.$rulehash{'course'}; } - } - + if ($rulehash{'section'}) { + $realm.=$separator.$rulehash{'section'}; + } + } + $newrules[$number]=$rulehash{'effect'}.':'. + $realm.':'.$rulehash{'role'}.':'.$rulehash{'type'}; + } +# edit actions? + foreach my $key (keys(%env)) { + next if ($key!~/^form\.action\_(\d+)$/); + my $number=$1; + if ($env{$key} eq 'delete') { splice(@newrules,$number,1); } + if (($env{$key} eq 'moveup') && ($number>1)) { + @newrules[$number-1,$number] = @newrules[$number,$number-1]; + } + if (($env{$key} eq 'movedown') && ($number<$#newrules)) { + @newrules[$number+1,$number] = @newrules[$number,$number+1]; + } + if ($env{$key} eq 'insertabove') { + splice(@newrules,$number,0,'deny'); + } + if ($env{$key} eq 'insertbelow') { + splice(@newrules,$number+1,0,'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; + my $fh=Apache::File->new('>'.$fn); + foreach (my $i=0;$i<=$#newrules;$i++) { + if ($newrules[$i]) { + my ($effect,$realm,$role,$type)=split(/\:/,$newrules[$i]); + print $fh + "\n"; + } } + $fh->close; } # ============================================================ Read and display unless ($constructmode) { @@ -161,77 +188,112 @@ sub handler { my $parser=HTML::LCParser->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', + 'ty' => 'Type', + 'do' => 'Domain', + 'co' => 'Course / User', + 'se' => 'Section', + 'ro' => 'Role'); # ---------------------------------------------------------- Start table output - $r->print(< - $colzeroEffectDomainCourse -SectionRole -ENDSTARTTABLE + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + "$colzero$lt{'ef'}$lt{'ty'}$lt{'do'}". + "$lt{'co'}$lt{'se'}$lt{'ro'}". + &Apache::loncommon::end_data_table_header_row()); # --------------------------------------------------------------------- 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(&Apache::loncommon::start_data_table_row().''); if ($constructmode) { $r->print(&Apache::loncommon::select_form('','action_0', - ('' => '', - 'insertbelow' => 'Insert rule below '))); + {'' => '', + 'insertbelow' => &mt('Insert rule below')})); } else { $r->print(' '); } $r->print(''); if ($constructmode) { - $r->print(&Apache::loncommon::select_form - ($token->[2]->{'effect'},'effect_0', + my %lt = &Apache::lonlocal::texthash ('allow' => 'allow', - 'deny' => 'deny'))); + 'deny' => 'deny'); + $r->print(&Apache::loncommon::select_form + ($token->[2]->{'effect'},'effect_0',\%lt)); } else { $r->print($token->[2]->{'effect'}); } - $r->print('Default'); + $r->print(''.&mt('Default')); if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { - $r->print(' - Error! No default set.'); + $r->print(' - '.&mt('Error! No default set.'). + ''); } - $r->print(''); + $r->print(''.&Apache::loncommon::end_data_table_row()); # Additional roles while ($token=$parser->get_token) { if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) { $rulecounter++; - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row(). + ''); # insert, delete, etc - $r->print($rulecounter.'. '); + $r->print(''.$rulecounter.'. '); if ($constructmode) { + my %lt = &Apache::lonlocal::texthash + ('' => '', + 'delete' => 'Delete this rule', + 'insertabove' => 'Insert rule above', + 'insertbelow' => 'Insert rule below', + 'moveup' => 'Move rule up', + 'movedown' => 'Move rule down' + ); + $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'))); + '','action_'.$rulecounter,\%lt)); } - $r->print(''); + $r->print(''. + ''); # effect if ($constructmode) { + my %lt = &Apache::lonlocal::texthash + ('allow' => 'allow', + 'deny' => 'deny'); $r->print(&Apache::loncommon::select_form ($token->[2]->{'effect'}, - 'effect_'.$rulecounter, - ('allow' => 'allow', - 'deny' => 'deny'))); + 'effect_'.$rulecounter,\%lt)); } else { $r->print($token->[2]->{'effect'}); } - $r->print(''); + +# type + $r->print(''); + my $type = ($token->[2]{'type'} || 'course'); + if ($constructmode) { + my %lt = &Apache::lonlocal::texthash + ('course' => 'Course', + 'user' => 'User'); + $r->print(&Apache::loncommon::select_form($type, + 'type_'.$rulecounter,\%lt)); + } else { + $r->print($type); + } + # ---- realm my $realm=$token->[2]->{'realm'}; - $realm=~s/^\W//; - my ($rdom,$rcourse,$rsec)=split(/[\/\_]/,$realm); + my ($rdom,$rcourse,$rsec); + if ($type eq 'course') { + ($rdom,$rcourse,$rsec) = split(m{[/_]},$realm,3); + $rcourse = &LONCAPA::clean_courseid($rcourse); + } else { + ($rdom,$rcourse,$rsec) = split(m{/},$realm,3); + $rcourse = &LONCAPA::clean_username($rcourse); + } + $r->print(''); # realm domain if ($constructmode) { - unless ($rdom) { $rdom=$ENV{'user.domain'}; } + unless ($rdom) { $rdom=$env{'user.domain'}; } $r->print(&Apache::loncommon::select_dom_form($rdom, 'domain_'.$rulecounter)); } else { @@ -240,54 +302,74 @@ ENDSTARTTABLE $r->print(''); # realm course if ($constructmode) { - $r->print(''); } else { $r->print($rcourse); } - $r->print(''); + $r->print(''); # realm section - if ($constructmode) { - $r->print(''); - } else { - $r->print($rsec); - } + if ($type eq 'course') { + 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'})); - } + if ($type eq 'course') { + 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'})); + } + } # course selection link - $r->print(''); - if ($rcourse) { - my %descript= - &Apache::lonnet::coursedescription($rdom.'_'.$rcourse); - $r->print($descript{'description'}.'   '); - } - $r->print(&Apache::loncommon::selectcourse_link('rules', - 'course_'.$rulecounter,'domain_'.$rulecounter)); + $r->print(''. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::continue_data_table_row(). + ''); + if ($type eq 'course') { + if ($rcourse) { + my %descript= + &Apache::lonnet::coursedescription($rdom.'_'.$rcourse, + {'one_time' => 1}); + $r->print($descript{'description'}.'   '); + } + if ($constructmode) { + $r->print(&Apache::loncommon::selectcourse_link('rules', + 'course_'.$rulecounter,'domain_'.$rulecounter)); + } + } else { + if ($rcourse) { + my $name = &Apache::loncommon::plainname($rcourse,$rdom); + $r->print($name.'   '); + } + if ($constructmode) { + $r->print(&Apache::loncommon::selectstudent_link('rules','course_'.$rulecounter,'domain_'.$rulecounter)); + } + } # close row - $r->print(''); + $r->print(''.&Apache::loncommon::end_data_table_row()); } } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table()); # ------------------------------------------------------------ End table output if ($constructmode) { - $r->print(''); + $r->print(''); } - $r->print(''); + $r->print(&Apache::loncommon::end_page()); return OK; } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.