| 
				
			 | 
			
			
				@@ -183,7 +183,42 @@ class Activity < ApplicationRecord 
			 | 
		
	
		
			
			| 
				183
			 | 
			
				183
			 | 
			
			
				     self.delay(run_at: self.reminder_at).send_reminder 
			 | 
		
	
		
			
			| 
				184
			 | 
			
				184
			 | 
			
			
				   end 
			 | 
		
	
		
			
			| 
				185
			 | 
			
				185
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				186
			 | 
			
			
				+  # Assign a subgroup to all attending participants without one. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				187
			 | 
			
			
				+  def assign_subgroups! 
			 | 
		
	
		
			
			| 
				
			 | 
			
				188
			 | 
			
			
				+    # Sanity check: we need subgroups to divide into. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				189
			 | 
			
			
				+    return unless self.subgroups.any? 
			 | 
		
	
		
			
			| 
				
			 | 
			
				190
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				191
			 | 
			
			
				+    # Get participants in random order 
			 | 
		
	
		
			
			| 
				
			 | 
			
				192
			 | 
			
			
				+    ps = self 
			 | 
		
	
		
			
			| 
				
			 | 
			
				193
			 | 
			
			
				+      .participants 
			 | 
		
	
		
			
			| 
				
			 | 
			
				194
			 | 
			
			
				+      .where(attending: true) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				195
			 | 
			
			
				+      .where(subgroup: nil) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				196
			 | 
			
			
				+      .to_a 
			 | 
		
	
		
			
			| 
				
			 | 
			
				197
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				198
			 | 
			
			
				+    ps.shuffle! 
			 | 
		
	
		
			
			| 
				
			 | 
			
				199
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				200
			 | 
			
			
				+    # Get groups, link to participant count 
			 | 
		
	
		
			
			| 
				
			 | 
			
				201
			 | 
			
			
				+    groups = self 
			 | 
		
	
		
			
			| 
				
			 | 
			
				202
			 | 
			
			
				+      .subgroups 
			 | 
		
	
		
			
			| 
				
			 | 
			
				203
			 | 
			
			
				+      .where(is_assignable: true) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				204
			 | 
			
			
				+      .to_a 
			 | 
		
	
		
			
			| 
				
			 | 
			
				205
			 | 
			
			
				+      .map { |sg| [sg.participants.count, sg] } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				206
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				207
			 | 
			
			
				+    ps.each do |p| 
			 | 
		
	
		
			
			| 
				
			 | 
			
				208
			 | 
			
			
				+      # Sort groups so the group with the least participants gets the following participant 
			 | 
		
	
		
			
			| 
				
			 | 
			
				209
			 | 
			
			
				+      groups.sort! 
			 | 
		
	
		
			
			| 
				
			 | 
			
				210
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				211
			 | 
			
			
				+      # Assign participant to group with least members 
			 | 
		
	
		
			
			| 
				
			 | 
			
				212
			 | 
			
			
				+      p.subgroup = groups.first.second 
			 | 
		
	
		
			
			| 
				
			 | 
			
				213
			 | 
			
			
				+      p.save 
			 | 
		
	
		
			
			| 
				
			 | 
			
				214
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				215
			 | 
			
			
				+      # Update the group's position in the list, will sort when next participant is processed. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				216
			 | 
			
			
				+      groups.first[0] += 1 
			 | 
		
	
		
			
			| 
				
			 | 
			
				217
			 | 
			
			
				+    end 
			 | 
		
	
		
			
			| 
				
			 | 
			
				218
			 | 
			
			
				+  end 
			 | 
		
	
		
			
			| 
				
			 | 
			
				219
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				186
			 | 
			
				220
			 | 
			
			
				   private 
			 | 
		
	
		
			
			| 
				
			 | 
			
				221
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				187
			 | 
			
				222
			 | 
			
			
				   # Assert that the deadline for participants to change the deadline, if any, 
			 | 
		
	
		
			
			| 
				188
			 | 
			
				223
			 | 
			
			
				   # is set before the event starts. 
			 | 
		
	
		
			
			| 
				189
			 | 
			
				224
			 | 
			
			
				   def deadline_before_start 
			 |