Archived
125 lines
4.8 KiB
Python
125 lines
4.8 KiB
Python
#!/usr/bin/python3.3
|
|
import gspread, os, telebot
|
|
import pandas as pd
|
|
from dotenv import load_dotenv
|
|
from google.oauth2 import service_account
|
|
from sshtunnel import SSHTunnelForwarder
|
|
from psycopg2 import pool
|
|
from datetime import datetime
|
|
|
|
load_dotenv()
|
|
|
|
bot = telebot.TeleBot(os.environ.get("TG_TEST_TOKEN"))
|
|
|
|
SERVICE_ACCOUNT_FILE = "credentials.json"
|
|
|
|
credentials = service_account.Credentials.from_service_account_file(
|
|
SERVICE_ACCOUNT_FILE,
|
|
scopes=[
|
|
"https://www.googleapis.com/auth/drive",
|
|
"https://www.googleapis.com/auth/documents",
|
|
],
|
|
)
|
|
|
|
gc = gspread.authorize(credentials)
|
|
|
|
table = gc.open_by_key(os.environ.get("TABLE_ID"))
|
|
|
|
if os.environ.get("ENV") == "dev":
|
|
print("DEV: Connecting to local database")
|
|
server = SSHTunnelForwarder(
|
|
(os.environ.get("SSH_HOST"), 22),
|
|
ssh_private_key=os.environ.get("SSH_KEY"),
|
|
ssh_username=os.environ.get("SSH_USER"),
|
|
ssh_password=(
|
|
os.environ.get("SSH_PASSWORD") if os.environ.get("SSH_PASSWORD") else None
|
|
),
|
|
remote_bind_address=("localhost", int(os.environ.get("DB_PORT"))),
|
|
)
|
|
server.start()
|
|
|
|
db = pool.SimpleConnectionPool(
|
|
1,
|
|
20,
|
|
user=os.environ.get("DB_USER"),
|
|
password=os.environ.get("DB_PASSWORD"),
|
|
host="localhost" if os.environ.get("ENV") == "dev" else os.environ.get("DB_HOST"),
|
|
port=(
|
|
server.local_bind_port
|
|
if os.environ.get("ENV") == "dev"
|
|
else os.environ.get("DB_PORT")
|
|
),
|
|
database=os.environ.get("DB_NAME"),
|
|
)
|
|
|
|
|
|
def f():
|
|
ws = table.worksheets()
|
|
|
|
for i in ws:
|
|
# print(i.title)
|
|
|
|
if not (i.title == "Пример" or i.title == "main") and i.title.isdigit():
|
|
df = pd.DataFrame(i.get_all_records())
|
|
if not df.empty:
|
|
with db.getconn() as conn:
|
|
with conn.cursor() as cursor:
|
|
cursor.execute(
|
|
'DELETE FROM schedule WHERE "group" = %s', (str(i.title),)
|
|
)
|
|
conn.commit()
|
|
for index, row in df.iterrows():
|
|
day_of_week_map = {
|
|
"Понедельник": "mon",
|
|
"Вторник": "tue",
|
|
"Среда": "wed",
|
|
"Четверг": "thu",
|
|
"Пятница": "fri",
|
|
"Суббота": "sat",
|
|
"Воскресенье": "sun",
|
|
}
|
|
row["День недели"] = day_of_week_map.get(
|
|
row["День недели"], row["День недели"]
|
|
)
|
|
if row["Название"] == "":
|
|
continue
|
|
end_time = (
|
|
pd.to_datetime(row["Время начала"], format="%H:%M")
|
|
+ pd.Timedelta(hours=1, minutes=35)
|
|
).strftime("%H:%M")
|
|
cursor.execute(
|
|
"""
|
|
INSERT INTO schedule (day_of_week, begin_time, end_time, course, lector, is_lecture, room, "group", parity)
|
|
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
|
|
""",
|
|
(
|
|
row["День недели"],
|
|
row["Время начала"],
|
|
end_time,
|
|
row["Название"],
|
|
f'{row["Преподаватель"]}{"/" + str(row["2-ой преподаватель"]) if row["2-ой преподаватель"] else ""}',
|
|
row["Лекция?"],
|
|
f'{row["Кабинет"]}{"/" + str(row["Прочие кабинеты"]) if row["Прочие кабинеты"] else ""}',
|
|
i.title,
|
|
"чёт" if row["Чётность пары"] == "чётная" else "нечёт" if row["Чётность пары"] == "нечётная" else None,
|
|
),
|
|
)
|
|
conn.commit()
|
|
|
|
text = f"Last tg-bot update was at: {datetime.now().astimezone().strftime('%Y-%m-%d %H:%M %Z')}"
|
|
table.get_worksheet(0).update_acell("A25", text)
|
|
|
|
return
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
f()
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
bot.send_message(int(os.environ.get("ADMIN_ID")), "Check logs! upload error.")
|
|
bot.send_message(int(os.environ.get("ADMIN_ID")), e)
|
|
|
|
exit(0)
|