--- loncom/interface/loncreatecourse.pm 2008/07/01 05:22:59 1.108.2.1
+++ loncom/interface/loncreatecourse.pm 2013/07/15 14:32:45 1.148
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Create a course
#
-# $Id: loncreatecourse.pm,v 1.108.2.1 2008/07/01 05:22:59 raeburn Exp $
+# $Id: loncreatecourse.pm,v 1.148 2013/07/15 14:32:45 bisitz 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;
@@ -44,12 +88,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 %domdefaults = &Apache::lonnet::get_domain_defaults($defdom);
my %host_servers = &Apache::lonnet::get_servers($defdom,'library');
my $course_home = ''."\n";
foreach my $server (sort(keys(%host_servers))) {
@@ -66,15 +110,15 @@ 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::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::lonuserutils::javascript_validations(
@@ -87,14 +131,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();
}
@@ -114,6 +160,8 @@ function validate(formname) {
'csli' => "a comma separated list of institutional section numbers, each separated by a colon from the (optional) corresponding section ID to be used in LON-CAPA e.g., 001:1,002:2",
'crcs' => "Crosslisted courses",
'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) sectionID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:zol2",
+ 'ccre' => "Course credits",
+ 'cred' => "the number of institutional credits students will earn by completing this course",
'crco' => "Course Content",
'cncr' => "Completely new course",
'cecr' => "Clone an existing course",
@@ -125,9 +173,10 @@ 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',
@@ -139,12 +188,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.",
@@ -153,40 +201,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 = <
var editbrowser = null;
@@ -213,7 +268,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);
@@ -224,353 +279,288 @@ END
'Create_Course',undef,
'Create_Courses');
$r->print($start_page.$crumbs);
+
+ $r->print('
-ENDDOCUMENT
- } elsif ($crstype eq 'Group') {
- $r->print(<
-$lt{'ginf'}
-
-$lt{'gtit'}:
-
-
-
- $lt{'ghsr'}: $course_home
-
-
-
- $lt{'gidn'} ($lt{'opt'})
-
-
-
-$lt{'grco'}
-
-
-
-
$lt{'mssg'}
-
-
- $lt{'sgpf'}:
-
-
-
-
- $lt{'scfg'}:
-
-
-
-$lt{'cmmn'}
-
-
- $lt{'dmrd'}:
-
-
-
-
- $lt{'dmuc'}:
-
-
-
-$lt{'acco'}
-
-
- $lt{'mnak'}:
-
-
-
-
- $lt{'kaug'}:
-
-
-
-$lt{'rshm'}
-
-
- $lt{'rshm'}:
-
-
-
-
-
$lt{'grts'}
-$lt{'grtq'}
- Mb
-
-
-$lt{'gc'}
-
-
- $lt{'user'}:
-
-
-
- $lt{'dmn'}: $domform
-
-
+ '
+ );
+ } elsif ($crstype eq 'Community') {
+ $r->print('
-
-
-
-ENDDOCUMENT
+
+'
+ );
}
- $r->print($end_page);
+ $r->print(''.
+ $end_page);
}
# ====================================================== Phase two: make course
@@ -579,8 +569,10 @@ 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);
+ my %domdefaults =
+ &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
if ($env{'form.phase'} eq 'coursetwo') {
$crstype='Course';
@@ -656,6 +648,11 @@ sub create_course {
firstres => $env{'form.firstres'}
};
+ if (($crstype eq 'Course') &&
+ ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'})) {
+ $args->{'defaultcredits'} = $env{'form.defaultcredits'};
+ }
+
#
# Verify data
#
@@ -689,99 +686,133 @@ sub create_course {
&Apache::loncommon::construct_course($args,\$logmsg,\$courseid,
\$crsudom,\$crsunum,
$env{'user.domain'},
- $env{'user.name'});
+ $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 [_1] Coordinator to [_2] at [_3]: ',
- $crstype,$ccuname,$ccdomain).
- &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,
- 'cc','','','','','createcourse').'');
+ 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(
'
'.&mt('Manage Access Keys').'
');
}
# Flush the course logs so reverse user roles immediately updated
- &Apache::lonnet::flushcourselogs();
+ $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
$r->print(''.&mt('Roles will be active at next login').'.
');
}
$r->print(''.
- &mt('Create Another [_1]',$crstype).'
'.
+ &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');
+ &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_GroupSpace',&mt('Help on Creating Courses'));
+ 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 => 'batchone',
-# name => &mt('Create courses/groups by uploading an attributes file'),
- name => &mt('Create courses 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',
- },
+ # Create menu
+ my @menu;
+ @menu =
+ ({ categorytitle => 'Course/Community Creation',
+ items => [
+ {
+ linktext => 'Create a single course',
+ url => '/adm/createcourse?phase=courseone',
+ permission => 1,
+ #help => '',
+ icon => 'crsnew.png',
+ linktitle => 'Create a new course by completing an online form.'
+ },
+ {
+ linktext => 'Create a single community',
+ url => '/adm/createcourse?phase=groupone',
+ permission => $show_all_choices,
+ #help => '',
+ icon => 'crsnew.png',
+ linktitle => 'Create a new collaborative community by completing an online form.'
+ },
+ {
+ linktext => 'Create courses/communities by uploading an attributes file',
+ url => '/adm/createcourse?phase=batchone',
+ permission => 1,
+ help => 'Batch_Creation',
+ icon => 'uplcrs.png',
+ linktitle => 'Upload an attributes file containing specifications for one or more courses or communities in XML format.'
+ },
+ ]
+ },
+ { categorytitle => 'Course/Community Requests',
+ items => [
+ {
+ linktext => 'Approve or reject requests',
+ url => '/adm/createcourse?phase=requestdisplay',
+ permission => $show_all_choices,
+ #help => '',
+ icon => 'rcrs.png',
+ linktitle => 'Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.'
+ },
+ {
+ linktext => 'View pending official course requests',
+ url => '/adm/createcourse?phase=pendingdisplay',
+ permission => $show_all_choices,
+ #help => '',
+ icon => 'edit-find.png',
+ alttext => '',
+ linktitle => 'Display official course requests submitted by authorized users, held pending validation of instructor status.'
+ },
+ ]
+ },
+ { categorytitle => 'Administration',
+ items => [
+ {
+ linktext => 'View creation log',
+ url => '/adm/createcourse?phase=creationlog',
+ permission => $show_all_choices,
+ #help => '',
+ icon => 'document-properties.png',
+ linktitle => 'Display information about when, how and by whom courses and communities were created in this domain.'
+ },
+ ]
+ },
+ );
+
+ $r->print(
+ $start_page
+ .$crumbs
+ .&Apache::lonhtmlcommon::generate_menu(@menu)
+ .$end_page
);
- my $options;
- foreach my $choice (@choices) {
- $options .=' '.
- $choice->{'name'}.' ';
- if (exists($choice->{'help'})) {
- $options .= &Apache::loncommon::help_open_topic($choice->{'help'});
- }
- $options .= " \n".' '.(' 'x8).$choice->{'short_description'}.
- "\n";
- }
-
- $r->print(<print($start_page.$crumbs);
-# $r->print(''.&mt('Upload a courses or groups attributes file').' ');
- $r->print(''.&mt('Upload a courses attributes file').' ');
+ $r->print(''.&mt('Upload a courses or communities attributes file').' ');
$r->print('');
- 'value="'.&mt('Create Courses').'" />');
+ 'value="'.&mt('Create Courses/Communities').'" />');
$r->print($end_page);
return;
}
@@ -789,8 +820,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');
+ &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();
@@ -828,6 +858,377 @@ sub process_batchfile {
}
+sub courserequestbrowser_javascript {
+ return <<"ENDREQBRW";
+
+ENDREQBRW
+}
+
+sub print_creation_logs {
+ my ($r) = @_;
+ my $formname = 'creationlog';
+ my $dom = $env{'request.role.domain'};
+ $r->print('