--- loncom/publisher/lonrights.pm 2003/03/14 02:26:12 1.1 +++ loncom/publisher/lonrights.pm 2011/11/02 18:40:17 1.31 @@ -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.31 2011/11/02 18:40:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,20 +32,344 @@ 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'); + # Breadcrumbs + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Construction Space', + 'href' => &Apache::loncommon::authorspace(), + }); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Custom Rights Editor', + 'title' => 'Custom Distribution Rights Editor', + 'href' => '',}); - $r->print(&Apache::loncommon::bodytag('Custom Distribution Rights')); + 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(); - $r->print(''); + my $uri=$r->uri; + my $fn=&Apache::lonnet::filelocation('',$uri); + my $contents=''; + my $constructmode=($uri=~ m/^/priv/}); + +# ============================================================ Modify and store + if ($constructmode && $env{'form.store'}) { + + my @newrules; + +# read rules from form + 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,$type)=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=&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(&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(&Apache::loncommon::start_data_table_row().''); + if ($constructmode) { + $r->print(&Apache::loncommon::select_form('','action_0', + {'' => '', + 'insertbelow' => &mt('Insert rule below')})); + + } else { + $r->print(' '); + } + $r->print(''); + if ($constructmode) { + my %lt = &Apache::lonlocal::texthash + ('allow' => 'allow', + 'deny' => 'deny'); + $r->print(&Apache::loncommon::select_form + ($token->[2]->{'effect'},'effect_0',\%lt)); + } else { + $r->print($token->[2]->{'effect'}); + } + $r->print(''.&mt('Default')); + if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { + $r->print(' - '.&mt('Error! No default set.'). + ''); + } + $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(&Apache::loncommon::start_data_table_row(). + ''); +# insert, delete, etc + $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,\%lt)); + } + $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,\%lt)); + } else { + $r->print($token->[2]->{'effect'}); + } + +# 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'}; + 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'}; } + $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 ($type eq 'course') { + if ($constructmode) { + $r->print(''); + } else { + $r->print($rsec); + } + } + + $r->print(''); +# 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(''. + &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(''.&Apache::loncommon::end_data_table_row()); + } + } + $r->print(&Apache::loncommon::end_data_table()); +# ------------------------------------------------------------ End table output + if ($constructmode) { + $r->print(''); + } + $r->print(&Apache::loncommon::end_page()); return OK; }