Commit 193d5352ad0be5bf98ade6e064d2456a218940ea

Authored by Braulio Bhavamitra
1 parent ddb1fffe

rails4: rename vote_fu to the name of its gem

Showing 46 changed files with 1194 additions and 1194 deletions   Show diff stats
vendor/plugins/kandadaboggu-vote_fu/CHANGELOG.markdown 0 → 100644
@@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
  1 +2010-03-08
  2 +==========
  3 +* Vote method in `acts_as_voter` model returns true upon success.
  4 +
  5 +2010-02-21
  6 +==========
  7 +* Changed the `tally` method to add support for `at_least_total` and `at_most_total` parameters to filter by sum of votes.
  8 +* Changed the `tally` method to add support for `total` column in :order paramter.
  9 +
  10 +2010-02-20
  11 +==========
  12 +* Changed the data-type of the `vote` column in the `votes` table to integer type.
  13 +* Added support for vote count caching at the `voteable` model.
  14 +* Added new method `votes_total` on `voteable` model to return the sum of +ve and -ve votes
  15 +* Optimized several methods in `voteable` model (`voters_who_voted`, `voted_by?`)
  16 +* Cleaned the code to use associations instead of direct SQL
  17 +
  18 +2009-02-11
  19 +==========
  20 +* Merge in xlash's bugfix for PostgreSQL and his has\_karma patch for multi-model support.
  21 +
  22 +2008-12-02
  23 +==========
  24 +* Merge in maddox's README typo fix and his ActiveSupport.Dependency patch
  25 +* Merge in nagybence's updates that make the code usable as a Gem in addition to being a Rails plugin.
  26 +* Thanks for the bugfixes and proofreading, nagybence and maddox!
  27 +* Updated the gemplugin support to be compatible with maddox and nagybence's changes.
  28 +* Added details on the MyQuotable reference application.
  29 +
  30 +2008-07-20
  31 +==========
  32 +* Protect against mass assignment misvotes using attr\_accessible
  33 +* Update acts\_as mixins to use self.class.name instead of the deprecated self.type.name
  34 +
  35 +2008-07-15
  36 +==========
  37 +* Added examples directory
  38 +* Changed this file to markdown format for GitHub goodness
  39 +* Added a commented out unique index in the migration generator for "one person, one vote"
  40 +* Removed votes\_controller.rb from lib/ and moved to examples
  41 +
  42 +2008-07-10
  43 +==========
  44 +
  45 +* Added a generator class for the migration.
  46 +* Implemented rails/init.rb
  47 +* Implemented capability to use any model as the initiator of votes.
  48 +* Implemented acts\_as\_voter methods.
vendor/plugins/kandadaboggu-vote_fu/MIT-LICENSE 0 → 100644
@@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
  1 +Copyright (c) 2008 Peter Jackson (peteonrails.com)
  2 +
  3 +Permission is hereby granted, free of charge, to any person obtaining
  4 +a copy of this software and associated documentation files (the
  5 +"Software"), to deal in the Software without restriction, including
  6 +without limitation the rights to use, copy, modify, merge, publish,
  7 +distribute, sublicense, and/or sell copies of the Software, and to
  8 +permit persons to whom the Software is furnished to do so, subject to
  9 +the following conditions:
  10 +
  11 +The above copyright notice and this permission notice shall be
  12 +included in all copies or substantial portions of the Software.
  13 +
  14 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  16 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  17 +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  18 +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  19 +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20 +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21 +
  22 +Major portions of this package were adapted from ActsAsVoteable, which is subject to the same license. Here is the original copyright notice for ActsAsVoteable:
  23 +
  24 +Copyright (c) 2006 Cosmin Radoi
  25 +
  26 +Permission is hereby granted, free of charge, to any person obtaining
  27 +a copy of this software and associated documentation files (the
  28 +"Software"), to deal in the Software without restriction, including
  29 +without limitation the rights to use, copy, modify, merge, publish,
  30 +distribute, sublicense, and/or sell copies of the Software, and to
  31 +permit persons to whom the Software is furnished to do so, subject to
  32 +the following conditions:
  33 +
  34 +The above copyright notice and this permission notice shall be
  35 +included in all copies or substantial portions of the Software.
  36 +
  37 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  38 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  39 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  40 +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  41 +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  42 +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  43 +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0 \ No newline at end of file 44 \ No newline at end of file
vendor/plugins/kandadaboggu-vote_fu/README.markdown 0 → 100644
@@ -0,0 +1,255 @@ @@ -0,0 +1,255 @@
  1 +vote_fu
  2 +=======
  3 +
  4 +Allows an arbitrary number of entites (including Users) to vote on models.
  5 +
  6 +### Mixins
  7 +This plugin introduces three mixins to your recipe book:
  8 +
  9 +1. **acts\_as\_voteable** : Intended for content objects like Posts, Comments, etc.
  10 +2. **acts\_as\_voter** : Intended for voting entities, like Users.
  11 +3. **has\_karma** : Intended for voting entities, or other objects that own the things you're voting on.
  12 +
  13 +### Inspiration
  14 +
  15 +This plugin started as an adaptation / update of act\_as\_voteable. It has grown different from that plugin in several ways:
  16 +
  17 +1. You can specify the model name that initiates votes.
  18 +2. You can, with a little tuning, have more than one entity type vote on more than one model type.
  19 +3. Adds "acts\_as\_voter" behavior to the initiator of votes.
  20 +4. Introduces some newer Rails features like named\_scope and :polymorphic keywords
  21 +5. Adds "has\_karma" mixin for identifying key content contributors
  22 +
  23 +### Difference between original vote_fu
  24 +1. The data-type of the `vote` column in the `votes` table is changed to integer type.
  25 +2. Support for vote count caching at the `voteable` model.
  26 +3. New method `votes_total` on `voteable` model to return the sum of +ve and -ve votes
  27 +4. Optimized several methods in `voteable` model (`voters_who_voted`, `voted_by?`)
  28 +5. Code cleanup to use associations instead of direct SQL
  29 +6. The `tally` method supports `at_least_total` and `at_most_total` parameters to
  30 + filter by sum of votes.
  31 +7. The :order option of the `tally` method supports order by `total` (E.g: :order => "toal DESC")
  32 +Installation
  33 +============
  34 +Use either the plugin or the gem installation method depending on your preference. If you're not sure, the plugin method is simpler. Whichever you choose, create the migration afterward and run it to create the required model.
  35 +
  36 +### Via plugin
  37 + ./script/plugin install git://github.com/kandadaboggu/vote_fu.git
  38 +
  39 +### Via gem
  40 +Add the following to your application's environment.rb:
  41 + config.gem "kandadaboggu-vote_fu", :lib => 'vote_fu', :source => "http://gemcutter.org"
  42 +
  43 +Install the gem:
  44 + rake gems:install
  45 +
  46 +### Create vote_fu migration
  47 +Create a new rails migration using your new vote_fu generator (Note: "VoteableModel" is the name of the model on which you would like votes to be cast, e.g. Comment):
  48 + ./script/generate vote_fu VoteableModel
  49 +
  50 +Run the migration:
  51 + rake db:migrate
  52 +
  53 +Usage
  54 +=====
  55 +
  56 +## Getting Started
  57 +
  58 +### Make your ActiveRecord model act as voteable.
  59 +
  60 +
  61 + class Model < ActiveRecord::Base
  62 + acts_as_voteable
  63 + end
  64 +
  65 + class Post < ActiveRecord::Base
  66 + acts_as_voteable :vote_counter => true # Stores the sum of the votes in the `vote_total`
  67 + # column of the `posts` table.
  68 + end
  69 +
  70 + class Comment < ActiveRecord::Base
  71 + acts_as_voteable :vote_counter => :comments_vote_count # Stores the sum of the votes in the `comments_vote_count`
  72 + # column of the `comments` table.
  73 + end
  74 +
  75 +### Make your ActiveRecord model(s) that vote act as voter.
  76 +
  77 + class User < ActiveRecord::Base
  78 + acts_as_voter
  79 + end
  80 +
  81 + class Robot < ActiveRecord::Base
  82 + acts_as_voter
  83 + end
  84 +
  85 +### To cast a vote for a Model you can do the following:
  86 +
  87 +#### Shorthand syntax
  88 + voter.vote_for(voteable) # Adds a +1 vote
  89 + voter.vote_against(voteable) # Adds a -1 vote
  90 + voter.vote(voteable, t_or_f) # Adds either +1 or -1 vote true => +1, false => -1
  91 +
  92 +#### ActsAsVoteable syntax
  93 +The old acts\_as\_voteable syntax is still supported:
  94 +
  95 + vote = Vote.new(:vote => true)
  96 + m = Model.find(params[:id])
  97 + m.votes << vote
  98 + user.votes << vote
  99 +
  100 +### Querying votes
  101 +
  102 +#### Tallying Votes
  103 +
  104 +You can easily retrieve voteable object collections based on the properties of their votes:
  105 +
  106 + @items = Item.tally(
  107 + { :at_least => 1,
  108 + :at_most => 10000,
  109 + :start_at => 2.weeks.ago,
  110 + :end_at => 1.day.ago,
  111 + :limit => 10,
  112 + :order => "items.name desc"
  113 + })
  114 +This will select the Items with between 1 and 10,000 votes, the votes having been cast within the last two weeks (not including today), then display the 10 last items in an alphabetical list.
  115 +
  116 + @items = Item.tally(
  117 + { :at_least_total => 1,
  118 + :at_most_total => 10000,
  119 + :start_at => 2.weeks.ago,
  120 + :end_at => 1.day.ago,
  121 + :limit => 10,
  122 + :order => "total desc"
  123 + })
  124 +This will select the Items with between 1 and 10,000 total votes, the votes having been cast within the last two weeks (not including today), then display the 10 last items in a descending order list by total votes.
  125 +
  126 +
  127 +##### Tally Options:
  128 + :start_at - Restrict the votes to those created after a certain time
  129 + :end_at - Restrict the votes to those created before a certain time
  130 + :conditions - A piece of SQL conditions to add to the query
  131 + :limit - The maximum number of voteables to return
  132 + :order - A piece of SQL to order by. Two calculated columns `count`, and `total`
  133 + are available for sorting apart from other columns. Defaults to `total DESC`.
  134 + Eg: :order => 'count desc'
  135 + :order => 'total desc'
  136 + :order => 'post.created_at desc'
  137 + :at_least - Item must have at least X votes count
  138 + :at_most - Item may not have more than X votes count
  139 + :at_least_total - Item must have at least X votes total
  140 + :at_most_total - Item may not have more than X votes total
  141 +
  142 +#### Lower level queries
  143 +ActiveRecord models that act as voteable can be queried for the positive votes, negative votes, and a total vote count by using the votes\_for, votes\_against, and votes\_count methods respectively. Here is an example:
  144 +
  145 + positiveVoteCount = m.votes_for
  146 + negativeVoteCount = m.votes_against
  147 + voteCount = m.votes_count
  148 + totalVote = m.votes_total
  149 +And because the Vote Fu plugin will add the has_many votes relationship to your model you can always get all the votes by using the votes property:
  150 +
  151 + allVotes = m.votes
  152 +
  153 +The mixin also provides these methods:
  154 +
  155 + voter.voted_for?(voteable) # True if the voter voted for this object.
  156 + voter.vote_count([true|false|"all"]) # returns the count of +1, -1, or all votes
  157 +
  158 + voteable.voted_by?(voter) # True if the voter voted for this object.
  159 + @voters = voteable.voters_who_voted
  160 +
  161 +
  162 +#### Named Scopes
  163 +
  164 +The Vote model has several named scopes you can use to find vote details:
  165 +
  166 + @pete_votes = Vote.for_voter(pete)
  167 + @post_votes = Vote.for_voteable(post)
  168 + @recent_votes = Vote.recent(1.day.ago)
  169 + @descending_votes = Vote.descending
  170 +
  171 +You can chain these together to make interesting queries:
  172 +
  173 + # Show all of Pete's recent votes for a certain Post, in descending order (newest first)
  174 + @pete_recent_votes_on_post = Vote.for_voter(pete).for_voteable(post).recent(7.days.ago).descending
  175 +
  176 +### Experimental: Voteable Object Owner Karma
  177 +I have just introduced the "has\_karma" mixin to this package. It aims to assign a karma score to the owners of voteable objects. This is designed to allow you to see which users are submitting the most highly voted content. Currently, karma is only "positive". That is, +1 votes add to karma, but -1 votes do not detract from it.
  178 +
  179 + class User
  180 + has_many :posts
  181 + has_karma :posts
  182 + end
  183 +
  184 + class Post
  185 + acts_as_voteable
  186 + end
  187 +
  188 + # in your view, you can then do this:
  189 + Karma: <%= @user.karma %>
  190 +
  191 +This feature is in alpha, but useful enough that I'm releasing it.
  192 +
  193 +### One vote per user!
  194 +If you want to limit your users to a single vote on each item, take a look in lib/vote.rb.
  195 +
  196 + # Uncomment this to limit users to a single vote on each item.
  197 + # validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]
  198 +
  199 +And if you want that enforced at the database level, look in the generated migration for your voteable:
  200 +
  201 + # If you want to enfore "One Person, One Vote" rules in the database, uncomment the index below
  202 + # add_index :votes, ["voter_id", "voter_type", "voteable_id", "voteable_type"], :unique => true, :name => "uniq_one_vote_only"
  203 +
  204 +### Example Application
  205 +
  206 +There is now a reference application available. Due to overwhelming demand for example
  207 +code and kickstart guides, I have open-sourced MyQuotable.com in order to provide an
  208 +easy-to-follow example of how to use VoteFu with RESTful Authentication, JRails, and
  209 +other popular plugins. To get the example code:
  210 +
  211 + git clone git://github.com/peteonrails/myquotable.git
  212 +
  213 +There will be a screencast coming soon too. Contact me if you want to help.
  214 +
  215 +Consideration
  216 +=============
  217 +If you like this software and use it, please consider recommending me on Working With Rails.
  218 +
  219 +I don't want donations: a simple up-vote would make my day. My profile is: [http://www.workingwithrails.com/person/12521-peter-jackson][4]
  220 +
  221 +To go directly to the "Recommend Me" screen: [http://www.workingwithrails.com/recommendation/new/person/12521-peter-jackson][5]
  222 +
  223 +
  224 +Credits
  225 +=======
  226 +
  227 +#### Contributors
  228 +
  229 +* Bence Nagy, Budapest, Hungary
  230 +* Jon Maddox, Richmond, Virginia, USA
  231 +* Kandada Boggu, Palo Alto, CA, USA
  232 +#### Other works
  233 +
  234 +[Juixe - The original ActsAsVoteable plugin inspired this code.][1]
  235 +
  236 +[Xelipe - This plugin is heavily influenced by Acts As Commentable.][2]
  237 +
  238 +[1]: http://www.juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/
  239 +[2]: http://github.com/jackdempsey/acts_as_commentable/tree/master
  240 +
  241 +More
  242 +====
  243 +
  244 +Support: [Use my blog for support.][6]
  245 +
  246 +
  247 +[Documentation from the original acts\_as\_voteable plugin][3]
  248 +
  249 +[3]: http://www.juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/
  250 +[4]: http://www.workingwithrails.com/person/12521-peter-jackson
  251 +[5]: http://www.workingwithrails.com/recommendation/new/person/12521-peter-jackson
  252 +[6]: http://blog.peteonrails.com
  253 +
  254 +Copyright (c) 2008 Peter Jackson, released under the MIT license
  255 +
vendor/plugins/kandadaboggu-vote_fu/examples/routes.rb 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +
  2 +map.resources :users do |user|
  3 + user.resources :votes
  4 + user.resources :voteable do |mv|
  5 + mv.resources :votes
  6 + end
  7 +end
0 \ No newline at end of file 8 \ No newline at end of file
vendor/plugins/kandadaboggu-vote_fu/examples/users_controller.rb 0 → 100644
@@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
  1 +# I usually use the user class from restful_authentication as my principle voter class
  2 +# There are generally no changes required to support voting in this controller.
  3 +
  4 +class UsersController < ApplicationController
  5 + # Be sure to include AuthenticationSystem in Application Controller instead
  6 + include AuthenticatedSystem
  7 +
  8 + # Protect these actions behind an admin login
  9 + before_filter :admin_required, :only => [:suspend, :unsuspend, :destroy, :purge]
  10 + before_filter :find_user, :only => [:suspend, :unsuspend, :destroy, :purge, :show]
  11 +
  12 + before_filter :login_required, :only => [:index]
  13 +
  14 + # render new.html.erb
  15 + def new
  16 + end
  17 +
  18 + # GET /users/:id
  19 + def show
  20 + end
  21 +
  22 +
  23 + def create
  24 + cookies.delete :auth_token
  25 + @user = User.new(params[:user])
  26 + @user.register! if @user.valid?
  27 + if @user.errors.empty?
  28 + self.current_user.forget_me if logged_in?
  29 + cookies.delete :auth_token
  30 + reset_session
  31 + flash[:notice] = "Thanks for signing up!"
  32 + else
  33 + render :action => 'new'
  34 + end
  35 + end
  36 +
  37 + def activate
  38 + unless params[:activation_code].blank?
  39 + self.current_user = User.find_by_activation_code(params[:activation_code])
  40 + if logged_in? && !current_user.active?
  41 + current_user.activate!
  42 + flash[:notice] = "Signup complete!"
  43 + redirect_back_or_default('/')
  44 + else
  45 + flash[:error] = "Sorry, we couldn't find that activation code. Please cut and paste your activation code into the space at left."
  46 + end
  47 + end
  48 + # render activate.html.erb
  49 + end
  50 +
  51 + def suspend
  52 + @user.suspend!
  53 + redirect_to users_path
  54 + end
  55 +
  56 + def unsuspend
  57 + @user.unsuspend!
  58 + redirect_to users_path
  59 + end
  60 +
  61 + def destroy
  62 + @user.delete!
  63 + redirect_to users_path
  64 + end
  65 +
  66 + def purge
  67 + @user.destroy
  68 + redirect_to users_path
  69 + end
  70 +
  71 +protected
  72 + def find_user
  73 + @user = User.find(params[:id])
  74 + end
  75 +
  76 +end
vendor/plugins/kandadaboggu-vote_fu/examples/voteable.html.erb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +<div id="voteable_<%= @voteable.id %>">
  2 +
  3 + ..... Show some fields .....
  4 +
  5 + <div id="votes_<%= @voteable.id %>">
  6 + <%= render :partial => "votes/voteable_vote", :locals => {:voteable => @voteable} %>
  7 + </div>
  8 +</div>
vendor/plugins/kandadaboggu-vote_fu/examples/voteable.rb 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +class Voteable < ActiveRecord::Base
  2 +
  3 + belongs_to :user
  4 +
  5 + acts_as_voteable
  6 +
  7 + scope :descending, :order => "created_at DESC"
  8 +
  9 +
  10 +end
0 \ No newline at end of file 11 \ No newline at end of file
vendor/plugins/kandadaboggu-vote_fu/examples/voteables_controller.rb 0 → 100644
@@ -0,0 +1,117 @@ @@ -0,0 +1,117 @@
  1 +# This example controller assumes you are using the User class from restful_authentication
  2 +# and a nested voteable resource. See routes.rb
  3 +
  4 +
  5 +class VoteablesController < ApplicationController
  6 +
  7 + before_filter :find_user
  8 + before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]
  9 + before_filter :must_own_voteable, :only => [:edit, :destroy, :update]
  10 +
  11 + # GET /users/:id/voteables
  12 + # GET /users/:id/voteables.xml
  13 + def index
  14 + @voteable = Voteable.descending
  15 +
  16 + respond_to do |format|
  17 + format.html # index.html.erb
  18 + format.xml { render :xml => @voteables }
  19 + end
  20 + end
  21 +
  22 + # GET /users/:id/voteables/1
  23 + # GET /users/:id/voteables/1.xml
  24 + def show
  25 + @voteable = Voteable.find(params[:id])
  26 +
  27 + respond_to do |format|
  28 + format.html # show.html.erb
  29 + format.xml { render :xml => @voteable }
  30 + end
  31 + end
  32 +
  33 + # GET /users/:id/voteables/new
  34 + # GET /users/:id/voteables/new.xml
  35 + def new
  36 + @voteable = Voteable.new
  37 +
  38 + respond_to do |format|
  39 + format.html # new.html.erb
  40 + format.xml { render :xml => @voteable }
  41 + end
  42 + end
  43 +
  44 + # GET /users/:id/voteables/1/edit
  45 + def edit
  46 + @voteable ||= Voteable.find(params[:id])
  47 + end
  48 +
  49 + # POST /users/:id/voteables
  50 + # POST /users/:id/voteables.xml
  51 + def create
  52 + @voteable = Voteable.new(params[:voteable])
  53 + @voteable.user = current_user
  54 +
  55 + respond_to do |format|
  56 + if @voteable.save
  57 + flash[:notice] = 'Voteable was successfully saved.'
  58 + format.html { redirect_to([@user, @voteable]) }
  59 + format.xml { render :xml => @voteable, :status => :created, :location => @voteable }
  60 + else
  61 + format.html { render :action => "new" }
  62 + format.xml { render :xml => @voteable.errors, :status => :unprocessable_entity }
  63 + end
  64 + end
  65 + end
  66 +
  67 + # PUT /users/:id/voteable/1
  68 + # PUT /users/:id/voteable/1.xml
  69 + def update
  70 + @voteable = Voteable.find(params[:id])
  71 +
  72 + respond_to do |format|
  73 + if @quote.update_attributes(params[:voteable])
  74 + flash[:notice] = 'Voteable was successfully updated.'
  75 + format.html { redirect_to([@user, @voteable]) }
  76 + format.xml { head :ok }
  77 + else
  78 + format.html { render :action => "edit" }
  79 + format.xml { render :xml => @voteable.errors, :status => :unprocessable_entity }
  80 + end
  81 + end
  82 + end
  83 +
  84 + # DELETE /users/:id/voteable/1
  85 + # DELETE /users/:id/voteable/1.xml
  86 + def destroy
  87 + @voteable = Voteable.find(params[:id])
  88 + @voteable.destroy
  89 +
  90 + respond_to do |format|
  91 + format.html { redirect_to(user_voteables_url) }
  92 + format.xml { head :ok }
  93 + end
  94 + end
  95 +
  96 + private
  97 + def find_user
  98 + @user = User.find(params[:user_id])
  99 + end
  100 +
  101 + def must_own_voteable
  102 + @voteable ||= Voteable.find(params[:id])
  103 + @voteable.user == current_user || ownership_violation
  104 + end
  105 +
  106 + def ownership_violation
  107 + respond_to do |format|
  108 + flash[:notice] = 'You cannot edit or delete voteable that you do not own!'
  109 + format.html do
  110 + redirect_to user_path(current_user)
  111 + end
  112 + end
  113 + end
  114 +
  115 +
  116 +
  117 +end
vendor/plugins/kandadaboggu-vote_fu/examples/votes/_voteable_vote.html.erb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +<%
  2 + # You can't vote if it is your quote,
  3 + # you are not logged in,
  4 + # or you have already voted on this item
  5 +
  6 + unless quote.user == current_user ||
  7 + !logged_in? ||
  8 + current_user.voted_on?(@voteable)
  9 +%>
  10 +
  11 + <%= link_to_remote "Up",
  12 + :url => user_voteable_votes_path(voteable.user, voteable, :vote => :true, :format => :rjs),
  13 + :method => :post
  14 + %>
  15 + /
  16 + <%= link_to_remote "Down",
  17 + :url => user_voteable_votes_path(voteable.user, voteable, :vote => :false, :format => :rjs),
  18 + :method => :post
  19 + %>
  20 +
  21 +<% end %>
  22 +
  23 +Votes: <%= voteable.votes_for - voteable.votes_against %>
vendor/plugins/kandadaboggu-vote_fu/examples/votes/create.rjs 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +page.replace_html "votes_#{@voteable.id}", :partial => "voteable_vote", :locals => {:voteable => @voteable}
vendor/plugins/kandadaboggu-vote_fu/examples/votes_controller.rb 0 → 100644
@@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
  1 +# An example controller for "votes" that are nested resources under users. See examples/routes.rb
  2 +
  3 +class VotesController < ApplicationController
  4 +
  5 + # First, figure out our nested scope. User or Voteable?
  6 + before_filter :find_votes_for_my_scope, :only => [:index]
  7 +
  8 + before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]
  9 + before_filter :must_own_vote, :only => [:edit, :destroy, :update]
  10 + before_filter :not_allowed, :only => [:edit, :update, :new]
  11 +
  12 + # GET /users/:user_id/votes/
  13 + # GET /users/:user_id/votes.xml
  14 + # GET /users/:user_id/voteables/:voteable_id/votes/
  15 + # GET /users/:user_id/voteables/:voteable_id/votes.xml
  16 + def index
  17 + respond_to do |format|
  18 + format.html # index.html.erb
  19 + format.xml { render :xml => @votes }
  20 + end
  21 + end
  22 +
  23 + # GET /users/:user_id/votes/1
  24 + # GET /users/:user_id/votes/1.xml
  25 + # GET /users/:user_id/voteables/:voteable_id/votes/1
  26 + # GET /users/:user_id/voteables/:voteable_id/1.xml
  27 + def show
  28 + @voteable = Vote.find(params[:id])
  29 +
  30 + respond_to do |format|
  31 + format.html # show.html.erb
  32 + format.xml { render :xml => @vote }
  33 + end
  34 + end
  35 +
  36 + # GET /users/:id/votes/new
  37 + # GET /users/:id/votes/new.xml
  38 + # GET /users/:id/votes/new
  39 + # GET /users/:id/votes/new.xml
  40 + def new
  41 + # Not generally used. Most people want to vote via AJAX calls.
  42 + end
  43 +
  44 + # GET /users/:id/votes/1/edit
  45 + def edit
  46 + # Not generally used. Most people don't want to allow editing of votes.
  47 + end
  48 +
  49 + # POST /users/:user_id/voteables/:voteable_id/votes
  50 + # POST /users/:user_id/voteables/:voteable_id/votes.xml
  51 + def create
  52 + @voteable = Voteable.find(params[:quote_id])
  53 +
  54 + respond_to do |format|
  55 + if current_user.vote(@voteable, params[:vote])
  56 + format.rjs { render :action => "create", :vote => @vote }
  57 + format.html { redirect_to([@voteable.user, @voteable]) }
  58 + format.xml { render :xml => @voteable, :status => :created, :location => @voteable }
  59 + else
  60 + format.rjs { render :action => "error" }
  61 + format.html { render :action => "new" }
  62 + format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }
  63 + end
  64 + end
  65 + end
  66 +
  67 + # PUT /users/:id/votes/1
  68 + # PUT /users/:id/votes/1.xml
  69 + def update
  70 + # Not generally used
  71 + end
  72 +
  73 + # DELETE /users/:id/votes/1
  74 + # DELETE /users/:id/votes/1.xml
  75 + def destroy
  76 + @vote = Vote.find(params[:id])
  77 + @vote.destroy
  78 +
  79 + respond_to do |format|
  80 + format.html { redirect_to(user_votes_url) }
  81 + format.xml { head :ok }
  82 + end
  83 + end
  84 +
  85 + private
  86 + def find_votes_for_my_scope
  87 + if params[:voteable_id]
  88 + @votes = Vote.for_voteable(Voteable.find(params[:voteable_id])).descending
  89 + elsif params[:user_id]
  90 + @votes = Vote.for_voter(User.find(params[:user_id])).descending
  91 + else
  92 + @votes = []
  93 + end
  94 + end
  95 +
  96 + def must_own_vote
  97 + @vote ||= Vote.find(params[:id])
  98 + @vote.user == current_user || ownership_violation
  99 + end
  100 +
  101 + def ownership_violation
  102 + respond_to do |format|
  103 + flash[:notice] = 'You cannot edit or delete votes that you do not own!'
  104 + format.html do
  105 + redirect_to user_path(current_user)
  106 + end
  107 + end
  108 + end
  109 +
  110 +end
vendor/plugins/kandadaboggu-vote_fu/generators/vote_fu/templates/migration.rb 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +class VoteFuMigration < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :votes, :force => true do |t|
  4 + t.integer :vote, :null => false
  5 + t.references :voteable, :polymorphic => true, :null => false
  6 + t.references :voter, :polymorphic => true
  7 + t.timestamps
  8 + end
  9 +
  10 + add_index :votes, ["voter_id", "voter_type"], :name => "fk_voters"
  11 + add_index :votes, ["voteable_id", "voteable_type"], :name => "fk_voteables"
  12 +
  13 + # If you want to enfore "One Person, One Vote" rules in the database, uncomment the index below
  14 + # add_index :votes, ["voter_id", "voter_type", "voteable_id", "voteable_type"], :unique => true, :name => "uniq_one_vote_only"
  15 + end
  16 +
  17 + def self.down
  18 + drop_table :votes
  19 + end
  20 +
  21 +end
vendor/plugins/kandadaboggu-vote_fu/generators/vote_fu/vote_fu_generator.rb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +class VoteFuGenerator < Rails::Generator::Base
  2 +
  3 + def manifest
  4 + record do |m|
  5 + m.migration_template 'migration.rb', 'db/migrate', :migration_file_name => 'vote_fu_migration'
  6 + end
  7 + end
  8 +end
vendor/plugins/kandadaboggu-vote_fu/init.rb 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +require 'vote_fu'
vendor/plugins/kandadaboggu-vote_fu/lib/acts_as_voteable.rb 0 → 100644
@@ -0,0 +1,157 @@ @@ -0,0 +1,157 @@
  1 +# ActsAsVoteable
  2 +module Juixe
  3 + module Acts #:nodoc:
  4 + module Voteable #:nodoc:
  5 +
  6 + def self.included(base)
  7 + base.extend ClassMethods
  8 + end
  9 +
  10 + module ClassMethods
  11 + #
  12 + # Options:
  13 + # :vote_counter
  14 + # Model stores the sum of votes in the vote counter column when the value is true. This requires a column named `vote_total` in the table corresponding to `voteable` model.
  15 + # You can also specify a custom vote counter column by providing a column name instead of a true/false value to this option (e.g., :vote_counter => :my_custom_counter.)
  16 + # Note: Specifying a counter will add it to that model‘s list of readonly attributes using attr_readonly.
  17 + #
  18 + def acts_as_voteable options={}
  19 + has_many :votes, :as => :voteable, :dependent => :destroy
  20 + include Juixe::Acts::Voteable::InstanceMethods
  21 + extend Juixe::Acts::Voteable::SingletonMethods
  22 + if (options[:vote_counter])
  23 + Vote.send(:include, Juixe::Acts::Voteable::VoteCounterClassMethods) unless Vote.respond_to?(:vote_counters)
  24 + Vote.vote_counters = [self]
  25 + # define vote_counter_column instance method on voteable
  26 + counter_column_name = (options[:vote_counter] == true) ? :vote_total : options[:vote_counter]
  27 + class_eval <<-EOS
  28 + def self.vote_counter_column # def self.vote_counter_column
  29 + :"#{counter_column_name}" # :vote_total
  30 + end # end
  31 + def vote_counter_column
  32 + self.class.vote_counter_column
  33 + end
  34 + EOS
  35 +
  36 + define_method(:reload_vote_counter) {reload(:select => vote_counter_column.to_s)}
  37 + attr_readonly counter_column_name
  38 + end
  39 + end
  40 + end
  41 +
  42 + # This module contains class methods Vote class
  43 + module VoteCounterClassMethods
  44 + def self.included(base)
  45 + base.class_inheritable_array(:vote_counters)
  46 + base.after_create { |record| record.update_vote_counters(1) }
  47 + base.before_destroy { |record| record.update_vote_counters(-1) }
  48 + end
  49 +
  50 + def update_vote_counters direction
  51 + klass, vtbl = self.voteable.class, self.voteable
  52 + klass.update_counters(vtbl.id, vtbl.vote_counter_column.to_sym => (self.vote * direction) ) if self.vote_counters.any?{|c| c == klass}
  53 + end
  54 + end
  55 +
  56 + # This module contains class methods
  57 + module SingletonMethods
  58 +
  59 + # Calculate the vote counts for all voteables of my type.
  60 + # Options:
  61 + # :start_at - Restrict the votes to those created after a certain time
  62 + # :end_at - Restrict the votes to those created before a certain time
  63 + # :conditions - A piece of SQL conditions to add to the query
  64 + # :limit - The maximum number of voteables to return
  65 + # :order - A piece of SQL to order by. Two calculated columns `count`, and `total`
  66 + # are available for sorting apart from other columns. Defaults to `total DESC`.
  67 + # Eg: :order => 'count desc'
  68 + # :order => 'total desc'
  69 + # :order => 'post.created_at desc'
  70 + # :at_least - Item must have at least X votes count
  71 + # :at_most - Item may not have more than X votes count
  72 + # :at_least_total - Item must have at least X votes total
  73 + # :at_most_total - Item may not have more than X votes total
  74 + def tally(options = {})
  75 + find(:all, options_for_tally({:order =>"total DESC" }.merge(options)))
  76 + end
  77 +
  78 + def options_for_tally (options = {})
  79 + options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :at_least_total, :at_most_total
  80 +
  81 + scope = scope(:find)
  82 + start_at = sanitize_sql(["#{Vote.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]
  83 + end_at = sanitize_sql(["#{Vote.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]
  84 +
  85 + if respond_to?(:vote_counter_column)
  86 + # use the counter cache column if present.
  87 + total_col = "#{table_name}.#{vote_counter_column}"
  88 + at_least_total = sanitize_sql(["#{total_col} >= ?", options.delete(:at_least_total)]) if options[:at_least_total]
  89 + at_most_total = sanitize_sql(["#{total_col} <= ?", options.delete(:at_most_total)]) if options[:at_most_total]
  90 + end
  91 + conditions = [
  92 + options[:conditions],
  93 + at_least_total,
  94 + at_most_total,
  95 + start_at,
  96 + end_at
  97 + ]
  98 +
  99 + conditions = conditions.compact.join(' AND ')
  100 + conditions = merge_conditions(conditions, scope[:conditions]) if scope
  101 +
  102 + type_and_context = "#{Vote.table_name}.voteable_type = #{quote_value(base_class.name)}"
  103 + joins = ["LEFT OUTER JOIN #{Vote.table_name} ON #{table_name}.#{primary_key} = #{Vote.table_name}.voteable_id AND #{type_and_context}"]
  104 + joins << scope[:joins] if scope && scope[:joins]
  105 + at_least = sanitize_sql(["COUNT(#{Vote.table_name}.id) >= ?", options.delete(:at_least)]) if options[:at_least]
  106 + at_most = sanitize_sql(["COUNT(#{Vote.table_name}.id) <= ?", options.delete(:at_most)]) if options[:at_most]
  107 + at_least_total = at_most_total = nil # reset the values
  108 + unless respond_to?(:vote_counter_column)
  109 + # aggregate the votes when counter cache is absent.
  110 + total_col = "SUM(#{Vote.table_name}.vote)"
  111 + at_least_total = sanitize_sql(["#{total_col} >= ?", options.delete(:at_least_total)]) if options[:at_least_total]
  112 + at_most_total = sanitize_sql(["#{total_col} <= ?", options.delete(:at_most_total)]) if options[:at_most_total]
  113 + end
  114 + having = [at_least, at_most, at_least_total, at_most_total].compact.join(' AND ')
  115 + group_by = "#{Vote.table_name}.voteable_id HAVING COUNT(#{Vote.table_name}.id) > 0"
  116 + group_by << " AND #{having}" unless having.blank?
  117 +
  118 + { :select => "#{table_name}.*, COUNT(#{Vote.table_name}.id) AS count, #{total_col} AS total",
  119 + :joins => joins.join(" "),
  120 + :conditions => conditions,
  121 + :group => group_by
  122 + }.update(options)
  123 + end
  124 +
  125 + end
  126 +
  127 + # This module contains instance methods
  128 + module InstanceMethods
  129 + def votes_for
  130 + self.votes.count(:conditions => {:vote => 1})
  131 + end
  132 +
  133 + def votes_against
  134 + self.votes.count(:conditions => {:vote => -1})
  135 + end
  136 +
  137 + # Same as voteable.votes.size
  138 + def votes_count
  139 + self.votes.size
  140 + end
  141 +
  142 + def votes_total
  143 + respond_to?(:vote_counter_column) ? send(self.vote_counter_column) : self.votes.sum(:vote)
  144 + end
  145 +
  146 + def voters_who_voted
  147 + self.votes.collect(&:voter)
  148 + end
  149 +
  150 + def voted_by?(voter, for_or_against = "all")
  151 + options = (for_or_against == "all") ? {} : {:vote => (for_or_against ? 1 : -1)}
  152 + self.votes.exists?({:voter_id => voter.id, :voter_type => voter.class.base_class.name}.merge(options))
  153 + end
  154 + end
  155 + end
  156 + end
  157 +end
vendor/plugins/kandadaboggu-vote_fu/lib/acts_as_voter.rb 0 → 100644
@@ -0,0 +1,65 @@ @@ -0,0 +1,65 @@
  1 +# ActsAsVoter
  2 +module PeteOnRails
  3 + module Acts #:nodoc:
  4 + module Voter #:nodoc:
  5 +
  6 + def self.included(base)
  7 + base.extend ClassMethods
  8 + end
  9 +
  10 + module ClassMethods
  11 + def acts_as_voter
  12 + has_many :votes, :as => :voter, :dependent => :nullify # If a voting entity is deleted, keep the votes.
  13 + include PeteOnRails::Acts::Voter::InstanceMethods
  14 + extend PeteOnRails::Acts::Voter::SingletonMethods
  15 + end
  16 + end
  17 +
  18 + # This module contains class methods
  19 + module SingletonMethods
  20 + end
  21 +
  22 + # This module contains instance methods
  23 + module InstanceMethods
  24 +
  25 + # Usage user.vote_count(true) # All +1 votes
  26 + # user.vote_count(false) # All -1 votes
  27 + # user.vote_count() # All votes
  28 + #
  29 + def vote_count(for_or_against = "all")
  30 + return self.votes.size if for_or_against == "all"
  31 + self.votes.count(:conditions => {:vote => (for_or_against ? 1 : -1)})
  32 + end
  33 +
  34 + def voted_for?(voteable)
  35 + voteable.voted_by?(self, true)
  36 + end
  37 +
  38 + def voted_against?(voteable)
  39 + voteable.voted_by?(self, false)
  40 + end
  41 +
  42 + def voted_on?(voteable)
  43 + voteable.voted_by?(self)
  44 + end
  45 +
  46 + def vote_for(voteable)
  47 + self.vote(voteable, 1)
  48 + end
  49 +
  50 + def vote_against(voteable)
  51 + self.vote(voteable, -1)
  52 + end
  53 +
  54 + def vote(voteable, vote)
  55 + Vote.create(:vote => vote, :voteable => voteable, :voter => self).tap do |v|
  56 + voteable.reload_vote_counter if !v.new_record? and voteable.respond_to?(:reload_vote_counter)
  57 + end.errors.empty?
  58 + end
  59 +
  60 + end
  61 +
  62 + end
  63 +
  64 + end
  65 +end
0 \ No newline at end of file 66 \ No newline at end of file
vendor/plugins/kandadaboggu-vote_fu/lib/controllers/votes_controller.rb 0 → 100644
@@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
  1 +class VotesController < ApplicationController
  2 + # First, figure out our nested scope. User or vote?
  3 +# before_filter :find_my_scope
  4 +
  5 +# before_filter :find_user
  6 +
  7 +# before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]
  8 +# before_filter :must_own_vote, :only => [:edit, :destroy, :update]
  9 +
  10 +
  11 + # GET /votes/
  12 + # GET /votes.xml
  13 + def index
  14 + @votes = Vote.descending
  15 +
  16 + respond_to do |format|
  17 + format.html # index.html.erb
  18 + format.xml { render :xml => @votes }
  19 + end
  20 + end
  21 +
  22 + # GET /votes/1
  23 + # GET /votes/1.xml
  24 + def show
  25 + @vote = Vote.find(params[:id])
  26 +
  27 + respond_to do |format|
  28 + format.html # show.html.erb
  29 + format.xml { render :xml => @vote }
  30 + end
  31 + end
  32 +
  33 + # GET /votes/new
  34 + # GET /votes/new.xml
  35 + def new
  36 + @vote = Vote.new
  37 +
  38 + respond_to do |format|
  39 + format.html # new.html.erb
  40 + format.xml { render :xml => @vote }
  41 + end
  42 + end
  43 +
  44 + # GET /votes/1/edit
  45 + def edit
  46 + @vote ||= Vote.find(params[:id])
  47 + end
  48 +
  49 + # POST /votes
  50 + # POST /votes.xml
  51 + def create
  52 + @vote = Vote.new(params[:vote])
  53 + @vote.user = current_user
  54 +
  55 + respond_to do |format|
  56 + if @vote.save
  57 + flash[:notice] = 'Vote was successfully saved.'
  58 + format.html { redirect_to([@user, @vote]) }
  59 + format.xml { render :xml => @vote, :status => :created, :location => @vote }
  60 + else
  61 + format.html { render :action => "new" }
  62 + format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }
  63 + end
  64 + end
  65 + end
  66 +
  67 + # PUT /votes/1
  68 + # PUT /votes/1.xml
  69 + def update
  70 + @vote = Vote.find(params[:id])
  71 +
  72 + respond_to do |format|
  73 + if @vote.update_attributes(params[:vote])
  74 + flash[:notice] = 'Vote was successfully updated.'
  75 + format.html { redirect_to([@user, @vote]) }
  76 + format.xml { head :ok }
  77 + else
  78 + format.html { render :action => "edit" }
  79 + format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }
  80 + end
  81 + end
  82 + end
  83 +
  84 + # DELETE /votes/1
  85 + # DELETE /votes/1.xml
  86 + def destroy
  87 + @vote = Vote.find(params[:id])
  88 + @vote.destroy
  89 +
  90 + respond_to do |format|
  91 + format.html { redirect_to(user_votes_url) }
  92 + format.xml { head :ok }
  93 + end
  94 + end
  95 +
  96 +end
vendor/plugins/kandadaboggu-vote_fu/lib/has_karma.rb 0 → 100644
@@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
  1 +# Has Karma
  2 +
  3 +module PeteOnRails
  4 + module VoteFu #:nodoc:
  5 + module Karma #:nodoc:
  6 +
  7 + def self.included(base)
  8 + base.extend ClassMethods
  9 + class << base
  10 + attr_accessor :karmatic_objects
  11 + end
  12 + end
  13 +
  14 + module ClassMethods
  15 + def has_karma(voteable_type)
  16 + self.class_eval <<-RUBY
  17 + def karma_voteable
  18 + #{voteable_type.to_s.classify}
  19 + end
  20 + RUBY
  21 + include PeteOnRails::VoteFu::Karma::InstanceMethods
  22 + extend PeteOnRails::VoteFu::Karma::SingletonMethods
  23 + if self.karmatic_objects.nil?
  24 + self.karmatic_objects = [eval(voteable_type.to_s.classify)]
  25 + else
  26 + self.karmatic_objects.push(eval(voteable_type.to_s.classify))
  27 + end
  28 + end
  29 + end
  30 +
  31 + # This module contains class methods
  32 + module SingletonMethods
  33 +
  34 + ## Not yet implemented. Don't use it!
  35 + # Find the most popular users
  36 + def find_most_karmic
  37 + find(:all)
  38 + end
  39 +
  40 + end
  41 +
  42 + # This module contains instance methods
  43 + module InstanceMethods
  44 + def karma(options = {})
  45 + #FIXME cannot have 2 models imapcting the karma simultaneously
  46 + # count the total number of votes on all of the voteable objects that are related to this object
  47 + #2009-01-30 GuillaumeNM The following line is not SQLite3 compatible, because boolean are stored as 'f' or 't', not '1', or '0'
  48 + #self.karma_voteable.sum(:vote, options_for_karma(options))
  49 + #self.karma_voteable.find(:all, options_for_karma(options)).length
  50 + karma_value = 0
  51 + self.class.karmatic_objects.each do |object|
  52 + karma_value += object.find(:all, options_for_karma(object, options)).length
  53 + end
  54 + return karma_value
  55 + end
  56 +
  57 + def options_for_karma (object, options = {})
  58 + #GuillaumeNM : 2009-01-30 Adding condition for SQLite3
  59 + conditions = ["u.id = ? AND vote = ?" , self[:id] , true]
  60 + joins = ["inner join votes v on #{object.table_name}.id = v.voteable_id", "inner join #{self.class.table_name} u on u.id = #{object.name.tableize}.#{self.class.name.foreign_key}"]
  61 + { :joins => joins.join(" "), :conditions => conditions }.update(options)
  62 + end
  63 +
  64 + end
  65 +
  66 + end
  67 + end
  68 +end
vendor/plugins/kandadaboggu-vote_fu/lib/models/vote.rb 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +class Vote < ActiveRecord::Base
  2 +
  3 + scope :for_voter, lambda { |*args| {:conditions => ["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.base_class.name]} }
  4 + scope :for_voteable, lambda { |*args| {:conditions => ["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.base_class.name]} }
  5 + scope :recent, lambda { |*args| {:conditions => ["created_at > ?", (args.first || 2.weeks.ago).to_s(:db)]} }
  6 + scope :descending, :order => "created_at DESC"
  7 +
  8 + # NOTE: Votes belong to the "voteable" interface, and also to voters
  9 + belongs_to :voteable, :polymorphic => true
  10 + belongs_to :voter, :polymorphic => true
  11 +
  12 + attr_accessible :vote, :voter, :voteable
  13 +
  14 + # Uncomment this to limit users to a single vote on each item.
  15 + #validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]
  16 +
  17 +end
vendor/plugins/kandadaboggu-vote_fu/lib/vote_fu.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +require 'acts_as_voteable'
  2 +require 'acts_as_voter'
  3 +require 'has_karma'
  4 +require 'models/vote.rb'
  5 +
  6 +ActiveRecord::Base.send(:include, Juixe::Acts::Voteable)
  7 +ActiveRecord::Base.send(:include, PeteOnRails::Acts::Voter)
  8 +ActiveRecord::Base.send(:include, PeteOnRails::VoteFu::Karma)
  9 +Rails.logger.info "** vote_fu: initialized properly."
vendor/plugins/kandadaboggu-vote_fu/rails/init.rb 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +RAILS_DEFAULT_LOGGER.info "** vote_fu: setting up load paths"
  2 +
  3 +%w{ models controllers helpers }.each do |dir|
  4 + path = File.join(File.dirname(__FILE__) , 'lib', dir)
  5 + $LOAD_PATH << path
  6 + ActiveSupport::Dependencies.load_paths << path
  7 + ActiveSupport::Dependencies.load_once_paths.delete(path)
  8 +end
  9 +
  10 +require 'vote_fu'
0 \ No newline at end of file 11 \ No newline at end of file
vendor/plugins/kandadaboggu-vote_fu/test/vote_fu_test.rb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +require 'test/unit'
  2 +
  3 +class VoteFuTest < Test::Unit::TestCase
  4 + # Replace this with your real tests.
  5 + def test_this_plugin
  6 + flunk
  7 + end
  8 +end
vendor/plugins/kandadaboggu-vote_fu/vote_fu.gemspec 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +Gem::Specification.new do |s|
  2 + s.name = "kandadaboggu-vote_fu"
  3 + s.version = "0.0.15"
  4 + s.date = "2010-03-08"
  5 + s.summary = "Enhanced vote_fu with numerical voting and total vote caching."
  6 + s.email = "kandadaboggu@gmail.com"
  7 + s.homepage = "http://github.com/kandadaboggu/vote_fu"
  8 + s.description = "Enhanced vote_fu with numerical voting and total vote caching."
  9 + s.has_rdoc = false
  10 + s.authors = ["Peter Jackson", "Cosmin Radoi", "Bence Nagy", "Rob Maddox", "Kandada Boggu"]
  11 + s.files = [ "CHANGELOG.markdown",
  12 + "MIT-LICENSE",
  13 + "README.markdown",
  14 + "generators/vote_fu",
  15 + "generators/vote_fu/vote_fu_generator.rb",
  16 + "generators/vote_fu/templates",
  17 + "generators/vote_fu/templates/migration.rb",
  18 + "init.rb",
  19 + "lib/vote_fu.rb",
  20 + "lib/acts_as_voteable.rb",
  21 + "lib/acts_as_voter.rb",
  22 + "lib/has_karma.rb",
  23 + "lib/models/vote.rb",
  24 + "lib/controllers/votes_controller.rb",
  25 + "test/vote_fu_test.rb",
  26 + "examples/votes_controller.rb",
  27 + "examples/users_controller.rb",
  28 + "examples/voteables_controller.rb",
  29 + "examples/voteable.rb",
  30 + "examples/voteable.html.erb",
  31 + "examples/votes/_voteable_vote.html.erb",
  32 + "examples/votes/create.rjs",
  33 + "examples/routes.rb",
  34 + "rails/init.rb"
  35 + ]
  36 +end
vendor/plugins/vote_fu/CHANGELOG.markdown
@@ -1,48 +0,0 @@ @@ -1,48 +0,0 @@
1 -2010-03-08  
2 -==========  
3 -* Vote method in `acts_as_voter` model returns true upon success.  
4 -  
5 -2010-02-21  
6 -==========  
7 -* Changed the `tally` method to add support for `at_least_total` and `at_most_total` parameters to filter by sum of votes.  
8 -* Changed the `tally` method to add support for `total` column in :order paramter.  
9 -  
10 -2010-02-20  
11 -==========  
12 -* Changed the data-type of the `vote` column in the `votes` table to integer type.  
13 -* Added support for vote count caching at the `voteable` model.  
14 -* Added new method `votes_total` on `voteable` model to return the sum of +ve and -ve votes  
15 -* Optimized several methods in `voteable` model (`voters_who_voted`, `voted_by?`)  
16 -* Cleaned the code to use associations instead of direct SQL  
17 -  
18 -2009-02-11  
19 -==========  
20 -* Merge in xlash's bugfix for PostgreSQL and his has\_karma patch for multi-model support.  
21 -  
22 -2008-12-02  
23 -==========  
24 -* Merge in maddox's README typo fix and his ActiveSupport.Dependency patch  
25 -* Merge in nagybence's updates that make the code usable as a Gem in addition to being a Rails plugin.  
26 -* Thanks for the bugfixes and proofreading, nagybence and maddox!  
27 -* Updated the gemplugin support to be compatible with maddox and nagybence's changes.  
28 -* Added details on the MyQuotable reference application.  
29 -  
30 -2008-07-20  
31 -==========  
32 -* Protect against mass assignment misvotes using attr\_accessible  
33 -* Update acts\_as mixins to use self.class.name instead of the deprecated self.type.name  
34 -  
35 -2008-07-15  
36 -==========  
37 -* Added examples directory  
38 -* Changed this file to markdown format for GitHub goodness  
39 -* Added a commented out unique index in the migration generator for "one person, one vote"  
40 -* Removed votes\_controller.rb from lib/ and moved to examples  
41 -  
42 -2008-07-10  
43 -==========  
44 -  
45 -* Added a generator class for the migration.  
46 -* Implemented rails/init.rb  
47 -* Implemented capability to use any model as the initiator of votes.  
48 -* Implemented acts\_as\_voter methods.  
vendor/plugins/vote_fu/MIT-LICENSE
@@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
1 -Copyright (c) 2008 Peter Jackson (peteonrails.com)  
2 -  
3 -Permission is hereby granted, free of charge, to any person obtaining  
4 -a copy of this software and associated documentation files (the  
5 -"Software"), to deal in the Software without restriction, including  
6 -without limitation the rights to use, copy, modify, merge, publish,  
7 -distribute, sublicense, and/or sell copies of the Software, and to  
8 -permit persons to whom the Software is furnished to do so, subject to  
9 -the following conditions:  
10 -  
11 -The above copyright notice and this permission notice shall be  
12 -included in all copies or substantial portions of the Software.  
13 -  
14 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  
15 -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  
16 -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  
17 -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE  
18 -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION  
19 -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
20 -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
21 -  
22 -Major portions of this package were adapted from ActsAsVoteable, which is subject to the same license. Here is the original copyright notice for ActsAsVoteable:  
23 -  
24 -Copyright (c) 2006 Cosmin Radoi  
25 -  
26 -Permission is hereby granted, free of charge, to any person obtaining  
27 -a copy of this software and associated documentation files (the  
28 -"Software"), to deal in the Software without restriction, including  
29 -without limitation the rights to use, copy, modify, merge, publish,  
30 -distribute, sublicense, and/or sell copies of the Software, and to  
31 -permit persons to whom the Software is furnished to do so, subject to  
32 -the following conditions:  
33 -  
34 -The above copyright notice and this permission notice shall be  
35 -included in all copies or substantial portions of the Software.  
36 -  
37 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  
38 -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  
39 -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  
40 -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE  
41 -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION  
42 -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
43 -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
44 \ No newline at end of file 0 \ No newline at end of file
vendor/plugins/vote_fu/README.markdown
@@ -1,255 +0,0 @@ @@ -1,255 +0,0 @@
1 -vote_fu  
2 -=======  
3 -  
4 -Allows an arbitrary number of entites (including Users) to vote on models.  
5 -  
6 -### Mixins  
7 -This plugin introduces three mixins to your recipe book:  
8 -  
9 -1. **acts\_as\_voteable** : Intended for content objects like Posts, Comments, etc.  
10 -2. **acts\_as\_voter** : Intended for voting entities, like Users.  
11 -3. **has\_karma** : Intended for voting entities, or other objects that own the things you're voting on.  
12 -  
13 -### Inspiration  
14 -  
15 -This plugin started as an adaptation / update of act\_as\_voteable. It has grown different from that plugin in several ways:  
16 -  
17 -1. You can specify the model name that initiates votes.  
18 -2. You can, with a little tuning, have more than one entity type vote on more than one model type.  
19 -3. Adds "acts\_as\_voter" behavior to the initiator of votes.  
20 -4. Introduces some newer Rails features like named\_scope and :polymorphic keywords  
21 -5. Adds "has\_karma" mixin for identifying key content contributors  
22 -  
23 -### Difference between original vote_fu  
24 -1. The data-type of the `vote` column in the `votes` table is changed to integer type.  
25 -2. Support for vote count caching at the `voteable` model.  
26 -3. New method `votes_total` on `voteable` model to return the sum of +ve and -ve votes  
27 -4. Optimized several methods in `voteable` model (`voters_who_voted`, `voted_by?`)  
28 -5. Code cleanup to use associations instead of direct SQL  
29 -6. The `tally` method supports `at_least_total` and `at_most_total` parameters to  
30 - filter by sum of votes.  
31 -7. The :order option of the `tally` method supports order by `total` (E.g: :order => "toal DESC")  
32 -Installation  
33 -============  
34 -Use either the plugin or the gem installation method depending on your preference. If you're not sure, the plugin method is simpler. Whichever you choose, create the migration afterward and run it to create the required model.  
35 -  
36 -### Via plugin  
37 - ./script/plugin install git://github.com/kandadaboggu/vote_fu.git  
38 -  
39 -### Via gem  
40 -Add the following to your application's environment.rb:  
41 - config.gem "kandadaboggu-vote_fu", :lib => 'vote_fu', :source => "http://gemcutter.org"  
42 -  
43 -Install the gem:  
44 - rake gems:install  
45 -  
46 -### Create vote_fu migration  
47 -Create a new rails migration using your new vote_fu generator (Note: "VoteableModel" is the name of the model on which you would like votes to be cast, e.g. Comment):  
48 - ./script/generate vote_fu VoteableModel  
49 -  
50 -Run the migration:  
51 - rake db:migrate  
52 -  
53 -Usage  
54 -=====  
55 -  
56 -## Getting Started  
57 -  
58 -### Make your ActiveRecord model act as voteable.  
59 -  
60 -  
61 - class Model < ActiveRecord::Base  
62 - acts_as_voteable  
63 - end  
64 -  
65 - class Post < ActiveRecord::Base  
66 - acts_as_voteable :vote_counter => true # Stores the sum of the votes in the `vote_total`  
67 - # column of the `posts` table.  
68 - end  
69 -  
70 - class Comment < ActiveRecord::Base  
71 - acts_as_voteable :vote_counter => :comments_vote_count # Stores the sum of the votes in the `comments_vote_count`  
72 - # column of the `comments` table.  
73 - end  
74 -  
75 -### Make your ActiveRecord model(s) that vote act as voter.  
76 -  
77 - class User < ActiveRecord::Base  
78 - acts_as_voter  
79 - end  
80 -  
81 - class Robot < ActiveRecord::Base  
82 - acts_as_voter  
83 - end  
84 -  
85 -### To cast a vote for a Model you can do the following:  
86 -  
87 -#### Shorthand syntax  
88 - voter.vote_for(voteable) # Adds a +1 vote  
89 - voter.vote_against(voteable) # Adds a -1 vote  
90 - voter.vote(voteable, t_or_f) # Adds either +1 or -1 vote true => +1, false => -1  
91 -  
92 -#### ActsAsVoteable syntax  
93 -The old acts\_as\_voteable syntax is still supported:  
94 -  
95 - vote = Vote.new(:vote => true)  
96 - m = Model.find(params[:id])  
97 - m.votes << vote  
98 - user.votes << vote  
99 -  
100 -### Querying votes  
101 -  
102 -#### Tallying Votes  
103 -  
104 -You can easily retrieve voteable object collections based on the properties of their votes:  
105 -  
106 - @items = Item.tally(  
107 - { :at_least => 1,  
108 - :at_most => 10000,  
109 - :start_at => 2.weeks.ago,  
110 - :end_at => 1.day.ago,  
111 - :limit => 10,  
112 - :order => "items.name desc"  
113 - })  
114 -This will select the Items with between 1 and 10,000 votes, the votes having been cast within the last two weeks (not including today), then display the 10 last items in an alphabetical list.  
115 -  
116 - @items = Item.tally(  
117 - { :at_least_total => 1,  
118 - :at_most_total => 10000,  
119 - :start_at => 2.weeks.ago,  
120 - :end_at => 1.day.ago,  
121 - :limit => 10,  
122 - :order => "total desc"  
123 - })  
124 -This will select the Items with between 1 and 10,000 total votes, the votes having been cast within the last two weeks (not including today), then display the 10 last items in a descending order list by total votes.  
125 -  
126 -  
127 -##### Tally Options:  
128 - :start_at - Restrict the votes to those created after a certain time  
129 - :end_at - Restrict the votes to those created before a certain time  
130 - :conditions - A piece of SQL conditions to add to the query  
131 - :limit - The maximum number of voteables to return  
132 - :order - A piece of SQL to order by. Two calculated columns `count`, and `total`  
133 - are available for sorting apart from other columns. Defaults to `total DESC`.  
134 - Eg: :order => 'count desc'  
135 - :order => 'total desc'  
136 - :order => 'post.created_at desc'  
137 - :at_least - Item must have at least X votes count  
138 - :at_most - Item may not have more than X votes count  
139 - :at_least_total - Item must have at least X votes total  
140 - :at_most_total - Item may not have more than X votes total  
141 -  
142 -#### Lower level queries  
143 -ActiveRecord models that act as voteable can be queried for the positive votes, negative votes, and a total vote count by using the votes\_for, votes\_against, and votes\_count methods respectively. Here is an example:  
144 -  
145 - positiveVoteCount = m.votes_for  
146 - negativeVoteCount = m.votes_against  
147 - voteCount = m.votes_count  
148 - totalVote = m.votes_total  
149 -And because the Vote Fu plugin will add the has_many votes relationship to your model you can always get all the votes by using the votes property:  
150 -  
151 - allVotes = m.votes  
152 -  
153 -The mixin also provides these methods:  
154 -  
155 - voter.voted_for?(voteable) # True if the voter voted for this object.  
156 - voter.vote_count([true|false|"all"]) # returns the count of +1, -1, or all votes  
157 -  
158 - voteable.voted_by?(voter) # True if the voter voted for this object.  
159 - @voters = voteable.voters_who_voted  
160 -  
161 -  
162 -#### Named Scopes  
163 -  
164 -The Vote model has several named scopes you can use to find vote details:  
165 -  
166 - @pete_votes = Vote.for_voter(pete)  
167 - @post_votes = Vote.for_voteable(post)  
168 - @recent_votes = Vote.recent(1.day.ago)  
169 - @descending_votes = Vote.descending  
170 -  
171 -You can chain these together to make interesting queries:  
172 -  
173 - # Show all of Pete's recent votes for a certain Post, in descending order (newest first)  
174 - @pete_recent_votes_on_post = Vote.for_voter(pete).for_voteable(post).recent(7.days.ago).descending  
175 -  
176 -### Experimental: Voteable Object Owner Karma  
177 -I have just introduced the "has\_karma" mixin to this package. It aims to assign a karma score to the owners of voteable objects. This is designed to allow you to see which users are submitting the most highly voted content. Currently, karma is only "positive". That is, +1 votes add to karma, but -1 votes do not detract from it.  
178 -  
179 - class User  
180 - has_many :posts  
181 - has_karma :posts  
182 - end  
183 -  
184 - class Post  
185 - acts_as_voteable  
186 - end  
187 -  
188 - # in your view, you can then do this:  
189 - Karma: <%= @user.karma %>  
190 -  
191 -This feature is in alpha, but useful enough that I'm releasing it.  
192 -  
193 -### One vote per user!  
194 -If you want to limit your users to a single vote on each item, take a look in lib/vote.rb.  
195 -  
196 - # Uncomment this to limit users to a single vote on each item.  
197 - # validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]  
198 -  
199 -And if you want that enforced at the database level, look in the generated migration for your voteable:  
200 -  
201 - # If you want to enfore "One Person, One Vote" rules in the database, uncomment the index below  
202 - # add_index :votes, ["voter_id", "voter_type", "voteable_id", "voteable_type"], :unique => true, :name => "uniq_one_vote_only"  
203 -  
204 -### Example Application  
205 -  
206 -There is now a reference application available. Due to overwhelming demand for example  
207 -code and kickstart guides, I have open-sourced MyQuotable.com in order to provide an  
208 -easy-to-follow example of how to use VoteFu with RESTful Authentication, JRails, and  
209 -other popular plugins. To get the example code:  
210 -  
211 - git clone git://github.com/peteonrails/myquotable.git  
212 -  
213 -There will be a screencast coming soon too. Contact me if you want to help.  
214 -  
215 -Consideration  
216 -=============  
217 -If you like this software and use it, please consider recommending me on Working With Rails.  
218 -  
219 -I don't want donations: a simple up-vote would make my day. My profile is: [http://www.workingwithrails.com/person/12521-peter-jackson][4]  
220 -  
221 -To go directly to the "Recommend Me" screen: [http://www.workingwithrails.com/recommendation/new/person/12521-peter-jackson][5]  
222 -  
223 -  
224 -Credits  
225 -=======  
226 -  
227 -#### Contributors  
228 -  
229 -* Bence Nagy, Budapest, Hungary  
230 -* Jon Maddox, Richmond, Virginia, USA  
231 -* Kandada Boggu, Palo Alto, CA, USA  
232 -#### Other works  
233 -  
234 -[Juixe - The original ActsAsVoteable plugin inspired this code.][1]  
235 -  
236 -[Xelipe - This plugin is heavily influenced by Acts As Commentable.][2]  
237 -  
238 -[1]: http://www.juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/  
239 -[2]: http://github.com/jackdempsey/acts_as_commentable/tree/master  
240 -  
241 -More  
242 -====  
243 -  
244 -Support: [Use my blog for support.][6]  
245 -  
246 -  
247 -[Documentation from the original acts\_as\_voteable plugin][3]  
248 -  
249 -[3]: http://www.juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/  
250 -[4]: http://www.workingwithrails.com/person/12521-peter-jackson  
251 -[5]: http://www.workingwithrails.com/recommendation/new/person/12521-peter-jackson  
252 -[6]: http://blog.peteonrails.com  
253 -  
254 -Copyright (c) 2008 Peter Jackson, released under the MIT license  
255 -  
vendor/plugins/vote_fu/examples/routes.rb
@@ -1,7 +0,0 @@ @@ -1,7 +0,0 @@
1 -  
2 -map.resources :users do |user|  
3 - user.resources :votes  
4 - user.resources :voteable do |mv|  
5 - mv.resources :votes  
6 - end  
7 -end  
8 \ No newline at end of file 0 \ No newline at end of file
vendor/plugins/vote_fu/examples/users_controller.rb
@@ -1,76 +0,0 @@ @@ -1,76 +0,0 @@
1 -# I usually use the user class from restful_authentication as my principle voter class  
2 -# There are generally no changes required to support voting in this controller.  
3 -  
4 -class UsersController < ApplicationController  
5 - # Be sure to include AuthenticationSystem in Application Controller instead  
6 - include AuthenticatedSystem  
7 -  
8 - # Protect these actions behind an admin login  
9 - before_filter :admin_required, :only => [:suspend, :unsuspend, :destroy, :purge]  
10 - before_filter :find_user, :only => [:suspend, :unsuspend, :destroy, :purge, :show]  
11 -  
12 - before_filter :login_required, :only => [:index]  
13 -  
14 - # render new.html.erb  
15 - def new  
16 - end  
17 -  
18 - # GET /users/:id  
19 - def show  
20 - end  
21 -  
22 -  
23 - def create  
24 - cookies.delete :auth_token  
25 - @user = User.new(params[:user])  
26 - @user.register! if @user.valid?  
27 - if @user.errors.empty?  
28 - self.current_user.forget_me if logged_in?  
29 - cookies.delete :auth_token  
30 - reset_session  
31 - flash[:notice] = "Thanks for signing up!"  
32 - else  
33 - render :action => 'new'  
34 - end  
35 - end  
36 -  
37 - def activate  
38 - unless params[:activation_code].blank?  
39 - self.current_user = User.find_by_activation_code(params[:activation_code])  
40 - if logged_in? && !current_user.active?  
41 - current_user.activate!  
42 - flash[:notice] = "Signup complete!"  
43 - redirect_back_or_default('/')  
44 - else  
45 - flash[:error] = "Sorry, we couldn't find that activation code. Please cut and paste your activation code into the space at left."  
46 - end  
47 - end  
48 - # render activate.html.erb  
49 - end  
50 -  
51 - def suspend  
52 - @user.suspend!  
53 - redirect_to users_path  
54 - end  
55 -  
56 - def unsuspend  
57 - @user.unsuspend!  
58 - redirect_to users_path  
59 - end  
60 -  
61 - def destroy  
62 - @user.delete!  
63 - redirect_to users_path  
64 - end  
65 -  
66 - def purge  
67 - @user.destroy  
68 - redirect_to users_path  
69 - end  
70 -  
71 -protected  
72 - def find_user  
73 - @user = User.find(params[:id])  
74 - end  
75 -  
76 -end  
vendor/plugins/vote_fu/examples/voteable.html.erb
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -<div id="voteable_<%= @voteable.id %>">  
2 -  
3 - ..... Show some fields .....  
4 -  
5 - <div id="votes_<%= @voteable.id %>">  
6 - <%= render :partial => "votes/voteable_vote", :locals => {:voteable => @voteable} %>  
7 - </div>  
8 -</div>  
vendor/plugins/vote_fu/examples/voteable.rb
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -class Voteable < ActiveRecord::Base  
2 -  
3 - belongs_to :user  
4 -  
5 - acts_as_voteable  
6 -  
7 - scope :descending, :order => "created_at DESC"  
8 -  
9 -  
10 -end  
11 \ No newline at end of file 0 \ No newline at end of file
vendor/plugins/vote_fu/examples/voteables_controller.rb
@@ -1,117 +0,0 @@ @@ -1,117 +0,0 @@
1 -# This example controller assumes you are using the User class from restful_authentication  
2 -# and a nested voteable resource. See routes.rb  
3 -  
4 -  
5 -class VoteablesController < ApplicationController  
6 -  
7 - before_filter :find_user  
8 - before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]  
9 - before_filter :must_own_voteable, :only => [:edit, :destroy, :update]  
10 -  
11 - # GET /users/:id/voteables  
12 - # GET /users/:id/voteables.xml  
13 - def index  
14 - @voteable = Voteable.descending  
15 -  
16 - respond_to do |format|  
17 - format.html # index.html.erb  
18 - format.xml { render :xml => @voteables }  
19 - end  
20 - end  
21 -  
22 - # GET /users/:id/voteables/1  
23 - # GET /users/:id/voteables/1.xml  
24 - def show  
25 - @voteable = Voteable.find(params[:id])  
26 -  
27 - respond_to do |format|  
28 - format.html # show.html.erb  
29 - format.xml { render :xml => @voteable }  
30 - end  
31 - end  
32 -  
33 - # GET /users/:id/voteables/new  
34 - # GET /users/:id/voteables/new.xml  
35 - def new  
36 - @voteable = Voteable.new  
37 -  
38 - respond_to do |format|  
39 - format.html # new.html.erb  
40 - format.xml { render :xml => @voteable }  
41 - end  
42 - end  
43 -  
44 - # GET /users/:id/voteables/1/edit  
45 - def edit  
46 - @voteable ||= Voteable.find(params[:id])  
47 - end  
48 -  
49 - # POST /users/:id/voteables  
50 - # POST /users/:id/voteables.xml  
51 - def create  
52 - @voteable = Voteable.new(params[:voteable])  
53 - @voteable.user = current_user  
54 -  
55 - respond_to do |format|  
56 - if @voteable.save  
57 - flash[:notice] = 'Voteable was successfully saved.'  
58 - format.html { redirect_to([@user, @voteable]) }  
59 - format.xml { render :xml => @voteable, :status => :created, :location => @voteable }  
60 - else  
61 - format.html { render :action => "new" }  
62 - format.xml { render :xml => @voteable.errors, :status => :unprocessable_entity }  
63 - end  
64 - end  
65 - end  
66 -  
67 - # PUT /users/:id/voteable/1  
68 - # PUT /users/:id/voteable/1.xml  
69 - def update  
70 - @voteable = Voteable.find(params[:id])  
71 -  
72 - respond_to do |format|  
73 - if @quote.update_attributes(params[:voteable])  
74 - flash[:notice] = 'Voteable was successfully updated.'  
75 - format.html { redirect_to([@user, @voteable]) }  
76 - format.xml { head :ok }  
77 - else  
78 - format.html { render :action => "edit" }  
79 - format.xml { render :xml => @voteable.errors, :status => :unprocessable_entity }  
80 - end  
81 - end  
82 - end  
83 -  
84 - # DELETE /users/:id/voteable/1  
85 - # DELETE /users/:id/voteable/1.xml  
86 - def destroy  
87 - @voteable = Voteable.find(params[:id])  
88 - @voteable.destroy  
89 -  
90 - respond_to do |format|  
91 - format.html { redirect_to(user_voteables_url) }  
92 - format.xml { head :ok }  
93 - end  
94 - end  
95 -  
96 - private  
97 - def find_user  
98 - @user = User.find(params[:user_id])  
99 - end  
100 -  
101 - def must_own_voteable  
102 - @voteable ||= Voteable.find(params[:id])  
103 - @voteable.user == current_user || ownership_violation  
104 - end  
105 -  
106 - def ownership_violation  
107 - respond_to do |format|  
108 - flash[:notice] = 'You cannot edit or delete voteable that you do not own!'  
109 - format.html do  
110 - redirect_to user_path(current_user)  
111 - end  
112 - end  
113 - end  
114 -  
115 -  
116 -  
117 -end  
vendor/plugins/vote_fu/examples/votes/_voteable_vote.html.erb
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -<%  
2 - # You can't vote if it is your quote,  
3 - # you are not logged in,  
4 - # or you have already voted on this item  
5 -  
6 - unless quote.user == current_user ||  
7 - !logged_in? ||  
8 - current_user.voted_on?(@voteable)  
9 -%>  
10 -  
11 - <%= link_to_remote "Up",  
12 - :url => user_voteable_votes_path(voteable.user, voteable, :vote => :true, :format => :rjs),  
13 - :method => :post  
14 - %>  
15 - /  
16 - <%= link_to_remote "Down",  
17 - :url => user_voteable_votes_path(voteable.user, voteable, :vote => :false, :format => :rjs),  
18 - :method => :post  
19 - %>  
20 -  
21 -<% end %>  
22 -  
23 -Votes: <%= voteable.votes_for - voteable.votes_against %>  
vendor/plugins/vote_fu/examples/votes/create.rjs
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -page.replace_html "votes_#{@voteable.id}", :partial => "voteable_vote", :locals => {:voteable => @voteable}  
vendor/plugins/vote_fu/examples/votes_controller.rb
@@ -1,110 +0,0 @@ @@ -1,110 +0,0 @@
1 -# An example controller for "votes" that are nested resources under users. See examples/routes.rb  
2 -  
3 -class VotesController < ApplicationController  
4 -  
5 - # First, figure out our nested scope. User or Voteable?  
6 - before_filter :find_votes_for_my_scope, :only => [:index]  
7 -  
8 - before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]  
9 - before_filter :must_own_vote, :only => [:edit, :destroy, :update]  
10 - before_filter :not_allowed, :only => [:edit, :update, :new]  
11 -  
12 - # GET /users/:user_id/votes/  
13 - # GET /users/:user_id/votes.xml  
14 - # GET /users/:user_id/voteables/:voteable_id/votes/  
15 - # GET /users/:user_id/voteables/:voteable_id/votes.xml  
16 - def index  
17 - respond_to do |format|  
18 - format.html # index.html.erb  
19 - format.xml { render :xml => @votes }  
20 - end  
21 - end  
22 -  
23 - # GET /users/:user_id/votes/1  
24 - # GET /users/:user_id/votes/1.xml  
25 - # GET /users/:user_id/voteables/:voteable_id/votes/1  
26 - # GET /users/:user_id/voteables/:voteable_id/1.xml  
27 - def show  
28 - @voteable = Vote.find(params[:id])  
29 -  
30 - respond_to do |format|  
31 - format.html # show.html.erb  
32 - format.xml { render :xml => @vote }  
33 - end  
34 - end  
35 -  
36 - # GET /users/:id/votes/new  
37 - # GET /users/:id/votes/new.xml  
38 - # GET /users/:id/votes/new  
39 - # GET /users/:id/votes/new.xml  
40 - def new  
41 - # Not generally used. Most people want to vote via AJAX calls.  
42 - end  
43 -  
44 - # GET /users/:id/votes/1/edit  
45 - def edit  
46 - # Not generally used. Most people don't want to allow editing of votes.  
47 - end  
48 -  
49 - # POST /users/:user_id/voteables/:voteable_id/votes  
50 - # POST /users/:user_id/voteables/:voteable_id/votes.xml  
51 - def create  
52 - @voteable = Voteable.find(params[:quote_id])  
53 -  
54 - respond_to do |format|  
55 - if current_user.vote(@voteable, params[:vote])  
56 - format.rjs { render :action => "create", :vote => @vote }  
57 - format.html { redirect_to([@voteable.user, @voteable]) }  
58 - format.xml { render :xml => @voteable, :status => :created, :location => @voteable }  
59 - else  
60 - format.rjs { render :action => "error" }  
61 - format.html { render :action => "new" }  
62 - format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }  
63 - end  
64 - end  
65 - end  
66 -  
67 - # PUT /users/:id/votes/1  
68 - # PUT /users/:id/votes/1.xml  
69 - def update  
70 - # Not generally used  
71 - end  
72 -  
73 - # DELETE /users/:id/votes/1  
74 - # DELETE /users/:id/votes/1.xml  
75 - def destroy  
76 - @vote = Vote.find(params[:id])  
77 - @vote.destroy  
78 -  
79 - respond_to do |format|  
80 - format.html { redirect_to(user_votes_url) }  
81 - format.xml { head :ok }  
82 - end  
83 - end  
84 -  
85 - private  
86 - def find_votes_for_my_scope  
87 - if params[:voteable_id]  
88 - @votes = Vote.for_voteable(Voteable.find(params[:voteable_id])).descending  
89 - elsif params[:user_id]  
90 - @votes = Vote.for_voter(User.find(params[:user_id])).descending  
91 - else  
92 - @votes = []  
93 - end  
94 - end  
95 -  
96 - def must_own_vote  
97 - @vote ||= Vote.find(params[:id])  
98 - @vote.user == current_user || ownership_violation  
99 - end  
100 -  
101 - def ownership_violation  
102 - respond_to do |format|  
103 - flash[:notice] = 'You cannot edit or delete votes that you do not own!'  
104 - format.html do  
105 - redirect_to user_path(current_user)  
106 - end  
107 - end  
108 - end  
109 -  
110 -end  
vendor/plugins/vote_fu/generators/vote_fu/templates/migration.rb
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -class VoteFuMigration < ActiveRecord::Migration  
2 - def self.up  
3 - create_table :votes, :force => true do |t|  
4 - t.integer :vote, :null => false  
5 - t.references :voteable, :polymorphic => true, :null => false  
6 - t.references :voter, :polymorphic => true  
7 - t.timestamps  
8 - end  
9 -  
10 - add_index :votes, ["voter_id", "voter_type"], :name => "fk_voters"  
11 - add_index :votes, ["voteable_id", "voteable_type"], :name => "fk_voteables"  
12 -  
13 - # If you want to enfore "One Person, One Vote" rules in the database, uncomment the index below  
14 - # add_index :votes, ["voter_id", "voter_type", "voteable_id", "voteable_type"], :unique => true, :name => "uniq_one_vote_only"  
15 - end  
16 -  
17 - def self.down  
18 - drop_table :votes  
19 - end  
20 -  
21 -end  
vendor/plugins/vote_fu/generators/vote_fu/vote_fu_generator.rb
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -class VoteFuGenerator < Rails::Generator::Base  
2 -  
3 - def manifest  
4 - record do |m|  
5 - m.migration_template 'migration.rb', 'db/migrate', :migration_file_name => 'vote_fu_migration'  
6 - end  
7 - end  
8 -end  
vendor/plugins/vote_fu/init.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -require 'vote_fu'  
vendor/plugins/vote_fu/lib/acts_as_voteable.rb
@@ -1,157 +0,0 @@ @@ -1,157 +0,0 @@
1 -# ActsAsVoteable  
2 -module Juixe  
3 - module Acts #:nodoc:  
4 - module Voteable #:nodoc:  
5 -  
6 - def self.included(base)  
7 - base.extend ClassMethods  
8 - end  
9 -  
10 - module ClassMethods  
11 - #  
12 - # Options:  
13 - # :vote_counter  
14 - # Model stores the sum of votes in the vote counter column when the value is true. This requires a column named `vote_total` in the table corresponding to `voteable` model.  
15 - # You can also specify a custom vote counter column by providing a column name instead of a true/false value to this option (e.g., :vote_counter => :my_custom_counter.)  
16 - # Note: Specifying a counter will add it to that model‘s list of readonly attributes using attr_readonly.  
17 - #  
18 - def acts_as_voteable options={}  
19 - has_many :votes, :as => :voteable, :dependent => :destroy  
20 - include Juixe::Acts::Voteable::InstanceMethods  
21 - extend Juixe::Acts::Voteable::SingletonMethods  
22 - if (options[:vote_counter])  
23 - Vote.send(:include, Juixe::Acts::Voteable::VoteCounterClassMethods) unless Vote.respond_to?(:vote_counters)  
24 - Vote.vote_counters = [self]  
25 - # define vote_counter_column instance method on voteable  
26 - counter_column_name = (options[:vote_counter] == true) ? :vote_total : options[:vote_counter]  
27 - class_eval <<-EOS  
28 - def self.vote_counter_column # def self.vote_counter_column  
29 - :"#{counter_column_name}" # :vote_total  
30 - end # end  
31 - def vote_counter_column  
32 - self.class.vote_counter_column  
33 - end  
34 - EOS  
35 -  
36 - define_method(:reload_vote_counter) {reload(:select => vote_counter_column.to_s)}  
37 - attr_readonly counter_column_name  
38 - end  
39 - end  
40 - end  
41 -  
42 - # This module contains class methods Vote class  
43 - module VoteCounterClassMethods  
44 - def self.included(base)  
45 - base.class_inheritable_array(:vote_counters)  
46 - base.after_create { |record| record.update_vote_counters(1) }  
47 - base.before_destroy { |record| record.update_vote_counters(-1) }  
48 - end  
49 -  
50 - def update_vote_counters direction  
51 - klass, vtbl = self.voteable.class, self.voteable  
52 - klass.update_counters(vtbl.id, vtbl.vote_counter_column.to_sym => (self.vote * direction) ) if self.vote_counters.any?{|c| c == klass}  
53 - end  
54 - end  
55 -  
56 - # This module contains class methods  
57 - module SingletonMethods  
58 -  
59 - # Calculate the vote counts for all voteables of my type.  
60 - # Options:  
61 - # :start_at - Restrict the votes to those created after a certain time  
62 - # :end_at - Restrict the votes to those created before a certain time  
63 - # :conditions - A piece of SQL conditions to add to the query  
64 - # :limit - The maximum number of voteables to return  
65 - # :order - A piece of SQL to order by. Two calculated columns `count`, and `total`  
66 - # are available for sorting apart from other columns. Defaults to `total DESC`.  
67 - # Eg: :order => 'count desc'  
68 - # :order => 'total desc'  
69 - # :order => 'post.created_at desc'  
70 - # :at_least - Item must have at least X votes count  
71 - # :at_most - Item may not have more than X votes count  
72 - # :at_least_total - Item must have at least X votes total  
73 - # :at_most_total - Item may not have more than X votes total  
74 - def tally(options = {})  
75 - find(:all, options_for_tally({:order =>"total DESC" }.merge(options)))  
76 - end  
77 -  
78 - def options_for_tally (options = {})  
79 - options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit, :at_least_total, :at_most_total  
80 -  
81 - scope = scope(:find)  
82 - start_at = sanitize_sql(["#{Vote.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]  
83 - end_at = sanitize_sql(["#{Vote.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]  
84 -  
85 - if respond_to?(:vote_counter_column)  
86 - # use the counter cache column if present.  
87 - total_col = "#{table_name}.#{vote_counter_column}"  
88 - at_least_total = sanitize_sql(["#{total_col} >= ?", options.delete(:at_least_total)]) if options[:at_least_total]  
89 - at_most_total = sanitize_sql(["#{total_col} <= ?", options.delete(:at_most_total)]) if options[:at_most_total]  
90 - end  
91 - conditions = [  
92 - options[:conditions],  
93 - at_least_total,  
94 - at_most_total,  
95 - start_at,  
96 - end_at  
97 - ]  
98 -  
99 - conditions = conditions.compact.join(' AND ')  
100 - conditions = merge_conditions(conditions, scope[:conditions]) if scope  
101 -  
102 - type_and_context = "#{Vote.table_name}.voteable_type = #{quote_value(base_class.name)}"  
103 - joins = ["LEFT OUTER JOIN #{Vote.table_name} ON #{table_name}.#{primary_key} = #{Vote.table_name}.voteable_id AND #{type_and_context}"]  
104 - joins << scope[:joins] if scope && scope[:joins]  
105 - at_least = sanitize_sql(["COUNT(#{Vote.table_name}.id) >= ?", options.delete(:at_least)]) if options[:at_least]  
106 - at_most = sanitize_sql(["COUNT(#{Vote.table_name}.id) <= ?", options.delete(:at_most)]) if options[:at_most]  
107 - at_least_total = at_most_total = nil # reset the values  
108 - unless respond_to?(:vote_counter_column)  
109 - # aggregate the votes when counter cache is absent.  
110 - total_col = "SUM(#{Vote.table_name}.vote)"  
111 - at_least_total = sanitize_sql(["#{total_col} >= ?", options.delete(:at_least_total)]) if options[:at_least_total]  
112 - at_most_total = sanitize_sql(["#{total_col} <= ?", options.delete(:at_most_total)]) if options[:at_most_total]  
113 - end  
114 - having = [at_least, at_most, at_least_total, at_most_total].compact.join(' AND ')  
115 - group_by = "#{Vote.table_name}.voteable_id HAVING COUNT(#{Vote.table_name}.id) > 0"  
116 - group_by << " AND #{having}" unless having.blank?  
117 -  
118 - { :select => "#{table_name}.*, COUNT(#{Vote.table_name}.id) AS count, #{total_col} AS total",  
119 - :joins => joins.join(" "),  
120 - :conditions => conditions,  
121 - :group => group_by  
122 - }.update(options)  
123 - end  
124 -  
125 - end  
126 -  
127 - # This module contains instance methods  
128 - module InstanceMethods  
129 - def votes_for  
130 - self.votes.count(:conditions => {:vote => 1})  
131 - end  
132 -  
133 - def votes_against  
134 - self.votes.count(:conditions => {:vote => -1})  
135 - end  
136 -  
137 - # Same as voteable.votes.size  
138 - def votes_count  
139 - self.votes.size  
140 - end  
141 -  
142 - def votes_total  
143 - respond_to?(:vote_counter_column) ? send(self.vote_counter_column) : self.votes.sum(:vote)  
144 - end  
145 -  
146 - def voters_who_voted  
147 - self.votes.collect(&:voter)  
148 - end  
149 -  
150 - def voted_by?(voter, for_or_against = "all")  
151 - options = (for_or_against == "all") ? {} : {:vote => (for_or_against ? 1 : -1)}  
152 - self.votes.exists?({:voter_id => voter.id, :voter_type => voter.class.base_class.name}.merge(options))  
153 - end  
154 - end  
155 - end  
156 - end  
157 -end  
vendor/plugins/vote_fu/lib/acts_as_voter.rb
@@ -1,65 +0,0 @@ @@ -1,65 +0,0 @@
1 -# ActsAsVoter  
2 -module PeteOnRails  
3 - module Acts #:nodoc:  
4 - module Voter #:nodoc:  
5 -  
6 - def self.included(base)  
7 - base.extend ClassMethods  
8 - end  
9 -  
10 - module ClassMethods  
11 - def acts_as_voter  
12 - has_many :votes, :as => :voter, :dependent => :nullify # If a voting entity is deleted, keep the votes.  
13 - include PeteOnRails::Acts::Voter::InstanceMethods  
14 - extend PeteOnRails::Acts::Voter::SingletonMethods  
15 - end  
16 - end  
17 -  
18 - # This module contains class methods  
19 - module SingletonMethods  
20 - end  
21 -  
22 - # This module contains instance methods  
23 - module InstanceMethods  
24 -  
25 - # Usage user.vote_count(true) # All +1 votes  
26 - # user.vote_count(false) # All -1 votes  
27 - # user.vote_count() # All votes  
28 - #  
29 - def vote_count(for_or_against = "all")  
30 - return self.votes.size if for_or_against == "all"  
31 - self.votes.count(:conditions => {:vote => (for_or_against ? 1 : -1)})  
32 - end  
33 -  
34 - def voted_for?(voteable)  
35 - voteable.voted_by?(self, true)  
36 - end  
37 -  
38 - def voted_against?(voteable)  
39 - voteable.voted_by?(self, false)  
40 - end  
41 -  
42 - def voted_on?(voteable)  
43 - voteable.voted_by?(self)  
44 - end  
45 -  
46 - def vote_for(voteable)  
47 - self.vote(voteable, 1)  
48 - end  
49 -  
50 - def vote_against(voteable)  
51 - self.vote(voteable, -1)  
52 - end  
53 -  
54 - def vote(voteable, vote)  
55 - Vote.create(:vote => vote, :voteable => voteable, :voter => self).tap do |v|  
56 - voteable.reload_vote_counter if !v.new_record? and voteable.respond_to?(:reload_vote_counter)  
57 - end.errors.empty?  
58 - end  
59 -  
60 - end  
61 -  
62 - end  
63 -  
64 - end  
65 -end  
66 \ No newline at end of file 0 \ No newline at end of file
vendor/plugins/vote_fu/lib/controllers/votes_controller.rb
@@ -1,96 +0,0 @@ @@ -1,96 +0,0 @@
1 -class VotesController < ApplicationController  
2 - # First, figure out our nested scope. User or vote?  
3 -# before_filter :find_my_scope  
4 -  
5 -# before_filter :find_user  
6 -  
7 -# before_filter :login_required, :only => [:new, :edit, :destroy, :create, :update]  
8 -# before_filter :must_own_vote, :only => [:edit, :destroy, :update]  
9 -  
10 -  
11 - # GET /votes/  
12 - # GET /votes.xml  
13 - def index  
14 - @votes = Vote.descending  
15 -  
16 - respond_to do |format|  
17 - format.html # index.html.erb  
18 - format.xml { render :xml => @votes }  
19 - end  
20 - end  
21 -  
22 - # GET /votes/1  
23 - # GET /votes/1.xml  
24 - def show  
25 - @vote = Vote.find(params[:id])  
26 -  
27 - respond_to do |format|  
28 - format.html # show.html.erb  
29 - format.xml { render :xml => @vote }  
30 - end  
31 - end  
32 -  
33 - # GET /votes/new  
34 - # GET /votes/new.xml  
35 - def new  
36 - @vote = Vote.new  
37 -  
38 - respond_to do |format|  
39 - format.html # new.html.erb  
40 - format.xml { render :xml => @vote }  
41 - end  
42 - end  
43 -  
44 - # GET /votes/1/edit  
45 - def edit  
46 - @vote ||= Vote.find(params[:id])  
47 - end  
48 -  
49 - # POST /votes  
50 - # POST /votes.xml  
51 - def create  
52 - @vote = Vote.new(params[:vote])  
53 - @vote.user = current_user  
54 -  
55 - respond_to do |format|  
56 - if @vote.save  
57 - flash[:notice] = 'Vote was successfully saved.'  
58 - format.html { redirect_to([@user, @vote]) }  
59 - format.xml { render :xml => @vote, :status => :created, :location => @vote }  
60 - else  
61 - format.html { render :action => "new" }  
62 - format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }  
63 - end  
64 - end  
65 - end  
66 -  
67 - # PUT /votes/1  
68 - # PUT /votes/1.xml  
69 - def update  
70 - @vote = Vote.find(params[:id])  
71 -  
72 - respond_to do |format|  
73 - if @vote.update_attributes(params[:vote])  
74 - flash[:notice] = 'Vote was successfully updated.'  
75 - format.html { redirect_to([@user, @vote]) }  
76 - format.xml { head :ok }  
77 - else  
78 - format.html { render :action => "edit" }  
79 - format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }  
80 - end  
81 - end  
82 - end  
83 -  
84 - # DELETE /votes/1  
85 - # DELETE /votes/1.xml  
86 - def destroy  
87 - @vote = Vote.find(params[:id])  
88 - @vote.destroy  
89 -  
90 - respond_to do |format|  
91 - format.html { redirect_to(user_votes_url) }  
92 - format.xml { head :ok }  
93 - end  
94 - end  
95 -  
96 -end  
vendor/plugins/vote_fu/lib/has_karma.rb
@@ -1,68 +0,0 @@ @@ -1,68 +0,0 @@
1 -# Has Karma  
2 -  
3 -module PeteOnRails  
4 - module VoteFu #:nodoc:  
5 - module Karma #:nodoc:  
6 -  
7 - def self.included(base)  
8 - base.extend ClassMethods  
9 - class << base  
10 - attr_accessor :karmatic_objects  
11 - end  
12 - end  
13 -  
14 - module ClassMethods  
15 - def has_karma(voteable_type)  
16 - self.class_eval <<-RUBY  
17 - def karma_voteable  
18 - #{voteable_type.to_s.classify}  
19 - end  
20 - RUBY  
21 - include PeteOnRails::VoteFu::Karma::InstanceMethods  
22 - extend PeteOnRails::VoteFu::Karma::SingletonMethods  
23 - if self.karmatic_objects.nil?  
24 - self.karmatic_objects = [eval(voteable_type.to_s.classify)]  
25 - else  
26 - self.karmatic_objects.push(eval(voteable_type.to_s.classify))  
27 - end  
28 - end  
29 - end  
30 -  
31 - # This module contains class methods  
32 - module SingletonMethods  
33 -  
34 - ## Not yet implemented. Don't use it!  
35 - # Find the most popular users  
36 - def find_most_karmic  
37 - find(:all)  
38 - end  
39 -  
40 - end  
41 -  
42 - # This module contains instance methods  
43 - module InstanceMethods  
44 - def karma(options = {})  
45 - #FIXME cannot have 2 models imapcting the karma simultaneously  
46 - # count the total number of votes on all of the voteable objects that are related to this object  
47 - #2009-01-30 GuillaumeNM The following line is not SQLite3 compatible, because boolean are stored as 'f' or 't', not '1', or '0'  
48 - #self.karma_voteable.sum(:vote, options_for_karma(options))  
49 - #self.karma_voteable.find(:all, options_for_karma(options)).length  
50 - karma_value = 0  
51 - self.class.karmatic_objects.each do |object|  
52 - karma_value += object.find(:all, options_for_karma(object, options)).length  
53 - end  
54 - return karma_value  
55 - end  
56 -  
57 - def options_for_karma (object, options = {})  
58 - #GuillaumeNM : 2009-01-30 Adding condition for SQLite3  
59 - conditions = ["u.id = ? AND vote = ?" , self[:id] , true]  
60 - joins = ["inner join votes v on #{object.table_name}.id = v.voteable_id", "inner join #{self.class.table_name} u on u.id = #{object.name.tableize}.#{self.class.name.foreign_key}"]  
61 - { :joins => joins.join(" "), :conditions => conditions }.update(options)  
62 - end  
63 -  
64 - end  
65 -  
66 - end  
67 - end  
68 -end  
vendor/plugins/vote_fu/lib/models/vote.rb
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -class Vote < ActiveRecord::Base  
2 -  
3 - scope :for_voter, lambda { |*args| {:conditions => ["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.base_class.name]} }  
4 - scope :for_voteable, lambda { |*args| {:conditions => ["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.base_class.name]} }  
5 - scope :recent, lambda { |*args| {:conditions => ["created_at > ?", (args.first || 2.weeks.ago).to_s(:db)]} }  
6 - scope :descending, :order => "created_at DESC"  
7 -  
8 - # NOTE: Votes belong to the "voteable" interface, and also to voters  
9 - belongs_to :voteable, :polymorphic => true  
10 - belongs_to :voter, :polymorphic => true  
11 -  
12 - attr_accessible :vote, :voter, :voteable  
13 -  
14 - # Uncomment this to limit users to a single vote on each item.  
15 - #validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]  
16 -  
17 -end  
vendor/plugins/vote_fu/lib/vote_fu.rb
@@ -1,9 +0,0 @@ @@ -1,9 +0,0 @@
1 -require 'acts_as_voteable'  
2 -require 'acts_as_voter'  
3 -require 'has_karma'  
4 -require 'models/vote.rb'  
5 -  
6 -ActiveRecord::Base.send(:include, Juixe::Acts::Voteable)  
7 -ActiveRecord::Base.send(:include, PeteOnRails::Acts::Voter)  
8 -ActiveRecord::Base.send(:include, PeteOnRails::VoteFu::Karma)  
9 -Rails.logger.info "** vote_fu: initialized properly."  
vendor/plugins/vote_fu/rails/init.rb
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -RAILS_DEFAULT_LOGGER.info "** vote_fu: setting up load paths"  
2 -  
3 -%w{ models controllers helpers }.each do |dir|  
4 - path = File.join(File.dirname(__FILE__) , 'lib', dir)  
5 - $LOAD_PATH << path  
6 - ActiveSupport::Dependencies.load_paths << path  
7 - ActiveSupport::Dependencies.load_once_paths.delete(path)  
8 -end  
9 -  
10 -require 'vote_fu'  
11 \ No newline at end of file 0 \ No newline at end of file
vendor/plugins/vote_fu/test/vote_fu_test.rb
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -require 'test/unit'  
2 -  
3 -class VoteFuTest < Test::Unit::TestCase  
4 - # Replace this with your real tests.  
5 - def test_this_plugin  
6 - flunk  
7 - end  
8 -end  
vendor/plugins/vote_fu/vote_fu.gemspec
@@ -1,36 +0,0 @@ @@ -1,36 +0,0 @@
1 -Gem::Specification.new do |s|  
2 - s.name = "kandadaboggu-vote_fu"  
3 - s.version = "0.0.15"  
4 - s.date = "2010-03-08"  
5 - s.summary = "Enhanced vote_fu with numerical voting and total vote caching."  
6 - s.email = "kandadaboggu@gmail.com"  
7 - s.homepage = "http://github.com/kandadaboggu/vote_fu"  
8 - s.description = "Enhanced vote_fu with numerical voting and total vote caching."  
9 - s.has_rdoc = false  
10 - s.authors = ["Peter Jackson", "Cosmin Radoi", "Bence Nagy", "Rob Maddox", "Kandada Boggu"]  
11 - s.files = [ "CHANGELOG.markdown",  
12 - "MIT-LICENSE",  
13 - "README.markdown",  
14 - "generators/vote_fu",  
15 - "generators/vote_fu/vote_fu_generator.rb",  
16 - "generators/vote_fu/templates",  
17 - "generators/vote_fu/templates/migration.rb",  
18 - "init.rb",  
19 - "lib/vote_fu.rb",  
20 - "lib/acts_as_voteable.rb",  
21 - "lib/acts_as_voter.rb",  
22 - "lib/has_karma.rb",  
23 - "lib/models/vote.rb",  
24 - "lib/controllers/votes_controller.rb",  
25 - "test/vote_fu_test.rb",  
26 - "examples/votes_controller.rb",  
27 - "examples/users_controller.rb",  
28 - "examples/voteables_controller.rb",  
29 - "examples/voteable.rb",  
30 - "examples/voteable.html.erb",  
31 - "examples/votes/_voteable_vote.html.erb",  
32 - "examples/votes/create.rjs",  
33 - "examples/routes.rb",  
34 - "rails/init.rb"  
35 - ]  
36 -end