-
Jonathan Weth authoredJonathan Weth authored
api.py 9.90 KiB
from django.conf import settings
from untisconnect.api_helper import get_term_by_ids, run_using, untis_date_to_date, date_to_untis_date
from . import models
from timetable.settings import untis_settings
TYPE_TEACHER = 0
TYPE_ROOM = 1
TYPE_CLASS = 2
def run_all(obj, filter_term=True):
return run_default_filter(run_using(obj).all(), filter_term=filter_term)
def run_one(obj, filter_term=True):
return run_default_filter(run_using(obj), filter_term=filter_term)
def run_default_filter(obj, filter_term=True):
# Get term by settings in db
TERM_ID = untis_settings.term
SCHOOLYEAR_ID = untis_settings.school_year # 20172018
TERM = get_term_by_ids(TERM_ID, SCHOOLYEAR_ID)
SCHOOL_ID = TERM.school_id # 705103
VERSION_ID = TERM.version_id # 1
if filter_term:
return obj.filter(school_id=SCHOOL_ID, schoolyear_id=SCHOOLYEAR_ID, version_id=VERSION_ID, term_id=TERM_ID)
else:
return obj.filter(school_id=SCHOOL_ID, schoolyear_id=SCHOOLYEAR_ID, version_id=VERSION_ID)
def row_by_row_helper(db_rows, obj):
out_rows = []
for db_row in db_rows:
o = obj()
o.create(db_row)
out_rows.append(o)
return out_rows
def row_by_row(db_ref, obj, filter_term=True):
db_rows = run_all(db_ref.objects, filter_term=filter_term)
return row_by_row_helper(db_rows, obj)
def one_by_id(db_ref, obj):
# print(db_ref)
if db_ref is not None:
o = obj()
o.create(db_ref)
return o
else:
return None
###########
# TEACHER #
###########
class Teacher(object):
def __init__(self):
self.filled = False
self.id = None
self.shortcode = None
self.first_name = None
self.name = None
self.full_name = None
def __str__(self):
if self.filled:
return (self.first_name or "") + " " + (self.name or "")
else:
return "Unbekannt"
def create(self, db_obj):
self.filled = True
self.id = db_obj.teacher_id
self.shortcode = db_obj.name
self.name = db_obj.longname
self.first_name = db_obj.firstname
def get_all_teachers():
teachers = row_by_row(models.Teacher, Teacher)
return teachers
def get_teacher_by_id(id):
teacher = run_one(models.Teacher.objects).get(teacher_id=id)
return one_by_id(teacher, Teacher)
def get_teacher_by_shortcode(shortcode):
shortcode = shortcode.upper()
teacher = run_one(models.Teacher.objects).get(name__icontains=shortcode)
return one_by_id(teacher, Teacher)
#########
# CLASS #
#########
class Class(object):
def __init__(self):
self.filled = False
self.id = None
self.name = None
self.text1 = None
self.text2 = None
self.room = None
def __str__(self):
if self.filled:
return self.name or "Unbekannt"
else:
return "Unbekannt"
def create(self, db_obj):
self.filled = True
self.id = db_obj.class_id
self.name = db_obj.name
self.text1 = db_obj.longname
self.text2 = db_obj.text
# print(db_obj.room_id)
if db_obj.room_id != 0:
# print("RAUM")
self.room = get_room_by_id(db_obj.room_id)
def get_all_classes():
classes = row_by_row(models.Class, Class)
return classes
def get_class_by_id(id):
_class = run_one(models.Class.objects).get(class_id=id)
return one_by_id(_class, Class)
def get_class_by_name(name):
name = name[0].upper() + name[1:]
_class = run_one(models.Class.objects).filter(name__icontains=name).all()[0]
return one_by_id(_class, Class)
def format_classes(classes):
"""
Formats a list of Class objects to a combined string
example return: "9abcd" for classes 9a, 9b, 9c and 9d
:param classes: Class list
:return: combined string
"""
classes_as_dict = {}
for _class in classes:
step = _class.name[:-1]
part = _class.name[-1:]
if step not in classes_as_dict.keys():
classes_as_dict[step] = [part]
else:
classes_as_dict[step].append(part)
out = []
for key, value in classes_as_dict.items():
out.append(key + "".join(value))
return ", ".join(out)
########
# ROOM #
########
class Room(object):
def __init__(self):
self.filled = False
self.id = None
self.shortcode = None
self.name = None
def __str__(self):
if self.filled:
return self.name or "Unbekannt"
else:
return "Unbekannt"
def create(self, db_obj):
self.filled = True
self.id = db_obj.room_id
self.shortcode = db_obj.name
self.name = db_obj.longname
def get_all_rooms():
db_rooms = row_by_row(models.Room, Room)
return db_rooms
def get_room_by_id(id):
room = run_one(models.Room.objects).get(room_id=id)
return one_by_id(room, Room)
########
# CORRIDOR #
########
class Corridor(object):
def __init__(self):
self.filled = False
self.id = None
self.name = None
def __str__(self):
if self.filled:
return self.name or "Unbekannt"
else:
return "Unbekannt"
def create(self, db_obj):
self.filled = True
self.id = db_obj.corridor_id
self.name = db_obj.name
def get_all_corridors():
corridors = row_by_row(models.Corridor, Corridor, filter_term=False)
return corridors
def get_corridor_by_id(id):
# print(id)
corridor = run_one(models.Corridor.objects, filter_term=False).get(corridor_id=id)
return one_by_id(corridor, Corridor)
###########
# SUBJECT #
###########
class Subject(object):
def __init__(self):
self.filled = False
self.id = None
self.shortcode = None
self.name = None
self.color = None
self.hex_color = None
def create(self, db_obj):
self.filled = True
self.id = db_obj.subject_id
self.shortcode = db_obj.name
self.name = db_obj.longname
self.color = db_obj.backcolor
# Convert UNTIS number to HEX
hex_bgr = str(hex(db_obj.backcolor)).replace("0x", "")
# Add beginning zeros if len < 6
if len(hex_bgr) < 6:
hex_bgr = "0" * (6 - len(hex_bgr)) + hex_bgr
# Change BGR to RGB
hex_rgb = hex_bgr[4:6] + hex_bgr[2:4] + hex_bgr[0:2]
# Add html #
self.hex_color = "#" + hex_rgb
def get_all_subjects():
db_rooms = row_by_row(models.Subjects, Subject, filter_term=False)
return db_rooms
def get_subject_by_id(id):
subject = run_one(models.Subjects.objects, filter_term=False).get(subject_id=id)
return one_by_id(subject, Subject)
class Absence(object):
def __init__(self):
self.filled = None
self.teacher = None
self.room = None
self.type = TYPE_TEACHER
self.from_date = None
self.to_date = None
self.from_lesson = None
self.to_lesson = None
self.is_whole_day = None
def create(self, db_obj):
self.filled = True
# print(db_obj.ida)
# print(db_obj.typea)
if db_obj.typea == 101:
self.type = TYPE_TEACHER
elif db_obj.typea == 100:
self.type = TYPE_CLASS
elif db_obj.typea == 102:
self.type = TYPE_ROOM
if self.type == TYPE_TEACHER:
# print("IDA", db_obj.ida)
self.teacher = get_teacher_by_id(db_obj.ida)
else:
self.room = get_room_by_id(db_obj.ida)
self.from_date = untis_date_to_date(db_obj.datefrom)
self.to_date = untis_date_to_date(db_obj.dateto)
self.from_lesson = db_obj.lessonfrom
self.to_lesson = db_obj.lessonto
self.is_whole_day = self.from_lesson == 1 and self.to_lesson >= settings.TIMETABLE_HEIGHT
def get_all_absences_by_date(date):
d_i = int(date_to_untis_date(date))
db_rows = run_all(models.Absence.objects.filter(dateto__gte=d_i, datefrom__lte=d_i, deleted=0), filter_term=False)
return row_by_row_helper(db_rows, Absence)
def get_absence_by_id(id):
absence = run_one(models.Absence.objects, filter_term=False).get(absence_id=id)
return one_by_id(absence, Absence)
#########
# EVENT #
#########
class Event(object):
def __init__(self):
self.filled = None
self.text = None
self.teachers = []
self.classes = []
self.rooms = []
self.absences = []
self.from_date = None
self.to_date = None
self.from_lesson = None
self.to_lesson = None
self.is_whole_day = None
def create(self, db_obj):
"""0~0~19~0~1859~0,0~0~65~0~1860~0,0~0~21~0~1861~0,0~0~3~0~1862~0"""
self.filled = True
event_parsed = db_obj.eventelement1.split(",")
elements = []
for element in event_parsed:
elements.append(element.split("~"))
for element in elements:
if element[0] != "0" and element[0] != "":
self.classes.append(element[0])
if element[2] != "0" and element[2] != "":
self.teachers.append(element[2])
if element[3] != "0" and element[3] != "":
self.rooms.append(element[3])
if element[4] != "0" and element[4] != "":
self.absences.append(element[4])
self.text = db_obj.text
self.from_date = untis_date_to_date(db_obj.datefrom)
self.to_date = untis_date_to_date(db_obj.dateto)
self.from_lesson = db_obj.lessonfrom
self.to_lesson = db_obj.lessonto
self.is_whole_day = self.from_lesson == 1 and self.to_lesson >= settings.TIMETABLE_HEIGHT
def get_all_events_by_date(date):
d_i = int(date_to_untis_date(date))
db_rows = run_all(models.Event.objects.filter(dateto__gte=d_i, datefrom__lte=d_i, deleted=0), filter_term=False)
return row_by_row_helper(db_rows, Event)
##########
# LESSON #
##########
def get_raw_lessons():
return run_all(models.Lesson.objects)