![]() ![]() | ![]() |
Change desgin in abuotme,sylabus,simplepage
1: # The LearningOnline Network 2: # Syllabus 3: # 4: # $Id: lonsyllabus.pm,v 1.80 2009/02/25 13:25:52 neumanie Exp $ 5: # 6: # Copyright Michigan State University Board of Trustees 7: # 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA). 9: # 10: # LON-CAPA is free software; you can redistribute it and/or modify 11: # it under the terms of the GNU General Public License as published by 12: # the Free Software Foundation; either version 2 of the License, or 13: # (at your option) any later version. 14: # 15: # LON-CAPA is distributed in the hope that it will be useful, 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18: # GNU General Public License for more details. 19: # 20: # You should have received a copy of the GNU General Public License 21: # along with LON-CAPA; if not, write to the Free Software 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23: # 24: # /home/httpd/html/adm/gpl.txt 25: # 26: # http://www.lon-capa.org/ 27: # 28: 29: package Apache::lonsyllabus; 30: 31: use strict; 32: use Apache::lontemplate; 33: use Apache::Constants qw(:common); 34: use Apache::loncommon; 35: use Apache::lonnet; 36: use Apache::lontexconvert; 37: use Apache::lonfeedback; 38: use Apache::lonannounce; 39: use Apache::lonlocal; 40: use Apache::lonhtmlcommon; 41: use Apache::lonspeller(); 42: use HTML::Entities(); 43: 44: sub handler { 45: my $r = shift; 46: &Apache::loncommon::content_type($r,'text/html'); 47: $r->send_http_header; 48: return OK if $r->header_only; 49: 50: my $target=$env{'form.grade_target'}; 51: # --------------------------------------------------- Get course info from URL 52: my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri); 53: # ------------------------------------------------------------ Get query string 54: &Apache::loncommon::get_unprocessed_cgi 55: ($ENV{'QUERY_STRING'},['forcestudent','register','forceedit','wrapperdisplay']); 56: # ----------------------------------------------------- Is this even a course? 57: my $homeserver=&Apache::lonnet::homeserver($cnum,$cdom); 58: if ($homeserver eq 'no_host') { 59: &Apache::loncommon::content_type($r,'text/html'); 60: $r->send_http_header; 61: &Apache::loncommon::simple_error_page($r,'No syllabus available', 62: 'No syllabus available'); 63: return OK; 64: } 65: # ------------------------------------- There is such a course, get environment 66: my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); 67: 68: # ------------------------------------------------------------ Print the screen 69: 70: if ($target eq 'tex') { 71: $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'})); 72: } 73: # -------------------------------------------------- Let's see who handles this 74: my $externalsyllabus=$courseenv{'externalsyllabus'}; 75: 76: if ($externalsyllabus=~/\w/) { 77: 78: if ($env{'form.wrapperdisplay'} eq 'menu') { 79: $r->print(&Apache::lonwrapper::simple_menu()); 80: } else { 81: $r->print(&Apache::lonwrapper::wrapper("/public/$cdom/$cnum/syllabus?wrapperdisplay=menu", 82: $externalsyllabus)); 83: } 84: return OK; 85: } 86: 87: # ------------------------------ The buck stops here: internal syllabus display 88: # --------------------------------------------------------- The syllabus fields 89: my %syllabusfields=&Apache::lonlocal::texthash( 90: 'aaa_instructorinfo' => 'Instructor Information', 91: 'bbb_description' => 'Course Description', 92: 'ccc_prereq' => 'Prerequisites', 93: 'cdc_classhours' => 'Class Hours', 94: 'ddd_officehours' => 'Office Hours', 95: 'eee_helproom' => 'Helproom Hours', 96: 'efe_projectinfo' => 'Project Information', 97: 'fff_examinfo' => 'Exam Information', 98: 'fgf_deadlines' => 'Deadlines', 99: 'ggg_grading' => 'Grading Information', 100: 'hhh_readings' => 'Readings', 101: 'iii_coursepack' => 'Coursepack', 102: 'jjj_weblinks' => 'Web Links', 103: 'kkk_textbook' => 'Textbook', 104: 'lll_includeurl' => 'URLs To Include in Syllabus'); 105: # --------------------------------------------------------------- Force Student 106: my $forcestudent=''; 107: if ($env{'form.forcestudent'}) { $forcestudent='student'; }; 108: my $forceedit=''; 109: if ($env{'form.forceedit'}) { $forceedit='edit'; } 110: 111: # ----------------------------------------------------------------- Make header 112: if ($target ne 'tex') { 113: my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom); 114: my $js; 115: if ($env{'form.backto'} eq 'coursecatalog') { 116: $js .= <<"ENDSCRIPT"; 117: 118: <script type="text/javascript"> 119: function ToCatalog(caller) { 120: numidx = getIndexByName('coursenum'); 121: if (numidx > -1) { 122: if (caller != 'details') { 123: document.backtocat.elements[numidx].value = ''; 124: } 125: } 126: document.backtocat.submit(); 127: } 128: 129: function getIndexByName(item) { 130: for (var i=0;i<document.backtocat.elements.length;i++) { 131: if (document.backtocat.elements[i].name == item) { 132: return i; 133: } 134: } 135: return -1; 136: } 137: 138: </script> 139: 140: ENDSCRIPT 141: } 142: my $start_page = 143: &Apache::loncommon::start_page("Syllabus", $rss_link.$js, 144: {'function' => $forcestudent, 145: 'domain' => $cdom, 146: 'force_register' => 147: $env{'form.register'},}); 148: 149: $r->print($start_page); 150: if ($env{'form.backto'} eq 'coursecatalog') { 151: &Apache::lonhtmlcommon::clear_breadcrumbs(); 152: &Apache::lonhtmlcommon::add_breadcrumb 153: ({href=>"javascript:ToCatalog()", 154: text=>"Course Catalog"}); 155: if ($env{'form.coursenum'} ne '') { 156: &Apache::lonhtmlcommon::add_breadcrumb 157: ({href=>"javascript:ToCatalog('details')", 158: text=>"Course details"}); 159: } 160: &Apache::lonhtmlcommon::add_breadcrumb 161: ({href=>$r->uri, 162: text=>"Course syllabus"}); 163: $r->print(&Apache::lonhtmlcommon::breadcrumbs()); 164: } 165: 166: } 167: # ---------------------------------------------------------- Load syllabus info 168: my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum); 169: my $allowed=0; 170: my $privileged=0; 171: 172: # This handler might be called anonymously ... 173: # ----------------------------------------------------- Only if not public call 174: if ($env{'user.environment'}) { 175: # does this user have privileges to post, etc? 176: if ($env{'request.course.id'} 177: && $cdom eq $env{'course.'.$env{'request.course.id'}.'.domain'} 178: && $cnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) { 179: $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); 180: $privileged=$allowed; 181: if (($syllabus{'uploaded.lastmodified'}) && (!$forceedit)) { 182: $forcestudent='student'; 183: } 184: if ($forcestudent or $target eq 'tex') { $allowed=0; } 185: } 186: if (($allowed) && ($env{'form.storesyl'})) { 187: foreach my $syl_field (keys(%syllabusfields)) { 188: my $field=$env{'form.'.$syl_field}; 189: chomp($field); 190: $field=~s/\s+$//s; 191: $field=~s/^\s+//s; 192: $field=~s/\<br\s*\/*\>$//s; 193: $field=&Apache::lonfeedback::clear_out_html($field,1); 194: $syllabus{$syl_field}=$field; 195: if ($syl_field eq 'lll_includeurl') { # clean up included URLs 196: my $field=''; 197: foreach my $value (split(/\n/,$syllabus{$syl_field})) { 198: my $url=$value; 199: # get rid of leading and trailing spaces 200: $url=~s/^\s+//; 201: $url=~s/\s+$//; 202: if ($url=~m|^https?\://([^/]+)/(.+)$|) { 203: my $host = $1; 204: my $remainder=$2; 205: # remove the hostname from internal URLs 206: my $hostname = &Apache::lonnet::hostname($host); 207: my %all_hostnames = &Apache::lonnet::all_hostnames(); 208: foreach my $possible_host (keys(%all_hostnames)) { 209: if ($possible_host =~ /\Q$hostname\E/i) { 210: $url=$remainder; 211: } 212: } 213: } 214: # norm internal URLs 215: unless ($url=~/^https?\:/) { 216: $url=&Apache::lonnet::clutter($url); 217: } 218: # re-assemble field 219: if ($url) { 220: $field.=$url."\n"; 221: } 222: } 223: $syllabus{$syl_field}=$field; 224: } 225: } 226: $syllabus{'uploaded.domain'}=$env{'user.domain'}; 227: $syllabus{'uploaded.name'}=$env{'user.name'}; 228: $syllabus{'uploaded.lastmodified'}=time; 229: &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum); 230: } 231: } 232: #--------Functions 233: if ($target ne 'tex') { 234: if($allowed || $privileged){ 235: &Apache::lontemplate::print_start_page_functions($r); 236: if($allowed){ 237: &Apache::lontemplate::print_functions_content($r,'<a href="'.$r->uri.'?forcestudent=1">'.&mt('Show Public View').'</a>'.&Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView')); 238: &Apache::lontemplate::print_functions_content($r,&Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes',&mt('Help with filling in text boxes'))); 239: }elsif($privileged){ 240: &Apache::lontemplate::print_functions_content($r,'<a href="'.$r->uri.'?forceedit=1">'.&mt('Edit').'</a>'); 241: } 242: &Apache::lontemplate::print_end_page_functions($r); 243: } 244: } 245: #----------------------------Print Headtitle 246: if($target ne 'tex'){ 247: $r->print('<h1>'.$courseenv{'description'}.'</h1>'); 248: $r->print('<h3>'. &Apache::lonnet::domain($cdom,'description').'</h3>'); 249: }else{ 250: $r->print('\noindent{\large\textbf{'.$courseenv{'description'}.'}}\\\\\\\\\textbf{'. 251: &Apache::lonnet::domain($cdom,'description').'}\\\\'); 252: } 253: # -------------------------------------------------------- Get course personnel 254: my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum); 255: if ($target ne 'tex') { 256: $r->print(&Apache::lonhtmlcommon::start_pick_box()); 257: } else { 258: $r->print('\begin{tabular}{|p{0.45\textwidth}|p{0.45\textwidth}|}\hline'); 259: } 260: my @personnel=sort(keys(%coursepersonnel)); 261: my $lastpers=$personnel[$#personnel]; 262: foreach my $element (@personnel) { 263: if ($target ne 'tex') { 264: $r->print(&Apache::lonhtmlcommon::row_title($element)); 265: } else { 266: $r->print(' '.&Apache::lonxml::xmlparse($r,'tex',$element).' & '); 267: } 268: foreach (split(/\,/,$coursepersonnel{$element})) { 269: my ($puname,$pudom)=split(/\:/,$_); 270: if ($target ne 'tex') { 271: my $courseperson = &Apache::loncommon::plainname($puname,$pudom); 272: if (($env{'user.name'} eq '') || ($env{'user.name'} eq 'public') || 273: ($env{'user.domain'} eq '') || ($env{'user.domain'} eq 'public')) { 274: $r->print(' '.$courseperson); 275: } else { 276: $r->print(' '.&Apache::loncommon::aboutmewrapper($courseperson, 277: $puname,$pudom)); 278: } 279: } else { 280: $r->print(' '.&Apache::loncommon::plainname($puname, 281: $pudom).' '); 282: } 283: } 284: if ($target ne 'tex') { 285: my $lastclose=$element eq $lastpers?1:0; 286: $r->print(&Apache::lonhtmlcommon::row_closure($lastclose)); 287: } else { 288: $r->print('\\\\ \hline'); 289: } 290: } 291: if ($target ne 'tex') { 292: $r->print(&Apache::lonhtmlcommon::end_pick_box()); 293: } else { 294: $r->print('\end{tabular}\\\\'); 295: } 296: #----------Print last update 297: my $lastmod=$syllabus{'uploaded.lastmodified'}; 298: $lastmod=($lastmod?&Apache::lonlocal::locallocaltime($lastmod):&mt('never')); 299: my $who = &Apache::loncommon::aboutmewrapper( 300: &Apache::loncommon::plainname($syllabus{'uploaded.name'}, 301: $syllabus{'uploaded.domain'}),$syllabus{'uploaded.name'}, 302: $syllabus{'uploaded.domain'}); 303: if ($target ne 'tex') { 304: $r->print('<table><tr><td>'.&mt('Last updated').':</td><td>'. 305: $lastmod.'</td><td>'. 306: ($who ? &mt('by').' '.$who 307: : '' ). 308: '</td></tr></table>'); 309: } else { 310: $r->print('\\\\ '.&mt('Last updated').': '.$lastmod.' '. 311: ($who? &mt('by').'\\\\ '. 312: &Apache::loncommon::plainname($syllabus{'uploaded.name'},$syllabus{'uploaded.domain'}) 313: :'') 314: .'\\\\'); 315: } 316: #---------------------Print Extern URL Course Info 317: if( ($allowed) && ($target ne 'tex') ) { 318: my $protocol = $Apache::lonnet::protocol{$homeserver}; 319: $protocol = 'http' if ($protocol ne 'https'); 320: $r->print('<p>'.&mt('This syllabus can be publicly viewed at').' <tt>'.$protocol.'://'.&Apache::lonnet::hostname($homeserver).$r->uri.'</tt>'.&Apache::loncommon::help_open_topic('Syllabus_ExtLink').'</p>'.'<p>'.&mt('You can specify an external URL as Syllabus in the [_1].','<a href="/adm/parmset?action=crsenv">'.&mt('Course Parameters').'</a>').'</p>'); 321: } 322: # -------------------------------------------------------------- Announcements? 323: my $day = &Apache::lonannounce::showday(time,2, 324: &Apache::lonannounce::readcalendar($cdom.'_'.$cnum)); 325: if ($target ne 'tex') { 326: if($allowed){ 327: &Apache::lontemplate::print_template($r,'RSS Feeds and Blogs',&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit),1,'LC_ContentBoxSpecial'); 328: } 329: elsif(&Apache::lonrss::advertisefeeds($cnum,$cdom) ne ''){ 330: &Apache::lontemplate::print_template($r,'RSS Feeds and Blogs',&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit),1,'LC_ContentBoxSpecial'); 331: } 332: 333: } else { 334: $r->print(&Apache::lonxml::xmlparse($r,'tex',$day)); 335: } 336: # ---------------------------------------------------------------- Get syllabus 337: if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { 338: if ($allowed) { 339: $r->print('<form method="post">'. 340: '<input type="hidden" name="forceedit" value="edit" />'); 341: } 342: my @htmlids=(); 343: 344: foreach my $field (sort(keys(%syllabusfields))) { 345: if (($syllabus{$field}=~/\w/) || ($allowed)) { 346: my $message=$syllabus{$field}; 347: if ($field eq 'lll_includeurl') { # this is the "included" field 348: my $urls=$message; 349: $message=''; 350: foreach my $filelink (split(/\n/,$urls)) { 351: my $output=''; 352: # embed style? 353: my ($curfext)=($filelink=~/\.([^\.]+)$/); 354: my $embstyle=&Apache::loncommon::fileembstyle($curfext); 355: if (($embstyle eq 'ssi') || ($curfext=~/\/$/)) {# make ssi call and remove everything but the body contents 356: $output=&Apache::lonnet::ssi_body($filelink); 357: } elsif ($embstyle eq 'img') {# embed as an image 358: $output='<img src="'.$filelink.'" />'; 359: } 360: if($output ne ''){ 361: if ($target ne 'tex') { 362: $message.='<p>'.$output.'</p>'; 363: } else { 364: $message.=' '.&Apache::lonxml::xmlparse($r,'tex','<p>'.$output.'</p>').' '; 365: } 366: } 367: } 368: if ($allowed) { 369: $r->print('<h3>'.$syllabusfields{$field}. 370: &Apache::loncommon::help_open_topic('Syllabus_URLs').'</h3>'); 371: } else { 372: $r->print($message); 373: } 374: } else { 375: &Apache::lonfeedback::newline_to_br(\$message); 376: $message =~s|(https?\://[^\s]+)|<a href="$1"><tt>$1</tt></a>|g; 377: if ($allowed) { 378: $message=&Apache::lonspeller::markeduptext($message); 379: } 380: $message=&Apache::lontexconvert::msgtexconverted($message); 381: if ($target ne 'tex') { 382: if($allowed){ 383: $r->print('<p>'); 384: } 385: &Apache::lontemplate::print_template($r, $syllabusfields{$field}, $message,$allowed,'LC_ContentBoxSpecial'); 386: } else { 387: $r->print('\\\\\textbf{'.$syllabusfields{$field}.'}\\\\'. 388: &Apache::lonxml::xmlparse($r,'tex',$message).'\\\\'); 389: } 390: push(@htmlids,$field); 391: } 392: if ($allowed) { 393: if($target ne 'tex'){ 394: $r->print('</p>'); 395: &Apache::lontemplate::print_editbox_template($r, $syllabus{$field}, $field); 396: } 397: 398: } 399: } 400: } 401: 402: if ($allowed) { 403: $r->print('</form>'. 404: &Apache::lonhtmlcommon::htmlareaselectactive(@htmlids)); 405: } 406: # if ($target ne 'tex') {$r->print('</p>');} else {$r->print('\\\\');} 407: } else { 408: if ($target ne 'tex') {$r->print('<p>');} else {$r->print('\par ');} 409: $r->print(&mt('No syllabus information provided.')); 410: if ($target ne 'tex') {$r->print('</p>');} 411: } 412: if ($target ne 'tex') { 413: if ($env{'form.backto'} eq 'coursecatalog') { 414: $r->print('<form name="backtocat" method="post" action="/adm/coursecatalog">'. 415: &Apache::lonhtmlcommon::echo_form_input(['backto','courseid']). 416: '</form>'); 417: } 418: $r->print(&Apache::loncommon::end_page()); 419: } else { 420: $r->print('\end{document}'); 421: } 422: return OK; 423: } 424: 425: 1; 426: __END__