--- loncom/interface/loncommon.pm 2006/11/01 22:22:31 1.467 +++ loncom/interface/loncommon.pm 2006/11/29 19:33:29 1.476 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.467 2006/11/01 22:22:31 www Exp $ +# $Id: loncommon.pm,v 1.476 2006/11/29 19:33:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -386,20 +386,27 @@ sub selectstudent_link { } sub coursebrowser_javascript { - my ($domainfilter)=@_; + my ($domainfilter,$sec_element,$formname)=@_; my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role'); - return (< -1) { + var domid = getIndexByName(formid,udom); + if (domid > -1) { + if (document.forms[formid].elements[domid].type == 'select-one') { + domainfilter=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value; + } + if (document.forms[formid].elements[domid].type == 'hidden') { + domainfilter=document.forms[formid].elements[domid].value; + } + } } - var domainfilter='$domainfilter'; if (domainfilter != null) { if (domainfilter != '') { url += 'domainfilter='+domainfilter+'&'; @@ -408,11 +415,18 @@ sub coursebrowser_javascript { url += 'form=' + formname + '&cnumelement='+uname+ '&cdomelement='+udom+ '&cnameelement='+desc; - if (extra_element !=null && extra_element != '' && formname == 'rolechoice') { - url += '&roleelement='+extra_element; - if (domainfilter == null || domainfilter == '') { - url += '&domainfilter='+extra_element; + if (extra_element !=null && extra_element != '') { + if (formname == 'rolechoice') { + url += '&roleelement='+extra_element; + if (domainfilter == null || domainfilter == '') { + url += '&domainfilter='+extra_element; + } } + else { + if (formname == 'portform') { + url += '&setroles='+extra_element; + } + } } if (multflag !=null && multflag != '') { url += '&multiple='+multflag; @@ -435,9 +449,69 @@ sub coursebrowser_javascript { stdeditbrowser = open(url,title,options,'1'); stdeditbrowser.focus(); } - + + function getFormIdByName(formname) { + for (var i=0;i '; +} + sub gradeleveldescription { my $gradelevel=shift; my %gradelevels=(0 => 'Not specified', @@ -2718,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}); @@ -2730,13 +2822,129 @@ 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 = &aboutmewrapper(&plainname($uname,$udom),$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.'.'. + &Apache::loncommon::end_data_table_row(); + } + } + $output .= &end_data_table(); +} + ############################################### =pod @@ -3194,8 +3402,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'; @@ -3280,6 +3488,9 @@ table#LC_title_bar td.LC_title_bar_who { font: small $sans; text-align: right; } +span.LC_metadata { + font-family: $sans; +} span.LC_title_bar_title { font: bold x-large $sans; } @@ -3437,6 +3648,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; @@ -4126,6 +4350,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";; @@ -4528,6 +4759,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);