diff --git a/docs/changelog/6.x.x.txt b/docs/changelog/6.x.x.txt index 5698d1928..f202c7d0d 100644 --- a/docs/changelog/6.x.x.txt +++ b/docs/changelog/6.x.x.txt @@ -45,6 +45,7 @@ - bugfix [ 991070 ] 5.5.4 Editor(s) replacing ^ symbol - bugfix [ 1022287 ] WYSIWYG-Editor Add new web link - bugfix [ 1055153 ] Turn Admin ON with SSL and IE. + - fix [ 1118753 ] GUID not displayed in 6.2.9 if it begins with "-". - RFE [ 1034549 ] Docu für Encrypt Pag - Added internationalized URL handling. - Moved site icon and fav icon directly into style templates. diff --git a/docs/gotcha.txt b/docs/gotcha.txt index 1c21116ec..7f1c52d9d 100644 --- a/docs/gotcha.txt +++ b/docs/gotcha.txt @@ -59,6 +59,16 @@ save you many hours of grief. * If you have any custom code, please check out docs/migration.txt as there have been many changes to the API in this release. + * There are many new components in this release, and as a result many + tables. Here is a list of the new tables. Make sure you have no + plug-ins installed that conflict with this, or tables you've + created for your own uses: Collaboration, Post, Thread, + Post_rating, Post_read, Folder, FileAsset, ITransact_recurringStatus, + ImageAsset, Layout, Shortcut, asset, assetHistory, commerceSettings, + redirect, shoppingCart, snippet, subscription, subscriptionCode, + subscriptionCodeBatch, subscriptionCodeSubscriptions, transaction, + transactionItem + 6.2.10 -------------------------------------------------------------------- diff --git a/docs/upgrades/upgrade_6.2.11-6.3.0.sql b/docs/upgrades/upgrade_6.2.11-6.3.0.sql index f8a5d0f2a..9cbc09f58 100644 --- a/docs/upgrades/upgrade_6.2.11-6.3.0.sql +++ b/docs/upgrades/upgrade_6.2.11-6.3.0.sql @@ -255,9 +255,7 @@ create table Collaboration ( karmaPerPost int not null default 0, collaborationTemplateId varchar(22) not null, threadTemplateId varchar(22) not null, - postTemplateId varchar(22) not null, postFormTemplateId varchar(22) not null, - postPreviewTemplateId varchar(22) not null, searchTemplateId varchar(22) not null, notificationTemplateId varchar(22) not null, sortBy varchar(35) not null default 'dateUpdated', @@ -278,19 +276,18 @@ create table Collaboration ( archiveAfter int not null default 31536000, postsPerPage int not null default 10, threadsPerPage int not null default 30, - subscriptionGroupId varchar(22) + subscriptionGroupId varchar(22), + allowReplies int not null default 0 ); create table Thread ( assetId varchar(22) not null primary key, - views int not null default 0, replies int not null default 0, lastPostId varchar(22) not null default 0, lastPostDate bigint, isLocked int not null default 0, isSticky int not null default 0, - status varchar(30) not null default 'approved', - rating int not null default 0 + subscriptionGroupId varchar(22) ); create table Post ( diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index f68f6b4a4..8399ff210 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -30,7 +30,6 @@ use WebGUI::Paginator; use WebGUI::Privilege; use WebGUI::Session; use WebGUI::SQL; -use WebGUI::Style; use WebGUI::URL; use WebGUI::User; use WebGUI::Utility; @@ -154,21 +153,32 @@ sub definition { sub DESTROY { my $self = shift; $self->{_thread}->DESTROY if (exists $self->{_thread}); + $self->SUPER::DESTROY; } #------------------------------------------------------------------- -=head2 formatContent ( ) +=head2 formatContent ( [ content, contentType ]) Formats post content for display. +=head3 content + +The content to format. Defaults to the content in this post. + +=head3 contentType + +The content type to use for formatting. Defaults to the content type specified in this post. + =cut sub formatContent { my $self = shift; - my $msg = WebGUI::HTML::filter($self->get("content"),$self->getThread->getParent->get("filterCode")); - $msg = WebGUI::HTML::format($msg, $self->get("contentType")); + my $content = shift || $self->get("content"); + my $contentType = shift || $self->get("contentType"); + my $msg = WebGUI::HTML::filter($content,$self->getThread->getParent->get("filterCode")); + $msg = WebGUI::HTML::format($msg, $contentType)); if ($self->getThread->getParent->get("useContentFilter")) { $msg = WebGUI::HTML::processReplacements($msg); } @@ -289,82 +299,64 @@ sub getReplyUrl { return $self->getUrl("func=add&class=WebGUI::Asset::Post&withQuote=".$withQuote); } +#------------------------------------------------------------------- +sub getStatus { + my $self = shift; + my $status = $self->get("status"); + if ($status eq "approved") { + return "Approved"; + } elsif ($status eq "denied") { + return "Denied"; + } elsif ($status eq "pending") { + return "Pending"; + } +} + +#------------------------------------------------------------------- +sub getSynopsisAndContentFromFormPost { + my $self = shift; + my $synopsis = $session{form}{synopsis}; + my $body = $session{form}{content}; + unless ($synopsis) { + $body =~ s/\n/\^\-\;/ unless ($body =~ m/\^\-\;/); + my @content = split(/\^\-\;/,$body); + $synopsis = WebGUI::HTML::filter($content[0],"none"); + } + $body =~ s/\^\-\;/\n/; + return ($synopsis,$content); +} + #------------------------------------------------------------------- sub getTemplateVars { my $self = shift; my %var; - #my $callback = WebGUI::URL::gateway($parentsPage->get("urlizedTitle"),"func=viewSubmission&wid=".$self->wid."&sid=".$submission->{USS_submissionId}); -# if ($session{form}{forumOp} ne "" && $session{form}{forumOp} ne "viewForum") { -# return WebGUI::Forum::UI::forumOp({ -# callback=>$callback, -# title=>$submission->{title}, -# forumId=>$submission->{forumId} -# }); -# } - $self->update({views=>$self->get("views")+1}); - $var{content} = WebGUI::HTML::filter($self->get("content"),$self->get("filterContent")); - $var{content} = WebGUI::HTML::format($var{content},"USS"); - $var{"user.label"} = WebGUI::International::get(21,"USS"); - $var{"userProfile.url"} = $self->getUrl('op=viewProfile&uid='.$self->get("ownerUserId")); $var{"userId"} = $self->get("ownerUserId"); - $var{"username"} = $self->get("username"); - $var{"dateSubmitted.label"} = WebGUI::International::get(13,"USS"); + $var{"dateSubmitted.human"} = epochToHuman($self->get("dateSubmitted")); - $var{"dateUpdated.label"} = WebGUI::International::get(78,"USS"); $var{"dateUpdated.human"} = epochToHuman($self->get("dateUpdated")); - $var{"status.label"} = WebGUI::International::get(14,"USS"); - $var{"status.status"} = $self->getParent->status($self->get("status")); - $var{"views.label"} = WebGUI::International::get(514); - $var{canPost} = $self->canContribute; - $var{"post.url"} = $self->getUrl("func=edit"); - $var{"post.label"} = WebGUI::International::get(20,"USS"); - my $previous = WebGUI::Asset::Post->newByPropertyHashRef( - WebGUI::SQL->quickHashRef(" - select asset.*,Post.* - from Thread - left join asset on asset.parentId=Thread.assetId - left join Post on Post.assetId=asset.assetId - where Thread.parentId=".quote($self->get("parentId"))." - and asset.state='published' - and ".$self->getParent->getValue("sortBy")."<".quote($self->get($self->getParent->getValue("sortBy")))." - and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') - order by ".$self->getParent->getValue("sortBy")." desc - ",WebGUI::SQL->getSlave) - ); - $var{"previous.more"} = defined $previous; - $var{"previous.url"} = $previous->getUrl if ($var{"previous.more"}); - $var{"previous.label"} = WebGUI::International::get(58,"USS"); - my $next = WebGUI::Asset::Post->newByPropertyHashRef( - WebGUI::SQL->quickHashRef(" - select asset.*,Post.* - from Thread - left join asset on asset.parentId=Thread.assetId - left join Post on Post.assetId=asset.assetId - where Thread.parentId=".quote($self->get("parentId"))." - and asset.state='published' - and ".$self->getParent->getValue("sortBy").">".quote($self->get($self->getParent->getValue("sortBy")))." - and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') - order by ".$self->getParent->getValue("sortBy")." asc - ",WebGUI::SQL->getSlave) - ); - $var{"next.more"} = defined $next; - $var{"next.url"} = $next->getUrl if ($var{"next.more"}); - $var{"next.label"} = WebGUI::International::get(59,"USS"); + + $var{content} = $self->formatContent; + $var{canEdit} = $self->canEdit; - $var{"delete.url"} = $self->getUrl("func=delete"); - $var{"delete.label"} = WebGUI::International::get(37,"USS"); - $var{"edit.url"} = $self->getUrl("func=edit"); - $var{"edit.label"} = WebGUI::International::get(27,"USS"); - $var{canChangeStatus} = $self->canModerate; - $var{"approve.url"} = $self->getUrl("func=approve&mlog=".$session{form}{mlog}); - $var{"approve.label"} = WebGUI::International::get(572); - $var{"leave.url"} = $self->getUrl('op=viewMessageLog'); - $var{"leave.label"} = WebGUI::International::get(573); - $var{"deny.url"} = $self->getUrl("func=deny&mlog=".$session{form}{mlog}); - $var{"deny.label"} = WebGUI::International::get(574); - $var{"canReply"} = $self->get("allowDiscussion"); -# $var{"reply.url"} = WebGUI::Forum::UI::formatNewThreadURL($callback,$submission->{forumId}); -# $var{"reply.label"} = WebGUI::International::get(47,"USS"); + $var{"delete.url"} = $self->getDeleteUrl; + $var{"edit.url"} = $self->getEditUrl; + + $var{"status"} = $self->getStatus; + $var{"approve.url"} = $self->getApproveUrl; + $var{"deny.url"} = $self->getDenyUrl; + + $var{"reply.url"} = $self->getReplyUrl; + $var{'reply.withquote.url'} = $self->getReplyUrl(1); + + $var{'url'} = WebGUI::URL::getSiteURL().$self->getUrl; + + $var{'rating.value'} = $self->get("rating")+0; + $var{'rate.url.1'} = $self->getRateUrl(1); + $var{'rate.url.2'} = $self->getRateUrl(2); + $var{'rate.url.3'} = $self->getRateUrl(3); + $var{'rate.url.4'} = $self->getRateUrl(4); + $var{'rate.url.5'} = $self->getRateUrl(5); + $var{'hasRated'} = $self->hasRated; # if ($submission->{image} ne "") { # $file = WebGUI::Attachment->new($submission->{image},$self->wid,$submissionId); # $var{"image.url"} = $file->getURL; @@ -377,11 +369,6 @@ sub getTemplateVars { # $var{"attachment.icon"} = $file->getIcon; # $var{"attachment.name"} = $file->getFilename; # } - if ($self->get("allowDiscussion")) { -# $var{"replies"} = WebGUI::Forum::UI::www_viewForum( -# {callback=>$callback,title=>$submission->{title},forumId=>$submission->{forumId}}, -# $submission->{forumId}); - } } #------------------------------------------------------------------- @@ -422,7 +409,6 @@ Increments the views counter for this post. sub incrementViews { my ($self) = @_; $self->update({views=>$self->get("views")+1}); - $self->getThread->incrementViews; } #------------------------------------------------------------------- @@ -458,27 +444,13 @@ sub isPoster { =head2 isReply ( ) -Returns a boolean indicating whether this post is a reply. This is the opposite of isRootPost(). +Returns a boolean indicating whether this post is a reply. =cut sub isReply { my $self = shift; - return !$self->isRootPost; -} - - -#------------------------------------------------------------------- - -=head2 isRootPost ( ) - -Returns a boolean indicating that this post is the root post in the thread. This is the opposite of isReply(). - -=cut - -sub isReply { - my $self = shift; - return $self->get("parentId") eq $self->get("threadId"); + return $self->getId ne $self->get("threadId"); } @@ -535,24 +507,32 @@ sub notifySubscribers { sub processPropertiesFromFormPost { my $self = shift; $self->SUPER::processPropertiesFromFormPost; + if ($session{form}{assetId} eq "new" && $session{setting}{enableKarma} && $self->getThread->getParent->get("karmaPerPost")) { + my $u = WebGUI::User->new($session{user}{userId}); + $u->addKarma($self->getThread->getParent->get("karmaPerPost"), $self->getId, "Collaboration post"); + } my %data = ( ownerUserId => $session{user}{userId}, groupIdView => $self->getThread->get("groupIdView"), groupIdEdit => $self->getThread->get("groupIdEdit") ); - $data{startDate} = $self->getThread->get("startDate") unless ($session{form}{startDate}); - $data{endDate} = $self->getThread->get("endDate") unless ($session{form}{endDate}); - unless ($session{form}{synopsis}) { - my $body = $session{form}{content}; - $body =~ s/\n/\^\-\;/ unless ($body =~ m/\^\-\;/); - my @content = split(/\^\-\;/,$body); - $content[0] = WebGUI::HTML::filter($content[0],"none"); - $data{synopsis} = $content[0]; - $body =~ s/\^\-\;/\n/; - $data{content} = $body; - } + $data{startDate} = $self->getThread-getParent->get("startDate") unless ($session{form}{startDate}); + $data{endDate} = $self->getThread-getParent->get("endDate") unless ($session{form}{endDate}); + ($data{synopsis}, $data{content}) = $self->getSynopsisAndContentFromFormPost; + if ($self->getThread->getParent->get("addEditStampToPosts")) { + $data{content} .= "

\n\n --- (Edited on ".WebGUI::DateTime::epochToHuman()." by ".$session{user}{alias}.") --- \n

"; + } $data{isHidden} = 1; $self->update(\%data); + $self->getThread->subscribe if ($session{form}{subscribe}); + $self->getThread->lock if ($session{form}{'lock'}); + $self->getThread->stick if ($session{form}{stick}); + if ($self->getThread->getParent->get("moderatePosts")) { + $self->setStatusPending; + } else { + $self->setStatusApproved; + } + $session{form}{proceed} = "redirectToParent"; } @@ -575,46 +555,15 @@ sub rate { WebGUI::SQL->write("insert into Post_rating (assetId,userId,ipAddress,dateOfRating,rating) values (" .quote($self->getId).", ".quote($session{user}{userId}).", ".quote($session{env}{REMOTE_ADDR}).", ".WebGUI::DateTime::time().", $rating)"); - $self->recalculateRating; + my ($count) = WebGUI::SQL->quickArray("select count(*) from Post_rating where postId=".quote($self->getId)); + $count = $count || 1; + my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from Post_rating where postId=".quote($self->getId)); + my $average = round($sum/$count); + $self->update({rating=>$average}); + $self->getThread->rate; } } -#------------------------------------------------------------------- - -=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 Post_rating where postId=".quote($self->getId)); - $count = $count || 1; - my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from Post_rating where postId=".quote($self->getId)); - my $average = round($sum/$count); - $self->update({rating=>$average}); - $self->getThread->recalculateRating; -} - - -#------------------------------------------------------------------- - -=head2 setDefaultStatus ( ) - -Sets a new post's status based upon forum settings. - -=cut - -sub setDefaultStatus { - my $self = shift; - if ($self->getThread->getParent->get("moderatePosts")) { - $self->setStatusPending; - } else { - $self->setStatusApproved; - } -} - #------------------------------------------------------------------- @@ -627,7 +576,6 @@ Sets the post to approved and sends any necessary notifications. sub setStatusApproved { my $self $self->update({status=>'approved'}); - $self->getThread->setStatusApproved if $self->isRootPost; $self->getThread->incrementReplies($self->get("dateUpdated"),$self->getId) if $self->isReply; unless ($self->isPoster) { WebGUI::MessageLog::addInternationalizedEntry($self->get("ownerUserId"),'',$self->getUrl,579); @@ -649,7 +597,6 @@ Sets the status of this post to archived. sub setStatusArchived { my ($self) = @_; $self->update({status=>'archived'}); - $self->getThread->setStatusArchived if $self->isRootPost; } @@ -664,7 +611,6 @@ Sets the status of this post to denied. sub setStatusDenied { my ($self) = @_; $self->update({status=>'denied'}); - $self->getThread->setStatusDenied if $self->isRootPost; WebGUI::MessageLog::addInternationalizedEntry($self->get("ownerUserId"),'',$self->getUrl,580); } @@ -679,7 +625,6 @@ Sets the status of this post to pending. sub setStatusPending { my ($self) = @_; $self->update({status=>'pending'}); - $self->getThread->setStatusPending if $self->isRootPost; WebGUI::MessageLog::addInternationalizedEntry('',$self->getThread->getParent->get("moderateGroupId"), $self->getUrl,578,'WebGUI','pending'); } @@ -698,6 +643,16 @@ sub unmarkRead { WebGUI::SQL->write("delete from forumRead where userId=".quote($session{user}{userId})." and postId=".quote($self->getId)); } +#------------------------------------------------------------------- +sub view { + my $self = shift; + $self->markRead; + $self->incrementViews; + return $self->getThread->view; +} + + + #------------------------------------------------------------------- =head2 www_approve ( ) @@ -729,26 +684,16 @@ sub www_deny { #------------------------------------------------------------------- sub www_edit { my $self = shift; - return WebGUI::Privilege::insufficient() unless ($self->canEdit); - my %var; - if ($session{form}{func} eq "add") { - $self->{_properties}{contentType} = "mixed"; - $var{'isNew'} = 1; - } - $var{'link.header.label'} = WebGUI::International::get(90,"USS"); - $var{'question.header.label'} = WebGUI::International::get(84,"USS"); - $var{'submission.header.label'} = WebGUI::International::get(19,"USS"); - $var{'user.isVisitor'} = ($session{user}{userId} eq '1'); - $var{'visitorName.label'} = WebGUI::International::get(438); - $var{'visitorName.form'} = WebGUI::Form::text({ - name=>"visitorName" - }); - $var{'form.header'} = WebGUI::Form::formHeader() + my %var = %{$self->getTemplateVars}; + $var{'form.header'} = WebGUI::Form::formHeader({action=>$self->getUrl}) .WebGUI::Form::hidden({ name=>"func", - value=>"editSave" + value=>"add" }); - if ($self->getId eq "new") { + my $content; + my $title; + if ($session{form}{func} eq "add") { # new post + $var{'isNewPost'} = 1; $var{'form.header'} .= WebGUI::Form::hidden({ name=>"assetId", value=>"new" @@ -756,49 +701,102 @@ sub www_edit { name=>"class", value=>$session{form}{class} }); + if ($self->getThread->getParent->canModerate) { + $var->{'lock.form'} = WebGUI::Form::yesNo({ + name=>'lock', + value=>$session{form}{'lock'} + }); + } + if ($session{form}{className} eq "WebGUI::Asset::Post") { # new reply + return $self->getThread->getParent->processStyle(WebGUI::Privilege::insufficient()) unless ($self->canReply); + $var{isReply} = 1; + if ($session{form}{content} || $session{form}{title}) { + $content = $session{form}{content}; + $title = $session{form}{title}; + } else { + $content = "[quote]".$self->getParent->get("content")."[/quote]" if ($session{form}{withQuote}); + $title = $self->getParent->get("subject"); + $title = "Re: ".$title unless ($title =~ /^Re:/); + } + $var{'subscribe.form'} = WebGUI::Form::yesNo({ + name=>"subscribe", + value=>$session{form}{subscribe} + }); + } elsif ($session{form}{className} eq "WebGUI::Asset::Post::Thread") { # new thread + return $self->getThread->getParent->processStyle(WebGUI::Privilege::insufficient()) unless ($self->getThread->getParent->canPost); + $var{isNewThread} = 1; + if ($self->getThread->getParent->canModerate) { + $var{'sticky.form'} = WebGUI::Form::yesNo({ + name=>'stick', + value=>$session{form}{stick} + }); + } + $var{'subscribe.form'} = WebGUI::Form::yesNo({ + name=>"subscribe", + value=>$session{form}{subscribe} || 1 + }); + } + $content .= "\n\n".$session{user}{signature} if ($session{user}{signature}); + } else { # edit + return $self->getThread->getParent->processStyle(WebGUI::Privilege::insufficient()) unless ($self->canEdit); + $var{isEdit} = 1; + $content = $self->getValue("content"); + $title = $self->getValue("title"); } - $var{'url.label'} = WebGUI::International::get(91,"USS"); - $var{'newWindow.label'} = WebGUI::International::get(92,"USS"); + if ($session{form}{title} || $session{form}{content} || $session{form}{synopsis}) { + $var{'preview.title'} = WebGUI::HTML::filter($session{form}{title},"none"); + ($var{'preview.synopsis'}, $var{'preview.content'}) = $self->getSynopsisAndContentFromFormPost; + $var{'preview.content'} = $self->formatContent($var{'preview.content'},$session{form}{contentType}); + } + $var{'form.preview'} = WebGUI::Form::submit({value=>"Preview"}); + $var{'form.submit'} = WebGUI::Form::button({ + value=>"Save", + onclick=>"this.value='Please wait...'; this.form.func.value='editSave'; this.form.submit();" + }); + $var{'form.footer'} = WebGUI::Form::formFooter(); + $var{usePreview} = $self->getThread->getParent->get("usePreview")) { + $var{'user.isVisitor'} = ($session{user}{userId} eq '1'); + $var{'visitorName.form'} = WebGUI::Form::text({ + name=>"visitorName", + value=>$self->getValue("visitorName") + }); for my $x (1..5) { $var{'userDefined'.$x.'.form'} = WebGUI::Form::text({ name=>"userDefined".$x, - value=>$self->get("userDefined".$x) + value=>$self->getValue("userDefined".$x) }); $var{'userDefined'.$x.'.form.yesNo'} = WebGUI::Form::yesNo({ name=>"userDefined".$x, - value=>$self->get("userDefined".$x) + value=>$self->getValue("userDefined".$x) }); $var{'userDefined'.$x.'.form.textarea'} = WebGUI::Form::textarea({ name=>"userDefined".$x, - value=>$self->get("userDefined".$x) + value=>$self->getValue("userDefined".$x) }); $var{'userDefined'.$x.'.form.textarea'} = WebGUI::Form::HTMLArea({ name=>"userDefined".$x, - value=>$self->get("userDefined".$x) + value=>$self->getValue("userDefined".$x) }); } - $var{'question.label'} = WebGUI::International::get(85,"USS"); - $var{'title.label'} = WebGUI::International::get(35,"USS"); $var{'title.form'} = WebGUI::Form::text({ name=>"title", - value=>$self->get("title") + value=>$title }); $var{'title.form.textarea'} = WebGUI::Form::textarea({ name=>"title", - value=>$self->get("title") + value=>$title }); - $var{'body.label'} = WebGUI::International::get(31,"USS"); - $var{'answer.label'} = WebGUI::International::get(86,"USS"); - $var{'description.label'} = WebGUI::International::get(85); - $var{'contet.form'} = WebGUI::Form::HTMLArea({ - name=>"content", - value=>$self->get("content") - }); - $var{'content.form.textarea'} = WebGUI::Form::textarea({ - name=>"content", - value=>$self->get("content") - }); -# $var{'image.label'} = WebGUI::International::get(32,"USS"); + if ($self->getThread->getParent->get("allowRichEdit")) { + $var{'content.form'} = WebGUI::Form::HTMLArea({ + name=>"content", + value=>$content + }); + } else { + $var{'content.form'} = WebGUI::Form::textarea({ + name=>"content", + value=>$content + }); + } # if ($submission->{image} ne "") { # $var{'image.form'} = ''.WebGUI::International::get(391).''; @@ -807,7 +805,6 @@ sub www_edit { # name=>"image" # }); # } -# $var{'attachment.label'} = WebGUI::International::get(33,"USS"); # if ($submission->{attachment} ne "") { # $var{'attachment.form'} = ''.WebGUI::International::get(391).''; @@ -816,291 +813,22 @@ sub www_edit { # name=>"attachment" # }); # } - $var{'contentType.label'} = WebGUI::International::get(1007); $var{'contentType.form'} = WebGUI::Form::contentType({ name=>'contentType', - value=>$self->get("contentType") || "mixed" + value=>$self->getValue("contentType") || "mixed" }); - $var{'startDate.label'} = WebGUI::International::get(497); - $var{'endDate.label'} = WebGUI::International::get(498); $var{'startDate.form'} = WebGUI::Form::dateTime({ name => 'startDate', - value => $self->get("startDate") + value => $self->getValue("startDate") }); $var{'endDate.form'} = WebGUI::Form::dateTime({ name => 'endDate', - value => $self->get("startDate") + value => $self->getValue("startDate") }); - $var{'form.submit'} = WebGUI::Form::submit(); - $var{'form.footer'} = WebGUI::Form::formFooter(); + $self->getThread->getParent->appendTemplateLabels(\%var); return $self->getParent->processStyle($self->processTemplate(\%var,$self->getParent->get("submissionFormTemplateId"))); } -#------------------------------------------------------------------- - -=head2 www_post ( caller ) - -The web method to display the post form. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=cut - -sub www_post { - my ($caller) = @_; - my ($subject, $message, $forum); - my $var; - $var->{'newpost.header'} = WebGUI::International::get(1064); - $var->{'newpost.isReply'} = ($session{form}{parentId} ne ""); - $var->{'newpost.isEdit'} = ($session{form}{forumPostId} ne ""); - $var->{'newpost.isNewThread'} = ($session{form}{parentId} eq "" && !$var->{'newpost.isEdit'}); - $var->{'user.isVisitor'} = ($session{user}{userId} eq '1'); - $var->{'newpost.isNewMessage'} = ($var->{'newpost.isNewThread'} || $var->{'newpost.isReply'}); - $var->{'form.begin'} = WebGUI::Form::formHeader({ - action=>$caller->{callback} - }); - my $defaultSubscribeValue = 0; - my $contentType = "mixed"; - if ($var->{'newpost.isReply'}) { - my $reply = WebGUI::Forum::Post->new($session{form}{parentId}); - return WebGUI::Privilege::insufficient() unless ($reply->getThread->getForum->canPost); - $var->{'form.begin'} .= WebGUI::Form::hidden({ - name=>'parentId', - value=>$reply->get("forumPostId") - }); - $forum = $reply->getThread->getForum; - $var->{'form.begin'} .= WebGUI::Form::hidden({ - name=>'forumId', - value=>$forum->get("forumId") - }); - $message = "[quote]".$reply->get("message")."[/quote]" if ($session{form}{withQuote}); - $var = getPostTemplateVars($reply, $reply->getThread, $forum, $caller, $var); - - $subject = $reply->get("subject"); - $subject = "Re: ".$subject unless ($subject =~ /^Re:/); - } - if ($var->{'newpost.isNewThread'}) { - $var->{'form.begin'} .= WebGUI::Form::hidden({ - name=>'forumId', - value=>$session{form}{forumId} - }); - $forum = WebGUI::Forum->new($session{form}{forumId}); - if ($forum->isModerator) { - $var->{'sticky.label'} = WebGUI::International::get(1013); - $var->{'sticky.form'} = WebGUI::Form::yesNo({ - name=>'isSticky', - value=>0 - }); - } - $defaultSubscribeValue = 1 unless ($forum->isSubscribed); - } - if ($var->{'newpost.isNewMessage'}) { - $var->{'subscribe.label'} = WebGUI::International::get(873); - return WebGUI::Privilege::insufficient() unless ($forum->canPost); - my $u = WebGUI::User->new($session{user}{userId}); - $u->karma($forum->get("karmaPerPost"),"Forum (".$forum->get("forumId").")","Forum Post") if ($session{setting}{useKarma}); - if ($forum->isModerator) { - $var->{'lock.label'} = WebGUI::International::get(1012); - $var->{'lock.form'} = WebGUI::Form::yesNo({ - name=>'isLocked', - value=>0 - }); - } - $var->{'subscribe.form'} = WebGUI::Form::yesNo({ - name=>'subscribe', - value=>$defaultSubscribeValue - }); - $message .= "\n\n".$session{user}{signature} if ($session{user}{signature}); - } - if ($var->{'newpost.isEdit'}) { - my $post = WebGUI::Forum::Post->new($session{form}{forumPostId}); - return WebGUI::Privilege::insufficient() unless ($post->getThread->getForum->canPost); - $subject = $post->get("subject"); - $message = $post->get("message"); - $forum = $post->getThread->getForum; - $var->{'form.begin'} .= WebGUI::Form::hidden({ - name=>"forumPostId", - value=>$post->get("forumPostId") - }); - $contentType = $post->get("contentType"); - } - $var->{'contentType.label'} = WebGUI::International::get(1007); - $var->{'contentType.form'} = WebGUI::Form::contentType({ - name=>'contentType', - value=>[$contentType] - }); - $var->{'user.isModerator'} = $forum->isModerator; - $var->{allowReplacements} = $forum->get("allowReplacements"); - if ($forum->get("allowRichEdit")) { - $var->{'message.form'} = WebGUI::Form::HTMLArea({ - name=>'message', - value=>$message - }); - } else { - $var->{'message.form'} = WebGUI::Form::textarea({ - name=>'message', - value=>$message - }); - } - $var->{'message.label'} = WebGUI::International::get(230); - if ($var->{'user.isVisitor'}) { - $var->{'visitorName.label'} = WebGUI::International::get(438); - $var->{'visitorName.form'} = WebGUI::Form::text({ - name=>'visitorName' - }); - } - my $forumOp = ($forum->get("usePreview"))? "postPreview" : "postSave"; - $var->{'form.begin'} .= WebGUI::Form::hidden({ - name=>'forumOp', - value=>$forumOp - }); - $var->{'form.submit'} = WebGUI::Form::submit(); - $var->{'subject.label'} = WebGUI::International::get(229); - $var->{'subject.form'} = WebGUI::Form::text({ - name=>'subject', - value=>$subject - }); - $var->{'form.end'} = WebGUI::Form::formFooter(); - return WebGUI::Template::process($forum->get("postformTemplateId"),"Forum/PostForm", $var); -} - -#------------------------------------------------------------------- - -=head2 www_postPreview ( caller ) - -The web method to generate a preview of a posting. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=cut - -sub www_postPreview { - my ($caller) = @_; - - - my $forumId = $session{form}{forumId}; - my $threadId = $session{form}{forumThreadId}; - my $postId = $session{form}{forumPostId}; - my $subject = $session{form}{subject}; - $subject = WebGUI::International::get(232) if ($subject eq ""); - $subject .= ' '.WebGUI::International::get(233) if ($session{form}{message} eq ""); - if ( $subject ne "") { # subjects could never contain anything other than text - $subject = WebGUI::HTML::filter(WebGUI::HTML::processReplacements($subject),"all"); - } - my $newPost = WebGUI::Forum::Post->new(); - - $newPost->{_properties}->{message} = $session{form}{message}; - $newPost->{_properties}->{subject} = $subject; - $newPost->{_properties}->{contentType} = $session{form}{contentType}; - $newPost->{_properties}->{userId} = $session{user}{userId}; - $newPost->{_properties}->{username} = ($session{form}{visitorName} || $session{user}{alias}); - $newPost->{_properties}->{dateUpdated} = WebGUI::DateTime::time(); - my $forum = WebGUI::Forum->new($forumId); - - my $var = getPostTemplateVars($newPost, WebGUI::Forum::Thread->new($threadId), WebGUI::Forum->new($forumId), $caller); - $var->{'newpost.header'} = WebGUI::International::get('Forum, Preview Heading'); - - $var->{'form.begin'} = WebGUI::Form::formHeader({ - action=>$caller->{callback} - }); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'forumId', value=>$forumId}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'forumThreadId', value=>$threadId}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'forumPostId', value=>$postId}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'parentId', value=>$session{form}{parentId}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'subject', value=>$subject}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'message', value=>$session{form}{message}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'contentType', value=>$session{form}{contentType}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'visitorName', value=>$session{form}{visitorName}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'subscribe', value=>$session{form}{subscribe}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'isLocked', value=>$session{form}{isLocked}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'isSticky', value=>$session{form}{isSticky}}); - $var->{'form.begin'} .= WebGUI::Form::hidden({name=>'forumOp', value=>"postSave"}); - $var->{'form.submit'} = WebGUI::Form::submit(); - $var->{'form.end'} = WebGUI::Form::formFooter(); - return WebGUI::Template::process($forum->get("postPreviewTemplateId"),"Forum/PostPreview", $var); -} - - -#------------------------------------------------------------------- - -=head2 www_postSave ( caller ) - -The web method to save the data from the post form. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=cut - -sub www_postSave { - my ($caller) = @_; - my $forumId = $session{form}{forumId}; - my $threadId = $session{form}{forumThreadId}; - my $postId = $session{form}{forumPostId}; - my $subject = $session{form}{subject}; - $subject = WebGUI::International::get(232) if ($subject eq ""); - $subject .= ' '.WebGUI::International::get(233) if ($session{form}{message} eq ""); - if ( $subject ne "") { # subjects could never contain anything other than text - $subject = WebGUI::HTML::filter(WebGUI::HTML::processReplacements($subject),"all"); - } - my %postData = ( - message=>$session{form}{message}, - subject=>$subject, - contentType=>$session{form}{contentType} - ); - my %postDataNew = ( - userId=>$session{user}{userId}, - username=>($session{form}{visitorName} || $session{user}{alias}) - ); - if ($session{form}{parentId} ne '') { # reply - %postData = (%postData, %postDataNew); - my $parentPost = WebGUI::Forum::Post->new($session{form}{parentId}); - return WebGUI::Privilege::insufficient() unless ($parentPost->getThread->getForum->canPost); - $parentPost->getThread->subscribe($session{user}{userId}) if ($session{form}{subscribe}); - $parentPost->getThread->lock if ($session{form}{isLocked}); - $postData{forumThreadId} = $parentPost->getThread->get("forumThreadId"); - $postData{parentId} = $session{form}{parentId}; - my $post = WebGUI::Forum::Post->create(\%postData); - setPostStatus($caller,$post); - WebGUI::HTTP::setRedirect(formatThreadURL($caller->{callback}, $post->get("forumPostId"))); - - return "Redirecting..."; - #return www_viewThread($caller,$post->get("forumPostId")); - } - if ($session{form}{forumPostId} ne '') { # edit - my $post = WebGUI::Forum::Post->new($session{form}{forumPostId}); - return WebGUI::Privilege::insufficient() unless ($post->canEdit); - if ($post->getThread->getForum->get("addEditStampToPosts")) { - $postData{message} .= "\n\n --- (".WebGUI::International::get(1029)." " - .WebGUI::DateTime::epochToHuman(WebGUI::DateTime::time())." ".WebGUI::International::get(1030) - ." $session{user}{username}) --- \n"; - } - $post->set(\%postData); - WebGUI::HTTP::setRedirect(formatThreadURL($caller->{callback}, $post->get("forumPostId"))); - return "Redirecting..."; - #return www_viewThread($caller,$post->get("forumPostId")); - } - if ($forumId) { # new post - %postData = (%postData, %postDataNew); - my $forum = WebGUI::Forum->new($forumId); - return WebGUI::Privilege::insufficient() unless ($forum->canPost); - my $thread = WebGUI::Forum::Thread->create({ - forumId=>$forumId, - isSticky=>$session{form}{isSticky}, - isLocked=>$session{form}{isLocked} - }, \%postData); - $thread->subscribe($session{user}{userId}) if ($session{form}{subscribe}); - setPostStatus($caller,$thread->getPost($thread->get("rootPostId"))); - WebGUI::HTTP::setRedirect(formatForumURL($caller->{callback}, $forumId)); - return "Redirecting..."; - #return www_viewForum($caller,$forumId); - } -} #------------------------------------------------------------------- @@ -1117,11 +845,27 @@ sub www_rate { } +#------------------------------------------------------------------- + +=head2 www_redirectToParent ( ) + +This is here to stop people from duplicating posts by hitting refresh in their browser. + +=cut + +sub www_redirectToParent { + my $self = shift; + WebGUI::HTTP::setRedirect($self->getThread->getParent->getUrl); +} + + + #------------------------------------------------------------------- sub www_view { my $self = shift; - return $self->getParent->processStyle(WebGUI::Privilege::noAccess()) unless $self->canView; - return $self->getParent->processStyle($self->view); + $self->markRead; + $self->incrementViews; + return $self->getThread->www_view; } diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm new file mode 100644 index 000000000..30e01f4d0 --- /dev/null +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -0,0 +1,732 @@ +package WebGUI::Asset::Post::Thread; + +#------------------------------------------------------------------- +# 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 WebGUI::Asset::Template; +use WebGUI::Asset::Post; +use WebGUI::DateTime; +use WebGUI::Grouping; +use WebGUI::International; +use WebGUI::MessageLog; +use WebGUI::Paginator; +use WebGUI::Privilege; +use WebGUI::Session; +use WebGUI::SQL; + +our @ISA = qw(WebGUI::Asset::Post); + + +#------------------------------------------------------------------- +sub canReply { + my $self = shift; + return !$self->isLocked && $self->getParent->get("allowReplies") && $self->getParent->canPost; +} + +#------------------------------------------------------------------- +sub canSubscribe { + my $self = shift; + return ($session{user}{userId} ne "1" && $self->canView); +} + +#------------------------------------------------------------------- +sub createSubscriptionGroup { + my $self = shift; + my $group = WebGUI::Group->new("new"); + $group->name($self->getId); + $group->description("The group to store subscriptions for the collaboration system ".$self->getId); + $group->isEditable(0); + $group->showInForms(0); + $group->deleteGroups([3]); # admins don't want to be auto subscribed to this thing + $self->update({ + subscriptionGroupId=>$group->groupId + }); +} + +#------------------------------------------------------------------- + +=head2 decrementReplies ( ) + +Deccrements this reply counter. + +=cut + +sub decrementReplies { + my $self = shift; + $self->update({replies=>$self->get("replies")-1}); + $self->getParent->decrementReplies; +} + +#------------------------------------------------------------------- +sub definition { + my $class = shift; + my $definition = shift; + push(@{$definition}, { + tableName=>'Thread', + className=>'WebGUI::Asset::Post::Thread', + properties=>{ + subscriptionGroupId => { + fieldType=>"hidden", + defaultValue=>undef + }, + replies => { + fieldType=>"hidden", + defaultValue=>undef + }, + isSticky => { + fieldType=>"yesNo", + defaultValue=>0 + }, + isLocked => { + fieldType=>"yesNo", + defaultValue=>0 + }, + lastPostId => { + fieldType=>"hidden", + defaultValue=>undef + }, + lastPostDate => { + fieldType=>"hidden", + defaultValue=>undef + } + }, + }); + return $class->SUPER::definition($definition); +} + +#------------------------------------------------------------------- + +sub DESTROY { + my $self = shift; + $self->{_next}->DESTROY if (exists $self->{_next}); + $self->{_previous}->DESTROY if (exists $self->{_previous}); + $self->SUPER::DESTROY; +} + + +#------------------------------------------------------------------- +sub getIcon { + my $self = shift; + my $small = shift; + return $session{config}{extrasURL}.'/assets/small/thread.gif' if ($small); + return $session{config}{extrasURL}.'/assets/thread.gif'; +} + +#------------------------------------------------------------------- +sub getName { + return "Thread"; +} + +#------------------------------------------------------------------- + +=head2 getLayoutUrl ( layout [, postId] ) + +Formats the url to change the layout of a thread. + +=head3 layout + +A string indicating the type of layout to use. Can be flat, nested, or threaded. + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getLayoutUrl { + my $self = shift; + my $layout = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("layout=".$layout."#".$postId); +} + +#------------------------------------------------------------------- + +=head2 getLockUrl ( [ postId ] ) + +Formats the url to lock a thread. + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getLockUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + $self->getUrl("fucn=lock#">$postId); +} + +#------------------------------------------------------------------- + +=head2 getNextThread ( ) + +Returns a thread object for the next (newer) thread in the same forum. + +=cut + +sub getNextThread { + my $self = shift; + unless (exists $self->{_next}) { + $self->{_next} = WebGUI::Asset::Post->newByPropertyHashRef( + WebGUI::SQL->quickHashRef(" + select asset.*,Post.* + from Thread + left join asset on asset.assetId=Thread.assetId + left join Post on Post.assetId=asset.assetId + where Thread.parentId=".quote($self->get("parentId"))." + and asset.state='published' + and asset.className='WebGUI::Asset::Post::Thread' + and ".$self->getParent->getValue("sortBy").">".quote($self->get($self->getParent->getValue("sortBy")))." + and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') + order by ".$self->getParent->getValue("sortBy")." asc + ",WebGUI::SQL->getSlave) + ); + }; + return $self->{_next}; +} + + + +#------------------------------------------------------------------- + +=head2 getPreviousThread ( ) + +Returns a thread object for the previous (older) thread in the same forum. + +=cut + +sub getPreviousThread { + my $self = shift; + unless (exists $self->{_previous}) { + $self->{_previous} = WebGUI::Asset::Post->newByPropertyHashRef( + WebGUI::SQL->quickHashRef(" + select asset.*,Post.* + from Thread + left join asset on asset.assetId=Thread.assetId + left join Post on Post.assetId=asset.assetId + where Thread.parentId=".quote($self->get("parentId"))." + and asset.state='published' + and asset.className='WebGUI::Asset::Post::Thread' + and ".$self->getParent->getValue("sortBy")."<".quote($self->get($self->getParent->getValue("sortBy")))." + and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') + order by ".$self->getParent->getValue("sortBy")." desc + ",WebGUI::SQL->getSlave) + ); + }; + return $self->{_previous}; +} + + +#------------------------------------------------------------------- + +=head2 getStickUrl ( [ postId ] ) + +Formats the url to make a thread sticky. + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getStickUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("func=stick#".$postId); +} + +#------------------------------------------------------------------- + +=head2 getSubscribeUrl ( [ postId ] ) + +Formats the url to subscribe to the thread + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getSubscribeUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("func=subscribe#".$postId); +} + + +#------------------------------------------------------------------- +sub getThread { + return $self; +} + +#------------------------------------------------------------------- + +=head2 getUnlockUrl ( [ postId ] ) + +Formats the url to unlock the thread + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getUnlockUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("func=unlock#".$postId); +} + + +#------------------------------------------------------------------- + +=head2 getUnstickUrl ( [ postId ] ) + +Formats the url to unstick the thread + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getUnstickUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("func=unstick#".$postId); +} + +#------------------------------------------------------------------- + +=head2 getUnsubscribeUrl ( [ postId ] ) + +Formats the url to unsubscribe from the thread + +=head3 postId + +The asset id of the post to position on. Defaults to the root post of the thread. + +=cut + +sub getUnsubscribeUrl { + my $self = shift; + my $postId = shift || $self->get("rootPostId"); + return $self->getUrl("func=unsubscribe#".$postId); +} + + +#------------------------------------------------------------------- + +=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) = @_; + $self->update({replies=>$self->get("replies")+1, lastPostId=>$replyId, lastPostDate=>$dateOfReply}); + $self->getParent->incrementReplies($dateOfReply,$replyId); +} + +#------------------------------------------------------------------- + +=head2 incrementViews ( ) + +Increments the views counter for this thread. + +=cut + +sub incrementViews { + my ($self) = @_; + $self->update({views=>$self->get("views")+1}); + $self->getParent->incrementViews; +} + +#------------------------------------------------------------------- + +=head2 isMarkedRead ( ) + +Returns a boolean indicating whether this thread is marked read for the user. + +=cut + +sub isMarkedRead { + my $self = shift; + return 1 if $self->isPoster; + my ($isRead) = WebGUI::SQL->quickArray("select count(*) from Post_read where userId=".quote($session{user}{userId})." and threadId=".quote($self->getId)); + return $isRead; +} + +#------------------------------------------------------------------- + +=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 ( ) + +Returns a boolean indicating whether the user is subscribed to this thread. + +=cut + +sub isSubscribed { + my $self = shift; + return WebGUI::Grouping::isInGroup($self->get("subscriptionGroupId")); +} + +#------------------------------------------------------------------- + +=head2 lock ( ) + +Sets this thread to be locked from edits. + +=cut + +sub lock { + my ($self) = @_; + $self->update({isLocked=>1}); +} + + +#------------------------------------------------------------------- + +=head2 rate ( rating ) + +Stores a rating against this post. + +=head3 rating + +An integer between 1 and 5 (5 being best) to rate this post with. + +=cut + +sub rate { + my $self = shift; + my $rating = shift; + unless ($self->hasRated) { + WebGUI::SQL->write("insert into Post_rating (assetId,userId,ipAddress,dateOfRating,rating) values (" + .quote($self->getId).", ".quote($session{user}{userId}).", ".quote($session{env}{REMOTE_ADDR}).", + ".WebGUI::DateTime::time().", $rating)"); + my ($count) = WebGUI::SQL->quickArray("select count(*) from Post left join asset on Post.assetId=asset.assetId + where Post.threadId=".quote($self->getId)." and Post.rating>0"); + $count = $count || 1; + my ($sum) = WebGUI::SQL->quickArray("select sum(Post.rating) from Post left join asset on Post.assetId=asset.assetId + where Post.threadId=".quote($self->getId)." and Post.rating>0"); + my $average = round($sum/$count); + $self->update({rating=>$average}); + $self->getParent->recalculateRating; + } +} + + + +#------------------------------------------------------------------- + +=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->update({ + lastPostId=>$postId, + lastPostDate=>$postDate + }); + $self->getParent->setLastPost($postDate, $postId); +} + + +#------------------------------------------------------------------- + +=head2 stick ( ) + +Makes this thread sticky. + +=cut + +sub stick { + my ($self) = @_; + $self->update({isSticky=>1}); +} + +#------------------------------------------------------------------- + +=head2 subscribe ( ) + +Subscribes the user to this thread. + +=cut + +sub subscribe { + my $self = shift; + unless ($self->isSubscribed) { + WebGUI::Grouping::addUsersToGroups([$session{user}{userId}],[$self->get("subscriptionGroupId")]); + } +} + +#------------------------------------------------------------------- + +=head2 unlock ( ) + +Negates the lock method. + +=cut + +sub unlock { + my ($self) = @_; + $self->update({isLocked=>0}); +} + +#------------------------------------------------------------------- + +=head2 unstick ( ) + +Negates the stick method. + +=cut + +sub unstick { + my ($self) = @_; + $self->update({isSticky=>0}); +} + +#------------------------------------------------------------------- + +=head2 unsubscribe ( ) + +Negates the subscribe method. + +=cut + +sub unsubscribe { + my $self = shift; + if ($self->isSubscribed) { + WebGUI::Grouping::deleteUsersFromGroups([$session{user}{userId}],[$self->get("subscriptionGroupId")]); + } +} + + +#------------------------------------------------------------------- +sub view { + my $self = shift; + $self->markRead; + $self->incrementViews; + WebGUI::Session::setScratch("forumThreadLayout",$session{form}{layout}); + my $var = $self->getTemplateVars; + $self->getParent->appendTemplateLabels($var); + + $var->{'user.isVisitor'} = ($session{user}{userId} eq '1'); + $var->{'user.isModerator'} = $self->canModerate; + $var->{'user.canPost'} = $self->getParent->canPost; + $var->{'user.canReply'} = $self->canReply; + + $var->{'layout.nested.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"nested"); + $var->{'layout.flat.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"flat"); + $var->{'layout.threaded.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"threaded"); + my $layout = $session{scratch}{forumThreadLayout} || $session{user}{discussionLayout}; + $var->{'layout.isFlat'} = ($layout eq "flat"); + $var->{'layout.isNested'} = ($layout eq "nested"); + $var->{'layout.isThreaded'} = ($layout eq "threaded" || !($var->{'thread.layout.isNested'} || $var->{'thread.layout.isFlat'})); + + $var->{'user.isSubscribed'} = $thread->isSubscribed; + $var->{'subscribe.url'} = formatThreadSubscribeURL($callback,$post->get("forumPostId")); + $var->{'unsubscribe.url'} = formatThreadUnsubscribeURL($callback,$post->get("forumPostId")); + + $var->{'isSticky'} = $thread->isSticky; + $var->{'stick.url'} = formatThreadStickURL($callback,$post->get("forumPostId")); + $var->{'unstick.url'} = formatThreadUnstickURL($callback,$post->get("forumPostId")); + + $var->{'isLocked'} = $thread->isLocked; + $var->{'lock.url'} = formatThreadLockURL($callback,$post->get("forumPostId")); + $var->{'unlock.url'} = formatThreadUnlockURL($callback,$post->get("forumPostId")); + + my $p = WebGUI::Paginator->new($self->getUrl),$self->getParent->get("postsPerPage")); + my $sql = "select * from asset + left join Post on Post.assetId=asset.assetId + left join Thread on Thread.assetId=asset.assetId + where asset.lineage like ".quote($self->get("lineage").'%')." + and asset.assetId<>".quote($self->getId)." + and ( + Post.status in ('approved','archived')"; + $sql .= " or Post.status='pending'" if ($self->getParent->canModerate); + $sql .= " or (asset.ownerUserId=".quote($session{user}{userId})." and asset.ownerUserId<>'1') + ) + order by "; + if ($layout eq "flat") { + $sql .= "post.dateSubmitted"; + } else { + $sql .= "asset.lineage"; + } + $p->setDataByQuery($sql); + foreach my $dataSet (@{$p->getPageData()}) { + my $reply = WebGUI::Asset::Post->newByPropertyHashRef($dataSet); + my $replyVars = $reply->getTemplateVars; + $replyVars->{isCurrent} = $session{asset}->getId eq $reply->getId; + $replyVars->{depth} = $reply->getLineageLength - $self->getLineageLength - 1; + my @depth_loop; + for (my $i=0; $i<$replyVars->{depth}; $i++) { + push(@{$replyVars->{indent_loop}},{depth=>$i}); + } + push (@{$var->{reply_loop}}, $replyVars); + } + $p->appendTemplateVars($var); + $var->{'add.url'} = $self->getParent->getNewThreadUrl; + + my $previous = $self->getPreviousThread; + $var->{"previous.url"} = $previous->getUrl if (defined $previous); + my $next = $self->getNextThread; + $var->{"next.url"} = $next->getUrl if (defined $next); + + $var->{"search.url"} = $self->getParent->getSearchUrl; + $var->{"back.url"} = $self->getThread->getParent->getUrl; + return $self->processTemplate($var,$self->getParent->get("submissionTemplateId")); +} + + +#------------------------------------------------------------------- + +=head2 www_lock ( ) + +The web method to lock a thread. + +=cut + +sub www_lock { + my $self = shift; + $self->lock if $self->getParent->canModerate; + return $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_stick ( ) + +The web method to make a thread sticky. + +=cut + +sub www_stick { + my $self = shift; + $self->stick if $self->getParent->canModerate; + return $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_subscribe ( ) + +The web method to subscribe to a thread. + +=cut + +sub www_subscribe { + my $self = shift; + $self->subscribe if $self->canSubscribe; + return $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_unlock ( ) + +The web method to unlock a thread. + +=cut + +sub www_unlock { + my $self = shift; + $self->unlock if $self->getParent->canModerate; + return $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_unstick ( ) + +The web method to make a sticky thread normal again. + +=cut + +sub www_unstick { + my $self = shift; + $self->unstick if $self->getParent->canModerate; + $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_threadUnsubscribe ( ) + +The web method to unsubscribe from a thread. + +=cut + +sub www_unsubscribe { + my $self = shift; + $self->unsubscribe if $self->canSubscribe; + return $self->www_view; +} + +#------------------------------------------------------------------- +sub www_view { + my $self = shift; + return $self->getParent->processStyle(WebGUI::Privilege::noAccess()) unless $self->canView; + return $self->getParent->processStyle($self->view); +} + + +1; + diff --git a/lib/WebGUI/Asset/Thread.pm b/lib/WebGUI/Asset/Thread.pm deleted file mode 100644 index cf168c4af..000000000 --- a/lib/WebGUI/Asset/Thread.pm +++ /dev/null @@ -1,1038 +0,0 @@ -package WebGUI::Asset::Thread; - -#------------------------------------------------------------------- -# 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 WebGUI::Asset; -use WebGUI::Asset::Template; -use WebGUI::Asset::Post; -use WebGUI::DateTime; -use WebGUI::Grouping; -use WebGUI::International; -use WebGUI::MessageLog; -use WebGUI::Paginator; -use WebGUI::Privilege; -use WebGUI::Session; -use WebGUI::SQL; - -our @ISA = qw(WebGUI::Asset); - - -#------------------------------------------------------------------- -sub canSubscribe { - my $self = shift; - return ($session{user}{userId} ne "1" && $self->canView); -} - -#------------------------------------------------------------------- -sub createSubscriptionGroup { - my $self = shift; - my $group = WebGUI::Group->new("new"); - $group->name($self->getId); - $group->description("The group to store subscriptions for the collaboration system ".$self->getId); - $group->isEditable(0); - $group->showInForms(0); - $group->deleteGroups([3]); # admins don't want to be auto subscribed to this thing - $self->update({ - subscriptionGroupId=>$group->groupId - }); -} - -#------------------------------------------------------------------- - -=head2 decrementReplies ( ) - -Deccrements this reply counter. - -=cut - -sub decrementReplies { - my $self = shift; - $self->update({replies=>$self->get("replies")-1}); - $self->getParent->decrementReplies; -} - -#------------------------------------------------------------------- -sub definition { - my $class = shift; - my $definition = shift; - push(@{$definition}, { - tableName=>'Thread', - className=>'WebGUI::Asset::Thread', - properties=>{ - subscriptionGroupId => { - fieldType=>"hidden", - defaultValue=>undef - }, - status => { - fieldType=>"hidden", - defaultValue=>undef - }, - rating => { - fieldType=>"hidden", - defaultValue=>undef - }, - replies => { - fieldType=>"hidden", - defaultValue=>undef - }, - views => { - fieldType=>"hidden", - defaultValue=>undef - }, - isSticky => { - fieldType=>"yesNo", - defaultValue=>0 - }, - isLocked => { - fieldType=>"yesNo", - defaultValue=>0 - }, - lastPostId => { - fieldType=>"hidden", - defaultValue=>undef - }, - lastPostDate => { - fieldType=>"hidden", - defaultValue=>undef - } - }, - }); - return $class->SUPER::definition($definition); -} - -#------------------------------------------------------------------- - -sub DESTROY { - my $self = shift; - $self->{_next}->DESTROY if (exists $self->{_next}); - $self->{_previous}->DESTROY if (exists $self->{_previous}); - $self->SUPER::DESTROY; -} - - -#------------------------------------------------------------------- - -=head2 getFlatThread ( post, thread, forum, caller, currentPost ) - -Returns an array reference with the template variables from all the posts in a thread in flat mode. In flat mode -messages are ordered by submission date, so threading is not maintained. - -=head3 post - -A post object. - -=head3 thread - -A thread object. - -=head3 forum - -A forum object. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=head3 currentPost - -The unique id of the post that was selected by the user in this thread. - -=cut - -sub getFlatThread { - my ($post, $thread, $forum, $caller, $currentPost) = @_; - my (@post_loop, @posts, $OR); - unless ($post->getThread->getForum->isModerator) { - $OR = " and not (status='denied' OR status='pending')"; - } - @posts = WebGUI::SQL->buildArray("SELECT forumPostId FROM forumPost WHERE forumThreadId=".quote($thread->get("forumThreadId"))." $OR ORDER BY dateOfPost"); - foreach my $postId (@posts){ - my $post = WebGUI::Forum::Post->new($postId); - push (@post_loop, getPostTemplateVars($post,$thread, $forum, $caller, { - 'post.isCurrent'=>($currentPost eq $post->get("forumPostId")) - })); - } - return \@post_loop; -} - - -#------------------------------------------------------------------- -sub getIcon { - my $self = shift; - my $small = shift; - return $session{config}{extrasURL}.'/assets/small/thread.gif' if ($small); - return $session{config}{extrasURL}.'/assets/thread.gif'; -} - -#------------------------------------------------------------------- -sub getName { - return "Thread"; -} - -#------------------------------------------------------------------- - -=head2 getLayoutUrl ( layout [, postId] ) - -Formats the url to change the layout of a thread. - -=head3 layout - -A string indicating the type of layout to use. Can be flat, nested, or threaded. - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getLayoutUrl { - my $self = shift; - my $layout = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("layout=".$layout."#".$postId); -} - -#------------------------------------------------------------------- - -=head2 getLockUrl ( [ postId ] ) - -Formats the url to lock a thread. - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getLockUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - $self->getUrl("fucn=lock#">$postId); -} - -#------------------------------------------------------------------- - -=head2 getNextThread ( ) - -Returns a thread object for the next (newer) thread in the same forum. - -=cut - -sub getNextThread { - my $self = shift; - unless (exists $self->{_next}) { - $self->{_next} = WebGUI::Asset::Post->newByPropertyHashRef( - WebGUI::SQL->quickHashRef(" - select asset.*,Post.* - from Thread - left join asset on asset.parentId=Thread.assetId - left join Post on Post.assetId=asset.assetId - where Thread.parentId=".quote($self->get("parentId"))." - and asset.state='published' - and ".$self->getParent->getValue("sortBy").">".quote($self->get($self->getParent->getValue("sortBy")))." - and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') - order by ".$self->getParent->getValue("sortBy")." asc - ",WebGUI::SQL->getSlave) - ); - }; - return $self->{_next}; -} - - - -#------------------------------------------------------------------- - -=head2 getPreviousThread ( ) - -Returns a thread object for the previous (older) thread in the same forum. - -=cut - -sub getPreviousThread { - my $self = shift; - unless (exists $self->{_previous}) { - $self->{_previous} = WebGUI::Asset::Post->newByPropertyHashRef( - WebGUI::SQL->quickHashRef(" - select asset.*,Post.* - from Thread - left join asset on asset.parentId=Thread.assetId - left join Post on Post.assetId=asset.assetId - where Thread.parentId=".quote($self->get("parentId"))." - and asset.state='published' - and ".$self->getParent->getValue("sortBy")."<".quote($self->get($self->getParent->getValue("sortBy")))." - and (userId=".quote($self->get("ownerUserId"))." or Post.status='approved') - order by ".$self->getParent->getValue("sortBy")." desc - ",WebGUI::SQL->getSlave) - ); - }; - return $self->{_previous}; -} - - -#------------------------------------------------------------------- - -=head2 getStickUrl ( [ postId ] ) - -Formats the url to make a thread sticky. - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getStickUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("func=stick#".$postId); -} - -#------------------------------------------------------------------- - -=head2 getSubscribeUrl ( [ postId ] ) - -Formats the url to subscribe to the thread - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getSubscribeUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("func=subscribe#".$postId); -} - - -#------------------------------------------------------------------- - -=head2 getThreadTemplateVars ( caller, post ) - -Returns a hash reference compatible with WebGUI's template system containing the template variables for the thread. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=head3 post - -A post object. - -=cut - -sub getThreadTemplateVars { - my ($caller, $post) = @_; - my $callback = $caller->{callback}; - $post->markRead($session{user}{userId}); - my $thread = $post->getThread; - unless ($post->canView) { - $post = $thread->getPost($thread->get("rootPostId")); - } - my $forum = $thread->getForum; - my $var = getPostTemplateVars($post, $thread, $forum, $caller); - my $root = WebGUI::Forum::Post->new($thread->get("rootPostId")); - $var->{'callback.url'} = $callback; - $var->{'callback.label'} = WebGUI::International::get(1039); - $var->{'user.canPost'} = $forum->canPost; - $var->{'user.isVisitor'} = ($session{user}{userId} eq '1'); - $var->{'user.isModerator'} = $forum->isModerator; - $var->{'user.isSubscribed'} = $thread->isSubscribed; - $var->{'thread.layout.nested.label'} = WebGUI::International::get(1045); - $var->{'thread.layout.nested.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"nested"); - $var->{'thread.layout.flat.label'} = WebGUI::International::get(510); - $var->{'thread.layout.flat.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"flat"); - $var->{'thread.layout.threaded.label'} = WebGUI::International::get(511); - $var->{'thread.layout.threaded.url'} = formatThreadLayoutURL($callback,$post->get("forumPostId"),"threaded"); - my $layout = $session{scratch}{forumThreadLayout} || $session{user}{discussionLayout}; - $var->{'thread.layout.isFlat'} = ($layout eq "flat"); - $var->{'thread.layout.isNested'} = ($layout eq "nested"); - $var->{'thread.layout.isThreaded'} = ($layout eq "threaded" || !($var->{'thread.layout.isNested'} || $var->{'thread.layout.isFlat'})); - $var->{'thread.subscribe.url'} = formatThreadSubscribeURL($callback,$post->get("forumPostId")); - $var->{'thread.subscribe.label'} = WebGUI::International::get(873); - $var->{'thread.unsubscribe.url'} = formatThreadUnsubscribeURL($callback,$post->get("forumPostId")); - $var->{'thread.unsubscribe.label'} = WebGUI::International::get(874); - $var->{'thread.isSticky'} = $thread->isSticky; - $var->{'thread.stick.url'} = formatThreadStickURL($callback,$post->get("forumPostId")); - $var->{'thread.stick.label'} = WebGUI::International::get(1037); - $var->{'thread.unstick.url'} = formatThreadUnstickURL($callback,$post->get("forumPostId")); - $var->{'thread.unstick.label'} = WebGUI::International::get(1038); - $var->{'thread.isLocked'} = $thread->isLocked; - $var->{'thread.lock.url'} = formatThreadLockURL($callback,$post->get("forumPostId")); - $var->{'thread.lock.label'} = WebGUI::International::get(1040); - $var->{'thread.unlock.url'} = formatThreadUnlockURL($callback,$post->get("forumPostId")); - $var->{'thread.unlock.label'} = WebGUI::International::get(1041); - my $p = WebGUI::Paginator->new(WebGUI::URL::append($callback,"forumOp=viewThread&forumPostId=".$post->get("forumPostId")."&layout=$layout"),$forum->get("postsPerPage")); - if($layout eq "flat"){ - $p->setDataByArrayRef(getFlatThread($root, $thread, $forum, $caller, $post->get("forumPostId"))); - $var->{post_loop} = $p->getPageData(); - }else{ - $p->setDataByArrayRef(recurseThread($root, $thread, $forum, 0, $caller, $post->get("forumPostId"))); - $var->{post_loop} = $p->getPageData(); - } - $var->{firstPage} = $p->getFirstPageLink; - $var->{lastPage} = $p->getLastPageLink; - $var->{nextPage} = $p->getNextPageLink; - $var->{pageList} = $p->getPageLinks; - $var->{previousPage} = $p->getPreviousPageLink; - $var->{multiplePages} = ($p->getNumberOfPages > 1); - $var->{numberOfPages} = $p->getNumberOfPages; - $var->{pageNumber} = $p->getPageNumber; - - $var->{'thread.subject.label'} = WebGUI::International::get(229); - $var->{'thread.date.label'} = WebGUI::International::get(245); - $var->{'thread.user.label'} = WebGUI::International::get(244); - $var->{'thread.new.url'} = formatNewThreadURL($callback,$thread->get("forumId")); - $var->{'thread.new.label'} = WebGUI::International::get(1018); - $var->{'thread.previous.url'} = formatPreviousThreadURL($callback,$thread->get("forumThreadId")); - $var->{'thread.previous.label'} = WebGUI::International::get(513); - $var->{'thread.next.url'} = formatNextThreadURL($callback,$thread->get("forumThreadId")); - $var->{'thread.next.label'} = WebGUI::International::get(512); - $var->{'thread.list.url'} = formatForumURL($callback,$forum->get("forumId")); - $var->{'thread.list.label'} = WebGUI::International::get(1019); - $var->{'forum.title'} = $caller->{title}; - $var->{'forum.description'} = $caller->{description}; - return $var; -} - -#------------------------------------------------------------------- - -=head2 getUnlockUrl ( [ postId ] ) - -Formats the url to unlock the thread - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getUnlockUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("func=unlock#".$postId); -} - - -#------------------------------------------------------------------- - -=head2 getUnstickUrl ( [ postId ] ) - -Formats the url to unstick the thread - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getUnstickUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("func=unstick#".$postId); -} - -#------------------------------------------------------------------- - -=head2 getUnsubscribeUrl ( [ postId ] ) - -Formats the url to unsubscribe from the thread - -=head3 postId - -The asset id of the post to position on. Defaults to the root post of the thread. - -=cut - -sub getUnsubscribeUrl { - my $self = shift; - my $postId = shift || $self->get("rootPostId"); - return $self->getUrl("func=unsubscribe#".$postId); -} - - -#------------------------------------------------------------------- - -=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) = @_; - $self->update({replies=>$self->get("replies")+1, lastPostId=>$replyId, lastPostDate=>$dateOfReply}); - $self->getParent->incrementReplies($dateOfReply,$replyId); -} - -#------------------------------------------------------------------- - -=head2 incrementViews ( ) - -Increments the views counter for this thread. - -=cut - -sub incrementViews { - my ($self) = @_; - $self->update({views=>$self->get("views")+1}); - $self->getParent->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 ( ) - -Returns a boolean indicating whether the user is subscribed to this thread. - -=cut - -sub isSubscribed { - my $self = shift; - return WebGUI::Grouping::isInGroup($self->get("subscriptionGroupId")); -} - -#------------------------------------------------------------------- - -=head2 lock ( ) - -Sets this thread to be locked from edits. - -=cut - -sub lock { - my ($self) = @_; - $self->update({isLocked=>1}); -} - - - -#------------------------------------------------------------------- - -=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 Post left join asset on Post.assetId=asset.assetId - where Post.threadId=".quote($self->getId)." and Post.rating>0"); - $count = $count || 1; - my ($sum) = WebGUI::SQL->quickArray("select sum(Post.rating) from Post left join asset on Post.assetId=asset.assetId - where Post.threadId=".quote($self->getId)." and Post.rating>0"); - my $average = round($sum/$count); - $self->update({rating=>$average}); - $self->getParent->recalculateRating; -} - -#------------------------------------------------------------------- - -=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->update({ - lastPostId=>$postId, - lastPostDate=>$postDate - }); - $self->getParent->setLastPost($postDate, $postId); -} - -#------------------------------------------------------------------- - -=head2 setStatusApproved ( ) - -Sets the status of this thread to approved. - -=cut - -sub setStatusApproved { - my ($self) = @_; - $self->update({status=>'approved'}); -} - -#------------------------------------------------------------------- - -=head2 setStatusArchived ( ) - -Sets the status of this thread to archived. - -=cut - -sub setStatusArchived { - my ($self) = @_; - $self->update({status=>'archived'}); -} - - -#------------------------------------------------------------------- - -=head2 setStatusDenied ( ) - -Sets the status of this thread to denied. - -=cut - -sub setStatusDenied { - my ($self) = @_; - $self->update({status=>'denied'}); -} - -#------------------------------------------------------------------- - -=head2 setStatusPending ( ) - -Sets the status of this thread to pending. - -=cut - -sub setStatusPending { - my ($self) = @_; - $self->update({status=>'pending'}); -} - -#------------------------------------------------------------------- - -=head2 stick ( ) - -Makes this thread sticky. - -=cut - -sub stick { - my ($self) = @_; - $self->update({isSticky=>1}); -} - -#------------------------------------------------------------------- - -=head2 subscribe ( ) - -Subscribes the user to this thread. - -=cut - -sub subscribe { - my $self = shift; - unless ($self->isSubscribed) { - WebGUI::Grouping::addUsersToGroups([$session{user}{userId}],[$self->get("subscriptionGroupId")]); - } -} - -#------------------------------------------------------------------- - -=head2 unlock ( ) - -Negates the lock method. - -=cut - -sub unlock { - my ($self) = @_; - $self->update({isLocked=>0}); -} - -#------------------------------------------------------------------- - -=head2 unstick ( ) - -Negates the stick method. - -=cut - -sub unstick { - my ($self) = @_; - $self->update({isSticky=>0}); -} - -#------------------------------------------------------------------- - -=head2 unsubscribe ( ) - -Negates the subscribe method. - -=cut - -sub unsubscribe { - my $self = shift; - if ($self->isSubscribed) { - WebGUI::Grouping::deleteUsersFromGroups([$session{user}{userId}],[$self->get("subscriptionGroupId")]); - } -} - - -#------------------------------------------------------------------- -sub view { - my $self = shift; - my %var; - #my $callback = WebGUI::URL::gateway($parentsPage->get("urlizedTitle"),"func=viewSubmission&wid=".$self->wid."&sid=".$submission->{USS_submissionId}); -# if ($session{form}{forumOp} ne "" && $session{form}{forumOp} ne "viewForum") { -# return WebGUI::Forum::UI::forumOp({ -# callback=>$callback, -# title=>$submission->{title}, -# forumId=>$submission->{forumId} -# }); -# } - $self->update({views=>$self->get("views")+1}); - $var{content} = WebGUI::HTML::filter($self->get("content"),$self->get("filterContent")); - $var{content} = WebGUI::HTML::format($var{content},"USS"); - $var{"user.label"} = WebGUI::International::get(21,"USS"); - $var{"userProfile.url"} = $self->getUrl('op=viewProfile&uid='.$self->get("ownerUserId")); - $var{"userId"} = $self->get("ownerUserId"); - $var{"username"} = $self->get("username"); - $var{"dateSubmitted.label"} = WebGUI::International::get(13,"USS"); - $var{"dateSubmitted.human"} = epochToHuman($self->get("dateSubmitted")); - $var{"dateUpdated.label"} = WebGUI::International::get(78,"USS"); - $var{"dateUpdated.human"} = epochToHuman($self->get("dateUpdated")); - $var{"status.label"} = WebGUI::International::get(14,"USS"); - $var{"status.status"} = $self->getParent->status($self->get("status")); - $var{"views.label"} = WebGUI::International::get(514); - $var{canPost} = $self->canContribute; - $var{"post.url"} = $self->getUrl("func=edit"); - $var{"post.label"} = WebGUI::International::get(20,"USS"); - my $previous = $self->getPreviousThread; - $var{"previous.more"} = defined $previous; - $var{"previous.url"} = $previous->getUrl if ($var{"previous.more"}); - $var{"previous.label"} = WebGUI::International::get(58,"USS"); - my $next = $self->getNextThread; - $var{"next.more"} = defined $next; - $var{"next.url"} = $next->getUrl if ($var{"next.more"}); - $var{"next.label"} = WebGUI::International::get(59,"USS"); - $var{canEdit} = $self->canEdit; - $var{"delete.url"} = $self->getUrl("func=delete"); - $var{"delete.label"} = WebGUI::International::get(37,"USS"); - $var{"edit.url"} = $self->getUrl("func=edit"); - $var{"edit.label"} = WebGUI::International::get(27,"USS"); - $var{canChangeStatus} = $self->canModerate; - $var{"approve.url"} = $self->getUrl("func=approve&mlog=".$session{form}{mlog}); - $var{"approve.label"} = WebGUI::International::get(572); - $var{"leave.url"} = $self->getUrl('op=viewMessageLog'); - $var{"leave.label"} = WebGUI::International::get(573); - $var{"deny.url"} = $self->getUrl("func=deny&mlog=".$session{form}{mlog}); - $var{"deny.label"} = WebGUI::International::get(574); - $var{"canReply"} = $self->get("allowDiscussion"); -# $var{"reply.url"} = WebGUI::Forum::UI::formatNewThreadURL($callback,$submission->{forumId}); -# $var{"reply.label"} = WebGUI::International::get(47,"USS"); - $var{"search.url"} = WebGUI::Search::toggleURL("",$self->getParent->get("url")); - $var{"search.label"} = WebGUI::International::get(364); - $var{"back.url"} = $self->getThread->getParent->getUrl; - $var{"back.label"} = WebGUI::International::get(28,"USS"); - $var{'userDefined1.value'} = $self->get("userDefined1"); - $var{'userDefined2.value'} = $self->get("userDefined2"); - $var{'userDefined3.value'} = $self->get("userDefined3"); - $var{'userDefined4.value'} = $self->get("userDefined4"); - $var{'userDefined5.value'} = $self->get("userDefined5"); -# if ($submission->{image} ne "") { -# $file = WebGUI::Attachment->new($submission->{image},$self->wid,$submissionId); -# $var{"image.url"} = $file->getURL; -# $var{"image.thumbnail"} = $file->getThumbnail; -# } -# if ($submission->{attachment} ne "") { -# $file = WebGUI::Attachment->new($submission->{attachment},$self->wid,$submissionId); -# $var{"attachment.box"} = $file->box; -# $var{"attachment.url"} = $file->getURL; -# $var{"attachment.icon"} = $file->getIcon; -# $var{"attachment.name"} = $file->getFilename; - # } - if ($self->get("allowDiscussion")) { -# $var{"replies"} = WebGUI::Forum::UI::www_viewForum( -# {callback=>$callback,title=>$submission->{title},forumId=>$submission->{forumId}}, -# $submission->{forumId}); - } - return $self->processTemplate(\%var,$self->getParent->get("submissionTemplateId")); -} - -#------------------------------------------------------------------- -sub www_edit { - my $self = shift; - return WebGUI::Privilege::insufficient() unless ($self->canEdit); - my %var; - if ($session{form}{func} eq "add") { - $self->{_properties}{contentType} = "mixed"; - $var{'isNew'} = 1; - } - $var{'link.header.label'} = WebGUI::International::get(90,"USS"); - $var{'question.header.label'} = WebGUI::International::get(84,"USS"); - $var{'submission.header.label'} = WebGUI::International::get(19,"USS"); - $var{'user.isVisitor'} = ($session{user}{userId} eq '1'); - $var{'visitorName.label'} = WebGUI::International::get(438); - $var{'visitorName.form'} = WebGUI::Form::text({ - name=>"visitorName" - }); - $var{'form.header'} = WebGUI::Form::formHeader() - .WebGUI::Form::hidden({ - name=>"func", - value=>"editSave" - }); - if ($self->getId eq "new") { - $var{'form.header'} .= WebGUI::Form::hidden({ - name=>"assetId", - value=>"new" - }).WebGUI::Form::hidden({ - name=>"class", - value=>$session{form}{class} - }); - } - $var{'url.label'} = WebGUI::International::get(91,"USS"); - $var{'newWindow.label'} = WebGUI::International::get(92,"USS"); - for my $x (1..5) { - $var{'userDefined'.$x.'.form'} = WebGUI::Form::text({ - name=>"userDefined".$x, - value=>$self->get("userDefined".$x) - }); - $var{'userDefined'.$x.'.form.yesNo'} = WebGUI::Form::yesNo({ - name=>"userDefined".$x, - value=>$self->get("userDefined".$x) - }); - $var{'userDefined'.$x.'.form.textarea'} = WebGUI::Form::textarea({ - name=>"userDefined".$x, - value=>$self->get("userDefined".$x) - }); - $var{'userDefined'.$x.'.form.textarea'} = WebGUI::Form::HTMLArea({ - name=>"userDefined".$x, - value=>$self->get("userDefined".$x) - }); - } - $var{'question.label'} = WebGUI::International::get(85,"USS"); - $var{'title.label'} = WebGUI::International::get(35,"USS"); - $var{'title.form'} = WebGUI::Form::text({ - name=>"title", - value=>$self->get("title") - }); - $var{'title.form.textarea'} = WebGUI::Form::textarea({ - name=>"title", - value=>$self->get("title") - }); - $var{'body.label'} = WebGUI::International::get(31,"USS"); - $var{'answer.label'} = WebGUI::International::get(86,"USS"); - $var{'description.label'} = WebGUI::International::get(85); - $var{'contet.form'} = WebGUI::Form::HTMLArea({ - name=>"content", - value=>$self->get("content") - }); - $var{'content.form.textarea'} = WebGUI::Form::textarea({ - name=>"content", - value=>$self->get("content") - }); -# $var{'image.label'} = WebGUI::International::get(32,"USS"); - # if ($submission->{image} ne "") { -# $var{'image.form'} = ''.WebGUI::International::get(391).''; - # } else { -# $var{'image.form'} = WebGUI::Form::file({ -# name=>"image" -# }); - # } -# $var{'attachment.label'} = WebGUI::International::get(33,"USS"); - # if ($submission->{attachment} ne "") { -# $var{'attachment.form'} = ''.WebGUI::International::get(391).''; - # } else { -# $var{'attachment.form'} = WebGUI::Form::file({ -# name=>"attachment" -# }); - # } - $var{'contentType.label'} = WebGUI::International::get(1007); - $var{'contentType.form'} = WebGUI::Form::contentType({ - name=>'contentType', - value=>$self->get("contentType") || "mixed" - }); - $var{'startDate.label'} = WebGUI::International::get(497); - $var{'endDate.label'} = WebGUI::International::get(498); - $var{'startDate.form'} = WebGUI::Form::dateTime({ - name => 'startDate', - value => $self->get("startDate") - }); - $var{'endDate.form'} = WebGUI::Form::dateTime({ - name => 'endDate', - value => $self->get("startDate") - }); - $var{'form.submit'} = WebGUI::Form::submit(); - $var{'form.footer'} = WebGUI::Form::formFooter(); - return $self->getParent->processStyle($self->processTemplate(\%var,$self->getParent->get("submissionFormTemplateId"))); -} - -#------------------------------------------------------------------- - -=head2 www_lock ( ) - -The web method to lock a thread. - -=cut - -sub www_lock { - my $self = shift; - $self->lock if $self->getParent->canModerate; - return $self->www_view; -} - -#------------------------------------------------------------------- - -=head2 www_stick ( ) - -The web method to make a thread sticky. - -=cut - -sub www_stick { - my $self = shift; - $self->stick if $self->getParent->canModerate; - return $self->www_view; -} - -#------------------------------------------------------------------- - -=head2 www_subscribe ( ) - -The web method to subscribe to a thread. - -=cut - -sub www_subscribe { - my $self = shift; - $self->subscribe if $self->canSubscribe; - return $self->www_view; -} - -#------------------------------------------------------------------- - -=head2 www_unlock ( ) - -The web method to unlock a thread. - -=cut - -sub www_unlock { - my $self = shift; - $self->unlock if $self->getParent->canModerate; - return $self->www_view; -} - -#------------------------------------------------------------------- - -=head2 www_unstick ( ) - -The web method to make a sticky thread normal again. - -=cut - -sub www_unstick { - my $self = shift; - $self->unstick if $self->getParent->canModerate; - $self->www_view; -} - -#------------------------------------------------------------------- - -=head2 www_threadUnsubscribe ( ) - -The web method to unsubscribe from a thread. - -=cut - -sub www_unsubscribe { - my $self = shift; - $self->unsubscribe if $self->canSubscribe; - return $self->www_view; -} - -#------------------------------------------------------------------- -sub www_view { - my $self = shift; - return $self->getParent->processStyle(WebGUI::Privilege::noAccess()) unless $self->canView; - return $self->getParent->processStyle($self->view); -} - -#------------------------------------------------------------------- - -=head2 www_viewThread ( caller [ , postId ] ) - -The web method to display a thread. - -=head3 caller - -A hash reference containing information passed from the calling object. - -=head3 postId - -Specify a postId and call this method directly, rather than over the web. - -=cut - -sub www_viewThread { - my ($caller, $postId) = @_; - WebGUI::Session::setScratch("forumThreadLayout",$session{form}{layout}); - $postId = $session{form}{forumPostId} unless ($postId); - my $post = WebGUI::Forum::Post->new($postId); - return WebGUI::Privilege::insufficient() unless ($post->getThread->getForum->canView); - my $var = getThreadTemplateVars($caller, $post); - if ($post->get("forumPostId") eq $post->getThread->get("rootPostId") && !$post->canView) { - return www_viewForum($caller, $post->getThread->getForum->get("forumId")); - } else { - return WebGUI::Template::process($post->getThread->getForum->get("threadTemplateId"),"Forum/Thread", $var); - } -} - - -1; - diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index e1b9ddb93..53b472adb 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -31,6 +31,64 @@ use WebGUI::Asset::USS_submission; our @ISA = qw(WebGUI::Asset::Wobject); + +#------------------------------------------------------------------- +sub appendTemplateLabels { + my $self = shift; + my $var = shift; + my $i18n = WebGUI::International->new("Collaboration"); + $var->{'question.label'} = WebGUI::International::get(85,"USS"); + $var->{'title.label'} = WebGUI::International::get(35,"USS"); + $var->{'link.header.label'} = WebGUI::International::get(90,"USS"); + $var->{'visitorName.label'} = WebGUI::International::get(438); + $var->{'question.header.label'} = WebGUI::International::get(84,"USS"); + $var->{'submission.header.label'} = WebGUI::International::get(19,"USS"); + $var->{'body.label'} = WebGUI::International::get(31,"USS"); + $var->{'answer.label'} = WebGUI::International::get(86,"USS"); + $var->{'description.label'} = WebGUI::International::get(85); + $var->{'contentType.label'} = WebGUI::International::get(1007); + $var->{'startDate.label'} = WebGUI::International::get(497); + $var->{'endDate.label'} = WebGUI::International::get(498); + $var->{'url.label'} = WebGUI::International::get(91,"USS"); + $var->{'newWindow.label'} = WebGUI::International::get(92,"USS"); + $var->{'newpost.header'} = WebGUI::International::get(1064); + $var->{'sticky.label'} = WebGUI::International::get(1013); + $var->{'subscribe.label'} = WebGUI::International::get(873); + $var->{'lock.label'} = WebGUI::International::get(1012); + $var->{'message.label'} = WebGUI::International::get(230); + $var->{'subject.label'} = WebGUI::International::get(229); + $var->{'image.label'} = WebGUI::International::get(32,"USS"); + $var->{'attachment.label'} = WebGUI::International::get(33,"USS"); + $var->{"user.label"} = "User"; + $var->{"title.label"} = "Title"; + $var->{"subject.label"} = "Subject"; + $var->{"status.label"} = "Status"; + $var->{"date.label"} = "Date"; + $var->{"approve.label"} = "Approve"; + $var->{"delete.label"} = "Delete"; + $var->{"deny.label"} = "Deny"; + $var->{"edit.label"} = "Edit"; + $var->{"reply.label"} = "Reply"; + $var->{"views.label"} = "Views"; + $var->{"rating.label"} = "Rating"; + $var->{"rate.label"} = "Rate"; + $var->{"layout.label"} = "Layout"; + $var->{"nested.label"} = "Nested"; + $var->{"threaded.label"} = "Threaded"; + $var->{"flat.label"} = "Flat"; + $var->{"lock.label"} = "Lock"; + $var->{"unlock.label"} = "Unlock"; + $var->{"stick.label"} = "Make Sticky"; + $var->{"unstick.label"} = "Unstick"; + $var->{"subscribe.label"} = "Subscribe"; + $var->{"unsubscribe.label"} = "Unsubscribe"; + $var->{"previous.label"} = "Previous"; + $var->{"next.label"} = "Next"; + $var->{"next.label"} = "Search"; + $var->{"back.label"} = "Back"; + $var->{"add.label"} = "Add"; +} + #------------------------------------------------------------------- sub canModerate { my $shift; @@ -190,18 +248,10 @@ sub definition { fieldType=>"template", defaultValue=>undef }, - postPreviewTemplateId =>{ - fieldType=>"template", - defaultValue=>undef - }, postFormTemplateId =>{ fieldType=>"template", defaultValue=>undef }, - postTemplateId =>{ - fieldType=>"template", - defaultValue=>undef - }, threadTemplateId =>{ fieldType=>"template", defaultValue=>undef @@ -256,24 +306,12 @@ sub getEditForm { -namespace=>"Collaboration/Thread", -label=>"Thread Template" ); - $tabform->getTab("display")->template( - -name=>"postTemplateId", - -value=>$self->getValue("postTemplateId"), - -namespace=>"Collaboration/Post", - -label=>"Post Template" - ); $tabform->getTab("display")->template( -name=>"postFormTemplateId", -value=>$self->getValue("postFormTemplateId"), -namespace=>"Collaboration/PostForm", -label=>"Post Form Template" ); - $tabform->getTab("display")->template( - -name=>"postPreviewTemplateId", - -value=>$self->getValue("postPreviewTemplateId"), - -namespace=>"Collaboration/Preview", - -label=>"Post Preview Template" - ); $tabform->getTab("display")->template( -name=>"searchTemplateId", -value=>$self->getValue("SearchTemplateId"), @@ -400,7 +438,7 @@ sub getName { #------------------------------------------------------------------- -=head2 formatNewThreadURL ( callback, forumId ) +=head2 getNewThreadUrl( ) Formats the url to start a new thread. @@ -408,7 +446,20 @@ Formats the url to start a new thread. sub getNewThreadUrl { my $self = shift; - $self->getUrl("func=add&class=WebGUI::Asset::Post"); + $self->getUrl("func=add&class=WebGUI::Asset::Post::Thread"); +} + +#------------------------------------------------------------------- + +=head2 getRssUrl ( ) + +Formats the url to start a new thread. + +=cut + +sub getRssUrl { + my $self = shift; + $self->getUrl("func=viewRSS"); } #------------------------------------------------------------------- @@ -599,19 +650,6 @@ sub setLastPost { } -#------------------------------------------------------------------- -sub status { - my $self = shift; - my $status = shift; - if ($status eq "approved") { - return "Approved"; - } elsif ($status eq "denied") { - return "Denied"; - } elsif ($status eq "pending") { - return "Pending"; - } -} - #------------------------------------------------------------------- =head2 subscribe ( ) @@ -646,55 +684,70 @@ sub unsubscribe { #------------------------------------------------------------------- sub view { my $self = shift; + my $scratchSortBy = $self->getId."_sortBy"; + my $scratchSortDir = $self->getId."_sortDir"; + if($session{scratch}{$scratchSortBy} ne $session{form}{sortBy}){ + WebGUI::Session::setScratch($scratchSortBy,$session{form}{sortBy}); + WebGUI::Session::setScratch($scratchSortDir, "desc"); + }else{ + my $sortDir; + if($session{scratch}{$scratchSortDir} eq "asc"){ + $sortDir = "desc"; + }else{ + $sortDir = "asc"; + } + WebGUI::Session::setScratch($scratchSortDir, $sortDir); + } my $numResults = $self->get("threadsPerPage"); my %var; $var{"readmore.label"} = "Read More"; $var{"responses.label"} = "Responses"; - $var{canPost} = $self->canPost; - $var{"post.url"} = $self->getUrl('func=add&class=WebGUI::Asset::Thread'); $var{"post.label"} = "Add a post."; $var{"addquestion.label"} = "Add a question."; $var{"addlink.label"} = "Add a link."; $var{"search.label"} = "Search"; - $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} = $self->canModerate; $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"); + $var{canPost} = $self->canPost; + $var{"post.url"} = $self->getNewThreadUrl; + $var{"rss.url"} = $self->getRssUrl; + $var{canModerate} = $self->canModerate; WebGUI::Style::setLink($var{"rss.url"},{ rel=>'alternate', type=>'application/rss+xml', title=>'RSS' }); + #$var{"search.Form"} = WebGUI::Search::form({func=>'view',search=>1}); + #$var{"search.url"} = WebGUI::Search::toggleURL("func=view"); my $constraints; - if ($session{scratch}{search}) { - $numResults = $session{scratch}{numResults}; - $constraints = WebGUI::Search::buildConstraints([qw(Post.username asset.synopsis asset.title Post.content Post.userDefined1 Post.userDefined2 Post.userDefined3 Post.userDefined4 Post.userDefined5)]); - } - if ($constraints ne "") { - $constraints = "Post.status='approved' and ".$constraints; - } else { + #if ($session{scratch}{search}) { + # $numResults = $session{scratch}{numResults}; + # $constraints = WebGUI::Search::buildConstraints([qw(Post.username asset.synopsis asset.title Post.content Post.userDefined1 Post.userDefined2 Post.userDefined3 Post.userDefined4 Post.userDefined5)]); +# } +# if ($constraints ne "") { + # $constraints = "Post.status='approved' and ".$constraints; +# } else { $constraints = "(Post.status='approved' or (asset.ownerUserId=".quote($session{user}{userId})." and asset.ownerUserId<>'1')"; if ($var{canModerate}) { $constraints .= " or Post.status='pending'"; } $constraints .= ")"; - } + #} my $p = WebGUI::Paginator->new($self->getUrl,$numResults); - my $sql = "select asset.*,Post.* + my $sql = "select * from Thread - left join asset on Thread.assetId=asset.parentId + left join asset on Thread.assetId=asset.assetId left join Post on Post.assetId=asset.assetId - where Thread.parentId=".quote($self->getId)." and asset.state='published' and asset.className='WebGUI::Asset::Post' and $constraints + where Thread.parentId=".quote($self->getId)." and asset.state='published' and asset.className='WebGUI::Asset::Post::Thread' 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 $post = WebGUI::Asset::USS_submission->newByPropertyHashRef($row); - my $controls = deleteIcon('func=delete',$post->getUrl,"Delete").editIcon('func=edit',$post->getUrl); + my $post = WebGUI::Asset::Post->newByPropertyHashRef($row); + $post->{_parent} = $self; # caching parent for efficiency + my $controls = deleteIcon('func=delete',$post->get("url"),"Delete").editIcon('func=edit',$post->get("ur")); if ($self->get("sortBy") eq "lineage") { if ($self->get("sortOrder") eq "desc") { $controls .= moveUpIcon('func=demote',$post->get("url")).moveDownIcon('func=promote',$post->get("url")); @@ -712,8 +765,8 @@ sub view { "id"=>$post->getId, "url"=>$post->getUrl, "synopsis"=>$post->get("synopsis"), - "content"=>WebGUI::HTML::format(WebGUI::HTML::filter($post->get("content"),$self->get("filterCode")),$post->get("contentType")), - "reply.count"=>$post->getResponseCount, + "content"=>$self->formatContent, + "reply.count"=>$post->get("replies"), "title"=>$post->get("title"), "userDefined1"=>$post->get("userDefined1"), "userDefined2"=>$post->get("userDefined2"), @@ -727,11 +780,15 @@ sub view { # "submission.image"=>$submission->getImageUrl, "date.submitted"=>epochToHuman($post->get("dateSubmitted")), "date.updated"=>epochToHuman($post->get("dateUpdated")), - "userProfile.url"=>$post->getUrl("op=viewProfile&uid=".$post->get("ownerUserId")), - "edit.url"=>$submission->getUrl("func=edit"), - 'controls'=>$submission->getToolbar, + "userProfile.url"=>$post->getUserProfileUrl, + "edit.url"=>$post->getEditUrl, + 'controls'=>$controls, 'inDateRange'=>$inDateRange, - "currentUserIsOwner"=>($session{user}{userId} eq $post->get("ownerUserId") && $session{user}{userId} ne "1") + "isSecond"=>(($i+1)%2==0), + "isThird"=>(($i+1)%3==0), + "isFourth"=>(($i+1)%4==0), + "isFifth"=>(($i+1)%5==0), + "currentUserIsPoster"=>$post->isPoster }); $i++; } @@ -749,28 +806,22 @@ sub www_edit { #------------------------------------------------------------------- -=head2 www_search ( caller ) +=head2 www_search ( ) The web method to display and use the forum search interface. -=head3 caller - -A hash reference containing information passed from the calling object. - =cut sub www_search { - my ($caller) = @_; - my $forum = WebGUI::Forum->new($session{form}{forumId}); - WebGUI::Session::setScratch("all",$session{form}{all}); - WebGUI::Session::setScratch("atLeastOne",$session{form}{atLeastOne}); - WebGUI::Session::setScratch("exactPhrase",$session{form}{exactPhrase}); - WebGUI::Session::setScratch("without",$session{form}{without}); - WebGUI::Session::setScratch("numResults",$session{form}{numResults}); + my $self = shift; + WebGUI::Session::setScratch($self->getId."_all",$session{form}{all}); + WebGUI::Session::setScratch($self->getId."_atLeastOne",$session{form}{atLeastOne}); + WebGUI::Session::setScratch($self->getId."_exactPhrase",$session{form}{exactPhrase}); + WebGUI::Session::setScratch($self->getId."_without",$session{form}{without}); + WebGUI::Session::setScratch($self->getId."_numResults",$session{form}{numResults}); my %var; - $var{'callback.url'} = $caller->{callback}; $var{'callback.label'} = WebGUI::International::get(1039); - $var{'form.begin'} = WebGUI::Form::formHeader({action=>$caller->{callback}}); + $var{'form.begin'} = WebGUI::Form::formHeader({action=>$self->getUrl}); $var{'form.begin'} .= WebGUI::Form::hidden({ name=>"forumOp", value=>"search" }); $var{'form.begin'} .= WebGUI::Form::hidden({ name=>"doit", value=>1 }); $var{'form.begin'} .= WebGUI::Form::hidden({ name=>"forumId", value=>$session{form}{forumId} }); @@ -879,56 +930,34 @@ sub www_unsubscribe { } #------------------------------------------------------------------- - -=head2 www_viewForum ( caller [ , forumId ] ) - -The web method to display a forum. - -=head3 caller - -The url to get back to the calling object. - -=head3 forumId - -Specify a forumId and call this method directly, rather than over the web. - -=cut - -sub www_viewForum { - my ($caller, $forumId) = @_; - $forumId = $session{form}{forumId} unless ($forumId); - - if($session{scratch}{forumSortBy} ne $session{form}{sortBy}){ - WebGUI::Session::setScratch("forumSortBy",$session{form}{sortBy}); - WebGUI::Session::setScratch("forumSortDir", "desc"); - }else{ - my $sortDir; - if($session{scratch}{forumSortDir} eq "asc"){ - $sortDir = "desc"; - }else{ - $sortDir = "asc"; - } - WebGUI::Session::setScratch("forumSortDir", $sortDir); - } - - my $forum = WebGUI::Forum->new($forumId); - return WebGUI::Privilege::insufficient() unless ($forum->canView); - my $var = getForumTemplateVars($caller, $forum); - return WebGUI::Template::process($forum->get("forumTemplateId"),"Forum", $var); +# format the date according to rfc 822 (for RSS export) +my @_months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); +sub _get_rfc822_date { + my ($time) = @_; + my ($year, $mon, $mday, $hour, $min, $sec) = WebGUI::DateTime::localtime($time); + my $month = $_months[$mon - 1]; + return sprintf("%02d %s %04d %02d:%02d:%02d GMT", + $mday, $month, $year, $hour, $min, $sec); +} + +#------------------------------------------------------------------- +# encode a string to include in xml (for RSS export) +sub _xml_encode { + my $text = shift; + $text =~ s/&/&/g; + $text =~ s//\]\]>/g; + return $text; } - #------------------------------------------------------------------- # 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 $self = shift; + $self->logView() if ($session{setting}{passiveProfilingEnabled}); + my $encTitle = _xml_encode($self->get("title")); + my $encDescription = _xml_encode($self->get("description")); + my $encUrl = _xml_encode($self->getUrl); my $xml = qq~ @@ -936,25 +965,21 @@ sub www_viewRSS { $encUrl $encDescription ~; - - 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 $sth = WebGUI::SQL->read("select * + from Thread + left join asset on Thread.assetId=asset.parentId + left join Post on Post.assetId=asset.assetId + where Thread.parentId=".quote($self->getId)." and asset.state='published' + and asset.className='WebGUI::Asset::Post::Thread' and Post.status='approved' + order by ".$self->getValue("sortBy")." ".$self->getValue("sortOrder")); + my $i = 1; + while (my $data = $sth->hashref) { + my $post = WebGUI::Asset::Post::Thread->newByPropertyHashRef($data); - 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); - + my $encUrl = _xml_encode($post->getUrl); + my $encTitle = _xml_encode($post->get("title")); + my $encPubDate = _xml_encode(_get_rfc822_date($post->get("dateUpdated"))); + my $encDescription = _xml_encode($self->get("synopsis")); $xml .= qq~ $encTitle @@ -964,6 +989,8 @@ sub www_viewRSS { $encPubDate ~; + $i++; + last if ($i == $$self->get("threadsPerPage"); } $xml .=qq~ diff --git a/lib/WebGUI/Asset/Wobject/USS.pm b/lib/WebGUI/Asset/Wobject/USS.pm index c5d2e7dc7..b361ba4e5 100644 --- a/lib/WebGUI/Asset/Wobject/USS.pm +++ b/lib/WebGUI/Asset/Wobject/USS.pm @@ -31,26 +31,6 @@ use WebGUI::Asset::USS_submission; our @ISA = qw(WebGUI::Asset::Wobject); -#------------------------------------------------------------------- -# format the date according to rfc 822 (for RSS export) -my @_months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); -sub _get_rfc822_date { - my ($time) = @_; - my ($year, $mon, $mday, $hour, $min, $sec) = WebGUI::DateTime::localtime($time); - my $month = $_months[$mon - 1]; - return sprintf("%02d %s %04d %02d:%02d:%02d GMT", - $mday, $month, $year, $hour, $min, $sec); -} - -#------------------------------------------------------------------- -# encode a string to include in xml (for RSS export) -sub _xml_encode { - $_[0] =~ s/&/&/g; - $_[0] =~ s//\]\]>/g; - return $_[0]; -} - #------------------------------------------------------------------- sub definition { my $class = shift; diff --git a/lib/WebGUI/User.pm b/lib/WebGUI/User.pm index ba20f60a9..f2a92ecfb 100644 --- a/lib/WebGUI/User.pm +++ b/lib/WebGUI/User.pm @@ -177,7 +177,7 @@ sub identifier { #------------------------------------------------------------------- -=head2 karma ( amount, source, description ) +=head2 karma ( [ amount, source, description ] ) Returns the current level of karma this user has earned.