forked from OpenNeo/impress
items petpage export
This commit is contained in:
parent
4f0e7899b7
commit
30096f6b0a
11 changed files with 233 additions and 23 deletions
|
@ -1,6 +1,7 @@
|
||||||
class ClosetHangersController < ApplicationController
|
class ClosetHangersController < ApplicationController
|
||||||
before_filter :authorize_user!, :only => [:destroy, :create, :update]
|
before_filter :authorize_user!, :only => [:destroy, :create, :update, :petpage]
|
||||||
before_filter :find_item, :only => [:destroy, :create, :update]
|
before_filter :find_item, :only => [:destroy, :create, :update]
|
||||||
|
before_filter :find_user, :only => [:index, :petpage]
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
raise ActiveRecord::RecordNotFound unless params[:closet_hanger]
|
raise ActiveRecord::RecordNotFound unless params[:closet_hanger]
|
||||||
|
@ -13,29 +14,9 @@ class ClosetHangersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@user = User.find params[:user_id]
|
|
||||||
@public_perspective = params.has_key?(:public) || !user_is?(@user)
|
@public_perspective = params.has_key?(:public) || !user_is?(@user)
|
||||||
@perspective_user = current_user unless @public_perspective
|
|
||||||
|
|
||||||
@closet_lists_by_owned = @user.closet_lists.
|
find_closet_hangers!
|
||||||
alphabetical.includes(:hangers => :item)
|
|
||||||
unless @perspective_user == @user
|
|
||||||
# If we run this when the user matches, we'll end up with effectively:
|
|
||||||
# WHERE belongs_to_user AND (is_public OR belongs_to_user)
|
|
||||||
# and it's a bit silly to put the SQL server through a condition that's
|
|
||||||
# always true.
|
|
||||||
@closet_lists_by_owned = @closet_lists_by_owned.visible_to(@perspective_user)
|
|
||||||
end
|
|
||||||
@closet_lists_by_owned = @closet_lists_by_owned.group_by(&:hangers_owned)
|
|
||||||
|
|
||||||
visible_groups = @user.closet_hangers_groups_visible_to(@perspective_user)
|
|
||||||
unless visible_groups.empty?
|
|
||||||
@unlisted_closet_hangers_by_owned = @user.closet_hangers.unlisted.
|
|
||||||
owned_before_wanted.alphabetical_by_item_name.includes(:item).
|
|
||||||
where(:owned => [visible_groups]).group_by(&:owned)
|
|
||||||
else
|
|
||||||
@unlisted_closet_hangers_by_owned = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
if @public_perspective && user_signed_in?
|
if @public_perspective && user_signed_in?
|
||||||
items = []
|
items = []
|
||||||
|
@ -53,6 +34,11 @@ class ClosetHangersController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def petpage
|
||||||
|
@public_perspective = true
|
||||||
|
find_closet_hangers!
|
||||||
|
end
|
||||||
|
|
||||||
# Since the user does not care about the idea of a hanger, but rather the
|
# Since the user does not care about the idea of a hanger, but rather the
|
||||||
# quantity of an item they own, the user would expect a create form to work
|
# quantity of an item they own, the user would expect a create form to work
|
||||||
# even after the record already exists, and an update form to work even after
|
# even after the record already exists, and an update form to work even after
|
||||||
|
@ -108,6 +94,34 @@ class ClosetHangersController < ApplicationController
|
||||||
@item = Item.find params[:item_id]
|
@item = Item.find params[:item_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_user
|
||||||
|
@user = User.find params[:user_id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_closet_hangers!
|
||||||
|
@perspective_user = current_user unless @public_perspective
|
||||||
|
|
||||||
|
@closet_lists_by_owned = @user.closet_lists.
|
||||||
|
alphabetical.includes(:hangers => :item)
|
||||||
|
unless @perspective_user == @user
|
||||||
|
# If we run this when the user matches, we'll end up with effectively:
|
||||||
|
# WHERE belongs_to_user AND (is_public OR belongs_to_user)
|
||||||
|
# and it's a bit silly to put the SQL server through a condition that's
|
||||||
|
# always true.
|
||||||
|
@closet_lists_by_owned = @closet_lists_by_owned.visible_to(@perspective_user)
|
||||||
|
end
|
||||||
|
@closet_lists_by_owned = @closet_lists_by_owned.group_by(&:hangers_owned)
|
||||||
|
|
||||||
|
visible_groups = @user.closet_hangers_groups_visible_to(@perspective_user)
|
||||||
|
unless visible_groups.empty?
|
||||||
|
@unlisted_closet_hangers_by_owned = @user.closet_hangers.unlisted.
|
||||||
|
owned_before_wanted.alphabetical_by_item_name.includes(:item).
|
||||||
|
where(:owned => [visible_groups]).group_by(&:owned)
|
||||||
|
else
|
||||||
|
@unlisted_closet_hangers_by_owned = {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def owned
|
def owned
|
||||||
owned = true
|
owned = true
|
||||||
if params[:closet_hanger]
|
if params[:closet_hanger]
|
||||||
|
|
|
@ -61,10 +61,30 @@ module ClosetHangersHelper
|
||||||
link_to(content, path, options)
|
link_to(content, path, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def nc_icon_url
|
||||||
|
"http://#{request.host}#{image_path 'nc.png'}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def petpage_item_name(item)
|
||||||
|
item.name.gsub(/ on/i, ' o<b></b>n')
|
||||||
|
end
|
||||||
|
|
||||||
def public_perspective?
|
def public_perspective?
|
||||||
@public_perspective
|
@public_perspective
|
||||||
end
|
end
|
||||||
|
|
||||||
|
PETPAGE_HANGER_BATCH_SIZE = 5
|
||||||
|
def render_batched_petpage_hangers(hangers)
|
||||||
|
output do |html|
|
||||||
|
hangers.in_groups_of(PETPAGE_HANGER_BATCH_SIZE) do |batch|
|
||||||
|
content = batch.map do |hanger|
|
||||||
|
render 'petpage_hanger', :hanger => hanger if hanger
|
||||||
|
end.join.html_safe
|
||||||
|
html << content_tag(:div, content, :class => 'dti-item-row')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def render_closet_lists(lists)
|
def render_closet_lists(lists)
|
||||||
if lists
|
if lists
|
||||||
render :partial => 'closet_lists/closet_list', :collection => lists,
|
render :partial => 'closet_lists/closet_list', :collection => lists,
|
||||||
|
|
|
@ -10,6 +10,7 @@ class ClosetList < ActiveRecord::Base
|
||||||
validates :hangers_owned, :inclusion => {:in => [true, false], :message => "can't be blank"}
|
validates :hangers_owned, :inclusion => {:in => [true, false], :message => "can't be blank"}
|
||||||
|
|
||||||
scope :alphabetical, order(:name)
|
scope :alphabetical, order(:name)
|
||||||
|
scope :public, where(arel_table[:visibility].gteq(ClosetVisibility[:public].id))
|
||||||
scope :visible_to, lambda { |user|
|
scope :visible_to, lambda { |user|
|
||||||
condition = arel_table[:visibility].gteq(ClosetVisibility[:public].id)
|
condition = arel_table[:visibility].gteq(ClosetVisibility[:public].id)
|
||||||
condition = condition.or(arel_table[:user_id].eq(user.id)) if user
|
condition = condition.or(arel_table[:user_id].eq(user.id)) if user
|
||||||
|
|
12
app/stylesheets/closet_hangers/_petpage.sass
Normal file
12
app/stylesheets/closet_hangers/_petpage.sass
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
body.closet_hangers-petpage
|
||||||
|
+secondary-nav
|
||||||
|
|
||||||
|
#intro
|
||||||
|
clear: both
|
||||||
|
|
||||||
|
#petpage-output
|
||||||
|
display: block
|
||||||
|
height: 30em
|
||||||
|
margin: 0 auto
|
||||||
|
width: 50%
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
@import partials/jquery.jgrowl
|
@import partials/jquery.jgrowl
|
||||||
|
|
||||||
@import closet_hangers/index
|
@import closet_hangers/index
|
||||||
|
@import closet_hangers/petpage
|
||||||
@import closet_lists/form
|
@import closet_lists/form
|
||||||
@import closet_pages/new
|
@import closet_pages/new
|
||||||
@import contributions/index
|
@import contributions/index
|
||||||
|
|
97
app/views/closet_hangers/_petpage_content.html.haml
Normal file
97
app/views/closet_hangers/_petpage_content.html.haml
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
%style{:type => 'text/css'}
|
||||||
|
:plain
|
||||||
|
.dti-item-group, .dti-item-list, .dti-unlisted-items {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-group-header, .dti-item-group, #dti-item-footer {
|
||||||
|
color: #040;
|
||||||
|
font-family: Helvetica, Arial, Verdana, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
width: 560px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-group-header {
|
||||||
|
border-top: 1px solid #060;
|
||||||
|
font-size: 175%;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-group-header, .dti-item-list {
|
||||||
|
border-bottom: 1px solid #ADA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-group {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-list h3 {
|
||||||
|
font-size: 150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-items {
|
||||||
|
border-spacing: 10px;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-row {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item {
|
||||||
|
display: table-cell;
|
||||||
|
margin: 0 10px;
|
||||||
|
padding: 8px;
|
||||||
|
text-align: right;
|
||||||
|
width: 84px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-thumbnail {
|
||||||
|
height: 80px;
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item span {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-item-nc {
|
||||||
|
margin-top: -16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dti-unlisted-items h3 {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dti-item-footer {
|
||||||
|
font-size: 85%;
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
- [true, false].each do |owned|
|
||||||
|
- lists = lists_by_owned[owned]
|
||||||
|
- if lists || unlisted_hangers_by_owned[owned]
|
||||||
|
%h2.dti-item-group-header Items #OWNER #{ClosetHanger.verb(:someone, owned)}
|
||||||
|
%ul.dti-item-group
|
||||||
|
- lists.each do |list|
|
||||||
|
- unless list.hangers.empty?
|
||||||
|
%li.dti-item-list
|
||||||
|
%h3= list.name
|
||||||
|
- if list.description?
|
||||||
|
.dti-item-list-desc
|
||||||
|
= closet_list_description_format list
|
||||||
|
%div.dti-items
|
||||||
|
= render_batched_petpage_hangers(list.hangers.sort { |a,b| a.item.name <=> b.item.name })
|
||||||
|
%li.dti-unlisted-items
|
||||||
|
- unless lists.empty?
|
||||||
|
%h3 (Not in a list)
|
||||||
|
%div
|
||||||
|
= render_batched_petpage_hangers(unlisted_hangers_by_owned[owned])
|
||||||
|
|
||||||
|
#dti-item-footer
|
||||||
|
I made this list on Dress to Impress. You can, too!
|
||||||
|
|
6
app/views/closet_hangers/_petpage_hanger.html.haml
Normal file
6
app/views/closet_hangers/_petpage_hanger.html.haml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
%div.dti-item
|
||||||
|
= image_tag hanger.item.thumbnail_url, :alt => nil, :class => 'dti-item-thumbnail'
|
||||||
|
- if hanger.item.nc?
|
||||||
|
= image_tag nc_icon_url, :alt => 'NC', :class => 'dti-item-nc', :title => 'This is an NC Mall item'
|
||||||
|
%span= petpage_item_name hanger.item
|
||||||
|
|
22
app/views/closet_hangers/petpage.html.haml
Normal file
22
app/views/closet_hangers/petpage.html.haml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
- title 'Export to Petpage'
|
||||||
|
- secondary_nav do
|
||||||
|
= link_to 'Back to Your Items', user_closet_hangers_path(current_user), :class => 'button'
|
||||||
|
|
||||||
|
#intro
|
||||||
|
%p
|
||||||
|
We took your public lists and created a nice, simple HTML file for your
|
||||||
|
Neopet's petpage. By default it's styled as a table, but it doesn't have to
|
||||||
|
be. The HTML is flexible, so, if you're the artsy type, you're free to mess
|
||||||
|
with the styles all you want!
|
||||||
|
|
||||||
|
%p
|
||||||
|
Copy the HTML from the box below, then paste it into
|
||||||
|
= succeed '.' do
|
||||||
|
= link_to "your pet's page", 'http://www.neopets.com/edithomepage.phtml'
|
||||||
|
Then head to the Neoboards to show off! Have fun!
|
||||||
|
|
||||||
|
%textarea#petpage-output
|
||||||
|
= '' + render('petpage_content',
|
||||||
|
:lists_by_owned => @closet_lists_by_owned,
|
||||||
|
:unlisted_hangers_by_owned => @unlisted_closet_hangers_by_owned)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
OpenneoImpressItems::Application.routes.draw do |map|
|
OpenneoImpressItems::Application.routes.draw do |map|
|
||||||
|
get "petpages/new"
|
||||||
|
|
||||||
get "closet_lists/new"
|
get "closet_lists/new"
|
||||||
|
|
||||||
get "closet_lists/create"
|
get "closet_lists/create"
|
||||||
|
@ -41,7 +43,11 @@ OpenneoImpressItems::Application.routes.draw do |map|
|
||||||
|
|
||||||
resources :users, :path => 'user', :only => [:update] do
|
resources :users, :path => 'user', :only => [:update] do
|
||||||
resources :contributions, :only => [:index]
|
resources :contributions, :only => [:index]
|
||||||
resources :closet_hangers, :only => [:index], :path => 'closet'
|
resources :closet_hangers, :only => [:index], :path => 'closet' do
|
||||||
|
collection do
|
||||||
|
get :petpage
|
||||||
|
end
|
||||||
|
end
|
||||||
resources :closet_lists, :only => [:new, :create, :edit, :update, :destroy], :path => 'closet/lists'
|
resources :closet_lists, :only => [:new, :create, :edit, :update, :destroy], :path => 'closet/lists'
|
||||||
|
|
||||||
resources :items, :only => [] do
|
resources :items, :only => [] do
|
||||||
|
|
|
@ -1152,6 +1152,32 @@ body.closet_hangers-index.current-user.js .closet-hangers-group.hidden header .s
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* line 2, ../../../app/stylesheets/partials/_secondary_nav.sass */
|
||||||
|
body.closet_hangers-petpage #title {
|
||||||
|
float: left;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
/* line 6, ../../../app/stylesheets/partials/_secondary_nav.sass */
|
||||||
|
body.closet_hangers-petpage .flash {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
/* line 9, ../../../app/stylesheets/partials/_secondary_nav.sass */
|
||||||
|
body.closet_hangers-petpage #secondary-nav {
|
||||||
|
display: block;
|
||||||
|
margin-top: 0.75em;
|
||||||
|
}
|
||||||
|
/* line 4, ../../../app/stylesheets/closet_hangers/_petpage.sass */
|
||||||
|
body.closet_hangers-petpage #intro {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
/* line 7, ../../../app/stylesheets/closet_hangers/_petpage.sass */
|
||||||
|
body.closet_hangers-petpage #petpage-output {
|
||||||
|
display: block;
|
||||||
|
height: 30em;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
/* line 2, ../../../app/stylesheets/partials/_secondary_nav.sass */
|
/* line 2, ../../../app/stylesheets/partials/_secondary_nav.sass */
|
||||||
body.closet_lists-new #title, body.closet_lists-create #title, body.closet_lists-edit #title, body.closet_lists-update #title {
|
body.closet_lists-new #title, body.closet_lists-create #title, body.closet_lists-edit #title, body.closet_lists-update #title {
|
||||||
float: left;
|
float: left;
|
||||||
|
|
5
spec/views/petpages/new.html.erb_spec.rb
Normal file
5
spec/views/petpages/new.html.erb_spec.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe "petpages/new.html.erb" do
|
||||||
|
pending "add some examples to (or delete) #{__FILE__}"
|
||||||
|
end
|
Loading…
Reference in a new issue