-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpub_search.py
More file actions
95 lines (78 loc) · 2.36 KB
/
pub_search.py
File metadata and controls
95 lines (78 loc) · 2.36 KB
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
# pub_search.py: Search for available places in requested courses (via the Display Dynamic Schedule interface)
# This file is from Minervac, a command-line client for Minerva
# <http://npaun.ca/projects/minervac>
# (C) Copyright 2016-2017 Nicholas Paun
import requests,urllib,StringIO,csv,sys
from minerva_common import *
def build_request(term,codes):
req = [
('sel_crse',''),
('sel_title',''),
('begin_hh','0'),
('begin_mi','0'),
('begin_ap','a'),
('end_hh','0'),
('end_mi','0'),
('end_ap','a'),
('sel_dunt_code',''),
('sel_dunt_unit',''),
('sel_from_cred',''),
('sel_to_cred',''),
('sel_coll',''),
('call_value_in','UNSECURED'),
('display_mode_in','LIST'),
('search_mode_in',''),
('term_in',term),
('sel_subj','dummy'),
('sel_day','dummy'),
('sel_ptrm','dummy'),
('sel_ptrm','%'),
('sel_camp','dummy'),
('sel_schd','dummy'),
('sel_schd','%'),
('sel_sess','dummy'),
('sel_instr','dummy'),
('sel_instr','%'),
('sel_attr','dummy'),
('sel_attr','%'),
('crn','dummy'),
('rsts','dummy'),
('sel_levl','dummy'),
('sel_levl','%'),
('sel_insm','dummy'),
]
for code in codes:
req.append(('sel_subj',code.split("-")[0]))
return urllib.urlencode(req)
def search(term,course_codes):
request = build_request(term,course_codes)
sys.stderr.write("> bwckgens.csv\n")
result = requests.post("https://horizon.mcgill.ca/rm-PBAN1/bwckgens.csv",request)
return parse_results(result.text)
def parse_results(text):
stream = StringIO.StringIO(text.encode("ascii","ignore"))
field_names = ['crn','subject','course','section','type','credits','title','days','time','cap','wl_cap','wl_act','wl_rem','instructor','date','location','status']
file = csv.DictReader(stream,field_names)
records = {}
first = True
for row in file:
if row['subject'] is None or row['subject'] == 'Subject':
continue
if row['cap'] == '':
continue
if row['wl_rem'] == '':
row['wl_rem'] = -1000
row['_code'] = "-".join([row['subject'],row['course'],row['section']])
row['select'] = MinervaState.only_waitlist_known
row['reg'] = {}
row['reg']['cap'] = int(row['cap'])
row['wait'] = {}
row['wait']['cap'] = int(row['wl_cap'])
row['wait']['act'] = int(row['wl_act'])
row['wait']['rem'] = int(row['wl_rem'])
if row['wait']['rem'] > 0:
row['_state'] = MinervaState.wait
else:
row['_state'] = MinervaState.unknown
records[row['_code']] = row
return records