migrated the uss to the collaboration system

This commit is contained in:
JT Smith 2005-02-13 01:38:37 +00:00
parent 28730f7e36
commit 268c1cd8ba
6 changed files with 154 additions and 4267 deletions

View file

@ -6,6 +6,7 @@ use File::Path;
use File::Copy;
use Getopt::Long;
use strict;
use WebGUI::Group;
use WebGUI::HTML;
use WebGUI::Id;
use WebGUI::Session;
@ -46,6 +47,15 @@ foreach my $key (%threadTemplates) {
WebGUI::SQL::write("insert into template (templateId, namespace, template, name) values (".quote(WebGUI::Id::generate()).", 'Forum/Thread',
".quote($threadTemplates{$key}).", ".quote($key).")");
}
WebGUI::SQL->write("update template set templateId='25' where templateId='1' and namespace in ('Forum','Forum/Thread','Forum/PostForm')");
WebGUI::SQL->write("update forum set forumTemplateId='25' where forumTemplateId='1'");
WebGUI::SQL->write("update forum set postFormTemplateId='25' where postFormTemplateId='1'");
WebGUI::SQL->write("update forum set threadTemplateId='25' where threadTemplateId='1'");
WebGUI::SQL->write("update template set templateId=concat('NNN',templateId) where templateId like '10%' and namespace in ('Forum','Forum/Thread','Forum/PostForm')");
WebGUI::SQL->write("update forum set forumTemplateId=concat('NNN',forumTemplateId) where forumTemplateId like '10%'");
WebGUI::SQL->write("update forum set postFormTemplateId=concat('NNN',postFormTemplateId) where postFormTemplateId like '10%'");
WebGUI::SQL->write("update forum set threadTemplateId=concat('NNN',threadTemplateId) where threadTemplateId like '10%'");
print "\tFixing navigation template variables.\n" unless ($quiet);
@ -79,7 +89,7 @@ WebGUI::SQL->write("delete from settings where name in ('siteicon','favicon')");
print "\tMigrating wobject templates to asset templates.\n" unless ($quiet);
my $sth = WebGUI::SQL->read("select templateId, template, namespace from template where namespace in ('Article',
'USS', 'SyndicatedContent', 'MessageBoard', 'DataForm', 'EventsCalendar', 'HttpProxy', 'Poll', 'Product', 'WobjectProxy',
'SyndicatedContent', 'MessageBoard', 'DataForm', 'EventsCalendar', 'HttpProxy', 'Poll', 'Product', 'WobjectProxy',
'IndexedSearch', 'SQLReport', 'Survey', 'WSClient')");
while (my $t = $sth->hashRef) {
$t->{template} = '<a name="<tmpl_var assetId>"></a>
@ -211,17 +221,6 @@ WebGUI::SQL->write("alter table DataForm_entry drop column wobjectId");
WebGUI::SQL->write("alter table DataForm_entryData drop column wobjectId");
WebGUI::SQL->write("alter table DataForm_field drop column wobjectId");
WebGUI::SQL->write("alter table DataForm_tab drop column wobjectId");
WebGUI::SQL->write("alter table USS_submission drop column forumId");
WebGUI::SQL->write("alter table USS_submission drop column sequenceNumber");
WebGUI::SQL->write("alter table USS_submission drop column startDate");
WebGUI::SQL->write("alter table USS_submission drop column title");
WebGUI::SQL->write("alter table USS_submission drop column USS_id");
WebGUI::SQL->write("alter table USS_submission drop column endDate");
WebGUI::SQL->write("alter table USS_submission drop column USS_submissionId");
WebGUI::SQL->write("alter table USS_submission drop column pageId");
WebGUI::SQL->write("alter table USS_submission drop column image");
WebGUI::SQL->write("alter table USS_submission drop column attachment");
WebGUI::SQL->write("alter table USS_submission add primary key (assetId)");
WebGUI::SQL->write("alter table Product_accessory drop column wobjectId");
WebGUI::SQL->write("alter table Product_benefit drop column wobjectId");
WebGUI::SQL->write("alter table Product_feature drop column wobjectId");
@ -238,6 +237,8 @@ WebGUI::SQL->write("drop table forumSubscription");
WebGUI::SQL->write("drop table forumThread");
WebGUI::SQL->write("drop table forumThreadSubscription");
WebGUI::SQL->write("drop table MessageBoard_forums");
WebGUI::SQL->write("drop table USS");
WebGUI::SQL->write("drop table USS_submission");
# start migrating non-wobject stuff into assets
my %migration;
@ -574,7 +575,7 @@ WebGUI::SQL->write("alter table template drop primary key");
WebGUI::SQL->write("alter table template drop column templateId");
WebGUI::SQL->write("alter table template drop column name");
WebGUI::SQL->write("alter table template add primary key (assetId)");
my @wobjectTypes = qw(Article Poll Survey USS WSClient DataForm Layout EventsCalendar Navigation HttpProxy IndexedSearch MessageBoard Product SQLReport SyndicatedContent Shortcut);
my @wobjectTypes = qw(Article Poll Survey WSClient DataForm Layout EventsCalendar Navigation HttpProxy IndexedSearch MessageBoard Product SQLReport SyndicatedContent Shortcut);
my @allWobjectTypes = (@wobjectTypes,@otherWobjects);
print "\t\tMigrating wobject templates to new IDs\n" unless ($quiet);
foreach my $type (@allWobjectTypes) {
@ -609,13 +610,16 @@ while (my ($assetId, $emailId, $ackId, $listId) = $sth->array) {
});
}
$sth->finish;
print "\t\tMigrating USS templates to new IDs\n" unless ($quiet);
my $sth = WebGUI::SQL->read("select assetId, submissionTemplateId, submissionFormTemplateId from USS");
while (my ($assetId, $subId, $formId) = $sth->array) {
WebGUI::SQL->setRow("USS","assetId",{
print "\t\tMigrating Collaboration templates to new IDs\n" unless ($quiet);
my $sth = WebGUI::SQL->read("select assetId, collaborationTemplateId, postFormTemplateId, threadTemplateId, searchTemplateId, notificationTemplateId from Collaboration");
while (my ($assetId, $collabId, $formId, $threadId, $searchId, $notId) = $sth->array) {
WebGUI::SQL->setRow("Collaboration","assetId",{
assetId=>$assetId,
submissionTemplateId=>$templateCache{"USS/Submission"}{$subId},
submissionFormTemplateId=>$templateCache{"USS/SubmissionForm"}{$formId}
collaborationTemplateId=>$templateCache{"Collaboration"}{$collabId},
searchTemplateId=>$templateCache{"Collaboration/Search"}{$searchId},
threadTemplateId=>$templateCache{"Collaboration/Thread"}{$threadId},
notificationTemplateId=>$templateCache{"Collaboration/Notification"}{$notId},
postFormTemplateId=>$templateCache{"Collaboration/PostForm"}{$formId}
});
}
print "\t\tMigrating Shortcut templates to new IDs\n" unless ($quiet);
@ -1130,7 +1134,7 @@ sub walkTree {
print "\t\t\tConverting File Manager ".$wobject->{wobjectId}." into File Folder Layout\n" unless ($quiet);
WebGUI::SQL->write("update asset set className='WebGUI::Asset::Layout' where assetId=".quote($wobjectId));
WebGUI::SQL->write("insert into Layout (assetId,templateId) values (".quote($wobjectId).", '15')");
WebGUI::SQL->write("update wobject set namespace='Layout' where wobjectId=".quote($wobjectId));
WebGUI::SQL->write("update wobject set namespace='Layout' where wobjectId=".quote($wobject->{wobjectId}));
print "\t\t\tMigrating attachments for File Manager ".$wobject->{wobjectId}."\n" unless ($quiet);
my $sth = WebGUI::SQL->read("select * from FileManager_file where wobjectId=".quote($wobjectId)." order by sequenceNumber");
my $rank = 1;
@ -1205,17 +1209,50 @@ sub walkTree {
WebGUI::SQL->write("update $table set assetId=".quote($wobjectId)." where wobjectId=".quote($wobject->{wobjectId}));
}
} elsif ($wobject->{namespace} eq "USS") {
print "\t\t\tConverting USS to collaboration system ".$wobject->{wobjectId}."\n" unless ($quiet);
WebGUI::SQL->write("update asset set className='WebGUI::Asset::Wobject::Collaboration' where assetId=".quote($wobjectId));
my $moderate = ($namespace->{defaultStatus} eq 'Approved') ? 0 : 1;
my $master = WebGUI::SQL->quickHashRef("select * from forum where forumId=".quote($wobject->{forumId}));
my $sg = WebGUI::Group->new("new");
$sg->description("The group to store subscriptions for the collaboration system $wobjectId");
$sg->name($wobjectId);
$sg->showInForms(0);
$sg->isEditable(0);
$sg->deleteGroups(['3']);
WebGUI::SQL->write("insert into Collaboration (assetId,postGroupId,moderateGroupId,moderatePosts,karmaPerPost,
collaborationTemplateId, threadTemplateId, postFormTemplateId, searchTemplateId, notificationTemplateId,
sortBy, sortOrder, usePreview, addEditStampToPosts, editTimeout, attachmentsPerPost, allowRichEdit, filterCode,
useContentFilter, rating, archiveAfter, postsPerPage, threadsPerPage, subscriptionGroupId,
allowReplies) values (".quote($wobjectId).", ".quote($namespace->{groupToContribute}).",
".quote($namespace->{groupToApprove}).", $moderate, ".quote($namespace->{karmaPerSubmission}).",
".quote($wobject->{templateId}).", ".quote($namespace->{submissionTemplateId}).",
".quote($namespace->{submissionFormTemplateId}).", ".quote($master->{searchTemplateId}||1).",
".quote($master->{notificationTemplateId}||1)." , ".quote($namespace->{sortBy}).",
".quote($namespace->{sortOrder}).", 0, 0, 931536000, 2, 1, ".quote($namespace->{filterContent}).",
0, 0, ".quote($master->{archiveAfter}||31536000).", ".quote($master->{postsPerPage}||10).",
".quote($namespace->{submissionsPerPage}).", ".quote($sg->groupId).",
".quote($wobject->{allowDiscussion}).")");
#count threads, views, replies
#find last post
WebGUI::SQL->write("update wobject set namespace='Collaboration' where wobjectId=".quote($wobject->{wobjectId}));
print "\t\t\tMigrating submissions for USS ".$wobject->{wobjectId}."\n" unless ($quiet);
my ($ussId) = WebGUI::SQL->quickArray("select USS_id from USS where wobjectId=".quote($wobject->{wobjectId}));
my $ussId = $namespace->{USS_id};
my $sth = WebGUI::SQL->read("select * from USS_submission where USS_id=".quote($ussId));
my $usssubrank = 1;
my $collabReplyCounter;
my $collabViewCounter;
my $collabThreadCounter;
my %oldestForumPost;
while (my $submission = $sth->hashRef) {
$collabThreadCounter++;
$collabViewCounter += $submission->{views};
print "\t\t\t\tMigrating submission ".$submission->{USS_submissionId}."\n" unless ($quiet);
my $body = $submission->{content};
$body =~ s/\n/\^\-\;/ unless ($body =~ m/\^\-\;/);
my @content = split(/\^\-\;/,$body);
$content[0] = WebGUI::HTML::filter($content[0],"none");
$body =~ s/\^\-\;/\n/;
my $threadLineage = $wobjectLineage.sprintf("%06d",$usssubrank);
my $id = WebGUI::SQL->setRow("asset","assetId",{
assetId => "new",
title => $submission->{title},
@ -1231,15 +1268,98 @@ sub walkTree {
synopsis=>$content[0],
assetSize=>length($submission->{content}),
parentId=>$wobjectId,
lineage=>$wobjectLineage.sprintf("%06d",$usssubrank),
lineage=>$threadLineage,
isHidden => 1
});
WebGUI::SQL->write("update USS_submission set content=".quote($body).",
assetId=".quote($id)." where USS_submissionId=".quote($submission->{USS_submissionId}));
WebGUI::SQL->setRow("Post","assetId",{
assetId=>$id,
threadId=>$id,
dateSubmitted=>$submission->{dateSubmitted},
dateUpdated=>$submission->{dateUpdated},
username=>$submission->{username},
content=>$body,
status=>lc($submission->{status}),
views=>$submission->{views},
contentType=>$submission->{contentType},
rating=>0
},undef,$id);
my $threadSubscriptionGroup = WebGUI::Group->new("new");
$threadSubscriptionGroup->description("The group to store subscriptions for the thread $id");
$threadSubscriptionGroup->name($id);
$threadSubscriptionGroup->showInForms(0);
$threadSubscriptionGroup->isEditable(0);
$threadSubscriptionGroup->deleteGroups(['3']);
WebGUI::SQL->setRow("Thread","assetId",{
assetId=>$id,
isLocked=>0,
isSticky=>0,
subscriptionGroupId=>$threadSubscriptionGroup->groupId
}, undef, $id);
my %oldestThreadPost;
my $posts = WebGUI::SQL->read("select forumPost.* from forumPost left join forumThread on forumPost.forumThreadId=forumThread.forumThreadId where forumId=".quote($submission->{forumId}));
my $postRank = 1;
my $threadReplyCounter;
while (my $post = $posts->hashRef) {
$collabViewCounter += $post->{views};
$threadReplyCounter++;
my $postId = WebGUI::SQL->setRow("asset","assetId",{
assetId=>"new",
parentId=>$id,
lineage=>$threadLineage.sprintf("%06d",$postRank),
state=>'published',
className=>'WebGUI::Asset::Post',
title=>$post->{subject},
menuTitle=>$post->{subject},
url=>fixUrl("noneyet",$wobject->{title}.'/'.$submission->{title}.'/'.$post->{subject}),
startDate=>$submission->{startDate},
endDate=>$submission->{endDate},
ownerUserId=>$post->{userId},
groupIdView=>$page->{groupIdView},
groupIdEdit=>$page->{groupIdEdit},
isHidden=>1,
lastUpdated=>$post->{dateOfPost},
lastUpdatedBy=>$post->{userId}
});
if ($oldestThreadPost{date} < $post->{dateOfPost}) {
$oldestThreadPost{date} = $post->{dateOfPost};
$oldestThreadPost{id} = $postId;
}
WebGUI::SQL->setRow("Post","assetId",{
assetId=>$postId,
threadId=>$id,
dateSubmitted=>$post->{dateOfPost},
dateUpdated=>$post->{dateOfPost},
username=>$post->{username},
content=>$post->{message},
status=>$post->{status},
views=>$post->{views},
contentType=>$post->{contentType},
rating=>$post->{rating}
},undef,$postId);
$postRank++;
}
$posts->finish;
WebGUI::SQL->setRow("Thread","assetId",{
assetId=>$id,
lastPostId=>$oldestThreadPost{id},
lastPostDate=>$oldestThreadPost{date},
replies=>$threadReplyCounter
});
$usssubrank++;
$collabReplyCounter += $threadReplyCounter;
if ($oldestForumPost{date} < $oldestThreadPost{date}) {
$oldestForumPost{date} = $oldestThreadPost{date};
$oldestForumPost{id} = $oldestThreadPost{id};
}
}
# migrate master forum
# migrate submission forums
WebGUI::SQL->setRow("Collaboration","assetId",{
assetId=>$wobjectId,
lastPostId=>$oldestForumPost{id},
lastPostDate=>$oldestForumPost{date},
replies=>$collabReplyCounter,
views=>$collabViewCounter,
threads=>$collabThreadCounter
});
# migrate submission attachments
# migrate submission images
} elsif ($wobject->{namespace} eq "WobjectProxy") {
@ -1601,7 +1721,7 @@ sub getNewId {
'Operation/MessageLog/View' => {
'1' => 'PBtmpl0000000000000050'
},
'Forum/Search' => {
'Collaboration/Search' => {
'1' => 'PBtmpl0000000000000031'
},
'Auth/WebGUI/Account' => {
@ -1613,9 +1733,6 @@ sub getNewId {
'Operation/Profile/View' => {
'1' => 'PBtmpl0000000000000052'
},
'Forum/PostForm' => {
'1' => 'PBtmpl0000000000000029'
},
'Operation/RedeemSubscription' => {
'1' => 'PBtmpl0000000000000053'
},
@ -1650,9 +1767,6 @@ sub getNewId {
'AttachmentBox' => {
'1' => 'PBtmpl0000000000000003'
},
'Forum' => {
'1' => 'PBtmpl0000000000000026'
},
'Poll' => {
'1' => 'PBtmpl0000000000000055'
},
@ -1728,7 +1842,8 @@ sub getNewId {
'Macro/H_homeLink' => {
'1' => 'PBtmpl0000000000000042'
},
'USS' => {
'Collaboration' => {
'25' => 'PBtmpl0000000000000026',
'6' => 'PBtmpl0000000000000133',
'21' => 'PBtmpl0000000000000102',
'3' => 'PBtmpl0000000000000112',
@ -1740,7 +1855,6 @@ sub getNewId {
'4' => 'PBtmpl0000000000000121',
'1' => 'PBtmpl0000000000000066',
'18' => 'PBtmpl0000000000000082',
'1000' => 'PBtmpl0000000000000074',
'16' => 'PBtmpl0000000000000080',
'19' => 'PBtmpl0000000000000083',
'5' => 'PBtmpl0000000000000128'
@ -1807,7 +1921,8 @@ sub getNewId {
'Commerce/CheckoutCanceled' => {
'1' => 'PBtmpl0000000000000015'
},
'USS/Submission' => {
'Collaboration/Thread' => {
'25' => 'PBtmpl0000000000000032',
'1' => 'PBtmpl0000000000000067',
'3' => 'PBtmpl0000000000000113',
'2' => 'PBtmpl0000000000000098'
@ -1824,7 +1939,8 @@ sub getNewId {
'SyndicatedContent' => {
'1' => 'PBtmpl0000000000000065'
},
'USS/SubmissionForm' => {
'Collaboration/PostForm' => {
'25' => 'PBtmpl0000000000000029',
'4' => 'PBtmpl0000000000000122',
'1' => 'PBtmpl0000000000000068',
'3' => 'PBtmpl0000000000000114',
@ -1836,7 +1952,7 @@ sub getNewId {
'Macro/GroupAdd' => {
'1' => 'PBtmpl0000000000000040'
},
'Forum/Notification' => {
'Collaboration/Notification' => {
'1' => 'PBtmpl0000000000000027'
},
'Auth/LDAP/Login' => {
@ -1855,12 +1971,6 @@ sub getNewId {
'tinymce' => 'PBtmpl0000000000000138',
'5' => 'PBtmpl0000000000000126'
},
'Forum/Thread' => {
'1' => 'PBtmpl0000000000000032'
},
'Forum/Post' => {
'1' => 'PBtmpl0000000000000028'
},
'Macro/EditableToggle' => {
'1' => 'PBtmpl0000000000000038'
},

View file

@ -1,446 +0,0 @@
package WebGUI::Asset::Wobject::USS;
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2005 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
use strict;
use Tie::CPHash;
use WebGUI::DateTime;
use WebGUI::Grouping;
use WebGUI::HTML;
use WebGUI::HTTP;
use WebGUI::Icon;
use WebGUI::International;
use WebGUI::Paginator;
use WebGUI::Privilege;
use WebGUI::Search;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Style;
use WebGUI::URL;
use WebGUI::Utility;
use WebGUI::Asset::Wobject;
use WebGUI::Asset::USS_submission;
our @ISA = qw(WebGUI::Asset::Wobject);
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $definition = shift;
push(@{$definition}, {
tableName=>'USS',
className=>'WebGUI::Asset::Wobject::USS',
properties=>{
templateId =>{
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000066'
},
submissionsPerPage=>{
fieldType=>"integer",
defaultValue=>50
},
groupToContribute=>{
fieldType=>"group",
defaultValue=>2
},
groupToApprove=>{
fieldType=>"group",
defaultValue=>4
},
defaultStatus=>{
fieldType=>"selectList",
defaultValue=>"Approved"
},
submissionTemplateId=>{
fieldType=>"template",
defaultValue=>undef
},
submissionFormTemplateId=>{
fieldType=>"template",
defaultValue=>undef
},
karmaPerSubmission=>{
fieldType=>"integer",
defaultValue=>0
},
filterContent=>{
fieldType=>"filterContent",
defaultValue=>"javascript"
},
sortBy=>{
fieldType=>"selectList",
defaultValue=>"dateUpdated"
},
sortOrder=>{
fieldType=>"selectList",
defaultValue=>"desc"
},
USS_id=>{
fieldType=>"hidden",
autoId=>1
},
submissionFormTemplateId=>{
fieldType=>"template",
defaultValue=>undef
}
}
});
return $class->SUPER::definition($definition);
}
#-------------------------------------------------------------------
sub getEditForm {
my $self = shift;
my $tabform = $self->SUPER::getEditForm;
$tabform->getTab("display")->template(
-value=>$self->getValue('templateId'),
-namespace=>"USS"
);
$tabform->getTab("display")->template(
-name=>"submissionTemplateId",
-value=>$self->getValue("submissionTemplateId"),
-namespace=>"USS"."/Submission",
-label=>WebGUI::International::get(73,"USS"),
-afterEdit=>'func=edit&wid='.$self->get("wobjectId")
);
$tabform->getTab("display")->template(
-name=>"submissionFormTemplateId",
-value=>$self->getValue("submissionFormTemplateId"),
-namespace=>"USS"."/SubmissionForm",
-label=>WebGUI::International::get(87,"USS"),
-afterEdit=>'func=edit&wid='.$self->get("wobjectId")
);
$tabform->getTab("security")->group(
-name=>"groupToApprove",
-label=>WebGUI::International::get(1,"USS"),
-value=>[$self->getValue("groupToApprove")]
);
$tabform->getTab("security")->group(
-name=>"groupToContribute",
-label=>WebGUI::International::get(2,"USS"),
-value=>[$self->getValue("groupToContribute")]
);
$tabform->getTab("display")->integer(
-name=>"submissionsPerPage",
-label=>WebGUI::International::get(6,"USS"),
-value=>$self->getValue("submissionsPerPage")
);
$tabform->getTab("security")->selectList(
-name=>"defaultStatus",
-options=>{
Approved=>$self->status('Approved'),
Denied=>$self->status('Denied'),
Pending=>$self->status('Pending')
},
-label=>WebGUI::International::get(563),
-value=>[$self->getValue("defaultStatus")]
);
if ($session{setting}{useKarma}) {
$tabform->getTab("properties")->integer(
-name=>"karmaPerSubmission",
-label=>WebGUI::International::get(30,"USS"),
-value=>$self->getValue("karmaPerSubmission")
);
} else {
$tabform->getTab("properties")->hidden("karmaPerSubmission",$self->getValue("karmaPerSubmission"));
}
$tabform->getTab("display")->filterContent(
-value=>$self->getValue("filterContent")
);
$tabform->getTab("display")->selectList(
-name=>"sortBy",
-value=>[$self->getValue("sortBy")],
-options=>{
lineage=>WebGUI::International::get(88,"USS"),
dateUpdated=>WebGUI::International::get(78,"USS"),
dateSubmitted=>WebGUI::International::get(13,"USS"),
title=>WebGUI::International::get(35,"USS")
},
-label=>WebGUI::International::get(79,"USS")
);
$tabform->getTab("display")->selectList(
-name=>"sortOrder",
-value=>[$self->getValue("sortOrder")],
-options=>{
asc=>WebGUI::International::get(81,"USS"),
desc=>WebGUI::International::get(82,"USS")
},
-label=>WebGUI::International::get(80,"USS")
);
return $tabform;
}
#-------------------------------------------------------------------
sub getIcon {
my $self = shift;
my $small = shift;
return $session{config}{extrasURL}.'/assets/small/userSubmissionSystem.gif' if ($small);
return $session{config}{extrasURL}.'/assets/userSubmissionSystem.gif';
}
#-------------------------------------------------------------------
sub getIndexerParams {
my $self = shift;
my $now = shift;
return {
USS_discussion => {
sql => "select forumPost.forumPostId,
forumPost.username,
forumPost.subject,
forumPost.message,
forumPost.userId as ownerId,
forumThread.forumId as forumId,
USS_submission.USS_submissionId as sid,
wobject.namespace as namespace,
wobject.wobjectId as wid,
page.urlizedTitle as urlizedTitle,
page.languageId as languageId,
page.pageId as pageId,
page.groupIdView as page_groupIdView,
wobject.groupIdView as wobject_groupIdView,
7 as wobject_special_groupIdView
from forumPost, forumThread, USS_submission, wobject, page, USS
where forumPost.forumThreadId = forumThread.forumThreadId
and forumThread.forumId = USS_submission.forumId
and USS_submission.USS_id = USS.USS_id
and USS.wobjectId = wobject.wobjectId
and wobject.pageId = page.pageId
and wobject.startDate < $now
and wobject.endDate > $now
and page.startDate < $now
and page.endDate > $now",
fieldsToIndex => ["username", "subject", "message"],
contentType => 'discussion',
url => 'WebGUI::URL::append($data{urlizedTitle},"func=viewSubmission&wid=$data{wid}&sid=$data{sid}&forumOp=viewThread&forumPostId=$data{forumPostId}&forumId=$data{forumId}")',
headerShortcut => 'select subject from forumPost where forumPostId = \'$data{forumPostId}\'',
bodyShortcut => 'select message from forumPost where forumPostId = \'$data{forumPostId}\'',
},
USS_submission => {
sql => "select USS_submission.title as title,
USS_submission.username as username,
USS_submission.content as content,
USS_submission.image as image,
USS_submission.attachment as attachment,
USS.wobjectId as wid,
USS_submission.USS_submissionId as sid,
USS_submission.userId as ownerId,
wobject.namespace as namespace,
page.urlizedTitle as urlizedTitle,
page.languageId as languageId,
page.pageId as pageId,
page.groupIdView as page_groupIdView,
wobject.groupIdView as wobject_groupIdView,
7 as wobject_special_groupIdView
from wobject, page, USS_submission, USS
where USS_submission.USS_id = USS.USS_id
and USS.wobjectId = wobject.wobjectId
and wobject.pageId = page.pageId
and USS_submission.status = 'Approved'
and wobject.startDate < $now
and wobject.endDate > $now
and page.startDate < $now
and page.endDate > $now",
fieldsToIndex => ["username", "title", "content", "image", "attachment"],
contentType => 'wobjectDetail',
url => 'WebGUI::URL::append($data{urlizedTitle}, "func=viewSubmission&wid=$data{wid}&sid=$data{sid}")',
headerShortcut => 'select title from USS_submission where USS_submissionId = \'$data{sid}\'',
bodyShortcut => 'select content from USS_submission where USS_submissionId = \'$data{sid}\'',
}
};
}
#-------------------------------------------------------------------
sub getName {
return WebGUI::International::get(29,"USS");
}
#-------------------------------------------------------------------
sub status {
my $self = shift;
my $status = shift;
if ($status eq "Approved") {
return WebGUI::International::get(560);
} elsif ($status eq "Denied") {
return WebGUI::International::get(561);
} elsif ($status eq "Pending") {
return WebGUI::International::get(562);
}
}
#-------------------------------------------------------------------
sub view {
my $self = shift;
my $numResults = $self->get("submissionsPerPage");
my %var;
$var{"readmore.label"} = WebGUI::International::get(46,"USS");
$var{"responses.label"} = WebGUI::International::get(57,"USS");
$var{canPost} = WebGUI::Grouping::isInGroup($self->get("groupToContribute"));
$var{"post.url"} = $self->getUrl('func=add&class=WebGUI::Asset::USS_submission');
$var{"post.label"} = WebGUI::International::get(20,"USS");
$var{"addquestion.label"} = WebGUI::International::get(83,"USS");
$var{"addlink.label"} = WebGUI::International::get(89,"USS");
$var{"search.label"} = WebGUI::International::get(364);
$var{"search.Form"} = WebGUI::Search::form({func=>'view',search=>1});
$var{"search.url"} = WebGUI::Search::toggleURL("func=view");
$var{"rss.url"} = WebGUI::URL::page('func=viewRSS',1);
$var{canModerate} = WebGUI::Grouping::isInGroup($self->get("groupToApprove"),$session{user}{userId});
$var{"title.label"} = WebGUI::International::get(99);
$var{"thumbnail.label"} = WebGUI::International::get(52,"USS");
$var{"date.label"} = WebGUI::International::get(13,"USS");
$var{"date.updated.label"} = WebGUI::International::get(78,"USS");
$var{"by.label"} = WebGUI::International::get(21,"USS");
$var{"submission.edit.label"} = WebGUI::International::get(27,"USS");
WebGUI::Style::setLink($var{"rss.url"},{ rel=>'alternate', type=>'application/rss+xml', title=>'RSS' });
my $constraints;
if ($session{scratch}{search}) {
$numResults = $session{scratch}{numResults};
$constraints = WebGUI::Search::buildConstraints([qw(USS_submission.username asset.synopsis asset.title USS_submission.content USS_submission.userDefined1 USS_submission.userDefined2 USS_submission.userDefined3 USS_submission.userDefined4 USS_submission.userDefined5)]);
}
if ($constraints ne "") {
$constraints = "USS_submission.status='Approved' and ".$constraints;
} else {
$constraints = "(USS_submission.status='Approved' or (USS_submission.userId=".quote($session{user}{userId})." and USS_submission.userId<>'1')";
if ($var{canModerate}) {
$constraints .= " or USS_submission.status='Pending'";
}
$constraints .= ")";
}
my $p = WebGUI::Paginator->new($self->getUrl,$numResults);
my $sql = "select * from USS_submission left join asset on USS_submission.assetId=asset.assetId
where asset.parentId=".quote($self->getId)." and asset.state='published' and asset.className='WebGUI::Asset::USS_submission' and $constraints
order by ".$self->getValue("sortBy")." ".$self->getValue("sortOrder");
$p->setDataByQuery($sql);
my $page = $p->getPageData;
my $i = 0;
my $imageURL = "";
foreach my $row (@$page) {
my $submission = WebGUI::Asset::USS_submission->newByPropertyHashRef($row);
my $body = WebGUI::HTML::filter($submission->get("content"),$self->get("filterContent"));
$body = WebGUI::HTML::format($body,$submission->get("contentType"));
my $controls = deleteIcon('func=delete',$submission->getUrl,WebGUI::International::get(17,"USS")).editIcon('func=edit',$submission->getUrl);
if ($self->get("sortBy") eq "lineage") {
if ($self->get("sortOrder") eq "desc") {
$controls .= moveUpIcon('func=demote',$submission->getUrl).moveDownIcon('func=promote',$submission->getUrl);
} else {
$controls .= moveUpIcon('func=promote',$submission->getUrl).moveDownIcon('func=demote',$submission->getUrl);
}
}
my $inDateRange;
if ($submission->get("startDate") < WebGUI::DateTime::time() && $submission->get("endDate") > WebGUI::DateTime::time()) {
$inDateRange = 1;
} else {
$inDateRange = 0;
}
push(@{$var{submissions_loop}}, {
"submission.id"=>$submission->getId,
"submission.url"=>$submission->getUrl,
"submission.content"=>$submission->get("synopsis"),
"submission.content.full"=>$submission->get("content"),
"submission.responses"=>$submission->getResponseCount,
"submission.title"=>$submission->get("title"),
"submission.userDefined1"=>$submission->get("userDefined1"),
"submission.userDefined2"=>$submission->get("userDefined2"),
"submission.userDefined3"=>$submission->get("userDefined3"),
"submission.userDefined4"=>$submission->get("userDefined4"),
"submission.userDefined5"=>$submission->get("userDefined5"),
"submission.userId"=>$submission->get("userId"),
"submission.username"=>$submission->get('username'),
"submission.status"=>$self->status($submission->get("status")),
"submission.thumbnail"=>$submission->getThumbnailUrl,
"submission.image"=>$submission->getImageUrl,
"submission.date"=>epochToHuman($submission->get("dateSubmitted")),
"submission.date.updated"=>epochToHuman($submission->get("dateUpdated")),
"submission.userProfile"=>WebGUI::URL::page('op=viewProfile&uid='.$submission->get("userId")),
"submission.edit.url"=>$submission->getUrl("func=edit"),
"submission.secondColumn"=>(($i+1)%2==0),
"submission.thirdColumn"=>(($i+1)%3==0),
"submission.fourthColumn"=>(($i+1)%4==0),
"submission.fifthColumn"=>(($i+1)%5==0),
'submission.controls'=>$submission->getToolbar,
'submission.inDateRange'=>$inDateRange,
"submission.currentUser"=>($session{user}{userId} eq $submission->get("userId") && $session{user}{userId} ne "1")
});
$i++;
}
$p->appendTemplateVars(\%var);
return $self->processTemplate(\%var,$self->get("templateId"));
}
#-------------------------------------------------------------------
sub www_edit {
my $self = shift;
return $self->getAdminConsole->render(WebGUI::Privilege::insufficient()) unless $self->canEdit;
$self->getAdminConsole->setHelp("user submission system add/edit");
return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get("18","USS"));
}
#-------------------------------------------------------------------
# print out RSS 2.0 feed describing the items visible on the first page
sub www_viewRSS {
$_[0]->logView() if ($session{setting}{passiveProfilingEnabled});
my $wid = $_[0]->get("wobjectId");
my $numResults = $_[0]->get("submissionsPerPage");
my $encTitle = _xml_encode($_[0]->get("title"));
my $encDescription = _xml_encode($_[0]->get("description"));
my $encUrl = _xml_encode(WebGUI::URL::page("wid=$wid"));
my $xml = qq~<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>$encTitle</title>
<link>$encUrl</link>
<description>$encDescription</description>
~;
my $res = WebGUI::SQL->read
("select USS_submissionId, content, title, " .
"dateSubmitted, username from USS_submission " .
"where USS_id = " .quote($_[0]->get("USS_id")) . " and status='Approved' " .
"order by ".$_[0]->getValue("sortBy")." ".$_[0]->getValue("sortOrder")." limit " . $numResults,WebGUI::SQL->getSlave);
while (my $row = $res->{_sth}->fetchrow_arrayref()) {
my ($sid, $content, $title, $dateSubmitted, $username) =
@{$row};
my $encUrl = _xml_encode
(WebGUI::URL::page
("wid=$wid&func=viewSubmission&sid=$sid"));
my $encTitle = _xml_encode($title);
my $encPubDate = _xml_encode
(_get_rfc822_date($dateSubmitted));
my $encDescription = _xml_encode($content);
$xml .= qq~
<item>
<title>$encTitle</title>
<link>$encUrl</link>
<description>$encDescription</description>
<guid isPermaLink="true">$encUrl</guid>
<pubDate>$encPubDate</pubDate>
</item>
~;
}
$xml .=qq~
</channel>
</rss>
~;
WebGUI::HTTP::setMimeType("text/xml");
return $xml;
}
1;

View file

@ -1,475 +0,0 @@
package WebGUI::Forum;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2005 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use WebGUI::Forum::Thread;
use WebGUI::Grouping;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Utility;
=head1 NAME
Package WebGUI::Forum
=head1 DESCRIPTION
Data management class for forums.
=head1 SYNOPSIS
use WebGUI::Forum;
$forum = WebGUI::Forum->create(\%forumParams);
$forum = WebGUI::Forum->new($forumId);
$boolean = $forum->canPost;
$boolean = $forum->canView;
$scalar = $forum->get($param);
$obj = $forum->getThread($threadId);
$boolean = $forum->isModerator;
$boolean = $forum->isSubscribed;
$forum->decrementReplies;
$forum->decrementThreads;
$forum->incrementReplies($postDate, $postId);
$forum->incrementThreads($postDate, $postId);
$forum->incrementViews;
$forum->purge;
$forum->recalculateRating;
$forum->set(\%data);
$forum->setLastPost($epoch, $postId);
$forum->subscribe;
$forum->unsubscribe;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 canPost ( [ userId ] )
Returns a boolean whether the user has the privileges required to post.
=head3 userId
Defaults to $session{user}{userId}. Specify a user ID to check privileges for.
=cut
sub canPost {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
return (WebGUI::Grouping::isInGroup($self->get("groupToPost"),$userId) || $self->isModerator);
}
#-------------------------------------------------------------------
=head2 canView ( [ userId ] )
Returns a boolean whether the user has the privileges required to view the forum.
=head3 userId
Defaults to $session{user}{userId}. Specify a user ID to check privileges for.
=cut
sub canView {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
return (WebGUI::Grouping::isInGroup($self->get("groupToView"),$userId) || $self->canPost);
}
#-------------------------------------------------------------------
=head2 create ( forumParams )
Creates a new forum. Returns a forum object.
=head3 forumParams
A hash reference containing a list of the parameters to default the forum to. The valid parameters are:
addEditStampToPosts - boolean
filterPosts - A valid HTML::filter string.
karmaPerPost - integer
groupToPost - Group ID
groupToModerate - Group ID
editTimeout - interval
moderatePosts - boolean
attachmentsPerPost - integer
allowRichEdit - boolean
allowReplacements - boolean
forumTemplateId - Template ID
threadTemplateId - Template ID
postTemplateId - Template ID
postFormTemplateId - Template ID
searchTemplateId - Template ID
notificationTemplateId - Template ID
archiveAfter - interval
postsPerPage - integer
masterForumId - Forum ID
=cut
sub create {
my ($self, $data) = @_;
$data->{forumId} = "new";
my $forumId = WebGUI::SQL->setRow("forum","forumId",$data);
return WebGUI::Forum->new($forumId);
}
#-------------------------------------------------------------------
=head2 decrementReplies ( )
Deccrements this forum's reply counter.
=cut
sub decrementReplies {
my ($self) = @_;
WebGUI::SQL->write("update forum set replies=replies-1 where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 decrementThreads ( )
Decrements this forum's thread counter.
=cut
sub decrementThreads {
my ($self) = @_;
WebGUI::SQL->write("update forum set threads=threads-1 where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 get ( [ param ] )
Returns a hash reference containing all of the properties of the forum.
=head3 param
If specified then this method will return the value of this one parameter as a scalar. Param is the name of the parameter to return. See the forum table for details.
=cut
sub get {
my ($self, $key) = @_;
if ($key eq "") {
return $self->{_properties};
}
return $self->{_properties}->{$key};
}
#-------------------------------------------------------------------
=head2 getThread ( threadId )
Returns a thread object.
=head3 threadId
The unique identifier of a thread in this forum.
=cut
sub getThread {
my ($self, $threadId) = @_;
unless (exists $self->{_thread}{$threadId}) {
$self->{_thread}{$threadId} = WebGUI::Forum::Thread->new($threadId);
}
return $self->{_thread}{$threadId};
}
#-------------------------------------------------------------------
=head2 isModerator ( [ userId ] )
Returns a boolean indicating whether the user is a moderator.
=head3 userId
Defaults to $session{user}{userId}. A user id to test for moderator privileges.
=cut
sub isModerator {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
return WebGUI::Grouping::isInGroup($self->get("groupToModerate"), $userId);
}
#-------------------------------------------------------------------
=head2 incrementReplies ( lastPostDate, lastPostId )
Increments this forum's reply counter.
=head3 lastPostDate
The date of the post being added.
=head3 lastPostId
The unique identifier of the post being added.
=cut
sub incrementReplies {
my ($self, $lastPostDate, $lastPostId) = @_;
WebGUI::SQL->write("update forum set replies=replies+1, lastPostId=".quote($lastPostId).", lastPostDate=$lastPostDate where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 incrementThreads ( lastPostDate, lastPostId )
Increments the thread counter for this forum.
=head3 lastPostDate
The date of the post that was just added.
=head3 lastPostId
The unique identifier of the post that was just added.
=cut
sub incrementThreads {
my ($self, $lastPostDate, $lastPostId) = @_;
WebGUI::SQL->write("update forum set threads=threads+1, lastPostId=".quote($lastPostId).", lastPostDate=$lastPostDate where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 incrementViews ( )
Increments the views counter on this forum.
=cut
sub incrementViews {
my ($self) = @_;
WebGUI::SQL->write("update forum set views=views+1 where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 isSubscribed ( [ userId ] )
Returns a boolean indicating whether the user is subscribed to the forum.
=head3 userId
The user to check for the subscription. Defaults to $session{user}{userId}.
=cut
sub isSubscribed {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
my ($isSubscribed) = WebGUI::SQL->quickArray("select count(*) from forumSubscription where forumId=".quote($self->get("forumId"))." and userId=".quote($userId));
return $isSubscribed;
}
#-------------------------------------------------------------------
=head2 new ( forumId )
Constructor.
=head3 forumId
The unique identifier of the forum to retrieve the object for.
=cut
sub new {
my ($class, $forumId) = @_;
my $properties = WebGUI::SQL->getRow("forum","forumId",$forumId);
if ($properties->{masterForumId}) {
my $master = WebGUI::SQL->getRow("forum","forumId",$properties->{masterForumId});
$properties->{forumTemplateId} = $master->{forumTemplateId};
$properties->{threadTemplateId} = $master->{threadTemplateId};
$properties->{postTemplateId} = $master->{postTemplateId};
$properties->{searchTemplateId} = $master->{searchTemplateId};
$properties->{notificationTemplateId} = $master->{notificationTemplateId};
$properties->{postFormTemplateId} = $master->{postFormTemplateId};
$properties->{postPreviewTemplateId} = $master->{postPreviewTemplateId};
$properties->{archiveAfter} = $master->{archiveAfter};
$properties->{allowRichEdit} = $master->{allowRichEdit};
$properties->{allowReplacements} = $master->{allowReplacements};
$properties->{filterPosts} = $master->{filterPosts};
$properties->{karmaPerPost} = $master->{karmaPerPost};
$properties->{groupToView} = $master->{groupToView};
$properties->{groupToPost} = $master->{groupToPost};
$properties->{groupToView} = $master->{groupToView};
$properties->{groupToModerate} = $master->{groupToModerate};
$properties->{moderatePosts} = $master->{moderatePosts};
$properties->{attachmentsPerPost} = $master->{attachmentsPerPost};
$properties->{addEditStampToPosts} = $master->{addEditStampsToPost};
$properties->{postsPerPage} = $master->{postsPerPage};
$properties->{usePreview} = $master->{usePreview};
}
bless {_properties=>$properties}, $class;
}
#-------------------------------------------------------------------
=head2 purge ( )
Destroys this forum and everything it contains.
=cut
sub purge {
my ($self) = @_;
return unless ($self->get("forumId"));
my $a = WebGUI::SQL->read("select * from forumThread where forumId=".quote($self->get("forumId")));
while (my ($threadId) = $a->array) {
my $b = WebGUI::SQL->read("select * from forumPost where forumThreadId=".quote($threadId));
while (my ($postId) = $b->array) {
WebGUI::SQL->write("delete from forumPostAttachment where forumPostId=".quote($postId));
WebGUI::SQL->write("delete from forumPostRating where forumPostId=".quote($postId));
}
$b->finish;
WebGUI::SQL->write("delete from forumThreadSubscription where forumThreadId=".quote($threadId));
WebGUI::SQL->write("delete from forumRead where forumThreadId=".quote($threadId));
WebGUI::SQL->write("delete from forumPost where forumThreadId=".quote($threadId));
}
$a->finish;
WebGUI::SQL->write("delete from forumSubscription where forumId=".quote($self->get("forumId")));
WebGUI::SQL->write("delete from forumThread where forumId=".quote($self->get("forumId")));
WebGUI::SQL->write("delete from forum where forumId=".quote($self->get("forumId")));
}
#-------------------------------------------------------------------
=head2 recalculateRating ( )
Calculates the rating of this forum from its threads and stores the new value in the forum properties.
=cut
sub recalculateRating {
my ($self) = @_;
my ($count) = WebGUI::SQL->quickArray("select count(*) from forumThread where forumId=".quote($self->get("forumId"))." and rating>0");
$count = $count || 1;
my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from forumThread where forumId=".quote($self->get("forumId"))." and rating>0");
my $average = round($sum/$count);
$self->set({rating=>$average});
}
#-------------------------------------------------------------------
=head2 set ( data )
Sets the forum properties both in the object and to the database.
=head3 data
A hash reference containing the properties to set. See the forum table for details.
=cut
sub set {
my ($self, $data) = @_;
$data->{forumId} = $self->get("forumId") unless ($data->{forumId});
WebGUI::SQL->setRow("forum","forumId",$data);
foreach my $key (keys %{$data}) {
$self->{_properties}{$key} = $data->{$key};
}
}
#-------------------------------------------------------------------
=head2 setLastPost ( lastPostDate, lastPostId )
Sets the pertinent details for the last post. Can also be done directly using the set method.
=head3 lastPostDate
The epoch date of the post.
=head3 lastPostId
The unique id of the post.
=cut
sub setLastPost {
my ($self, $postDate, $postId) = @_;
$self->set({
lastPostId=>$postId,
lastPostDate=>$postDate
});
}
#-------------------------------------------------------------------
=head2 subscribe ( [ userId ] )
Subscribes a user to this forum.
=head3 userId
The unique identifier of the user to subscribe. Defaults to the current user.
=cut
sub subscribe {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
unless ($self->isSubscribed($userId)) {
WebGUI::SQL->write("insert into forumSubscription (forumId, userId) values (".quote($self->get("forumId")).",".quote($userId).")");
}
}
#-------------------------------------------------------------------
=head2 unsubscribe ( [ userId ] )
Unsubscribes a user from this forum.
=head3 userId
The unique identifier of the user to unsubscribe. Defaults to the current user.
=cut
sub unsubscribe {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
if ($self->isSubscribed($userId)) {
WebGUI::SQL->write("delete from forumSubscription where forumId=".quote($self->get("forumId"))." and userId=".quote($userId));
}
}
1;

View file

@ -1,487 +0,0 @@
package WebGUI::Forum::Post;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2005 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use WebGUI::DateTime;
use WebGUI::Forum::Thread;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Utility;
=head1 NAME
Package WebGUI::Forum::Post
=head1 DESCRIPTION
Data management class for forum posts.
=head1 SYNOPSIS
use WebGUI::Forum::Post;
$post = WebGUI::Forum::Post->create(\%params);
$post = WebGUI::Forum::Post->new($postId);
$boolean = $post->canEdit;
$boolean = $post->canView;
$scalar = $post->get("forumPostId");
$arrayRef = $post->getReplies;
$obj = $post->getThread;
$boolean = $post->hasRated;
$boolean = $post->isMarkedRead;
$boolean = $post->isReply;
$post->incrementViews;
$post->markRead;
$post->rate($rating);
$post->recalculateRating;
$post->set(\%data);
$post->setStatusApproved;
$post->setStatusArchived;
$post->setStatusDeleted;
$post->setStatusDenied;
$post->setStatusPending;
$post->unmarkRead;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 canEdit ( [ userId ] )
Returns a boolean indicating whether the user can edit the current post.
=head3 userId
The unique identifier to check privileges against. Defaults to the current user.
=cut
sub canEdit {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
return ($self->getThread->getForum->isModerator || ($self->get("userId") eq $userId && $userId != 1
&& $self->getThread->getForum->get("editTimeout") > (WebGUI::DateTime::time() - $self->get("dateOfPost"))));
}
#-------------------------------------------------------------------
=head2 canView ( [ userId ] )
Returns a boolean indicating whether the user can view the current post.
=head3 userId
The unique identifier to check privileges against. Defaults to the current user.
=cut
sub canView {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
if ($self->get("status") eq "approved" || $self->get("status") eq "archived") {
return 1;
} elsif ($self->get("status") eq "deleted") {
return 0;
} elsif ($self->get("status") eq "denied" && $userId eq $self->get("userId")) {
return 1;
} elsif ($self->getThread->getForum->isModerator) {
return 1;
} else {
return 0;
}
}
#-------------------------------------------------------------------
=head2 create ( [ data ] )
Creates a new post.
=head3 data
A hash reference containing the data to use to create the post. See the forumPost table for details.
=cut
sub create {
my ($self, $data) = @_;
$data->{dateOfPost} = WebGUI::DateTime::time();
$data->{forumPostId} = "new";
my $forumPostId = WebGUI::SQL->setRow("forumPost","forumPostId", $data);
$self = WebGUI::Forum::Post->new($forumPostId);
return $self;
}
#-------------------------------------------------------------------
=head2 get ( [ param ] )
Returns a hash reference containing all of the parameters of this post.
=head3 param
The name of a parameter to get. If specified then the method will return only the value for this parameter as a scalar.
=cut
sub get {
my ($self, $key) = @_;
if ($key eq "") {
return $self->{_properties};
}
return $self->{_properties}->{$key};
}
#-------------------------------------------------------------------
=head2 getReplies ( )
Returns an array reference containing a list of post objects that are direct decendants to this post.
=cut
sub getReplies {
my ($self) = @_;
my @replies = ();
my $query = "select forumPostId from forumPost where parentId=".quote($self->get("forumPostId"))." and ";
if ($self->getThread->getForum->isModerator) {
$query .= "(status='approved' or status='pending' or status='denied'";
} else {
$query .= "(status='approved'";
}
$query .= " or userId=".quote($session{user}{userId}).") order by dateOfPost";
my $sth = WebGUI::SQL->read($query,WebGUI::SQL->getSlave);
while (my @data = $sth->array) {
push(@replies,WebGUI::Forum::Post->new($data[0]));
}
$sth->finish;
return \@replies;
}
#-------------------------------------------------------------------
=head2 getThread ( )
Returns the thread object that is related to this post.
=cut
sub getThread {
my ($self) = @_;
unless (exists $self->{_thread}) {
$self->{_thread} = WebGUI::Forum::Thread->new($self->get("forumThreadId"));
}
return $self->{_thread};
}
#-------------------------------------------------------------------
=head2 hasRated ( [ userId, ipAddress ] )
Returns a boolean indicating whether this user has already rated this post.
=head3 userId
A unique identifier for a user to check. Defaults to the current user.
=head3 ipAddress
If the user ID equals 1 (visitor) then an IP address is used to distinguish the user. Defaults to the current user's ip address.
=cut
sub hasRated {
my ($self, $userId, $ipAddress) = @_;
$userId = $session{user}{userId} unless ($userId);
return 1 if ($userId != 1 && $userId eq $self->get("userId")); # is poster
$ipAddress = $session{env}{REMOTE_ADDR} unless ($ipAddress);
my ($flag) = WebGUI::SQL->quickArray("select count(*) from forumPostRating where forumPostId="
.quote($self->get("forumPostId"))." and ((userId=".quote($userId)." and userId<>1) or (userId='1' and
ipAddress=".quote($ipAddress)."))");
return $flag;
}
#-------------------------------------------------------------------
=head2 incrementViews ( )
Increments the views counter for this post.
=cut
sub incrementViews {
my ($self) = @_;
WebGUI::SQL->write("update forumPost set views=views+1 where forumPostId=".quote($self->get("forumPostId")));
$self->getThread->incrementViews;
}
#-------------------------------------------------------------------
=head2 isMarkedRead ( [ userId ] )
Returns a boolean indicating whether this post is marked read for the user.
=head3 userId
A unique id for a user that you want to check. Defaults to the current user.
=cut
sub isMarkedRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
my ($isRead) = WebGUI::SQL->quickArray("select count(*) from forumRead where userId=".quote($userId)." and forumPostId=".quote($self->get("forumPostId")));
return $isRead;
}
#-------------------------------------------------------------------
=head2 isReply ( )
Returns a boolean indicating whether this post is a reply or the root post in a thread.
=cut
sub isReply {
my ($self) = @_;
if ($self->get("parentId") ne "0") {
return 1;
} else {
return 0;
}
}
#-------------------------------------------------------------------
=head2 markRead ( [ userId ] )
Marks this post read for this user.
=head3 userId
A unique identifier for a user. Defaults to the current user.
=cut
sub markRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
unless ($self->isMarkedRead($userId)) {
WebGUI::SQL->write("insert into forumRead (userId, forumPostId, forumThreadId, lastRead) values (".quote($userId).",
".quote($self->get("forumPostId")).", ".quote($self->get("forumThreadId")).", ".WebGUI::DateTime::time().")");
}
$self->incrementViews;
}
#-------------------------------------------------------------------
=head2 new ( postId )
Constructor.
=head3 postId
The unique identifier for the post object you wish to retrieve.
=cut
sub new {
my ($class, $forumPostId) = @_;
my $properties = WebGUI::SQL->getRow("forumPost","forumPostId",$forumPostId);
if (defined $properties) {
bless {_properties=>$properties}, $class;
} else {
return undef;
}
}
#-------------------------------------------------------------------
=head2 rate ( rating [ , userId, ipAddress ] )
Stores a rating against this post.
=head3 rating
An integer between 1 and 5 (5 being best) to rate this post with.
=head3 userId
The unique id for the user rating this post. Defaults to the current user.
=head3 ipAddress
The ip address of the user doing the rating. Defaults to the current user's IP.
=cut
sub rate {
my ($self, $rating, $userId, $ipAddress) = @_;
$userId = $session{user}{userId} unless ($userId);
$ipAddress = $session{env}{REMOTE_ADDR} unless ($ipAddress);
WebGUI::SQL->write("insert into forumPostRating (forumPostId,userId,ipAddress,dateOfRating,rating) values ("
.quote($self->get("forumPostId")).", ".quote($userId).", ".quote($ipAddress).", ".WebGUI::DateTime::time().", $rating)");
$self->recalculateRating;
}
#-------------------------------------------------------------------
=head2 recalculateRating ( )
Recalculates the average rating of the post from all the ratings and stores the result to the database.
=cut
sub recalculateRating {
my ($self) = @_;
my ($count) = WebGUI::SQL->quickArray("select count(*) from forumPostRating where forumPostId=".quote($self->get("forumPostId")));
$count = $count || 1;
my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from forumPostRating where forumPostId=".quote($self->get("forumPostId")));
my $average = round($sum/$count);
$self->set({rating=>$average});
$self->getThread->recalculateRating;
}
#-------------------------------------------------------------------
=head2 set ( data )
Sets properties to the database and the object.
=head3 data
A hash reference containing the properties to set. See the forumPost table for details.
=cut
sub set {
my ($self, $data) = @_;
$data->{forumPostId} = $self->get("forumPostId") unless ($data->{forumPostId});
WebGUI::SQL->setRow("forumPost","forumPostId",$data);
foreach my $key (keys %{$data}) {
$self->{_properties}{$key} = $data->{$key};
}
}
#-------------------------------------------------------------------
=head2 setStatusApproved ( )
Sets the status of this post to approved.
=cut
sub setStatusApproved {
my ($self) = @_;
$self->set({status=>'approved'});
$self->getThread->setStatusApproved if ($self->getThread->get("rootPostId") eq $self->get("forumPostId"));
if ($self->isReply) {
$self->getThread->incrementReplies($self->get("dateOfPost"),$self->get("forumPostId"));
}
}
#-------------------------------------------------------------------
=head2 setStatusArchived ( )
Sets the status of this post to archived.
=cut
sub setStatusArchived {
my ($self) = @_;
$self->set({status=>'archived'});
$self->getThread->setStatusArchived if ($self->getThread->get("rootPostId") eq $self->get("forumPostId"));
if ($self->isReply) {
$self->getThread->incrementReplies($self->get("dateOfPost"),$self->get("forumPostId"));
}
}
#-------------------------------------------------------------------
=head2 setStatusDeleted ( )
Sets the status of this post to deleted.
=cut
sub setStatusDeleted {
my ($self) = @_;
$self->set({status=>'deleted'});
$self->getThread->decrementReplies;
$self->getThread->setStatusDeleted if ($self->getThread->get("rootPostId") eq $self->get("forumPostId"));
my ($id, $date) = WebGUI::SQL->quickArray("select forumPostId,dateOfPost from forumPost where forumThreadId="
.quote($self->get("forumThreadId"))." and status='approved'");
$self->getThread->setLastPost($date,$id);
}
#-------------------------------------------------------------------
=head2 setStatusDenied ( )
Sets the status of this post to denied.
=cut
sub setStatusDenied {
my ($self) = @_;
$self->set({status=>'denied'});
$self->getThread->setStatusDenied if ($self->getThread->get("rootPostId") eq $self->get("forumPostId"));
}
#-------------------------------------------------------------------
=head2 setStatusPending ( )
Sets the status of this post to pending.
=cut
sub setStatusPending {
my ($self) = @_;
$self->set({status=>'pending'});
$self->getThread->setStatusPending if ($self->getThread->get("rootPostId") eq $self->get("forumPostId"));
}
#-------------------------------------------------------------------
=head2 unmarkRead ( [ userId ] )
Negates the markRead method.
=head3 userId
The unique id of the user marking unread. Defaults to the current user.
=cut
sub unmarkRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
WebGUI::SQL->write("delete from forumRead where userId=".quote($userId)." and forumPostId=".quote($self->get("forumPostId")));
}
1;

View file

@ -1,540 +0,0 @@
package WebGUI::Forum::Thread;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2005 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use WebGUI::DateTime;
use WebGUI::Forum;
use WebGUI::Forum::Post;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Utility;
=head1 NAME
Package WebGUI::Forum::Thread
=head1 DESCRIPTION
Data management class for forum threads.
=head1 SYNOPSIS
use WebGUI::Forum;
$thread = WebGUI::Forum::Thread->create(\%params);
$thread = WebGUI::Forum::Thread->new($threadId);
$scalar = $thread->get($param);
$obj = $thread->getForum;
$obj = $thread->getNextThread;
$obj = $thread->getPost($postId);
$obj = $thread->getPreviousThread;
$boolean = $thread->isLocked;
$boolean = $thread->isSticky;
$boolean = $thread->isSubscribed;
$thread->decrementReplies;
$thread->incrementReplies($postDate, $postId);
$thread->incrementViews;
$thread->lock;
$thread->recalculateRating;
$thread->set(\%data);
$thread->setLastPost($postDate,$postId);
$thread->setStatusApproved;
$thread->setStatusArchived;
$thread->setStatusDeleted;
$thread->setStatusDenied;
$thread->setStatusPending;
$thread->stick;
$thread->subscribe;
$thread->unlock;
$thread->unstick;
$thread->unsubscribe;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 create ( data, postData )
Creates a new thread, including the root post in that thread.
=head3 data
The properties of this thread. See the forumThread table for details.
=head3 postData
The properties of the root post in this thread. See the forumPost table and the WebGUI::Forum::Post->create method for details.
=cut
sub create {
my ($self, $data, $postData) = @_;
$data->{forumThreadId} = "new";
$postData->{forumThreadId} = WebGUI::SQL->setRow("forumThread","forumThreadId", $data);
$self = WebGUI::Forum::Thread->new($postData->{forumThreadId});
$postData->{parentId} = 0;
my $post = WebGUI::Forum::Post->create($postData);
$self->set({
rootPostId=>$post->get("forumPostId"),
lastPostId=>$post->get("forumPostId"),
lastPostDate=>$post->get("dateOfPost")
});
$self->{_post}{$post->get("forumPostId")} = $post;
$self->getForum->incrementThreads($post->get("dateOfPost"),$post->get("forumPostId"));
return $self;
}
#-------------------------------------------------------------------
=head2 decrementReplies ( )
Decrements the replies counter for this thread.
=cut
sub decrementReplies {
my ($self) = @_;
WebGUI::SQL->write("update forumThread set replies=replies-1 where forumThreadId=".quote($self->get("forumThreadId")));
$self->getForum->decrementReplies;
}
#-------------------------------------------------------------------
=head2 get ( [ param ] )
Returns a hash reference containing all the properties of this thread.
=head3 param
The name of a specific property. If specified only the value of that property will be return as a scalar.
=cut
sub get {
my ($self, $key) = @_;
if ($key eq "") {
return $self->{_properties};
}
return $self->{_properties}->{$key};
}
#-------------------------------------------------------------------
=head2 getForum ( )
Returns a forum object for the forum that is related to this thread.
=cut
sub getForum {
my ($self) = @_;
unless (exists $self->{_forum}) {
$self->{_forum} = WebGUI::Forum->new($self->get("forumId"));
}
return $self->{_forum};
}
#-------------------------------------------------------------------
=head2 getNextThread ( )
Returns a thread object for the next (newer) thread in the same forum.
=cut
sub getNextThread {
my ($self) = @_;
unless (exists $self->{_next}) {
my ($nextId) = WebGUI::SQL->quickArray("select lastPostId from forumThread where forumId=".quote($self->get("forumId"))."
and lastPostDate>".quote($self->get("lastPostDate")." order by lastPostDate asc"),WebGUI::SQL->getSlave);
$self->{_next} = WebGUI::Forum::Thread->new($nextId);
}
return $self->{_next};
}
#-------------------------------------------------------------------
=head2 getPost ( postId )
Returns a post object.
=head3 postId
The unique id of the post object you wish to retrieve.
=cut
sub getPost {
my ($self, $postId) = @_;
unless (exists $self->{_post}{$postId}) {
$self->{_post}{$postId} = WebGUI::Forum::Post->new($postId);
}
return $self->{_post}{$postId};
}
#-------------------------------------------------------------------
=head2 getPreviousThread ( )
Returns a thread object for the previous (older) thread in the same forum.
=cut
sub getPreviousThread {
my ($self) = @_;
unless (exists $self->{_previous}) {
my ($nextId) = WebGUI::SQL->quickArray("select lastPostId from forumThread where forumId=".quote($self->get("forumId"))."
and lastPostDate<".quote($self->get("lastPostDate")." order by lastPostDate desc"),WebGUI::SQL->getSlave);
$self->{_previous} = WebGUI::Forum::Thread->new($nextId);
}
return $self->{_previous};
}
#-------------------------------------------------------------------
=head2 isLocked ( )
Returns a boolean indicating whether this thread is locked from new posts and other edits.
=cut
sub isLocked {
my ($self) = @_;
return $self->get("isLocked");
}
#-------------------------------------------------------------------
=head2 incrementReplies ( lastPostDate, lastPostId )
Increments the replies counter for this thread.
=head3 lastPostDate
The date of the reply that caused the replies counter to be incremented.
=head3 lastPostId
The id of the reply that caused the replies counter to be incremented.
=cut
sub incrementReplies {
my ($self, $dateOfReply, $replyId) = @_;
WebGUI::SQL->write("update forumThread set replies=replies+1, lastPostId=".quote($replyId).", lastPostDate=$dateOfReply
where forumThreadId=".quote($self->get("forumThreadId")));
$self->getForum->incrementReplies($dateOfReply,$replyId);
}
#-------------------------------------------------------------------
=head2 incrementViews ( )
Increments the views counter for this thread.
=cut
sub incrementViews {
my ($self) = @_;
WebGUI::SQL->write("update forumThread set views=views+1 where forumThreadId=".quote($self->get("forumThreadId")));
$self->getForum->incrementViews;
}
#-------------------------------------------------------------------
=head2 isSticky ( )
Returns a boolean indicating whether this thread should be "stuck" a the top of the forum and not be sorted with the rest of the threads.
=cut
sub isSticky {
my ($self) = @_;
return $self->get("isSticky");
}
#-------------------------------------------------------------------
=head2 isSubscribed ( [ userId ] )
Returns a boolean indicating whether the user is subscribed to this thread.
=head3 userId
The unique id of the user to check. Defaults to the current user.
=cut
sub isSubscribed {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
my ($isSubscribed) = WebGUI::SQL->quickArray("select count(*) from forumThreadSubscription where forumThreadId=".quote($self->get("forumThreadId"))
." and userId=".quote($userId));
return $isSubscribed;
}
#-------------------------------------------------------------------
=head2 lock ( )
Sets this thread to be locked from edits.
=cut
sub lock {
my ($self) = @_;
$self->set({isLocked=>1});
}
#-------------------------------------------------------------------
=head2 new ( threadId )
Constructor.
=head3 threadId
The unique id of the thread object you wish to retrieve.
=cut
sub new {
my ($class, $forumThreadId) = @_;
my $properties = WebGUI::SQL->getRow("forumThread","forumThreadId",$forumThreadId);
if (defined $properties) {
bless {_properties=>$properties}, $class;
} else {
return undef;
}
}
#-------------------------------------------------------------------
=head2 recalculateRating ( )
Recalculates the average rating of this thread based upon all of the posts in the thread.
=cut
sub recalculateRating {
my ($self) = @_;
my ($count) = WebGUI::SQL->quickArray("select count(*) from forumPost where forumThreadId=".quote($self->get("forumThreadId"))." and rating>0");
$count = $count || 1;
my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from forumPost where forumThreadId=".quote($self->get("forumThreadId"))." and rating>0");
my $average = round($sum/$count);
$self->set({rating=>$average});
$self->getForum->recalculateRating;
}
#-------------------------------------------------------------------
=head2 set ( data )
Sets properties for this thread both to the object and to the database.
=head3 data
A hash reference containing the properties to set. See the forumThread table for details.
=cut
sub set {
my ($self, $data) = @_;
$data->{forumThreadId} = $self->get("forumThreadId") unless ($data->{forumThreadId});
WebGUI::SQL->setRow("forumThread","forumThreadId",$data);
foreach my $key (keys %{$data}) {
$self->{_properties}{$key} = $data->{$key};
}
}
#-------------------------------------------------------------------
=head2 setLastPost ( lastPostDate, lastPostId )
Sets the pertinent details for the last post. Can also be done directly using the set method.
=head3 lastPostDate
The epoch date of the post.
=head3 lastPostId
The unique id of the post.
=cut
sub setLastPost {
my ($self, $postDate, $postId) = @_;
$self->set({
lastPostId=>$postId,
lastPostDate=>$postDate
});
$self->getForum->setLastPost($postDate, $postId);
}
#-------------------------------------------------------------------
=head2 setStatusApproved ( )
Sets the status of this thread to approved.
=cut
sub setStatusApproved {
my ($self) = @_;
$self->set({status=>'approved'});
}
#-------------------------------------------------------------------
=head2 setStatusArchived ( )
Sets the status of this thread to archived.
=cut
sub setStatusArchived {
my ($self) = @_;
$self->set({status=>'archived'});
}
#-------------------------------------------------------------------
=head2 setStatusDeleted ( )
Sets the status of this thread to deleted.
=cut
sub setStatusDeleted {
my ($self) = @_;
$self->set({status=>'deleted'});
$self->getForum->decrementThreads;
}
#-------------------------------------------------------------------
=head2 setStatusDenied ( )
Sets the status of this thread to denied.
=cut
sub setStatusDenied {
my ($self) = @_;
$self->set({status=>'denied'});
}
#-------------------------------------------------------------------
=head2 setStatusPending ( )
Sets the status of this thread to pending.
=cut
sub setStatusPending {
my ($self) = @_;
$self->set({status=>'pending'});
}
#-------------------------------------------------------------------
=head2 stick ( )
Makes this thread sticky.
=cut
sub stick {
my ($self) = @_;
$self->set({isSticky=>1});
}
#-------------------------------------------------------------------
=head2 subscribe ( [ userId ] )
Subscribes the user to this thread.
=head3 userId
The unique id of the user. Defaults to the current user.
=cut
sub subscribe {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
unless ($self->isSubscribed($userId)) {
WebGUI::SQL->write("insert into forumThreadSubscription (forumThreadId, userId) values (".quote($self->get("forumThreadId")).",".quote($userId).")");
}
}
#-------------------------------------------------------------------
=head2 unlock ( )
Negates the lock method.
=cut
sub unlock {
my ($self) = @_;
$self->set({isLocked=>0});
}
#-------------------------------------------------------------------
=head2 unstick ( )
Negates the stick method.
=cut
sub unstick {
my ($self) = @_;
$self->set({isSticky=>0});
}
#-------------------------------------------------------------------
=head2 unsubscribe ( [ userId ] )
Negates the subscribe method.
=head3 userId
The unique id of the user to unsubscribe. Defaults to the current user.
=cut
sub unsubscribe {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
if ($self->isSubscribed($userId)) {
WebGUI::SQL->write("delete from forumThreadSubscription where forumThreadId=".quote($self->get("forumThreadId"))." and userId=".quote($userId));
}
}
1;

File diff suppressed because it is too large Load diff