Sprankelprachtig aan/afmeldsysteem

activities_controller.rb 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. class ActivitiesController < ApplicationController
  2. include GroupsHelper
  3. include ActivitiesHelper
  4. has_activity_id = [
  5. :show, :edit, :edit_subgroups, :update, :update_subgroups, :destroy,
  6. :presence, :change_organizer, :create_subgroup, :update_subgroup,
  7. :destroy_subgroup
  8. ]
  9. before_action :set_activity_and_group, only: has_activity_id
  10. before_action :set_group, except: has_activity_id
  11. before_action :set_subgroup, only: [:update_subgroup, :destroy_subgroup]
  12. before_action :require_membership!
  13. before_action :require_leader!, only: [
  14. :mass_new, :mass_create, :new, :create, :destroy
  15. ]
  16. before_action :require_organizer!, only: [
  17. :edit, :update, :change_organizer, :create_subgroup, :update_subgroup,
  18. :destroy_subgroup, :edit_subgroups, :update_subgroups
  19. ]
  20. # GET /groups/:id/activities
  21. # GET /activities.json
  22. def index
  23. @activities = @group.activities
  24. .where('start > ?', Time.now)
  25. .order(start: :asc)
  26. .paginate(page: params[:page], per_page: 25)
  27. end
  28. # GET /activities/1
  29. # GET /activities/1.json
  30. def show
  31. @participants = @activity.participants
  32. .joins(:person)
  33. .order(attending: :desc)
  34. .order('people.first_name ASC')
  35. @organizers = @activity.participants
  36. .joins(:person)
  37. .where(is_organizer: true)
  38. .order('people.first_name ASC')
  39. .map{|p| p.person.full_name}
  40. .join(', ')
  41. @ownparticipant = @activity.participants
  42. .find_by(person: current_person)
  43. @counts = @activity.state_counts
  44. @num_participants = @counts.values.sum
  45. @assignable_subgroups = @activity.subgroups
  46. .where(is_assignable: true)
  47. .order(name: :asc)
  48. .pluck(:name)
  49. @subgroup_ids = @activity.subgroups
  50. .order(name: :asc)
  51. .pluck(:name, :id)
  52. @subgroup_ids.prepend( ['*' , 'all'] )
  53. end
  54. # GET /activities/new
  55. def new
  56. @activity = Activity.new
  57. end
  58. # GET /activities/1/edit
  59. def edit
  60. set_edit_parameters!
  61. end
  62. # GET /activities/1/edit_subgroups
  63. def edit_subgroups
  64. @subgroups = @activity.subgroups.order(is_assignable: :desc, name: :asc)
  65. if @subgroups.none?
  66. flash_message(:error, I18n.t('activities.errors.cannot_subgroup_without_subgroups'))
  67. redirect_to group_activity_edit(@group, @activity)
  68. end
  69. @subgroup_options = @subgroups.map { |sg| [sg.name, sg.id] }
  70. @subgroup_options.prepend(['--', 'nil'])
  71. @participants = @activity.participants
  72. .joins(:person)
  73. .where.not(attending: false)
  74. .order(:subgroup_id)
  75. .order('people.first_name', 'people.last_name')
  76. end
  77. # POST /activities/1/update_subgroups
  78. def update_subgroups
  79. # TODO:
  80. # voor elke key in participant_subgroups
  81. # pak participant, subgroup
  82. # verifieer participant hoort bij activiteit
  83. # verifieer subgroup hoort bij activiteit
  84. # (impl dat editen mogen al gecheckt is, check of dit zo is!)
  85. # doe veranderen
  86. # knikker alles in een transactie want dan atomisch enzo cool en leuk
  87. # S: on error netjes bleren maar wat er mis kan gaan is bijna alleen gekut dus meh
  88. kappen = false
  89. Participant.transaction do
  90. params[:participant_subgroups].each do |k, v|
  91. p = Participant.find_by id: k
  92. sg = Subgroup.find_by id: v unless v == 'nil'
  93. if !p || p.activity != @activity || (!sg && v != 'nil') || (sg && sg.activity != @activity)
  94. flash_message(:danger, I18n.t(:somethingbroke))
  95. redirect_to group_activity_edit_subgroups_path(@group, @activity)
  96. kappen = true
  97. raise ActiveRecord::Rollback
  98. end
  99. if v != 'nil'
  100. p.subgroup = sg
  101. else
  102. p.subgroup = nil
  103. end
  104. p.save
  105. end
  106. end
  107. unless kappen
  108. flash_message(:success, I18n.t('activities.subgroups.edited'))
  109. redirect_to edit_group_activity_path(@group, @activity)
  110. end
  111. end
  112. # Shared lookups for rendering the edit-view
  113. def set_edit_parameters!
  114. @non_organizers = @activity.participants.where(is_organizer: [false, nil])
  115. @organizers = @activity.organizers
  116. @non_organizers_options = @non_organizers.map{|p| [p.person.full_name, p.id] }
  117. @organizers_options = @organizers.map{|p| [p.person.full_name, p.id] }
  118. @non_organizers_options.sort!
  119. @organizers_options.sort!
  120. @subgroup = Subgroup.new if !@subgroup
  121. @subgroups = @activity.subgroups.order(is_assignable: :desc, name: :asc)
  122. end
  123. # POST /activities
  124. # POST /activities.json
  125. def create
  126. @activity = Activity.new(activity_params)
  127. @activity.group = @group
  128. respond_to do |format|
  129. if @activity.save
  130. format.html {
  131. redirect_to group_activity_url(@group, @activity)
  132. flash_message(:info, I18n.t('activities.created'))
  133. }
  134. format.json { render :show, status: :created, location: @activity }
  135. else
  136. format.html { render :new }
  137. format.json { render json: @activity.errors, status: :unprocessable_entity }
  138. end
  139. end
  140. end
  141. # Change organizer state for a Participant
  142. def change_organizer
  143. @activity = Activity.find(params[:activity_id])
  144. @participant = @activity.participants.find(params[:participant_id])
  145. @participant.is_organizer = params[:new_state]
  146. @participant.save
  147. if params[:new_state] == "true"
  148. message = I18n.t('activities.organizers.added', name: @participant.person.full_name)
  149. else
  150. message = I18n.t('activities.organizers.removed', name: @participant.person.full_name)
  151. end
  152. flash_message(:success, message)
  153. redirect_to edit_group_activity_path(@group, @activity)
  154. end
  155. # PATCH/PUT /activities/1
  156. # PATCH/PUT /activities/1.json
  157. def update
  158. respond_to do |format|
  159. if @activity.update(activity_params)
  160. format.html {
  161. redirect_to group_activity_url(@group, @activity)
  162. flash_message(:info, I18n.t('activities.updated'))
  163. }
  164. format.json { render :show, status: :ok, location: @activity }
  165. else
  166. set_edit_parameters!
  167. format.html { render :edit }
  168. format.json { render json: @activity.errors, status: :unprocessable_entity }
  169. end
  170. end
  171. end
  172. # DELETE /activities/1
  173. # DELETE /activities/1.json
  174. def destroy
  175. @activity.destroy
  176. respond_to do |format|
  177. format.html {
  178. redirect_to group_activities_url(@group)
  179. flash_message(:info, 'Activity was successfully destroyed.')
  180. }
  181. format.json { head :no_content }
  182. end
  183. end
  184. # POST /activities/1/subgroups
  185. def create_subgroup
  186. @subgroup = Subgroup.new(subgroup_params)
  187. @subgroup.activity = @activity
  188. if @subgroup.save
  189. flash_message :success, I18n.t('activities.subgroups.created')
  190. redirect_to edit_group_activity_path(@group, @activity)
  191. else
  192. flash_message :danger, I18n.t('activities.subgroups.create_failed')
  193. set_edit_parameters!
  194. render :edit
  195. end
  196. end
  197. # PATCH /activities/1/subgroups/:subgroup_id
  198. def update_subgroup
  199. if @subgroup.update(subgroup_params)
  200. flash_message :success, I18n.t('activities.subgroups.updated')
  201. redirect_to edit_group_activity_path(@group, @activity)
  202. else
  203. flash_message :danger, I18n.t('activities.subgroups.update_failed')
  204. set_edit_parameters!
  205. render :edit
  206. end
  207. end
  208. # DELETE /activities/1/subgroups/:subgroup_id
  209. def destroy_subgroup
  210. @subgroup.destroy
  211. flash_message :success, I18n.t('activities.subgroups.destroyed')
  212. redirect_to edit_group_activity_path(@group, @activity)
  213. end
  214. # PATCH/PUT /groups/:group_id/activities/:id/presence
  215. # PATCH/PUT /groups/:group_id/activities/:id/presence.json
  216. def presence
  217. participant = Participant.find_by(
  218. person_id: params[:person_id],
  219. activity: @activity
  220. )
  221. if params[:person_id].to_i != current_person.id && !@activity.may_change?(current_person)
  222. head :forbidden
  223. return
  224. end
  225. if @activity.deadline && @activity.deadline < Time.now && !@activity.may_change?(current_person)
  226. head :locked
  227. return
  228. end
  229. if params[:participant]
  230. params[:notes] = params[:participant][:notes]
  231. end
  232. participant.update_attributes(params.permit(:notes, :attending))
  233. head :no_content
  234. end
  235. def mass_new
  236. end
  237. def mass_create
  238. require 'csv'
  239. uploaded_io = params[:spreadsheet]
  240. result = Activity.from_csv(uploaded_io.read, @group)
  241. result.each do |a|
  242. a.save!
  243. end
  244. flash_message(:success, I18n.t('activities.mass_imported', count: result.count))
  245. redirect_to group_activities_path(@group)
  246. end
  247. private
  248. # The Activity's group takes precedence over whatever's in the URL, set_group not required (and can be mislead)
  249. def set_activity_and_group
  250. @activity = Activity.find(params[:id] || params[:activity_id])
  251. @group = @activity.group
  252. end
  253. def set_group
  254. @group = Group.find(params[:group_id])
  255. end
  256. def set_subgroup
  257. @subgroup = Subgroup.find(params[:subgroup_id])
  258. end
  259. # Never trust parameters from the scary internet, only allow the white list through.
  260. def activity_params
  261. params.require(:activity).permit(:name, :description, :location, :start, :end, :deadline, :reminder_at, :subgroup_division_enabled)
  262. end
  263. def subgroup_params
  264. params.require(:subgroup).permit(:name, :is_assignable)
  265. end
  266. end