webgui/lib/WebGUI/Account/Friends.pm
Colin Kuskie b8ba4e2118 Add a method to Account called getUsers, which returns
either the user specified by the uid form param, or the
session user.
Change appendCommonVars to use it.
Remove spotty overrides in plugins.
2009-04-07 21:22:56 +00:00

585 lines
18 KiB
Perl

package WebGUI::Account::Friends;
use strict;
use WebGUI::Exception;
use WebGUI::International;
use WebGUI::Pluggable;
use WebGUI::Utility;
use base qw/WebGUI::Account/;
=head1 NAME
Package WebGUI::Account::Friends
=head1 DESCRIPTION
This is the class which is used to display a users's friends
=head1 SYNOPSIS
use WebGUI::Account::Friends;
=head1 METHODS
These subroutines are available from this package:
=cut
#-------------------------------------------------------------------
=head2 appendCommonVars ( var )
Appends common template variables that all inbox templates use
=head3 var
The hash reference to append template variables to
=cut
sub appendCommonVars {
my $self = shift;
my $var = shift;
my $session = $self->session;
my $user = $session->user;
my $pageUrl = $session->url->page;
$self->SUPER::appendCommonVars($var);
$var->{'is_edit' } = $self->uid eq "";
$var->{'can_edit_friends'} = ($self->uid eq "" || $self->uid eq $session->user->userId);
$var->{'edit_friends_url'} = $self->getUrl("module=friends;do=view");
$var->{'view_friends_url'} = $self->getUrl("module=friends;do=view;uid=".$session->user->userId);
}
#-------------------------------------------------------------------
=head2 canView ( )
Whether or not the current user can view this user's friends
=cut
sub canView {
my $self = shift;
my $session = $self->session;
my $uid = $self->uid;
return 1 if (($session->user->userId eq $uid || $uid eq "") && $session->user->profileField('ableToBeFriend'));
my $user = WebGUI::User->new($session,$uid);
return 0 if($user->isVisitor); #This should never happen but let's make sure
return 0 unless ($user->profileField('ableToBeFriend')); #User doesn't have friends enabled
return WebGUI::User->new($session,$uid)->profileIsViewable($session->user); #User's profile isn't viewable by this user
}
#-------------------------------------------------------------------
=head2 editSettingsForm ( )
Creates form elements for user settings page custom to this account module
=cut
sub editSettingsForm {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session,'Account_Friends');
my $f = WebGUI::HTMLForm->new($session);
$f->template(
name => "friendsStyleTemplateId",
value => $self->getStyleTemplateId,
namespace => "style",
label => $i18n->get("friends style template label"),
hoverHelp => $i18n->get("friends style template hoverHelp")
);
$f->template(
name => "friendsLayoutTemplateId",
value => $self->getLayoutTemplateId,
namespace => "Account/Layout",
label => $i18n->get("friends layout template label"),
hoverHelp => $i18n->get("friends layout template hoverHelp")
);
$f->template(
name => "friendsViewTemplateId",
value => $self->getViewTemplateId,
namespace => "Account/Friends/View",
label => $i18n->get("friends view template label"),
hoverHelp => $i18n->get("friends view template hoverHelp")
);
$f->template(
name => "friendsEditTemplateId",
value => $self->getEditTemplateId,
namespace => "Account/Friends/Edit",
label => $i18n->get("friends edit template label"),
hoverHelp => $i18n->get("friends edit template hoverHelp")
);
$f->template(
name => "friendsSendRequestTemplateId",
value => $self->getSendRequestTemplateId,
namespace => "Account/Friends/SendRequest",
label => $i18n->get("friends send request template label"),
hoverHelp => $i18n->get("friends send request template hoverHelp")
);
$f->template(
name => "friendsErrorTemplateId",
value => $self->getErrorTemplateId,
namespace => "Account/Friends/Error",
label => $i18n->get("friends error template label"),
hoverHelp => $i18n->get("friends error template hoverHelp")
);
$f->template(
name => "friendsConfirmTemplateId",
value => $self->getConfirmTemplateId,
namespace => "Account/Friends/Confirm",
label => $i18n->get("friends confirm template label"),
hoverHelp => $i18n->get("friends confirm template hoverHelp")
);
$f->template(
name => "friendsRemoveConfirmTemplateId",
value => $self->getRemoveConfirmTemplateId,
namespace => "Account/Friends/Confirm",
label => $i18n->get("friends remove confirm template label"),
hoverHelp => $i18n->get("friends remove confirm template hoverHelp")
);
return $f->printRowsOnly;
}
#-------------------------------------------------------------------
=head2 editSettingsFormSave ( )
Creates form elements for user settings page custom to this account module
=cut
sub editSettingsFormSave {
my $self = shift;
my $session = $self->session;
my $setting = $session->setting;
my $form = $session->form;
$setting->set("friendsStyleTemplateId", $form->process("friendsStyleTemplateId","template"));
$setting->set("friendsLayoutTemplateId", $form->process("friendsLayoutTemplateId","template"));
$setting->set("friendsViewTemplateId", $form->process("friendsViewTemplateId","template"));
$setting->set("friendsEditTemplateId",$form->process("friendsEditTemplateId","template"));
$setting->set("friendsSendRequestTemplateId",$form->process("friendsSendRequestTemplateId","template"));
$setting->set("friendsErrorTemplateId",$form->process("friendsErrorTemplateId","template"));
$setting->set("friendsConfirmTemplateId",$form->process("friendsConfirmTemplateId","template"));
$setting->set("friendsRemoveConfirmTemplateId",$form->process("friendsRemoveConfirmTemplateId","template"));
}
#-------------------------------------------------------------------
=head2 getConfirmTemplateId ( )
This method returns the template ID for the confirmation screen.
=cut
sub getConfirmTemplateId {
my $self = shift;
return $self->session->setting->get("friendsConfirmTemplateId") || "K8F0j_cq_jgo8dvWY_26Ag";
}
#-------------------------------------------------------------------
=head2 getEditTemplateId ( )
This method returns the template ID for editing friends.
=cut
sub getEditTemplateId {
my $self = shift;
return $self->session->setting->get("friendsEditTemplateId") || "AZFU33p0jpPJ-E6qLSWZng";
}
#-------------------------------------------------------------------
=head2 getErrorTemplateId ( )
This method returns the template ID for displaying errors.
=cut
sub getErrorTemplateId {
my $self = shift;
return $self->session->setting->get("friendsErrorTemplateId") || "7Ijdd8SW32lVgg2H8R-Aqw";
}
#-------------------------------------------------------------------
=head2 getLayoutTemplateId ( )
This method returns the template ID for the account layout.
=cut
sub getLayoutTemplateId {
my $self = shift;
return $self->session->setting->get("friendsLayoutTemplateId") || "zrNpGbT3odfIkg6nFSUy8Q";
}
#-------------------------------------------------------------------
=head2 getRemoveConfirmTemplateId ( )
This method returns the template ID for the confirmation screen.
=cut
sub getRemoveConfirmTemplateId {
my $self = shift;
return $self->session->setting->get("friendsRemoveConfirmTemplateId") || "G5V6neXIDiFXN05oL-U3AQ";
}
#-------------------------------------------------------------------
=head2 getSendRequestTemplateId ( )
This method returns the template ID for the send request page.
=cut
sub getSendRequestTemplateId {
my $self = shift;
return $self->session->setting->get("friendsSendRequestTemplateId") || "AGJBGviWGAwjnwziiPjvDg";
}
#-------------------------------------------------------------------
=head2 getStyleTemplateId ( )
This method returns the template ID for the main style.
=cut
sub getStyleTemplateId {
my $self = shift;
return $self->session->setting->get("friendsStyleTemplateId") || $self->SUPER::getStyleTemplateId;
}
#-------------------------------------------------------------------
=head2 getViewTemplateId ( )
This method returns the template ID for the main view.
=cut
sub getViewTemplateId {
my $self = shift;
return $self->session->setting->get("friendsViewTemplateId") || "1Yn_zE_dSiNuaBGNLPbxtw";
}
#-------------------------------------------------------------------
=head2 www_removeFriend ( )
This is a confirmation page of whether or not the user wishes to remove the selected user from friend
=cut
sub www_removeFriend {
my $self = shift;
my $session = $self->session;
my $friendId = $session->form->get("friendId");
my $var = {};
$self->appendCommonVars($var);
my $friend = WebGUI::Friends->new($session);
my $errorMsg = "";
if (!$friendId) {
my $i18n = WebGUI::International->new($session,"Account_Friends");
$errorMsg = $i18n->get("no friend selected");
}
elsif(!$friend->isFriend($friendId)){
my $i18n = WebGUI::International->new($session,"Account_Friends");
$errorMsg = $i18n->get("not a friend error");
}
if($errorMsg ne "") {
my $backUrl = $self->getUrl("module=friends");
return $self->showError($var,$errorMsg,$backUrl,$self->getErrorTemplateId);
}
my $user = WebGUI::User->new($session,$friendId);
$var->{'user_full_name'} = $user->getWholeName;
$var->{'yes_url' } = $self->getUrl("module=friends;do=removeFriendConfirm;friendId=".$friendId);
$var->{'no_url' } = $self->getUrl("module=friends");
return $self->processTemplate($var,$self->getRemoveConfirmTemplateId);
}
#-------------------------------------------------------------------
=head2 www_removeFriendConfirm ( )
This is a confirmation page of whether or not the user wishes to remove the selected user from friend
=cut
sub www_removeFriendConfirm {
my $self = shift;
my $session = $self->session;
my $friendId = $session->form->get("friendId");
my $var = {};
my $i18n = WebGUI::International->new($session,"Account_Friends");
$self->appendCommonVars($var);
my $friend = WebGUI::Friends->new($session);
my $errorMsg = "";
if (!$friendId) {
$errorMsg = $i18n->get("no friend selected");
}
elsif(!$friend->isFriend($friendId)){
$errorMsg = $i18n->get("not a friend error");
}
if($errorMsg ne "") {
my $backUrl = $self->getUrl("module=friends");
return $self->showError($var,$errorMsg,$backUrl,$self->getErrorTemplateId);
}
my $user = WebGUI::User->new($session,$friendId);
my $msg = sprintf($i18n->get("friend removed"),$user->getWholeName);
$friend->delete([$friendId]);
return $self->www_view($msg);
}
#-------------------------------------------------------------------
=head2 www_sendFriendsRequest ( )
The page which allows users to submit friends requests.
=cut
sub www_sendFriendsRequest {
my $self = shift;
my $session = $self->session;
my $var = {};
my $uid = $self->uid;
my $user = WebGUI::User->new($session,$uid);
my $i18n = WebGUI::International->new($session,'Account_Friends');
unless ($user->acceptsFriendsRequests($session->user)) {
my $errorMsg = $i18n->get('does not want to be a friend');
my $friend = WebGUI::Friends->new($session);
if($friend->isFriend($uid)) {
$errorMsg = $i18n->get("error user is already friend");
}
elsif($friend->isInvited($uid)) {
$errorMsg = $i18n->get("error user is already invited");
}
return $self->showError($var,$errorMsg,$session->user->getProfileUrl,$self->getErrorTemplateId);
}
$self->appendCommonVars($var);
#Overwrite these
$var->{'user_full_name' } = $user->getWholeName;
$var->{'user_member_since' } = $user->dateCreated;
my $defaultComment = sprintf(
$i18n->get('default friend comments'),
$user->getFirstName,
$session->user->getFirstName
);
$var->{'form_message_text'} = WebGUI::Form::textarea($session, {
name =>"message",
value =>$defaultComment,
width =>600,
height =>200
});
$var->{'form_message_rich'} = WebGUI::Form::HTMLArea($session, {
name => "message",
value => $defaultComment,
width => "600",
});
$var->{'form_header' } = WebGUI::Form::formHeader($session,{
action => $self->getUrl("module=friends;do=sendFriendsRequestSave;uid=$uid"),
extras => q{name="messageForm"}
});
$var->{'submit_button' } = WebGUI::Form::submit($session,{});
$var->{'form_footer' } = WebGUI::Form::formFooter($session, {});
$var->{'cancel_url' } = $user->getProfileUrl;
return $self->processTemplate($var,$self->getSendRequestTemplateId);
}
#-------------------------------------------------------------------
=head2 www_sendFriendsRequestSave ( )
This method allows users to save friends requests
=cut
sub www_sendFriendsRequestSave {
my $self = shift;
my $session = $self->session;
my $var = {};
my $uid = $self->uid;
my $user = WebGUI::User->new($session,$uid);
#Errors fall through to the view page.
unless ($user->acceptsFriendsRequests($session->user)) {
return $self->www_sendFriendsRequest;
}
my $inboxUrl = WebGUI::Account::Inbox->getViewInvitationUrl($session);
my $friends = WebGUI::Friends->new($session);
$friends->sendAddRequest($uid, $session->form->get('message'),$inboxUrl);
$self->appendCommonVars($var);
#Overwrite this
$var->{'user_full_name' } = $user->getWholeName;
$var->{'user_profile_url' } = $user->getProfileUrl;
return $self->processTemplate($var,$self->getConfirmTemplateId);
}
#-------------------------------------------------------------------
=head2 www_view ( )
The main view page for editing your friends.
=cut
sub www_view {
my $self = shift;
my $msg = shift;
my $session = $self->session;
my $var = {};
my $uid = $self->uid;
my $user = $self->getUser;
$self->appendCommonVars($var);
my $displayView = $uid ne "";
$var->{'display_message'} = $msg;
unless ($user->profileField('ableToBeFriend') && $user->profileIsViewable($session->user)) {
my $i18n = WebGUI::International->new($session,"Account_Friends");
my $errorMsg = "";
if($var->{'can_edit'}) {
$errorMsg = $i18n->get("friends is off");
}
else {
$errorMsg = $i18n->get("no access");
}
my $backUrl = $self->getUrl("op=account");
return $self->showError($var,$errorMsg,$backUrl,$self->getErrorTemplateId);
}
#Deal with rows per page
my $rpp = $session->form->get("rpp") || 25;
my $rpp_url = ";rpp=$rpp";
#Cache the base url
my $friendsUrl = $self->getUrl("op=account;module=friends;do=view");
#Note for anyone who attempts to sort this list by the user's whole name:
#You can do this, but the only way to do it efficiently is to join
#the users, userProfileData, and groupings table. This will break if the groups API
#changes in WebGUI 8, so we decided to leave it sorted by username only.
#Create the paginator
my $friends = $user->friends->getUserList(1);
my @friendIds = keys %{$friends};
my $p = WebGUI::Paginator->new(
$session,
$friendsUrl.$rpp_url,
$rpp
);
$p->setDataByArrayRef(\@friendIds);
#Export page to template
my @friends = ();
foreach my $friendId ( @{$p->getPageData} ) {
my $friend = WebGUI::User->new($session,$friendId);
next if($friend->isVisitor);
#If you have friends turned off you shouldn't show up when other people view your friends friends
next if($displayView && !$friend->profileField('ableToBeFriend'));
my $hash = {};
# TODO Move this into a sub that can be more easily overridden
$hash->{'friend_full_name' } = $friend->getWholeName;
$hash->{'isViewable' } = $friend->profileIsViewable;
$hash->{'friend_id' } = $friend->userId;
$hash->{'friend_member_since' } = $friend->dateCreated;
$hash->{'friend_member_since_human'} = $session->datetime->epochToHuman($friend->dateCreated);
$hash->{'friend_isOnline' } = $friend->isOnline;
if($hash->{'isViewable'}) {
$hash->{'friend_profile_url'} = $friend->getProfileUrl;
if($friend->profileField("photo")) {
my $store = WebGUI::Storage->get($session,$friend->profileField("photo"));
my $file = $store->getFiles->[0];
$hash->{'friend_photo_url' } = $store->getUrl($file);
$hash->{'friend_photo_url_thumb'} = $store->getThumbnailUrl($file);
}
}
$hash->{'acceptsPrivateMessages'} = $friend->acceptsPrivateMessages($session->user->userId);
if ($displayView) {
if($friend->acceptsFriendsRequests($session->user)) {
$hash->{'friend_request_url'} = $self->getUrl("module=friends;do=sendFriendsRequest;uid=".$friend->userId);
}
}
else {
$hash->{'remove_url'} = $self->getUrl("module=friends;do=removeFriend;friendId=".$friend->userId);
}
push(@friends,$hash);
}
my $friendCount = $p->getRowCount;
$var->{'friends_loop' } = \@friends;
$var->{'has_friends' } = $friendCount > 0;
$var->{'friends_total' } = $friendCount;
tie my %rpps, "Tie::IxHash";
%rpps = (25 => "25", 50 => "50", 100=>"100");
$var->{'message_rpp' } = WebGUI::Form::selectBox($session,{
name =>"rpp",
options => \%rpps,
value => $session->form->get("rpp") || 25,
extras => q{onchange="location.href='}.$friendsUrl.q{;rpp='+this.options[this.selectedIndex].value"}
});
my $templateId = ($displayView) ? $self->getViewTemplateId : $self->getEditTemplateId;
return $self->processTemplate($var,$templateId);
}
1;