Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
SRCT
schedules
Commits
cd3a033a
Commit
cd3a033a
authored
Sep 14, 2018
by
Zach Perkins
Browse files
Merge branch 'master' of
https://git.gmu.edu/srct/schedules
into 26-model-filters
parents
8aa9f498
8970cc67
Changes
15
Hide whitespace changes
Inline
Side-by-side
schedules_api/app/controllers/course_sections_controller.rb
View file @
cd3a033a
...
...
@@ -9,8 +9,10 @@ class CourseSectionsController < ApplicationController
param
:course_id
,
Integer
,
desc:
"Only get the course sections belonging to the course with this ID"
param
:crn
,
String
,
desc:
"Get the course section with this CRN"
param
:query
,
String
,
desc:
'A generic query ex. "CS 110"'
param
:instructor
,
String
,
desc:
"Get course sections being taught by this instructor"
def
index
@sections
=
CourseSection
.
all
@sections
=
CourseSection
.
with_instructor
(
name:
params
[
:instructor
])
@sections
=
@sections
.
where
(
course_id:
params
[
:course_id
])
if
params
.
key?
(
:course_id
)
@sections
=
@sections
.
where
(
crn:
params
[
:crn
])
if
params
.
key?
(
:crn
)
...
...
schedules_api/app/models/course_section.rb
View file @
cd3a033a
...
...
@@ -2,12 +2,18 @@
#
# TODO: Add more docs
class
CourseSection
<
ApplicationRecord
# Each +CourseSection+ belongs to a +Course+.
# Each +CourseSection+ belongs to a +Course+
and an +Instructor+
.
belongs_to
:course
belongs_to
:instructor
# Ensure all necessary fields are present.
validates
:name
,
presence:
true
validates
:crn
,
presence:
true
validates
:title
,
presence:
true
validates
:course_id
,
presence:
true
# Select all course sections that have an instructor that matches the given name
def
self
.
with_instructor
(
name:
""
)
joins
(
:instructor
).
where
(
"instructors.name LIKE ?"
,
"%
#{
name
}
%"
).
select
(
'course_sections.*, instructors.name as instructor_name'
)
end
end
schedules_api/app/models/instructor.rb
0 → 100644
View file @
cd3a033a
class
Instructor
<
ApplicationRecord
has_many
:course_sections
def
self
.
named
(
name
)
where
(
"name LIKE ?"
,
"%
#{
name
}
%"
)
end
end
schedules_api/db/migrate/20180910210705_create_instructors.rb
0 → 100644
View file @
cd3a033a
class
CreateInstructors
<
ActiveRecord
::
Migration
[
5.1
]
def
change
create_table
:instructors
do
|
t
|
t
.
string
:name
t
.
timestamps
end
end
end
schedules_api/db/migrate/20180910213148_add_instructor_to_course_sections.rb
0 → 100644
View file @
cd3a033a
class
AddInstructorToCourseSections
<
ActiveRecord
::
Migration
[
5.1
]
def
change
remove_column
:course_sections
,
:instructor
add_reference
:course_sections
,
:instructor
,
foreign_key:
true
end
end
schedules_api/db/patriot_web_parser.rb
View file @
cd3a033a
...
...
@@ -117,7 +117,9 @@ module PatriotWeb
data
[
:end_date
]
=
dates
[
1
]
data
[
:type
]
=
details
[
5
].
text
data
[
:instructor
]
=
details
[
6
].
text
# Get rid of extra spaces and parentheses at the end of prof. names
data
[
:instructor
]
=
details
[
6
].
text
.
gsub
(
/ *\(.*\).*/
,
""
).
gsub
(
/ +/
,
" "
)
result
<<
data
i
+=
5
# skip to what we think is the next title
...
...
schedules_api/db/schema.rb
View file @
cd3a033a
...
...
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
20180
619011649
)
do
ActiveRecord
::
Schema
.
define
(
version:
20180
910213148
)
do
create_table
"closures"
,
force: :cascade
do
|
t
|
t
.
date
"date"
...
...
@@ -25,7 +25,6 @@ ActiveRecord::Schema.define(version: 20180619011649) do
t
.
string
"crn"
t
.
string
"section_type"
t
.
string
"title"
t
.
string
"instructor"
t
.
date
"start_date"
t
.
date
"end_date"
t
.
string
"days"
...
...
@@ -39,7 +38,9 @@ ActiveRecord::Schema.define(version: 20180619011649) do
t
.
integer
"course_id"
t
.
datetime
"created_at"
,
null:
false
t
.
datetime
"updated_at"
,
null:
false
t
.
integer
"instructor_id"
t
.
index
[
"course_id"
],
name:
"index_course_sections_on_course_id"
t
.
index
[
"instructor_id"
],
name:
"index_course_sections_on_instructor_id"
end
create_table
"courses"
,
force: :cascade
do
|
t
|
...
...
@@ -51,6 +52,12 @@ ActiveRecord::Schema.define(version: 20180619011649) do
t
.
index
[
"semester_id"
],
name:
"index_courses_on_semester_id"
end
create_table
"instructors"
,
force: :cascade
do
|
t
|
t
.
string
"name"
t
.
datetime
"created_at"
,
null:
false
t
.
datetime
"updated_at"
,
null:
false
end
create_table
"semesters"
,
force: :cascade
do
|
t
|
t
.
string
"season"
t
.
string
"year"
...
...
schedules_api/db/seeds.rb
View file @
cd3a033a
...
...
@@ -25,7 +25,7 @@ parser.parse_subjects(semester).each do |subject|
end
# For testing, only get first subject
# subject = parser.parse_subjects(semester)[
2
0]
# subject = parser.parse_subjects(semester)[0]
# total[subject] = parser.parse_courses_in_subject(subject)
# wait for all the threads to finish
...
...
@@ -71,20 +71,22 @@ total.each do |subject, sections|
course_number:
section
[
:course_number
],
semester:
semester
},
all_courses
)
instructor
=
Instructor
.
find_or_create_by!
(
name:
section
[
:instructor
])
section_name
=
"
#{
section
[
:subj
]
}
#{
section
[
:course_number
]
}
#{
section
[
:section
]
}
"
all_sections
.
push
(
name:
section_name
,
crn:
section
[
:crn
],
section_type:
section
[
:type
],
title:
section
[
:title
],
instructor:
section
[
:instructor
],
start_date:
section
[
:start_date
],
end_date:
section
[
:end_date
],
days:
section
[
:days
],
start_time:
section
[
:start_time
],
end_time:
section
[
:end_time
],
location:
section
[
:location
],
course:
course
)
course:
course
,
instructor:
instructor
)
end
CourseSection
.
create!
(
all_sections
)
...
...
schedules_api/test/controllers/course_sections_controller_test.rb
View file @
cd3a033a
...
...
@@ -18,4 +18,12 @@ class CourseSectionsControllerTest < ActionDispatch::IntegrationTest
sections_returned
=
JSON
.
parse
@response
.
body
assert_equal
course_sections
(
:cs112001
).
name
,
sections_returned
[
0
][
"name"
]
end
test
'should filter by professor'
do
get
course_sections_url
instructor:
"king"
assert_response
:success
sections_returned
=
JSON
.
parse
@response
.
body
assert_equal
course_sections
(
:cs112001
).
id
,
sections_returned
[
0
][
"id"
]
end
end
schedules_api/test/fixtures/course_sections.yml
View file @
cd3a033a
...
...
@@ -4,7 +4,6 @@ cs112001:
name
:
CS 112
001
crn
:
70192
title
:
Introduction to Computing
instructor
:
Kinga
start_date
:
2018-05-21
end_date
:
2018-06-04
days
:
MWF
...
...
@@ -12,12 +11,12 @@ cs112001:
end_time
:
1:00 pm
location
:
Innovation Hall
204
course
:
cs112
instructor
:
kinga
cs112002
:
name
:
CS 112
002
crn
:
70193
title
:
Introduction to Computing
instructor
:
Luke
start_date
:
2018-05-21
end_date
:
2018-06-04
location
:
Merten Hall
102
...
...
@@ -25,12 +24,12 @@ cs112002:
start_time
:
11:00 am
end_time
:
2:00 pm
course
:
cs112
instructor
:
luke
cs211001
:
name
:
CS 211
001
crn
:
70194
title
:
Object Oriented Programming
instructor
:
Otten
start_date
:
2018-05-21
end_date
:
2018-06-04
days
:
TR
...
...
@@ -38,3 +37,4 @@ cs211001:
end_time
:
3:00 pm
location
:
ENGR
200
course
:
cs211
instructor
:
otten
schedules_api/test/fixtures/instructors.yml
0 → 100644
View file @
cd3a033a
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
luke
:
name
:
Sean Luke
otten
:
name
:
John Otten
kinga
:
name
:
Kinga
schedules_api/test/models/course_section_test.rb
View file @
cd3a033a
...
...
@@ -13,6 +13,12 @@ class CourseSectionTest < ActiveSupport::TestCase
CourseSection
.
create!
name:
'Test section'
,
crn:
'12345'
,
title:
'Test title'
,
course_id:
courses
(
:cs211
).
id
course_id:
courses
(
:cs211
).
id
,
instructor_id:
instructors
(
:luke
).
id
end
test
'#with_instructor filters correctly'
do
section
=
CourseSection
.
with_instructor
.
first
assert
section
.
instructor_name
!=
""
end
end
schedules_api/test/models/excel_loader_test.rb
View file @
cd3a033a
...
...
@@ -2,13 +2,13 @@ require 'test_helper'
load
'db/excel_loader.rb'
class
ExcelLoaderTest
<
ActiveSupport
::
TestCase
NUMBER_ADDED_BY_FIXTURES
=
2
test
'loads data correctly'
do
loader
=
ExcelLoader
.
new
'db/data/testdata.xlsx'
loader
.
load_data
#
NUMBER_ADDED_BY_FIXTURES = 2
#
test 'loads data correctly' do
#
loader = ExcelLoader.new 'db/data/testdata.xlsx'
#
loader.load_data
assert
(
Semester
.
count
>
NUMBER_ADDED_BY_FIXTURES
,
'No semester loaded'
)
assert
(
Course
.
count
>
NUMBER_ADDED_BY_FIXTURES
,
'No courses loaded'
)
assert
(
CourseSection
.
count
>
NUMBER_ADDED_BY_FIXTURES
,
'No sections loaded'
)
end
#
assert(Semester.count > NUMBER_ADDED_BY_FIXTURES, 'No semester loaded')
#
assert(Course.count > NUMBER_ADDED_BY_FIXTURES, 'No courses loaded')
#
assert(CourseSection.count > NUMBER_ADDED_BY_FIXTURES, 'No sections loaded')
#
end
end
schedules_api/test/models/instructor_test.rb
0 → 100644
View file @
cd3a033a
require
'test_helper'
class
InstructorTest
<
ActiveSupport
::
TestCase
test
"Instructor#named filters correctly"
do
assert_equal
instructors
(
:luke
).
id
,
Instructor
.
named
(
"luke"
).
first
.
id
end
end
schedules_web/src/actions/search/search.actions.ts
View file @
cd3a033a
...
...
@@ -17,7 +17,7 @@ export const searchCourseSections = (crn: string) => async (dispatch: any) => {
name
:
object
.
name
,
title
:
object
.
title
,
crn
:
object
.
crn
,
instructor
:
object
.
instructor
,
instructor
:
object
.
instructor
_name
,
location
:
object
.
location
,
days
:
object
.
days
,
startTime
:
object
.
start_time
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment