258 lines
12 KiB
Python

#
# "contingent-movement" project;
# author: gazakbayev.net
# ver: 1.0
#
import psycopg2
from debug_data.database_creds import CREDS
class Database:
@staticmethod
def __connection__():
return psycopg2.connect(**CREDS)
@staticmethod
def initialize():
conn = Database.__connection__()
try:
with conn.cursor() as cur, open("../docs/schema.sql", "r", encoding="utf-8") as f:
cur.execute(f.read())
conn.commit()
print("[Contingent-movement] Initialized database with relations.")
except Exception as e:
print(f"[Contingent-movement] [Contingent Movement] Error: {e}")
conn.rollback()
finally:
conn.close()
def physicals_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Physicals (passport_no, name, surname, birthday, phone, mail, citizenship, address, access_card, access_level)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Physicals: {e}")
finally:
conn.close()
def supervisors_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Supervisors (person, experience, defended_ratio, qualification)
VALUES (%s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Supervisors: {e}")
finally:
conn.close()
def faculties_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Faculties (name, acronym, head, vice, address)
VALUES (%s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Faculties: {e}")
finally:
conn.close()
def departments_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Departments (name, acronym, founded, head, vice, secretary, faculty_id)
VALUES (%s, %s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Departments: {e}")
finally:
conn.close()
def programs_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Programs (specification, degree, name, parent_id)
VALUES (%s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Programs: {e}")
finally:
conn.close()
def groups_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Groups (group_id, faculty_id, program_id, department_id, study_starts, study_ends)
VALUES (%s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Groups: {e}")
finally:
conn.close()
def students_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
# 1. Сначала проверяем существование всех внешних ключей
cur.execute("""
SELECT 1 FROM physicals WHERE passport_no = %s
UNION ALL
SELECT 1 FROM groups WHERE group_id = %s
UNION ALL
SELECT 1 FROM physicals WHERE passport_no = %s OR %s IS NULL
""", [data[0], data[1], data[2], data[2]])
if len(cur.fetchall()) < 2 + (1 if data[2] is not None else 0):
raise ValueError("Invalid foreign key references")
cur.execute("""
INSERT INTO Students (person, group_id, supervisor, education_form, status)
VALUES (%s, %s, %s, %s, %s)
RETURNING id
""", data)
inserted_id = cur.fetchone()[0]
conn.commit()
return inserted_id
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Students: {e}")
return None
finally:
conn.close()
def family_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Family (person, name, surname, kinship, phone, address)
VALUES (%s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Family: {e}")
finally:
conn.close()
def files_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Files (student_id, name, description, extension, size, path)
VALUES (%s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Files: {e}")
finally:
conn.close()
def disciplines_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Disciplines (name, department_id, credit_units, academic_hours, general_hours, is_annual)
VALUES (%s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Disciplines: {e}")
finally:
conn.close()
def statements_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Statements (student_id, discipline_id, examiner, try_no, grade, conducted_at)
VALUES (%s, %s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Statements: {e}")
finally:
conn.close()
def movement_write(data: list):
conn = Database.__connection__()
try:
with conn.cursor() as cur:
cur.execute("""
INSERT INTO Movement (student_id, type, new_group, new_status, issued_at)
VALUES (%s, %s, %s, %s, %s)
""", data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"[Contingent Movement] Error inserting into Movement: {e}")
finally:
conn.close()
# /$$$$$$ /$$ /$$ /$$
# /$$__ $$ | $$ |__/ | $$
# | $$ \__/ /$$$$$$ /$$$$$$$ /$$$$$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$
# | $$ /$$__ $$| $$__ $$|_ $$_/ | $$| $$__ $$ /$$__ $$ /$$__ $$| $$__ $$|_ $$_/
# | $$ | $$ \ $$| $$ \ $$ | $$ | $$| $$ \ $$| $$ \ $$| $$$$$$$$| $$ \ $$ | $$
# | $$ $$| $$ | $$| $$ | $$ | $$ /$$| $$| $$ | $$| $$ | $$| $$_____/| $$ | $$ | $$ /$$
# | $$$$$$/| $$$$$$/| $$ | $$ | $$$$/| $$| $$ | $$| $$$$$$$| $$$$$$$| $$ | $$ | $$$$/
# \______/ \______/ |__/ |__/ \___/ |__/|__/ |__/ \____ $$ \_______/|__/ |__/ \___/
# /$$ \ $$
# | $$$$$$/
# \______/
# /$$ /$$ /$$
# | $$$ /$$$ | $$
# | $$$$ /$$$$ /$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$/$$$$ /$$$$$$ /$$$$$$$ /$$$$$$
# | $$ $$/$$ $$ /$$__ $$| $$ /$$//$$__ $$| $$_ $$_ $$ /$$__ $$| $$__ $$|_ $$_/
# | $$ $$$| $$| $$ \ $$ \ $$/$$/| $$$$$$$$| $$ \ $$ \ $$| $$$$$$$$| $$ \ $$ | $$
# | $$\ $ | $$| $$ | $$ \ $$$/ | $$_____/| $$ | $$ | $$| $$_____/| $$ | $$ | $$ /$$
# | $$ \/ | $$| $$$$$$/ \ $/ | $$$$$$$| $$ | $$ | $$| $$$$$$$| $$ | $$ | $$$$/
# |__/ |__/ \______/ \_/ \_______/|__/ |__/ |__/ \_______/|__/ |__/ \___/
# /$$ /$$ /$$ /$$
# | $$ | $$ | $$ | $$
# | $$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$ | $$ /$$| $$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$
# | $$__ $$| $$ | $$ /$$__ $$ |____ $$|____ /$$/ |____ $$| $$ /$$/| $$__ $$ |____ $$| $$ | $$ /$$__ $$| $$ /$$/| $$__ $$ /$$__ $$|_ $$_/
# | $$ \ $$| $$ | $$ | $$ \ $$ /$$$$$$$ /$$$$/ /$$$$$$$| $$$$$$/ | $$ \ $$ /$$$$$$$| $$ | $$| $$$$$$$$ \ $$/$$/ | $$ \ $$| $$$$$$$$ | $$
# | $$ | $$| $$ | $$ | $$ | $$ /$$__ $$ /$$__/ /$$__ $$| $$_ $$ | $$ | $$ /$$__ $$| $$ | $$| $$_____/ \ $$$/ | $$ | $$| $$_____/ | $$ /$$
# | $$$$$$$/| $$$$$$$ | $$$$$$$| $$$$$$$ /$$$$$$$$| $$$$$$$| $$ \ $$| $$$$$$$/| $$$$$$$| $$$$$$$| $$$$$$$ \ $//$$| $$ | $$| $$$$$$$ | $$$$/
# |_______/ \____ $$ \____ $$ \_______/|________/ \_______/|__/ \__/|_______/ \_______/ \____ $$ \_______/ \_/|__/|__/ |__/ \_______/ \___/
# /$$ | $$ /$$ \ $$ /$$ | $$
# | $$$$$$/ | $$$$$$/ | $$$$$$/
# \______/ \______/ \______/