File:
[LON-CAPA] /
loncom /
publisher /
lonrights.pm
Revision
1.15:
download - view:
text,
annotated -
select for diffs
Thu May 20 13:42:35 2004 UTC (20 years, 3 months ago) by
www
Branches:
MAIN
CVS tags:
version_1_3_X,
version_1_3_3,
version_1_3_2,
version_1_3_1,
version_1_3_0,
version_1_2_X,
version_1_2_99_1,
version_1_2_99_0,
version_1_2_1,
version_1_2_0,
version_1_1_99_5,
version_1_1_99_4,
version_1_1_99_3,
version_1_1_99_2,
version_1_1_99_1,
version_1_1_99_0,
HEAD
Going back to 1.13 - need to implement source access with the standard
.meta and default.meta files.
# The LearningOnline Network with CAPA
# Handler to show and edit custom distribution rights
#
# $Id: lonrights.pm,v 1.15 2004/05/20 13:42:35 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
#
###
package Apache::lonrights;
use strict;
use Apache::Constants qw(:common :http);
use Apache::lonnet();
use Apache::loncommon();
use HTML::LCParser;
use Apache::File;
use Apache::lonlocal;
sub handler {
my $r=shift;
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(
'<html><head><title>LON-CAPA Custom Distribution Rights</title>'.
&Apache::loncommon::coursebrowser_javascript().'</head>');
$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
"<accessrule effect='$effect' realm='$realm' role='$role' />\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('<form name="rules" method="post">');
}
unless ($contents=~/\<accessrule/s) {
$contents='<accessrule effect="deny" />';
}
my $parser=HTML::LCParser->new(\$contents);
my $token;
my $rulecounter=0;
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(<<ENDSTARTTABLE);
<table border="2">
<tr><th>$colzero</th><th>$lt{'ef'}</th><th>$lt{'do'}</th><th>$lt{'co'}</th>
<th>$lt{'se'}</th><th>$lt{'ro'}</th></tr>
ENDSTARTTABLE
# --------------------------------------------------------------------- Default
# Fast forward to first rule
$token=$parser->get_token;
while ($token->[1] ne 'accessrule') { $token=$parser->get_token; }
# print default
$r->print('<tr><td align="right">');
if ($constructmode) {
$r->print(&Apache::loncommon::select_form('','action_0',
('' => '',
'insertbelow' => 'Insert rule below ')));
} else {
$r->print(' ');
}
$r->print('</td><td>');
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('</td><td colspan="4">Default');
if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) {
$r->print(' - <font color="red">'.&mt('Error! No default set.').
'</font>');
}
$r->print('</td></tr>');
# Additional roles
while ($token=$parser->get_token) {
if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) {
$rulecounter++;
$r->print('<tr><td align="right" rowspan="2">');
# 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('</td><td rowspan="2">');
# 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('</td><td>');
# ---- 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('</td><td>');
# realm course
if ($constructmode) {
$r->print('<input input type="text" size="25" name="course_'.
$rulecounter.'" value="'.$rcourse.'" />');
} else {
$r->print($rcourse);
}
$r->print('</td><td>');
# realm section
if ($constructmode) {
$r->print('<input input type="text" size="5" name="section_'.
$rulecounter.'" value="'.$rsec.'" />');
} else {
$r->print($rsec);
}
$r->print('</td><td rowspan="2">');
# 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'}));
}
# course selection link
$r->print('</td></tr><tr><td colspan="3" align="right">');
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('</td></tr>');
}
}
$r->print('</table>');
# ------------------------------------------------------------ End table output
if ($constructmode) {
$r->print('<input type="submit" name="store" value="'.&mt('Store').'" /></form>');
}
$r->print('</body></html>');
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>