sv.rb 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. require "sequel"
  2. require "sinatra"
  3. require 'newrelic_rpm'
  4. require "slim"
  5. require "pry"
  6. require "envyable"
  7. require "hashids"
  8. require "set"
  9. Envyable.load("config/env.yaml", ENV['RACK_ENV'])
  10. if ENV['RACK_ENV'] != "test"
  11. DB = Sequel.connect(:adapter=>'postgres', :host=>ENV['PW_HOST'], :database=>ENV['PW_DB'], :user=>ENV['PW_USER'], :password=>ENV['PW_PASSWORD'], :sslmode => "require")
  12. end
  13. class Schueler < Sequel::Model(:schueler);end
  14. class Lehrer < Sequel::Model(:lehrer);end
  15. class Info < Sequel::Model(:infos);end
  16. class Sprecher < Sequel::Model(:sprecher);end
  17. class Schuko < Sequel::Model(:schuko);end
  18. class Verbindungslehrer < Sequel::Model(:verbindungslehrer);end
  19. class SV < Sinatra::Application
  20. configure do
  21. use Rack::Session::Cookie, :key => 'rack.session',
  22. :path => '/',
  23. :secret => (ENV['PW_SESSION_SECRET'] || 'your_secret'),
  24. :expire_after => 2592000
  25. Slim::Engine.set_options pretty: true
  26. enable :static
  27. set :public_folder, File.dirname(__FILE__) + '/public'
  28. end
  29. configure :production do
  30. newrelic_ignore '/ping'
  31. end
  32. helpers do
  33. def protected!
  34. return if authorized?
  35. headers['WWW-Authenticate'] = 'Basic realm="Bitte anmelden"'
  36. halt 401, "Not authorized\n"
  37. end
  38. def authorized?
  39. @auth ||= Rack::Auth::Basic::Request.new(request.env)
  40. @auth.provided? and @auth.basic? and @auth.credentials and @auth.credentials == [ENV['PW_BASIC_AUTH_USER'], ENV['PW_BASIC_AUTH_PASSWORD']]
  41. end
  42. def hashids
  43. hashids = Hashids.new("zujkthdtgsjfadwuiez8734fubcek", 5, "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789")
  44. end
  45. end
  46. error do
  47. 'Es ist ein Fehler aufgetreten. Sollte das nochmal passieren, schreiben Sie mir doch bitte eine eMail: bk@hmt.im'
  48. end
  49. before do
  50. # params.delete_if { |k, v| v.empty? }
  51. end
  52. get '/' do
  53. infos = Info.all
  54. slim :home, :locals => {:infos => infos}
  55. end
  56. get '/ping' do
  57. halt 200
  58. end
  59. post "/wahl" do
  60. if Time.now > time_for('Sep 30, 2016, 18:00')
  61. session[:flash] = [0, "Sie können sich nicht mehr aufstellen lassen, die Wahl hat bereits begonnen"]
  62. redirect back
  63. end
  64. schueler = Schueler.where(:hashid => params[:hashid]).first
  65. if schueler.update_fields params, [:info, :email, :schuko, :sprecher, :nachname]
  66. session[:flash] = [1, "Ihre Eingabe wurde gespeichert"]
  67. else
  68. session[:flash] = [0, "Es gab einen Fehler beim Speichern"]
  69. end
  70. redirect back
  71. end
  72. post '/info' do
  73. protected!
  74. if DB_SV[:infos].insert(params)
  75. session[:flash] = [1, "Die Info wurde gespeichert"]
  76. else
  77. session[:flash] = [0, "Es gab einen Fehler beim Speichern der Info"]
  78. end
  79. redirect to("/")
  80. end
  81. get '/info_loeschen/:id' do |id|
  82. protected!
  83. Info.where(:id => id).first.delete
  84. redirect back
  85. end
  86. get '/info' do
  87. protected!
  88. infos = Info.all
  89. slim :info, :locals => {:infos => infos}
  90. end
  91. post "/hashid" do
  92. redirect to("/#{params[:hashid]}")
  93. end
  94. get "/:hashid" do
  95. schueler = Schueler.where(:hashid => params[:hashid]).first
  96. if schueler.nil?
  97. halt 404, "Adresse richtig abgetippt? Eventuell geht es mit dem QR-Code am Telefon leichter?"
  98. end
  99. lehrer = Lehrer.all
  100. slim :hashid, :locals => {:schueler => schueler, :lehrer => lehrer}
  101. end
  102. post "/:hashid" do
  103. if Time.now > time_for('Oct 3, 2016, 18:00')
  104. session[:flash] = [0, "Der Wahlzeitraum ist seit 3. Oktober 18:00 Uhr abgelaufen."]
  105. redirect back
  106. elsif Time.now < time_for('Sep 30, 2016, 18:00')
  107. session[:flash] = [0, "Der Wahlzeitraum beginnt erst am 30. September um 18:00 Uhr."]
  108. redirect back
  109. end
  110. schueler = Schueler.where(:hashid => params[:hashid]).first
  111. if schueler.nil?
  112. halt 404, "Hier stimmt etwas nicht mit Ihrem persönlichen Code"
  113. end
  114. if schueler.gewaehlt
  115. session[:flash] = [0, "Sie haben schon gewählt"]
  116. redirect back
  117. end
  118. sprecher, schuko, lehrer = params[:sprecher], params[:schuko], params[:lehrer]
  119. if sprecher && sprecher.count > 2
  120. session[:flash] = [0, "Zu viele Sprecher gewählt (max. 2)"]
  121. redirect back
  122. elsif schuko && schuko.count > 8
  123. session[:flash] = [0, "Zu viele Vertreter für die Schulkonferenz gewählt (max. 8)"]
  124. redirect back
  125. elsif lehrer && lehrer.count > 2
  126. session[:flash] = [0, "Zu viele Vertrauenslehrer gewählt (max. 2)"]
  127. redirect back
  128. end
  129. stimm_ids = []
  130. sprecher_ids, schuko_ids, lehrer_ids =[], [], []
  131. stimmabgabe = DB.transaction do
  132. sprecher && sprecher.to_set.each do |s|
  133. if Schueler[s].sprecher
  134. sprecher_ids << DB[:sprecher].insert(:sprecher_id => s)
  135. else
  136. raise Sequel::Rollback
  137. session[:flash] = [0, "Es wurde ein nichtaufgestellter Sprecher gewählt"]
  138. redirect back
  139. end
  140. end
  141. schuko && schuko.to_set.each do |s|
  142. if Schueler[s].schuko
  143. schuko_ids << DB[:schuko].insert(:schuko_id => s)
  144. else
  145. raise Sequel::Rollback
  146. session[:flash] = [0, "Es wurde ein nichtaufgestellter Vertreter zur Schulkonferenz gewählt"]
  147. redirect back
  148. end
  149. end
  150. lehrer && lehrer.to_set.each do |l|
  151. lehrer_ids << DB[:verbindungslehrer].insert(:lehrer_id => l)
  152. end
  153. schueler.update(:gewaehlt => true)
  154. end
  155. stimm_ids << sprecher_ids << schuko_ids << lehrer_ids
  156. stimm_hash = stimm_ids.map do |s_id|
  157. return "" if s_id.nil?
  158. hashids.encode s_id
  159. end
  160. if stimmabgabe
  161. session[:flash] = [1, "Ihre Wahl wurde gespeichert"]
  162. session[:stimm_hash] = stimm_hash.join("l")
  163. else
  164. session[:flash] = [0, "Es gab einen Fehler bei der Speicherung der Wahlergebnisse"]
  165. end
  166. redirect back
  167. end
  168. end