brought-to-you-by on items#show lists contributors

This commit is contained in:
Emi Matchu 2012-10-24 22:09:05 -05:00
parent e9e7d305f0
commit f56b544963
10 changed files with 156 additions and 24 deletions

View file

@ -48,6 +48,9 @@ class ItemsController < ApplicationController
respond_to do |format|
format.html do
unless fragment_exist?("items/#{@item.id} contributors")
@contributors_with_counts = @item.contributors_with_counts
end
@trading_closet_hangers_by_owned = {
true => @item.closet_hangers.owned_trading.newest.includes(:user),

View file

@ -108,6 +108,10 @@ module ItemsHelper
link_to hanger.user.name, user_closet_hangers_path(hanger.user)
end.to_sentence.html_safe
end
def format_contribution_count(count)
"(&times;#{count})".html_safe if count > 1
end
private

View file

@ -1,6 +1,11 @@
class ContributionObserver < ActiveRecord::Observer
def after_create(contribution)
controller.expire_fragment('outfits#new latest_contribution')
if contribution.contributed_type == 'SwfAsset'
item = contribution.contributed.item
controller.expire_fragment("items/#{item.id} contributors")
end
end
private

View file

@ -42,6 +42,32 @@ class Item < ActiveRecord::Base
def closeted?
@owned || @wanted
end
# Return an OrderedHash mapping users to the number of times they
# contributed to this item's assets, from most contributions to least.
def contributors_with_counts
# Get contributing users' IDs
swf_asset_ids = swf_assets.select(SwfAsset.arel_table[:id]).map(&:id)
swf_asset_contributions = Contribution.select('user_id').
where(:contributed_type => 'SwfAsset', :contributed_id => swf_asset_ids)
contributor_ids = swf_asset_contributions.map(&:user_id)
# Get the users, mapped by ID
contributors_by_id = {}
User.find(contributor_ids).each { |u| contributors_by_id[u.id] = u }
# Count each user's contributions
contributor_counts_by_id = Hash.new(0)
contributor_ids.each { |id| contributor_counts_by_id[id] += 1 }
# Build an OrderedHash mapping users to counts in descending order
contributors_with_counts = ActiveSupport::OrderedHash.new
contributor_counts_by_id.sort_by { |k, v| v }.reverse.each do |id, count|
contributor = contributors_by_id[id]
contributors_with_counts[contributor] = count
end
contributors_with_counts
end
def nc?
NCRarities.include?(rarity_index)

View file

@ -108,6 +108,24 @@ body.items-show
.less
display: none
#item-contributors
+subtle-banner
clear: both
header
display: inline
font-weight: bold
margin-right: .25em
footer
display: inline
ul
+comma-delimited-list
li:last-child::after
content: "."
#item-preview-header
clear: both

View file

@ -198,14 +198,7 @@ body.outfits-new
width: 80px
#latest-contribution
border:
color: $soft-border-color
style: solid
width: 1px 0
font-size: 85%
margin: 1em 0
padding: .5em 0
text-align: center
+subtle-banner
#recent-contributions-link
font-weight: bold

View file

@ -106,3 +106,13 @@
background: $warning-bg-color
border: 1px solid $warning-border-color
color: $warning-color
=subtle-banner
border:
color: $soft-border-color
style: solid
width: 1px 0
font-size: 85%
margin: 1em 0
padding: .5em 0
text-align: center

View file

@ -89,6 +89,15 @@
%span.more more
%span.less less
- cache "items/#{@item.id} contributors" do
- unless @contributors_with_counts.empty?
#item-contributors
%header Brought to you by:
%ul
- @contributors_with_counts.each do |contributor, count|
%li #{link_to contributor.name, user_contributions_path(contributor)} #{format_contribution_count(count)}
%footer Thanks, everybody!
- cache 'items#show preview_header' do
#item-preview-header
%h3 Preview

View file

@ -0,0 +1,21 @@
if defined? ActiveMerchant
if Rails.env.development?
ActiveMerchant::Billing::Base.mode = :test
paypal_options = {
:login => "dti00_1309660809_biz_api1.gmail.com",
:password => "1309660841",
:signature => "A8hoaApkuosyp0eSB5fO.FMMFsFPA2E9DtCZkbNkmIuVRqeOmTOzXqQQ"
}
elsif Rails.env.production?
ActiveMerchant::Billing::Base.mode = :production
paypal_options = {
:login => "matchu1993_api1.gmail.com",
:password => "JCJ2NK5DTBZ94QNP",
:signature => "AFcWxV21C7fd0v3bYYYRCpSSRl31AFGfnit6OH.i894Lf4Bgc81N2lfc"
}
else
raise RuntimeError, "ActiveMerchant is not configured for #{Rails.env}. See config/initializers/activemerchant.rb"
end
::DONATION_GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
end

View file

@ -1935,10 +1935,53 @@ body.items-show #trade-hangers .toggle .less {
display: none;
}
/* line 112, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-contributors {
border-color: #aaddaa;
border-style: solid;
border-width: 1px 0;
font-size: 85%;
margin: 1em 0;
padding: 0.5em 0;
text-align: center;
clear: both;
}
/* line 116, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-contributors header {
display: inline;
font-weight: bold;
margin-right: 0.25em;
}
/* line 121, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-contributors footer {
display: inline;
}
/* line 124, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-contributors ul {
list-style-type: none;
}
/* line 5, ../../../../../../.rvm/gems/ruby-1.9.2-p290/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss */
body.items-show #item-contributors ul, body.items-show #item-contributors ul li {
margin: 0px;
padding: 0px;
display: inline;
}
/* line 24, ../../../../../../.rvm/gems/ruby-1.9.2-p290/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss */
body.items-show #item-contributors ul li:after {
content: ", ";
}
/* line 26, ../../../../../../.rvm/gems/ruby-1.9.2-p290/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss */
body.items-show #item-contributors ul li:last-child:after, body.items-show #item-contributors ul li.last:after {
content: "";
}
/* line 127, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-contributors ul li:last-child::after {
content: ".";
}
/* line 130, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-preview-header {
clear: both;
}
/* line 115, ../../../app/stylesheets/items/_show.sass */
/* line 133, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-preview-header h3, body.items-show #item-preview-header a {
display: -moz-inline-box;
-moz-box-orient: vertical;
@ -1950,17 +1993,17 @@ body.items-show #item-preview-header h3, body.items-show #item-preview-header a
body.items-show #item-preview-header h3, body.items-show #item-preview-header a {
*display: inline;
}
/* line 117, ../../../app/stylesheets/items/_show.sass */
/* line 135, ../../../app/stylesheets/items/_show.sass */
body.items-show #item-preview-header a {
font-size: 85%;
margin: -1.5em 0 0 1em;
}
/* line 121, ../../../app/stylesheets/items/_show.sass */
/* line 139, ../../../app/stylesheets/items/_show.sass */
body.items-show .nc-icon {
height: 16px;
width: 16px;
}
/* line 125, ../../../app/stylesheets/items/_show.sass */
/* line 143, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers {
border: 1px solid #006600;
float: right;
@ -1972,13 +2015,13 @@ body.items-show #closet-hangers {
position: relative;
z-index: 2;
}
/* line 138, ../../../app/stylesheets/items/_show.sass */
/* line 156, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers h3 {
font-size: 150%;
font-weight: bold;
margin-bottom: 0.25em;
}
/* line 143, ../../../app/stylesheets/items/_show.sass */
/* line 161, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers #closet-hangers-ownership-groups {
overflow: hidden;
display: inline-block;
@ -1988,41 +2031,41 @@ body.items-show #closet-hangers #closet-hangers-ownership-groups {
body.items-show #closet-hangers #closet-hangers-ownership-groups {
display: block;
}
/* line 147, ../../../app/stylesheets/items/_show.sass */
/* line 165, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers #closet-hangers-ownership-groups div {
float: left;
margin: 0 5%;
text-align: left;
width: 40%;
}
/* line 153, ../../../app/stylesheets/items/_show.sass */
/* line 171, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers #closet-hangers-ownership-groups div li {
list-style: none;
word-wrap: break-word;
}
/* line 157, ../../../app/stylesheets/items/_show.sass */
/* line 175, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers #closet-hangers-ownership-groups div li label.unlisted {
font-style: italic;
}
/* line 160, ../../../app/stylesheets/items/_show.sass */
/* line 178, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers form {
padding: 0.5em 0;
}
/* line 163, ../../../app/stylesheets/items/_show.sass */
/* line 181, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers select {
width: 9em;
}
/* line 166, ../../../app/stylesheets/items/_show.sass */
/* line 184, ../../../app/stylesheets/items/_show.sass */
body.items-show #closet-hangers input[type=number] {
margin-right: 0.5em;
width: 3em;
}
/* line 172, ../../../app/stylesheets/items/_show.sass */
/* line 190, ../../../app/stylesheets/items/_show.sass */
body.items-show.js #trade-hangers p {
max-height: 3em;
overflow: hidden;
}
/* line 176, ../../../app/stylesheets/items/_show.sass */
/* line 194, ../../../app/stylesheets/items/_show.sass */
body.items-show.js #trade-hangers p.showing-more {
max-height: none;
}
@ -3932,12 +3975,12 @@ body.outfits-new #latest-contribution {
padding: 0.5em 0;
text-align: center;
}
/* line 210, ../../../app/stylesheets/outfits/_new.sass */
/* line 203, ../../../app/stylesheets/outfits/_new.sass */
body.outfits-new #latest-contribution #recent-contributions-link {
font-weight: bold;
margin-right: 0.5em;
}
/* line 214, ../../../app/stylesheets/outfits/_new.sass */
/* line 207, ../../../app/stylesheets/outfits/_new.sass */
body.outfits-new #latest-contribution #latest-contribution-created-at {
color: #448844;
margin-left: 0.5em;