Skip to content

Commit d7c147f

Browse files
fix: Fix empty submisisons creation for team assessments (#1202)
* feat: Implement unique index for team-assessment in submissions * fix: Fix creation of empty submission for teams * chore: Negate the if statement * chore: Format * Let Elixir do its magic * fix: Duplicate team submissions being created --------- Co-authored-by: Richard Dominick <[email protected]>
1 parent 945db2c commit d7c147f

File tree

3 files changed

+44
-17
lines changed

3 files changed

+44
-17
lines changed

lib/cadet/assessments/submission.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ defmodule Cadet.Assessments.Submission do
4343
|> validate_xor_relationship
4444
|> validate_required(@required_fields)
4545
|> foreign_key_constraint(:student_id)
46+
|> foreign_key_constraint(:team_id)
4647
|> foreign_key_constraint(:assessment_id)
4748
|> foreign_key_constraint(:unsubmitted_by_id)
4849
end

lib/cadet/jobs/autograder/grading_job.ex

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -112,36 +112,54 @@ defmodule Cadet.Autograder.GradingJob do
112112
|> where([_, tm], tm.student_id == ^student_id)
113113
|> Repo.one()
114114

115-
if !team do
116-
# Student is not in any team
117-
# Create new team just for the student
118-
team =
119-
%Team{}
120-
|> Team.changeset(%{
121-
assessment_id: assessment.id
115+
team =
116+
if team do
117+
team
118+
else
119+
# Student is not in any team
120+
# Create new team just for the student
121+
team =
122+
%Team{}
123+
|> Team.changeset(%{
124+
assessment_id: assessment.id
125+
})
126+
|> Repo.insert!()
127+
128+
%TeamMember{}
129+
|> TeamMember.changeset(%{
130+
team_id: team.id,
131+
student_id: student_id
122132
})
123133
|> Repo.insert!()
124134

125-
%TeamMember{}
126-
|> TeamMember.changeset(%{
127-
team_id: team.id,
128-
student_id: student_id
129-
})
130-
|> Repo.insert!()
131-
end
135+
team
136+
end
132137

138+
find_or_create_team_submission(team.id, assessment)
139+
else
140+
# Individual assessment
133141
%Submission{}
134142
|> Submission.changeset(%{
135-
team_id: team.id,
143+
student_id: student_id,
136144
assessment: assessment,
137145
status: :submitted
138146
})
139147
|> Repo.insert!()
148+
end
149+
end
150+
151+
defp find_or_create_team_submission(team_id, assessment) when is_ecto_id(team_id) do
152+
submission =
153+
Submission
154+
|> where(team_id: ^team_id, assessment_id: ^assessment.id)
155+
|> Repo.one()
156+
157+
if submission do
158+
submission
140159
else
141-
# Individual assessment
142160
%Submission{}
143161
|> Submission.changeset(%{
144-
student_id: student_id,
162+
team_id: team_id,
145163
assessment: assessment,
146164
status: :submitted
147165
})
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
defmodule Cadet.Repo.Migrations.CreateTeamsSubmissionConstraint do
2+
use Ecto.Migration
3+
4+
def change do
5+
create(index(:submissions, :team_id))
6+
create(unique_index(:submissions, [:assessment_id, :team_id]))
7+
end
8+
end

0 commit comments

Comments
 (0)