Skip to content

Commit

Permalink
Merge pull request #15 from EeOneDown/develop
Browse files Browse the repository at this point in the history
New SPbU Timetable API
  • Loading branch information
EeOneDown authored Oct 7, 2017
2 parents 171345d + 03cf272 commit de29a10
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 40 deletions.
19 changes: 11 additions & 8 deletions flask_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def start_handler(message):
if message.text == "/start":
answer += "Приветствую!\n"
answer += "Укажи свое направление:"
divisions = requests.get(
"https://timetable.spbu.ru/api/v1/divisions").json()
url = "https://timetable.spbu.ru/api/v1/study/divisions"
divisions = requests.get(url).json()
division_names = [division["Name"] for division in divisions]
divisions_keyboard = telebot.types.ReplyKeyboardMarkup(True, False)
for division_name in division_names:
Expand Down Expand Up @@ -503,6 +503,8 @@ def schedule_update_handler(message):
bot.reply_to(message, answer)


# TODO educator schedule
'''
@bot.message_handler(func=lambda mess: mess.text == emoji["bust_in_silhouette"],
content_types=["text"])
def educator_schedule_handler(message):
Expand All @@ -511,6 +513,7 @@ def educator_schedule_handler(message):
markup = telebot.types.ForceReply(False)
bot.send_message(message.chat.id, answer, reply_markup=markup,
parse_mode="HTML")
'''


@bot.message_handler(func=lambda mess: mess.reply_to_message is not None and
Expand All @@ -522,7 +525,7 @@ def write_educator_name_handler(message):
bot.send_chat_action(message.chat.id, "typing")
answer = ""
name = message.text
url = "https://timetable.spbu.ru/api/v1/educators?q={}".format(name)
url = "https://timetable.spbu.ru/api/v1/educators/search/{}".format(name)
educators_data = requests.get(url).json()

if educators_data["Educators"] is None or len(
Expand Down Expand Up @@ -1036,15 +1039,15 @@ def select_day_handler(call_back):

@bot.callback_query_handler(func=lambda call_back:
call_back.data == "Отмена")
def another_day_handler(call_back):
def cancel_handler(call_back):
answer = "Отмена"
bot.edit_message_text(text=answer, chat_id=call_back.message.chat.id,
message_id=call_back.message.message_id)


@bot.callback_query_handler(func=lambda call_back:
"Выбери занятие:" in call_back.message.text)
def select_day_handler(call_back):
def select_lesson_handler(call_back):
answer = "Доступные занятия "
answer += call_back.message.text.split("\n\n")[0][17:] + "\n\n"
events = call_back.message.text.split("\n\n")[1:-1]
Expand Down Expand Up @@ -1182,7 +1185,7 @@ def statistics_handler(call_back):
answer = "Пока что нет оценок."
else:
rate = emoji["star"] * round(data[0])
answer = "Средняя оценка: {}\n".format(data[0])
answer = "Средняя оценка: {}\n".format(round(data[0], 1))
answer += "{} ({})".format(rate, data[1])
try:
bot.edit_message_text(text=answer,
Expand All @@ -1195,7 +1198,7 @@ def statistics_handler(call_back):

@bot.callback_query_handler(func=lambda call_back:
call_back.data == "Связь")
def statistics_handler(call_back):
def feedback_handler(call_back):
markup = telebot.types.ForceReply(False)
try:
bot.edit_message_text(text="Обратная связь",
Expand Down Expand Up @@ -1295,7 +1298,7 @@ def change_template_group_handler(call_back):
in call_back.message.text)
def select_master_id_handler(call_back):
answer = "{} Расписание преподавателя: <b>{}</b>\n\n{} {}"
url = "https://timetable.spbu.ru/api/v1/educator/{}/events".format(
url = "https://timetable.spbu.ru/api/v1/educators/{}/events".format(
call_back.data)
educator_schedule = requests.get(url).json()
answer = answer.format(emoji["bust_in_silhouette"],
Expand Down
15 changes: 9 additions & 6 deletions functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,19 +86,18 @@ def get_json_week_data(user_id, next_week=False):
sql_con = sqlite3.connect("Bot_db")
cursor = sql_con.cursor()
if next_week:
cursor.execute("""SELECT groups_data.alias, group_id, json_week_data
cursor.execute("""SELECT group_id, json_week_data
FROM groups_data
JOIN user_data
ON (groups_data.id = user_data.group_id AND
groups_data.alias = user_data.alias)
WHERE user_data.id= ?""", (user_id,))
data = cursor.fetchone()

alias, group_id = data[0], data[1]
next_week_monday = json.loads(data[2])["NextWeekMonday"]
url = "https://timetable.spbu.ru/api/v1/{}/".format(alias) + \
"studentgroup/{}/events".format(group_id) + \
"?weekMonday={}".format(next_week_monday)
group_id = data[0]
next_week_monday = json.loads(data[1])["NextWeekMonday"]
url = "https://timetable.spbu.ru/api/v1/groups/{}/events/{}".format(
group_id, next_week_monday)
json_week_data = requests.get(url).json()
else:
cursor.execute("""SELECT json_week_data
Expand Down Expand Up @@ -177,6 +176,10 @@ def create_schedule_answer(day_info, full_place, user_id=None, personal=True,
location["EducatorIds"]]
answer += "; ".join(educators) + ")</i>\n"
answer += "\n"

if len(answer.strip().split("\n\n")) == 1:
return emoji["sleep"] + " Выходной"

return answer


Expand Down
23 changes: 11 additions & 12 deletions registration_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ def select_division(message):
study_programs_keyboard = telebot.types.ReplyKeyboardMarkup(True, False)
index = division_names.index(message.text)
alias = aliases[index]
study_programs = requests.get(
"https://timetable.spbu.ru/api/v1/{}/studyprograms".format(alias)
).json()
url = "https://timetable.spbu.ru/api/v1/study/divisions/{}/" \
"programs/levels".format(alias)
study_programs = requests.get(url).json()
for study_program in study_programs:
study_programs_keyboard.row(study_program["StudyLevelName"])
study_programs_keyboard.row("Другое направление")
Expand Down Expand Up @@ -210,7 +210,7 @@ def select_admission_year(message):
sql_con = sqlite3.connect("Bot_db")
cursor = sql_con.cursor()
cursor.execute("""SELECT study_programs_json, study_level_name,
study_program_combination_name, alias
study_program_combination_name
FROM user_choice
WHERE user_id = ?""", (message.chat.id,))
data = cursor.fetchone()
Expand All @@ -220,7 +220,6 @@ def select_admission_year(message):
study_programs = json.loads(data[0])
study_level_name = data[1]
study_program_combination_name = data[2]
alias = data[3]
study_level_names = []
for study_program in study_programs:
study_level_names.append(study_program["StudyLevelName"])
Expand All @@ -241,11 +240,11 @@ def select_admission_year(message):
answer += "Укажи группу:"
index = admission_year_names.index(message.text)
study_program_id = admission_years[index]["StudyProgramId"]
url = "https://timetable.spbu.ru/api/v1/{}/".format(alias) + \
"studyprogram/{}/studentgroups".format(study_program_id)
url = "https://timetable.spbu.ru/api/v1/progams/{}/groups".format(
study_program_id)
student_groups = requests.get(url).json()
student_group_names = []
for student_group in student_groups:
for student_group in student_groups["Groups"]:
student_group_names.append(student_group["StudentGroupName"])
student_groups_keyboard = telebot.types.ReplyKeyboardMarkup(True, False)
for student_group_name in student_group_names:
Expand Down Expand Up @@ -302,11 +301,11 @@ def select_student_group(message):

student_groups = json.loads(data)
student_group_names = []
for student_group in student_groups:
for student_group in student_groups["Groups"]:
student_group_names.append(student_group["StudentGroupName"])
if message.text in student_group_names:
index = student_group_names.index(message.text)
student_group_id = student_groups[index]["StudentGroupId"]
student_group_id = student_groups["Groups"][index]["StudentGroupId"]

sql_con = sqlite3.connect("Bot_db")
cursor = sql_con.cursor()
Expand Down Expand Up @@ -382,8 +381,8 @@ def confirm_choice(message):
cursor.execute("""DELETE FROM user_choice WHERE user_id = ?""",
(message.chat.id,))
sql_con.commit()
url = "https://timetable.spbu.ru/api/v1/{}/".format(alias) + \
"studentgroup/{}/events".format(group_id)
url = "https://timetable.spbu.ru/api/v1/groups/{}/events".format(
group_id)
week_data = requests.get(url).json()
data = json.dumps(week_data)
try:
Expand Down
4 changes: 2 additions & 2 deletions sql_updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ def schedule_update():
groups = cursor.fetchall()
for group in groups:
group_id, alias = group[0], group[1]
url = "https://timetable.spbu.ru/api/v1/{}/".format(alias) + \
"studentgroup/{}/events".format(group_id)
url = "https://timetable.spbu.ru/api/v1/groups/{}/events".format(
group_id)
json_week_data = requests.get(url).json()
data = json.dumps(json_week_data)
cursor.execute("""UPDATE groups_data
Expand Down
22 changes: 10 additions & 12 deletions test_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import requests
import time
import unittest
from random import randint
from functions import create_schedule_answer
Expand All @@ -11,7 +10,7 @@ def everything_ok():

def get_all_aliases():
aliases = []
url = "https://timetable.spbu.ru/api/v1/divisions"
url = "https://timetable.spbu.ru/api/v1/study/divisions"
data = requests.get(url).json()
for alias in data:
aliases.append(alias["Alias"])
Expand All @@ -20,28 +19,27 @@ def get_all_aliases():

def all_group_ids_for_alias(alias):
group_ids = []
url = "https://timetable.spbu.ru/api/v1/{}/studyprograms".format(alias)
url = "https://timetable.spbu.ru/api/v1/study/divisions/{}/" \
"programs/levels".format(alias)
study_programs_data = requests.get(url).json()
for study_program in study_programs_data:
for study_program_combination in study_program[
"StudyProgramCombinations"]:
for admission_year in study_program_combination["AdmissionYears"]:
if not admission_year["IsEmpty"]:
study_program_id = admission_year["StudyProgramId"]
url = "https://timetable.spbu.ru/api/v1/{}/studyprogram" \
"/{}/studentgroups".format(alias, study_program_id)
url = "https://timetable.spbu.ru/api/v1/progams/{}/" \
"groups".format(study_program_id)
groups_data = requests.get(url).json()
for group in groups_data:
for group in groups_data["Groups"]:
group_ids.append(group["StudentGroupId"])
time.sleep(2)
print(alias, "Done")
return group_ids


def get_group_week_schedules(alias, group_id):
def get_group_week_schedules(group_id):
answers = []
url = "https://timetable.spbu.ru/api/v1/{}/studentgroup/{}/" \
"events".format(alias, group_id)
url = "https://timetable.spbu.ru/api/v1/groups/{}/events".format(group_id)
json_data = requests.get(url).json()
for day_info in json_data["Days"]:
answer = create_schedule_answer(day_info, full_place=True,
Expand All @@ -54,7 +52,7 @@ def get_all_schedules():
all_answer = []
for alias in get_all_aliases():
for group_id in all_group_ids_for_alias(alias):
all_answer.append(get_group_week_schedules(alias, group_id))
all_answer.append(get_group_week_schedules(group_id))
return all_answer


Expand All @@ -64,7 +62,7 @@ def test_string(self):
aliases = get_all_aliases()
alias = aliases[randint(0, len(aliases) - 1)]
for group_id in all_group_ids_for_alias(alias):
for day_answer in get_group_week_schedules(alias, group_id):
for day_answer in get_group_week_schedules(group_id):
print(alias, group_id, day_answer.split("\n")[0][2:])
self.assertTrue(day_answer)

Expand Down

0 comments on commit de29a10

Please sign in to comment.