--- loncom/interface/lonsyllabus.pm 2002/08/27 15:17:45 1.2 +++ loncom/interface/lonsyllabus.pm 2008/12/16 10:03:56 1.72 @@ -1,7 +1,7 @@ # The LearningOnline Network # Syllabus # -# $Id: lonsyllabus.pm,v 1.2 2002/08/27 15:17:45 www Exp $ +# $Id: lonsyllabus.pm,v 1.72 2008/12/16 10:03:56 schualex Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,39 +29,391 @@ package Apache::lonsyllabus; use strict; +use Apache::lontemplate; use Apache::Constants qw(:common); use Apache::loncommon; use Apache::lonnet; +use Apache::lontexconvert; +use Apache::lonfeedback; +use Apache::lonannounce; +use Apache::lonlocal; +use Apache::lonhtmlcommon; +use Apache::lonspeller(); +use HTML::Entities(); sub handler { my $r = shift; - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; - -# ------------------------------------------------------------ Print the screen - $r->print(< - -The LearningOnline Network with CAPA - -ENDDOCUMENT + my $target=$env{'form.grade_target'}; +# --------------------------------------------------- Get course info from URL my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri); +# ------------------------------------------------------------ Get query string + &Apache::loncommon::get_unprocessed_cgi + ($ENV{'QUERY_STRING'},['forcestudent','register','forceedit','wrapperdisplay']); +# ----------------------------------------------------- Is this even a course? + my $homeserver=&Apache::lonnet::homeserver($cnum,$cdom); + if ($homeserver eq 'no_host') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + &Apache::loncommon::simple_error_page($r,'No syllabus available', + 'No syllabus available'); + return OK; + } +# ------------------------------------- There is such a course, get environment my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); - $r->print(&Apache::loncommon::bodytag("Syllabus",'','','',$cdom)); - $r->print('

'.$courseenv{'description'}.'

'. - $Apache::lonnet::domaindescription{$cdom}.'

'); + +# ------------------------------------------------------------ Print the screen + + if ($target eq 'tex') { + $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'})); + } +# -------------------------------------------------- Let's see who handles this + my $externalsyllabus=$courseenv{'externalsyllabus'}; + + if ($externalsyllabus=~/\w/) { + + if ($env{'form.wrapperdisplay'} eq 'menu') { + $r->print(&Apache::lonwrapper::simple_menu()); + } else { + $r->print(&Apache::lonwrapper::wrapper("/public/$cdom/$cnum/syllabus?wrapperdisplay=menu", + $externalsyllabus)); + } + return OK; + } + +# ------------------------------ The buck stops here: internal syllabus display +# --------------------------------------------------------- The syllabus fields + my %syllabusfields=&Apache::lonlocal::texthash( + 'aaa_instructorinfo' => 'Instructor Information', + 'bbb_description' => 'Course Description', + 'ccc_prereq' => 'Prerequisites', + 'cdc_classhours' => 'Class Hours', + 'ddd_officehours' => 'Office Hours', + 'eee_helproom' => 'Helproom Hours', + 'efe_projectinfo' => 'Project Information', + 'fff_examinfo' => 'Exam Information', + 'fgf_deadlines' => 'Deadlines', + 'ggg_grading' => 'Grading Information', + 'hhh_readings' => 'Readings', + 'iii_coursepack' => 'Coursepack', + 'jjj_weblinks' => 'Web Links', + 'kkk_textbook' => 'Textbook', + 'lll_includeurl' => 'URLs To Include in Syllabus'); +# --------------------------------------------------------------- Force Student + my $forcestudent=''; + if ($env{'form.forcestudent'}) { $forcestudent='student'; }; + my $forceedit=''; + if ($env{'form.forceedit'}) { $forceedit='edit'; } + +# ----------------------------------------------------------------- Make header + if ($target ne 'tex') { + my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom); + my $js; + if ($env{'form.backto'} eq 'coursecatalog') { + $js .= <<"ENDSCRIPT"; + + + +ENDSCRIPT + } + my $start_page = + &Apache::loncommon::start_page("Syllabus", $rss_link.$js, + {'function' => $forcestudent, + 'domain' => $cdom, + 'force_register' => + $env{'form.register'},}); + + $r->print($start_page); + if ($env{'form.backto'} eq 'coursecatalog') { + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:ToCatalog()", + text=>"Course Catalog"}); + if ($env{'form.coursenum'} ne '') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:ToCatalog('details')", + text=>"Course details"}); + } + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>$r->uri, + text=>"Course syllabus"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs()); + } + $r->print('

'.$courseenv{'description'}.'

'. + &Apache::lonnet::domain($cdom,'description').'

'); + } else { + $r->print('\noindent{\large\textbf{'.$courseenv{'description'}.'}}\\\\\\\\\textbf{'. + &Apache::lonnet::domain($cdom,'description').'}\\\\'); + } +# -------------------------------------------------------------- Announcements? + my $day = &Apache::lonannounce::showday(time,2, + &Apache::lonannounce::readcalendar($cdom.'_'.$cnum)); + if ($target ne 'tex') { + $r->print($day. &Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit)); + } else { + $r->print(&Apache::lonxml::xmlparse($r,'tex',$day)); + } + +# -------------------------------------------------------- Get course personnel + my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum); + if ($target ne 'tex') { + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + } else { + $r->print('\begin{tabular}{|p{0.45\textwidth}|p{0.45\textwidth}|}\hline'); + } + my @personnel=sort(keys(%coursepersonnel)); + my $lastpers=$personnel[$#personnel]; + foreach my $element (@personnel) { + if ($target ne 'tex') { + $r->print(&Apache::lonhtmlcommon::row_title($element)); + } else { + $r->print(' '.&Apache::lonxml::xmlparse($r,'tex',$element).' & '); + } + foreach (split(/\,/,$coursepersonnel{$element})) { + my ($puname,$pudom)=split(/\:/,$_); + if ($target ne 'tex') { + my $courseperson = &Apache::loncommon::plainname($puname,$pudom); + if (($env{'user.name'} eq '') || ($env{'user.name'} eq 'public') || + ($env{'user.domain'} eq '') || ($env{'user.domain'} eq 'public')) { + $r->print(' '.$courseperson); + } else { + $r->print(' '.&Apache::loncommon::aboutmewrapper($courseperson, + $puname,$pudom)); + } + } else { + $r->print(' '.&Apache::loncommon::plainname($puname, + $pudom).' '); + } + } + if ($target ne 'tex') { + my $lastclose=$element eq $lastpers?1:0; + $r->print(&Apache::lonhtmlcommon::row_closure($lastclose)); + } else { + $r->print('\\\\ \hline'); + } + } + if ($target ne 'tex') { + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + } else { + $r->print('\end{tabular}\\\\'); + } +# ---------------------------------------------------------- Load syllabus info + my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum); + my $allowed=0; + my $privileged=0; + # This handler might be called anonymously ... # ----------------------------------------------------- Only if not public call - if ($ENV{'user.environment'}) { + if ($env{'user.environment'}) { # does this user have privileges to post, etc? - my $allowed=0; - if ($ENV{'request.course.id'}) { - $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}); + if ($env{'request.course.id'} + && $cdom eq $env{'course.'.$env{'request.course.id'}.'.domain'} + && $cnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) { + $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + $privileged=$allowed; + if (($syllabus{'uploaded.lastmodified'}) && (!$forceedit)) { + $forcestudent='student'; + } + if ($forcestudent or $target eq 'tex') { $allowed=0; } + } + if ($allowed) { + $r->print('

'. +&Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes',&mt('Help with filling in text boxes')).'

'.&mt('This syllabus can be publicly viewed at') + .' http://'. + &Apache::lonnet::hostname($homeserver).$r->uri.''. + &Apache::loncommon::help_open_topic('Syllabus_ExtLink').'

'. + '

'.&mt('You can specify an external URL as Syllabus in the [_1].',''.&mt('Course Parameters').'').'

'. + '

'. +&mt('Show Public View').''. + &Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView'). + '

'); + } elsif ($privileged) { + if ($target ne 'tex') { + $r->print('

'. + &mt('Edit').''); + } + } + if (($allowed) && ($env{'form.storesyl'})) { + foreach my $syl_field (keys(%syllabusfields)) { + my $field=$env{'form.'.$syl_field}; + chomp($field); + $field=~s/\s+$//s; + $field=~s/^\s+//s; + $field=~s/\$//s; + $field=&Apache::lonfeedback::clear_out_html($field,1); + $syllabus{$syl_field}=$field; + if ($syl_field eq 'lll_includeurl') { # clean up included URLs + my $field=''; + foreach my $value (split(/\n/,$syllabus{$syl_field})) { + my $url=$value; +# get rid of leading and trailing spaces + $url=~s/^\s+//; + $url=~s/\s+$//; + if ($url=~m|^http://([^/]+)/(.+)$|) { + my $host = $1; + my $remainder=$2; +# remove the hostname from internal URLs + my $hostname = &Apache::lonnet::hostname($host); + my %all_hostnames = &Apache::lonnet::all_hostnames(); + foreach my $possible_host (keys(%all_hostnames)) { + if ($possible_host =~ /\Q$hostname\E/i) { + $url=$remainder; + } + } + } +# norm internal URLs + unless ($url=~/^http\:/) { + $url=&Apache::lonnet::clutter($url); + } +# re-assemble field + if ($url) { + $field.=$url."\n"; + } + } + $syllabus{$syl_field}=$field; + } + } + $syllabus{'uploaded.domain'}=$env{'user.domain'}; + $syllabus{'uploaded.name'}=$env{'user.name'}; + $syllabus{'uploaded.lastmodified'}=time; + &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum); } } - $r->print(''); +# ---------------------------------------------------------------- Get syllabus + if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { + my $lastmod=$syllabus{'uploaded.lastmodified'}; + $lastmod=($lastmod?&Apache::lonlocal::locallocaltime($lastmod):&mt('never')); + my $who = &Apache::loncommon::aboutmewrapper( + &Apache::loncommon::plainname($syllabus{'uploaded.name'}, + $syllabus{'uploaded.domain'}),$syllabus{'uploaded.name'}, + $syllabus{'uploaded.domain'}); + if ($target ne 'tex') { + $r->print('
'.&mt('Last updated').':'. + $lastmod.''. + ($who ? &mt('by').' '.$who + : '' ). + '

'); + } else { + $r->print('\\\\ '.&mt('Last updated').': '.$lastmod.' '. + ($who? &mt('by').'\\\\ '. + &Apache::loncommon::plainname($syllabus{'uploaded.name'},$syllabus{'uploaded.domain'}) + :'') + .'\\\\'); + } + if ($allowed) { + $r->print('

'. + ''); + } + my @htmlids=(); + foreach my $field (sort(keys(%syllabusfields))) { + if (($syllabus{$field}=~/\w/) || ($allowed)) { + my $message=$syllabus{$field}; + if ($field eq 'lll_includeurl') { # this is the "included" field + my $urls=$message; + $message=''; + foreach my $filelink (split(/\n/,$urls)) { + my $output=''; +# embed style? + my ($curfext)=($filelink=~/\.([^\.]+)$/); + my $embstyle=&Apache::loncommon::fileembstyle($curfext); + if (($embstyle eq 'ssi') || ($curfext=~/\/$/)) { +# make ssi call and remove everything but the body contents + $output=&Apache::lonnet::ssi_body($filelink); + } elsif ($embstyle eq 'img') { +# embed as an image + $output=''; + } + if ($target ne 'tex') { + $message.='

'.$output.'

'; + } else { + $message.=' '.&Apache::lonxml::xmlparse($r,'tex','

'.$output.'

').' '; + } + } + if ($allowed) { + $r->print('

'.$syllabusfields{$field}. + &Apache::loncommon::help_open_topic('Syllabus_URLs').'

'. + '

'.&mt('Show Public View').''. + &Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView').'

'); + } else { + $r->print($message); + } + } else { + &Apache::lonfeedback::newline_to_br(\$message); + $message =~s|(https*://[^\s]+)|$1|g; + if ($allowed) { + $message=&Apache::lonspeller::markeduptext($message); + } + $message=&Apache::lontexconvert::msgtexconverted($message); + + &Apache::lontemplate::start_columnSection($r); + &Apache::lontemplate::print_content_template($r,$allowed,$target,\%syllabusfields,\%syllabus); + + if ($target ne 'tex') { + &Apache::lontemplate::start_ContentBox($r); + &Apache::lontemplate::end_ContentBox($r); + &Apache::lontemplate::end_columnSection($r); + &Apache::lontemplate::start_columnSection($r); + &Apache::lontemplate::start_ContentBox($r); + &Apache::lontemplate::end_ContentBox($r); + &Apache::lontemplate::end_columnSection($r); + + } else { + $r->print('\\\\\textbf{'.$syllabusfields{$field}.'}\\\\'. + &Apache::lonxml::xmlparse($r,'tex',$message).'\\\\'); + } + push(@htmlids,$field); + } + if ($allowed) { + &Apache::lontemplate::print_editbox_template($r, $syllabus{$field}, $field); +# $r->print('
'); + } + } + } + if ($allowed) { + $r->print('
'. + &Apache::lonhtmlcommon::htmlareaselectactive(@htmlids)); + } + if ($target ne 'tex') {$r->print('

');} else {$r->print('\\\\');} + } else { + if ($target ne 'tex') {$r->print('

');} else {$r->print('\par ');} + $r->print(&mt('No syllabus information provided.')); + if ($target ne 'tex') {$r->print('

');} + } + if ($target ne 'tex') { + if ($env{'form.backto'} eq 'coursecatalog') { + $r->print('
'. + &Apache::lonhtmlcommon::echo_form_input(['backto','courseid']). + '
'); + } + $r->print(&Apache::loncommon::end_page()); + } else { + $r->print('\end{document}'); + } return OK; }