+# Selectricity: Voting Machinery for the Masses
+# Copyright (C) 2007, 2008 Benjamin Mako Hill <mako@atdot.cc>
+# Copyright (C) 2007 Massachusetts Institute of Technology
+#
+# This program is free software. Please see the COPYING file for
+# details.
+
class Election < ActiveRecord::Base
has_many :candidates
has_many :voters
has_many :votes
belongs_to :user
validates_presence_of :name, :description
-
+
+ # enforce constraints associated with dependencies (i.e., a kiosk
+ # election can't also be unauthenticated)
+ before_save :enforce_constraints
+
#validate that method is one of the listed election types
-
attr_reader :plurality_result
attr_reader :approval_result
attr_reader :condorcet_result
attr_reader :borda_result
require 'date'
-
+
def initialize(params={})
super
self.enddate = read_attribute( :enddate ) || \
reasons << "You must have at least two candidates."
end
- if self.voters.length <= 1
+ if self.voters.length <= 1 and self.authenticated?
reasons << "You must have at least two voters."
end
def activate!
self.active = 1
- self.save!
+ self.save
end
def quickvote?
- self.class == 'QuickVote'
+ self.class == QuickVote
end
def active?
active == 2
end
+ def authenticated?
+ authenticated
+ end
+
+ def kiosk?
+ kiosk
+ end
+
def shortdesc
shortdesc = description.split(/\n/)[0]
end
#Calculate results if not in memcache
def results
# Assignment is intentional
- if defined? Cache and c = Cache.get("election_results:#{id}:#{self.votes.length}")
+ if Cache and c = Cache.get("election_results:#{id}:#{self.votes.length}")
@plurality_result = c['plurality']
@approval_result = c['approval']
@condorcet_result = c['condorcet']
@ssd_result = c['ssd']
@borda_result = c['borda']
return c
- elsif defined? Cache
+ elsif Cache
# memcache is available, but missed.
results = self.results!
Cache.set("election_results:#{id}:#{self.votes.length}", results)
names
end
+
+ def candidate_hash
+ hash = {}
+ self.candidates.each {|c| hash[c.id] = c}
+ return hash
+ end
+
+
+ # TODO now that this code is in here, we should go ahead and remove
+ # date checking from other places in the code
+ def after_find
+ if self.active < 2 and self.enddate < Time.now
+ self.active = 2
+ self.save
+ end
+ end
+
+ private
+ def enforce_constraints
+ # kiosks can't be authenticated
+ self.authenticated = false if kiosk?
+ return true
+ end
+
end