Sprankelprachtig aan/afmeldsysteem

activities_controller.rb 11KB

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