--- loncom/interface/lonsyllabus.pm 2006/03/06 22:17:48 1.45 +++ loncom/interface/lonsyllabus.pm 2013/05/16 20:03:51 1.127 @@ -1,7 +1,7 @@ # The LearningOnline Network # Syllabus # -# $Id: lonsyllabus.pm,v 1.45 2006/03/06 22:17:48 www Exp $ +# $Id: lonsyllabus.pm,v 1.127 2013/05/16 20:03:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,6 +29,7 @@ package Apache::lonsyllabus; use strict; +use Apache::lontemplate; use Apache::Constants qw(:common); use Apache::loncommon; use Apache::lonnet; @@ -38,41 +39,125 @@ use Apache::lonannounce; use Apache::lonlocal; use Apache::lonhtmlcommon; use Apache::lonspeller(); +use HTML::Entities(); sub handler { my $r = shift; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + return OK if $r->header_only; + 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'},['register','forceedit','todocs', + 'folderpath','title']); # ----------------------------------------------------- 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; - $r->print('
'.&mt('No syllabus available').''); + &Apache::loncommon::simple_error_page($r,'No syllabus available', + 'No syllabus available'); + return OK; + } elsif (!&Apache::lonnet::is_course($cdom,$cnum)) { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + &Apache::loncommon::simple_error_page($r,'No syllabus available', + 'The course/community for which the syllabus was requested does not exist.'); return OK; } # ------------------------------------- There is such a course, get environment my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); - - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - return OK if $r->header_only; + my $crstype = &Apache::loncommon::course_type(); + # ------------------------------------------------------------ Print the screen - my $target=$env{'form.grade_target'}; - my $feedurl='feed://'.$ENV{'HTTP_HOST'}.'/public/'.$cdom.'/'.$cnum.'/Course_Announcements.rss'; - if ($target ne 'tex') { - my $html=&Apache::lonxml::xmlbegin(); - $r->print(<'. + &mt('All feeds currently hidden'). + $msg. + '
'); + } else { + $r->print(''. + &mt('No current feeds'). + $msg. + '
'); + } + $rsslinktext = &mt('Manage Course RSS Feeds/Blogs'); + if ($crstype eq 'Community') { + $rsslinktext = &mt('Manage Communiity RSS Feeds/Blogs'); + } + } + my $editurl= &Apache::lonnet::absolute_url().'/adm/'.$cdom.'/'.$cnum.'/_rss.html'; + $r->print( ''.$rsslinktext.''); + &Apache::lontemplate::print_end_template($r); + } else { + unless ($hidefeeds) { + my $feeds = &Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit); + if ($feeds ne '') { + &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box'); + $r->print($feeds); + &Apache::lontemplate::print_end_template($r); + } + } + } + } else { + $r->print(&Apache::lonxml::xmlparse($r,'tex',$day)); + } +# ---------------------------------------------------------------- Get syllabus + if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { + if ($allowed) { + $r->print(''. + &Apache::lonhtmlcommon::htmlareaselectactive()); + } + } else { + if ($target ne 'tex') {$r->print('');} else {$r->print('\par ');} + $r->print(&mt('No syllabus information provided.')); + if ($target ne 'tex') {$r->print('
');} } -# -------------------------------------------------------- Get course personnel - my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum); if ($target ne 'tex') { - $r->print(''. -&Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes','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('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 (keys %syllabusfields) {
- my $field=$env{'form.'.$_};
- chomp($field);
- $field=~s/\s+$//s;
- $field=~s/^\s+//s;
- $field=~s/\
$//s;
- $field=&Apache::lonfeedback::clear_out_html($field,1);
- $syllabus{$_}=$field;
- if ($_ eq 'lll_includeurl') { # clean up included URLs
- my $field='';
- foreach (split(/\n/,$syllabus{$_})) {
- my $url=$_;
+sub save_changes {
+ my ($cnum,$cdom,$uploaded,$external,$minimal,$syllabus,$syllabusfields,$courseenv) = @_;
+ my ($earlyout,$output);
+ unless ((ref($syllabus) eq 'HASH') && (ref($syllabusfields) eq 'HASH')) {
+ return ($earlyout,$uploaded,$external,$minimal,$output);
+ }
+ if ($env{'form.deleteuploaded'}) {
+ my %storehash;
+ if (($env{'form.choice'} eq 'file') &&
+ ($env{'form.deleteuploaded'} eq 'file') && ($uploaded =~ /\w/)) {
+ &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus');
+ &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus');
+ $storehash{'uploadedsyllabus'} = '';
+ $storehash{'externalsyllabus'} = '';
+ my $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
+ undef($uploaded);
+ undef($external);
+ } elsif (($env{'form.choice'} eq 'minimal') &&
+ ($env{'form.deleteuploaded'} eq 'minimal') && ($minimal =~ /\w/)) {
+ &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus');
+ &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.minimalsyllabus');
+ $storehash{'externalsyllabus'} = '';
+ $storehash{'minimalsyllabus'} = '';
+ my $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
+ undef($external);
+ undef($minimal);
+ }
+ } elsif ($env{'form.choice'} eq 'template') {
+#store what the user typed in to the template
+ my @shown = &Apache::loncommon::get_env_multiple('form.showfield');
+ $syllabus->{'uploaded.fields'} = '';
+ if (@shown == 0) {
+ $syllabus->{'uploaded.fields'} = 'none';
+ } else {
+ foreach my $field (sort(@shown)) {
+ if (($field eq '000_showpeople') ||
+ ($field eq '111_showrssfeeds') ||
+ ($syllabusfields->{$field})) {
+ my ($prefix) = split(/_/,$field);
+ $syllabus->{'uploaded.fields'} .= $prefix.',';
+ }
+ if ($field eq '000_showpeople') {
+ my @hideusers = &Apache::loncommon::get_env_multiple('form.hideuser');
+ my @hideroles = &Apache::loncommon::get_env_multiple('form.hiderole');
+ my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum,1);
+ my %personnel;
+ foreach my $key (keys(%coursepersonnel)) {
+ map { $personnel{$key}{$_} = 1; } split(/,/,$coursepersonnel{$key});
+ }
+ %{$syllabus->{'personnel'}} = ();
+ $syllabus->{'personnel'}{'hideuser'} = '';
+ $syllabus->{'personnel'}{'hiderole'} = '';
+ foreach my $role (@hideroles) {
+ if (exists($personnel{$role})) {
+ $syllabus->{'personnel'}{'hiderole'} .= $role.',';
+ }
+ }
+ foreach my $item (@hideusers) {
+ my ($role,$user) = split(/\&/,$item);
+ if (ref($personnel{$role}) eq 'HASH') {
+ if ($personnel{$role}{$user}) {
+ $syllabus->{'personnel'}{'hideuser'} .= $item.',';
+ }
+ }
+ }
+ $syllabus->{'personnel'}{'hideuser'} =~ s/,$//;
+ $syllabus->{'personnel'}{'hiderole'} =~ s/,$//;
+ }
+ }
+ $syllabus->{'uploaded.fields'} =~ s/,$//;
+ }
+ 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);
+ #here it will be stored
+ $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=~/^http\:\/\/([^\/]+)\/(.+)$/) {
- my $remainder=$2;
+ $url=~s/^\s+//;
+ $url=~s/\s+$//;
+ if ($url=~m|^https?\://([^/]+)/(.+)$|) {
+ my $host = $1;
+ my $remainder=$2;
# remove the hostname from internal URLs
- foreach (keys %Apache::lonnet::hostname) {
- if ($1=~/$Apache::lonnet::hostname{$_}/i) {
- $url=$remainder;
- }
- }
- }
+ 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);
- }
+ unless ($url=~/^https?\:/) {
+ $url=&Apache::lonnet::clutter($url);
+ }
# re-assemble field
- if ($url) {
- $field.=$url."\n";
- }
- }
- $syllabus{$_}=$field;
- }
- }
- $syllabus{'uploaded.domain'}=$env{'user.domain'};
- $syllabus{'uploaded.name'}=$env{'user.name'};
- $syllabus{'uploaded.lastmodified'}=time;
- &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum);
- }
+ if ($url) {
+ $field.=$url."\n";
+ }
+ }
+ $syllabus->{$syl_field}=$field;
+ }
+ }
+ my $now = time;
+ $syllabus->{'uploaded.domain'}=$env{'user.domain'};
+ $syllabus->{'uploaded.name'}=$env{'user.name'};
+ $syllabus->{'uploaded.lastmodified'} = $now;
+ my $putres = &Apache::lonnet::put('syllabus',$syllabus,$cdom,$cnum);
+ if ($putres eq 'ok') {
+ ($uploaded,$minimal,$external) =
+ &update_syllabus_env($cdom,$cnum,$courseenv,$env{'form.choice'},$uploaded,
+ $minimal,$external);
+ $output = '