diff --git a/docs/upgrades/upgrade_5.4.1-5.5.0.sql b/docs/upgrades/upgrade_5.4.1-5.5.0.sql index 9e4100079..4c3aadd13 100644 --- a/docs/upgrades/upgrade_5.4.1-5.5.0.sql +++ b/docs/upgrades/upgrade_5.4.1-5.5.0.sql @@ -14,7 +14,7 @@ create table forum ( moderatePosts int not null default 0, groupToModerate int not null default 0, attachmentsPerPost int not null default 0, - allowHTML int not null default 1, + allowRichEdit int not null default 1, allowReplacements int not null default 1 ); @@ -34,7 +34,6 @@ create table forumPost ( message text, dateOfPost int, views int, - locked int, status varchar(30) not null default 'approved', contentType varchar(30) not null default 'some html' ); @@ -52,7 +51,8 @@ create table forumThread ( views int not null, replies int not null, lastPostId int not null, - locked int not null, + lastPostDate int not null, + isLocked int not null, isSticky int not null ); diff --git a/lib/WebGUI/Forum.pm b/lib/WebGUI/Forum.pm new file mode 100644 index 000000000..b5a61c996 --- /dev/null +++ b/lib/WebGUI/Forum.pm @@ -0,0 +1,43 @@ +package WebGUI::Forum; + +use WebGUI::Forum::Thread; +use WebGUI::Session; +use WebGUI::SQL; + +sub create { + my ($self, $data) = @_; + $data->{forumId} = "new"; + my $forumId = WebGUI::SQL->setRow("forum","forumId",$data); + return WebGUI::Forum->new($forumId); +} + +sub get { + my ($self, $key) = @_; + if ($key eq "") { + return $self->{_properties}; + } + return $self->{_properties}->{$key}; +} + +sub getThread { + my ($self, $threadId) = @_; + unless (exists $self->{_thread}{$threadId}) { + $self->{_thread}{$threadId} = WebGUI::Forum::Thread->new($threadId); + } + return $self->{_thread}{$threadId}; +} + +sub new { + my ($self, $forumId) = @_; + my $properties = WebGUI::SQL->getRow("forum","forumId",$forumId); + bless {_properties=>$properties}, $self; +} + +sub set { + my ($self, $data) = @_; + WebGUI::SQL->setRow("forum","forumId",$data); + $self->{_properties} = $data; +} + +1; + diff --git a/lib/WebGUI/Forum/Post.pm b/lib/WebGUI/Forum/Post.pm new file mode 100644 index 000000000..d477548b1 --- /dev/null +++ b/lib/WebGUI/Forum/Post.pm @@ -0,0 +1,76 @@ +package WebGUI::Forum::Post; + +use WebGUI::Discuss::Thread; +use WebGUI::Session; +use WebGUI::SQL; + +sub addView { + my ($self) = @_; + WebGUI::SQL->write("update forumPost set views=views+1 where forumPostId=".$self->get("forumPostId")); + $self->getThread->addView; +} + +sub create { + my ($self, $data) = @_; + $data->{forumPostId} = "new"; + $data->{dateOfPost} = WebGUI::DateTime::time(); + my $forumPostId = WebGUI::SQL->setRow("forumPost","forumPostId",$data); + $self = WebGUI::Forum::Post->new($forumPostId); + if ($data->{parentId} > 0) { + $self->getThread->addReply($forumPostId,$self->get("dateOfPost")); + } + return $self; +} + +sub get { + my ($self, $key) = @_; + if ($key eq "") { + return $self->{_properties}; + } + return $self->{_properties}->{$key}; +} + +sub getTemplateVars { + my ($self) = @_; + my $properties = $self->get; + my %var = %{$properties}; + $var->{subject} = WebGUI::HTML::filter($var->{subject},"none"); + $var->{message} = WebGUI::HTML::filter($var->{subject},$self->getThread->getForum->get("filterPosts")); + if ($self->getThread->getForum->get("allowReplacements")) { + # do the replacement thing + } + $var->{dateOfPost} = WebGUI::DateTime::epochToHuman($var->{dateOfPost}); +} + +sub getThread { + my ($self) = @_; + unless (exists $self->{_thread}) { + $self->{_thread} = WebGUI::Forum::Thread->new($self->get("forumThreadId")); + } + return $self->{_thread}; +} + +sub markRead { + my ($self, $userId) = @_; + $userId = $session{user}{userId} unless ($userId); + my ($alreadyMarked) = WebGUI::SQL->quickArray("select count(*) from forumRead userId,forumPostId"); + unless ($alreadyMarked) { + WebGUI::SQL->write("insert into forumRead (userId, forumPostId, lastRead) values ($userId, + ".$self->get("forumPostId").", ".WebGUI::DateTime::time().")"); + } +} + +sub new { + my ($self, $forumPostId) = @_; + my $properties = WebGUI::SQL->getRow("forumPost","forumPostId",$forumPostId); + bless {_properties=>$properties}, $self; +} + +sub set { + my ($self, $data) = @_; + WebGUI::SQL->setRow("forumPost","forumPostId",$data); + $self->{_properties} = $data; +} + +1; + diff --git a/lib/WebGUI/Forum/Thread.pm b/lib/WebGUI/Forum/Thread.pm new file mode 100644 index 000000000..6864ac7df --- /dev/null +++ b/lib/WebGUI/Forum/Thread.pm @@ -0,0 +1,128 @@ +package WebGUI::Forum::Thread; + +use WebGUI::Forum; +use WebGUI::Forum::Post; +use WebGUI::Session; +use WebGUI::SQL; + +sub addReply { + my ($self, $dateOfReply) = @_; + WebGUI::SQL->write("update forumThread set replies=replies+1, lastR where forumThreadId=".$self->get("forumThreadId")); + #add method to notify users for subscriptions +} + +sub addView { + my ($self) = @_; + WebGUI::SQL->write("update forumThread set views=views+1 where forumThreadId=".$self->get("forumThreadId")); +} + +sub create { + my ($self, $data, $postData) = @_; + $data->{forumThreadId} = "new"; + my $forumThreadId = WebGUI::SQL->setRow("forumThread","forumThreadId",$data); + $self = WebGUI::Forum::Thread->new($forumThreadId); + $postData{forumThreadId} = $forumThreadId; + $postData{parentId} = 0; + my $post = WebGUI::Discuss::Post->create($postData); + $self->set({ + rootPostId=>$post->get("forumPostId"), + lastPostId=>$post->get("forumPostId"), + lastPostDate=>$post->get("dateOfPost") + }); + $self->{_post}{$post->{forumPostId}} = $post; + return $self; +} + +sub get { + my ($self, $key) = @_; + if ($key eq "") { + return $self->{_properties}; + } + return $self->{_properties}->{$key}; +} + +sub getForum { + my ($self) = @_; + unless (exists $self->{_forum}) { + $self->{_forum} = WebGUI::Forum->new($self->get("forumId")); + } + return $self->{_forum}; +} + +sub getPost { + my ($self, $postId) = @_; + unless (exists $self->{_post}{$postId}) { + $self->{_post}{$postId} = WebGUI::Forum::Post->new($postId); + } + return $self->{_post}{$postId}; +} + +sub isLocked { + my ($self) = @_; + return $self->get("isLocked"); +} + +sub isSticky { + my ($self) = @_; + return $self->get("isSticky"); +} + +sub isSubscribed { + my ($self, $userId) = @_; + $userId = $session{user}{userId} unless ($userId); + my ($isSubscribed) = WebGUI::SQL->quickArray("select count(*) from forumThreadSubscription where forumThreadId=".$self->get("forumThreadId") + ." and userId=$userId"); + return $isSubscribed; +} + +sub lock { + my ($self) = @_; + $self->set({isLocked=>1}); +} + +sub stick { + my ($self) = @_; + $self->set({isSticky=>1}); +} + +sub new { + my ($self, $forumThreadId) = @_; + my $properties = WebGUI::SQL->getRow("forumThread","forumThreadId",$forumThreadId); + bless {_properties=>$properties}, $self; +} + +sub set { + my ($self, $data) = @_; + WebGUI::SQL->setRow("forumThread","forumThreadId",$data); + $self->{_properties} = $data; +} + +sub subscribe { + my ($self, $userId) = @_; + $userId = $session{user}{userId} unless ($userId); + unless ($self->isSubscribed($userId)) { + WebGUI::SQL->write("insert into forumThreadSubscription (forumThreadId, userId) values (".$self->get("forumThreadId").",$userId)"); + } +} + +sub unlock { + my ($self) = @_; + $self->set({isLocked=>0}); +} + +sub unstick { + my ($self) = @_; + $self->set({isSticky=>0}); +} + +sub unsubscribe { + my ($self, $userId) = @_; + $userId = $session{user}{userId} unless ($userId); + if ($self->isSubscribed($userId)) { + WebGUI::SQL->write("delete from forumThreadSubscription where forumThreadId=".$self->get("forumThreadId")." and userId=$userId"); + } +} + + +1; + diff --git a/lib/WebGUI/Forum/Web.pm b/lib/WebGUI/Forum/Web.pm new file mode 100644 index 000000000..da14d0daa --- /dev/null +++ b/lib/WebGUI/Forum/Web.pm @@ -0,0 +1,29 @@ +package WebGUI::Discuss::Web; + +use WebGUI::Discuss; +use WebGUI::Discuss::Post; +use WebGUI::Discuss::Thread; +use WebGUI::Session; + + +sub post { + +} + +sub postSave { + my $forumId = $session{form}{forumId}; + my $threadId = $session{form}{forumThreadId}; + if ($session{form}{parentId} > 0) { + my $parentPost = WebGUI::Discuss::Post->new($session{form}{parentId}); + $forumId = $parentPost->getThread->get("forumId"); + $threadId = $parentPost->get("forumThreadId"); + } + if ($threadId < 1) { + $threadId = WebGUI::Discuss::Thread->create({ + forumId=>$forumId + }); + } +} + +1; + diff --git a/lib/WebGUI/SQL.pm b/lib/WebGUI/SQL.pm index 5661ce824..c2be89ca4 100644 --- a/lib/WebGUI/SQL.pm +++ b/lib/WebGUI/SQL.pm @@ -277,6 +277,39 @@ sub getNextId { return $id; } +#------------------------------------------------------------------- + +=head2 getRow ( table, key, keyValue [, dbh ] ) + +Returns a row of data as a hash reference from the specified table. + +=over + +=item table + +The name of the table to retrieve the row of data from. + +=item key + +The name of the column to use as the retrieve key. Should be a primary or unique key in the table. + +=item keyValue + +The value to search for in the key column. + +=item dbh + +A database handler to use. Defaults to the WebGUI database handler. + +=back + +=cut + +sub getRow { + my ($self, $table, $key, $keyValue, $dbh) = @_; + my $row = WebGUI::SQL->quickHashRef("select * from $table where ".$key."=".quote($keyValue), $dbh); + return $row; +} #------------------------------------------------------------------- @@ -572,6 +605,51 @@ sub rows { } +#------------------------------------------------------------------- + +=head2 setRow ( table, key, data [, dbh ] ) + +Inserts/updates a row of data into the database. Returns the value of the key. + +=over + +=item table + +The name of the table to use. + +=item key + +The name of the primary key of the table. + +=item data + +A hash reference containing column names and values to be set. + +=item dbh + +A database handler to use. Defaults to the WebGUI database handler. + +=back + +=cut + +sub setRow { + my ($self, $table, $keyColumn, $data, $dbh) = @_; + if ($data->{$keyColumn} eq "new") { + $data->{$keyColumn} = WebGUI::SQL->getNextId($keyColumn); + WebGUI::SQL->write("insert into $table ($keyColumn) values ($data->{$keyColumn})", $dbh); + } + my (@pairs); + foreach my $key (keys %{$data}) { + unless ($key eq $keyColumn) { + push(@pairs, $key.'='.quote($data->{$key})); + } + } + WebGUI::SQL->write("update $table set ".join(", ", @pairs), $dbh); + return $data->{$keyColumn}; +} + + #------------------------------------------------------------------- =head2 unconditionalRead ( sql [, dbh ] )