Source code for controllers.courses
"""
Courses Controller
"""
import json
from flask import request
from server import app
import requests
from bs4 import BeautifulSoup
from models.setupdb import course_model, building_model, faculty_model, course_building_model
[docs]@app.route("/courses/sync", methods=["POST"])
def sync_courses():
"""
| route: /courses/sync
| method: POST
| Crawles courses data from the ITU website and writes to database.
"""
if request.method == "POST":
base_url = "http://www.sis.itu.edu.tr/tr/ders_programlari/LSprogramlar/prg.php"
response = requests.get(base_url)
response.encoding = "windows-1254"
content = response.text
soup = BeautifulSoup(content, "lxml")
course_codes = soup.body.find_all("select")[0].contents
days_to_int = {
"Pazartesi": 0,
"Salı": 1,
"Çarşamba": 2,
"Perşembe": 3,
"Cuma": 4
}
for opt in course_codes:
if len(opt.string) > 0:
# opt = course_codes[3]
code = opt.string.strip("\n")[0:3]
response = requests.get(base_url, params={"fb": code})
response.encoding = "windows-1254"
content = response.text
soup = BeautifulSoup(content, "lxml")
try:
table = soup.body.table.contents[1].contents[0].contents[5].contents[1].contents[3].contents[13].find_all(
"tr")
except Exception as e:
continue
key = 0
for elem in table:
if key >= 2:
print("#######")
crn = elem.contents[0].string[0:5]
print("crn " + crn)
code = elem.contents[1].string
print("code: " + code)
title = elem.contents[2].string
print("title " + title)
lecturer = elem.contents[3].string
print("lecturer: " + lecturer)
try:
course_model.create(
data={"crn": int(crn), "code": code, "name": title})
except:
continue
anchor_tag = elem.contents[4].find("a")
buildings = []
if anchor_tag:
for building in anchor_tag.contents:
if building.string:
buildings.append(building.string)
print("buildings: ", buildings)
td_day = elem.contents[5].contents
days = []
for day in td_day:
if day.string:
days.append(day.string.strip())
print("days: ", days)
td_hours = elem.contents[6].contents
hours = []
for hour in td_hours:
if hour.string:
hours.append(hour.string)
print("hours: ", hours)
i = 0
for d in days:
cday = days_to_int.get(d)
if cday:
times = hours[i].split("/")
start_time = times[0]
end_time = times[1]
b_result = building_model.find(
query=("code='%s'" % buildings[i]))
if len(b_result) > 0:
course_building_model.create(data={
"course": int(crn),
"building": b_result[0]["id"],
"start_time": int(start_time),
"end_time": int(end_time),
"day": cday
})
i += 1
# print(elem.contents[7])
# print(elem.contents[8].string)
# print(elem.contents[9].string)
# print(elem.contents[10].string)
# print(elem.contents[11].string)
# print(elem.contents[12])
# print(elem.contents[13].string)
key += 1
return "done"
[docs]@app.route("/courses")
def list_courses():
"""
| route: /courses
| method: GET
| Lists courses with pagination and text query.
"""
try:
query = request.args["query"]
try:
query = int(query)
query = "crn = %s" % query
except ValueError:
query = "name LIKE '{}%%' OR code LIKE '{}%%'".format(query, query)
result = course_model.find(query=str(query))
return json.dumps(result)
except Exception as e:
print(e)
page = 0
count = 50
try:
page = request.args["page"]
count = request.args["count"]
except:
print("standart")
result = course_model.find(limit=count, offset=(page * count))
return json.dumps(result)
[docs]@app.route("/courses/<cid>")
def list_one_course(cid):
"""
| route: /courses/<cid>
| method: GET
| param: course crn
| Retrieves one course.
"""
result = course_model.find_by_id(_id=cid)
if len(result) <= 0:
return "no course found with id %s." % cid, 404
return json.dumps(result)
[docs]@app.route("/buildings/sync", methods=["POST"])
def sync_buildings():
"""
| route: /buildings/sync
| method: POST
| Crawles all the building data from ITU website and writes to database.
"""
if request.method == "POST":
response = requests.get(
"http://www.sis.itu.edu.tr/tr/sistem/bina_kodlari.html")
response.encoding = "windows-1254"
content = response.text
soup = BeautifulSoup(content, "lxml")
table = soup.body.contents[1].contents[1].contents[0].contents[5].contents[1].contents[3].contents[6].contents
for tr in table:
if tr.string != "\n":
code = tr.contents[0].string
name = tr.contents[1].string
if name == "MEDB":
code = tr.contents[1].string
name = tr.contents[2].string
if name == None:
name = tr.contents[1].contents[0].string
result = building_model.find(query=("name='%s'" % name))
if len(result) == 0:
building_model.create(
data={"name": name, "code": code})
return "done"
[docs]@app.route("/buildings")
def list_buildings():
"""
| route: /buildings
| method: GET
| Lists all the available buildings.
"""
result = building_model.find()
if result is None or len(result) <= 0:
return "no buildings found.", 404
return json.dumps(result)
[docs]@app.route("/buildings/<cid>")
def building_by_id(cid):
"""
| route: /buildings/<buildingid>
| method: GET
| Retrieves one building with id.
"""
result = building_model.find_by_id(_id=cid)
if len(result) <= 0:
return "no building found with id %s." % cid, 404
return json.dumps(result)
[docs]@app.route("/faculties")
def list_faculties():
"""
| route: /faculties
| method: GET
| Lists all the faculties.
"""
result = faculty_model.find()
if result is None or len(result) <= 0:
return "no faculties found.", 404
return json.dumps(result)
[docs]@app.route("/faculties/sync", methods=["POST"])
def sync_faculties():
"""
| route: /faculties/sync
| method: POST
| Crawles all the faculties data from ITU website and writes to database.
"""
if request.method == "POST":
response = requests.get("http://www.sis.itu.edu.tr/tr/dersplan/")
response.encoding = "windows-1254"
content = response.text
soup = BeautifulSoup(content, "lxml")
faculty_options = soup.find_all("select")[0].contents
for opt in faculty_options:
if opt != "\n":
code = opt["value"]
name = opt.string
if len(code) > 0:
result = faculty_model.find(query=("name='%s'" % name))
if len(result) == 0:
faculty_model.create(
data={"name": name, "code": code})
return "done"
[docs]@app.route("/faculties/<cid>")
def faculties_by_id(cid):
"""
| route: /buildings/<facultyid>
| method: GET
| Retrieves one faculty with id.
"""
result = faculty_model.find_by_id(_id=cid)
if len(result) <= 0:
return "no faculty found with id %s." % cid, 404
return json.dumps(result)