--- loncom/interface/loncommon.pm 2019/07/19 13:19:50 1.1075.2.132
+++ loncom/interface/loncommon.pm 2014/03/13 14:46:46 1.1181
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1075.2.132 2019/07/19 13:19:50 raeburn Exp $
+# $Id: loncommon.pm,v 1.1181 2014/03/13 14:46:46 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -69,19 +69,14 @@ use Apache::lontexconvert();
use Apache::lonclonecourse();
use Apache::lonuserutils();
use Apache::lonuserstate();
-use Apache::courseclassifier();
use LONCAPA qw(:DEFAULT :match);
use DateTime::TimeZone;
-use DateTime::Locale;
-use Encode();
+use DateTime::Locale::Catalog;
+use Text::Aspell;
use Authen::Captcha;
use Captcha::reCAPTCHA;
-use JSON::DWIW;
-use LWP::UserAgent;
use Crypt::DES;
use DynaLoader; # for Crypt::DES version
-use File::Copy();
-use File::Path();
# ---------------------------------------------- Designs
use vars qw(%defaultdesign);
@@ -166,6 +161,7 @@ sub ssi_with_retries {
# ----------------------------------------------- Filetypes/Languages/Copyright
my %language;
my %supported_language;
+my %supported_codes;
my %latex_language; # For choosing hyphenation in
my %latex_language_bykey; # for choosing hyphenation from metadata
my %cprtag;
@@ -196,18 +192,19 @@ BEGIN {
{
my $langtabfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/language.tab';
- if ( open(my $fh,'<',$langtabfile) ) {
+ if ( open(my $fh,"<$langtabfile") ) {
while (my $line = <$fh>) {
next if ($line=~/^\#/);
chomp($line);
- my ($key,$two,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line));
+ my ($key,$code,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line));
$language{$key}=$val.' - '.$enc;
if ($sup) {
$supported_language{$key}=$sup;
+ $supported_codes{$key} = $code;
}
if ($latex) {
$latex_language_bykey{$key} = $latex;
- $latex_language{$two} = $latex;
+ $latex_language{$code} = $latex;
}
}
close($fh);
@@ -217,7 +214,7 @@ BEGIN {
{
my $copyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}.
'/copyright.tab';
- if ( open (my $fh,'<',$copyrightfile) ) {
+ if ( open (my $fh,"<$copyrightfile") ) {
while (my $line = <$fh>) {
next if ($line=~/^\#/);
chomp($line);
@@ -231,7 +228,7 @@ BEGIN {
{
my $sourcecopyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}.
'/source_copyright.tab';
- if ( open (my $fh,'<',$sourcecopyrightfile) ) {
+ if ( open (my $fh,"<$sourcecopyrightfile") ) {
while (my $line = <$fh>) {
next if ($line =~ /^\#/);
chomp($line);
@@ -245,7 +242,7 @@ BEGIN {
# -------------------------------------------------------------- default domain designs
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';
my $designfile = $designdir.'/default.tab';
- if ( open (my $fh,'<',$designfile) ) {
+ if ( open (my $fh,"<$designfile") ) {
while (my $line = <$fh>) {
next if ($line =~ /^\#/);
chomp($line);
@@ -259,12 +256,12 @@ BEGIN {
{
my $categoryfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/filecategories.tab';
- if ( open (my $fh,'<',$categoryfile) ) {
+ if ( open (my $fh,"<$categoryfile") ) {
while (my $line = <$fh>) {
next if ($line =~ /^\#/);
chomp($line);
my ($extension,$category)=(split(/\s+/,$line,2));
- push(@{$category_extensions{lc($category)}},$extension);
+ push @{$category_extensions{lc($category)}},$extension;
}
close($fh);
}
@@ -274,7 +271,7 @@ BEGIN {
{
my $typesfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/filetypes.tab';
- if ( open (my $fh,'<',$typesfile) ) {
+ if ( open (my $fh,"<$typesfile") ) {
while (my $line = <$fh>) {
next if ($line =~ /^\#/);
chomp($line);
@@ -537,7 +534,7 @@ ENDAUTHORBRW
sub coursebrowser_javascript {
my ($domainfilter,$sec_element,$formname,$role_element,$crstype,
- $credits_element,$instcode) = @_;
+ $credits_element) = @_;
my $wintitle = 'Course_Browser';
if ($crstype eq 'Community') {
$wintitle = 'Community_Browser';
@@ -588,12 +585,6 @@ sub coursebrowser_javascript {
var ownername = document.forms[formid].ccuname.value;
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value;
url += '&cloner='+ownername+':'+ownerdom;
- if (type == 'Course') {
- url += '&crscode='+document.forms[formid].crscode.value;
- }
- }
- if (formname == 'requestcrs') {
- url += '&crsdom=$domainfilter&crscode=$instcode';
}
if (multflag !=null && multflag != '') {
url += '&multiple='+multflag;
@@ -677,7 +668,7 @@ if (!Array.prototype.indexOf) {
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
- if (n !== n) { // shortcut for verifying if it's NaN
+ if (n !== n) { // shortcut for verifying if it is NaN
n = 0;
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
@@ -913,12 +904,12 @@ sub check_uncheck_jscript {
function checkAll(field) {
if (field.length > 0) {
for (i = 0; i < field.length; i++) {
- if (!field[i].disabled) {
+ if (!field[i].disabled) {
field[i].checked = true;
}
}
} else {
- if (!field.disabled) {
+ if (!field.disabled) {
field.checked = true;
}
}
@@ -938,8 +929,8 @@ ENDSCRT
}
sub select_timezone {
- my ($name,$selected,$onchange,$includeempty,$disabled)=@_;
- my $output='
';
$itemcount ++;
@@ -14558,15 +13618,12 @@ path - Array containing all categories b
currcategories - reference to array of current categories assigned to the course
-disabled - scalar (optional) contains disabled="disabled" if input elements are
- to be readonly (e.g., Domain Helpdesk role viewing course settings).
-
Returns: $output (markup to be displayed).
=cut
sub assign_category_rows {
- my ($itemcount,$cats,$depth,$parent,$path,$currcategories,$disabled) = @_;
+ my ($itemcount,$cats,$depth,$parent,$path,$currcategories) = @_;
my ($text,$name,$item,$chgstr);
if (ref($cats) eq 'ARRAY') {
my $maxdepth = scalar(@{$cats});
@@ -14589,12 +13646,12 @@ sub assign_category_rows {
}
$text .= '
';
@@ -14742,7 +13799,7 @@ sub commit_studentrole {
}
}
} else {
- if ($secchange) {
+ if ($secchange) {
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed;
} else {
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed;
@@ -14825,95 +13882,37 @@ sub check_clone {
return ($can_clone, $clonemsg, $cloneid, $clonehome);
}
}
- if (($env{'request.role.domain'} eq $args->{'clonedomain'}) &&
+ if (($env{'request.role.domain'} eq $args->{'clonedomain'}) &&
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {
$can_clone = 1;
} else {
- my %clonehash = &Apache::lonnet::get('environment',['cloners','internal.coursecode'],
+ my %clonehash = &Apache::lonnet::get('environment',['cloners'],
$args->{'clonedomain'},$args->{'clonecourse'});
- if ($clonehash{'cloners'} eq '') {
- my %domdefs = &Apache::lonnet::get_domain_defaults($args->{'course_domain'});
- if ($domdefs{'canclone'}) {
- unless ($domdefs{'canclone'} eq 'none') {
- if ($domdefs{'canclone'} eq 'domain') {
- if ($args->{'ccdomain'} eq $args->{'clonedomain'}) {
- $can_clone = 1;
- }
- } elsif (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) &&
- ($args->{'clonedomain'} eq $args->{'course_domain'})) {
- if (&Apache::lonnet::default_instcode_cloning($args->{'clonedomain'},$domdefs{'canclone'},
- $clonehash{'internal.coursecode'},$args->{'crscode'})) {
- $can_clone = 1;
- }
- }
- }
- }
+ my @cloners = split(/,/,$clonehash{'cloners'});
+ if (grep(/^\*$/,@cloners)) {
+ $can_clone = 1;
+ } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {
+ $can_clone = 1;
} else {
- my @cloners = split(/,/,$clonehash{'cloners'});
- if (grep(/^\*$/,@cloners)) {
- $can_clone = 1;
- } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {
- $can_clone = 1;
- } elsif (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners)) {
- $can_clone = 1;
- }
- unless ($can_clone) {
- if (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) &&
- ($args->{'clonedomain'} eq $args->{'course_domain'})) {
- my (%gotdomdefaults,%gotcodedefaults);
- foreach my $cloner (@cloners) {
- if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) &&
- ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) {
- my (%codedefaults,@code_order);
- if (ref($gotcodedefaults{$args->{'clonedomain'}}) eq 'HASH') {
- if (ref($gotcodedefaults{$args->{'clonedomain'}}{'defaults'}) eq 'HASH') {
- %codedefaults = %{$gotcodedefaults{$args->{'clonedomain'}}{'defaults'}};
- }
- if (ref($gotcodedefaults{$args->{'clonedomain'}}{'order'}) eq 'ARRAY') {
- @code_order = @{$gotcodedefaults{$args->{'clonedomain'}}{'order'}};
- }
- } else {
- &Apache::lonnet::auto_instcode_defaults($args->{'clonedomain'},
- \%codedefaults,
- \@code_order);
- $gotcodedefaults{$args->{'clonedomain'}}{'defaults'} = \%codedefaults;
- $gotcodedefaults{$args->{'clonedomain'}}{'order'} = \@code_order;
- }
- if (@code_order > 0) {
- if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order,
- $cloner,$clonehash{'internal.coursecode'},
- $args->{'crscode'})) {
- $can_clone = 1;
- last;
- }
- }
- }
- }
- }
- }
- }
- unless ($can_clone) {
my $ccrole = 'cc';
if ($args->{'crstype'} eq 'Community') {
$ccrole = 'co';
}
- my %roleshash =
- &Apache::lonnet::get_my_roles($args->{'ccuname'},
- $args->{'ccdomain'},
- 'userroles',['active'],[$ccrole],
- [$args->{'clonedomain'}]);
- if ($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) {
+ my %roleshash =
+ &Apache::lonnet::get_my_roles($args->{'ccuname'},
+ $args->{'ccdomain'},
+ 'userroles',['active'],[$ccrole],
+ [$args->{'clonedomain'}]);
+ if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
$can_clone = 1;
- } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},
- $args->{'ccuname'},$args->{'ccdomain'})) {
+ } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) {
$can_clone = 1;
- }
- }
- unless ($can_clone) {
- if ($args->{'crstype'} eq 'Community') {
- $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
} else {
- $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ if ($args->{'crstype'} eq 'Community') {
+ $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ } else {
+ $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ }
}
}
}
@@ -14922,8 +13921,7 @@ sub check_clone {
}
sub construct_course {
- my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,
- $cnum,$category,$coderef) = @_;
+ my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category,$coderef) = @_;
my $outcome;
my $linefeed = ' '."\n";
if ($context eq 'auto') {
@@ -15071,7 +14069,7 @@ sub construct_course {
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$class,$cenv{'internal.courseowner'});
$cenv{'internal.sectionnums'} .= $item.',';
unless ($addcheck eq 'ok') {
- push(@badclasses,$class);
+ push @badclasses, $class;
}
}
$cenv{'internal.sectionnums'} =~ s/,$//;
@@ -15099,7 +14097,7 @@ sub construct_course {
my $addcheck = &Apache::lonnet::auto_new_course($$crsunum,$$crsudom,$xl,$cenv{'internal.courseowner'});
$cenv{'internal.crosslistings'} .= $item.',';
unless ($addcheck eq 'ok') {
- push(@badclasses,$xl);
+ push @badclasses, $xl;
}
}
$cenv{'internal.crosslistings'} =~ s/,$//;
@@ -15134,29 +14132,28 @@ sub construct_course {
}
if (@badclasses > 0) {
my %lt=&Apache::lonlocal::texthash(
- 'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course.',
- 'howi' => 'However, if automated course roster updates are enabled for this class, these particular sections/crosslistings are not guaranteed to contribute towards enrollment.',
- 'itis' => 'It is possible that rights to access enrollment for these classes will be available through assignment of co-owners.',
+ 'tclb' => 'The courses listed below were included as sections or crosslistings affiliated with your new LON-CAPA course. However, if automated course roster updates are enabled for this class, these particular sections/crosslistings will not contribute towards enrollment, because the user identified as the course owner for this LON-CAPA course',
+ 'dnhr' => 'does not have rights to access enrollment in these classes',
+ 'adby' => 'as determined by the policies of your institution on access to official classlists'
);
- my $badclass_msg = $lt{'tclb'}.$linefeed.$lt{'howi'}.$linefeed.
- &mt('That is because the user identified as the course owner ([_1]) does not have rights to access enrollment in these classes, as determined by the policies of your institution on access to official classlists',$cenv{'internal.courseowner'}).$linefeed.$lt{'itis'};
+ my $badclass_msg = $cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.
+ ' ('.$lt{'adby'}.')';
if ($context eq 'auto') {
$outcome .= $badclass_msg.$linefeed;
- } else {
$outcome .= '
\n";
- }
+ }
}
if ($args->{'no_end_date'}) {
$args->{'endaccess'} = 0;
@@ -15188,9 +14185,6 @@ sub construct_course {
if ($args->{'setcontent'}) {
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};
}
- if ($args->{'setcomment'}) {
- $cenv{'comment.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};
- }
}
if ($args->{'reshome'}) {
$cenv{'reshome'}=$args->{'reshome'}.'/';
@@ -15225,7 +14219,7 @@ sub construct_course {
if (ref($crsinfo{$$crsudom.'_'.$$crsunum}) eq 'HASH') {
$crsinfo{$$crsudom.'_'.$$crsunum}{'uniquecode'} = $code;
my $putres = &Apache::lonnet::courseidput($$crsudom,\%crsinfo,$crsuhome,'notime');
- }
+ }
if (ref($coderef)) {
$$coderef = $code;
}
@@ -15310,7 +14304,7 @@ sub make_unique_code {
my $tries = 0;
my $gotlock = &Apache::lonnet::newput_dom('uniquecodes',$lockhash,$cdom);
my ($code,$error);
-
+
while (($gotlock ne 'ok') && ($tries<3)) {
$tries ++;
sleep 1;
@@ -15447,7 +14441,7 @@ sub escape_url {
my ($url) = @_;
my @urlslices = split(/\//, $url,-1);
my $lastitem = &escape(pop(@urlslices));
- return &HTML::Entities::encode(join('/',@urlslices),"'").'/'.$lastitem;
+ return join('/',@urlslices).'/'.$lastitem;
}
sub compare_arrays {
@@ -15505,17 +14499,6 @@ sub init_user_environment {
}
}
closedir(DIR);
-# If there is a undeleted lockfile for the user's paste buffer remove it.
- my $namespace = 'nohist_courseeditor';
- my $lockingkey = 'paste'."\0".'locked_num';
- my %lockhash = &Apache::lonnet::get($namespace,[$lockingkey],
- $domain,$username);
- if (exists($lockhash{$lockingkey})) {
- my $delresult = &Apache::lonnet::del($namespace,[$lockingkey],$domain,$username);
- unless ($delresult eq 'ok') {
- &Apache::lonnet::logthis("Failed to delete paste buffer locking key in $namespace for ".$username.":".$domain." Result was: $delresult");
- }
- }
}
# Give them a new cookie
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'}
@@ -15529,8 +14512,8 @@ sub init_user_environment {
}
# ------------------------------------ Check browser type and MathML capability
- my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,$clientunicode,
- $clientos,$clientmobile,$clientinfo,$clientosversion) = &decode_user_agent($r);
+ my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,
+ $clientunicode,$clientos,$clientmobile,$clientinfo) = &decode_user_agent($r);
# ------------------------------------------------------------- Get environment
@@ -15563,7 +14546,6 @@ sub init_user_environment {
"browser.os" => $clientos,
"browser.mobile" => $clientmobile,
"browser.info" => $clientinfo,
- "browser.osversion" => $clientosversion,
"server.domain" => $Apache::lonnet::perlvar{'lonDefDomain'},
"request.course.fn" => '',
"request.course.uri" => '',
@@ -15589,44 +14571,36 @@ sub init_user_environment {
$env{'user.noloadbalance'} = $lonhost;
}
- if ($form->{'noloadbalance'}) {
- my @hosts = &Apache::lonnet::current_machine_ids();
- my $hosthere = $form->{'noloadbalance'};
- if (grep(/^\Q$hosthere\E$/,@hosts)) {
- $initial_env{"user.noloadbalance"} = $hosthere;
- $env{'user.noloadbalance'} = $hosthere;
- }
- }
-
+ my %is_adv = ( is_adv => $env{'user.adv'} );
+ my %domdef;
unless ($domain eq 'public') {
- my %is_adv = ( is_adv => $env{'user.adv'} );
- my %domdef = &Apache::lonnet::get_domain_defaults($domain);
-
- foreach my $tool ('aboutme','blog','webdav','portfolio') {
- $userenv{'availabletools.'.$tool} =
- &Apache::lonnet::usertools_access($username,$domain,$tool,'reload',
- undef,\%userenv,\%domdef,\%is_adv);
- }
+ %domdef = &Apache::lonnet::get_domain_defaults($domain);
+ }
- foreach my $crstype ('official','unofficial','community','textbook') {
- $userenv{'canrequest.'.$crstype} =
- &Apache::lonnet::usertools_access($username,$domain,$crstype,
- 'reload','requestcourses',
- \%userenv,\%domdef,\%is_adv);
- }
+ foreach my $tool ('aboutme','blog','webdav','portfolio') {
+ $userenv{'availabletools.'.$tool} =
+ &Apache::lonnet::usertools_access($username,$domain,$tool,'reload',
+ undef,\%userenv,\%domdef,\%is_adv);
+ }
- $userenv{'canrequest.author'} =
- &Apache::lonnet::usertools_access($username,$domain,'requestauthor',
- 'reload','requestauthor',
+ foreach my $crstype ('official','unofficial','community','textbook') {
+ $userenv{'canrequest.'.$crstype} =
+ &Apache::lonnet::usertools_access($username,$domain,$crstype,
+ 'reload','requestcourses',
\%userenv,\%domdef,\%is_adv);
- my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
- $domain,$username);
- my $reqstatus = $reqauthor{'author_status'};
- if ($reqstatus eq 'approval' || $reqstatus eq 'approved') {
- if (ref($reqauthor{'author'}) eq 'HASH') {
- $userenv{'requestauthorqueued'} = $reqstatus.':'.
- $reqauthor{'author'}{'timestamp'};
- }
+ }
+
+ $userenv{'canrequest.author'} =
+ &Apache::lonnet::usertools_access($username,$domain,'requestauthor',
+ 'reload','requestauthor',
+ \%userenv,\%domdef,\%is_adv);
+ my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
+ $domain,$username);
+ my $reqstatus = $reqauthor{'author_status'};
+ if ($reqstatus eq 'approval' || $reqstatus eq 'approved') {
+ if (ref($reqauthor{'author'}) eq 'HASH') {
+ $userenv{'requestauthorqueued'} = $reqstatus.':'.
+ $reqauthor{'author'}{'timestamp'};
}
}
@@ -15727,18 +14701,16 @@ sub clean_symb {
=item * &build_filters()
Create markup for a table used to set filters to use when selecting
-courses in a domain. Used by lonpickcourse.pm, lonmodifycourse.pm
-and quotacheck.pl
-
+courses in a domain. Used by lonpickcourse.pm and lonmodifycourse.pm
Inputs:
-filterlist - anonymous array of fields to include as potential filters
+filterlist - anonymous array of fields to include as potential filters
crstype - course type
roleelement - fifth arg in selectcourse_link() populates fifth arg in javascript: opencrsbrowser() function, used
- to pop-open a course selector (will contain "extra element").
+ to pop-open a course selector (will contain "extra element").
multelement - if multiple course selections will be allowed, this will be a hidden form element: name: multiple; value: 1
@@ -15748,25 +14720,25 @@ action - form action
numfiltersref - ref to scalar (count of number of elements in institutional codes -- e.g., 4 for year, semester, department, and number)
-caller - caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm)
+caller - caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm
cloneruname - username of owner of new course who wants to clone
clonerudom - domain of owner of new course who wants to clone
-typeelem - text to use for left column in row containing course type (i.e., Course, Community or Course/Community)
+typeelem - text to use for left column in row containing course type (i.e., Course, Community or Course/Community)
codetitlesref - reference to array of titles of components in institutional codes (official courses)
codedom - domain
-formname - value of form element named "form".
+formname - value of form element named "form".
fixeddom - domain, if fixed.
-prevphase - value to assign to form element named "phase" when going back to the previous screen
+prevphase - value to assign to form element named "phase" when going back to the previous screen
-cnameelement - name of form element in form on opener page which will receive title of selected course
+cnameelement - name of form element in form on opener page which will receive title of selected course
cnumelement - name of form element in form on opener page which will receive courseID of selected course
@@ -15778,10 +14750,8 @@ clonetext - hidden form elements contain
clonewarning - warning message about missing information for intended course owner when DC creates a course
-
Returns: $output - HTML for display of search criteria, and hidden form elements.
-
Side Effects: None
=cut
@@ -15794,7 +14764,7 @@ sub build_filters {
$codetitlesref,$codedom,$formname,$fixeddom,$prevphase,
$cnameelement,$cnumelement,$cdomelement,$setroles,
$clonetext,$clonewarning) = @_;
- my ($list,$jscript);
+ my ($list,$fixeddom,$jscript);
my $onchange = 'javascript:updateFilters(this)';
my ($domainselectform,$sincefilterform,$createdfilterform,
$ownerdomselectform,$persondomselectform,$instcodeform,
@@ -15898,7 +14868,7 @@ sub build_filters {
}
$cloneableonlyform = ' '.&mt('Required').''.(' 'x3).' '.&mt('No restriction').'';
if ($formname eq 'ccrs') {
- $cloneabletitle = &mt('Cloneable for [_1]',$cloneruname.':'.$clonerudom);
+ $cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom;
} else {
$cloneabletitle = &mt('Cloneable by you');
}
@@ -15906,19 +14876,15 @@ sub build_filters {
my $officialjs;
if ($crstype eq 'Course') {
if (exists($filter->{'instcodefilter'})) {
-# if (($fixeddom) || ($formname eq 'requestcrs') ||
-# ($formname eq 'modifycourse') || ($formname eq 'filterpicker')) {
- if ($codedom) {
+ if (($fixeddom) || ($formname eq 'requestcrs')
+ || ($formname eq 'modifycourse')) {
$officialjs = 1;
($instcodeform,$jscript,$$numtitlesref) =
&Apache::courseclassifier::instcode_selectors($codedom,'filterpicker',
$officialjs,$codetitlesref);
if ($jscript) {
- $jscript = ''."\n";
+ $jscript = ''."\n";
}
}
if ($instcodeform eq '') {
@@ -15942,11 +14908,6 @@ sub build_filters {
$output .= ''."\n".
''."\n";
- } elsif ($formname eq 'quotacheck') {
- $output .= qq|
-
-
-|;
} else {
my $name_input;
if ($cnameelement ne '') {
@@ -15954,8 +14915,8 @@ sub build_filters {
$cnameelement.'" />';
}
$output .= qq|
-
-
+
+
$name_input
$roleelement
$multelement
@@ -16037,11 +14998,11 @@ $typeelement
return $jscript.$clonewarning.$output;
}
-=pod
+=pod
=item * &timebased_select_form()
-Create markup for a dropdown list used to select a time-based
+Create markup for an option response item used to select a time-based
filter e.g., Course Activity, Course Created, when searching for courses
or communities
@@ -16052,7 +15013,7 @@ item - name of form element (sincefilter
filter - anonymous hash of criteria and their values
Returns: HTML for a select box contained a blank, then six time selections,
- with value set in incoming form variables currently selected.
+ with value set in incoming form variables currently selected.
Side Effects: None
@@ -16084,12 +15045,11 @@ sub timebased_select_form {
=item * &js_changer()
Create script tag containing Javascript used to submit course search form
-when course type or domain is changed, and also to hide 'Searching ...' on
-page load completion for page showing search result.
+when course type or domain is changed.
Inputs: None
-Returns: markup containing updateFilters() and hideSearching() javascript functions.
+Returns: markup containing updateFilters() javascript function.
Side Effects: None
@@ -16105,14 +15065,6 @@ function updateFilters(caller) {
}
document.filterpicker.submit();
}
-
-function hideSearching() {
- if (document.getElementById('searching')) {
- document.getElementById('searching').style.display = 'none';
- }
- return;
-}
-
// ]]>
@@ -16121,336 +15073,39 @@ ENDJS
=pod
-=item * &search_courses()
-
-Process selected filters form course search form and pass to lonnet::courseiddump
-to retrieve a hash for which keys are courseIDs which match the selected filters.
-
-Inputs:
-
-dom - domain being searched
-
-type - course type ('Course' or 'Community' or '.' if any).
-
-filter - anonymous hash of criteria and their values
-
-numtitles - for institutional codes - number of categories
-
-cloneruname - optional username of new course owner
-
-clonerudom - optional domain of new course owner
-
-domcloner - optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by,
- (used when DC is using course creation form)
-
-codetitles - reference to array of titles of components in institutional codes (official courses).
-
-cc_clone - escaped comma separated list of courses for which course cloner has active CC role
- (and so can clone automatically)
-
-reqcrsdom - domain of new course, where search_courses is used to identify potential courses to clone
-
-reqinstcode - institutional code of new course, where search_courses is used to identify potential
- courses to clone
-
-Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type.
-
-
-Side Effects: None
-
-=cut
-
-
-sub search_courses {
- my ($dom,$type,$filter,$numtitles,$cloneruname,$clonerudom,$domcloner,$codetitles,
- $cc_clone,$reqcrsdom,$reqinstcode) = @_;
- my (%courses,%showcourses,$cloner);
- if (($filter->{'ownerfilter'} ne '') ||
- ($filter->{'ownerdomfilter'} ne '')) {
- $filter->{'combownerfilter'} = $filter->{'ownerfilter'}.':'.
- $filter->{'ownerdomfilter'};
- }
- foreach my $item ('descriptfilter','coursefilter','combownerfilter') {
- if (!$filter->{$item}) {
- $filter->{$item}='.';
- }
- }
- my $now = time;
- my $timefilter =
- ($filter->{'sincefilter'}==-1?1:$now-$filter->{'sincefilter'});
- my ($createdbefore,$createdafter);
- if (($filter->{'createdfilter'} ne '') && ($filter->{'createdfilter'} !=-1)) {
- $createdbefore = $now;
- $createdafter = $now-$filter->{'createdfilter'};
- }
- my ($instcodefilter,$regexpok);
- if ($numtitles) {
- if ($env{'form.official'} eq 'on') {
- $instcodefilter =
- &Apache::courseclassifier::instcode_search_str($dom,$numtitles,$codetitles);
- $regexpok = 1;
- } elsif ($env{'form.official'} eq 'off') {
- $instcodefilter = &Apache::courseclassifier::instcode_search_str($dom,$numtitles,$codetitles);
- unless ($instcodefilter eq '') {
- $regexpok = -1;
- }
- }
- } else {
- $instcodefilter = $filter->{'instcodefilter'};
- }
- if ($instcodefilter eq '') { $instcodefilter = '.'; }
- if ($type eq '') { $type = '.'; }
-
- if (($clonerudom ne '') && ($cloneruname ne '')) {
- $cloner = $cloneruname.':'.$clonerudom;
- }
- %courses = &Apache::lonnet::courseiddump($dom,
- $filter->{'descriptfilter'},
- $timefilter,
- $instcodefilter,
- $filter->{'combownerfilter'},
- $filter->{'coursefilter'},
- undef,undef,$type,$regexpok,undef,undef,
- undef,undef,$cloner,$cc_clone,
- $filter->{'cloneableonly'},
- $createdbefore,$createdafter,undef,
- $domcloner,undef,$reqcrsdom,$reqinstcode);
- if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) {
- my $ccrole;
- if ($type eq 'Community') {
- $ccrole = 'co';
- } else {
- $ccrole = 'cc';
- }
- my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'},
- $filter->{'persondomfilter'},
- 'userroles',undef,
- [$ccrole,'in','ad','ep','ta','cr'],
- $dom);
- foreach my $role (keys(%rolehash)) {
- my ($cnum,$cdom,$courserole) = split(':',$role);
- my $cid = $cdom.'_'.$cnum;
- if (exists($courses{$cid})) {
- if (ref($courses{$cid}) eq 'HASH') {
- if (ref($courses{$cid}{roles}) eq 'ARRAY') {
- if (!grep(/^\Q$courserole\E$/,@{$courses{$cid}{roles}})) {
- push(@{$courses{$cid}{roles}},$courserole);
- }
- } else {
- $courses{$cid}{roles} = [$courserole];
- }
- $showcourses{$cid} = $courses{$cid};
- }
- }
- }
- %courses = %showcourses;
- }
- return %courses;
-}
-
-=pod
-
=back
-=head1 Routines for version requirements for current course.
-
-=over 4
-
-=item * &check_release_required()
-
-Compares required LON-CAPA version with version on server, and
-if required version is newer looks for a server with the required version.
-
-Looks first at servers in user's owen domain; if none suitable, looks at
-servers in course's domain are permitted to host sessions for user's domain.
-
-Inputs:
-
-$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp)
-
-$courseid - Course ID of current course
-
-$rolecode - User's current role in course (for switchserver query string).
-
-$required - LON-CAPA version needed by course (format: Major.Minor).
-
-
-Returns:
-
-$switchserver - query string tp append to /adm/switchserver call (if
- current server's LON-CAPA version is too old.
-
-$warning - Message is displayed if no suitable server could be found.
-
=cut
-sub check_release_required {
- my ($loncaparev,$courseid,$rolecode,$required) = @_;
- my ($switchserver,$warning);
- if ($required ne '') {
- my ($reqdmajor,$reqdminor) = ($required =~ /^(\d+)\.(\d+)$/);
- my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
- if ($reqdmajor ne '' && $reqdminor ne '') {
- my $otherserver;
- if (($major eq '' && $minor eq '') ||
- (($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)))) {
- my ($userdomserver) = &Apache::lonnet::choose_server($env{'user.domain'},undef,$required,1);
- my $switchlcrev =
- &Apache::lonnet::get_server_loncaparev($env{'user.domain'},
- $userdomserver);
- my ($swmajor,$swminor) = ($switchlcrev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
- if (($swmajor eq '' && $swminor eq '') || ($reqdmajor > $swmajor) ||
- (($reqdmajor == $swmajor) && ($reqdminor > $swminor))) {
- my $cdom = $env{'course.'.$courseid.'.domain'};
- if ($cdom ne $env{'user.domain'}) {
- my ($coursedomserver,$coursehostname) = &Apache::lonnet::choose_server($cdom,undef,$required,1);
- my $serverhomeID = &Apache::lonnet::get_server_homeID($coursehostname);
- my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
- my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
- my %udomdefaults = &Apache::lonnet::get_domain_defaults($env{'user.domain'});
- my $remoterev = &Apache::lonnet::get_server_loncaparev($serverhomedom,$coursedomserver);
- my $canhost =
- &Apache::lonnet::can_host_session($env{'user.domain'},
- $coursedomserver,
- $remoterev,
- $udomdefaults{'remotesessions'},
- $defdomdefaults{'hostedsessions'});
- if ($canhost) {
- $otherserver = $coursedomserver;
- } else {
- $warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).' '. &mt("No suitable server could be found amongst servers in either your own domain or in the course's domain.");
- }
- } else {
- $warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).' '.&mt("No suitable server could be found amongst servers in your own domain (which is also the course's domain).");
- }
- } else {
- $otherserver = $userdomserver;
+sub build_release_hashes {
+ my ($checkparms,$checkresponsetypes,$checkcrstypes,$anonsurvey,$randomizetry) = @_;
+ return unless((ref($checkparms) eq 'HASH') && (ref($checkresponsetypes) eq 'HASH') &&
+ (ref($checkcrstypes) eq 'HASH') && (ref($anonsurvey) eq 'HASH') &&
+ (ref($randomizetry) eq 'HASH'));
+ foreach my $key (keys(%Apache::lonnet::needsrelease)) {
+ my ($item,$name,$value) = split(/:/,$key);
+ if ($item eq 'parameter') {
+ if (ref($checkparms->{$name}) eq 'ARRAY') {
+ unless(grep(/^\Q$name\E$/,@{$checkparms->{$name}})) {
+ push(@{$checkparms->{$name}},$value);
}
+ } else {
+ push(@{$checkparms->{$name}},$value);
}
- if ($otherserver ne '') {
- $switchserver = 'otherserver='.$otherserver.'&role='.$rolecode;
+ } elsif ($item eq 'resourcetag') {
+ if ($name eq 'responsetype') {
+ $checkresponsetypes->{$value} = $Apache::lonnet::needsrelease{$key}
}
- }
- }
- return ($switchserver,$warning);
-}
-
-=pod
-
-=item * &check_release_result()
-
-Inputs:
-
-$switchwarning - Warning message if no suitable server found to host session.
-
-$switchserver - query string to append to /adm/switchserver containing lonHostID
- and current role.
-
-Returns: HTML to display with information about requirement to switch server.
- Either displaying warning with link to Roles/Courses screen or
- display link to switchserver.
-
-=cut
-
-sub check_release_result {
- my ($switchwarning,$switchserver) = @_;
- my $output = &start_page('Selected course unavailable on this server').
- '