From a50414025eaaaad70bfc6196b729a8757cdbb5f7 Mon Sep 17 00:00:00 2001 From: Frank Dillon Date: Wed, 19 Nov 2008 07:44:22 +0000 Subject: [PATCH] Added Contributions Account Pluggin which displays assets a user has contributed to the site --- docs/changelog/7.x.x.txt | 1 + .../packages-7.6.4/root_import_account.wgpkg | Bin 16297 -> 18370 bytes docs/upgrades/upgrade_7.6.3-7.6.4.pl | 11 + lib/WebGUI/Account/Contributions.pm | 222 ++++++++++++++++++ .../i18n/English/Account_Contributions.pm | 69 ++++++ 5 files changed, 303 insertions(+) create mode 100644 lib/WebGUI/Account/Contributions.pm create mode 100644 lib/WebGUI/i18n/English/Account_Contributions.pm diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index b54283dbf..ce6740421 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -8,6 +8,7 @@ - New Profile Account module added providing a better interface for users to view and update their profile - New Inbox Account module added providing a better interface into WebGUI's various messaging systems - New Friends Account module added providing a better interface into WebGUI's friends system + - New Contributions Account module added which displays public assets a user has contributed to the website - rfe: Event hover detail exclusions (#8761) - rfe: Database Link test (#513) - rfe: User Profile Privacy Settings (#507) - users now have granular control of whether or not their profile fields are viewable - admin settings still apply diff --git a/docs/upgrades/packages-7.6.4/root_import_account.wgpkg b/docs/upgrades/packages-7.6.4/root_import_account.wgpkg index a9ca7293c453d9478eac99170ee27d6cf474a8fd..dd9f9d78620bb8bf4943c36e2effc17e2eefafc3 100644 GIT binary patch literal 18370 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 literal 16297 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 "^International(title,Account_Friends);", className => "WebGUI::Account::Friends" }, + { + identifier => "contributions", + title => "^International(title,Account_Contributions);", + className => "WebGUI::Account::Contributions" + }, { identifier => "shop", title => "^International(title,Account_Shop);", @@ -487,6 +492,12 @@ sub upgradeAccount { $setting->add("shopStyleTemplateId",""); #Use the userStyle by default $setting->add("shopLayoutTemplateId","aUDsJ-vB9RgP-AYvPOy8FQ"); + #Add the settings for the contributions module + $setting->add("contribStyleTemplateId",""); #Use the userStyle by default + $setting->add("contribLayoutTemplateId","b4n3VyUIsAHyIvT-W-jziA"); + $setting->add("contribViewTemplateId","1IzRpX0tgW7iuCfaU2Kk0A"); + + #Add inbox changes $session->db->write(q{ create table inbox_messageState ( diff --git a/lib/WebGUI/Account/Contributions.pm b/lib/WebGUI/Account/Contributions.pm new file mode 100644 index 000000000..5d3ac200f --- /dev/null +++ b/lib/WebGUI/Account/Contributions.pm @@ -0,0 +1,222 @@ +package WebGUI::Account::Contributions; + +use strict; + +use WebGUI::Exception; +use WebGUI::International; +use WebGUI::Pluggable; +use WebGUI::Utility; +use WebGUI::Operation::Auth; + +use base qw/WebGUI::Account/; + +=head1 NAME + +Package WebGUI::Account::Contributions + +=head1 DESCRIPTION + +This is the class which is used to display a users's contributions to the site + +=head1 SYNOPSIS + + use WebGUI::Account::Contributions; + +=head1 METHODS + +These subroutines are available from this package: + +=cut + +#------------------------------------------------------------------- + +=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 $setting = $session->setting; + my $i18n = WebGUI::International->new($session,'Account_Contributions'); + my $f = WebGUI::HTMLForm->new($session); + + $f->template( + name => "contribStyleTemplateId", + value => $self->getStyleTemplateId, + namespace => "style", + label => $i18n->get("contrib style template label"), + hoverHelp => $i18n->get("contrib style template hoverHelp") + ); + $f->template( + name => "contribLayoutTemplateId", + value => $self->getLayoutTemplateId, + namespace => "Account/Layout", + label => $i18n->get("contrib layout template label"), + hoverHelp => $i18n->get("contrib layout template hoverHelp") + ); + $f->template( + name => "contribViewTemplateId", + value => $self->getViewTemplateId, + namespace => "Account/Contrib/View", + label => $i18n->get("contrib view template label"), + hoverHelp => $i18n->get("contrib view 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("contribStyleTemplateId", $form->process("contribStyleTemplateId","template")); + $setting->set("contribLayoutTemplateId", $form->process("contribLayoutTemplateId","template")); + $setting->set("contribViewTemplateId", $form->process("contribViewTemplateId","template")); +} + +#------------------------------------------------------------------- + +=head2 getLayoutTemplateId ( ) + +This method returns the template ID for the account layout. + +=cut + +sub getLayoutTemplateId { + my $self = shift; + return $self->session->setting->get("contribLayoutTemplateId") || "b4n3VyUIsAHyIvT-W-jziA"; +} + + +#------------------------------------------------------------------- + +=head2 getStyleTemplateId ( ) + +This method returns the template ID for the main style. + +=cut + +sub getStyleTemplateId { + my $self = shift; + return $self->session->setting->get("contribStyleTemplateId") || $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("contribViewTemplateId") || "1IzRpX0tgW7iuCfaU2Kk0A"; +} + + +#------------------------------------------------------------------- + +=head2 www_view ( ) + +The main view page for editing the user's profile. + +=cut + +sub www_view { + my $self = shift; + my $session = $self->session; + my $userId = $self->uid || $session->user->userId; + my $var = {}; + + #Set the uid just in case; + #$self->uid($userId); + + #Deal with sort order + my $sortBy = $session->form->get("sortBy") || "creationDate"; + my $sort_url = ($sortBy)?";sortBy=$sortBy":""; + + #Deal with sort direction + my $sortDir = $session->form->get("sortDir") || "desc"; + my $sortDir_url = ";sortDir=".(($sortDir eq "desc")?"asc":"desc"); + + #Deal with rows per page + my $rpp = $session->form->get("rpp") || 25; + my $rpp_url = ";rpp=$rpp"; + + #Cache the base url + my $contribsUrl = $self->getUrl("module=contributions;do=view;uid=$userId"); + + #Create sortBy headers + $var->{'title_url' } = $contribsUrl.";sortBy=title".$sortDir_url.$rpp_url; + $var->{'type_url' } = $contribsUrl.";sortBy=className".$sortDir_url.$rpp_url; + $var->{'dateStamp_url' } = $contribsUrl.";sortBy=creationDate".$sortDir_url.$rpp_url; + $var->{'rpp_url' } = $contribsUrl.$sort_url.";sortDir=".$sortDir; + + #Create the paginator + my $root = WebGUI::Asset->getRoot( $session ); + my $sql = $root->getLineageSql( + [ "self", "descendants" ], + { + includeOnlyClasses => [ + 'WebGUI::Asset::Wobject::Article', + 'WebGUI::Asset::Post', + 'WebGUI::Asset::Wobject::GalleryAlbum', + 'WebGUI::Asset::Event', + 'WebGUI::Asset::Post::Thread', + ], + whereClause => "asset.createdBy = '$userId' or assetData.ownerUserId = '$userId'", + orderByClause => "$sortBy $sortDir" + } + ); + + + my $p = WebGUI::Paginator->new( + $session, + $contribsUrl.";uid=".$userId.$sort_url.";sortDir=".$sortDir.$rpp_url, + $rpp + ); + $p->setDataByQuery($sql); + + #Export page to template + my @contribs = (); + foreach my $row ( @{$p->getPageData} ) { + my $assetId = $row->{assetId}; + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + push(@contribs,$asset->get); + } + my $contribsCount = $p->getRowCount; + + $var->{'contributions_loop' } = \@contribs; + $var->{'has_contributions' } = $contribsCount > 0; + $var->{'contributions_total' } = $contribsCount; + + tie my %rpps, "Tie::IxHash"; + %rpps = (25 => "25", 50 => "50", 100=>"100"); + $var->{'contributions_rpp' } = WebGUI::Form::selectBox($session,{ + name =>"rpp", + options => \%rpps, + value => $session->form->get("rpp") || 25, + extras => q{onchange="location.href='}.$var->{'rpp_url'}.q{;rpp='+this.options[this.selectedIndex].value"} + }); + + $self->appendCommonVars($var); + + return $self->processTemplate($var,$self->getViewTemplateId); +} + + +1; diff --git a/lib/WebGUI/i18n/English/Account_Contributions.pm b/lib/WebGUI/i18n/English/Account_Contributions.pm new file mode 100644 index 000000000..d1fd3f38f --- /dev/null +++ b/lib/WebGUI/i18n/English/Account_Contributions.pm @@ -0,0 +1,69 @@ +package WebGUI::i18n::English::Account_Contributions; +use strict; + +our $I18N = { + + 'title' => { + message => q{Contributions}, + lastUpdated => 1225724810, + context => q{Tab label for User Contributions pluggin}, + }, + + 'contrib style template label' => { + message => q|Style Template|, + lastUpdated => 1119068809 + }, + + 'contrib style template hoverHelp' => { + message => q|Select a style template from the list to enclose the contributions tab in.|, + lastUpdated => 1119068809 + }, + + 'contrib layout template label' => { + message => q|Layout Template|, + lastUpdated => 1119068809 + }, + + 'contrib layout template hoverHelp' => { + message => q{Choose a layout template in which to enclose the content from the various methods within the contributions tab}, + lastUpdated => 1119068809 + }, + + 'contrib view template label' => { + message => q|View Contributions Template|, + lastUpdated => 1119068809 + }, + + 'contrib view template hoverHelp' => { + message => q{Choose the template for displaying user contributions}, + lastUpdated => 1119068809 + }, + + 'title label' => { + message => q{Title}, + lastUpdated => 1119068809 + }, + + 'type label' => { + message => q{Type}, + lastUpdated => 1119068809 + }, + + 'date label' => { + message => q{Date}, + lastUpdated => 1119068809 + }, + + 'no contributions' => { + message => q{No contributions to display}, + lastUpdated => 1119068809 + }, + + 'contribution count' => { + message => q{total contributions}, + lastUpdated => 1119068809 + }, + +}; + +1;