--- loncom/interface/loncreatecourse.pm 2007/06/29 14:32:43 1.102
+++ loncom/interface/loncreatecourse.pm 2010/04/13 21:19:15 1.137
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Create a course
#
-# $Id: loncreatecourse.pm,v 1.102 2007/06/29 14:32:43 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.137 2010/04/13 21:19:15 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -27,6 +27,50 @@
#
###
+=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 context_names()
+
+=item instcode_srchstr()
+
+=item syllabuslink_javascript()
+
+=back
+
+=cut
+
package Apache::loncreatecourse;
use strict;
@@ -35,7 +79,7 @@ use Apache::lonnet;
use Apache::loncommon;
use Apache::londocs;
use Apache::lonlocal;
-use Apache::londropadd;
+use Apache::lonuserutils;
use Apache::lonclonecourse;
use LONCAPA::batchcreatecourse;
use LONCAPA;
@@ -44,7 +88,7 @@ use LONCAPA;
sub print_course_creation_page {
my $r=shift;
- my $crstype = 'Group';
+ my $crstype = 'Community';
if ($env{'form.phase'} eq 'courseone') {
$crstype = 'Course';
}
@@ -65,18 +109,18 @@ sub print_course_creation_page {
&Apache::loncommon::selectcourse_link
('ccrs','clonecourse','clonedomain',undef,undef,undef,$crstype);
my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});
- my ($enroll_table,$access_table,$krbdef,$krbdefdom,$krbform,$intform,$locform,
+ my ($enroll_table,$krbdef,$krbdefdom,$krbform,$intform,$locform,
$javascript_validations);
+ my $starttime = time;
+ my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
+ my $access_table = &Apache::lonuserutils::date_setting_table($starttime,
+ $endtime,'create_defaultdates');
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');
($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,
@@ -86,14 +130,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();
}
@@ -124,10 +170,14 @@ function validate(formname) {
'stco' => "standard courses only",
'blnk' => "Blank",
'sllb' => "Syllabus",
- 'navi' => "Navigate",
+ 'navi' => "Course 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",
@@ -135,12 +185,11 @@ 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 (id@domain) 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.",
@@ -149,40 +198,47 @@ 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",
- 'pcda' => "Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process",
+ 'psam' => "Authentication mechanism",
+ 'pcda' => "Default authentication method for new users added to this 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?",
'ndcl' => "Notification to domain coordinator via LON-CAPA message when enrollment changes occur during the automated update?",
'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.",
- '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",
- 'dmrd' => "Disable member resource discussion",
- 'dmuc' => "Disable member use of chatrooms",
- 'mnak' => "Members need access key to enter group",
- 'kaug' =>
- 'Key authority (id@domain) 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.",
-
- );
+ 'cgrq' => 'Set a quota for the total disk space available for storage of course group portfolio files',
+ 'opco' => 'Open Course',
+ 'opcm' => 'Open Community',
+ );
+ $lt{'kaut'} = &mt('Key authority ([_1]id:domain[_2]) if other than course','','');
+
+ if ($crstype eq 'Community') {
+ $lt{'cinf'} = &mt('Community Information');
+ $lt{'ctit'} = &mt('Community Title');
+ $lt{'chsr'} = &mt('Community Home Server');
+ $lt{'cidn'} = &mt('Community ID/Number');
+ $lt{'crco'} = &mt('Community Content');
+ $lt{'cncr'} = &mt('Completely new community');
+ $lt{'cecr'} = &mt('Clone an existing community');
+ $lt{'sacr'} = &mt('Do NOT generate as standard community');
+ $lt{'stco'} = &mt('standard communities only');
+ $lt{'navi'} = &mt('Community Contents');
+ $lt{'cid'} = &mt('Community ID');
+ $lt{'scpf'} = &mt('Set community policy feedback to Coordinator');
+ $lt{'scfc'} = &mt('Set content feedback to Coordinator');
+ $lt{'dsrd'} = &mt('Disable member resource discussion');
+ $lt{'dsuc'} = &mt('Disable member use of chat rooms');
+ $lt{'dads'} = &mt('Default Access Dates for Members');
+ $lt{'dacc'} = &mt('Default start and end dates for member access');
+ $lt{'snak'} = &mt('Members need access key to enter course');
+ $lt{'kaut'} = &mt('Key authority ([_1]id:domain[_2]) if other than community','','');
+ $lt{'ow'} = &mt('Community Owner');
+ $lt{'cc'} = &mt('(will be assigned Coordinator role)');
+ $lt{'cgrs'} = &mt('Community Group Settings');
+ $lt{'cgrq'} = &mt('Set a quota for the total disk space available for storage of community group portfolio files');
+ }
my $js = <
-
-
-
-
-
-
-
-$lt{'smap'}
-
-
-
-$lt{'fres'}$lt{'ginf'}
-$lt{'grco'}
-
-
-
-$lt{'cngr'} $lt{'cegr'}
-
-
-($lt{'ocik'}):
-
-
($lt{'stgo'}):
-
-
-
-
-
-
-
-
-
-
-
-$lt{'asov'}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
--
- -
- -
+' + ); + } elsif ($crstype eq 'Community') { + $r->print('- -
- -ENDDOCUMENT + +' + ); } - $r->print($end_page); + $r->print(''. + $end_page); } # ====================================================== Phase two: make course @@ -568,7 +552,7 @@ sub create_course { my $r=shift; my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'}); my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); - my $crstype = 'Group'; + my $crstype = 'Community'; my ($enrollstart,$enrollend,$startaccess,$endaccess); if ($env{'form.phase'} eq 'coursetwo') { @@ -581,33 +565,6 @@ sub create_course { my $autharg; my $authtype; - my ($clonecourse,$clonedomain,$clonemsg); - - if (($env{'form.clonecourse'} ne '') && ($env{'form.clonedomain'} ne '')) { - my $clonehome=&Apache::lonnet::homeserver($env{'form.clonecourse'},$env{'form.clonedomain'}); - if ($clonehome eq 'no_host') { - $clonemsg = &mt('The new course was not cloned from an existing course because the requested course from which to create the clone does not appear to be a valid course.'); - } else { - my %clonedesc = &Apache::lonnet::coursedescription($env{'form.clonedomain'}.'_'.$env{'form.clonecourse'},{'one_time' => 1}); - if ($env{'request.role.domain'} eq $env{'form.clonedomain'}) { - $clonecourse = $env{'form.clonecourse'}; - $clonedomain = $env{'form.clonedomain'}; - } else { - my %clonehash = &Apache::lonnet::get('environment',['cloners'], - $env{'form.clonedomain'},$env{'form.clonecourse'}); - my @cloners = split(/,/,$clonehash{'cloners'}); - my %roleshash = - &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles', - ['active'],['cc'],[$env{'form.clonedomain'}]); - if (($roleshash{$env{'form.clonecourse'}.':'.$env{'form.clonedomain'}.':cc'}) || (grep(/^\Q$ccuname\E:\Q$ccdomain\E$/,@cloners))) { - $clonecourse = $env{'form.clonecourse'}; - $clonedomain = $env{'form.clonedomain'}; - } else { - $clonemsg = &mt('The new course was not cloned from an existing course because the course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$ccuname.':'.$ccdomain,$clonedesc{'description'}); - } - } - } - } if ($env{'form.login'} eq 'krb') { $authtype = 'krb'; @@ -641,8 +598,10 @@ sub create_course { nonstandard => $env{'form.nonstandard'}, crscode => $env{'form.crscode'}, crsquota => $env{'form.crsquota'}, - clonecourse => $clonecourse, - clonedomain => $clonedomain, + 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'}, @@ -676,78 +635,109 @@ sub create_course { # Check the veracity of the course coordinator if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') { $r->print(''.&Apache::loncommon::end_page()); + $r->print(''.$clonemsg.'
'); - } 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').''); - } - if ($env{'form.setkeys'}) { - $r->print( - '
'); - } -# Flush the course logs so reverse user roles immediately updated - &Apache::lonnet::flushcourselogs(); - $r->print(''.&mt('Roles will be active at next login').'.
'. - ''. - &mt('Create Another [_1]',$crstype).'
'. + 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)) { + my $ccrole = 'cc'; + if ($crstype eq 'Community') { + $ccrole = 'co'; + } + $r->print(&mt('Assigning role of '.$crstype.' Coordinator to [_1]:', + ,''.$ccuname.':'.$ccdomain.'') + .&Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, + $ccrole,'','','','','createcourse').''); + } + if ($env{'form.setkeys'}) { + $r->print( + '
'); + } + # Flush the course logs so reverse user roles immediately updated + &Apache::lonnet::flushcourselogs(); + $r->print(''.&mt('Roles will be active at next login').'.
'); + } + $r->print(''. + &mt("Create Another $crstype").'
'. &Apache::loncommon::end_page()); } sub print_intro_page { - my $r = shift; + my ($r,$show_all_choices) = @_; 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 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 @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 => 'batchone', - name => &mt('Create courses/groups by uploading an attributes file'), - short_description => - &mt('Upload an attributes file containing specifications for one or more courses or groups in XML format'), - help => 'Batch_Creation', - }, - ); + 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.'), + }); + if ($show_all_choices) { + push(@choices,{ 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/communities by uploading an attributes file'), + short_description => + &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 requests'), + short_description => + &mt('Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.'), + }, + { internal_name => 'pendingdisplay', + name => &mt('Display official course requests'), + short_description => + &mt('Display official course requests submitted by authorized users, held pending validation of instructor status.'), + }, + { internal_name => 'creationlog', + name => &mt('View creation log'), + short_description => + &mt('Display information about when, how and by whom courses and communities were created in this domain.'), + }); + } else { + push(@choices,{ internal_name => 'batchone', + name => &mt('Create courses by uploading an attributes file'), + short_description => + &mt('Upload an attributes file containing specifications for one or more courses in XML format.'), + help => 'Batch_Creation', + }); + } my $options; foreach my $choice (@choices) { $options .='