Files
codeocean/app/models/programming_group.rb
Sebastian Serth be4f2b790d Add user to testrun
* We want to identify a user that has triggered a testrun. Previously (in regular operation), only submission author who were regular users were able to start a testrun. Now, we want to prepare a future where submission authors are programming groups. Still, a testrun is triggered by an individual user and not a group.
* Further, this commit fixes some missing foreign key constrains.
2023-08-24 19:32:06 +02:00

84 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class ProgrammingGroup < ApplicationRecord
include Contributor
has_many :programming_group_memberships, dependent: :destroy
has_many :external_users, through: :programming_group_memberships, source_type: 'ExternalUser', source: :user
has_many :internal_users, through: :programming_group_memberships, source_type: 'InternalUser', source: :user
has_many :testruns, through: :submissions
belongs_to :exercise
validate :group_size
validate :no_erroneous_users
accepts_nested_attributes_for :programming_group_memberships
def initialize(attributes = nil)
@erroneous_users = []
super
end
def external_user?
false
end
def internal_user?
false
end
def self.nested_resource?
true
end
def programming_group?
true
end
def add(user)
# Accessing the `users` method here will preload all users, which is otherwise done during validation.
internal_users << user if user.internal_user? && users.exclude?(user)
external_users << user if user.external_user? && users.exclude?(user)
user
end
def to_s
displayname
end
def displayname
"Programming Group #{id}"
end
def programming_partner_ids
users.map(&:id_with_type)
end
def users
internal_users + external_users
end
def users=(users)
self.internal_users = []
self.external_users = []
users.each do |user|
next @erroneous_users << user unless user.is_a?(User)
add(user)
end
end
private
def group_size
if users.size < 2
errors.add(:base, :size_too_small)
end
end
def no_erroneous_users
@erroneous_users.each do |partner_id|
errors.add(:base, :invalid_partner_id, partner_id:)
end
end
end