Module xelo2.database.merge
Expand source code
from PyQt5.QtSql import QSqlQuery
from ..api.frontend import Subject
def merge_subjects(subj_code, subj_code_to_merge):
subj = Subject(code=subj_code)
subj_to_merge = Subject(code=subj_code_to_merge)
merge_other_tables(subj, subj_to_merge)
merge_subjects_table(subj, subj_to_merge)
delete_one_subj(subj_to_merge)
def merge_other_tables(subj, subj_to_merge):
for table_name in find_tables_with_column('subject_id'):
query = QSqlQuery(f"""\
UPDATE {table_name}
SET "subject_id"={subj.id}
WHERE "subject_id"== "{subj_to_merge.id}"
""")
err = query.lastError()
if err.isValid():
raise ValueError(err.databaseText())
def merge_subjects_table(subj, subj_to_merge):
for col in subj.columns:
if getattr(subj, col) == getattr(subj_to_merge, col):
print(f'Both subjects have the same value for "{col}"')
elif getattr(subj, col) is None and getattr(subj_to_merge, col) is not None:
print(f'Importing value for "{col}"')
setattr(subj, col, getattr(subj_to_merge, col))
elif getattr(subj, col) is not None and getattr(subj_to_merge, col) is None:
pass
else: # different values
print(f'Disagreement in "{col}": keeping "{getattr(subj, col)}" instead of "getattr(subj_to_merge, col)"')
def delete_one_subj(subj_to_merge):
query = QSqlQuery(f"""\
DELETE FROM subjects
WHERE "subject_id"== "{subj_to_merge.id}"
""")
err = query.lastError()
if err.isValid():
raise ValueError(err.databaseText())
def find_tables_with_column(col_name):
ALL_TABLES = []
for table_name, columns in TABLES.items():
if col_name in columns:
ALL_TABLES.append(table_name)
for subtable, columns in TABLES[table_name].get('subtables', {}).items():
if col_name in columns:
ALL_TABLES.append(table_name)
return ALL_TABLES
Functions
def delete_one_subj(subj_to_merge)
-
Expand source code
def delete_one_subj(subj_to_merge): query = QSqlQuery(f"""\ DELETE FROM subjects WHERE "subject_id"== "{subj_to_merge.id}" """) err = query.lastError() if err.isValid(): raise ValueError(err.databaseText())
def find_tables_with_column(col_name)
-
Expand source code
def find_tables_with_column(col_name): ALL_TABLES = [] for table_name, columns in TABLES.items(): if col_name in columns: ALL_TABLES.append(table_name) for subtable, columns in TABLES[table_name].get('subtables', {}).items(): if col_name in columns: ALL_TABLES.append(table_name) return ALL_TABLES
def merge_other_tables(subj, subj_to_merge)
-
Expand source code
def merge_other_tables(subj, subj_to_merge): for table_name in find_tables_with_column('subject_id'): query = QSqlQuery(f"""\ UPDATE {table_name} SET "subject_id"={subj.id} WHERE "subject_id"== "{subj_to_merge.id}" """) err = query.lastError() if err.isValid(): raise ValueError(err.databaseText())
def merge_subjects(subj_code, subj_code_to_merge)
-
Expand source code
def merge_subjects(subj_code, subj_code_to_merge): subj = Subject(code=subj_code) subj_to_merge = Subject(code=subj_code_to_merge) merge_other_tables(subj, subj_to_merge) merge_subjects_table(subj, subj_to_merge) delete_one_subj(subj_to_merge)
def merge_subjects_table(subj, subj_to_merge)
-
Expand source code
def merge_subjects_table(subj, subj_to_merge): for col in subj.columns: if getattr(subj, col) == getattr(subj_to_merge, col): print(f'Both subjects have the same value for "{col}"') elif getattr(subj, col) is None and getattr(subj_to_merge, col) is not None: print(f'Importing value for "{col}"') setattr(subj, col, getattr(subj_to_merge, col)) elif getattr(subj, col) is not None and getattr(subj_to_merge, col) is None: pass else: # different values print(f'Disagreement in "{col}": keeping "{getattr(subj, col)}" instead of "getattr(subj_to_merge, col)"')