Sprankelprachtig aan/afmeldsysteem

activities_controller.rb 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. class ActivitiesController < ApplicationController
  2. include GroupsHelper
  3. include ActivitiesHelper
  4. before_action :set_activity_and_group, only: [:show, :edit, :update, :destroy, :presence, :change_organizer, :create_subgroup, :update_subgroup, :destroy_subgroup]
  5. before_action :set_group, except: [:show, :edit, :update, :destroy, :presence, :change_organizer, :create_subgroup, :update_subgroup, :destroy_subgroup]
  6. before_action :set_subgroup, only: [:update_subgroup, :destroy_subgroup]
  7. before_action :require_membership!
  8. before_action :require_leader!, only: [:mass_new, :mass_create, :new, :create, :destroy]
  9. before_action :require_organizer!, only: [:edit, :update, :change_organizer, :create_subgroup, :update_subgroup, :destroy_subgroup]
  10. # GET /groups/:id/activities
  11. # GET /activities.json
  12. def index
  13. @activities = @group.activities
  14. .where('start > ?', Time.now)
  15. .order(start: :asc)
  16. .paginate(page: params[:page], per_page: 25)
  17. end
  18. # GET /activities/1
  19. # GET /activities/1.json
  20. def show
  21. @participants = @activity.participants
  22. .joins(:person)
  23. .order(attending: :desc)
  24. .order('people.first_name ASC')
  25. @organizers = @activity.participants
  26. .joins(:person)
  27. .where(is_organizer: true)
  28. .order('people.first_name ASC')
  29. .map{|p| p.person.full_name}
  30. .join(', ')
  31. @ownparticipant = @activity.participants
  32. .find_by(person: current_person)
  33. @counts = @activity.state_counts
  34. @num_participants = @counts.values.sum
  35. @assignable_subgroups = @activity.subgroups
  36. .where(is_assignable: true)
  37. .order(name: :asc)
  38. .pluck(:name)
  39. @subgroup_ids = @activity.subgroups
  40. .order(name: :asc)
  41. .pluck(:name, :id)
  42. @subgroup_ids.prepend( ['*' , 'all'] )
  43. end
  44. # GET /activities/new
  45. def new
  46. @activity = Activity.new
  47. end
  48. # GET /activities/1/edit
  49. def edit
  50. set_edit_parameters!
  51. end
  52. # Shared lookups for rendering the edit-view
  53. def set_edit_parameters!
  54. @non_organizers = @activity.participants.where(is_organizer: [false, nil])
  55. @organizers = @activity.organizers
  56. @non_organizers_options = @non_organizers.map{|p| [p.person.full_name, p.id] }
  57. @organizers_options = @organizers.map{|p| [p.person.full_name, p.id] }
  58. @non_organizers_options.sort!
  59. @organizers_options.sort!
  60. @subgroup = Subgroup.new if !@subgroup
  61. @subgroups = @activity.subgroups.order(is_assignable: :desc, name: :asc)
  62. end
  63. # POST /activities
  64. # POST /activities.json
  65. def create
  66. @activity = Activity.new(activity_params)
  67. @activity.group = @group
  68. respond_to do |format|
  69. if @activity.save
  70. format.html {
  71. redirect_to group_activity_url(@group, @activity)
  72. flash_message(:info, I18n.t('activities.created'))
  73. }
  74. format.json { render :show, status: :created, location: @activity }
  75. else
  76. format.html { render :new }
  77. format.json { render json: @activity.errors, status: :unprocessable_entity }
  78. end
  79. end
  80. end
  81. # Change organizer state for a Participant
  82. def change_organizer
  83. @activity = Activity.find(params[:activity_id])
  84. @participant = @activity.participants.find(params[:participant_id])
  85. @participant.is_organizer = params[:new_state]
  86. @participant.save
  87. if params[:new_state] == "true"
  88. message = I18n.t('activities.organizers.added', name: @participant.person.full_name)
  89. else
  90. message = I18n.t('activities.organizers.removed', name: @participant.person.full_name)
  91. end
  92. flash_message(:success, message)
  93. redirect_to edit_group_activity_path(@group, @activity)
  94. end
  95. # PATCH/PUT /activities/1
  96. # PATCH/PUT /activities/1.json
  97. def update
  98. respond_to do |format|
  99. if @activity.update(activity_params)
  100. format.html {
  101. redirect_to group_activity_url(@group, @activity)
  102. flash_message(:info, I18n.t('activities.updated'))
  103. }
  104. format.json { render :show, status: :ok, location: @activity }
  105. else
  106. set_edit_parameters!
  107. format.html { render :edit }
  108. format.json { render json: @activity.errors, status: :unprocessable_entity }
  109. end
  110. end
  111. end
  112. # DELETE /activities/1
  113. # DELETE /activities/1.json
  114. def destroy
  115. @activity.destroy
  116. respond_to do |format|
  117. format.html {
  118. redirect_to group_activities_url(@group)
  119. flash_message(:info, 'Activity was successfully destroyed.')
  120. }
  121. format.json { head :no_content }
  122. end
  123. end
  124. # POST /activities/1/subgroups
  125. def create_subgroup
  126. @subgroup = Subgroup.new(subgroup_params)
  127. @subgroup.activity = @activity
  128. if @subgroup.save
  129. flash_message :success, I18n.t('activities.subgroups.created')
  130. redirect_to edit_group_activity_path(@group, @activity)
  131. else
  132. flash_message :danger, I18n.t('activities.subgroups.create_failed')
  133. set_edit_parameters!
  134. render :edit
  135. end
  136. end
  137. # PATCH /activities/1/subgroups/:subgroup_id
  138. def update_subgroup
  139. if @subgroup.update(subgroup_params)
  140. flash_message :success, I18n.t('activities.subgroups.updated')
  141. redirect_to edit_group_activity_path(@group, @activity)
  142. else
  143. flash_message :danger, I18n.t('activities.subgroups.update_failed')
  144. set_edit_parameters!
  145. render :edit
  146. end
  147. end
  148. # DELETE /activities/1/subgroups/:subgroup_id
  149. def destroy_subgroup
  150. @subgroup.destroy
  151. flash_message :success, I18n.t('activities.subgroups.destroyed')
  152. redirect_to edit_group_activity_path(@group, @activity)
  153. end
  154. # PATCH/PUT /groups/:group_id/activities/:id/presence
  155. # PATCH/PUT /groups/:group_id/activities/:id/presence.json
  156. def presence
  157. participant = Participant.find_by(
  158. person_id: params[:person_id],
  159. activity: @activity
  160. )
  161. if params[:person_id].to_i != current_person.id && !@activity.may_change?(current_person)
  162. head :forbidden
  163. return
  164. end
  165. if @activity.deadline && @activity.deadline < Time.now && !@activity.may_change?(current_person)
  166. head :locked
  167. return
  168. end
  169. if params[:participant]
  170. params[:notes] = params[:participant][:notes]
  171. end
  172. participant.update_attributes(params.permit(:notes, :attending))
  173. head :no_content
  174. end
  175. def mass_new
  176. end
  177. def mass_create
  178. require 'csv'
  179. uploaded_io = params[:spreadsheet]
  180. result = Activity.from_csv(uploaded_io.read, @group)
  181. result.each do |a|
  182. a.save!
  183. end
  184. flash_message(:success, I18n.t('activities.mass_imported', count: result.count))
  185. redirect_to group_activities_path(@group)
  186. end
  187. private
  188. # The Activity's group takes precedence over whatever's in the URL, set_group not required (and can be mislead)
  189. def set_activity_and_group
  190. @activity = Activity.find(params[:id] || params[:activity_id])
  191. @group = @activity.group
  192. end
  193. def set_group
  194. @group = Group.find(params[:group_id])
  195. end
  196. def set_subgroup
  197. @subgroup = Subgroup.find(params[:subgroup_id])
  198. end
  199. # Never trust parameters from the scary internet, only allow the white list through.
  200. def activity_params
  201. params.require(:activity).permit(:name, :description, :location, :start, :end, :deadline, :reminder_at)
  202. end
  203. def subgroup_params
  204. params.require(:subgroup).permit(:name, :is_assignable)
  205. end
  206. end