--- loncom/interface/loncommon.pm 2006/11/15 20:09:54 1.469
+++ loncom/interface/loncommon.pm 2006/11/29 15:38:22 1.475
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.469 2006/11/15 20:09:54 banghart Exp $
+# $Id: loncommon.pm,v 1.475 2006/11/29 15:38:22 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1377,6 +1377,23 @@ sub select_form {
return $selectform;
}
+# For display filters
+
+sub display_filter {
+ if (!$env{'form.show'}) { $env{'form.show'}=10; }
+ return ' ';
+}
+
sub gradeleveldescription {
my $gradelevel=shift;
my %gradelevels=(0 => 'Not specified',
@@ -2792,8 +2809,9 @@ sub findallcourses {
my %courses;
my $now=time;
foreach my $key (keys(%env)) {
- if ( $key=~m{^user\.role\.(\w+)\./(\w+)/(\w+)} ) {
- my ($role,$domain,$id) = ($1,$2,$3);
+ if ( $key=~m{^user\.role\.(\w+)\./(\w+)/(\w+)/?(\w*)$} ||
+ $key=~m{^user\.role\.(cr/\w+/\w+/\w+)\./(\w+)/(\w+)}) {
+ my ($role,$domain,$id,$sec) = ($1,$2,$3,$4);
next if ($role eq 'ca' || $role eq 'aa');
next if (%roles && !exists($roles{$role}));
my ($starttime,$endtime)=split(/\./,$env{$key});
@@ -2804,13 +2822,131 @@ sub findallcourses {
if ($endtime) {
if ($now>$endtime) { $active=0; }
}
- if ($active) { $courses{$domain.'_'.$id}=1; }
+ if ($active) {
+ if ($sec eq '') {
+ $sec = 'none';
+ }
+ $courses{$domain.'_'.$id}{$sec} = 1;
+ }
}
}
- return keys(%courses);
+ return %courses;
}
###############################################
+
+sub blockcheck {
+ my ($setters,$activity) = @_;
+ # Retrieve active student roles and active course coordinator/instructor roles
+
+ my %live_courses = &findallcourses();
+
+ # Retrieve blocking times and identity of blocker for active courses
+ # unless user has 'evb' privilege.
+
+ my $startblock = 0;
+ my $endblock = 0;
+
+ foreach my $course (keys(%live_courses)) {
+ my $cdom = $env{'course.'.$course.'.domain'};
+ my $cnum = $env{'course.'.$course.'.num'};
+ my $noblock = 0;
+ foreach my $sec (keys(%{$live_courses{$course}})) {
+ my $role = 'cm./'.$cdom.'/'.$cnum;
+ if ($sec ne 'none') {
+ $role .= '/'.$sec;
+ }
+ if (&Apache::lonnet::allowed('evb',undef,undef,$role)) {
+ $noblock = 1;
+ last;
+ }
+ }
+ # if they have the evb priv and are currently not playing student
+ next if (($noblock) &&
+ ($env{'request.role'} !~ m{^st\./$cdom/$cnum}));
+
+ $setters->{$course} = {};
+ $setters->{$course}{'staff'} = [];
+ $setters->{$course}{'times'} = [];
+ my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
+ foreach my $record (keys(%records)) {
+ my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);
+ if ($start <= time && $end >= time) {
+ my ($staff_name,$staff_dom,$title,$blocks) =
+ &parse_block_record($records{$record});
+ if ($blocks->{$activity} eq 'on') {
+ push(@{$$setters{$course}{'staff'}}, [$staff_name,$staff_dom]); push(@{$$setters{$course}{'times'}}, [$start,$end]);
+ if ( ($startblock == 0) || ($startblock > $1) ) {
+ $startblock = $1;
+ }
+ if ( ($endblock == 0) || ($endblock < $2) ) {
+ $endblock = $2;
+ }
+ }
+ }
+ }
+ }
+ return ($startblock,$endblock);
+}
+
+sub parse_block_record {
+ my ($record) = @_;
+ my ($setuname,$setudom,$title,$blocks);
+ if (ref($record) eq 'HASH') {
+ ($setuname,$setudom) = split(/:/,$record->{'setter'});
+ $title = &unescape($record->{'event'});
+ $blocks = $record->{'blocks'};
+
+ } else {
+ my @data = split(/:/,$record,3);
+ if (scalar(@data) eq 2) {
+ $title = $data[1];
+ ($setuname,$setudom) = split(/@/,$data[0]);
+ } else {
+ ($setuname,$setudom,$title) = @data;
+ }
+ $blocks = { 'com' => 'on' };
+ }
+ return ($setuname,$setudom,$title,$blocks);
+}
+
+sub build_block_table {
+ my ($startblock,$endblock,$setters) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ 'cacb' => 'Currently active communication blocks',
+ 'cour' => 'Course',
+ 'dura' => 'Duration',
+ 'blse' => 'Block set by'
+ );
+ my $output;
+ $output = '
'.$lt{'cacb'}.':
';
+ $output .= &start_data_table();
+ $output .= '
+
+ '.$lt{'cour'}.' |
+ '.$lt{'dura'}.' |
+ '.$lt{'blse'}.' |
+
+';
+ foreach my $course (keys(%{$setters})) {
+ my %courseinfo=&Apache::lonnet::coursedescription($course);
+ for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) {
+ my ($uname,$udom) = @{$$setters{$course}{staff}[$i]};
+ my $fullname = &Apache::loncommon::plainname($uname,$udom);
+ my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};
+ $openblock = &Apache::lonlocal::locallocaltime($openblock);
+ $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$courseinfo{'description'}.' | '.
+ ''.$openblock.' to '.$closeblock.' | '.
+ ''.$fullname.' ('.$uname.':'.$udom.
+ ') | '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ }
+ $output .= &end_data_table();
+}
+
###############################################
=pod
@@ -3268,8 +3404,8 @@ sub standard_css {
my $mono = 'monospace';
my $data_table_head = $tabbg;
my $data_table_light = '#EEEEEE';
- my $data_table_dark = '#DDD';
- my $data_table_darker = '#CCC';
+ my $data_table_dark = '#DDDDDD';
+ my $data_table_darker = '#CCCCCC';
my $data_table_highlight = '#FFFF00';
my $mail_new = '#FFBB77';
my $mail_new_hover = '#DD9955';
@@ -3514,6 +3650,19 @@ table.LC_whatsnew tr.LC_odd_row td {
background-color: #EEE;
}
+table.LC_createuser {
+}
+
+table.LC_createuser tr.LC_section_row td {
+ font-size: smaller;
+}
+
+table.LC_createuser tr.LC_info_row td {
+ background-color: #CCC;
+ font-weight: bold;
+ text-align: center;
+}
+
table.LC_calendar {
border: 1px solid #000000;
border-collapse: collapse;
@@ -4203,6 +4352,13 @@ sub simple_error_page {
$css_class = (join(' ',$css_class,$add_class));
return ''."\n";;
}
+
+ sub continue_data_table_row {
+ my ($add_class) = @_;
+ my $css_class = ($row_count % 2)?'':'LC_even_row';
+ $css_class = (join(' ',$css_class,$add_class));
+ return '
'."\n";;
+ }
sub end_data_table_row {
return '
'."\n";;
@@ -4605,6 +4761,96 @@ sub get_user_info {
return;
}
+###############################################
+
+=pod
+
+=item * &get_user_quota()
+
+Retrieves quota assigned for storage of portfolio files for a user
+
+Incoming parameters:
+1. user's username
+2. user's domain
+
+Returns:
+1. Disk quota (in Mb) assigned to student.
+
+If a value has been stored in the user's environment,
+it will return that, otherwise it returns the default
+for users in the domain.
+
+=cut
+
+###############################################
+
+
+sub get_user_quota {
+ my ($uname,$udom) = @_;
+ my $quota;
+ if (!defined($udom)) {
+ $udom = $env{'user.domain'};
+ }
+ if (!defined($uname)) {
+ $uname = $env{'user.name'};
+ }
+ if (($udom eq '' || $uname eq '') ||
+ ($udom eq 'public') && ($uname eq 'public')) {
+ $quota = 0;
+ } else {
+ if ($udom eq $env{'user.domain'} && $uname eq $env{'user.name'}) {
+ $quota = $env{'environment.portfolioquota'};
+ } else {
+ my %userenv = &Apache::lonnet::dump('environment',$udom,$uname);
+ my ($tmp) = keys(%userenv);
+ if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
+ $quota = $userenv{'portfolioquota'};
+ } else {
+ undef(%userenv);
+ }
+ }
+ if ($quota eq '') {
+ $quota = &default_quota($udom);
+ }
+ }
+ return $quota;
+}
+
+###############################################
+
+=pod
+
+=item * &default_quota()
+
+Retrieves default quota assigned for storage of user portfolio files
+
+Incoming parameters:
+1. domain
+
+Returns:
+1. Default disk quota (in Mb) for user portfolios in the domain.
+
+If a value has been stored in the domain's configuration db,
+it will return that, otherwise it returns 20 (for backwards
+compatibility with domains which have not set up a configuration
+db file; the original statically defined portfolio quota was 20 Mb).
+
+=cut
+
+###############################################
+
+
+sub default_quota {
+ my ($udom) = @_;
+ my %defaults = &Apache::lonnet::get_dom('configuration',
+ ['portfolioquota'],$udom);
+ if ($defaults{'portfolioquota'} ne '') {
+ return $defaults{'portfolioquota'};
+ } else {
+ return '20';
+ }
+}
+
sub get_secgrprole_info {
my ($cdom,$cnum,$needroles,$type) = @_;
my %sections_count = &get_sections($cdom,$cnum);