/
main.py
executable file
·124 lines (103 loc) · 3.86 KB
/
main.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
#!/usr/bin/env python
import logging
import json
import webapp2
import courses
import misc
DEBUG = False
subCodeToClasses = None
year = None
season = None
if DEBUG:
try:
logging.info('loading classes')
subCodeToClasses = json.loads(open('classes').read())
logging.info('done')
year = 2012
season = 'fall'
except IOError:
pass
def parseJSTime(t):
time, ampm = t.split()
hr, m = time.split(':')
hr, m = int(hr), int(m)
if ampm == 'PM' and hr < 12:
hr += 12
return (hr, m)
def parseJSInterval(times, dayBools):
days = [i for i in xrange(len(dayBools)) if dayBools[i]]
startTime, endTime = [parseJSTime(t) for t in times]
return [(day,) + startTime + endTime for day in days]
class Update(webapp2.RequestHandler):
def get(self):
global subCodeToClasses
global year
global season
year, season = courses.getCurYearSeason()
subCodes = courses.getSubCodes(year, season)
allClasses = []
for code in subCodes:
allClasses += courses.getClasses(code, year, season)
subCodeToClasses = courses.categorize(allClasses, lambda cls: cls['Subject Code'])
if DEBUG:
self.response.out.write(json.dumps(subCodeToClasses))
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.out.write(open('index.html').read().replace('__subCodeToClasses__', json.dumps(subCodeToClasses)))
class Solve(webapp2.RequestHandler):
def post(self):
# array of time strings: "08:00 AM"
bannedTimes = json.loads(self.request.get('bannedTimes'))
# array of all bannedDays checkboxes (booleans)
bannedDays = json.loads(self.request.get('bannedDays'))
badIvals = []
# each 2 time strings corresponds to 5 bannedDays checkboxes
for dayBools, times in zip(misc.iterGroups(bannedDays, 5), misc.iterGroups(bannedTimes, 2)):
badIvals += parseJSInterval(times, dayBools)
subCodes = json.loads(self.request.get('subCodes'))
nums = json.loads(self.request.get('nums'))
curCRNs = json.loads(self.request.get('curCRNs'))
classes = [t + (year, season) for t in zip(subCodes, nums)]
try:
clsToSections = courses.planSchedule(classes, badIvals, curCRNs)
except:
self.response.out.write(json.dumps({}))
else:
for cls, sections in clsToSections.items():
clsToSections[cls[0] + ' ' + str(cls[1])] = sections
del clsToSections[cls]
for sec in sections:
sec['Intervals'] = [courses.reprInterval(i) for i in sec['Intervals']]
self.response.out.write(json.dumps(clsToSections))
##class Complete(webapp2.RequestHandler):
## def get(self):
## s = self.request.get('s')
## words = [w.lower() for w in s.split()]
##
## completions = []
## for cls in subCodeToClasses:
## qual = 0
## for w in words:
## if w == cls['Subject Code']:
## qual += 1
## elif w == cls['Number']:
## qual += 1
## elif w in cls['Course Title']:
## qual += 0.5
## if qual:
## completions.append((qual, cls))
##
## completions.sort(reverse=True)
## self.response.out.write(json.dumps(completions))
class Sections(webapp2.RequestHandler):
def get(self):
subCode = self.request.get('subCode')
num = int(self.request.get('num'))
self.response.out.write(json.dumps(courses.getClassSections(subCode, num, year, season)))
app = webapp2.WSGIApplication([
('/', MainPage),
('/solve', Solve),
('/update', Update),
('/sections', Sections)
## ('/complete', Complete)
], debug=DEBUG)