--- loncom/interface/lonbulletin.pm 2002/09/11 13:36:50 1.3
+++ loncom/interface/lonbulletin.pm 2025/01/28 19:49:20 1.70
@@ -1,7 +1,7 @@
# The LearningOnline Network
-# Simple Page Editor
+# Bulletin Board Handler
#
-# $Id: lonbulletin.pm,v 1.3 2002/09/11 13:36:50 www Exp $
+# $Id: lonbulletin.pm,v 1.70 2025/01/28 19:49:20 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,141 +33,318 @@ use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::lonnet;
use Apache::lontexconvert;
-use Apache::lonxml;
+use Apache::lonfeedback;
+use Apache::lonhtmlgateway;
+use Apache::lonlocal;
+use Apache::lonhtmlcommon;
+use Apache::longroup;
+use Apache::lonnavmaps;
+use HTML::Entities();
+use LONCAPA;
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;
+ my $target=$env{'form.grade_target'};
# ------------------------------------------------------------ Print the screen
- $r->print(<
-
-The LearningOnline Network with CAPA
-
-ENDDOCUMENT
+ if ($target eq 'tex') {
+ $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}));
+ }
my (undef,undef,undef,undef,$marker)=split(/\//,$r->uri);
# Is this even in a course?
- unless ($ENV{'request.course.id'}) {
- $r->print('Not in a course');
+ if (!$env{'request.course.id'}) {
+ &Apache::loncommon::simple_error_page($r,'Not in a course',
+ 'Not in a course');
return OK;
}
$marker=~s/\D//g;
- unless ($marker) {
- $r->print('Invalid call');
+ if (!$marker) {
+ &Apache::loncommon::simple_error_page($r,'Invalid Call',
+ 'Invalid Call');
return OK;
}
- my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
- my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my ($group,$grp_desc);
# --------------------------------------------------------- The syllabus fields
- my %syllabusfields=(
+ my %syllabusfields=&Apache::lonlocal::texthash(
'aaa_title' => 'Topic',
'bbb_content' => 'Task',
'ccc_webreferences' => 'Web References');
-# --------------------------------------------------------------- Force Student
+# ------------------------------------------------------------ Get Query String
&Apache::loncommon::get_unprocessed_cgi
- ($ENV{'QUERY_STRING'},['forcestudent']);
- my $forcestudent='';
- if ($ENV{'form.forcestudent'}) { $forcestudent='student'; };
+ ($ENV{'QUERY_STRING'},['forceedit','register','todocs',
+ 'origpage','group','ref']);
+# ----------------------------------------------------- Force menu registration
+ my %addentries;
+ if ($env{'form.origpage'}) {
+ $addentries{'onload'} = "document.location='#newpost';";
+ }
+# --------------------------------------------------------------- Force Student
+ my ($forceedit,$forcestudent);
+ $forceedit = $env{'form.forceedit'};
+ if (!$forceedit) {
+ $forcestudent=1;
+ }
+ my $refarg = '';
+ if (exists($env{'form.ref'})) { $refarg = 'ref='.$env{'form.ref'}; }
my %syllabus=&Apache::lonnet::dump('bulletinpage_'.$marker,$dom,$crs);
-
-# --------------------------------------- There is such a user, get environment
- $r->print(&Apache::loncommon::bodytag
- ("Bulletin Board/Discussion",$forcestudent,'','',$dom));
+ my $boardurl = $r->uri;
+ if ($boardurl =~ m|/adm/\Q$dom\E/\Q$crs\E/\d+/bulletinboard|) {
+ if (!exists($syllabus{'group'})) {
+ &Apache::loncommon::simple_error_page($r,'Group information missing',
+ 'Group information missing');
+
+ return OK;
+ } else {
+ $group = $syllabus{'group'};
+ if ($group eq '') {
+ &Apache::loncommon::simple_error_page($r,'Invalid group',
+ 'Invalid group');
+ return OK;
+ }
+ my %curr_groups = &Apache::longroup::coursegroups($dom,$crs,$group);
+ if (!defined($curr_groups{$group})) {
+ &Apache::loncommon::simple_error_page($r,'Invalid group',
+ 'Invalid group');
+ return OK;
+ } else {
+ my %content = &Apache::longroup::get_group_settings(
+ $curr_groups{$group});
+ $grp_desc = &unescape($content{'description'});
+ }
+ }
+ }
- my $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'});
+# --------------------------------------- There is such a user, get environment
+ if ($target ne 'tex') {
+ my ($course_or_group,$brcrum);
+ if($group eq '') {
+ $course_or_group="Course";
+ } else {
+ $course_or_group="Group";
+ }
+ my $registered;
+ if ($group ne '' && $env{'form.group'} eq $group) {
+ unless ($env{'form.ref'} eq 'grouplist') {
+ $registered = $env{'form.register'};
+ }
+ my $gpterm = &Apache::loncommon::group_term();
+ my $ucgpterm = $gpterm;
+ $ucgpterm =~ s/^(\w)/uc($1)/e;
+ my ($groupboards,$boards) =
+ &Apache::longroup::get_group_bbinfo($dom,$crs,$group,$boardurl);
+ my $boardtitle;
+ if ((ref($groupboards) eq 'ARRAY') && (@{$groupboards} > 0)) {
+ $boardtitle = $$boards{$$groupboards[0]}{'title'};
+ }
+ $boardurl .= '?group='.$group;
+ if ($registered) {
+ $boardurl .= '®ister='.$env{'form.register'};
+ } else {
+ $brcrum =
+ &groupboard_breadcrumbs($dom,$crs,$group,$refarg,$gpterm,
+ $ucgpterm,$grp_desc,$boardurl,
+ $boardtitle);
+ }
+ } else {
+ $registered = $env{'form.register'};
+ $brcrum = [];
+ }
+ my $start_page =
+ &Apache::loncommon::start_page("$course_or_group Discussion Board",undef,
+ {'add_entries' => \%addentries,
+ 'domain' => $dom,
+ 'bread_crumbs' => $brcrum,
+ 'group' => $group,
+ 'force_register' => $registered}
+ );
+ $r->print($start_page);
+ }
+ my ($allowed);
+ if ($group ne '') {
+ $allowed=&Apache::lonnet::allowed('mdg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
+ if (!$allowed) {
+ $allowed = &Apache::lonnet::allowed('cgb',$env{'request.course.id'}.
+ '/'.$group);
+ }
+ if (!$allowed) {
+ if ((!&Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) &&
+ (!&Apache::lonnet::allowed('vgb',$env{'request.course.id'}.
+ '/'.$group))) {
+ &print_end_page($r,$target);
+ return OK;
+ }
+ }
+ } else {
+ $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+ }
+
+ if ($forcestudent or $target eq 'tex') { $allowed=0; }
- if ($forcestudent) { $allowed=0; }
-
- if ($allowed) {
- $r->print(
- 'Show Public View
');
- }
- if (($ENV{'form.uploaddoc.filename'}) &&
- ($ENV{'form.storeupl'}) && ($allowed)) {
- if ($ENV{'form.uploaddoc.filename'}=~/\.(gif|jpg|png|jpeg)$/) {
- $syllabus{'uploaded.photourl'}=
- &Apache::lonnet::userfileupload('uploaddoc',1);
- }
- $syllabus{'uploaded.lastmodified'}=time;
- &Apache::lonnet::put('bulletinpage_'.$marker,\%syllabus,$dom,$crs);
- }
- if (($allowed) && ($ENV{'form.storesyl'})) {
- foreach (keys %syllabusfields) {
- my $field=$ENV{'form.'.$_};
- $field=~s/\s+$//s;
- $field=~s/\\<\;/g;
- $field=~s/\>/\>\;/g;
- $syllabus{$_}=$field;
- }
- $syllabus{'uploaded.lastmodified'}=time;
- &Apache::lonnet::put('bulletinpage_'.$marker,\%syllabus,$dom,$crs);
- }
+ if (($env{'form.uploaddoc.filename'}) &&
+ ($env{'form.storeupl'}) && ($allowed)) {
+ if ($env{'form.uploaddoc.filename'}=~/\.(gif|jpg|png|jpeg)$/i) {
+ if ($syllabus{'uploaded.photourl'}) {
+ &Apache::lonnet::removeuploadedurl($syllabus{'uploaded.photourl'});
+ }
+ if ($group ne '') {
+ $syllabus{'uploaded.photourl'}=
+ &Apache::lonnet::userfileupload('uploaddoc','coursedoc',
+ 'bulletin/'.$group.'/'.$marker);
+ } else {
+ $syllabus{'uploaded.photourl'}=
+ &Apache::lonnet::userfileupload('uploaddoc','coursedoc',
+ 'bulletin/'.$marker);
+ }
+ }
+ $syllabus{'uploaded.lastmodified'}=time;
+ &Apache::lonnet::put('bulletinpage_'.$marker,\%syllabus,$dom,$crs);
+ }
+ if (($allowed) && ($env{'form.storesyl'})) {
+ foreach my $syl_field (keys(%syllabusfields)) {
+ my $field=$env{'form.'.$syl_field};
+ chomp($field);
+ my $gateway = Apache::lonhtmlgateway->new();
+ $field = $gateway->process_incoming_html($field,1);
+ $syllabus{$syl_field}=$field;
+ }
+ $syllabus{'uploaded.lastmodified'}=time;
+ &Apache::lonnet::put('bulletinpage_'.$marker,\%syllabus,$dom,$crs);
+ }
-# ---------------------------------------------------------------- Get syllabus
+# ---------------------------------------------------------------- Get discussion board
if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) {
- if ($syllabus{'uploaded.photourl'}) {
- $r->print(' ');
- }
- if ($allowed) {
- $r->print(
- '');
- }
- $r->print('
');
+ #Print Topic as Heading
+ my $titletext=&HTML::Entities::encode($syllabus{'aaa_title'},'<>&"');;
+ if ($target ne 'tex') {
+ $r->print(''.$titletext.' ');
+ } else {
+ $r->print('\\\\\textbf{'.&Apache::lonxml::xmlparse($r,'tex',$titletext).'}\\\\');
+ }
+ #Outputbox and Inputbox for Topic
+ if ($allowed) {
+ $r->print('');
+ &Apache::lontemplate::print_start_template($r,&mt('Title'),'LC_Box');
+ $r->print($titletext);
+ $r->print("");
+ &Apache::lontemplate::print_textarea_template($r, $syllabus{'aaa_title'},
+ 'aaa_title', $syllabusfields{'aaa_title'},
+ Apache::lontemplate->RICH_TEXT_ALWAYS_OFF);
+ &Apache::lontemplate::print_saveall_template($r);
+ $r->print("
");
+ &Apache::lontemplate::print_end_template($r);
+ }
+ if ($syllabus{'uploaded.photourl'}) {
+ &Apache::lonnet::allowuploaded('/adm/syllabus',
+ $syllabus{'uploaded.photourl'});
+ }
+ #Outputbox and Inputbox for Image upload
+ if ($allowed) {
+ my $message = ' ';
+ &Apache::lontemplate::print_start_template($r, &mt('Upload a Photo'),'LC_Box');
+ $r->print($message);
+ $r->print(" ");
+ $r->print(
+ ' '.
+ ' '.
+ ' ');
+ &Apache::lontemplate::print_end_template($r);
+ }
+ #Image in Student view.
+ elsif($syllabus{'uploaded.photourl'} && $target ne 'tex'){
+ $r->print(' ');
+ }
+
+ my %custom_handlers = ( 'aaa_title' => sub {} );
+ &Apache::lontemplate::print_template_fields($r, \%syllabus, \%syllabusfields,
+ $target, $allowed, Apache::lontemplate->RICH_TEXT_DETECT_HTML, \%custom_handlers);
+ if ($allowed) {
+ $r->print(' ');
+ }
+ if ($target ne 'tex'){
+ $r->print(' ');
+ }
+ else {
+ $r->print(&Apache::lonxml::xmlparse($r,'tex',' '));
+ }
+ } else {
+ if ($target ne 'tex') {
+ $r->print(''.&mt('No page information provided.').'
');
+ }
+ }
+ #Lists discussion posts and box for a new discussion post.
+ if ($target ne 'tex') {
+ $r->print(&Apache::lonfeedback::list_discussion
+ ('board','OPEN','bulletin___'.$marker.'___'.
+ $r->uri,undef,$group));
} else {
- $r->print('No page information provided.
');
+ $r->print('\\\\'.&Apache::lonxml::xmlparse($r,'tex',&Apache::lonfeedback::list_discussion
+ ('board','OPEN','bulletin___'.$marker.'___'.
+ $r->uri,undef,$group)));
}
- $r->print(&Apache::lonxml::xmlend(1,'bulletin___'.$marker.'___'.
- 'adm/wrapper'.$r->uri).'