--- loncom/interface/loncreatecourse.pm 2006/08/11 22:11:21 1.93.2.5 +++ loncom/interface/loncreatecourse.pm 2009/10/02 18:31:36 1.128 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.93.2.5 2006/08/11 22:11:21 albertel Exp $ +# $Id: loncreatecourse.pm,v 1.128 2009/10/02 18:31:36 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,16 +27,61 @@ # ### +=head1 NAME + +Apache::loncreatecourse.pm + +=head1 SYNOPSIS + +Allows domain coordinators to create new +courses and assign course coordinators. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item handler() + +=item print_course_creation_page() + +=item create_course() + +=item print_intro_page() + +=item upload_batchfile() + +=item process_batchfile() + +=item courserequestbrowser_javascript() + +=item print_creation_logs() + +=item creation_display_filter() + +=item course_types() + +=item context_names() + +=item instcode_srchstr() + +=item syllabuslink_javascript() + +=back + +=cut + package Apache::loncreatecourse; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon; -use Apache::lonratedt; use Apache::londocs; use Apache::lonlocal; -use Apache::londropadd; +use Apache::lonuserutils; use Apache::lonclonecourse; use LONCAPA::batchcreatecourse; use LONCAPA; @@ -45,13 +90,12 @@ use LONCAPA; sub print_course_creation_page { my $r=shift; - my $crstype = 'Course'; -# my $crstype = 'Group'; -# if ($env{'form.phase'} eq 'courseone') { -# $crstype = 'Course'; -# } + my $crstype = 'Community'; + if ($env{'form.phase'} eq 'courseone') { + $crstype = 'Course'; + } my $defdom=$env{'request.role.domain'}; - my %host_servers = &Apache::loncommon::get_library_servers($defdom); + my %host_servers = &Apache::lonnet::get_servers($defdom,'library'); my $course_home = '<select name="course_home" size="1">'."\n"; foreach my $server (sort(keys(%host_servers))) { $course_home .= qq{<option value="$server"}; @@ -72,13 +116,13 @@ sub print_course_creation_page { if ($crstype eq 'Course') { my $starttime = time; my $endtime = time+(6*30*24*60*60); # 6 months from now, approx - $enroll_table = &Apache::londropadd::date_setting_table($starttime, - $endtime,'create_enrolldates'); - $access_table = &Apache::londropadd::date_setting_table($starttime, - $endtime,'create_defaultdates'); + $enroll_table = &Apache::lonuserutils::date_setting_table($starttime, + $endtime,'create_enrolldates'); + $access_table = &Apache::lonuserutils::date_setting_table($starttime, + $endtime,'create_defaultdates'); ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($defdom); - $javascript_validations=&Apache::londropadd::javascript_validations( + $javascript_validations=&Apache::lonuserutils::javascript_validations( 'createcourse',$krbdefdom); my %param = ( formname => 'document.ccrs', kerb_def_dom => $krbdefdom, @@ -88,14 +132,16 @@ sub print_course_creation_page { $intform = &Apache::loncommon::authform_internal(%param); $locform = &Apache::loncommon::authform_local(%param); } else { + my $title_alert = &mt('A Community title is required'); + my $coord_alert = &mt('The username of the Coordinator is required'); $javascript_validations = qq| function validate(formname) { if (formname.title == '') { - alert("A group title is required"); + alert("$title_alert"); return; } if (formname.ccuname == '') { - alert("The username of the group coordinator is required"); + alert("$coord_alert"); } formname.submit(); } @@ -126,10 +172,14 @@ function validate(formname) { 'stco' => "standard courses only", 'blnk' => "Blank", 'sllb' => "Syllabus", - 'navi' => "Navigate", + 'navi' => "Navigate Contents", 'cid' => "Course ID", 'dmn' => "Domain", + 'dsh' => "Date Shift", 'asov' => "Additional settings, if specified below, will override cloned settings", + 'ncd' => "Do not clone date parameters", + 'prd' => 'Clone date parameters as-is', + 'shd' => 'Shift date parameters by number of days', 'assp' => "Assessment Parameters", 'oaas' => "Open all assessments", 'mssg' => "Messaging", @@ -137,12 +187,13 @@ function validate(formname) { 'scfc' => "Set content feedback to Course Coordinator", 'cmmn' => "Communication", 'dsrd' => "Disable student resource discussion", - 'dsuc' => "Disable student use of chatrooms", + 'dsuc' => "Disable student use of chat rooms", 'acco' => "Access Control", 'snak' => "Students need access key to enter course", 'kaut' => 'Key authority (<tt>id@domain</tt>) if other than course', - 'cc' => "Course Coordinator", + 'ow' => "Course Owner", + 'cc' => "(will be assigned Course Coordinator role)", 'user' => "Username", 'aens' => "Automated enrollment settings", 'aesc' => "The following settings control automatic enrollment of students in this class based on information available for this specific course from your institution's official classlists.", @@ -151,8 +202,9 @@ function validate(formname) { 'no' => "No", 'audr' => "Automated drops", 'dacu' => "Duration of automated classlist updates", + 'dads' => 'Default Access Dates for Students', 'dacc' => "Default start and end dates for student access", - 'psam' => "Please select the authentication mechanism", + 'psam' => "Please select the Authentication mechanism", 'pcda' => "Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process", 'nech' => "Notification of enrollment changes", 'nccl' => "Notification to course coordinator via LON-CAPA message when enrollment changes occur during the automated update?", @@ -160,29 +212,30 @@ function validate(formname) { 'irsp' => "Include retrieval of student photographs?", 'rshm' => 'Resource Space Home', 'cgrs' => "Course Group Settings", - 'cgrq' => "Set a quota for the total disk space available for storage of course group portfolio files.", + 'cgrq' => 'Set a quota for the total disk space available for storage of course group portfolio files', 'opco' => "Open Course", - 'ginf' => "Group Information", - 'gtit' => "Group Title", - 'ghsr' => "Group Home Server", - 'gidn' => "Group ID/Number", - 'grco' => "Group Content", - 'cngr' => "Completely new group", - 'cegr' => "Clone an existing group", - 'sagr' => "Do NOT generate as standard group", - 'stgo' => "standard groups only", - 'sgpf' => "Set group policy feedback to Group Coordinator", - 'scfg' => "Set content feedback to Group Coordinator", + 'ginf' => "Community Information", + 'gtit' => "Community Title", + 'ghsr' => "Community Home Server", + 'gidn' => "Community ID/Number", + 'grco' => "Community Content", + 'cngr' => "Completely new community", + 'cegr' => "Clone an existing community", + 'sagr' => "Do NOT generate as standard community", + 'stgo' => "standard communities only", + 'sgpf' => "Set community policy feedback to Coordinator", + 'scfg' => "Set content feedback to Coordinator", 'dmrd' => "Disable member resource discussion", - 'dmuc' => "Disable member use of chatrooms", - 'mnak' => "Members need access key to enter group", + 'dmuc' => "Disable member use of chat rooms", + 'mnak' => "Members need access key to enter community", 'kaug' => - 'Key authority (<tt>id@domain</tt>) if other than group', - 'gc' => "Group Coordinator", - 'gid' => "Group ID", - 'crgr' => "Create Group", - 'grts' => "Group Teams Settings", - 'grtq' => "Set a quota for the total disk space available for storage of group team portfolio files.", + 'Key authority (<tt>id@domain</tt>) if other than community', + 'co' => "Community Owner", + 'gc' => "(will be assigned Coordinator role)", + 'gid' => "Community ID", + 'crgr' => "Create Community", + 'grts' => "Community Group Settings", + 'grtq' => "Set a quota for the total disk space available for storage of community group portfolio files.", ); my $js = <<END; @@ -211,7 +264,7 @@ END my %titles = &Apache::lonlocal::texthash( courseone => 'Create a New Course', - groupone => 'Create a New Group', + groupone => 'Create a New Community', ); my $start_page = &Apache::loncommon::start_page($titles{$env{'form.phase'}},$js); @@ -222,201 +275,265 @@ END 'Create_Course',undef, 'Create_Courses'); $r->print($start_page.$crumbs); + if ($crstype eq 'Course') { + $r->print('<form action="/adm/createcourse" method="post" name="ccrs"><div class="LC_createcourse">' + .&Apache::lonhtmlcommon::start_pick_box() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'ow'}.' '.$lt{'cc'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'user'}) + .'<input type="text" size="15" name="ccuname" />' + .&Apache::loncommon::studentbrowser_javascript() + .&Apache::loncommon::selectstudent_link('ccrs','ccuname','ccdomain') + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dmn'},"","LC_odd_row_value") + .$domform + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'cinf'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'ctit'}) + .'<input type="text" size="50" name="title" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'chsr'}) + .$course_home + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cidn'}.' ('.$lt{'opt'}.')') + .'<input type="text" size="30" name="crsid" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'iinf'}.'</h3>' + .$lt{'stat'} + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'ccod'}) + .'<input type="text" size="30" name="crscode" />' + .'<br />('.$lt{'toin'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snid'}) + .'<input type="text" size="30" name="crssections" />' + .'<br />('.$lt{'csli'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'crcs'}) + .'<input type="text" size="30" name="crsxlist" />' + .'<br />('.$lt{'cscs'}.')' + .&Apache::lonhtmlcommon::row_closure() + ); + + # Table: New Course / Clone Course + $r->print(&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'crco'}.'</h3>' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th>'.$lt{'cncr'}.'</th>' + .'<th> '.&mt('or').' </th>' + .'<th>'.$lt{'cecr'}.'</th>' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + + # New Course: + .'<td>' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'map'}) + .'<input type="text" size="50" name="topmap" />' + .'<a href="javascript:openbrowser(\'ccrs\',\'topmap\')">'.$lt{'smap'}.'</a>' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('<label for="nonstd">'.$lt{'sacr'}.'</label>') + .'<input id="nonstd" type="checkbox" name="nonstandard" />' + .'<br />('.$lt{'ocik'}.')' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'fres'}) + .'<label>' + .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'} + .'</label>' + .' ' + .'<label>' + .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'} + .'</label>' + .' ' + .'<label>' + .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'} + .'</label>' + .'<br />('.$lt{'stco'}.')' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + + .'<td> </td>' + + # Clone Course: + .'<td>' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'cid'}) + .'<label>' + .'<input type="text" size="25" name="clonecourse" value="" />' + .'</label>' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::row_title($lt{'dmn'}) + .'<label>' + .$cloneform + .'</label>' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'dsh'}) + .'<label>' + .'<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'} + .'</label><br />' + .'<label>' + .'<input type="radio" name="datemode" value="preserve" /> '.$lt{'prd'} + .'</label><br />' + .'<label>' + .'<input type="radio" name="datemode" value="shift" checked="checked" /> '.$lt{'shd'} + .'</label>' + .' <input type="text" size="5" name="dateshift" value="365" />' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_headline() + .$lt{'asov'} + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + .'</td>' + .&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table() + .&Apache::lonhtmlcommon::row_closure() + ); + + $r->print(&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'dads'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'dacc'}) + .$access_table + .&Apache::lonhtmlcommon::row_closure() + ); + + $r->print(&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'assp'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'oaas'}) + .'<input type="checkbox" name="openall" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'mssg'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scpf'}) + .'<input type="checkbox" name="setpolicy" checked="checked" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scfc'}) + .'<input type="checkbox" name="setcontent" checked="checked" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'cmmn'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsrd'}) + .'<input type="checkbox" name="disresdis" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsuc'}) + .'<input type="checkbox" name="disablechat" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'acco'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snak'}) + .'<input type="checkbox" name="setkeys" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'kaut'}) + .'<input type="text" size="30" name="keyauth" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'rshm'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'rshm'}) + .'<input type="text" name="reshome" size="30" value="/res/'.$defdom.'/" />' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'aens'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'aadd'}) + .'<label><input type="radio" name="autoadds" value="1" />'.$lt{'yes'}.'</label>' + .'<label><input type="radio" name="autoadds" value="0" checked="checked" />'.$lt{'no'}.'</label>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'audr'}) + .'<label><input type="radio" name="autodrops" value="1" />'.$lt{'yes'}.'</label>' + .'<label><input type="radio" name="autodrops" value="0" checked="checked" />'.$lt{'no'}.'</label>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dacu'}) + .$enroll_table + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'psam'}) + .$lt{'pcda'}.'<br />' + .$krbform.'<br />' + .$intform.'<br />' + .$locform + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'nech'}) + .$lt{'nccl'}.'<br/>' + .'<label><input type="radio" name="notify_owner" value="1" />'.$lt{'yes'}.'</label>' + .'<label><input type="radio" name="notify_owner" value="0" checked="checked" />'.$lt{'no'}.'</label>' + .'<br />' + .$lt{'ndcl'}.'<br/>' + .'<label><input type="radio" name="notify_dc" value="1" />'.$lt{'yes'}.'</label>' + .'<label><input type="radio" name="notify_dc" value="0" checked="checked" />'.$lt{'no'}.'</label>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'irsp'}) + .'<label>' + .'<input type="radio" name="showphotos" value="1" />'.$lt{'yes'} + .'</label> ' + .'<label>' + .'<input type="radio" name="showphotos" value="0" checked="checked" />'.$lt{'no'} + .'</label> ' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'<h3>'.$lt{'cgrs'}.'</h3>' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cgrq'}) + .'<input type="text" name="crsquota" value="20" size="6" />Mb' + .&Apache::lonhtmlcommon::row_closure(1) + + .&Apache::lonhtmlcommon::end_pick_box() + ); $r->print(<<ENDDOCUMENT); -<form action="/adm/createcourse" method="post" name="ccrs"> -<h2>$lt{'cinf'}</h2> -<p> -<label><b>$lt{'ctit'}:</b> -<input type="text" size="50" name="title" /></label> -</p><p> -<label> - <b>$lt{'chsr'}:</b>$course_home -</label> -</p><p> -<label> - <b>$lt{'cidn'} ($lt{'opt'})</b> - <input type="text" size="30" name="crsid" /> -</label> -</p><p> -<h2>$lt{'iinf'}</h2> -<p> -$lt{'stat'} -</p><p> -<label> - <b>$lt{'ccod'}</b> - <input type="text" size="30" name="crscode" /> -</label> -<br/> -($lt{'toin'}) -</p><p> -<label> - <b>$lt{'snid'}</b> - <input type="text" size="30" name="crssections" /> -</label> -<br/> -($lt{'csli'}) -</p><p> -<label> - <b>$lt{'crcs'}</b> - <input type="text" size="30" name="crsxlist" /> -</label> -<br/> -($lt{'cscs'}) -</p> -<h2>$lt{'crco'}</h2> -<table border="2"> -<tr><th>$lt{'cncr'}</th><th>$lt{'cecr'}</th></tr> -<tr><td> -<p> -<label> - <b>$lt{'map'}:</b> - <input type="text" size="50" name="topmap" /> -</label> -<a href="javascript:openbrowser('ccrs','topmap')">$lt{'smap'}</a> -</p><p> -<label for="nonstd"><b>$lt{'sacr'}</b></label> -<br /> -($lt{'ocik'}): -<input id="nonstd" type="checkbox" name="nonstandard" /> -</p><p> -<b>$lt{'fres'}</b><br />($lt{'stco'}): -<label> - <input type="radio" name="firstres" value="blank" />$lt{'blnk'} -</label> - -<label> - <input type="radio" name="firstres" value="syl" checked />$lt{'sllb'} -</label> - -<label> - <input type="radio" name="firstres" value="nav" />$lt{'navi'} -</label> -</p> -</td><td> -<label> - $lt{'cid'}: <input type="text" size="25" name="clonecourse" value="" /> -</label> -<br /> -<label> - $lt{'dmn'}: $cloneform -</label> -<br /> - <br /> -$lt{'asov'}. -</td></tr> -</table> -<h2>$lt{'assp'}</h2> -<p> -<label> - <b>$lt{'oaas'}: </b> - <input type="checkbox" name="openall" /> -</label> -</p> -<h2>$lt{'mssg'}</h2> -<p> -<label> - <b>$lt{'scpf'}: </b> - <input type="checkbox" name="setpolicy" checked /> -</label> -<br /> -<label> - <b>$lt{'scfc'}: </b> - <input type="checkbox" name="setcontent" checked /> -</label> -</p> -<h2>$lt{'cmmn'}</h2> -<p> -<label> - <b>$lt{'dsrd'}: </b> - <input type="checkbox" name="disresdis" /> -</label> -<br /> -<label> - <b>$lt{'dsuc'}: </b> - <input type="checkbox" name="disablechat" /> -</label> -</p> -<h2>$lt{'acco'}</h2> -<p> -<label> - <b>$lt{'snak'}: </b> - <input type="checkbox" name="setkeys" /> -</label> -<br /> -<label> - <b>$lt{'kaut'}: </b> - <input type="text" size="30" name="keyauth" /> -</label> -</p> -<h2>$lt{'rshm'}</h2> -<p> -<label> - <b>$lt{'rshm'}: </b> - <input type="text" name="reshome" size="30" value="/res/$defdom/" /> -</label> -</p> -<p> -<h2>$lt{'aens'}</h2> -$lt{'aesc'} -</p> -<p> -<b>$lt{'aadd'}</b> -<label><input type="radio" name="autoadds" value="1" />$lt{'yes'}</label> -<label><input type="radio" name="autoadds" value="0" checked="true" />$lt{'no'} -</label> -</p><p> -<b>$lt{'audr'}</b> -<label><input type="radio" name="autodrops" value="1" />$lt{'yes'}</label> -<label><input type="radio" name="autodrops" value="0" checked="true" />$lt{'no'}</label> -</p><p> -<b>$lt{'dacu'}</b> -$enroll_table -</p><p> -<b>$lt{'dacc'}</b> -$access_table -<p></p> -<b>$lt{'psam'}.</b><br /> -$lt{'pcda'}. -</p><p> -$krbform -<br /> -$intform -<br /> -$locform -</p><p> -<b>$lt{'nech'}</b><br /> -$lt{'nccl'}<br/> -<label> - <input type="radio" name="notify_owner" value="1" />$lt{'yes'} -</label> -<label> - <input type="radio" name="notify_owner" value="0" checked="true" />$lt{'no'} -</label> -<br /> -$lt{'ndcl'}<br/> -<label> - <input type="radio" name="notify_dc" value="1" />$lt{'yes'} -</label> -<label> - <input type="radio" name="notify_dc" value="0" checked="true" />$lt{'no'} -</label> -</p><p> -<b>$lt{'irsp'}</b> -<label> - <input type="radio" name="showphotos" value="1" />$lt{'yes'} -</label> -<label> - <input type="radio" name="showphotos" value="0" checked="true" />$lt{'no'} -</label> -</p> +</div> <p> -<h2>$lt{'cgrs'}</h2> -$lt{'cgrq'} -<input type="text" name="crsquota" value="20" size="6" />Mb +<input type="hidden" name="prevphase" value="courseone" /> +<input type="hidden" name="phase" value="coursetwo" /> +<input type="button" onClick="verify_message(this.form)" value="$lt{'opco'}" /> </p> -<hr /> -<h2>$lt{'cc'}</h2> +</form> +ENDDOCUMENT + + } elsif ($crstype eq 'Community') { + $r->print(<<ENDDOCUMENT); +<form action="/adm/createcourse" method="post" name="ccrs"> +<h2>$lt{'co'} $lt{'gc'}</h2> <p> <label> <b>$lt{'user'}:</b> <input type="text" size="15" name="ccuname" /> @@ -426,16 +543,6 @@ $lt{'cgrq'} <b>$lt{'dmn'}:</b> $domform </label> </p> -<p> -<input type="hidden" name="prevphase" value="courseone" /> -<input type="hidden" name="phase" value="coursetwo" /> -<input type="button" onClick="verify_message(this.form)" value="$lt{'opco'}" /> -</p> -</form> -ENDDOCUMENT - } elsif ($crstype eq 'Group') { - $r->print(<<ENDDOCUMENT); -<form action="/adm/createcourse" method="post" name="ccrs"> <h2>$lt{'ginf'}</h2> <p> <label><b>$lt{'gtit'}:</b> @@ -472,7 +579,7 @@ ENDDOCUMENT </label> <label> - <input type="radio" name="firstres" value="syl" checked />$lt{'sllb'} + <input type="radio" name="firstres" value="syl" checked="checked" />$lt{'sllb'} </label> <label> @@ -488,7 +595,10 @@ ENDDOCUMENT $lt{'dmn'}: $cloneform </label> <br /> - <br /> + <label><input type="radio" name="datemode" value="delete" /> $lt{'ncd'}</label><br /> + <label><input type="radio" name="datemode" value="preserve" /> $lt{'prd'}</label><br /> + <label><input type="radio" name="datemode" value="shift" checked="checked" /> $lt{'shd'}</label> + <input type="text" size="5" name="dateshift" value="365" /><br /> <br /> $lt{'asov'}. </td></tr> </table> @@ -498,12 +608,12 @@ $lt{'asov'}. <p> <label> <b>$lt{'sgpf'}: </b> - <input type="checkbox" name="setpolicy" checked /> + <input type="checkbox" name="setpolicy" checked="checked" /> </label> <br /> <label> <b>$lt{'scfg'}: </b> - <input type="checkbox" name="setcontent" checked /> + <input type="checkbox" name="setcontent" checked="checked" /> </label> </p> <h2>$lt{'cmmn'}</h2> @@ -537,22 +647,12 @@ $lt{'asov'}. <input type="text" name="reshome" size="30" value="/res/$defdom/" /> </label> </p> -<p> <h2>$lt{'grts'}</h2> +<p> $lt{'grtq'} <input type="text" name="crsquota" value="20" />Mb </p> <hr /> -<h2>$lt{'gc'}</h2> -<p> -<label> - <b>$lt{'user'}:</b> <input type="text" size="15" name="ccuname" /> -</label> -</p><p> -<label> - <b>$lt{'dmn'}:</b> $domform -</label> -</p> <p> <input type="hidden" name="prevphase" value="groupone" /> <input type="hidden" name="phase" value="grouptwo" /> @@ -568,18 +668,15 @@ ENDDOCUMENT sub create_course { my $r=shift; - my $ccuname=$env{'form.ccuname'}; - my $ccdomain=$env{'form.ccdomain'}; - $ccuname=~s/\W//g; - $ccdomain=~s/\W//g; - my $crstype = 'Group'; + my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'}); + my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); + my $crstype = 'Community'; my ($enrollstart,$enrollend,$startaccess,$endaccess); if ($env{'form.phase'} eq 'coursetwo') { $crstype='Course'; $enrollstart=&Apache::lonhtmlcommon::get_date_from_form('startenroll'); $enrollend=&Apache::lonhtmlcommon::get_date_from_form('endenroll'); - } $startaccess = &Apache::lonhtmlcommon::get_date_from_form('startaccess'); $endaccess = &Apache::lonhtmlcommon::get_date_from_form('endaccess'); @@ -621,6 +718,8 @@ sub create_course { crsquota => $env{'form.crsquota'}, clonecourse => $env{'form.clonecourse'}, clonedomain => $env{'form.clonedomain'}, + datemode => $env{'form.datemode'}, + dateshift => $env{'form.dateshift'}, crsid => $env{'form.crsid'}, curruser => $env{'user.name'}.':'.$env{'user.domain'}, crssections => $env{'form.crssections'}, @@ -654,80 +753,103 @@ sub create_course { # Check the veracity of the course coordinator if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') { $r->print('<form action="/adm/createuser" method="post" name="crtuser">'); - $r->print(&mt('No such user').' '.$ccuname.' '.&mt('at').' '.$ccdomain.'.<br />'); - $r->print(&mt("Please click Back on your browser and select another user, or ")); - $r->print(' - <input type="hidden" name="phase" value="get_user_info" /> - <input type="hidden" name="ccuname" value="'.$ccuname.'" /> - <input type="hidden" name="ccdomain" value="'.$ccdomain.'" /> - <input name="userrole" type="submit" value="'. - &mt('Create User').'" /> - </form>'.&Apache::loncommon::end_page()); + $r->print('<div class="LC_warning">' + .&mt('No such user [_1] at domain [_2].','<tt>'.$ccuname.'</tt>','<tt>'.$ccdomain.'</tt>') + .'</div>'); + $r->print(&mt('Please click Back on your browser and select another user, or [_1]Create User[_2]' + , '<input type="hidden" name="phase" value="get_user_info" />' + .'<input type="hidden" name="ccuname" value="'.$ccuname.'" />' + .'<input type="hidden" name="ccdomain" value="'.$ccdomain.'" />' + .'<input name="userrole" type="submit" value="' + , '" />' + ) + .'</form>'.&Apache::loncommon::end_page() + ); return; } # Check the proposed home server for the course - my %host_servers = &Apache::loncommon::get_library_servers - ($env{'request.role.domain'}); + my %host_servers = + &Apache::lonnet::get_servers($env{'request.role.domain'},'library'); if (! exists($host_servers{$env{'form.course_home'}})) { - $r->print(&mt('Invalid home server for course').': '. - $env{'form.course_home'}.&Apache::loncommon::end_page()); + $r->print(&mt('Invalid home server for course: [_1]' + ,$env{'form.course_home'}.&Apache::loncommon::end_page())); return; } my ($courseid,$crsudom,$crsunum); - $r->print(&Apache::loncommon::construct_course($args,\$logmsg,\$courseid,\$crsudom,\$crsunum,$env{'user.domain'},$env{'user.name'})); - -# -# Make the requested user a course coordinator or group coordinator -# - if (($ccdomain) && ($ccuname)) { - $r->print(&mt('Assigning role of [_1] Coordinator to [_2] at [_3]:', - $crstype,$ccuname,$ccdomain). - &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, - 'cc').'<p>'); - } - if ($env{'form.setkeys'}) { - $r->print( - '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">'.&mt('Manage Access Keys').'</a></p>'); - } -# Flush the course logs so reverse user roles immediately updated - &Apache::lonnet::flushcourselogs(); - $r->print('<p>'.&mt('Roles will be active at next login').'.</p>'. - '<p><a href="/adm/createcourse">'. - &mt('Create Another [_1]',$crstype).'</a></p>'. + my ($success,$output) = + &Apache::loncommon::construct_course($args,\$logmsg,\$courseid, + \$crsudom,\$crsunum, + $env{'user.domain'}, + $env{'user.name'},'dc_create'); + $r->print($output); + if ($success) { + # + # Make the requested user a course coordinator or group coordinator + # + if (($ccdomain) && ($ccuname)) { + $r->print(&mt('Assigning role of '.$crstype.' Coordinator to [_1]:', + ,'<i>'.$ccuname.':'.$ccdomain.'</i>') + .&Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, + 'cc','','','','','createcourse').'<p>'); + } + if ($env{'form.setkeys'}) { + $r->print( + '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">'.&mt('Manage Access Keys').'</a></p>'); + } + # Flush the course logs so reverse user roles immediately updated + &Apache::lonnet::flushcourselogs(); + $r->print('<p>'.&mt('Roles will be active at next login').'.</p>'); + } + $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'. + &mt("Create Another $crstype").'</a></p>'. &Apache::loncommon::end_page()); } sub print_intro_page { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course'); + &Apache::loncommon::start_page('Create a New Course or Community'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); - my $helplink=&Apache::loncommon::help_open_topic('Create_Course_GroupSpace',&mt('Help on Creating Courses and Groups')); + my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities')); my @choices = ({ internal_name => 'courseone', name => &mt('Create a single course'), short_description => &mt('Create a new course by completing an online form.'), }, -# { internal_name => 'groupone', -# name => &mt('Create a single collaborative group space '), -# short_description => -# &mt('Create a new group space for non-course use by completing an online form .'), -# }, + { internal_name => 'groupone', + name => &mt('Create a single community'), + short_description => + &mt('Create a new collaborative community by completing an online form.'), + }, { internal_name => 'batchone', - name => &mt('Create courses/groups by uploading an attributes file'), + name => &mt('Create courses/communities by uploading an attributes file'), short_description => - &mt('Upload an attributes file containing specifications for one or more courses or groups in XML format'), + &mt('Upload an attributes file containing specifications for one or more courses or communities in XML format.'), + help => 'Batch_Creation', }, + { internal_name => 'requestdisplay', + name => &mt('Approve or reject course requests'), + short_description => + &mt('Display course creation requests submitted by authorized users, held pending approval by a Domain Coordinator.'), + }, + { internal_name => 'creationlog', + name => &mt('View course creation log'), + short_description => + &mt('Display information about when, how and by whom courses were created in this domain.'), + }, ); my $options; foreach my $choice (@choices) { $options .=' <h3><a href="/adm/createcourse?phase='. $choice->{'internal_name'}.'" >'. - $choice->{'name'}."</a></h3>\n"; - $options .= ' '.(' 'x8).$choice->{'short_description'}. + $choice->{'name'}.'</a>'; + if (exists($choice->{'help'})) { + $options .= &Apache::loncommon::help_open_topic($choice->{'help'}); + } + $options .= "</h3>\n".' '.(' 'x8).$choice->{'short_description'}. "\n"; } @@ -742,18 +864,18 @@ ENDDOCUMENT sub upload_batchfile { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Group Space'); - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course Attributes File','Create_Course',undef,'Create_Courses'); + &Apache::loncommon::start_page('Create a New Course or Community'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community Attributes File','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); $r->print($start_page.$crumbs); - $r->print('<h3>'.&mt('Upload a courses attributes file').'</h3>'); + $r->print('<h3>'.&mt('Upload a courses or communities attributes file').'</h3>'); $r->print('<form name="batchcreate" method="post" '. 'enctype="multipart/form-data" action="/adm/createcourse">'. '<input type="file" name="coursecreatorxml" />'. - '<input type="hidden" name="phase" value="batchtwo"><br /><br />'. + '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'. '<input type="submit" name="batchsubmit" '. - 'value="Create Courses/Groups" /></form>'); + 'value="Create Courses/Communities" /></form>'); $r->print($end_page); return; } @@ -761,7 +883,7 @@ sub upload_batchfile { sub process_batchfile { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Group Space'); + &Apache::loncommon::start_page('Create a New Course or Community'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); @@ -794,10 +916,396 @@ sub process_batchfile { } } } - $r->print($start_page.$crumbs.$result.$end_page); + $r->print($start_page.$crumbs.$logmsg.$result.'<br /><a href="/adm/createcourse">'. + &mt('Creation options menu').'</a>'.$end_page); } +sub courserequestbrowser_javascript { + return <<"ENDREQBRW"; +<script type="text/javascript"> +// <![CDATA[ +var steditbrowser; +function opencoursereqdisplay(cdom,cnum) { + var url = '/adm/requestcourse?action=display'; + url += '&showdom='+cdom+'&cnum='+cnum; + var title = 'Course_Request_Browser'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + var stdeditbrowser = open(url,title,options,'1'); + stdeditbrowser.focus(); +} +// ]]> +</script> +ENDREQBRW +} + +sub print_creation_logs { + my ($r) = @_; + my $formname = 'creationlog'; + my $dom = $env{'request.role.domain'}; + $r->print('<form action="/adm/createcourse" method="post" name="'.$formname.'">'); + # set defaults + my $now = time(); + my $defstart = $now - (7*24*3600); #7 days ago + my %defaults = ( + page => '1', + show => '10', + type => 'any', + context => 'any', + created_before_date => $now, + created_after_date => $defstart, + ); + my ($contexts,$contextnames) = &context_names(); + my $more_records = 0; + my %curr; + foreach my $item ('show','page','type','context') { + $curr{$item} = $env{'form.'.$item}; + } + my $createdafter = &Apache::lonhtmlcommon::get_date_from_form('created_after_date'); + my $createdbefore = &Apache::lonhtmlcommon::get_date_from_form('created_before_date'); + $curr{'created_after_date'} = &Apache::lonhtmlcommon::get_date_from_form('created_after_date'); + $curr{'created_before_date'} = &Apache::lonhtmlcommon::get_date_from_form('created_before_date'); + foreach my $key (keys(%defaults)) { + if ($curr{$key} eq '') { + $curr{$key} = $defaults{$key}; + } + } + my (%whodunit,$version); + ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/); + $r->print(&creation_display_filter($formname,\%curr,$version)); + my $showntablehdr = 0; + my $tablehdr = &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th> </th><th>'.&mt('Creation Date').'</th>'. + '<th>'.&mt('Creator').'</th><th>'.&mt('Description').'</th>'. + '<th>'.&mt('Course Owner(s)').'</th>'; + if (($curr{'type'} eq 'official') || ($curr{'type'} eq 'any')) { + $tablehdr .= '<th>'.&mt('Institutional Code').'</th>'; + } + if ($curr{'type'} eq 'any') { + $tablehdr .= '<th>'.&mt('Course Type').'</th>'; + } + if ($curr{'context'} eq 'any') + $tablehdr .= '<th>'.&mt('Creation Context').'</th>'; + } + $tablehdr .= &Apache::loncommon::end_data_table_header_row(); + my ($minshown,$maxshown); + $minshown = 1; + my $count = 0; + if ($curr{'show'} ne &mt('all')) { + $maxshown = $curr{'page'} * $curr{'show'}; + if ($curr{'page'} > 1) { + $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; + } + } + my $crstype = 'Course'; + if ($curr{'type'} eq 'any') { + $crstype = '.'; + } elsif ($curr{'type'} eq 'community') { + $crstype = 'Community'; + } + + my ($instcodefilter,$regexpok); + my (@codetitles,%cat_titles,%cat_order,%cat_items,$officialjs); + my ($jscript,$totcodes,$numtitles,$lasttitle) = + &Apache::courseclassifier::instcode_selectors_data($dom,$formname, + \%cat_items,\@codetitles,\%cat_titles,\%cat_order, + $officialjs); + if ($numtitles) { + if (($curr{'type'} eq 'official') || ($curr{'type'} eq 'unofficial')) { + $instcodefilter = &instcode_srchstr($dom,$numtitles); + &Apache::courseclassifier::instcode_search_str($dom,$numtitles); + if ($curr{'type'} eq 'official') { + $regexpok = 1; + } else { + unless ($instcodefilter eq '') { + $regexpok = -1; + } + } + } + } + if ($instcodefilter eq '') { $instcodefilter = '.'; } + + my $creationcontext = '.'; + my $context_regexp = join('|',@{$contexts}); + if ($curr{'context'} =~ /^($context_regexp)$/) { + $creationcontext = $curr{'context'}; + } + my %courses = + &Apache::lonnet::courseiddump($dom,'.',1,$instcodefilter,'.','.',undef,undef, + $crstype,$regexpok,undef,undef,'1','creationlog', + undef,undef,undef,$curr{'created_before_date'}, + $curr{'created_after_date'},$creationcontext); + foreach my $cid (sort { $courses{$b}{'created'}<=>$courses{$a}{'created'} } (keys(%courses))) { + $count ++; + next if ($count < $minshown); + if (!$showntablehdr) { + $r->print($tablehdr); + $showntablehdr = 1; + } + if ($courses{$cid}{'creator'} ne '') { + if ($whodunit{$courses{$cid}{'creator'}} eq '') { + my ($uname,$udom) = split(':',$courses{$cid}{'creator'}); + $whodunit{$courses{$cid}{'creator'}} = + &Apache::loncommon::plainname($uname,$udom); + } + } + my $description = $courses{$cid}{'description'}; + my @owners; + my $singleowner = $courses{$cid}{'owner'}; + push(@owners,$singleowner); + if (ref($courses{$cid}{'co-owners'}) eq 'ARRAY') { + foreach my $item (@{$courses{$cid}{'co-owners'}}) { + push(@owners,$item); + } + } + my %ownernames; + foreach my $owner (@owners) { + my ($ownername,$ownerdom); + if ($owner =~ /:/) { + ($ownername,$ownerdom) = split(/:/,$owner); + } else { + $ownername = $owner; + if ($owner ne '') { + $ownerdom = $dom; + } + } + if ($ownername ne '' && $ownerdom ne '') { + unless (ref($ownernames{$ownername.':'.$ownerdom}) eq 'HASH') { + my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom); + $ownernames{$ownername.':'.$ownerdom} = \%namehash; + } + } + } + my @lastnames; + foreach my $owner (keys(%ownernames)) { + if (ref($ownernames{$owner}) eq 'HASH') { + push(@lastnames,$ownernames{$owner}{'lastname'}); + } + } + my $ownerlastnames = join(', ',sort(@lastnames)); + my $showtype; + if ($courses{$cid}{type} eq 'Community') { + $showtype = &mt('community'); + } else { + my $instcode = $courses{$cid}{inst_code}; + if ($instcode ne '') { + $showtype = &mt('official'); + } else { + $showtype = &mt('unofficial'); + } + } + my $showcontext; + + if ($courses{$cid}{context} =~ /^($context_regexp)$/) { + $showcontext = $contextnames->{$courses{$cid}{context}}; + } + my $created = &Apache::lonlocal::locallocaltime($courses{$cid}{'created'}); + my ($cdom,$cnum) = split('_',$cid); + $r->print(&Apache::loncommon::start_data_table_row()."\n". + '<td>'.$count.'</td><td>'.$created.'</td>'."\n". + '<td>'.$whodunit{$courses{$cid}{creator}}.'</td>'."\n". + '<td>'.$description.' <a href="javascript:ToSyllabus('."'$cdom','$cnum'".')">'.&mt('Syllabus').'</a></td><td>'.$ownerlastnames.'</td>'); + if (($curr{'type'} eq 'official') || ($curr{'type'} eq 'any')) { + $r->print('<td>'.$courses{$cid}{'inst_code'}.'</td>'); + } + if ($curr{'type'} eq 'any') { + $r->print('<td>'.$showtype.'</td>'); + } + if ($curr{'context'} eq 'any') { + $r->print('<td>'.$showcontext.'</td>'); + } + $r->print('<td>'.&Apache::loncommon::end_data_table_row()."\n"); + } + if ($showntablehdr) { + $r->print(&Apache::loncommon::end_data_table().'<br />'); + if (($curr{'page'} > 1) || ($more_records)) { + $r->print('<table><tr>'); + if ($curr{'page'} > 1) { + $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>'); + } + if ($more_records) { + $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>'); + } + $r->print('</tr></table>'); + $r->print(<<"ENDSCRIPT"); +<script type="text/javascript"> +// <![CDATA[ +function chgPage(caller) { + if (caller == 'previous') { + document.$formname.page.value --; + } + if (caller == 'next') { + document.$formname.page.value ++; + } + document.$formname.submit(); + return; +} +// ]]> +</script> +ENDSCRIPT + } + } else { + $r->print('<p class="LC_info">'. + &mt('There are no records to display'). + '</p>'); + } + $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'. + '<input type="hidden" name="phase" value="creationlog" /></form>'); + return; +} + +sub creation_display_filter { + my ($formname,$curr,$version) = @_; + my $nolink = 1; + my ($contexts,$contextnames) = &context_names(); + my $output = '<table><tr><td valign="top">'. + '<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '</td><td> </td>'; + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'created_after_date', + $curr->{'created_after_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'created_before_date', + $curr->{'created_before_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + $output .= '<td valign="top"><b>'.&mt('Window during which course was created:').'</b><br />'. + '<table><tr><td>'.&mt('After:'). + '</td><td>'.$startform.'</td></tr>'. + '<tr><td>'.&mt('Before:').'</td>'. + '<td>'.$endform.'</td></tr></table>'. + '</td>'. + '<td> </td>'; + my ($types,$typenames) = &course_types(); + if (ref($types) eq 'ARRAY') { + if (@{$types} > 1) { + $output .= '<td valign="top"><b>'. + &mt('Course Type:').'</b><br /><select name="type">'; + my $selstr = ''; + if ($curr->{'type'} eq 'any') { + $selstr = ' selected="selected"'; + } + $output .= '<option value="any"'.$selstr.'>'.&mt('Any').'</option>'."\n"; + foreach my $type (@{$types}) { + my $selstr = ''; + if ($curr->{'type'} eq $type) { + $selstr = ' selected="selected"'; + } + my $typename = $type; + if (ref($typenames) eq 'HASH') { + if ($typenames->{$type} ne '') { + $typename = $typenames->{$type}; + } + } + $output .= '<option value="'.$type.'"'.$selstr.'>'.$typename.'</option>'."\n"; + } + $output .= '</select></td>'; + } + } + $output .= '<td> </td>'. + '<td valign="top"><b>'. + &mt('Creation Context:').'</b><br /><select name="context">'; + foreach my $context ('any',@{$contexts}) { + my $selstr = ''; + if ($curr->{'context'} eq $context) { + $selstr = ' selected="selected"'; + } + $output .= '<option value="'.$context.'"'.$selstr.'>'; + if ($context eq 'any') { + $output .= &mt('Any'); + } else { + $output .= $contextnames->{$context}; + } + $output .= '</option>'."\n"; + } + $output .= '</select></td>'. + '</tr></table>'; + + # Update Display button + $output .= '<p>'. + '<input type="submit" value="'.&mt('Update Display').'" />'. + '</p>'; + + # Server version info + $output .= '<p class="LC_info">'. + &mt('Only courses created from servers running LON-CAPA [_1] or later are displayed.','2.9.0'); + if ($version) { + $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version); + } + $output .= '</p><hr />'; + return $output; +} + +sub course_types { + my @types = qw(official unofficial community); + my %typename = ( + official => 'Official course', + unofficial => 'Unofficial course', + community => 'Community', + ); + return (\@types,\%typename); +} + +sub context_names { + my @contexts = qw(auto web dc_create requestcourses); + my %contextnames = + &Apache::lonlocal::texthash ( + auto => 'Automated creation from batch file', + web => 'Batch creation from uploaded file', + dc_create => 'Single course created by Domain Coordinator', + requestcourses => 'Processing of submitted course request', + ); + return (\@contexts,\%contextnames); +} + +sub instcode_srchstr { + my ($domain,$numtitles) = @_; + my $instcode; + if (defined($numtitles) && $numtitles == 0) { + $instcode = '.+'; + } else { + my (%codedefaults,@code_order); + my $defaults_result = + &Apache::lonnet::auto_instcode_defaults($domain,\%codedefaults, + \@code_order); + if ($defaults_result eq 'ok') { + $instcode ='^'; + foreach my $item (@code_order) { + $instcode .= $codedefaults{$item}; + } + $instcode .= '$'; + } else { + $instcode = '.+'; + } + } + return $instcode; +} + +sub syllabuslink_javascript { + return <<"ENDJS"; + +function ToSyllabus(cdom,cnum) { + if (cdom == '' || cdom == null) { + return; + } + if (cnum == '' || cnum == null) { + return; + } + var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'; + var url = "/public/"+cdom+"/"+cnum+"/syllabus"; + syllwin = window.open(url,'',options,1); + syllwin.focus(); + return; +} + +ENDJS + +} + # ===================================================================== Handler sub handler { my $r = shift; @@ -853,12 +1361,52 @@ sub handler { text=>"Creation Outcome", faq=>9,bug=>'Dom Coord Interface',}); &process_batchfile($r); + } elsif ($env{'form.phase'} eq 'requestdisplay') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.phase'}", + text=>&mt('[_1] Display Request Queue',), + faq=>9,bug=>'Dom Coord Interface',}); + my $js = &courserequestbrowser_javascript(); + my $start_page=&Apache::loncommon::start_page('Display Requests',$js); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Requests','Course_Request',undef,'Course_Request'); + $r->print($start_page.$crumbs."\n".'<div>'. + &Apache::loncoursequeueadmin::display_queued_requests( + 'domain',$env{'request.role.domain'}).'</div>'. + &Apache::loncommon::end_page()); + } elsif ($env{'form.phase'} eq 'requestchange') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=requestdisplay", + text=>&mt('[_1] Display Request Queue',), + faq=>9,bug=>'Dom Coord Interface',}, + {href=>"/adm/createcourse?phase=requestchange", + text=>&mt('[_1] Requests Updated',), + faq=>9,bug=>'Dom Coord Interface',},); + my $start_page=&Apache::loncommon::start_page('Update Requests Result'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Requests Updated','Course_Request',undef,'Course_Request'); + $r->print($start_page.$crumbs."\n".'<div>'. + &Apache::loncoursequeueadmin::update_request_queue( + 'domain',$env{'request.role.domain'}).'</div>'. + &Apache::loncommon::end_page()); + } elsif ($env{'form.phase'} eq 'creationlog') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=creationlog", + text=>&mt('[_1] Display Creation History',),}); + my $js = '<script type="text/javascript">'."\n". + '// <![CDATA['."\n". + &syllabuslink_javascript()."\n". + '// ]]>'."\n". + '</script>'; + my $start_page=&Apache::loncommon::start_page('Course Creation Logs',$js); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Created Courses','Creation_Log',undef,'Creation_Log'); + $r->print($start_page.$crumbs."\n".'<div>'); + &print_creation_logs($r); + $r->print('</div>'.&Apache::loncommon::end_page()); } else { &print_intro_page($r); } } else { $env{'user.error.msg'}= - "/adm/createcourse:ccc:0:0:Cannot create courses or groups"; + "/adm/createcourse:ccc:0:0:Cannot create courses or communities"; return HTTP_NOT_ACCEPTABLE; } return OK;