petition.rb 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. require "csv"
  2. class Petition < ActiveRecord::Base
  3. has_one :action_page
  4. has_many :signatures
  5. after_initialize :set_goal
  6. def percent_complete
  7. [signatures.count.to_f / goal.to_f, 1].min * 100
  8. end
  9. def recent_signatures(num)
  10. recent = []
  11. signatures.last(num).reverse.each do |s|
  12. if s.anonymous
  13. recent.push(s.as_json(only: [], methods: [:time_ago, :location]))
  14. else
  15. recent.push(s.as_json(only: [:first_name, :last_name, :city], methods: [:time_ago, :location]))
  16. end
  17. end
  18. recent
  19. end
  20. def signatures_by_institution(institution)
  21. signatures.includes(affiliations: :institution)
  22. .where(institutions: { id: institution })
  23. end
  24. def location_required?
  25. !enable_affiliations
  26. end
  27. def to_csv(options = {})
  28. column_names =
  29. %w[first_name last_name email zipcode country_code created_at]
  30. CSV.generate(options) do |csv|
  31. csv << column_names
  32. signatures.each do |sub|
  33. csv << sub.attributes.values_at(*column_names)
  34. end
  35. end
  36. end
  37. def to_presentable_csv(options = {})
  38. column_names =
  39. %w[full_name email city state country]
  40. CSV.generate(options) do |csv|
  41. csv << column_names
  42. signatures.each do |signature|
  43. csv << signature.to_csv_line
  44. end
  45. end
  46. end
  47. def to_affiliation_csv(institution, options = {})
  48. column_names = %w[full_name, institution, affiliation_type]
  49. CSV.generate(options) do |csv|
  50. signatures_by_institution(institution).each do |s|
  51. affiliation = s.affiliations.first
  52. csv << [s.name,
  53. affiliation.institution.name,
  54. affiliation.affiliation_type.name]
  55. end
  56. end
  57. end
  58. def to_s
  59. "#{title}-exported_on-#{DateTime.now.strftime("%Y-%m-%d")}"
  60. end
  61. private
  62. def set_goal
  63. if new_record?
  64. goal = 100
  65. end
  66. end
  67. end