Sprankelprachtig aan/afmeldsysteem

activities_controller.rb 9.9KB

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