Skip to content

Commit 02be4f3

Browse files
Add class code to the school class model (#521)
closes #518 --------- Co-authored-by: create-issue-branch[bot] <53036503+create-issue-branch[bot]@users.noreply.github.com> Co-authored-by: Lois Wells <[email protected]> Co-authored-by: Lois Wells <[email protected]>
1 parent 21602cc commit 02be4f3

13 files changed

+135
-9
lines changed

app/models/school.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def rejected?
5454
def verify!
5555
attempts = 0
5656
begin
57-
update!(verified_at: Time.zone.now, code: SchoolCodeGenerator.generate)
57+
update!(verified_at: Time.zone.now, code: ForEducationCodeGenerator.generate)
5858
rescue ActiveRecord::RecordInvalid => e
5959
raise unless e.record.errors[:code].include?('has already been taken') && attempts <= 5
6060

app/models/school_class.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ class SchoolClass < ApplicationRecord
99

1010
scope :with_teachers, ->(user_id) { joins(:teachers).where(teachers: { id: user_id }) }
1111

12+
before_validation :assign_class_code, on: :create
13+
1214
validates :name, presence: true
15+
validates :code, uniqueness: { scope: :school_id }, presence: true, format: { with: /\d\d-\d\d-\d\d/, allow_nil: false }
16+
validate :code_cannot_be_changed
1317
validate :school_class_has_at_least_one_teacher
1418

1519
has_paper_trail(
@@ -36,11 +40,30 @@ def with_teachers
3640
[self, User.from_userinfo(ids: teacher_ids)]
3741
end
3842

43+
def assign_class_code
44+
return if code.present?
45+
46+
5.times do
47+
self.code = ForEducationCodeGenerator.generate
48+
return if code_is_unique_within_school
49+
end
50+
51+
errors.add(:code, 'could not be generated')
52+
end
53+
3954
private
4055

4156
def school_class_has_at_least_one_teacher
4257
return if teachers.present?
4358

4459
errors.add(:teachers, 'must have at least one teacher')
4560
end
61+
62+
def code_cannot_be_changed
63+
errors.add(:code, 'cannot be changed after verification') if code_was.present? && code_changed?
64+
end
65+
66+
def code_is_unique_within_school
67+
code.present? && SchoolClass.where(code:, school:).none?
68+
end
4669
end

app/views/api/school_classes/show.json.jbuilder

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ json.call(
88
:description,
99
:school_id,
1010
:name,
11+
:code,
1112
:created_at,
1213
:updated_at
1314
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class AddSchoolClassCode < ActiveRecord::Migration[7.1]
2+
def change
3+
add_column :school_classes, :code, :string
4+
add_index :school_classes, [:code, :school_id], unique: true
5+
end
6+
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class AssignCodeToExistingClasses < ActiveRecord::Migration[7.1]
2+
def up
3+
SchoolClass.find_each do |school_class|
4+
school_class.assign_class_code
5+
school_class.save!
6+
end
7+
end
8+
9+
def down
10+
SchoolClass.update_all(code: nil)
11+
end
12+
end

db/schema.rb

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/school_code_generator.rb renamed to lib/for_education_code_generator.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# frozen_string_literal: true
22

3-
class SchoolCodeGenerator
3+
class ForEducationCodeGenerator
44
MAX_CODE = 1_000_000
55

66
def self.generate

spec/factories/school.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414

1515
factory :verified_school, parent: :school do
1616
verified_at { Time.current }
17-
code { SchoolCodeGenerator.generate }
17+
code { ForEducationCodeGenerator.generate }
1818
end
1919
end

spec/factories/school_class.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
FactoryBot.define do
44
factory :school_class do
55
sequence(:name) { |n| "Class #{n}" }
6+
code { ForEducationCodeGenerator.generate }
67

78
transient do
89
teacher_ids { [SecureRandom.uuid] }

spec/features/school_class/showing_a_school_class_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@
4242
expect(data[:name]).to eq('Test School Class')
4343
end
4444

45+
it 'includes the school class code in the response' do
46+
get("/api/schools/#{school.id}/classes/#{school_class.id}", headers:)
47+
data = JSON.parse(response.body, symbolize_names: true)
48+
49+
expect(data[:code]).to eq(school_class.code)
50+
end
51+
4552
it 'responds with the teacher JSON' do
4653
get("/api/schools/#{school.id}/classes/#{school_class.id}", headers:)
4754
data = JSON.parse(response.body, symbolize_names: true)

0 commit comments

Comments
 (0)