/
pennScheduleBuilder.py
172 lines (124 loc) · 4.66 KB
/
pennScheduleBuilder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from penn.registrar import Registrar
import json
import os
# import penncoursereview
import jsonCourseParser as CourseParser
import courseComparator
import pdb
class ScheduleBuilder(object):
def __init__(self):
self.registrar = Registrar('UPENN_OD_emFc_1001364', '6kl4eonkquheuti65e32qick6l')
os.environ['PCR_AUTH_TOKEN']='kdutFhMEbUaKdvQbcRKszEiwZeThFs'
def set_requirements(self, reqs):
if reqs == None or len(reqs) == 0:
return 'Must have at least one requirement'
total_credits = 0
for req in reqs:
total_credits = total_credits + reqs[req]
if total_credits > 6.5:
return 'Why the fuck are you taking more than six and a half classes, go outside'
self.req_numbers = reqs
return True
def find_all_courses(self, req_type, course_level_above=None, course_level_below=None, starts_after=None):
# First enter default params for all courses
print "Finding classes with params: "
search_params = {}
search_params['fulfills_requirement'] = req_type
search_params['term'] = '2015C'
search_params['status'] = 'O'
search_params['is_cancelled'] = False
# if course_level_above is not None:
# search_params['course_level_above'] = course_level_above
# if course_level_below is not None:
# search_params['course_level_below'] = course_level_below
# if starts_after is not None:
# search_params['starts_at_or_after_hour'] = starts_after
all_courses = self.registrar.search(search_params)
print "request finished"
return all_courses
# def add_ratings(courses):
# for course in courses:
# course_info = penncoursereview(CourseParser.get_course_department(course), CourseParser.get_course_number(course), \
# CourseParser.get_section(course))
# difficulty_rating = course_info./
def enter_preferences(self, starts_after=None, ends_before=None, no_class_days=None, difficulty_limit=None, work_limit=None, lunch_break=None):
self.all_valid_courses = []
for req in self.req_numbers:
print req
self.all_valid_courses = self.all_valid_courses + self.generator_to_list(self.find_all_courses(req, starts_after=starts_after))
print "No class days"
if no_class_days is not None:
print 'befroe'
no_class_days = CourseParser.convert_to_ascii(no_class_days)
print "middle"
print self.all_valid_courses
self.all_valid_courses = self.filter_course_days(self.all_valid_courses, no_class_days)
print "after"
self.all_valid_courses.sort(self.cmp_course)
print 'double smeag'
return True
def cmp_course(self, course1, course2):
if len(course1['meetings']) == 0 and len(course2['meetings']):
return 0
elif len(course1['meetings']) == 0:
return 1
elif len(course2['meetings']) == 0:
return -1
start_time1 = course1['meetings'][0]['start_time_24']
start_time2 = course2['meetings'][0]['start_time_24']
if start_time1 < start_time2:
return -1
elif start_time2 < start_time1:
return 1
else:
return 0
def filter_course_days(self, courses, no_class_days):
correct_courses = list()
for i, course in enumerate(courses):
if courseComparator.course_meets_on_days(course, no_class_days):
continue
else:
correct_courses.append(course)
return correct_courses
def find_schedule(self):
result = self.find_schedule_recurse(self.all_valid_courses, self.req_numbers, [])
return result
def find_schedule_recurse(self, all_courses, req_numbers, selected_classes):
if self.total_reqs_remaining(req_numbers) == 0:
return selected_classes
elif len(all_courses) == 0:
return False
for i in range(0, len(all_courses) - 1):
print i
course_to_add = all_courses[i]
# if course is not needed in requirements
all_course_reqs = CourseParser.get_requirements(course_to_add)
fulfills_requirement = False
for req in all_course_reqs:
if req in req_numbers.keys() and req_numbers[req] > 0:
fulfills_requirement = True
break
if not fulfills_requirement:
print 'doesnt fulfill req'
continue
print 'ADDING COURSE'
selected_classes.append(course_to_add)
courses_after_selected = all_courses[i:]
all_courses = courseComparator.filter_out_courses_that_overlap(course_to_add, courses_after_selected)
for req in all_course_reqs:
if req in req_numbers.keys() and req_numbers[req] > 0:
req_numbers[req] = req_numbers[req] - 1
break
return self.find_schedule_recurse(courses_after_selected, req_numbers, selected_classes)
def total_reqs_remaining(self, req_numbers):
total = 0
for req in req_numbers:
total = total + req_numbers[req]
return total
def generator_to_list(self, generator):
all_courses_list = []
num = 0
for item in generator:
all_courses_list.append(item)
num = num + 1
return all_courses_list