diff --git a/docs/upgrades/upgrade_3.8.0-3.9.0.sql b/docs/upgrades/upgrade_3.8.0-3.9.0.sql
index aed7659a6..14a8879a6 100644
--- a/docs/upgrades/upgrade_3.8.0-3.9.0.sql
+++ b/docs/upgrades/upgrade_3.8.0-3.9.0.sql
@@ -47,6 +47,22 @@ update wobject set templatePosition=0 where templatePosition='A';
update wobject set templatePosition=1 where templatePosition='B';
update wobject set templatePosition=2 where templatePosition='C';
update wobject set templatePosition=3 where templatePosition='D';
+alter table UserSubmission add column allowDiscussion int not null default 0;
+alter table UserSubmission add column editTimeout int not null default 1;
+alter table UserSubmission add column groupToPost int not null default 2;
+alter table UserSubmission add column groupToApprove int not null default 4;
+INSERT INTO international VALUES (39,'UserSubmission','English','Post a Reply');
+INSERT INTO international VALUES (40,'UserSubmission','English','Posted By');
+INSERT INTO international VALUES (41,'UserSubmission','English','Date');
+INSERT INTO international VALUES (42,'UserSubmission','English','Edit Response');
+INSERT INTO international VALUES (43,'UserSubmission','English','Delete Response');
+INSERT INTO international VALUES (45,'UserSubmission','English','Return to Submission');
+INSERT INTO international VALUES (46,'UserSubmission','English','View Responses');
+INSERT INTO international VALUES (47,'UserSubmission','English','Post a Response');
+INSERT INTO international VALUES (48,'UserSubmission','English','Allow discussion?');
+INSERT INTO international VALUES (49,'UserSubmission','English','Edit Timeout');
+INSERT INTO international VALUES (50,'UserSubmission','English','Group To Post');
+INSERT INTO international VALUES (44,'UserSubmission','English','Group To Moderate');
diff --git a/lib/WebGUI/Wobject/UserSubmission.pm b/lib/WebGUI/Wobject/UserSubmission.pm
index 11556baac..f860b5919 100644
--- a/lib/WebGUI/Wobject/UserSubmission.pm
+++ b/lib/WebGUI/Wobject/UserSubmission.pm
@@ -14,6 +14,7 @@ use strict;
use Tie::CPHash;
use WebGUI::Attachment;
use WebGUI::DateTime;
+use WebGUI::Discussion;
use WebGUI::HTML;
use WebGUI::HTMLForm;
use WebGUI::Icon;
@@ -32,6 +33,49 @@ our @ISA = qw(WebGUI::Wobject);
our $namespace = "UserSubmission";
our $name = WebGUI::International::get(29,$namespace);
+#-------------------------------------------------------------------
+sub _canEditMessage {
+ my (%message);
+ tie %message, 'Tie::CPHash';
+ %message = WebGUI::Discussion::getMessage($_[1]);
+ if (
+ (time()-$message{dateOfPost}) < 3600*$_[0]->get("editTimeout")
+ && $message{userId} eq $session{user}{userId}
+ || WebGUI::Privilege::isInGroup($_[0]->get("groupToModerate"))
+ ) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+#-------------------------------------------------------------------
+sub _showReplies {
+ my ($sth, @data, $html);
+ $html .= '
';
+ $html .= '
+
+
';
+ $sth = WebGUI::SQL->read("select messageId,subject,username,dateOfPost,userId from discussion
+ where wobjectId=$session{form}{wid} and subId=$session{form}{sid} and pid=0 order by messageId desc");
+ while (@data = $sth->array) {
+ $data[1] = WebGUI::HTML::filter($data[1],'all');
+ $html .= ''.substr($data[1],0,30).
+ '| '.$data[2].
+ ' | '.epochToHuman($data[3],"%z %Z").
+ ' |
';
+ $html .= WebGUI::Discussion::traverseReplyTree($data[0],1);
+ }
+ $html .= '
';
+ return $html;
+}
+
#-------------------------------------------------------------------
sub duplicate {
my ($sth, $file, @row, $newSubmissionId, $w);
@@ -41,7 +85,11 @@ sub duplicate {
groupToContribute=>$_[0]->get("groupToContribute"),
submissionsPerPage=>$_[0]->get("submissionsPerPage"),
defaultStatus=>$_[0]->get("defaultStatus"),
- groupToApprove=>$_[0]->get("groupToApprove")
+ groupToApprove=>$_[0]->get("groupToApprove"),
+ allowDiscussion=>$_[0]->get("allowDiscussion"),
+ editTimeout=>$_[0]->get("editTimeout"),
+ groupToPost=>$_[0]->get("groupToPost"),
+ groupToModerate=>$_[0]->get("groupToModerate")
});
$sth = WebGUI::SQL->read("select * from UserSubmission_submission where wobjectId=".$_[0]->get("wobjectId"));
while (@row = $sth->array) {
@@ -72,7 +120,8 @@ sub purge {
#-------------------------------------------------------------------
sub set {
- $_[0]->SUPER::set($_[1],[qw(submissionsPerPage groupToContribute groupToApprove defaultStatus)]);
+ $_[0]->SUPER::set($_[1],[qw(submissionsPerPage groupToContribute groupToApprove defaultStatus groupToModerate
+ groupToPost editTimeout allowDiscussion)]);
}
#-------------------------------------------------------------------
@@ -125,6 +174,24 @@ sub www_deleteImage {
}
}
+#-------------------------------------------------------------------
+sub www_deleteMessage {
+ if (_canEditMessage($_[0],$session{form}{mid})) {
+ return WebGUI::Discussion::deleteMessage();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_deleteMessageConfirm {
+ if (_canEditMessage($_[0],$session{form}{mid})) {
+ return WebGUI::Discussion::deleteMessageConfirm();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
#-------------------------------------------------------------------
sub www_deleteSubmission {
my ($output, $owner);
@@ -173,9 +240,10 @@ sub www_denySubmission {
#-------------------------------------------------------------------
sub www_edit {
- my ($output, %hash, $f, $defaultStatus, $submissionsPerPage, $groupToApprove);
+ my ($output, %hash, $f, $defaultStatus, $submissionsPerPage, $groupToApprove, $groupToModerate);
tie %hash, 'Tie::IxHash';
$groupToApprove = $_[0]->get("groupToApprove") || 4;
+ $groupToModerate = $_[0]->get("groupToModerate") || 4;
$submissionsPerPage = $_[0]->get("submissionsPerPage") || 50;
$defaultStatus = $_[0]->get("defaultStatus") || "Approved";
if (WebGUI::Privilege::canEditPage()) {
@@ -189,6 +257,10 @@ sub www_edit {
"Denied"=>WebGUI::International::get(8,$namespace),
"Pending"=>WebGUI::International::get(9,$namespace));
$f->select("defaultStatus",\%hash,WebGUI::International::get(10,$namespace),[$defaultStatus]);
+ $f->yesNo("allowDiscussion",WebGUI::International::get(48,$namespace),$_[0]->get("allowDiscussion"));
+ $f->integer("editTimeout",WebGUI::International::get(49,$namespace),$_[0]->get("editTimeout"));
+ $f->group("groupToPost",WebGUI::International::get(50,$namespace),[$_[0]->get("groupToPost")]);
+ $f->group("groupToModerate",WebGUI::International::get(44,$namespace),[$groupToModerate]);
$output .= $_[0]->SUPER::www_edit($f->printRowsOnly);
return $output;
} else {
@@ -204,7 +276,11 @@ sub www_editSave {
submissionsPerPage=>$session{form}{submissionsPerPage},
groupToContribute=>$session{form}{groupToContribute},
groupToApprove=>$session{form}{groupToApprove},
- defaultStatus=>$session{form}{defaultStatus}
+ defaultStatus=>$session{form}{defaultStatus},
+ groupToModerate=>$session{form}{groupToModerate},
+ groupToPost=>$session{form}{groupToPost},
+ editTimeout=>$session{form}{editTimeout},
+ allowDiscussion=>$session{form}{allowDiscussion}
});
return "";
} else {
@@ -212,6 +288,25 @@ sub www_editSave {
}
}
+#-------------------------------------------------------------------
+sub www_editMessage {
+ if (_canEditMessage($_[0],$session{form}{mid})) {
+ return WebGUI::Discussion::editMessage();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_editMessageSave {
+ if (_canEditMessage($_[0],$session{form}{mid})) {
+ WebGUI::Discussion::editMessageSave();
+ return $_[0]->www_showMessage();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
#-------------------------------------------------------------------
sub www_editSubmission {
my ($output, %submission, $f, @submission, $sth);
@@ -296,6 +391,82 @@ sub www_editSubmissionSave {
}
}
+#-------------------------------------------------------------------
+sub www_postNewMessage {
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToPost"),$session{user}{userId})) {
+ return WebGUI::Discussion::postNewMessage();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_postNewMessageSave {
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToPost"),$session{user}{userId})) {
+ WebGUI::Discussion::postNewMessageSave();
+ return $_[0]->www_viewSubmission();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_postReply {
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToPost"),$session{user}{userId})) {
+ return WebGUI::Discussion::postReply();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_postReplySave {
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToPost"),$session{user}{userId})) {
+ WebGUI::Discussion::postReplySave();
+ return $_[0]->www_showMessage();
+ } else {
+ return WebGUI::Privilege::insufficient();
+ }
+}
+
+#-------------------------------------------------------------------
+sub www_showMessage {
+ my (@data, $html, %message, $defaultMid);
+ tie %message, 'Tie::CPHash';
+ ($defaultMid) = WebGUI::SQL->quickArray("select min(messageId) from discussion where wobjectId=$session{form}{wid} and subId=$session{form}{sid}");
+ $session{form}{mid} = $defaultMid if ($session{form}{mid} eq "");
+ %message = WebGUI::Discussion::getMessage($session{form}{mid});
+ if ($message{messageId}) {
+ $html .= ''.$message{subject}.'
';
+ $html .= '';
+ $html .= '
| ';
+ $html .= $message{message};
+ $html .= ' |
';
+ $html .= _showReplies();
+ } else {
+ $html = WebGUI::International::get(402);
+ }
+ return $html;
+}
+
#-------------------------------------------------------------------
sub www_view {
my (@submission, $output, $sth, @row, $i, $p);
@@ -330,7 +501,7 @@ sub www_view {
#-------------------------------------------------------------------
sub www_viewSubmission {
- my ($output, %submission, $file);
+ my ($output, %submission, $file, $replies);
tie %submission, 'Tie::CPHash';
%submission = WebGUI::SQL->quickHash("select * from UserSubmission_submission where submissionId=$session{form}{sid}");
$submission{title} = WebGUI::HTML::filter($submission{title},'all');
@@ -345,7 +516,6 @@ sub www_viewSubmission {
$output .= ''.WebGUI::International::get(14,$namespace).': '.$submission{status};
$output .= '| ';
#---content
if ($submission{image} ne "") {
@@ -377,6 +552,18 @@ sub www_viewSubmission {
$output .= $file->box;
}
$output .= ' |
';
+ if ($_[0]->get("allowDiscussion")) {
+ ($replies) = WebGUI::SQL->quickArray("select count(*) from discussion
+ where wobjectId=".$_[0]->get("wobjectId")." and subId=".$session{form}{sid});
+ $output .= '';
+ $output .= '';
+ $output .= '
';
+ $output .= '
';
+ }
return $output;
}